@sebspark/otel 0.4.2 → 0.5.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/dist/index.d.mts CHANGED
@@ -1,8 +1,9 @@
1
+ import { LoggerProvider } from '@opentelemetry/api-logs';
1
2
  import * as _opentelemetry_api from '@opentelemetry/api';
2
3
  import { trace, SpanOptions } from '@opentelemetry/api';
3
4
 
4
5
  type Attrs = Record<string, any>;
5
- declare function getLogger(serviceOverride?: string, extraAttrs?: Attrs): {
6
+ declare function getLogger(serviceOverride?: string, extraAttrs?: Attrs, testProvider?: LoggerProvider): {
6
7
  debug: (msg: string, attrs?: Attrs) => void;
7
8
  info: (msg: string, attrs?: Attrs) => void;
8
9
  notice: (msg: string, attrs?: Attrs) => void;
@@ -15,6 +16,8 @@ declare function getLogger(serviceOverride?: string, extraAttrs?: Attrs): {
15
16
 
16
17
  declare function getMeter(componentNameOverride?: string): Promise<_opentelemetry_api.Meter>;
17
18
 
19
+ declare function initialize(): Promise<void>;
20
+
18
21
  type OtelTracer = ReturnType<typeof trace.getTracer>;
19
22
  type Span = ReturnType<OtelTracer['startSpan']>;
20
23
  type Func<T> = (span: Span) => Promise<T> | T;
@@ -47,4 +50,4 @@ interface Tracer extends OtelTracer {
47
50
  */
48
51
  declare function getTracer(componentNameOverride?: string): Promise<Tracer>;
49
52
 
50
- export { getLogger, getMeter, getTracer };
53
+ export { getLogger, getMeter, getTracer, initialize };
package/dist/index.d.ts CHANGED
@@ -1,8 +1,9 @@
1
+ import { LoggerProvider } from '@opentelemetry/api-logs';
1
2
  import * as _opentelemetry_api from '@opentelemetry/api';
2
3
  import { trace, SpanOptions } from '@opentelemetry/api';
3
4
 
4
5
  type Attrs = Record<string, any>;
5
- declare function getLogger(serviceOverride?: string, extraAttrs?: Attrs): {
6
+ declare function getLogger(serviceOverride?: string, extraAttrs?: Attrs, testProvider?: LoggerProvider): {
6
7
  debug: (msg: string, attrs?: Attrs) => void;
7
8
  info: (msg: string, attrs?: Attrs) => void;
8
9
  notice: (msg: string, attrs?: Attrs) => void;
@@ -15,6 +16,8 @@ declare function getLogger(serviceOverride?: string, extraAttrs?: Attrs): {
15
16
 
16
17
  declare function getMeter(componentNameOverride?: string): Promise<_opentelemetry_api.Meter>;
17
18
 
19
+ declare function initialize(): Promise<void>;
20
+
18
21
  type OtelTracer = ReturnType<typeof trace.getTracer>;
19
22
  type Span = ReturnType<OtelTracer['startSpan']>;
20
23
  type Func<T> = (span: Span) => Promise<T> | T;
@@ -47,4 +50,4 @@ interface Tracer extends OtelTracer {
47
50
  */
48
51
  declare function getTracer(componentNameOverride?: string): Promise<Tracer>;
49
52
 
50
- export { getLogger, getMeter, getTracer };
53
+ export { getLogger, getMeter, getTracer, initialize };
package/dist/index.js CHANGED
@@ -32,10 +32,30 @@ var index_exports = {};
32
32
  __export(index_exports, {
33
33
  getLogger: () => getLogger,
34
34
  getMeter: () => getMeter,
35
- getTracer: () => getTracer
35
+ getTracer: () => getTracer,
36
+ initialize: () => initialize
36
37
  });
37
38
  module.exports = __toCommonJS(index_exports);
38
39
 
40
+ // src/logger.ts
41
+ var import_api4 = require("@opentelemetry/api");
42
+ var import_api_logs2 = require("@opentelemetry/api-logs");
43
+
44
+ // src/consts.ts
45
+ var LOG_SEVERITY_MAP = {
46
+ TRACE: 1,
47
+ DEBUG: 5,
48
+ INFO: 9,
49
+ NOTICE: 10,
50
+ WARNING: 13,
51
+ WARN: 13,
52
+ ERROR: 17,
53
+ FATAL: 21,
54
+ CRITICAL: 21,
55
+ ALERT: 22,
56
+ EMERGENCY: 23
57
+ };
58
+
39
59
  // src/otel.ts
40
60
  var import_api3 = require("@opentelemetry/api");
41
61
  var import_api_logs = require("@opentelemetry/api-logs");
@@ -53,21 +73,6 @@ var import_sdk_trace_node = require("@opentelemetry/sdk-trace-node");
53
73
  // src/loggers/console-log-pretty-exporter.ts
54
74
  var import_core = require("@opentelemetry/core");
55
75
 
56
- // src/consts.ts
57
- var LOG_SEVERITY_MAP = {
58
- TRACE: 1,
59
- DEBUG: 5,
60
- INFO: 9,
61
- NOTICE: 10,
62
- WARNING: 13,
63
- WARN: 13,
64
- ERROR: 17,
65
- FATAL: 21,
66
- CRITICAL: 21,
67
- ALERT: 22,
68
- EMERGENCY: 23
69
- };
70
-
71
76
  // src/loggers/formatters/shared.ts
72
77
  var import_semantic_conventions = require("@opentelemetry/semantic-conventions");
73
78
  var import_fast_safe_stringify = __toESM(require("fast-safe-stringify"));
@@ -637,21 +642,29 @@ var getResource = async () => {
637
642
  };
638
643
 
639
644
  // src/otel.ts
640
- import_api3.diag.setLogger(new import_api3.DiagConsoleLogger(), import_api3.DiagLogLevel.ERROR);
641
645
  var initialization;
642
646
  async function initialize() {
643
647
  if (!initialization) {
644
- initialization = _initialize();
648
+ import_api3.diag.setLogger(new import_api3.DiagConsoleLogger(), import_api3.DiagLogLevel.ERROR);
649
+ initialization = initializeOtel();
645
650
  }
646
651
  return initialization;
647
652
  }
648
- async function _initialize() {
653
+ function isInitialized() {
654
+ return initialization !== void 0;
655
+ }
656
+ async function initializeOtel() {
649
657
  try {
650
658
  const serviceName = process.env.OTEL_SERVICE_NAME ?? "unknown-service";
651
659
  const otlpEndpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT;
660
+ const isTestMode = process.env.NODE_ENV === "test" || process.env.VITEST === "true";
652
661
  const resource = await getResource();
653
- const logProvider = getLogProvider(resource, otlpEndpoint);
654
- import_api_logs.logs.setGlobalLoggerProvider(logProvider);
662
+ let logProvider;
663
+ const shouldSetupLogProvider = !isTestMode || !!process.env.LOG_LEVEL;
664
+ if (shouldSetupLogProvider) {
665
+ logProvider = getLogProvider(resource, otlpEndpoint);
666
+ import_api_logs.logs.setGlobalLoggerProvider(logProvider);
667
+ }
655
668
  const spanProcessor = getSpanProcessor(otlpEndpoint);
656
669
  const metricReader = getMetricReader(otlpEndpoint);
657
670
  const sdk = new import_sdk_node.NodeSDK({
@@ -664,34 +677,37 @@ async function _initialize() {
664
677
  console.log(`[otel] Telemetry initialized for "${serviceName}"`);
665
678
  process.on("SIGTERM", async () => {
666
679
  console.log("[otel] Shutting down...");
667
- await Promise.all([sdk.shutdown(), logProvider.shutdown()]);
680
+ const shutdownPromises = [sdk.shutdown()];
681
+ if (logProvider) {
682
+ shutdownPromises.push(logProvider.shutdown());
683
+ }
684
+ await Promise.all(shutdownPromises);
668
685
  console.log("[otel] Shutdown complete.");
669
686
  process.exit(0);
670
687
  });
671
688
  } catch (err) {
672
- console.error("[otel] Startup error:", err);
689
+ if (err instanceof Error && err.message.includes("duplicate registration")) {
690
+ console.warn("[otel] Warning - API already registered, continuing...");
691
+ } else {
692
+ console.error("[otel] Startup error:", err);
693
+ }
673
694
  }
674
695
  }
675
696
 
676
697
  // src/logger.ts
677
- var import_api4 = require("@opentelemetry/api");
678
- var import_api_logs2 = require("@opentelemetry/api-logs");
679
- function getLogger(serviceOverride, extraAttrs = {}) {
698
+ function getLogger(serviceOverride, extraAttrs = {}, testProvider) {
699
+ if (!isInitialized()) {
700
+ throw new Error(
701
+ "OpenTelemetry is not initialized. Please call initialize() before getting a logger."
702
+ );
703
+ }
680
704
  const { systemName, systemVersion, resourceAttributes } = detectTelemetryContext(serviceOverride);
681
705
  const defaultAttrs = {
682
706
  ...resourceAttributes,
683
707
  ...extraAttrs
684
708
  };
685
- let isInitialized = false;
686
709
  function emit(severityText, body, attrs = {}) {
687
- if (!isInitialized) {
688
- initialize().then(() => {
689
- isInitialized = true;
690
- emit(severityText, body, attrs);
691
- });
692
- return;
693
- }
694
- const logger = import_api_logs2.logs.getLogger(systemName, systemVersion);
710
+ const logger = testProvider ? testProvider.getLogger(systemName, systemVersion) : import_api_logs2.logs.getLogger(systemName, systemVersion);
695
711
  const span = import_api4.trace.getSpan(import_api4.context.active());
696
712
  const spanContext = span?.spanContext();
697
713
  logger.emit({
@@ -826,12 +842,10 @@ function extractArgs(spanOptionsSpanOrFunc, spanOrFunc, func) {
826
842
  var isFunction = (value) => typeof value === "function";
827
843
  var isSpan = (value) => value !== null && value !== void 0 && isFunction(value.spanContext) && isFunction(value.end);
828
844
  var isSpanOptions = (value) => value !== null && value !== void 0 && (!!value.startTime || !!value.attributes || !!value.kind) && !isSpan(value);
829
-
830
- // src/index.ts
831
- initialize();
832
845
  // Annotate the CommonJS export names for ESM import in node:
833
846
  0 && (module.exports = {
834
847
  getLogger,
835
848
  getMeter,
836
- getTracer
849
+ getTracer,
850
+ initialize
837
851
  });
package/dist/index.mjs CHANGED
@@ -1,3 +1,22 @@
1
+ // src/logger.ts
2
+ import { context, trace } from "@opentelemetry/api";
3
+ import { logs as logs2 } from "@opentelemetry/api-logs";
4
+
5
+ // src/consts.ts
6
+ var LOG_SEVERITY_MAP = {
7
+ TRACE: 1,
8
+ DEBUG: 5,
9
+ INFO: 9,
10
+ NOTICE: 10,
11
+ WARNING: 13,
12
+ WARN: 13,
13
+ ERROR: 17,
14
+ FATAL: 21,
15
+ CRITICAL: 21,
16
+ ALERT: 22,
17
+ EMERGENCY: 23
18
+ };
19
+
1
20
  // src/otel.ts
2
21
  import { DiagConsoleLogger, DiagLogLevel, diag } from "@opentelemetry/api";
3
22
  import { logs } from "@opentelemetry/api-logs";
@@ -21,21 +40,6 @@ import {
21
40
  // src/loggers/console-log-pretty-exporter.ts
22
41
  import { ExportResultCode } from "@opentelemetry/core";
23
42
 
24
- // src/consts.ts
25
- var LOG_SEVERITY_MAP = {
26
- TRACE: 1,
27
- DEBUG: 5,
28
- INFO: 9,
29
- NOTICE: 10,
30
- WARNING: 13,
31
- WARN: 13,
32
- ERROR: 17,
33
- FATAL: 21,
34
- CRITICAL: 21,
35
- ALERT: 22,
36
- EMERGENCY: 23
37
- };
38
-
39
43
  // src/loggers/formatters/shared.ts
40
44
  import {
41
45
  ATTR_SERVICE_NAME,
@@ -614,21 +618,29 @@ var getResource = async () => {
614
618
  };
615
619
 
616
620
  // src/otel.ts
617
- diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.ERROR);
618
621
  var initialization;
619
622
  async function initialize() {
620
623
  if (!initialization) {
621
- initialization = _initialize();
624
+ diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.ERROR);
625
+ initialization = initializeOtel();
622
626
  }
623
627
  return initialization;
624
628
  }
625
- async function _initialize() {
629
+ function isInitialized() {
630
+ return initialization !== void 0;
631
+ }
632
+ async function initializeOtel() {
626
633
  try {
627
634
  const serviceName = process.env.OTEL_SERVICE_NAME ?? "unknown-service";
628
635
  const otlpEndpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT;
636
+ const isTestMode = process.env.NODE_ENV === "test" || process.env.VITEST === "true";
629
637
  const resource = await getResource();
630
- const logProvider = getLogProvider(resource, otlpEndpoint);
631
- logs.setGlobalLoggerProvider(logProvider);
638
+ let logProvider;
639
+ const shouldSetupLogProvider = !isTestMode || !!process.env.LOG_LEVEL;
640
+ if (shouldSetupLogProvider) {
641
+ logProvider = getLogProvider(resource, otlpEndpoint);
642
+ logs.setGlobalLoggerProvider(logProvider);
643
+ }
632
644
  const spanProcessor = getSpanProcessor(otlpEndpoint);
633
645
  const metricReader = getMetricReader(otlpEndpoint);
634
646
  const sdk = new NodeSDK({
@@ -641,34 +653,37 @@ async function _initialize() {
641
653
  console.log(`[otel] Telemetry initialized for "${serviceName}"`);
642
654
  process.on("SIGTERM", async () => {
643
655
  console.log("[otel] Shutting down...");
644
- await Promise.all([sdk.shutdown(), logProvider.shutdown()]);
656
+ const shutdownPromises = [sdk.shutdown()];
657
+ if (logProvider) {
658
+ shutdownPromises.push(logProvider.shutdown());
659
+ }
660
+ await Promise.all(shutdownPromises);
645
661
  console.log("[otel] Shutdown complete.");
646
662
  process.exit(0);
647
663
  });
648
664
  } catch (err) {
649
- console.error("[otel] Startup error:", err);
665
+ if (err instanceof Error && err.message.includes("duplicate registration")) {
666
+ console.warn("[otel] Warning - API already registered, continuing...");
667
+ } else {
668
+ console.error("[otel] Startup error:", err);
669
+ }
650
670
  }
651
671
  }
652
672
 
653
673
  // src/logger.ts
654
- import { context, trace } from "@opentelemetry/api";
655
- import { logs as logs2 } from "@opentelemetry/api-logs";
656
- function getLogger(serviceOverride, extraAttrs = {}) {
674
+ function getLogger(serviceOverride, extraAttrs = {}, testProvider) {
675
+ if (!isInitialized()) {
676
+ throw new Error(
677
+ "OpenTelemetry is not initialized. Please call initialize() before getting a logger."
678
+ );
679
+ }
657
680
  const { systemName, systemVersion, resourceAttributes } = detectTelemetryContext(serviceOverride);
658
681
  const defaultAttrs = {
659
682
  ...resourceAttributes,
660
683
  ...extraAttrs
661
684
  };
662
- let isInitialized = false;
663
685
  function emit(severityText, body, attrs = {}) {
664
- if (!isInitialized) {
665
- initialize().then(() => {
666
- isInitialized = true;
667
- emit(severityText, body, attrs);
668
- });
669
- return;
670
- }
671
- const logger = logs2.getLogger(systemName, systemVersion);
686
+ const logger = testProvider ? testProvider.getLogger(systemName, systemVersion) : logs2.getLogger(systemName, systemVersion);
672
687
  const span = trace.getSpan(context.active());
673
688
  const spanContext = span?.spanContext();
674
689
  logger.emit({
@@ -807,11 +822,9 @@ function extractArgs(spanOptionsSpanOrFunc, spanOrFunc, func) {
807
822
  var isFunction = (value) => typeof value === "function";
808
823
  var isSpan = (value) => value !== null && value !== void 0 && isFunction(value.spanContext) && isFunction(value.end);
809
824
  var isSpanOptions = (value) => value !== null && value !== void 0 && (!!value.startTime || !!value.attributes || !!value.kind) && !isSpan(value);
810
-
811
- // src/index.ts
812
- initialize();
813
825
  export {
814
826
  getLogger,
815
827
  getMeter,
816
- getTracer
828
+ getTracer,
829
+ initialize
817
830
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sebspark/otel",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",