sm-utility 2.3.8 → 2.4.1

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/index.js CHANGED
@@ -26,3 +26,4 @@ __exportStar(require("./stubs"), exports);
26
26
  __exportStar(require("./thread"), exports);
27
27
  __exportStar(require("./excel"), exports);
28
28
  __exportStar(require("./errors"), exports);
29
+ __exportStar(require("./tracing"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sm-utility",
3
- "version": "2.3.8",
3
+ "version": "2.4.1",
4
4
  "description": "reusable utility codes for sm projects",
5
5
  "main": "index.js",
6
6
  "types": "./index.d.ts",
@@ -27,6 +27,14 @@
27
27
  },
28
28
  "dependencies": {
29
29
  "@elastic/ecs-winston-format": "^1.3.1",
30
+ "@opentelemetry/auto-instrumentations-node": "0.55.3",
31
+ "@opentelemetry/exporter-trace-otlp-http": "0.57.1",
32
+ "@opentelemetry/id-generator-aws-xray": "1.2.2",
33
+ "@opentelemetry/instrumentation-express": "0.47.0",
34
+ "@opentelemetry/propagator-aws-xray": "1.26.1",
35
+ "@opentelemetry/resources": "1.30.1",
36
+ "@opentelemetry/sdk-node": "0.57.1",
37
+ "@opentelemetry/sdk-trace-base": "1.30.1",
30
38
  "aws-sdk": "^2.1134.0",
31
39
  "axios": "^1.6.8",
32
40
  "express-winston": "^4.1.0",
@@ -0,0 +1,2 @@
1
+ export { OpenTelemetryTracer } from "./opentelemetry-tracer";
2
+ export type { TracingConfig } from "./opentelemetry-tracer";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenTelemetryTracer = void 0;
4
+ var opentelemetry_tracer_1 = require("./opentelemetry-tracer");
5
+ Object.defineProperty(exports, "OpenTelemetryTracer", { enumerable: true, get: function () { return opentelemetry_tracer_1.OpenTelemetryTracer; } });
@@ -0,0 +1,15 @@
1
+ export interface TracingConfig {
2
+ serviceName: string;
3
+ environment: string;
4
+ otelEndpoint: string;
5
+ samplingRatio?: number;
6
+ maxQueueSize?: number;
7
+ scheduledDelayMillis?: number;
8
+ ignoredPaths?: (string | RegExp | ((url: string) => boolean))[];
9
+ }
10
+ export declare class OpenTelemetryTracer {
11
+ private sdk;
12
+ constructor(config: TracingConfig);
13
+ start(): void;
14
+ private setupGracefulShutdown;
15
+ }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenTelemetryTracer = void 0;
4
+ const sdk_node_1 = require("@opentelemetry/sdk-node");
5
+ const sdk_trace_base_1 = require("@opentelemetry/sdk-trace-base");
6
+ const auto_instrumentations_node_1 = require("@opentelemetry/auto-instrumentations-node");
7
+ const exporter_trace_otlp_http_1 = require("@opentelemetry/exporter-trace-otlp-http");
8
+ const resources_1 = require("@opentelemetry/resources");
9
+ const id_generator_aws_xray_1 = require("@opentelemetry/id-generator-aws-xray");
10
+ const propagator_aws_xray_1 = require("@opentelemetry/propagator-aws-xray");
11
+ const logger_1 = require("../logger");
12
+ const DEFAULT_CONFIG = {
13
+ samplingRatio: 0.1,
14
+ maxQueueSize: 50,
15
+ scheduledDelayMillis: 1000,
16
+ };
17
+ class OpenTelemetryTracer {
18
+ constructor(config) {
19
+ const finalConfig = { ...DEFAULT_CONFIG, ...config };
20
+ const resource = resources_1.Resource.default().merge(new resources_1.Resource({
21
+ "service.name": finalConfig.serviceName,
22
+ "deployment.environment": finalConfig.environment,
23
+ }));
24
+ const traceExporter = new exporter_trace_otlp_http_1.OTLPTraceExporter({
25
+ url: finalConfig.otelEndpoint,
26
+ });
27
+ const spanProcessor = new sdk_trace_base_1.BatchSpanProcessor(traceExporter, {
28
+ maxQueueSize: finalConfig.maxQueueSize,
29
+ scheduledDelayMillis: finalConfig.scheduledDelayMillis,
30
+ });
31
+ this.sdk = new sdk_node_1.NodeSDK({
32
+ resource,
33
+ spanProcessors: [spanProcessor],
34
+ instrumentations: [
35
+ (0, auto_instrumentations_node_1.getNodeAutoInstrumentations)({
36
+ "@opentelemetry/instrumentation-express": {
37
+ enabled: true,
38
+ ...(finalConfig.ignoredPaths && {
39
+ ignoreIncomingPaths: finalConfig.ignoredPaths,
40
+ }),
41
+ },
42
+ }),
43
+ ],
44
+ textMapPropagator: new propagator_aws_xray_1.AWSXRayPropagator(),
45
+ idGenerator: new id_generator_aws_xray_1.AWSXRayIdGenerator(),
46
+ sampler: new sdk_trace_base_1.TraceIdRatioBasedSampler(finalConfig.samplingRatio),
47
+ });
48
+ }
49
+ start() {
50
+ this.sdk.start();
51
+ logger_1.logger.info("OpenTelemetry initialization completed");
52
+ this.setupGracefulShutdown();
53
+ }
54
+ setupGracefulShutdown() {
55
+ process.on("SIGTERM", () => {
56
+ this.sdk
57
+ .shutdown()
58
+ .then(() => logger_1.logger.info("Tracing terminated"))
59
+ .catch((error) => logger_1.logger.error("Error terminating tracing", { err: error }))
60
+ .finally(() => process.exit(0));
61
+ });
62
+ }
63
+ }
64
+ exports.OpenTelemetryTracer = OpenTelemetryTracer;