diff --git a/src/hello.test.ts b/src/hello.test.ts index 9e1eaae..b03ce4d 100644 --- a/src/hello.test.ts +++ b/src/hello.test.ts @@ -13,8 +13,7 @@ describe("greet", () => { }); it("main emits telemetry and logs greeting", async () => { - process.env.OTEL_EXPORTER_OTLP_ENDPOINT = - process.env.OTEL_EXPORTER_OTLP_ENDPOINT ?? "http://127.0.0.1:4318"; + process.env.OTEL_EXPORTER_OTLP_ENDPOINT = "http://127.0.0.1:9"; const logs: unknown[] = []; const original = console.log; console.log = (...args: unknown[]) => { diff --git a/src/telemetry.test.ts b/src/telemetry.test.ts index 1b22dff..3028bba 100644 --- a/src/telemetry.test.ts +++ b/src/telemetry.test.ts @@ -3,8 +3,7 @@ import test from "node:test"; import { SeverityNumber, startTelemetry } from "./telemetry.js"; test("startTelemetry emits and shuts down without throwing", async () => { - process.env.OTEL_EXPORTER_OTLP_ENDPOINT = - process.env.OTEL_EXPORTER_OTLP_ENDPOINT ?? "http://127.0.0.1:4318"; + process.env.OTEL_EXPORTER_OTLP_ENDPOINT = "http://127.0.0.1:9"; process.env.OTEL_SERVICE_NAME = "ticketlab-test"; const telemetry = startTelemetry("ticketlab-test"); diff --git a/src/telemetry.ts b/src/telemetry.ts index 6bbcbd1..93f5020 100644 --- a/src/telemetry.ts +++ b/src/telemetry.ts @@ -71,21 +71,36 @@ export function startTelemetry( }); logs.setGlobalLoggerProvider(loggerProvider); + const quiet = (p: Promise) => p.catch(() => undefined); + // ponytail: OTLP flush can hang when the collector is down; 1.5s ceiling, upgrade to exporter timeout config + const bounded = async (work: Promise) => { + await Promise.race([ + work, + new Promise((resolve) => { + setTimeout(resolve, 400); + }), + ]); + }; + return { tracer: trace.getTracer(serviceName), meter: metrics.getMeter(serviceName), logger: logs.getLogger(serviceName), shutdown: async () => { - await Promise.all([ - tracerProvider.forceFlush(), - meterProvider.forceFlush(), - loggerProvider.forceFlush(), - ]); - await Promise.all([ - tracerProvider.shutdown(), - meterProvider.shutdown(), - loggerProvider.shutdown(), - ]); + await bounded( + Promise.all([ + quiet(tracerProvider.forceFlush()), + quiet(meterProvider.forceFlush()), + quiet(loggerProvider.forceFlush()), + ]), + ); + await bounded( + Promise.all([ + quiet(tracerProvider.shutdown()), + quiet(meterProvider.shutdown()), + quiet(loggerProvider.shutdown()), + ]), + ); }, }; }