@devopsplaybook.io/otel-utils 1.2.0 → 1.3.0-beta.28.b481842
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 +6 -0
- package/dist/src/StandardLogger.d.ts +3 -0
- package/dist/src/StandardLogger.js +11 -0
- package/dist/src/StandardMeter.d.ts +3 -0
- package/dist/src/StandardMeter.js +7 -0
- package/dist/src/StandardTracer.d.ts +3 -0
- package/dist/src/StandardTracer.js +7 -0
- package/package.json +1 -1
- package/src/Shutdown.spec.ts +43 -0
- package/src/StandardLogger.ts +14 -0
- package/src/StandardMeter.ts +10 -0
- package/src/StandardTracer.ts +10 -0
package/README.md
CHANGED
|
@@ -50,6 +50,8 @@ span.end();
|
|
|
50
50
|
|
|
51
51
|
- `startSpan(name, parentSpan?)` — Creates a span. When no `parentSpan` is provided, adds `http.request_method=BACKEND` and `http.route` attributes. Span names are sanitized to `[a-zA-Z0-9-_/]`.
|
|
52
52
|
- `static updateHttpHeader(context, headers?)` — Injects W3C trace context into an HTTP headers object for propagation to downstream services.
|
|
53
|
+
- `forceFlush()` — Flushes pending spans to the exporter.
|
|
54
|
+
- `shutdown()` — Shuts down the tracer provider and flushes pending spans (call once, on process exit).
|
|
53
55
|
|
|
54
56
|
### StandardLogger
|
|
55
57
|
|
|
@@ -70,6 +72,8 @@ moduleLog.info("Hello world");
|
|
|
70
72
|
- `initOTel(config)` — Initializes the logger provider and optional OTLP exporter.
|
|
71
73
|
- `getLogger()` — Returns the underlying OTel `Logger` or `undefined`.
|
|
72
74
|
- `createModuleLogger(moduleName)` — Creates a `ModuleLogger` scoped to a module name.
|
|
75
|
+
- `forceFlush()` — Flushes pending log records to the exporter (no-op when the provider was never initialized).
|
|
76
|
+
- `shutdown()` — Shuts down the logger provider and flushes pending log records; no-op when the provider was never initialized (call once, on process exit).
|
|
73
77
|
|
|
74
78
|
### ModuleLogger
|
|
75
79
|
|
|
@@ -122,6 +126,8 @@ const cpuGauge = meter.createObservableGauge(
|
|
|
122
126
|
- `createUpDownCounter(key)` — Creates an `UpDownCounter`.
|
|
123
127
|
- `createHistogram(key)` — Creates a `Histogram`.
|
|
124
128
|
- `createObservableGauge(key, callback, description?)` — Creates an `ObservableGauge` with a callback. Description is optional.
|
|
129
|
+
- `forceFlush()` — Flushes pending metric data points to the exporter.
|
|
130
|
+
- `shutdown()` — Shuts down the meter provider and flushes pending metric data points (call once, on process exit).
|
|
125
131
|
|
|
126
132
|
## Internal Utilities
|
|
127
133
|
|
|
@@ -4,9 +4,12 @@ import { ModuleLogger } from "./ModuleLogger";
|
|
|
4
4
|
import type { StandardLoggerInterface } from "./models/StandardLoggerInterface";
|
|
5
5
|
export declare class StandardLogger implements StandardLoggerInterface {
|
|
6
6
|
private logger?;
|
|
7
|
+
private loggerProvider?;
|
|
7
8
|
private serviceVersion?;
|
|
8
9
|
private serviceName?;
|
|
9
10
|
initOTel(config: ConfigOTelInterface): void;
|
|
11
|
+
forceFlush(): Promise<void>;
|
|
12
|
+
shutdown(): Promise<void>;
|
|
10
13
|
getLogger(): OTelLogger | undefined;
|
|
11
14
|
createModuleLogger(moduleName: string): ModuleLogger;
|
|
12
15
|
}
|
|
@@ -30,9 +30,20 @@ class StandardLogger {
|
|
|
30
30
|
],
|
|
31
31
|
resource: (0, createResource_1.createOTelResource)(this.serviceName, this.serviceVersion),
|
|
32
32
|
});
|
|
33
|
+
this.loggerProvider = loggerProvider;
|
|
33
34
|
this.logger = loggerProvider.getLogger(`${this.serviceName}:${this.serviceVersion}`);
|
|
34
35
|
}
|
|
35
36
|
}
|
|
37
|
+
forceFlush() {
|
|
38
|
+
return this.loggerProvider
|
|
39
|
+
? this.loggerProvider.forceFlush()
|
|
40
|
+
: Promise.resolve();
|
|
41
|
+
}
|
|
42
|
+
shutdown() {
|
|
43
|
+
return this.loggerProvider
|
|
44
|
+
? this.loggerProvider.shutdown()
|
|
45
|
+
: Promise.resolve();
|
|
46
|
+
}
|
|
36
47
|
getLogger() {
|
|
37
48
|
return this.logger;
|
|
38
49
|
}
|
|
@@ -2,9 +2,12 @@ import { Counter, Histogram, ObservableGauge, UpDownCounter } from "@opentelemet
|
|
|
2
2
|
import { ConfigOTelInterface } from "./models/ConfigOTelInterface";
|
|
3
3
|
export declare class StandardMeter {
|
|
4
4
|
private meter;
|
|
5
|
+
private meterProvider;
|
|
5
6
|
private serviceVersion;
|
|
6
7
|
private serviceName;
|
|
7
8
|
constructor(config: ConfigOTelInterface);
|
|
9
|
+
forceFlush(): Promise<void>;
|
|
10
|
+
shutdown(): Promise<void>;
|
|
8
11
|
createCounter(key: string): Counter;
|
|
9
12
|
createUpDownCounter(key: string): UpDownCounter;
|
|
10
13
|
createHistogram(key: string): Histogram;
|
|
@@ -36,8 +36,15 @@ class StandardMeter {
|
|
|
36
36
|
resource: (0, createResource_1.createOTelResource)(this.serviceName, this.serviceVersion),
|
|
37
37
|
});
|
|
38
38
|
}
|
|
39
|
+
this.meterProvider = meterProvider;
|
|
39
40
|
this.meter = meterProvider.getMeter(`${this.serviceName}:${this.serviceVersion}`);
|
|
40
41
|
}
|
|
42
|
+
forceFlush() {
|
|
43
|
+
return this.meterProvider.forceFlush();
|
|
44
|
+
}
|
|
45
|
+
shutdown() {
|
|
46
|
+
return this.meterProvider.shutdown();
|
|
47
|
+
}
|
|
41
48
|
createCounter(key) {
|
|
42
49
|
return this.meter.createCounter(`${this.serviceName}.${key}`);
|
|
43
50
|
}
|
|
@@ -4,9 +4,12 @@ export declare class StandardTracer {
|
|
|
4
4
|
private static readonly SPAN_NAME_SANITIZE_RE;
|
|
5
5
|
private static readonly PROPAGATOR;
|
|
6
6
|
private tracer;
|
|
7
|
+
private traceProvider;
|
|
7
8
|
private serviceVersion;
|
|
8
9
|
private serviceName;
|
|
9
10
|
constructor(config: ConfigOTelInterface);
|
|
11
|
+
forceFlush(): Promise<void>;
|
|
12
|
+
shutdown(): Promise<void>;
|
|
10
13
|
startSpan(name: string, parentSpan?: Span): Span;
|
|
11
14
|
static updateHttpHeader(context: Span, headers?: {}): any;
|
|
12
15
|
}
|
|
@@ -66,11 +66,18 @@ class StandardTracer {
|
|
|
66
66
|
spanProcessors,
|
|
67
67
|
});
|
|
68
68
|
traceProvider.register();
|
|
69
|
+
this.traceProvider = traceProvider;
|
|
69
70
|
const contextManager = new context_async_hooks_1.AsyncHooksContextManager();
|
|
70
71
|
contextManager.enable();
|
|
71
72
|
api_1.default.context.setGlobalContextManager(contextManager);
|
|
72
73
|
this.tracer = api_1.default.trace.getTracer(`${this.serviceName}:${this.serviceVersion}`);
|
|
73
74
|
}
|
|
75
|
+
forceFlush() {
|
|
76
|
+
return this.traceProvider.forceFlush();
|
|
77
|
+
}
|
|
78
|
+
shutdown() {
|
|
79
|
+
return this.traceProvider.shutdown();
|
|
80
|
+
}
|
|
74
81
|
startSpan(name, parentSpan) {
|
|
75
82
|
const sanitizedName = String(name).replace(StandardTracer.SPAN_NAME_SANITIZE_RE, "_");
|
|
76
83
|
if (parentSpan) {
|
package/package.json
CHANGED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { StandardLogger } from "./StandardLogger";
|
|
2
|
+
import { StandardMeter } from "./StandardMeter";
|
|
3
|
+
import { StandardTracer } from "./StandardTracer";
|
|
4
|
+
import { ConfigOTelInterface } from "./models/ConfigOTelInterface";
|
|
5
|
+
|
|
6
|
+
const config: ConfigOTelInterface = {
|
|
7
|
+
SERVICE_ID: "test-service",
|
|
8
|
+
VERSION: "1.0.0",
|
|
9
|
+
OPENTELEMETRY_COLLECTOR_HTTP_TRACES: "",
|
|
10
|
+
OPENTELEMETRY_COLLECTOR_HTTP_METRICS: "",
|
|
11
|
+
OPENTELEMETRY_COLLECTOR_HTTP_LOGS: "",
|
|
12
|
+
OPENTELEMETRY_COLLECTOR_AWS: false,
|
|
13
|
+
OPENTELEMETRY_COLLECTOR_EXPORT_LOGS_INTERVAL_SECONDS: 60,
|
|
14
|
+
OPENTELEMETRY_COLLECTOR_EXPORT_METRICS_INTERVAL_SECONDS: 60,
|
|
15
|
+
OPENTELEMETRY_COLLECT_AUTHORIZATION_HEADER: "",
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
describe("OTel shutdown and forceFlush", () => {
|
|
19
|
+
it("StandardMeter exposes forceFlush and shutdown that resolve", async () => {
|
|
20
|
+
const meter = new StandardMeter(config);
|
|
21
|
+
await expect(meter.forceFlush()).resolves.toBeUndefined();
|
|
22
|
+
await expect(meter.shutdown()).resolves.toBeUndefined();
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("StandardLogger exposes forceFlush and shutdown that resolve without OTel endpoint", async () => {
|
|
26
|
+
const logger = new StandardLogger();
|
|
27
|
+
await expect(logger.forceFlush()).resolves.toBeUndefined();
|
|
28
|
+
await expect(logger.shutdown()).resolves.toBeUndefined();
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("StandardLogger flushes and shuts down the provider when initialized", async () => {
|
|
32
|
+
const logger = new StandardLogger();
|
|
33
|
+
logger.initOTel(config);
|
|
34
|
+
await expect(logger.forceFlush()).resolves.toBeUndefined();
|
|
35
|
+
await expect(logger.shutdown()).resolves.toBeUndefined();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("StandardTracer exposes forceFlush and shutdown that resolve", async () => {
|
|
39
|
+
const tracer = new StandardTracer(config);
|
|
40
|
+
await expect(tracer.forceFlush()).resolves.toBeUndefined();
|
|
41
|
+
await expect(tracer.shutdown()).resolves.toBeUndefined();
|
|
42
|
+
});
|
|
43
|
+
});
|
package/src/StandardLogger.ts
CHANGED
|
@@ -12,6 +12,7 @@ import type { StandardLoggerInterface } from "./models/StandardLoggerInterface";
|
|
|
12
12
|
|
|
13
13
|
export class StandardLogger implements StandardLoggerInterface {
|
|
14
14
|
private logger?: OTelLogger;
|
|
15
|
+
private loggerProvider?: LoggerProvider;
|
|
15
16
|
private serviceVersion?: string;
|
|
16
17
|
private serviceName?: string;
|
|
17
18
|
|
|
@@ -43,12 +44,25 @@ export class StandardLogger implements StandardLoggerInterface {
|
|
|
43
44
|
resource: createOTelResource(this.serviceName, this.serviceVersion),
|
|
44
45
|
});
|
|
45
46
|
|
|
47
|
+
this.loggerProvider = loggerProvider;
|
|
46
48
|
this.logger = loggerProvider.getLogger(
|
|
47
49
|
`${this.serviceName}:${this.serviceVersion}`,
|
|
48
50
|
);
|
|
49
51
|
}
|
|
50
52
|
}
|
|
51
53
|
|
|
54
|
+
public forceFlush(): Promise<void> {
|
|
55
|
+
return this.loggerProvider
|
|
56
|
+
? this.loggerProvider.forceFlush()
|
|
57
|
+
: Promise.resolve();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public shutdown(): Promise<void> {
|
|
61
|
+
return this.loggerProvider
|
|
62
|
+
? this.loggerProvider.shutdown()
|
|
63
|
+
: Promise.resolve();
|
|
64
|
+
}
|
|
65
|
+
|
|
52
66
|
public getLogger(): OTelLogger | undefined {
|
|
53
67
|
return this.logger;
|
|
54
68
|
}
|
package/src/StandardMeter.ts
CHANGED
|
@@ -15,6 +15,7 @@ import { ConfigOTelInterface } from "./models/ConfigOTelInterface";
|
|
|
15
15
|
|
|
16
16
|
export class StandardMeter {
|
|
17
17
|
private meter: Meter;
|
|
18
|
+
private meterProvider: MeterProvider;
|
|
18
19
|
private serviceVersion: string;
|
|
19
20
|
private serviceName: string;
|
|
20
21
|
|
|
@@ -49,11 +50,20 @@ export class StandardMeter {
|
|
|
49
50
|
resource: createOTelResource(this.serviceName, this.serviceVersion),
|
|
50
51
|
});
|
|
51
52
|
}
|
|
53
|
+
this.meterProvider = meterProvider;
|
|
52
54
|
this.meter = meterProvider.getMeter(
|
|
53
55
|
`${this.serviceName}:${this.serviceVersion}`,
|
|
54
56
|
);
|
|
55
57
|
}
|
|
56
58
|
|
|
59
|
+
public forceFlush(): Promise<void> {
|
|
60
|
+
return this.meterProvider.forceFlush();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public shutdown(): Promise<void> {
|
|
64
|
+
return this.meterProvider.shutdown();
|
|
65
|
+
}
|
|
66
|
+
|
|
57
67
|
public createCounter(key: string): Counter {
|
|
58
68
|
return this.meter.createCounter(`${this.serviceName}.${key}`);
|
|
59
69
|
}
|
package/src/StandardTracer.ts
CHANGED
|
@@ -22,6 +22,7 @@ export class StandardTracer {
|
|
|
22
22
|
private static readonly PROPAGATOR = new W3CTraceContextPropagator();
|
|
23
23
|
|
|
24
24
|
private tracer: Tracer;
|
|
25
|
+
private traceProvider: NodeTracerProvider;
|
|
25
26
|
private serviceVersion: string;
|
|
26
27
|
private serviceName: string;
|
|
27
28
|
|
|
@@ -48,6 +49,7 @@ export class StandardTracer {
|
|
|
48
49
|
spanProcessors,
|
|
49
50
|
});
|
|
50
51
|
traceProvider.register();
|
|
52
|
+
this.traceProvider = traceProvider;
|
|
51
53
|
const contextManager = new AsyncHooksContextManager();
|
|
52
54
|
contextManager.enable();
|
|
53
55
|
opentelemetry.context.setGlobalContextManager(contextManager);
|
|
@@ -56,6 +58,14 @@ export class StandardTracer {
|
|
|
56
58
|
);
|
|
57
59
|
}
|
|
58
60
|
|
|
61
|
+
public forceFlush(): Promise<void> {
|
|
62
|
+
return this.traceProvider.forceFlush();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public shutdown(): Promise<void> {
|
|
66
|
+
return this.traceProvider.shutdown();
|
|
67
|
+
}
|
|
68
|
+
|
|
59
69
|
public startSpan(name: string, parentSpan?: Span): Span {
|
|
60
70
|
const sanitizedName = String(name).replace(
|
|
61
71
|
StandardTracer.SPAN_NAME_SANITIZE_RE,
|