@vizydrop/tracer 3.5.1 → 4.0.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.
- package/README.md +113 -0
- package/dist/BaggageSpanProcessor.d.ts +16 -0
- package/dist/BaggageSpanProcessor.d.ts.map +1 -0
- package/dist/BaggageSpanProcessor.js +27 -0
- package/dist/BaggageSpanProcessor.js.map +1 -0
- package/dist/defaultOptions.d.ts +7 -0
- package/dist/defaultOptions.d.ts.map +1 -0
- package/{src → dist}/defaultOptions.js +7 -8
- package/dist/defaultOptions.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/requestFilters.d.ts +7 -0
- package/dist/requestFilters.d.ts.map +1 -0
- package/dist/requestFilters.js +28 -0
- package/dist/requestFilters.js.map +1 -0
- package/dist/tracer.d.ts +4 -0
- package/dist/tracer.d.ts.map +1 -0
- package/dist/tracer.js +80 -0
- package/dist/tracer.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/options.d.ts +9 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/options.js +3 -0
- package/dist/types/options.js.map +1 -0
- package/dist/types/tracer.d.ts +28 -0
- package/dist/types/tracer.d.ts.map +1 -0
- package/dist/types/tracer.js +3 -0
- package/dist/types/tracer.js.map +1 -0
- package/package.json +38 -20
- package/.whitesource +0 -8
- package/CHANGELOG.md +0 -19
- package/index.js +0 -12
- package/src/express/captureCorrelationIdMiddleware.js +0 -24
- package/src/express/index.js +0 -8
- package/src/koa/captureCorrelationIdMiddleware.js +0 -24
- package/src/koa/index.js +0 -8
- package/src/requestFilters.js +0 -37
- package/src/tracer.js +0 -89
package/README.md
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# @vizydrop/tracer
|
|
2
|
+
|
|
3
|
+
OpenTelemetry tracing wrapper for Vizydrop/Targetprocess Node.js services. Provides auto-instrumentation, metric collection, and correlation ID capture middleware for Express and Koa.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
yarn add @vizydrop/tracer
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
### Basic Setup
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import {createTracer} from '@vizydrop/tracer';
|
|
17
|
+
|
|
18
|
+
const {trace, agent} = createTracer({
|
|
19
|
+
openTelemetryOptions: {
|
|
20
|
+
serviceName: 'my-service',
|
|
21
|
+
serviceVersion: '1.0.0',
|
|
22
|
+
clusterName: 'production',
|
|
23
|
+
environment: 'prod',
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// Use trace API for manual spans
|
|
28
|
+
const tracer = trace.getTracer('my-module');
|
|
29
|
+
|
|
30
|
+
// Graceful shutdown
|
|
31
|
+
process.on('SIGTERM', () => agent.shutdown());
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Express Middleware
|
|
35
|
+
|
|
36
|
+
Captures correlation ID from the request and attaches it to the active OpenTelemetry span.
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
import {express} from '@vizydrop/tracer';
|
|
40
|
+
|
|
41
|
+
app.use(express.captureCorrelationIdMiddleware((req) => req.headers['x-correlation-id']));
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Koa Middleware
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
import {koa} from '@vizydrop/tracer';
|
|
48
|
+
|
|
49
|
+
app.use(koa.captureCorrelationIdMiddleware((request) => request.headers['x-correlation-id']));
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Configuration
|
|
53
|
+
|
|
54
|
+
| Option | Type | Default | Description |
|
|
55
|
+
|--------|------|---------|-------------|
|
|
56
|
+
| `enabled` | `boolean` | `true` | Enable/disable tracing instrumentation |
|
|
57
|
+
| `serviceName` | `string` | — | Service name reported to the collector |
|
|
58
|
+
| `serviceVersion` | `string` | — | Service version reported to the collector |
|
|
59
|
+
| `clusterName` | `string` | — | Cluster name (custom `tp_cluster` attribute) |
|
|
60
|
+
| `environment` | `string` | — | Deployment environment |
|
|
61
|
+
| `metricsIntervalMillis` | `number` | `1000` | Metric export interval in milliseconds |
|
|
62
|
+
| `ignoreUrls` | `(string \| RegExp)[]` | See below | URLs to exclude from tracing |
|
|
63
|
+
| `flushToConsole` | `boolean` | `false` | Output traces/metrics to console instead of OTLP |
|
|
64
|
+
| `traceExporterOptions` | `object` | — | Options passed to `OTLPTraceExporter` |
|
|
65
|
+
| `metricExporterOptions` | `object` | — | Options passed to `OTLPMetricExporter` |
|
|
66
|
+
| `getSpanAttributes` | `() => Record<string, string \| undefined>` | — | Function that returns custom attributes to attach to every span on start. Useful for injecting context like correlation IDs or user metadata from CLS/async storage into all outgoing spans. |
|
|
67
|
+
|
|
68
|
+
### Default Ignored URLs
|
|
69
|
+
|
|
70
|
+
- `/metrics`, `/_prometheus/metrics`
|
|
71
|
+
- `/assets/*`
|
|
72
|
+
- `/favicon*`
|
|
73
|
+
- `/api/v1/status`
|
|
74
|
+
- `/status`
|
|
75
|
+
|
|
76
|
+
## Features
|
|
77
|
+
|
|
78
|
+
- Automatic HTTP instrumentation via `@opentelemetry/auto-instrumentations-node`
|
|
79
|
+
- Sensitive data stripping from span names (tokens, session IDs, secrets)
|
|
80
|
+
- OTLP/gRPC export for traces and metrics
|
|
81
|
+
- Console export mode for local development
|
|
82
|
+
- Correlation ID capture middleware for Express and Koa
|
|
83
|
+
- Custom span attributes via `getSpanAttributes` (e.g., inject correlation IDs from async context)
|
|
84
|
+
|
|
85
|
+
### Custom Span Attributes
|
|
86
|
+
|
|
87
|
+
Use `getSpanAttributes` to inject dynamic attributes (e.g., correlation ID from CLS) into every span:
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
import {createTracer} from '@vizydrop/tracer';
|
|
91
|
+
import {correlationId} from '@vizydrop/correlation-id';
|
|
92
|
+
|
|
93
|
+
const {trace, agent} = createTracer({
|
|
94
|
+
openTelemetryOptions: {
|
|
95
|
+
serviceName: 'my-service',
|
|
96
|
+
getSpanAttributes: () => ({
|
|
97
|
+
'correlation.id': correlationId.getId(),
|
|
98
|
+
'user.email': correlationId.getMetadata()?.email,
|
|
99
|
+
}),
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Development
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
yarn install
|
|
108
|
+
yarn build # Compile TypeScript
|
|
109
|
+
yarn test # Run tests
|
|
110
|
+
yarn lint # Run ESLint
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/*********************************************************************
|
|
2
|
+
* © Copyright IBM Corp. 2026
|
|
3
|
+
*********************************************************************/
|
|
4
|
+
import type { SpanProcessor, Span } from '@opentelemetry/sdk-trace-node';
|
|
5
|
+
export type GetSpanAttributes = () => Record<string, string | undefined>;
|
|
6
|
+
declare class BaggageSpanProcessor implements SpanProcessor {
|
|
7
|
+
private readonly getAttributes;
|
|
8
|
+
private static readonly RESOLVED;
|
|
9
|
+
constructor(getAttributes: GetSpanAttributes);
|
|
10
|
+
onStart(span: Span): void;
|
|
11
|
+
onEnd(): void;
|
|
12
|
+
forceFlush(): Promise<void>;
|
|
13
|
+
shutdown(): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
export { BaggageSpanProcessor };
|
|
16
|
+
//# sourceMappingURL=BaggageSpanProcessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaggageSpanProcessor.d.ts","sourceRoot":"","sources":["../src/BaggageSpanProcessor.ts"],"names":[],"mappings":"AAAA;;uEAEuE;AACvE,OAAO,KAAK,EAAC,aAAa,EAAE,IAAI,EAAC,MAAM,+BAA+B,CAAC;AAEvE,MAAM,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAEzE,cAAM,oBAAqB,YAAW,aAAa;IAGnC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAF1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAqB;gBAExB,aAAa,EAAE,iBAAiB;IAI7D,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAQzB,KAAK,IAAI,IAAI;IAEb,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B;AAED,OAAO,EAAC,oBAAoB,EAAC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaggageSpanProcessor = void 0;
|
|
4
|
+
class BaggageSpanProcessor {
|
|
5
|
+
constructor(getAttributes) {
|
|
6
|
+
this.getAttributes = getAttributes;
|
|
7
|
+
this.getAttributes = getAttributes;
|
|
8
|
+
}
|
|
9
|
+
onStart(span) {
|
|
10
|
+
try {
|
|
11
|
+
span.setAttributes(this.getAttributes());
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// Do not drop the span if attribute extraction fails
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
onEnd() { }
|
|
18
|
+
forceFlush() {
|
|
19
|
+
return BaggageSpanProcessor.RESOLVED;
|
|
20
|
+
}
|
|
21
|
+
shutdown() {
|
|
22
|
+
return BaggageSpanProcessor.RESOLVED;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.BaggageSpanProcessor = BaggageSpanProcessor;
|
|
26
|
+
BaggageSpanProcessor.RESOLVED = Promise.resolve();
|
|
27
|
+
//# sourceMappingURL=BaggageSpanProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaggageSpanProcessor.js","sourceRoot":"","sources":["../src/BaggageSpanProcessor.ts"],"names":[],"mappings":";;;AAOA,MAAM,oBAAoB;IAGtB,YAA6B,aAAgC;QAAhC,kBAAa,GAAb,aAAa,CAAmB;QACzD,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,IAAU;QACd,IAAI,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACL,qDAAqD;QACzD,CAAC;IACL,CAAC;IAED,KAAK,KAAU,CAAC;IAEhB,UAAU;QACN,OAAO,oBAAoB,CAAC,QAAQ,CAAC;IACzC,CAAC;IAED,QAAQ;QACJ,OAAO,oBAAoB,CAAC,QAAQ,CAAC;IACzC,CAAC;;AAGG,oDAAoB;AAzBA,6BAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/*********************************************************************
|
|
2
|
+
* © Copyright IBM Corp. 2026
|
|
3
|
+
*********************************************************************/
|
|
4
|
+
import type { DefaultOptions, OpenTelemetryOptions } from './types';
|
|
5
|
+
declare const addDefaultOptions: (overrides: OpenTelemetryOptions) => DefaultOptions & OpenTelemetryOptions;
|
|
6
|
+
export { addDefaultOptions, };
|
|
7
|
+
//# sourceMappingURL=defaultOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaultOptions.d.ts","sourceRoot":"","sources":["../src/defaultOptions.ts"],"names":[],"mappings":"AAAA;;uEAEuE;AACvE,OAAO,KAAK,EAAC,cAAc,EAAE,oBAAoB,EAAC,MAAM,SAAS,CAAC;AAclE,QAAA,MAAM,iBAAiB,GAAI,WAAW,oBAAoB,KAAG,cAAc,GAAG,oBAG5E,CAAC;AAEH,OAAO,EACH,iBAAiB,GACpB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.addDefaultOptions = void 0;
|
|
4
4
|
const defaultOptions = {
|
|
5
5
|
enabled: true,
|
|
6
6
|
metricsIntervalMillis: 1000,
|
|
@@ -10,12 +10,11 @@ const defaultOptions = {
|
|
|
10
10
|
/\/favicon.*/,
|
|
11
11
|
'/api/v1/status',
|
|
12
12
|
/[a-z ]*\/status/,
|
|
13
|
-
]
|
|
13
|
+
],
|
|
14
14
|
};
|
|
15
|
-
|
|
16
|
-
const addDefaultOptions = overrides => ({
|
|
15
|
+
const addDefaultOptions = (overrides) => ({
|
|
17
16
|
...defaultOptions,
|
|
18
17
|
...overrides,
|
|
19
18
|
});
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
exports.addDefaultOptions = addDefaultOptions;
|
|
20
|
+
//# sourceMappingURL=defaultOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaultOptions.js","sourceRoot":"","sources":["../src/defaultOptions.ts"],"names":[],"mappings":";;;AAKA,MAAM,cAAc,GAAmB;IACnC,OAAO,EAAE,IAAI;IACb,qBAAqB,EAAE,IAAI;IAC3B,UAAU,EAAE;QACR,kDAAkD;QAClD,cAAc;QACd,aAAa;QACb,gBAAgB;QAChB,iBAAiB;KACpB;CACJ,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,SAA+B,EAAyC,EAAE,CAAC,CAAC;IACnG,GAAG,cAAc;IACjB,GAAG,SAAS;CACf,CAAC,CAAC;AAGC,8CAAiB"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/*********************************************************************
|
|
2
|
+
* © Copyright IBM Corp. 2026
|
|
3
|
+
*********************************************************************/
|
|
4
|
+
import { createTracer } from './tracer';
|
|
5
|
+
export { createTracer, };
|
|
6
|
+
export type { OpenTelemetryOptions, CreateTracerOptions, TracerInstance } from './types';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;uEAEuE;AACvE,OAAO,EAAC,YAAY,EAAC,MAAM,UAAU,CAAC;AAEtC,OAAO,EACH,YAAY,GACf,CAAC;AAEF,YAAY,EACR,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACjB,MAAM,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTracer = void 0;
|
|
4
|
+
/*********************************************************************
|
|
5
|
+
* © Copyright IBM Corp. 2026
|
|
6
|
+
*********************************************************************/
|
|
7
|
+
const tracer_1 = require("./tracer");
|
|
8
|
+
Object.defineProperty(exports, "createTracer", { enumerable: true, get: function () { return tracer_1.createTracer; } });
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA;;uEAEuE;AACvE,qCAAsC;AAGlC,6FAHI,qBAAY,OAGJ"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/*********************************************************************
|
|
2
|
+
* © Copyright IBM Corp. 2026
|
|
3
|
+
*********************************************************************/
|
|
4
|
+
declare function replaceSensitiveData(text: string | undefined): string | undefined;
|
|
5
|
+
declare const buildIgnoredUrlMatcher: (ignoreUrls: (string | RegExp)[]) => (url: string) => boolean;
|
|
6
|
+
export { replaceSensitiveData, buildIgnoredUrlMatcher, };
|
|
7
|
+
//# sourceMappingURL=requestFilters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestFilters.d.ts","sourceRoot":"","sources":["../src/requestFilters.ts"],"names":[],"mappings":"AAAA;;uEAEuE;AAEvE,iBAAS,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAwB1E;AAED,QAAA,MAAM,sBAAsB,GAAI,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,MAC1D,KAAK,MAAM,KAAG,OAA2D,CAAC;AAE/E,OAAO,EACH,oBAAoB,EACpB,sBAAsB,GACzB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*********************************************************************
|
|
3
|
+
* © Copyright IBM Corp. 2026
|
|
4
|
+
*********************************************************************/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.buildIgnoredUrlMatcher = void 0;
|
|
7
|
+
exports.replaceSensitiveData = replaceSensitiveData;
|
|
8
|
+
function replaceSensitiveData(text) {
|
|
9
|
+
if (!text) {
|
|
10
|
+
return text;
|
|
11
|
+
}
|
|
12
|
+
const sensitivePatterns = [
|
|
13
|
+
/token=([^&]*)/gi,
|
|
14
|
+
/reset-password\/(?:.*)\/(.*)/gi,
|
|
15
|
+
/sessionId=([^&]*)/g,
|
|
16
|
+
/secret=([^&]*)/gi,
|
|
17
|
+
];
|
|
18
|
+
return sensitivePatterns.reduce((result, regexp) => {
|
|
19
|
+
const matches = regexp.exec(result);
|
|
20
|
+
if (matches) {
|
|
21
|
+
return matches.slice(1).reduce((res, match) => res.replace(match, '********'), result);
|
|
22
|
+
}
|
|
23
|
+
return result;
|
|
24
|
+
}, text);
|
|
25
|
+
}
|
|
26
|
+
const buildIgnoredUrlMatcher = (ignoreUrls) => (url) => ignoreUrls.some((ignored) => url.match(ignored));
|
|
27
|
+
exports.buildIgnoredUrlMatcher = buildIgnoredUrlMatcher;
|
|
28
|
+
//# sourceMappingURL=requestFilters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestFilters.js","sourceRoot":"","sources":["../src/requestFilters.ts"],"names":[],"mappings":";AAAA;;uEAEuE;;;AAgCnE,oDAAoB;AA9BxB,SAAS,oBAAoB,CAAC,IAAwB;IAClD,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,iBAAiB,GAAG;QACtB,iBAAiB;QACjB,gCAAgC;QAChC,oBAAoB;QACpB,kBAAkB;KACrB,CAAC;IAEF,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;QAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEpC,IAAI,OAAO,EAAE,CAAC;YACV,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAC1B,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,EAC9C,MAAM,CACT,CAAC;QACN,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC,EAAE,IAAI,CAAC,CAAC;AACb,CAAC;AAED,MAAM,sBAAsB,GAAG,CAAC,UAA+B,EAAE,EAAE,CAC/D,CAAC,GAAW,EAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAI3E,wDAAsB"}
|
package/dist/tracer.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../src/tracer.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAiB,mBAAmB,EAAE,kBAAkB,EAAuC,MAAM,SAAS,CAAC;AA8E3H,iBAAS,YAAY,CAAC,EAAC,oBAAoB,EAAC,EAAE,mBAAmB,GAAG,kBAAkB,CAQrF;AAED,OAAO,EACH,YAAY,GACf,CAAC"}
|
package/dist/tracer.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTracer = createTracer;
|
|
4
|
+
/*********************************************************************
|
|
5
|
+
* © Copyright IBM Corp. 2026
|
|
6
|
+
*********************************************************************/
|
|
7
|
+
const api_1 = require("@opentelemetry/api");
|
|
8
|
+
const sdk_node_1 = require("@opentelemetry/sdk-node");
|
|
9
|
+
const sdk_trace_node_1 = require("@opentelemetry/sdk-trace-node");
|
|
10
|
+
const resources_1 = require("@opentelemetry/resources");
|
|
11
|
+
const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
|
|
12
|
+
const auto_instrumentations_node_1 = require("@opentelemetry/auto-instrumentations-node");
|
|
13
|
+
const exporter_trace_otlp_grpc_1 = require("@opentelemetry/exporter-trace-otlp-grpc");
|
|
14
|
+
const exporter_metrics_otlp_grpc_1 = require("@opentelemetry/exporter-metrics-otlp-grpc");
|
|
15
|
+
const sdk_metrics_1 = require("@opentelemetry/sdk-metrics");
|
|
16
|
+
const requestFilters_1 = require("./requestFilters");
|
|
17
|
+
const defaultOptions_1 = require("./defaultOptions");
|
|
18
|
+
const BaggageSpanProcessor_1 = require("./BaggageSpanProcessor");
|
|
19
|
+
const ResourceAttributes = {
|
|
20
|
+
TpClusterName: 'tp_cluster',
|
|
21
|
+
DatadogEnvironment: 'tags.datadoghq.com/env',
|
|
22
|
+
Environment: 'deployment.environment',
|
|
23
|
+
};
|
|
24
|
+
const createOpenTelemetryAgent = ({ enabled, serviceName, serviceVersion, clusterName, environment, metricsIntervalMillis, ignoreUrls, flushToConsole, traceExporterOptions, metricExporterOptions, getSpanAttributes, }) => {
|
|
25
|
+
const matchIgnoredUrl = (0, requestFilters_1.buildIgnoredUrlMatcher)(ignoreUrls);
|
|
26
|
+
const traceExporter = flushToConsole
|
|
27
|
+
? new sdk_trace_node_1.ConsoleSpanExporter()
|
|
28
|
+
: new exporter_trace_otlp_grpc_1.OTLPTraceExporter(traceExporterOptions);
|
|
29
|
+
const metricReader = flushToConsole
|
|
30
|
+
? new sdk_metrics_1.PeriodicExportingMetricReader({
|
|
31
|
+
exporter: new sdk_metrics_1.ConsoleMetricExporter(),
|
|
32
|
+
exportIntervalMillis: metricsIntervalMillis,
|
|
33
|
+
})
|
|
34
|
+
: new sdk_metrics_1.PeriodicExportingMetricReader({ exporter: new exporter_metrics_otlp_grpc_1.OTLPMetricExporter(metricExporterOptions) });
|
|
35
|
+
const spanProcessors = getSpanAttributes
|
|
36
|
+
? [new BaggageSpanProcessor_1.BaggageSpanProcessor(getSpanAttributes), new sdk_trace_node_1.BatchSpanProcessor(traceExporter)]
|
|
37
|
+
: [new sdk_trace_node_1.BatchSpanProcessor(traceExporter)];
|
|
38
|
+
const agent = new sdk_node_1.NodeSDK({
|
|
39
|
+
resource: (0, resources_1.resourceFromAttributes)({
|
|
40
|
+
[semantic_conventions_1.ATTR_SERVICE_NAME]: serviceName,
|
|
41
|
+
[semantic_conventions_1.ATTR_SERVICE_VERSION]: serviceVersion,
|
|
42
|
+
[ResourceAttributes.TpClusterName]: clusterName,
|
|
43
|
+
[ResourceAttributes.DatadogEnvironment]: environment,
|
|
44
|
+
[ResourceAttributes.Environment]: environment,
|
|
45
|
+
}),
|
|
46
|
+
metricReader,
|
|
47
|
+
spanProcessors,
|
|
48
|
+
instrumentations: enabled
|
|
49
|
+
? [
|
|
50
|
+
(0, auto_instrumentations_node_1.getNodeAutoInstrumentations)({
|
|
51
|
+
'@opentelemetry/instrumentation-http': {
|
|
52
|
+
ignoreIncomingRequestHook: ({ url }) => matchIgnoredUrl(url ?? ''),
|
|
53
|
+
ignoreOutgoingRequestHook: ({ path }) => matchIgnoredUrl(path ?? ''),
|
|
54
|
+
requestHook: (span, request) => {
|
|
55
|
+
if (span) {
|
|
56
|
+
const url = request.url;
|
|
57
|
+
span.updateName((0, requestFilters_1.replaceSensitiveData)(url) ?? '');
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
}),
|
|
62
|
+
]
|
|
63
|
+
: [],
|
|
64
|
+
});
|
|
65
|
+
if (enabled) {
|
|
66
|
+
agent.start();
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
shutdown: () => agent.shutdown(),
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
function createTracer({ openTelemetryOptions }) {
|
|
73
|
+
const config = (0, defaultOptions_1.addDefaultOptions)(openTelemetryOptions);
|
|
74
|
+
const agent = createOpenTelemetryAgent(config);
|
|
75
|
+
return {
|
|
76
|
+
trace: api_1.trace,
|
|
77
|
+
agent,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=tracer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracer.js","sourceRoot":"","sources":["../src/tracer.ts"],"names":[],"mappings":";;AAqGI,oCAAY;AArGhB;;uEAEuE;AACvE,4CAAyC;AACzC,sDAAgD;AAChD,kEAAsF;AACtF,wDAAgE;AAChE,8EAA4F;AAC5F,0FAAsF;AACtF,sFAA0E;AAC1E,0FAA6E;AAC7E,4DAAgG;AAEhG,qDAA8E;AAC9E,qDAAmD;AACnD,iEAA4D;AAE5D,MAAM,kBAAkB,GAAG;IACvB,aAAa,EAAE,YAAY;IAC3B,kBAAkB,EAAE,wBAAwB;IAC5C,WAAW,EAAE,wBAAwB;CAC/B,CAAC;AAEX,MAAM,wBAAwB,GAAG,CAAC,EAC9B,OAAO,EACP,WAAW,EACX,cAAc,EACd,WAAW,EACX,WAAW,EACX,qBAAqB,EACrB,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,GACmB,EAAkB,EAAE;IACxD,MAAM,eAAe,GAAG,IAAA,uCAAsB,EAAC,UAAU,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,cAAc;QAChC,CAAC,CAAC,IAAI,oCAAmB,EAAE;QAC3B,CAAC,CAAC,IAAI,4CAAiB,CAAC,oBAAoB,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,cAAc;QAC/B,CAAC,CAAC,IAAI,2CAA6B,CAAC;YAC9B,QAAQ,EAAE,IAAI,mCAAqB,EAAE;YACrC,oBAAoB,EAAE,qBAAqB;SAC9C,CAAC;QACJ,CAAC,CAAC,IAAI,2CAA6B,CAAC,EAAC,QAAQ,EAAE,IAAI,+CAAkB,CAAC,qBAAqB,CAAC,EAAC,CAAC,CAAC;IAEnG,MAAM,cAAc,GAAG,iBAAiB;QACpC,CAAC,CAAC,CAAC,IAAI,2CAAoB,CAAC,iBAAiB,CAAC,EAAE,IAAI,mCAAkB,CAAC,aAAa,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC,IAAI,mCAAkB,CAAC,aAAa,CAAC,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAG,IAAI,kBAAO,CAAC;QACtB,QAAQ,EAAE,IAAA,kCAAsB,EAAC;YAC7B,CAAC,wCAAiB,CAAC,EAAE,WAAW;YAChC,CAAC,2CAAoB,CAAC,EAAE,cAAc;YACtC,CAAC,kBAAkB,CAAC,aAAa,CAAC,EAAE,WAAW;YAC/C,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,EAAE,WAAW;YACpD,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,WAAW;SAChD,CAAC;QACF,YAAY;QACZ,cAAc;QACd,gBAAgB,EAAE,OAAO;YACrB,CAAC,CAAC;gBACI,IAAA,wDAA2B,EAAC;oBACxB,qCAAqC,EAAE;wBACnC,yBAAyB,EAAE,CAAC,EAAC,GAAG,EAAiB,EAAE,EAAE,CACjD,eAAe,CAAC,GAAG,IAAI,EAAE,CAAC;wBAC9B,yBAAyB,EAAE,CAAC,EAAC,IAAI,EAAyB,EAAE,EAAE,CAC1D,eAAe,CAAC,IAAI,IAAI,EAAE,CAAC;wBAC/B,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;4BAC3B,IAAI,IAAI,EAAE,CAAC;gCACP,MAAM,GAAG,GAAI,OAA0B,CAAC,GAAG,CAAC;gCAC5C,IAAI,CAAC,UAAU,CAAC,IAAA,qCAAoB,EAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;4BACrD,CAAC;wBACL,CAAC;qBACJ;iBACJ,CAAC;aACL;YACH,CAAC,CAAC,EAAE;KACX,CAAC,CAAC;IAEH,IAAI,OAAO,EAAE,CAAC;QACV,KAAK,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,OAAO;QACH,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE;KACnC,CAAC;AACN,CAAC,CAAC;AAEF,SAAS,YAAY,CAAC,EAAC,oBAAoB,EAAsB;IAC7D,MAAM,MAAM,GAAG,IAAA,kCAAiB,EAAC,oBAAoB,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAE/C,OAAO;QACH,KAAK,EAAL,WAAK;QACL,KAAK;KACR,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*********************************************************************
|
|
2
|
+
* © Copyright IBM Corp. 2026
|
|
3
|
+
*********************************************************************/
|
|
4
|
+
export { DefaultOptions } from './options';
|
|
5
|
+
export { OpenTelemetryOptions, CreateTracerOptions, CreateTracerResult, TracerInstance } from './tracer';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;uEAEuE;AACvE,OAAO,EAAC,cAAc,EAAC,MAAM,WAAW,CAAC;AACzC,OAAO,EAAC,oBAAoB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,cAAc,EAAC,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/*********************************************************************
|
|
2
|
+
* © Copyright IBM Corp. 2026
|
|
3
|
+
*********************************************************************/
|
|
4
|
+
export interface DefaultOptions {
|
|
5
|
+
enabled: boolean;
|
|
6
|
+
metricsIntervalMillis: number;
|
|
7
|
+
ignoreUrls: (string | RegExp)[];
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/types/options.ts"],"names":[],"mappings":"AAAA;;uEAEuE;AACvE,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,UAAU,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;CACnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/types/options.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/*********************************************************************
|
|
2
|
+
* © Copyright IBM Corp. 2026
|
|
3
|
+
*********************************************************************/
|
|
4
|
+
import type { TraceAPI } from '@opentelemetry/api';
|
|
5
|
+
export interface OpenTelemetryOptions {
|
|
6
|
+
enabled?: boolean;
|
|
7
|
+
serviceName?: string;
|
|
8
|
+
serviceVersion?: string;
|
|
9
|
+
clusterName?: string;
|
|
10
|
+
environment?: string;
|
|
11
|
+
metricsIntervalMillis?: number;
|
|
12
|
+
ignoreUrls?: (string | RegExp)[];
|
|
13
|
+
flushToConsole?: boolean;
|
|
14
|
+
traceExporterOptions?: Record<string, unknown>;
|
|
15
|
+
metricExporterOptions?: Record<string, unknown>;
|
|
16
|
+
getSpanAttributes?: () => Record<string, string | undefined>;
|
|
17
|
+
}
|
|
18
|
+
export interface TracerInstance {
|
|
19
|
+
shutdown: () => Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export interface CreateTracerOptions {
|
|
22
|
+
openTelemetryOptions: OpenTelemetryOptions;
|
|
23
|
+
}
|
|
24
|
+
export interface CreateTracerResult {
|
|
25
|
+
trace: TraceAPI;
|
|
26
|
+
agent: TracerInstance;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=tracer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../../src/types/tracer.ts"],"names":[],"mappings":"AAAA;;uEAEuE;AACvE,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,oBAAoB,CAAC;AAEjD,MAAM,WAAW,oBAAoB;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,UAAU,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACjC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,iBAAiB,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAChC,oBAAoB,EAAE,oBAAoB,CAAC;CAC9C;AAED,MAAM,WAAW,kBAAkB;IAC/B,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,EAAE,cAAc,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracer.js","sourceRoot":"","sources":["../../src/types/tracer.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,46 +1,64 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vizydrop/tracer",
|
|
3
3
|
"license": "MIT",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "4.0.0",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
5
10
|
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"prepublishOnly": "yarn build",
|
|
6
13
|
"test": "jest",
|
|
7
|
-
"lint": "eslint --quiet ."
|
|
14
|
+
"lint": "eslint --quiet --ext .ts src/"
|
|
8
15
|
},
|
|
9
16
|
"dependencies": {
|
|
10
17
|
"@opentelemetry/api": "^1.9.0",
|
|
11
|
-
"@opentelemetry/auto-instrumentations-node": "^0.
|
|
12
|
-
"@opentelemetry/exporter-metrics-otlp-grpc": "^0.
|
|
13
|
-
"@opentelemetry/exporter-trace-otlp-grpc": "^0.
|
|
14
|
-
"@opentelemetry/resources": "^2.
|
|
15
|
-
"@opentelemetry/sdk-metrics": "^2.
|
|
16
|
-
"@opentelemetry/sdk-node": "^0.
|
|
17
|
-
"@opentelemetry/sdk-trace-node": "^2.
|
|
18
|
-
"@opentelemetry/semantic-conventions": "^1.
|
|
19
|
-
"lodash": "^4.17.23"
|
|
18
|
+
"@opentelemetry/auto-instrumentations-node": "^0.76.0",
|
|
19
|
+
"@opentelemetry/exporter-metrics-otlp-grpc": "^0.218.0",
|
|
20
|
+
"@opentelemetry/exporter-trace-otlp-grpc": "^0.218.0",
|
|
21
|
+
"@opentelemetry/resources": "^2.7.1",
|
|
22
|
+
"@opentelemetry/sdk-metrics": "^2.7.1",
|
|
23
|
+
"@opentelemetry/sdk-node": "^0.218.0",
|
|
24
|
+
"@opentelemetry/sdk-trace-node": "^2.7.1",
|
|
25
|
+
"@opentelemetry/semantic-conventions": "^1.41.1"
|
|
20
26
|
},
|
|
21
27
|
"devDependencies": {
|
|
28
|
+
"@types/jest": "^30.0.0",
|
|
29
|
+
"@types/node": "^20.0.0",
|
|
30
|
+
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
31
|
+
"@typescript-eslint/parser": "^8.0.0",
|
|
22
32
|
"@vizydrop/eslint-config-vizydrop": "7.2.3",
|
|
23
|
-
"eslint": "
|
|
33
|
+
"eslint": "^8.56.0",
|
|
24
34
|
"eslint-config-airbnb": "18.1.0",
|
|
25
35
|
"eslint-config-prettier": "6.10.0",
|
|
26
36
|
"eslint-plugin-babel": "5.3.0",
|
|
27
37
|
"eslint-plugin-filenames": "1.3.2",
|
|
28
38
|
"eslint-plugin-flowtype": "4.7.0",
|
|
29
|
-
"eslint-plugin-import": "2.
|
|
39
|
+
"eslint-plugin-import": "2.29.1",
|
|
30
40
|
"eslint-plugin-jsx-a11y": "6.2.3",
|
|
31
|
-
"eslint-plugin-lodash-fp": "2.2.0-a1",
|
|
32
41
|
"eslint-plugin-mocha": "6.3.0",
|
|
33
42
|
"eslint-plugin-node": "11.1.0",
|
|
34
43
|
"eslint-plugin-promise": "4.2.1",
|
|
35
44
|
"eslint-plugin-react": "7.19.0",
|
|
36
45
|
"eslint-plugin-react-hooks": "2.5.0",
|
|
37
|
-
"jest": "30.2.0"
|
|
46
|
+
"jest": "30.2.0",
|
|
47
|
+
"ts-jest": "^29.3.0",
|
|
48
|
+
"typescript": "^5.7.0"
|
|
38
49
|
},
|
|
39
50
|
"jest": {
|
|
40
|
-
"testEnvironment": "node"
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
51
|
+
"testEnvironment": "node",
|
|
52
|
+
"transform": {
|
|
53
|
+
"^.+\\.ts$": [
|
|
54
|
+
"ts-jest",
|
|
55
|
+
{
|
|
56
|
+
"tsconfig": "tsconfig.test.json"
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
"testMatch": [
|
|
61
|
+
"**/src/__tests__/**/*.tests.ts"
|
|
62
|
+
]
|
|
45
63
|
}
|
|
46
64
|
}
|
package/.whitesource
DELETED
package/CHANGELOG.md
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
#### v2.4.0
|
|
2
|
-
Disable body capture
|
|
3
|
-
Disable use path as transactions
|
|
4
|
-
|
|
5
|
-
#### v2.3.1
|
|
6
|
-
Update dependencies
|
|
7
|
-
|
|
8
|
-
#### v2.3.0
|
|
9
|
-
Disable metrics
|
|
10
|
-
|
|
11
|
-
#### v2.2.0
|
|
12
|
-
Do not patch logger if tracer inactive
|
|
13
|
-
|
|
14
|
-
#### v2.1.0
|
|
15
|
-
Skip OPTIONS requests
|
|
16
|
-
|
|
17
|
-
#### v2.0.0
|
|
18
|
-
1. add koa and express middlewares
|
|
19
|
-
2. captureCorrelationIdMiddleware should receive getCorrelationId function
|
package/index.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/*********************************************************************
|
|
2
|
-
* © Copyright IBM Corp. 2025
|
|
3
|
-
*********************************************************************/
|
|
4
|
-
const {createTracer} = require('./src/tracer');
|
|
5
|
-
const express = require('./src/express');
|
|
6
|
-
const koa = require('./src/koa');
|
|
7
|
-
|
|
8
|
-
module.exports = {
|
|
9
|
-
createTracer,
|
|
10
|
-
express,
|
|
11
|
-
koa,
|
|
12
|
-
};
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/*********************************************************************
|
|
2
|
-
* © Copyright IBM Corp. 2025
|
|
3
|
-
*********************************************************************/
|
|
4
|
-
const { trace } = require('@opentelemetry/api');
|
|
5
|
-
|
|
6
|
-
const captureCorrelationIdMiddleware = (getCorrelationId) => {
|
|
7
|
-
if (!getCorrelationId && typeof getCorrelationId !== 'function') {
|
|
8
|
-
throw new Error('getCorrelationId expect to be a function');
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
return (req, res, next) => {
|
|
12
|
-
const currentSpan = trace.getActiveSpan();
|
|
13
|
-
|
|
14
|
-
if (currentSpan) {
|
|
15
|
-
currentSpan.setAttribute('correlationId', getCorrelationId(req));
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
next();
|
|
19
|
-
};
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
module.exports = {
|
|
23
|
-
captureCorrelationIdMiddleware
|
|
24
|
-
};
|
package/src/express/index.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/*********************************************************************
|
|
2
|
-
* © Copyright IBM Corp. 2025
|
|
3
|
-
*********************************************************************/
|
|
4
|
-
const {captureCorrelationIdMiddleware} = require('./captureCorrelationIdMiddleware');
|
|
5
|
-
|
|
6
|
-
module.exports = {
|
|
7
|
-
captureCorrelationIdMiddleware,
|
|
8
|
-
};
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/*********************************************************************
|
|
2
|
-
* © Copyright IBM Corp. 2025
|
|
3
|
-
*********************************************************************/
|
|
4
|
-
const { trace } = require('@opentelemetry/api');
|
|
5
|
-
|
|
6
|
-
const captureCorrelationIdMiddleware = (getCorrelationId) => {
|
|
7
|
-
if (!getCorrelationId && typeof getCorrelationId !== 'function') {
|
|
8
|
-
throw new Error('getCorrelationId expect to be a function');
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
return async (ctx, next) => {
|
|
12
|
-
const currentSpan = trace.getActiveSpan();
|
|
13
|
-
|
|
14
|
-
if (currentSpan) {
|
|
15
|
-
currentSpan.setAttribute('correlationId', getCorrelationId(ctx.request));
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
await next();
|
|
19
|
-
};
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
module.exports = {
|
|
23
|
-
captureCorrelationIdMiddleware,
|
|
24
|
-
};
|
package/src/koa/index.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/*********************************************************************
|
|
2
|
-
* © Copyright IBM Corp. 2025
|
|
3
|
-
*********************************************************************/
|
|
4
|
-
const {captureCorrelationIdMiddleware} = require('./captureCorrelationIdMiddleware');
|
|
5
|
-
|
|
6
|
-
module.exports = {
|
|
7
|
-
captureCorrelationIdMiddleware,
|
|
8
|
-
};
|
package/src/requestFilters.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/*********************************************************************
|
|
2
|
-
* © Copyright IBM Corp. 2025
|
|
3
|
-
*********************************************************************/
|
|
4
|
-
const _ = require('lodash/fp');
|
|
5
|
-
|
|
6
|
-
function replaceSensitiveData(text) {
|
|
7
|
-
if (!text) {
|
|
8
|
-
return text;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
const sensitivePatterns = [
|
|
12
|
-
/token=([^&]*)/gi,
|
|
13
|
-
/reset-password\/(?:.*)\/(.*)/gi,
|
|
14
|
-
/sessionId=([^&]*)/g,
|
|
15
|
-
/secret=([^&]*)/gi,
|
|
16
|
-
];
|
|
17
|
-
|
|
18
|
-
return sensitivePatterns.reduce((result, regexp) => {
|
|
19
|
-
const matches = regexp.exec(result);
|
|
20
|
-
|
|
21
|
-
if (matches) {
|
|
22
|
-
return _.tail(matches).reduce(
|
|
23
|
-
(res, match) => res.replace(match, '********'),
|
|
24
|
-
result,
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return result;
|
|
29
|
-
}, text);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const buildIgnoredUrlMatcher = ignoreUrls => url => ignoreUrls.some(ignored => url.match(ignored));
|
|
33
|
-
|
|
34
|
-
module.exports = {
|
|
35
|
-
replaceSensitiveData,
|
|
36
|
-
buildIgnoredUrlMatcher
|
|
37
|
-
};
|
package/src/tracer.js
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
/*********************************************************************
|
|
2
|
-
* © Copyright IBM Corp. 2025
|
|
3
|
-
*********************************************************************/
|
|
4
|
-
const { trace } = require('@opentelemetry/api');
|
|
5
|
-
const { NodeSDK } = require('@opentelemetry/sdk-node');
|
|
6
|
-
const { ConsoleSpanExporter } = require('@opentelemetry/sdk-trace-node');
|
|
7
|
-
const { resourceFromAttributes} = require('@opentelemetry/resources');
|
|
8
|
-
const { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } = require('@opentelemetry/semantic-conventions');
|
|
9
|
-
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
|
|
10
|
-
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-grpc');
|
|
11
|
-
const { OTLPMetricExporter } = require('@opentelemetry/exporter-metrics-otlp-grpc');
|
|
12
|
-
const { PeriodicExportingMetricReader, ConsoleMetricExporter } = require('@opentelemetry/sdk-metrics');
|
|
13
|
-
const { replaceSensitiveData, buildIgnoredUrlMatcher } = require('./requestFilters');
|
|
14
|
-
const { addDefaultOptions } = require('./defaultOptions');
|
|
15
|
-
|
|
16
|
-
const ResourceAttributes = {
|
|
17
|
-
TpClusterName: 'tp_cluster',
|
|
18
|
-
DatadogEnvironment: 'tags.datadoghq.com/env',
|
|
19
|
-
Environment: 'deployment.environment'
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
const createOpenTelemetryAgent = ({
|
|
23
|
-
enabled,
|
|
24
|
-
serviceName,
|
|
25
|
-
serviceVersion,
|
|
26
|
-
clusterName,
|
|
27
|
-
environment,
|
|
28
|
-
metricsIntervalMillis,
|
|
29
|
-
ignoreUrls,
|
|
30
|
-
flushToConsole,
|
|
31
|
-
traceExporterOptions,
|
|
32
|
-
metricExporterOptions,
|
|
33
|
-
}) => {
|
|
34
|
-
const matchIgnoredUrl = buildIgnoredUrlMatcher(ignoreUrls);
|
|
35
|
-
const traceExporter = flushToConsole ?
|
|
36
|
-
new ConsoleSpanExporter() :
|
|
37
|
-
new OTLPTraceExporter(traceExporterOptions);
|
|
38
|
-
const metricReader = flushToConsole ?
|
|
39
|
-
new PeriodicExportingMetricReader({
|
|
40
|
-
exporter: new ConsoleMetricExporter(),
|
|
41
|
-
metricsIntervalMillis
|
|
42
|
-
}) :
|
|
43
|
-
new PeriodicExportingMetricReader({ exporter: new OTLPMetricExporter(metricExporterOptions) });
|
|
44
|
-
|
|
45
|
-
const agent = new NodeSDK({
|
|
46
|
-
resource: resourceFromAttributes({
|
|
47
|
-
[ATTR_SERVICE_NAME]: serviceName,
|
|
48
|
-
[ATTR_SERVICE_VERSION]: serviceVersion,
|
|
49
|
-
[ResourceAttributes.TpClusterName]: clusterName,
|
|
50
|
-
[ResourceAttributes.DatadogEnvironment]: environment,
|
|
51
|
-
[ResourceAttributes.Environment]: environment
|
|
52
|
-
}),
|
|
53
|
-
traceExporter,
|
|
54
|
-
metricReader,
|
|
55
|
-
instrumentations: enabled ? [
|
|
56
|
-
getNodeAutoInstrumentations({
|
|
57
|
-
'@opentelemetry/instrumentation-http': {
|
|
58
|
-
ignoreIncomingRequestHook: ({ url }) => matchIgnoredUrl(url),
|
|
59
|
-
ignoreOutgoingRequestHook: ({ path }) => matchIgnoredUrl(path),
|
|
60
|
-
requestHook: (span, request) => {
|
|
61
|
-
if (span) {
|
|
62
|
-
span.updateName(replaceSensitiveData(request.url));
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
})
|
|
67
|
-
] : []
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
if(enabled) {
|
|
71
|
-
agent.start();
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return {
|
|
75
|
-
shutdown: () => agent.shutdown()
|
|
76
|
-
};
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
function createTracer({ openTelemetryOptions }) {
|
|
80
|
-
const config = addDefaultOptions(openTelemetryOptions);
|
|
81
|
-
const agent = createOpenTelemetryAgent(config);
|
|
82
|
-
|
|
83
|
-
return {
|
|
84
|
-
trace,
|
|
85
|
-
agent
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
module.exports = {createTracer};
|