@ogcio/o11y-sdk-node 0.4.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/dist/sdk-core/index.d.ts +1 -0
  2. package/dist/sdk-core/index.js +1 -0
  3. package/dist/sdk-core/lib/index.d.ts +2 -0
  4. package/dist/sdk-core/lib/index.js +2 -0
  5. package/dist/sdk-core/lib/redaction/basic-redactor.d.ts +7 -0
  6. package/dist/sdk-core/lib/redaction/basic-redactor.js +18 -0
  7. package/dist/sdk-core/lib/redaction/email-redactor.d.ts +8 -0
  8. package/dist/sdk-core/lib/redaction/email-redactor.js +17 -0
  9. package/dist/sdk-core/lib/redaction/index.d.ts +9 -0
  10. package/dist/sdk-core/lib/redaction/index.js +4 -0
  11. package/dist/sdk-core/lib/redaction/ip-redactor.d.ts +9 -0
  12. package/dist/sdk-core/lib/redaction/ip-redactor.js +23 -0
  13. package/dist/sdk-core/lib/redaction/ppsn-redactor.d.ts +8 -0
  14. package/dist/sdk-core/lib/redaction/ppsn-redactor.js +17 -0
  15. package/dist/sdk-core/lib/utils/data-structures.d.ts +15 -0
  16. package/dist/{lib/internals/redaction/pii-detection.js → sdk-core/lib/utils/data-structures.js} +4 -27
  17. package/dist/sdk-core/lib/utils/index.d.ts +2 -0
  18. package/dist/sdk-core/lib/utils/index.js +2 -0
  19. package/dist/sdk-core/lib/utils/string-decoding.d.ts +7 -0
  20. package/dist/sdk-core/lib/utils/string-decoding.js +22 -0
  21. package/dist/{index.d.ts → sdk-node/index.d.ts} +1 -0
  22. package/dist/{index.js → sdk-node/index.js} +1 -0
  23. package/dist/{lib → sdk-node/lib}/config-manager.d.ts +1 -1
  24. package/dist/sdk-node/lib/exporter/console.d.ts +3 -0
  25. package/dist/sdk-node/lib/exporter/grpc.d.ts +3 -0
  26. package/dist/sdk-node/lib/exporter/http.d.ts +3 -0
  27. package/dist/{lib → sdk-node/lib}/exporter/index.d.ts +2 -2
  28. package/dist/{lib → sdk-node/lib}/exporter/pii-exporter-decorator.d.ts +5 -5
  29. package/dist/{lib → sdk-node/lib}/exporter/pii-exporter-decorator.js +6 -2
  30. package/dist/sdk-node/lib/exporter/processor-config.d.ts +7 -0
  31. package/dist/{lib → sdk-node/lib}/exporter/processor-config.js +4 -0
  32. package/dist/{lib → sdk-node/lib}/index.d.ts +11 -0
  33. package/dist/{lib → sdk-node/lib}/instrumentation.node.js +1 -1
  34. package/dist/sdk-node/lib/internals/redaction/redactors/email.d.ts +8 -0
  35. package/dist/sdk-node/lib/internals/redaction/redactors/email.js +19 -0
  36. package/dist/sdk-node/lib/internals/redaction/redactors/index.d.ts +16 -0
  37. package/dist/sdk-node/lib/internals/redaction/redactors/index.js +13 -0
  38. package/dist/sdk-node/lib/internals/redaction/redactors/ip.d.ts +8 -0
  39. package/dist/sdk-node/lib/internals/redaction/redactors/ip.js +20 -0
  40. package/dist/sdk-node/lib/internals/redaction/redactors/ppsn.d.ts +8 -0
  41. package/dist/sdk-node/lib/internals/redaction/redactors/ppsn.js +18 -0
  42. package/dist/{lib → sdk-node/lib}/metrics.d.ts +1 -1
  43. package/dist/{lib → sdk-node/lib}/processor/enrich-logger-processor.d.ts +3 -3
  44. package/dist/{lib → sdk-node/lib}/processor/enrich-span-processor.d.ts +3 -3
  45. package/dist/sdk-node/lib/processor/nextjs-logger-processor.d.ts +7 -0
  46. package/dist/sdk-node/lib/processor/nextjs-logger-processor.js +30 -0
  47. package/dist/sdk-node/lib/processor/nextjs-span-processor.d.ts +8 -0
  48. package/dist/sdk-node/lib/processor/nextjs-span-processor.js +25 -0
  49. package/dist/{lib → sdk-node/lib}/resource.d.ts +2 -2
  50. package/dist/{lib → sdk-node/lib}/traces.d.ts +1 -1
  51. package/dist/{lib → sdk-node/lib}/traces.js +1 -1
  52. package/dist/{lib → sdk-node/lib}/url-sampler.d.ts +3 -3
  53. package/dist/{lib → sdk-node/lib}/utils.d.ts +1 -1
  54. package/dist/sdk-node/package.json +62 -0
  55. package/package.json +25 -22
  56. package/CHANGELOG.md +0 -233
  57. package/dist/lib/exporter/console.d.ts +0 -3
  58. package/dist/lib/exporter/grpc.d.ts +0 -3
  59. package/dist/lib/exporter/http.d.ts +0 -3
  60. package/dist/lib/exporter/processor-config.d.ts +0 -5
  61. package/dist/lib/internals/redaction/pii-detection.d.ts +0 -25
  62. package/dist/lib/internals/redaction/redactors/email.d.ts +0 -8
  63. package/dist/lib/internals/redaction/redactors/email.js +0 -48
  64. package/dist/lib/internals/redaction/redactors/index.d.ts +0 -4
  65. package/dist/lib/internals/redaction/redactors/index.js +0 -6
  66. package/dist/lib/internals/redaction/redactors/ip.d.ts +0 -10
  67. package/dist/lib/internals/redaction/redactors/ip.js +0 -54
  68. package/dist/lib/internals/shared-metrics.d.ts +0 -7
  69. package/dist/lib/internals/shared-metrics.js +0 -18
  70. package/dist/package.json +0 -59
  71. package/dist/vitest.config.d.ts +0 -2
  72. package/dist/vitest.config.js +0 -45
  73. package/index.ts +0 -9
  74. package/lib/config-manager.ts +0 -12
  75. package/lib/exporter/console.ts +0 -33
  76. package/lib/exporter/grpc.ts +0 -65
  77. package/lib/exporter/http.ts +0 -56
  78. package/lib/exporter/index.ts +0 -9
  79. package/lib/exporter/pii-exporter-decorator.ts +0 -187
  80. package/lib/exporter/processor-config.ts +0 -23
  81. package/lib/index.ts +0 -118
  82. package/lib/instrumentation.node.ts +0 -115
  83. package/lib/internals/hooks.ts +0 -14
  84. package/lib/internals/redaction/pii-detection.ts +0 -113
  85. package/lib/internals/redaction/redactors/email.ts +0 -58
  86. package/lib/internals/redaction/redactors/index.ts +0 -12
  87. package/lib/internals/redaction/redactors/ip.ts +0 -68
  88. package/lib/internals/shared-metrics.ts +0 -34
  89. package/lib/metrics.ts +0 -75
  90. package/lib/processor/enrich-logger-processor.ts +0 -34
  91. package/lib/processor/enrich-span-processor.ts +0 -39
  92. package/lib/resource.ts +0 -30
  93. package/lib/traces.ts +0 -78
  94. package/lib/url-sampler.ts +0 -52
  95. package/lib/utils.ts +0 -22
  96. package/test/config-manager.test.ts +0 -34
  97. package/test/exporter/pii-exporter-decorator.test.ts +0 -88
  98. package/test/index.test.ts +0 -70
  99. package/test/integration/README.md +0 -74
  100. package/test/integration/docker-utils.sh +0 -214
  101. package/test/integration/main.sh +0 -52
  102. package/test/integration/teardown.sh +0 -7
  103. package/test/integration/test_fastify-o11y-pii-enabled/http-tracing.integration.test.ts +0 -56
  104. package/test/integration/test_fastify-o11y-pii-enabled/pii.integration.test.ts +0 -68
  105. package/test/integration/test_fastify-o11y-pii-enabled/run.sh +0 -42
  106. package/test/integration/test_without-o11y/run.sh +0 -30
  107. package/test/integration/test_without-o11y/verify-status.integration.test.ts +0 -32
  108. package/test/internals/hooks.test.ts +0 -45
  109. package/test/internals/pii-detection.test.ts +0 -265
  110. package/test/internals/redactors/email.test.ts +0 -81
  111. package/test/internals/redactors/ip.test.ts +0 -93
  112. package/test/internals/shared-metrics.test.ts +0 -34
  113. package/test/metrics.test.ts +0 -142
  114. package/test/node-config.test.ts +0 -190
  115. package/test/processor/enrich-logger-processor.test.ts +0 -58
  116. package/test/processor/enrich-span-processor.test.ts +0 -52
  117. package/test/resource.test.ts +0 -33
  118. package/test/traces/active-span.test.ts +0 -26
  119. package/test/traces/with-span.test.ts +0 -356
  120. package/test/url-sampler.test.ts +0 -215
  121. package/test/utils/alloy-log-parser.ts +0 -53
  122. package/test/utils/mock-signals.ts +0 -144
  123. package/test/validation.test.ts +0 -103
  124. package/tsconfig.json +0 -15
  125. package/vitest.config.ts +0 -46
  126. /package/dist/{lib → sdk-node/lib}/config-manager.js +0 -0
  127. /package/dist/{lib → sdk-node/lib}/exporter/console.js +0 -0
  128. /package/dist/{lib → sdk-node/lib}/exporter/grpc.js +0 -0
  129. /package/dist/{lib → sdk-node/lib}/exporter/http.js +0 -0
  130. /package/dist/{lib → sdk-node/lib}/exporter/index.js +0 -0
  131. /package/dist/{lib → sdk-node/lib}/index.js +0 -0
  132. /package/dist/{lib → sdk-node/lib}/instrumentation.node.d.ts +0 -0
  133. /package/dist/{lib → sdk-node/lib}/internals/hooks.d.ts +0 -0
  134. /package/dist/{lib → sdk-node/lib}/internals/hooks.js +0 -0
  135. /package/dist/{lib → sdk-node/lib}/metrics.js +0 -0
  136. /package/dist/{lib → sdk-node/lib}/processor/enrich-logger-processor.js +0 -0
  137. /package/dist/{lib → sdk-node/lib}/processor/enrich-span-processor.js +0 -0
  138. /package/dist/{lib → sdk-node/lib}/resource.js +0 -0
  139. /package/dist/{lib → sdk-node/lib}/url-sampler.js +0 -0
  140. /package/dist/{lib → sdk-node/lib}/utils.js +0 -0
@@ -1,54 +0,0 @@
1
- import { _getPIICounterRedactionMetric } from "../../shared-metrics.js";
2
- // Generous IP address matchers (might match some invalid addresses like 192.168.01.1)
3
- const IPV4_REGEX = /(?<!\d)(?:%[0-9A-Fa-f]{2})?(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}(?:%[0-9A-Fa-f]{2})?(?!\d)/gi;
4
- const IPV6_REGEX = /(?<![0-9a-f:])(?:%[0-9A-Fa-f]{2})?((?:[0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}|(?:[0-9A-Fa-f]{1,4}:){1,7}:|:(?::[0-9A-Fa-f]{1,4}){1,7}|(?:[0-9A-Fa-f]{1,4}:){1,6}:[0-9A-Fa-f]{1,4}|(?:[0-9A-Fa-f]{1,4}:){1,5}(?::[0-9A-Fa-f]{1,4}){1,2}|(?:[0-9A-Fa-f]{1,4}:){1,4}(?::[0-9A-Fa-f]{1,4}){1,3}|(?:[0-9A-Fa-f]{1,4}:){1,3}(?::[0-9A-Fa-f]{1,4}){1,4}|(?:[0-9A-Fa-f]{1,4}:){1,2}(?::[0-9A-Fa-f]{1,4}){1,5}|[0-9A-Fa-f]{1,4}:(?::[0-9A-Fa-f]{1,4}){1,6}|:(?::[0-9A-Fa-f]{1,4}){1,7}:?|(?:[0-9A-Fa-f]{1,4}:){1,4}:(?:25[0-5]|2[0-4]\d|1\d\d|\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|\d{1,2})){3})(?:%[0-9A-Fa-f]{2})?(?![0-9a-f:])/gi;
5
- /**
6
- * Redacts all ip addresses in the input string and collects metadata.
7
- *
8
- * @param {string} value The input string potentially containing ip addresses.
9
- * @returns {{
10
- * redacted: string,
11
- * count: number,
12
- * domains: Record<string, number>
13
- * }}
14
- *
15
- * An object containing:
16
- * - `redacted`: the string with IP addresses replaced by `[REDACTED IPV*]`
17
- * - `counters`: total number of addresses redacted by IPv* type
18
- * - `domains`: a map of domain names to the number of times they were redacted
19
- */
20
- function _redactIps(value) {
21
- const counters = {};
22
- const redacted = value
23
- .replace(IPV4_REGEX, () => {
24
- counters["IPv4"] = (counters["IPv4"] || 0) + 1;
25
- return "[REDACTED IPV4]";
26
- })
27
- .replace(IPV6_REGEX, () => {
28
- counters["IPv4"] = (counters["IPv4"] || 0) + 1;
29
- return "[REDACTED IPV6]";
30
- });
31
- return { redacted, counters };
32
- }
33
- /**
34
- * Redacts provided input and collects metadata metrics about redacted IPs,
35
- * data source and kind.
36
- *
37
- * @param {string} value The input string potentially containing IP addresses.
38
- * @param {string} source The source of the attribute being redacted (log, span, metric).
39
- * @param {string} kind The type of the data structure containing the PII
40
- * @returns {string} the redacted value
41
- */
42
- export const ipRedactor = (value, source, kind) => {
43
- const { redacted, counters } = _redactIps(value);
44
- Object.entries(counters).forEach(([type, counter]) => {
45
- if (counter > 0) {
46
- _getPIICounterRedactionMetric().add(counter, {
47
- pii_type: type,
48
- redaction_source: source,
49
- pii_format: kind,
50
- });
51
- }
52
- });
53
- return redacted;
54
- };
@@ -1,7 +0,0 @@
1
- import { Attributes, Counter } from "@opentelemetry/api";
2
- /**
3
- * Returns a singleton OpenTelemetry counter metric used to record occurrences of PII redactions.
4
- *
5
- * @returns {Counter} The singleton OpenTelemetry counter metric for PII redactions.
6
- */
7
- export declare function _getPIICounterRedactionMetric(): Counter<Attributes>;
@@ -1,18 +0,0 @@
1
- import { getMetric } from "../metrics.js";
2
- // Cached singleton instance of the redaction counter metric
3
- let _redactedCounter;
4
- /**
5
- * Returns a singleton OpenTelemetry counter metric used to record occurrences of PII redactions.
6
- *
7
- * @returns {Counter} The singleton OpenTelemetry counter metric for PII redactions.
8
- */
9
- export function _getPIICounterRedactionMetric() {
10
- if (_redactedCounter) {
11
- return _redactedCounter;
12
- }
13
- _redactedCounter = getMetric("counter", {
14
- meterName: "o11y",
15
- metricName: "o11y_pii_redaction",
16
- });
17
- return _redactedCounter;
18
- }
package/dist/package.json DELETED
@@ -1,59 +0,0 @@
1
- {
2
- "name": "@ogcio/o11y-sdk-node",
3
- "version": "0.4.2",
4
- "description": "Opentelemetry standard instrumentation SDK for NodeJS based project",
5
- "main": "dist/index.js",
6
- "type": "module",
7
- "scripts": {
8
- "build": "rm -rf dist && tsc -p tsconfig.json",
9
- "test": "vitest",
10
- "prepublishOnly": "pnpm i && pnpm build",
11
- "test:unit": "vitest --project unit",
12
- "test:integration": "pnpm --filter @ogcio/o11y run prepare:integration && vitest --project integration",
13
- "test:integration:dryrun": "vitest --project integration"
14
- },
15
- "exports": {
16
- ".": "./dist/index.js",
17
- "./*": "./dist/*.js"
18
- },
19
- "keywords": [
20
- "observability",
21
- "o11y",
22
- "opentelemetry",
23
- "node",
24
- "nodejs",
25
- "ogcio"
26
- ],
27
- "author": "team:ogcio/observability",
28
- "license": "ISC",
29
- "dependencies": {
30
- "@grpc/grpc-js": "^1.13.4",
31
- "@opentelemetry/api": "^1.9.0",
32
- "@opentelemetry/api-logs": "^0.203.0",
33
- "@opentelemetry/auto-instrumentations-node": "^0.62.1",
34
- "@opentelemetry/core": "^2.0.1",
35
- "@opentelemetry/exporter-logs-otlp-grpc": "^0.203.0",
36
- "@opentelemetry/exporter-logs-otlp-http": "^0.203.0",
37
- "@opentelemetry/exporter-metrics-otlp-grpc": "^0.203.0",
38
- "@opentelemetry/exporter-metrics-otlp-http": "^0.203.0",
39
- "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0",
40
- "@opentelemetry/exporter-trace-otlp-http": "^0.203.0",
41
- "@opentelemetry/instrumentation": "^0.203.0",
42
- "@opentelemetry/otlp-exporter-base": "^0.203.0",
43
- "@opentelemetry/resources": "^2.0.1",
44
- "@opentelemetry/sdk-logs": "^0.203.0",
45
- "@opentelemetry/sdk-metrics": "^2.0.1",
46
- "@opentelemetry/sdk-node": "^0.203.0",
47
- "@opentelemetry/sdk-trace-base": "^2.0.1"
48
- },
49
- "devDependencies": {
50
- "@types/node": "^24.3.0",
51
- "@vitest/coverage-v8": "^3.2.4",
52
- "tsx": "^4.20.5",
53
- "typescript": "^5.8.3",
54
- "vitest": "^3.2.4"
55
- },
56
- "engines": {
57
- "node": ">=20.6.0"
58
- }
59
- }
@@ -1,2 +0,0 @@
1
- declare const _default: import("vite").UserConfig;
2
- export default _default;
@@ -1,45 +0,0 @@
1
- import { defineConfig } from "vitest/config";
2
- export default defineConfig({
3
- test: {
4
- globals: true,
5
- watch: false,
6
- exclude: ["**/fixtures/**", "**/dist/**"],
7
- poolOptions: {
8
- threads: {
9
- maxThreads: 8,
10
- },
11
- },
12
- clearMocks: true,
13
- testTimeout: 30_000,
14
- coverage: {
15
- enabled: true,
16
- provider: "v8",
17
- reportsDirectory: "coverage",
18
- reporter: ["lcov", "cobertura"],
19
- clean: true,
20
- },
21
- reporters: ["default", ["junit", { outputFile: "test-report.xml" }]],
22
- environment: "node",
23
- pool: "threads",
24
- projects: [
25
- {
26
- test: {
27
- include: [
28
- "**/test/*.test.ts",
29
- "**/test/processor/**/*.test.ts",
30
- "**/test/traces/**/*.test.ts",
31
- "**/test/internals/**/*.test.ts",
32
- "**/test/exporter/**/*.test.ts",
33
- ],
34
- name: "unit",
35
- },
36
- },
37
- {
38
- test: {
39
- include: ["**/test/integration/**/*.test.ts"],
40
- name: "integration",
41
- },
42
- },
43
- ],
44
- },
45
- });
package/index.ts DELETED
@@ -1,9 +0,0 @@
1
- import type { NodeSDK } from "@opentelemetry/sdk-node";
2
- import buildNodeInstrumentation from "./lib/instrumentation.node.js";
3
-
4
- export type * from "./lib/index.js";
5
- export type { NodeSDK };
6
- export { buildNodeInstrumentation as instrumentNode };
7
-
8
- export * from "./lib/metrics.js";
9
- export * from "./lib/traces.js";
@@ -1,12 +0,0 @@
1
- import { NodeSDKConfig } from "./index.js";
2
-
3
- let nodeSDKConfig: NodeSDKConfig;
4
-
5
- export const setNodeSdkConfig = (config: NodeSDKConfig) => {
6
- nodeSDKConfig = config;
7
- };
8
-
9
- export const getNodeSdkConfig = (): NodeSDKConfig | undefined => {
10
- // Ensure getters do not edit config.
11
- return nodeSDKConfig ? JSON.parse(JSON.stringify(nodeSDKConfig)) : undefined;
12
- };
@@ -1,33 +0,0 @@
1
- import {
2
- ConsoleLogRecordExporter,
3
- SimpleLogRecordProcessor,
4
- } from "@opentelemetry/sdk-logs";
5
- import { metrics } from "@opentelemetry/sdk-node";
6
- import {
7
- ConsoleSpanExporter,
8
- SimpleSpanProcessor,
9
- } from "@opentelemetry/sdk-trace-base";
10
- import { NodeSDKConfig } from "../index.js";
11
- import {
12
- _logsProcessorConfig,
13
- _spansProcessorConfig,
14
- } from "./processor-config.js";
15
- import { Exporters } from "./index.js";
16
-
17
- export default function buildConsoleExporters(
18
- config: NodeSDKConfig,
19
- ): Exporters {
20
- return {
21
- spans: [
22
- new SimpleSpanProcessor(new ConsoleSpanExporter()),
23
- ..._spansProcessorConfig(config),
24
- ],
25
- metrics: new metrics.PeriodicExportingMetricReader({
26
- exporter: new metrics.ConsoleMetricExporter(),
27
- }),
28
- logs: [
29
- ..._logsProcessorConfig(config),
30
- new SimpleLogRecordProcessor(new ConsoleLogRecordExporter()),
31
- ],
32
- };
33
- }
@@ -1,65 +0,0 @@
1
- import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-grpc";
2
- import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-grpc";
3
- import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-grpc";
4
- import { CompressionAlgorithm } from "@opentelemetry/otlp-exporter-base";
5
- import { metrics } from "@opentelemetry/sdk-node";
6
- import { NodeSDKConfig } from "../index.js";
7
- import { LogRecordProcessorMap, SpanProcessorMap } from "../utils.js";
8
- import {
9
- _logsProcessorConfig,
10
- _spansProcessorConfig,
11
- } from "./processor-config.js";
12
- import { Exporters } from "./index.js";
13
- import { getNodeSdkConfig } from "../config-manager.js";
14
- import { PIIExporterDecorator } from "./pii-exporter-decorator.js";
15
-
16
- async function defaultMetadata() {
17
- const { Metadata } = await import("@grpc/grpc-js");
18
-
19
- return new Metadata({
20
- waitForReady: true,
21
- });
22
- }
23
-
24
- export default async function buildGrpcExporters(
25
- config: NodeSDKConfig,
26
- ): Promise<Exporters> {
27
- return {
28
- spans: [
29
- new SpanProcessorMap[config.collectorMode ?? "batch"](
30
- new PIIExporterDecorator(
31
- new OTLPTraceExporter({
32
- url: `${config.collectorUrl}`,
33
- compression: CompressionAlgorithm.GZIP,
34
- metadata: config.grpcMetadata ?? (await defaultMetadata()),
35
- }),
36
- getNodeSdkConfig(),
37
- ),
38
- ),
39
- ..._spansProcessorConfig(config),
40
- ],
41
- metrics: new metrics.PeriodicExportingMetricReader({
42
- exporter: new PIIExporterDecorator(
43
- new OTLPMetricExporter({
44
- url: `${config.collectorUrl}`,
45
- compression: CompressionAlgorithm.GZIP,
46
- metadata: config.grpcMetadata ?? (await defaultMetadata()),
47
- }),
48
- getNodeSdkConfig(),
49
- ),
50
- }),
51
- logs: [
52
- ..._logsProcessorConfig(config),
53
- new LogRecordProcessorMap[config.collectorMode ?? "batch"](
54
- new PIIExporterDecorator(
55
- new OTLPLogExporter({
56
- url: `${config.collectorUrl}`,
57
- compression: CompressionAlgorithm.GZIP,
58
- metadata: config.grpcMetadata ?? (await defaultMetadata()),
59
- }),
60
- getNodeSdkConfig(),
61
- ),
62
- ),
63
- ],
64
- };
65
- }
@@ -1,56 +0,0 @@
1
- import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http";
2
- import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http";
3
- import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
4
- import { CompressionAlgorithm } from "@opentelemetry/otlp-exporter-base";
5
- import { metrics } from "@opentelemetry/sdk-node";
6
- import { NodeSDKConfig } from "../index.js";
7
- import { LogRecordProcessorMap, SpanProcessorMap } from "../utils.js";
8
- import {
9
- _logsProcessorConfig,
10
- _spansProcessorConfig,
11
- } from "./processor-config.js";
12
- import { Exporters } from "./index.js";
13
- import { getNodeSdkConfig } from "../config-manager.js";
14
- import { PIIExporterDecorator } from "./pii-exporter-decorator.js";
15
-
16
- export default function buildHttpExporters(config: NodeSDKConfig): Exporters {
17
- if (config.collectorUrl.endsWith("/")) {
18
- config.collectorUrl = config.collectorUrl.slice(0, -1);
19
- }
20
-
21
- return {
22
- spans: [
23
- new SpanProcessorMap[config.collectorMode ?? "batch"](
24
- new PIIExporterDecorator(
25
- new OTLPTraceExporter({
26
- url: `${config.collectorUrl}/v1/traces`,
27
- compression: CompressionAlgorithm.GZIP,
28
- }),
29
- getNodeSdkConfig(),
30
- ),
31
- ),
32
- ..._spansProcessorConfig(config),
33
- ],
34
- metrics: new metrics.PeriodicExportingMetricReader({
35
- exporter: new PIIExporterDecorator(
36
- new OTLPMetricExporter({
37
- url: `${config.collectorUrl}/v1/metrics`,
38
- compression: CompressionAlgorithm.GZIP,
39
- }),
40
- getNodeSdkConfig(),
41
- ),
42
- }),
43
- logs: [
44
- ..._logsProcessorConfig(config),
45
- new LogRecordProcessorMap[config.collectorMode ?? "batch"](
46
- new PIIExporterDecorator(
47
- new OTLPLogExporter({
48
- url: `${config.collectorUrl}/v1/logs`,
49
- compression: CompressionAlgorithm.GZIP,
50
- }),
51
- getNodeSdkConfig(),
52
- ),
53
- ),
54
- ],
55
- };
56
- }
@@ -1,9 +0,0 @@
1
- import { LogRecordProcessor } from "@opentelemetry/sdk-logs";
2
- import type { metrics } from "@opentelemetry/sdk-node";
3
- import { SpanProcessor } from "@opentelemetry/sdk-trace-base";
4
-
5
- export type Exporters = {
6
- spans: SpanProcessor[];
7
- metrics: metrics.MetricReader;
8
- logs: LogRecordProcessor[];
9
- };
@@ -1,187 +0,0 @@
1
- import { ExportResult } from "@opentelemetry/core";
2
- import { OTLPExporterBase } from "@opentelemetry/otlp-exporter-base";
3
- import { ReadableLogRecord } from "@opentelemetry/sdk-logs";
4
- import {
5
- PushMetricExporter,
6
- ResourceMetrics,
7
- } from "@opentelemetry/sdk-metrics";
8
- import { ReadableSpan, SpanExporter } from "@opentelemetry/sdk-trace-base";
9
- import { NodeSDKConfig } from "../index.js";
10
- import {
11
- _cleanStringPII,
12
- _recursiveObjectClean,
13
- } from "../internals/redaction/pii-detection.js";
14
- import {
15
- Redactor,
16
- RedactorKeys,
17
- redactors,
18
- } from "../internals/redaction/redactors/index.js";
19
-
20
- export class PIIExporterDecorator
21
- extends OTLPExporterBase<
22
- (ReadableSpan | ReadableLogRecord)[] | ResourceMetrics
23
- >
24
- implements SpanExporter, PushMetricExporter
25
- {
26
- private readonly _exporter;
27
- private readonly _config;
28
- private readonly _redactors;
29
-
30
- constructor(
31
- exporter: OTLPExporterBase<
32
- (ReadableSpan | ReadableLogRecord)[] | ResourceMetrics
33
- >,
34
- config: NodeSDKConfig | undefined,
35
- ) {
36
- super(exporter["_delegate"]);
37
- this._exporter = exporter;
38
- this._config = config;
39
- this._redactors = this._buildRedactors(config?.detection);
40
- }
41
-
42
- forceFlush(): Promise<void> {
43
- return this._exporter.forceFlush();
44
- }
45
-
46
- shutdown(): Promise<void> {
47
- return this._exporter.shutdown();
48
- }
49
-
50
- export(
51
- items: (ReadableSpan | ReadableLogRecord)[] | ResourceMetrics,
52
- resultCallback: (result: ExportResult) => void,
53
- ): void {
54
- if (this._redactors.length === 0) {
55
- this._exporter.export(items, resultCallback);
56
- return;
57
- }
58
-
59
- if (Array.isArray(items)) {
60
- const redactedItem = items.map((item) => {
61
- if (this._isReadableSpan(item)) {
62
- this._redactSpan(item);
63
- } else if (this._isReadableLogRecord(item)) {
64
- item = this._redactLogRecord(item);
65
- }
66
- return item;
67
- });
68
-
69
- this._exporter.export(redactedItem, resultCallback);
70
- return;
71
- }
72
-
73
- if (this._isResourceMetrics(items)) {
74
- this._redactResourceMetrics(items);
75
- this._exporter.export(items, resultCallback);
76
- }
77
- }
78
-
79
- private _isReadableSpan(span: unknown): span is ReadableSpan {
80
- return (
81
- typeof span === "object" &&
82
- span !== null &&
83
- "name" in span &&
84
- "kind" in span &&
85
- "spanContext" in span &&
86
- "attributes" in span
87
- );
88
- }
89
-
90
- private _isReadableLogRecord(span: unknown): span is ReadableLogRecord {
91
- return (
92
- typeof span === "object" &&
93
- span !== null &&
94
- "body" in span &&
95
- "attributes" in span &&
96
- "severityText" in span &&
97
- "severityNumber" in span
98
- );
99
- }
100
-
101
- private _isResourceMetrics(obj: unknown): obj is ResourceMetrics {
102
- return (
103
- typeof obj === "object" &&
104
- obj !== null &&
105
- !Array.isArray(obj) &&
106
- "resource" in obj &&
107
- "scopeMetrics" in obj
108
- );
109
- }
110
-
111
- private _redactSpan(span: ReadableSpan): void {
112
- Object.assign(span, {
113
- name: _cleanStringPII(span.name, "trace", this._redactors),
114
- attributes:
115
- span.attributes &&
116
- _recursiveObjectClean(span.attributes, "trace", this._redactors),
117
- resource: {
118
- attributes:
119
- span?.resource?.attributes &&
120
- _recursiveObjectClean(
121
- span.resource.attributes,
122
- "trace",
123
- this._redactors,
124
- ),
125
- },
126
- links: span?.links?.map((link) => {
127
- Object.assign(link, {
128
- attributes:
129
- link?.attributes &&
130
- _recursiveObjectClean(link.attributes, "trace", this._redactors),
131
- });
132
- }),
133
- events: span?.events?.map((event) => {
134
- Object.assign(event, {
135
- name: _cleanStringPII(event.name, "trace", this._redactors),
136
- attributes:
137
- event?.attributes &&
138
- _recursiveObjectClean(event.attributes, "trace", this._redactors),
139
- });
140
- return event;
141
- }),
142
- });
143
- }
144
-
145
- private _redactLogRecord(log: ReadableLogRecord): ReadableLogRecord {
146
- return {
147
- ...log,
148
- body: _recursiveObjectClean(log.body, "log", this._redactors),
149
- attributes:
150
- log.attributes &&
151
- _recursiveObjectClean(log.attributes, "log", this._redactors),
152
- resource: log.resource && {
153
- ...log.resource,
154
- attributes: _recursiveObjectClean(
155
- log.resource.attributes,
156
- "log",
157
- this._redactors,
158
- ),
159
- },
160
- };
161
- }
162
-
163
- private _redactResourceMetrics(metric: ResourceMetrics): void {
164
- Object.assign(metric, {
165
- resource: {
166
- attributes:
167
- metric?.resource?.attributes &&
168
- _recursiveObjectClean(
169
- metric.resource.attributes,
170
- "metric",
171
- this._redactors,
172
- ),
173
- },
174
- });
175
- }
176
-
177
- // Default opt-in every redactor available, excluding only those explicitly configured to false
178
- private _buildRedactors(
179
- redactorsConfig: NodeSDKConfig["detection"] = {},
180
- ): Redactor[] {
181
- return Object.entries(redactors)
182
- .filter(([key]) => {
183
- return redactorsConfig[key as RedactorKeys] !== false;
184
- })
185
- .map(([_, value]) => value);
186
- }
187
- }
@@ -1,23 +0,0 @@
1
- import { NodeSDKConfig } from "../index.js";
2
- import { EnrichLogProcessor } from "../processor/enrich-logger-processor.js";
3
- import { EnrichSpanProcessor } from "../processor/enrich-span-processor.js";
4
-
5
- export function _spansProcessorConfig(config: NodeSDKConfig) {
6
- const _processor = [];
7
-
8
- if (config.spanAttributes) {
9
- _processor.push(new EnrichSpanProcessor(config.spanAttributes));
10
- }
11
-
12
- return _processor;
13
- }
14
-
15
- export function _logsProcessorConfig(config: NodeSDKConfig) {
16
- const _processor = [];
17
-
18
- if (config.spanAttributes) {
19
- _processor.push(new EnrichLogProcessor(config.spanAttributes));
20
- }
21
-
22
- return _processor;
23
- }