@sebspark/otel 0.2.2 → 0.2.4

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 CHANGED
@@ -61,7 +61,7 @@ Logs inside active spans automatically include:
61
61
  ```ts
62
62
  import { getTracer } from '@sebspark/otel'
63
63
 
64
- const tracer = getTracer()
64
+ const tracer = getTracer() // async to ensure otel initialization
65
65
 
66
66
  await tracer.withTrace('trace.name', async (span) => {
67
67
  span.setAttribute('user.id', '123')
@@ -111,7 +111,7 @@ span.end()
111
111
  ```ts
112
112
  import { getMeter } from '@sebspark/otel'
113
113
 
114
- const meter = getMeter()
114
+ const meter = getMeter() // async to ensure otel initialization
115
115
 
116
116
  const counter = meter.createCounter('http_requests_total', {
117
117
  description: 'Total number of HTTP requests',
package/dist/index.d.mts CHANGED
@@ -13,7 +13,7 @@ declare function getLogger(serviceOverride?: string, extraAttrs?: Attrs): {
13
13
  emergency: (msg: string, attrs?: Attrs) => void;
14
14
  };
15
15
 
16
- declare function getMeter(componentNameOverride?: string): _opentelemetry_api.Meter;
16
+ declare function getMeter(componentNameOverride?: string): Promise<_opentelemetry_api.Meter>;
17
17
 
18
18
  type OtelTracer = ReturnType<typeof trace.getTracer>;
19
19
  type Span = ReturnType<OtelTracer['startSpan']>;
@@ -45,6 +45,6 @@ interface Tracer extends OtelTracer {
45
45
  * @param serviceOverride - Optional override for service name
46
46
  * @returns Tracer with helpers
47
47
  */
48
- declare function getTracer(componentNameOverride?: string): Tracer;
48
+ declare function getTracer(componentNameOverride?: string): Promise<Tracer>;
49
49
 
50
50
  export { getLogger, getMeter, getTracer };
package/dist/index.d.ts CHANGED
@@ -13,7 +13,7 @@ declare function getLogger(serviceOverride?: string, extraAttrs?: Attrs): {
13
13
  emergency: (msg: string, attrs?: Attrs) => void;
14
14
  };
15
15
 
16
- declare function getMeter(componentNameOverride?: string): _opentelemetry_api.Meter;
16
+ declare function getMeter(componentNameOverride?: string): Promise<_opentelemetry_api.Meter>;
17
17
 
18
18
  type OtelTracer = ReturnType<typeof trace.getTracer>;
19
19
  type Span = ReturnType<OtelTracer['startSpan']>;
@@ -45,6 +45,6 @@ interface Tracer extends OtelTracer {
45
45
  * @param serviceOverride - Optional override for service name
46
46
  * @returns Tracer with helpers
47
47
  */
48
- declare function getTracer(componentNameOverride?: string): Tracer;
48
+ declare function getTracer(componentNameOverride?: string): Promise<Tracer>;
49
49
 
50
50
  export { getLogger, getMeter, getTracer };
package/dist/index.js CHANGED
@@ -614,17 +614,22 @@ var getResource = async () => {
614
614
  const { resourceAttributes } = detectTelemetryContext();
615
615
  const customRes = (0, import_resources.resourceFromAttributes)(resourceAttributes);
616
616
  const resource = baseRes.merge(customRes);
617
+ if (resource.waitForAsyncAttributes) {
618
+ await resource.waitForAsyncAttributes();
619
+ }
617
620
  return resource;
618
621
  };
619
622
 
620
623
  // src/otel.ts
621
624
  import_api3.diag.setLogger(new import_api3.DiagConsoleLogger(), import_api3.DiagLogLevel.ERROR);
622
- var isInitialized = false;
625
+ var initialization;
623
626
  async function initialize() {
624
- if (isInitialized) {
625
- return;
627
+ if (!initialization) {
628
+ initialization = _initialize();
626
629
  }
627
- isInitialized = true;
630
+ return initialization;
631
+ }
632
+ async function _initialize() {
628
633
  try {
629
634
  const serviceName = process.env.OTEL_SERVICE_NAME ?? "unknown-service";
630
635
  const otlpEndpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT;
@@ -657,12 +662,20 @@ var import_api4 = require("@opentelemetry/api");
657
662
  var import_api_logs2 = require("@opentelemetry/api-logs");
658
663
  function getLogger(serviceOverride, extraAttrs = {}) {
659
664
  const { systemName, systemVersion, resourceAttributes } = detectTelemetryContext(serviceOverride);
660
- const logger = import_api_logs2.logs.getLogger(systemName, systemVersion);
661
665
  const defaultAttrs = {
662
666
  ...resourceAttributes,
663
667
  ...extraAttrs
664
668
  };
669
+ let isInitialized = false;
665
670
  function emit(severityText, body, attrs = {}) {
671
+ if (!isInitialized) {
672
+ initialize().then(() => {
673
+ isInitialized = true;
674
+ emit(severityText, body, attrs);
675
+ });
676
+ return;
677
+ }
678
+ const logger = import_api_logs2.logs.getLogger(systemName, systemVersion);
666
679
  const span = import_api4.trace.getSpan(import_api4.context.active());
667
680
  const spanContext = span?.spanContext();
668
681
  logger.emit({
@@ -696,7 +709,8 @@ function getLogger(serviceOverride, extraAttrs = {}) {
696
709
 
697
710
  // src/metrics.ts
698
711
  var import_api5 = require("@opentelemetry/api");
699
- function getMeter(componentNameOverride) {
712
+ async function getMeter(componentNameOverride) {
713
+ await initialize();
700
714
  const { componentName, systemName, systemVersion } = detectTelemetryContext(
701
715
  componentNameOverride
702
716
  );
@@ -705,7 +719,8 @@ function getMeter(componentNameOverride) {
705
719
 
706
720
  // src/tracer.ts
707
721
  var import_api6 = require("@opentelemetry/api");
708
- function getTracer(componentNameOverride) {
722
+ async function getTracer(componentNameOverride) {
723
+ await initialize();
709
724
  const { componentName, systemName, systemVersion } = detectTelemetryContext(
710
725
  componentNameOverride
711
726
  );
@@ -767,11 +782,11 @@ function extractArgs(spanOptionsSpanOrFunc, spanOrFunc, func) {
767
782
  let options = {};
768
783
  let parent;
769
784
  let fn;
770
- if (typeof spanOptionsSpanOrFunc === "function") {
785
+ if (isFunction(spanOptionsSpanOrFunc)) {
771
786
  fn = spanOptionsSpanOrFunc;
772
- } else if (typeof spanOrFunc === "function") {
787
+ } else if (isFunction(spanOrFunc)) {
773
788
  const spanOrSpanOptions = spanOptionsSpanOrFunc;
774
- if ("startTime" in spanOrSpanOptions || "attributes" in spanOrSpanOptions || "kind" in spanOrSpanOptions) {
789
+ if (isSpanOptions(spanOrSpanOptions)) {
775
790
  options = spanOrSpanOptions;
776
791
  } else {
777
792
  parent = spanOrSpanOptions;
@@ -784,6 +799,9 @@ function extractArgs(spanOptionsSpanOrFunc, spanOrFunc, func) {
784
799
  }
785
800
  return { options, parent, fn };
786
801
  }
802
+ var isFunction = (value) => typeof value === "function";
803
+ var isSpan = (value) => value !== null && value !== void 0 && isFunction(value.spanContext) && isFunction(value.end);
804
+ var isSpanOptions = (value) => value !== null && value !== void 0 && (!!value.startTime || !!value.attributes || !!value.kind) && !isSpan(value);
787
805
 
788
806
  // src/index.ts
789
807
  initialize();
package/dist/index.mjs CHANGED
@@ -1,9 +1,5 @@
1
1
  // src/otel.ts
2
- import {
3
- DiagConsoleLogger,
4
- DiagLogLevel,
5
- diag
6
- } from "@opentelemetry/api";
2
+ import { DiagConsoleLogger, DiagLogLevel, diag } from "@opentelemetry/api";
7
3
  import { logs } from "@opentelemetry/api-logs";
8
4
  import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node";
9
5
  import { NodeSDK } from "@opentelemetry/sdk-node";
@@ -595,17 +591,22 @@ var getResource = async () => {
595
591
  const { resourceAttributes } = detectTelemetryContext();
596
592
  const customRes = resourceFromAttributes(resourceAttributes);
597
593
  const resource = baseRes.merge(customRes);
594
+ if (resource.waitForAsyncAttributes) {
595
+ await resource.waitForAsyncAttributes();
596
+ }
598
597
  return resource;
599
598
  };
600
599
 
601
600
  // src/otel.ts
602
601
  diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.ERROR);
603
- var isInitialized = false;
602
+ var initialization;
604
603
  async function initialize() {
605
- if (isInitialized) {
606
- return;
604
+ if (!initialization) {
605
+ initialization = _initialize();
607
606
  }
608
- isInitialized = true;
607
+ return initialization;
608
+ }
609
+ async function _initialize() {
609
610
  try {
610
611
  const serviceName = process.env.OTEL_SERVICE_NAME ?? "unknown-service";
611
612
  const otlpEndpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT;
@@ -634,17 +635,25 @@ async function initialize() {
634
635
  }
635
636
 
636
637
  // src/logger.ts
637
- import { context as context2, trace } from "@opentelemetry/api";
638
+ import { context, trace } from "@opentelemetry/api";
638
639
  import { logs as logs2 } from "@opentelemetry/api-logs";
639
640
  function getLogger(serviceOverride, extraAttrs = {}) {
640
641
  const { systemName, systemVersion, resourceAttributes } = detectTelemetryContext(serviceOverride);
641
- const logger = logs2.getLogger(systemName, systemVersion);
642
642
  const defaultAttrs = {
643
643
  ...resourceAttributes,
644
644
  ...extraAttrs
645
645
  };
646
+ let isInitialized = false;
646
647
  function emit(severityText, body, attrs = {}) {
647
- const span = trace.getSpan(context2.active());
648
+ if (!isInitialized) {
649
+ initialize().then(() => {
650
+ isInitialized = true;
651
+ emit(severityText, body, attrs);
652
+ });
653
+ return;
654
+ }
655
+ const logger = logs2.getLogger(systemName, systemVersion);
656
+ const span = trace.getSpan(context.active());
648
657
  const spanContext = span?.spanContext();
649
658
  logger.emit({
650
659
  severityText,
@@ -677,7 +686,8 @@ function getLogger(serviceOverride, extraAttrs = {}) {
677
686
 
678
687
  // src/metrics.ts
679
688
  import { metrics } from "@opentelemetry/api";
680
- function getMeter(componentNameOverride) {
689
+ async function getMeter(componentNameOverride) {
690
+ await initialize();
681
691
  const { componentName, systemName, systemVersion } = detectTelemetryContext(
682
692
  componentNameOverride
683
693
  );
@@ -686,11 +696,12 @@ function getMeter(componentNameOverride) {
686
696
 
687
697
  // src/tracer.ts
688
698
  import {
689
- context as context3,
699
+ context as context2,
690
700
  SpanStatusCode as SpanStatusCode3,
691
701
  trace as trace2
692
702
  } from "@opentelemetry/api";
693
- function getTracer(componentNameOverride) {
703
+ async function getTracer(componentNameOverride) {
704
+ await initialize();
694
705
  const { componentName, systemName, systemVersion } = detectTelemetryContext(
695
706
  componentNameOverride
696
707
  );
@@ -704,9 +715,9 @@ function getTracer(componentNameOverride) {
704
715
  spanOrFunc,
705
716
  func
706
717
  );
707
- const parentContext = parent ? trace2.setSpan(context3.active(), parent) : context3.active();
718
+ const parentContext = parent ? trace2.setSpan(context2.active(), parent) : context2.active();
708
719
  const span = tracer.startSpan(name, options, parentContext);
709
- return await context3.with(trace2.setSpan(parentContext, span), async () => {
720
+ return await context2.with(trace2.setSpan(parentContext, span), async () => {
710
721
  try {
711
722
  const result = await fn(span);
712
723
  span.setStatus({ code: SpanStatusCode3.OK });
@@ -727,9 +738,9 @@ function getTracer(componentNameOverride) {
727
738
  spanOrFunc,
728
739
  func
729
740
  );
730
- const parentContext = parent ? trace2.setSpan(context3.active(), parent) : context3.active();
741
+ const parentContext = parent ? trace2.setSpan(context2.active(), parent) : context2.active();
731
742
  const span = tracer.startSpan(name, options, parentContext);
732
- return context3.with(trace2.setSpan(parentContext, span), () => {
743
+ return context2.with(trace2.setSpan(parentContext, span), () => {
733
744
  try {
734
745
  const result = fn(span);
735
746
  span.setStatus({ code: SpanStatusCode3.OK });
@@ -752,11 +763,11 @@ function extractArgs(spanOptionsSpanOrFunc, spanOrFunc, func) {
752
763
  let options = {};
753
764
  let parent;
754
765
  let fn;
755
- if (typeof spanOptionsSpanOrFunc === "function") {
766
+ if (isFunction(spanOptionsSpanOrFunc)) {
756
767
  fn = spanOptionsSpanOrFunc;
757
- } else if (typeof spanOrFunc === "function") {
768
+ } else if (isFunction(spanOrFunc)) {
758
769
  const spanOrSpanOptions = spanOptionsSpanOrFunc;
759
- if ("startTime" in spanOrSpanOptions || "attributes" in spanOrSpanOptions || "kind" in spanOrSpanOptions) {
770
+ if (isSpanOptions(spanOrSpanOptions)) {
760
771
  options = spanOrSpanOptions;
761
772
  } else {
762
773
  parent = spanOrSpanOptions;
@@ -769,6 +780,9 @@ function extractArgs(spanOptionsSpanOrFunc, spanOrFunc, func) {
769
780
  }
770
781
  return { options, parent, fn };
771
782
  }
783
+ var isFunction = (value) => typeof value === "function";
784
+ var isSpan = (value) => value !== null && value !== void 0 && isFunction(value.spanContext) && isFunction(value.end);
785
+ var isSpanOptions = (value) => value !== null && value !== void 0 && (!!value.startTime || !!value.attributes || !!value.kind) && !isSpan(value);
772
786
 
773
787
  // src/index.ts
774
788
  initialize();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sebspark/otel",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",