@omob/otel-kit 0.1.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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +398 -0
  3. package/dist/enums/exporter-type.enum.d.ts +7 -0
  4. package/dist/enums/exporter-type.enum.js +12 -0
  5. package/dist/enums/exporter-type.enum.js.map +1 -0
  6. package/dist/enums/instrumentation-name.enum.d.ts +43 -0
  7. package/dist/enums/instrumentation-name.enum.js +48 -0
  8. package/dist/enums/instrumentation-name.enum.js.map +1 -0
  9. package/dist/enums/otlp-protocol.enum.d.ts +5 -0
  10. package/dist/enums/otlp-protocol.enum.js +10 -0
  11. package/dist/enums/otlp-protocol.enum.js.map +1 -0
  12. package/dist/enums/propagator-type.enum.d.ts +7 -0
  13. package/dist/enums/propagator-type.enum.js +12 -0
  14. package/dist/enums/propagator-type.enum.js.map +1 -0
  15. package/dist/enums/telemetry-error-code.enum.d.ts +8 -0
  16. package/dist/enums/telemetry-error-code.enum.js +13 -0
  17. package/dist/enums/telemetry-error-code.enum.js.map +1 -0
  18. package/dist/enums/telemetry-signal.enum.d.ts +5 -0
  19. package/dist/enums/telemetry-signal.enum.js +10 -0
  20. package/dist/enums/telemetry-signal.enum.js.map +1 -0
  21. package/dist/errors/telemetry-config.error.d.ts +6 -0
  22. package/dist/errors/telemetry-config.error.js +12 -0
  23. package/dist/errors/telemetry-config.error.js.map +1 -0
  24. package/dist/factories/instrumentation.factory.d.ts +7 -0
  25. package/dist/factories/instrumentation.factory.js +30 -0
  26. package/dist/factories/instrumentation.factory.js.map +1 -0
  27. package/dist/factories/log-processor.factory.d.ts +6 -0
  28. package/dist/factories/log-processor.factory.js +31 -0
  29. package/dist/factories/log-processor.factory.js.map +1 -0
  30. package/dist/factories/metric-reader.factory.d.ts +7 -0
  31. package/dist/factories/metric-reader.factory.js +51 -0
  32. package/dist/factories/metric-reader.factory.js.map +1 -0
  33. package/dist/factories/otlp-exporter.factory.d.ts +6 -0
  34. package/dist/factories/otlp-exporter.factory.js +46 -0
  35. package/dist/factories/otlp-exporter.factory.js.map +1 -0
  36. package/dist/factories/propagator.factory.d.ts +7 -0
  37. package/dist/factories/propagator.factory.js +36 -0
  38. package/dist/factories/propagator.factory.js.map +1 -0
  39. package/dist/factories/resource.factory.d.ts +6 -0
  40. package/dist/factories/resource.factory.js +23 -0
  41. package/dist/factories/resource.factory.js.map +1 -0
  42. package/dist/factories/sampler.factory.d.ts +5 -0
  43. package/dist/factories/sampler.factory.js +21 -0
  44. package/dist/factories/sampler.factory.js.map +1 -0
  45. package/dist/factories/sdk.factory.d.ts +6 -0
  46. package/dist/factories/sdk.factory.js +46 -0
  47. package/dist/factories/sdk.factory.js.map +1 -0
  48. package/dist/factories/trace-exporter.factory.d.ts +7 -0
  49. package/dist/factories/trace-exporter.factory.js +36 -0
  50. package/dist/factories/trace-exporter.factory.js.map +1 -0
  51. package/dist/index.d.ts +11 -0
  52. package/dist/index.js +42 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/processors/attribute-sanitizer.processor.d.ts +8 -0
  55. package/dist/processors/attribute-sanitizer.processor.js +23 -0
  56. package/dist/processors/attribute-sanitizer.processor.js.map +1 -0
  57. package/dist/services/span.service.d.ts +6 -0
  58. package/dist/services/span.service.js +39 -0
  59. package/dist/services/span.service.js.map +1 -0
  60. package/dist/services/telemetry.service.d.ts +19 -0
  61. package/dist/services/telemetry.service.js +104 -0
  62. package/dist/services/telemetry.service.js.map +1 -0
  63. package/dist/telemetry.types.d.ts +100 -0
  64. package/dist/telemetry.types.js +3 -0
  65. package/dist/telemetry.types.js.map +1 -0
  66. package/dist/utils/gcp-credentials.d.ts +5 -0
  67. package/dist/utils/gcp-credentials.js +14 -0
  68. package/dist/utils/gcp-credentials.js.map +1 -0
  69. package/dist/utils/optional-dependency.d.ts +1 -0
  70. package/dist/utils/optional-dependency.js +19 -0
  71. package/dist/utils/optional-dependency.js.map +1 -0
  72. package/dist/utils/otlp-options.d.ts +6 -0
  73. package/dist/utils/otlp-options.js +11 -0
  74. package/dist/utils/otlp-options.js.map +1 -0
  75. package/package.json +97 -0
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTracer = getTracer;
4
+ exports.currentTraceId = currentTraceId;
5
+ exports.withSpan = withSpan;
6
+ const api_1 = require("@opentelemetry/api");
7
+ const DEFAULT_TRACER_NAME = "@omob/otel-kit";
8
+ function getTracer(name, version) {
9
+ return api_1.trace.getTracer(name, version);
10
+ }
11
+ function currentTraceId() {
12
+ return api_1.trace.getSpan(api_1.context.active())?.spanContext().traceId;
13
+ }
14
+ function withSpan(name, optionsOrHandler, maybeHandler) {
15
+ const isHandlerOnly = typeof optionsOrHandler === "function";
16
+ const handler = (isHandlerOnly ? optionsOrHandler : maybeHandler);
17
+ const { tracer, isError, ...spanOptions } = isHandlerOnly ? {} : optionsOrHandler;
18
+ return (tracer ?? api_1.trace.getTracer(DEFAULT_TRACER_NAME)).startActiveSpan(name, spanOptions, async (span) => {
19
+ try {
20
+ return await handler(span);
21
+ }
22
+ catch (error) {
23
+ recordFailure(span, error, isError);
24
+ throw error;
25
+ }
26
+ finally {
27
+ span.end();
28
+ }
29
+ });
30
+ }
31
+ function recordFailure(span, error, isError) {
32
+ if (isError && !isError(error)) {
33
+ return;
34
+ }
35
+ const message = error instanceof Error ? error.message : String(error);
36
+ span.recordException(error instanceof Error ? error : new Error(message));
37
+ span.setStatus({ code: api_1.SpanStatusCode.ERROR, message });
38
+ }
39
+ //# sourceMappingURL=span.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span.service.js","sourceRoot":"","sources":["../../src/services/span.service.ts"],"names":[],"mappings":";;AAKA,8BAEC;AAED,wCAEC;AAID,4BAmBC;AAlCD,4CAAkF;AAGlF,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAE7C,SAAgB,SAAS,CAAC,IAAY,EAAE,OAAgB;IACtD,OAAO,WAAK,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,SAAgB,cAAc;IAC5B,OAAO,WAAK,CAAC,OAAO,CAAC,aAAO,CAAC,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,OAAO,CAAC;AAChE,CAAC;AAID,SAAgB,QAAQ,CACtB,IAAY,EACZ,gBAAmD,EACnD,YAA6B;IAE7B,MAAM,aAAa,GAAG,OAAO,gBAAgB,KAAK,UAAU,CAAC;IAC7D,MAAM,OAAO,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAmB,CAAC;IACpF,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,GAAG,aAAa,CAAC,CAAC,CAAE,EAAuB,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAExG,OAAO,CAAC,MAAM,IAAI,WAAK,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAU,EAAE,EAAE;QAC9G,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACpC,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,IAAU,EAAE,KAAc,EAAE,OAAqC;IACtF,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEvE,IAAI,CAAC,eAAe,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1E,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,oBAAc,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { ITelemetryConfig } from "../telemetry.types";
2
+ declare class TelemetryService {
3
+ private sdk?;
4
+ private shutdownPromise?;
5
+ private signalHandlers;
6
+ start(config: ITelemetryConfig): void;
7
+ shutdown(timeoutMillis?: number): Promise<void>;
8
+ get isStarted(): boolean;
9
+ private startSdk;
10
+ private configureDiagnostics;
11
+ private reportStartupError;
12
+ private loadSdkFactory;
13
+ private registerShutdownHandlers;
14
+ private removeShutdownHandlers;
15
+ private resumeSignal;
16
+ private expireAfter;
17
+ }
18
+ declare const _default: TelemetryService;
19
+ export default _default;
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const api_1 = require("@opentelemetry/api");
7
+ const telemetry_error_code_enum_1 = require("../enums/telemetry-error-code.enum");
8
+ const telemetry_config_error_1 = __importDefault(require("../errors/telemetry-config.error"));
9
+ const DEFAULT_SHUTDOWN_TIMEOUT_MILLIS = 5000;
10
+ const SHUTDOWN_SIGNALS = ["SIGTERM", "SIGINT"];
11
+ class TelemetryService {
12
+ constructor() {
13
+ this.signalHandlers = new Map();
14
+ }
15
+ start(config) {
16
+ if (this.sdk || config.enabled === false) {
17
+ return;
18
+ }
19
+ try {
20
+ this.startSdk(config);
21
+ }
22
+ catch (error) {
23
+ this.reportStartupError(error, config);
24
+ }
25
+ }
26
+ async shutdown(timeoutMillis = DEFAULT_SHUTDOWN_TIMEOUT_MILLIS) {
27
+ const sdk = this.sdk;
28
+ if (!sdk) {
29
+ return this.shutdownPromise ?? Promise.resolve();
30
+ }
31
+ this.sdk = undefined;
32
+ this.removeShutdownHandlers();
33
+ this.shutdownPromise = Promise.race([sdk.shutdown(), this.expireAfter(timeoutMillis)]).catch((error) => {
34
+ this.sdk = sdk;
35
+ throw error;
36
+ });
37
+ return this.shutdownPromise;
38
+ }
39
+ get isStarted() {
40
+ return this.sdk !== undefined;
41
+ }
42
+ startSdk(config) {
43
+ if (!config.serviceName) {
44
+ throw new telemetry_config_error_1.default(telemetry_error_code_enum_1.TelemetryErrorCode.MISSING_SERVICE_NAME, "serviceName is required");
45
+ }
46
+ this.configureDiagnostics(config);
47
+ const sdk = this.loadSdkFactory().createSdk(config);
48
+ sdk.start();
49
+ this.sdk = sdk;
50
+ this.shutdownPromise = undefined;
51
+ if (config.handleShutdownSignals !== false) {
52
+ this.registerShutdownHandlers(config);
53
+ }
54
+ }
55
+ // otel writes its own failures through diag, which discards everything until a logger is installed
56
+ configureDiagnostics(config) {
57
+ if (config.diagLogLevel === undefined) {
58
+ return;
59
+ }
60
+ api_1.diag.setLogger(config.diagLogger ?? new api_1.DiagConsoleLogger(), config.diagLogLevel);
61
+ }
62
+ // telemetry must never stop a service from booting, so a bad configuration disables it instead of throwing
63
+ reportStartupError(error, config) {
64
+ if (config.onStartupError) {
65
+ config.onStartupError(error);
66
+ return;
67
+ }
68
+ console.error("@omob/otel-kit is disabled, its configuration was rejected:", error.message);
69
+ }
70
+ // the sdk drags in every exporter, so it stays out of the module graph of apps that only import the span helpers
71
+ loadSdkFactory() {
72
+ return require("../factories/sdk.factory").default;
73
+ }
74
+ registerShutdownHandlers(config) {
75
+ const timeoutMillis = config.shutdownTimeoutMillis ?? DEFAULT_SHUTDOWN_TIMEOUT_MILLIS;
76
+ for (const signal of SHUTDOWN_SIGNALS) {
77
+ const handler = () => {
78
+ this.shutdown(timeoutMillis)
79
+ .catch((error) => console.error("@omob/otel-kit failed to flush telemetry on shutdown", error))
80
+ .finally(() => this.resumeSignal(signal, config.exitOnSignal === true));
81
+ };
82
+ this.signalHandlers.set(signal, handler);
83
+ process.on(signal, handler);
84
+ }
85
+ }
86
+ removeShutdownHandlers() {
87
+ this.signalHandlers.forEach((handler, signal) => process.removeListener(signal, handler));
88
+ this.signalHandlers.clear();
89
+ }
90
+ // hand the signal back so the host's own handlers run and the process exits with the conventional code
91
+ resumeSignal(signal, exitOnSignal) {
92
+ if (exitOnSignal) {
93
+ process.exit(0);
94
+ }
95
+ if (process.listenerCount(signal) === 0) {
96
+ process.kill(process.pid, signal);
97
+ }
98
+ }
99
+ expireAfter(millis) {
100
+ return new Promise((resolve) => setTimeout(resolve, millis).unref());
101
+ }
102
+ }
103
+ exports.default = new TelemetryService();
104
+ //# sourceMappingURL=telemetry.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.service.js","sourceRoot":"","sources":["../../src/services/telemetry.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ import type { DiagLogLevel, DiagLogger, SpanOptions, Tracer } from "@opentelemetry/api";
2
+ import type { InstrumentationConfigMap } from "@opentelemetry/auto-instrumentations-node";
3
+ import type { Instrumentation } from "@opentelemetry/instrumentation";
4
+ import type { MetricReader, PushMetricExporter, ViewOptions } from "@opentelemetry/sdk-metrics";
5
+ import type { Sampler, SpanExporter, SpanProcessor } from "@opentelemetry/sdk-trace-node";
6
+ import { ExporterType } from "./enums/exporter-type.enum";
7
+ import { InstrumentationName } from "./enums/instrumentation-name.enum";
8
+ import { OtlpProtocol } from "./enums/otlp-protocol.enum";
9
+ import { PropagatorType } from "./enums/propagator-type.enum";
10
+ export type ResourceAttributeValue = string | number | boolean;
11
+ export type SpanHandler<T> = (span: import("@opentelemetry/api").Span) => Promise<T> | T;
12
+ export interface IGcpTraceModule {
13
+ TraceExporter: new (options: object) => SpanExporter;
14
+ }
15
+ export interface IGcpMonitoringModule {
16
+ MetricExporter: new (options: object) => PushMetricExporter;
17
+ }
18
+ export interface IPrometheusModule {
19
+ PrometheusExporter: new (options: object) => MetricReader;
20
+ }
21
+ export interface IOtlpOptions {
22
+ protocol?: OtlpProtocol;
23
+ url?: string;
24
+ headers?: Record<string, string>;
25
+ timeoutMillis?: number;
26
+ }
27
+ export interface IGcpOptions {
28
+ projectId?: string;
29
+ keyFile?: string;
30
+ }
31
+ export interface IPrometheusOptions {
32
+ host?: string;
33
+ port?: number;
34
+ endpoint?: string;
35
+ }
36
+ export interface IBatchOptions {
37
+ maxQueueSize?: number;
38
+ maxExportBatchSize?: number;
39
+ scheduledDelayMillis?: number;
40
+ exportTimeoutMillis?: number;
41
+ }
42
+ export interface ISpanLimits {
43
+ attributeValueLengthLimit?: number;
44
+ attributeCountLimit?: number;
45
+ eventCountLimit?: number;
46
+ linkCountLimit?: number;
47
+ }
48
+ export interface ITraceConfig {
49
+ exporter: ExporterType;
50
+ sampleRatio?: number;
51
+ sampler?: Sampler;
52
+ additionalProcessors?: SpanProcessor[];
53
+ sanitizeAttributes?: boolean;
54
+ batch?: IBatchOptions;
55
+ otlp?: IOtlpOptions;
56
+ gcp?: IGcpOptions;
57
+ }
58
+ export interface IMetricConfig {
59
+ exporter: ExporterType;
60
+ exportIntervalMillis?: number;
61
+ views?: ViewOptions[];
62
+ otlp?: IOtlpOptions;
63
+ gcp?: IGcpOptions;
64
+ prometheus?: IPrometheusOptions;
65
+ }
66
+ export interface ILogConfig {
67
+ exporter: ExporterType;
68
+ otlp?: IOtlpOptions;
69
+ }
70
+ export interface IInstrumentationConfig {
71
+ disable?: InstrumentationName[];
72
+ enable?: InstrumentationName[];
73
+ ignoreIncomingPaths?: string[];
74
+ additional?: Instrumentation[];
75
+ config?: InstrumentationConfigMap;
76
+ }
77
+ export interface ITelemetryConfig {
78
+ serviceName: string;
79
+ serviceVersion?: string;
80
+ environment?: string;
81
+ enabled?: boolean;
82
+ resourceAttributes?: Record<string, ResourceAttributeValue>;
83
+ resourceDetection?: boolean;
84
+ spanLimits?: ISpanLimits;
85
+ traces?: ITraceConfig;
86
+ metrics?: IMetricConfig;
87
+ logs?: ILogConfig;
88
+ instrumentation?: IInstrumentationConfig;
89
+ propagators?: PropagatorType[];
90
+ diagLogLevel?: DiagLogLevel;
91
+ diagLogger?: DiagLogger;
92
+ handleShutdownSignals?: boolean;
93
+ exitOnSignal?: boolean;
94
+ shutdownTimeoutMillis?: number;
95
+ onStartupError?: (error: Error) => void;
96
+ }
97
+ export interface IWithSpanOptions extends SpanOptions {
98
+ tracer?: Tracer;
99
+ isError?: (error: unknown) => boolean;
100
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=telemetry.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.types.js","sourceRoot":"","sources":["../src/telemetry.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import { IGcpOptions } from "../telemetry.types";
2
+ export declare function toGcpExporterOptions(options?: IGcpOptions): {
3
+ keyFile?: string | undefined;
4
+ projectId?: string | undefined;
5
+ };
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toGcpExporterOptions = toGcpExporterOptions;
4
+ const fs_1 = require("fs");
5
+ function toGcpExporterOptions(options = {}) {
6
+ const keyFile = options.keyFile ?? process.env.GOOGLE_APPLICATION_CREDENTIALS;
7
+ const projectId = options.projectId ?? process.env.GCP_PROJECT_ID;
8
+ // an unreadable keyFile must be omitted entirely so the exporter falls back to application default credentials
9
+ return {
10
+ ...(projectId ? { projectId } : {}),
11
+ ...(keyFile && (0, fs_1.existsSync)(keyFile) ? { keyFile } : {}),
12
+ };
13
+ }
14
+ //# sourceMappingURL=gcp-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcp-credentials.js","sourceRoot":"","sources":["../../src/utils/gcp-credentials.ts"],"names":[],"mappings":";;AAGA,oDASC;AAZD,2BAAgC;AAGhC,SAAgB,oBAAoB,CAAC,UAAuB,EAAE;IAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC;IAC9E,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAElE,+GAA+G;IAC/G,OAAO;QACL,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,GAAG,CAAC,OAAO,IAAI,IAAA,eAAU,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvD,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function loadOptionalDependency<T>(moduleName: string): T;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loadOptionalDependency = loadOptionalDependency;
7
+ const telemetry_config_error_1 = __importDefault(require("../errors/telemetry-config.error"));
8
+ const telemetry_error_code_enum_1 = require("../enums/telemetry-error-code.enum");
9
+ function loadOptionalDependency(moduleName) {
10
+ try {
11
+ require.resolve(moduleName);
12
+ }
13
+ catch {
14
+ throw new telemetry_config_error_1.default(telemetry_error_code_enum_1.TelemetryErrorCode.MISSING_OPTIONAL_DEPENDENCY, `${moduleName} is not installed. Add it to the host project to use this exporter.`);
15
+ }
16
+ // resolving separately keeps a genuine load failure inside the module from being reported as a missing install
17
+ return require(moduleName);
18
+ }
19
+ //# sourceMappingURL=optional-dependency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optional-dependency.js","sourceRoot":"","sources":["../../src/utils/optional-dependency.ts"],"names":[],"mappings":";;;;;AAGA,wDAYC;AAfD,8FAAoE;AACpE,kFAAwE;AAExE,SAAgB,sBAAsB,CAAI,UAAkB;IAC1D,IAAI,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,gCAAoB,CAC5B,8CAAkB,CAAC,2BAA2B,EAC9C,GAAG,UAAU,qEAAqE,CACnF,CAAC;IACJ,CAAC;IAED,+GAA+G;IAC/G,OAAO,OAAO,CAAC,UAAU,CAAM,CAAC;AAClC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { IOtlpOptions } from "../telemetry.types";
2
+ export declare function toOtlpExporterOptions(options?: IOtlpOptions): {
3
+ timeoutMillis?: number | undefined;
4
+ headers?: Record<string, string> | undefined;
5
+ url?: string | undefined;
6
+ };
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toOtlpExporterOptions = toOtlpExporterOptions;
4
+ function toOtlpExporterOptions(options = {}) {
5
+ return {
6
+ ...(options.url ? { url: options.url } : {}),
7
+ ...(options.headers ? { headers: options.headers } : {}),
8
+ ...(options.timeoutMillis !== undefined ? { timeoutMillis: options.timeoutMillis } : {}),
9
+ };
10
+ }
11
+ //# sourceMappingURL=otlp-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp-options.js","sourceRoot":"","sources":["../../src/utils/otlp-options.ts"],"names":[],"mappings":";;AAEA,sDAMC;AAND,SAAgB,qBAAqB,CAAC,UAAwB,EAAE;IAC9D,OAAO;QACL,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzF,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,97 @@
1
+ {
2
+ "name": "@omob/otel-kit",
3
+ "version": "0.1.0",
4
+ "description": "Configurable OpenTelemetry bootstrap for Node services: traces, metrics and logs with pluggable exporters",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ },
12
+ "./package.json": "./package.json"
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "typecheck": "tsc --noEmit",
20
+ "prepare": "npm run build",
21
+ "prepublishOnly": "npm run build",
22
+ "lint": "eslint src test",
23
+ "lint:fix": "eslint src test --fix",
24
+ "test": "jest --runInBand",
25
+ "verify:consumers": "node scripts/verify-consumers.mjs"
26
+ },
27
+ "keywords": [
28
+ "opentelemetry",
29
+ "tracing",
30
+ "observability",
31
+ "metrics",
32
+ "logs"
33
+ ],
34
+ "license": "MIT",
35
+ "author": "Ayodeji Abodunrin",
36
+ "homepage": "https://github.com/omob/otel-kit#readme",
37
+ "bugs": {
38
+ "url": "https://github.com/omob/otel-kit/issues"
39
+ },
40
+ "publishConfig": {
41
+ "access": "public"
42
+ },
43
+ "engines": {
44
+ "node": "^18.19.0 || >=20.6.0"
45
+ },
46
+ "dependencies": {
47
+ "@opentelemetry/auto-instrumentations-node": "^0.67.0",
48
+ "@opentelemetry/core": "2.11.0",
49
+ "@opentelemetry/exporter-logs-otlp-grpc": "0.222.0",
50
+ "@opentelemetry/exporter-logs-otlp-http": "0.222.0",
51
+ "@opentelemetry/exporter-logs-otlp-proto": "0.222.0",
52
+ "@opentelemetry/exporter-metrics-otlp-grpc": "0.222.0",
53
+ "@opentelemetry/exporter-metrics-otlp-http": "0.222.0",
54
+ "@opentelemetry/exporter-metrics-otlp-proto": "0.222.0",
55
+ "@opentelemetry/exporter-prometheus": "0.222.0",
56
+ "@opentelemetry/exporter-trace-otlp-grpc": "0.222.0",
57
+ "@opentelemetry/exporter-trace-otlp-http": "0.222.0",
58
+ "@opentelemetry/exporter-trace-otlp-proto": "0.222.0",
59
+ "@opentelemetry/instrumentation": "0.222.0",
60
+ "@opentelemetry/propagator-b3": "2.11.0",
61
+ "@opentelemetry/propagator-jaeger": "2.11.0",
62
+ "@opentelemetry/resources": "2.11.0",
63
+ "@opentelemetry/sdk-logs": "0.222.0",
64
+ "@opentelemetry/sdk-metrics": "2.11.0",
65
+ "@opentelemetry/sdk-node": "0.222.0",
66
+ "@opentelemetry/sdk-trace-node": "2.11.0",
67
+ "@opentelemetry/semantic-conventions": "^1.36.0"
68
+ },
69
+ "peerDependencies": {
70
+ "@google-cloud/opentelemetry-cloud-monitoring-exporter": ">=0.20.0",
71
+ "@google-cloud/opentelemetry-cloud-trace-exporter": ">=2.4.0",
72
+ "@opentelemetry/api": "^1.9.0"
73
+ },
74
+ "peerDependenciesMeta": {
75
+ "@google-cloud/opentelemetry-cloud-monitoring-exporter": {
76
+ "optional": true
77
+ },
78
+ "@google-cloud/opentelemetry-cloud-trace-exporter": {
79
+ "optional": true
80
+ }
81
+ },
82
+ "devDependencies": {
83
+ "@opentelemetry/api": "^1.9.0",
84
+ "@opentelemetry/sdk-trace-base": "^2.11.0",
85
+ "@types/jest": "^29.5.14",
86
+ "@types/node": "^20.14.0",
87
+ "eslint": "^9.39.5",
88
+ "jest": "^29.7.0",
89
+ "ts-jest": "^29.4.12",
90
+ "typescript": "^5.5.4",
91
+ "typescript-eslint": "^8.69.0"
92
+ },
93
+ "repository": {
94
+ "type": "git",
95
+ "url": "git+https://github.com/omob/otel-kit.git"
96
+ }
97
+ }