|
1 | 1 | import { describe, test, expect, afterEach } from "bun:test" |
2 | | -import { buildResource } from "../src/otel.ts" |
| 2 | +import { OTLPLogExporter as OTLPHttpLogExporter } from "@opentelemetry/exporter-logs-otlp-http" |
| 3 | +import { OTLPLogExporter as OTLPProtoLogExporter } from "@opentelemetry/exporter-logs-otlp-proto" |
| 4 | +import { OTLPMetricExporter as OTLPHttpMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http" |
| 5 | +import { OTLPMetricExporter as OTLPProtoMetricExporter } from "@opentelemetry/exporter-metrics-otlp-proto" |
| 6 | +import { OTLPTraceExporter as OTLPHttpTraceExporter } from "@opentelemetry/exporter-trace-otlp-http" |
| 7 | +import { OTLPTraceExporter as OTLPProtoTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto" |
| 8 | +import { buildResource, setupOtel, type OtelProviders } from "../src/otel.ts" |
| 9 | + |
| 10 | +let providers: OtelProviders | undefined |
| 11 | + |
| 12 | +function exportersOf(currentProviders: OtelProviders) { |
| 13 | + const meterProvider = currentProviders.meterProvider as unknown as { |
| 14 | + _sharedState: { metricCollectors: Array<{ _metricReader: { _exporter: unknown } }> } |
| 15 | + } |
| 16 | + const loggerProvider = currentProviders.loggerProvider as unknown as { |
| 17 | + _sharedState: { activeProcessor: { processors: Array<{ _exporter: unknown }> } } |
| 18 | + } |
| 19 | + const tracerProvider = currentProviders.tracerProvider as unknown as { |
| 20 | + _activeSpanProcessor: { _spanProcessors: Array<{ _exporter: unknown }> } |
| 21 | + } |
| 22 | + const metricCollector = meterProvider._sharedState.metricCollectors[0] |
| 23 | + const logProcessor = loggerProvider._sharedState.activeProcessor.processors[0] |
| 24 | + const spanProcessor = tracerProvider._activeSpanProcessor._spanProcessors[0] |
| 25 | + |
| 26 | + if (!metricCollector || !logProcessor || !spanProcessor) { |
| 27 | + throw new Error("Expected OTEL providers to have active metric/log/trace exporters") |
| 28 | + } |
| 29 | + |
| 30 | + return { |
| 31 | + metric: metricCollector._metricReader._exporter, |
| 32 | + log: logProcessor._exporter, |
| 33 | + trace: spanProcessor._exporter, |
| 34 | + } |
| 35 | +} |
3 | 36 |
|
4 | 37 | describe("buildResource", () => { |
5 | 38 | const originalEnv = process.env["OTEL_RESOURCE_ATTRIBUTES"] |
@@ -41,3 +74,34 @@ describe("buildResource", () => { |
41 | 74 | expect(resource.attributes["service.name"]).toBe("my-override") |
42 | 75 | }) |
43 | 76 | }) |
| 77 | + |
| 78 | +describe("setupOtel", () => { |
| 79 | + afterEach(async () => { |
| 80 | + const current = providers |
| 81 | + providers = undefined |
| 82 | + if (!current) return |
| 83 | + await Promise.allSettled([ |
| 84 | + current.tracerProvider.shutdown(), |
| 85 | + current.loggerProvider.shutdown(), |
| 86 | + current.meterProvider.shutdown(), |
| 87 | + ]) |
| 88 | + }) |
| 89 | + |
| 90 | + test("uses protobuf HTTP exporters for http/protobuf", async () => { |
| 91 | + providers = await setupOtel("http://collector:4318", "http/protobuf", 60000, 5000, "1.2.3") |
| 92 | + const exporters = exportersOf(providers) |
| 93 | + |
| 94 | + expect(exporters.metric).toBeInstanceOf(OTLPProtoMetricExporter) |
| 95 | + expect(exporters.log).toBeInstanceOf(OTLPProtoLogExporter) |
| 96 | + expect(exporters.trace).toBeInstanceOf(OTLPProtoTraceExporter) |
| 97 | + }) |
| 98 | + |
| 99 | + test("uses JSON HTTP exporters for http/json", async () => { |
| 100 | + providers = await setupOtel("http://collector:4318", "http/json", 60000, 5000, "1.2.3") |
| 101 | + const exporters = exportersOf(providers) |
| 102 | + |
| 103 | + expect(exporters.metric).toBeInstanceOf(OTLPHttpMetricExporter) |
| 104 | + expect(exporters.log).toBeInstanceOf(OTLPHttpLogExporter) |
| 105 | + expect(exporters.trace).toBeInstanceOf(OTLPHttpTraceExporter) |
| 106 | + }) |
| 107 | +}) |
0 commit comments