diff --git a/.changeset/salty-bags-shop.md b/.changeset/salty-bags-shop.md new file mode 100644 index 00000000..dee41796 --- /dev/null +++ b/.changeset/salty-bags-shop.md @@ -0,0 +1,5 @@ +--- +'@hono/otel': minor +--- + +Added support for W3C Trace Context format diff --git a/packages/otel/src/index.ts b/packages/otel/src/index.ts index 06c382d5..064e64be 100644 --- a/packages/otel/src/index.ts +++ b/packages/otel/src/index.ts @@ -1,5 +1,5 @@ import type { TracerProvider } from '@opentelemetry/api' -import { SpanKind, SpanStatusCode, trace } from '@opentelemetry/api' +import { SpanKind, SpanStatusCode, trace, context, propagation } from '@opentelemetry/api' import { ATTR_HTTP_REQUEST_HEADER, ATTR_HTTP_REQUEST_METHOD, @@ -42,6 +42,12 @@ export const otel = (async (c, next) => { + // Handle propagation of trace context from a request using the W3C Trace Context format + let activeContext = context.active() + if (c.req.header('traceparent')) { + activeContext = propagation.extract(context.active(), c.req.header()) + } + const routePath = c.req.routePath await tracer.startActiveSpan( `${c.req.method} ${c.req.routePath}`, @@ -53,6 +59,7 @@ export const otel = { for (const [name, value] of Object.entries(c.req.header())) { span.setAttribute(ATTR_HTTP_REQUEST_HEADER(name), value)