From 2bcb3ead24ab09081aa1559bb20372b6e00458b3 Mon Sep 17 00:00:00 2001 From: Milo Hansen Date: Tue, 8 Apr 2025 11:56:27 -0700 Subject: [PATCH 1/6] use routePath Replace indexing into the matchedRoutes with a direct reference to routePath --- packages/otel/src/index.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/otel/src/index.ts b/packages/otel/src/index.ts index 55bfe7a8..03252913 100644 --- a/packages/otel/src/index.ts +++ b/packages/otel/src/index.ts @@ -30,9 +30,9 @@ export const otel = (async (c, next) => { - const route = c.req.matchedRoutes[c.req.matchedRoutes.length - 1] + const routePath = c.req.routePath await tracer.startActiveSpan( - `${c.req.method} ${route.path}`, + `${c.req.method} ${routePath}`, { kind: SpanKind.SERVER, attributes: { [ATTR_HTTP_REQUEST_METHOD]: c.req.method, [ATTR_URL_FULL]: c.req.url, - [ATTR_HTTP_ROUTE]: route.path, + [ATTR_HTTP_ROUTE]: routePath, }, }, async (span) => { From 5315ef7e0d1ad654b99a358f3dfab99704031bcb Mon Sep 17 00:00:00 2001 From: Milo Hansen Date: Tue, 8 Apr 2025 11:56:47 -0700 Subject: [PATCH 2/6] Update package.json Bump version --- packages/otel/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/otel/package.json b/packages/otel/package.json index f19e3291..7ddb548d 100644 --- a/packages/otel/package.json +++ b/packages/otel/package.json @@ -1,6 +1,6 @@ { "name": "@hono/otel", - "version": "0.1.0", + "version": "0.1.1", "description": "OpenTelemetry middleware for Hono", "type": "module", "module": "dist/index.js", From a638a15346cb2fb907228626468b3b781b402baf Mon Sep 17 00:00:00 2001 From: Milo Hansen Date: Tue, 8 Apr 2025 12:09:41 -0700 Subject: [PATCH 3/6] set span name and attributes after the request is handled --- packages/otel/src/index.ts | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/otel/src/index.ts b/packages/otel/src/index.ts index 03252913..06c382d5 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 } from '@opentelemetry/api' import { ATTR_HTTP_REQUEST_HEADER, ATTR_HTTP_REQUEST_METHOD, @@ -10,17 +10,19 @@ import { } from '@opentelemetry/semantic-conventions' import type { Env, Input } from 'hono' import { createMiddleware } from 'hono/factory' -import metadata from '../package.json' with { type: 'json'} +import metadata from '../package.json' with { type: 'json' } const PACKAGE_NAME = metadata.name const PACKAGE_VERSION = metadata.version -export type OtelOptions = { - augmentSpan?: false; - tracerProvider?: TracerProvider -} | { - augmentSpan: true; -} +export type OtelOptions = + | { + augmentSpan?: false + tracerProvider?: TracerProvider + } + | { + augmentSpan: true + } export const otel = ( options: OtelOptions = {} @@ -42,7 +44,7 @@ export const otel = (async (c, next) => { const routePath = c.req.routePath await tracer.startActiveSpan( - `${c.req.method} ${routePath}`, + `${c.req.method} ${c.req.routePath}`, { kind: SpanKind.SERVER, attributes: { @@ -57,6 +59,10 @@ export const otel = Date: Tue, 8 Apr 2025 12:12:08 -0700 Subject: [PATCH 4/6] revert version bump --- packages/otel/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/otel/package.json b/packages/otel/package.json index 7ddb548d..f19e3291 100644 --- a/packages/otel/package.json +++ b/packages/otel/package.json @@ -1,6 +1,6 @@ { "name": "@hono/otel", - "version": "0.1.1", + "version": "0.1.0", "description": "OpenTelemetry middleware for Hono", "type": "module", "module": "dist/index.js", From 3fb6df0f0f1909ef6e0267f740a4f62f1c9aabd8 Mon Sep 17 00:00:00 2001 From: Milo Hansen Date: Tue, 8 Apr 2025 12:13:33 -0700 Subject: [PATCH 5/6] changeset --- .changeset/ripe-parents-sing.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/ripe-parents-sing.md diff --git a/.changeset/ripe-parents-sing.md b/.changeset/ripe-parents-sing.md new file mode 100644 index 00000000..3cfc0281 --- /dev/null +++ b/.changeset/ripe-parents-sing.md @@ -0,0 +1,5 @@ +--- +'@hono/otel': patch +--- + +Use `req.routePath` to augment spans with the path that handled the request. From fc801ad8d0bd18ae1422aa4f782f6be73f0af041 Mon Sep 17 00:00:00 2001 From: Milo Hansen Date: Wed, 9 Apr 2025 11:39:58 -0700 Subject: [PATCH 6/6] add test to ensure subapps set the correct span name --- packages/otel/src/index.test.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/otel/src/index.test.ts b/packages/otel/src/index.test.ts index 7f73cbab..1908840c 100644 --- a/packages/otel/src/index.test.ts +++ b/packages/otel/src/index.test.ts @@ -26,6 +26,13 @@ describe('OpenTelemetry middleware', () => { throw new Error('error message') }) + const subapp = new Hono() + subapp.get('/hello', (c) => c.text('Hello from subapp!')) + subapp.get('*', (c) => c.text('Fallthrough')) + + // mount subapp + app.route('/subapp', subapp) + it('Should make a span', async () => { memoryExporter.reset() const response = await app.request('http://localhost/foo') @@ -71,4 +78,13 @@ describe('OpenTelemetry middleware', () => { expect(span.name).toBe('GET /foo') expect(span.attributes[ATTR_HTTP_ROUTE]).toBe('/foo') }) + + // Issue #1112 + it('Should set the correct span name for subapp', async () => { + memoryExporter.reset() + await app.request('http://localhost/subapp/hello') + const spans = memoryExporter.getFinishedSpans() + const [span] = spans + expect(span.name).toBe('GET /subapp/hello') + }) })