diff options
| author | Saumit <justsaumit@protonmail.com> | 2025-09-27 02:14:26 +0530 |
|---|---|---|
| committer | Saumit <justsaumit@protonmail.com> | 2025-09-27 02:14:26 +0530 |
| commit | 82e03978b89938219958032efb1448cc76baa181 (patch) | |
| tree | 626f3e54d52ecd49be0ed3bee30abacc0453d081 /src/frontend/utils/telemetry/InstrumentationMiddleware.ts | |
Initial snapshot - OpenTelemetry demo 2.1.3 -f
Diffstat (limited to 'src/frontend/utils/telemetry/InstrumentationMiddleware.ts')
| -rw-r--r-- | src/frontend/utils/telemetry/InstrumentationMiddleware.ts | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/frontend/utils/telemetry/InstrumentationMiddleware.ts b/src/frontend/utils/telemetry/InstrumentationMiddleware.ts new file mode 100644 index 0000000..ed389af --- /dev/null +++ b/src/frontend/utils/telemetry/InstrumentationMiddleware.ts @@ -0,0 +1,40 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +import { NextApiHandler } from 'next'; +import {context, Exception, Span, SpanStatusCode, trace} from '@opentelemetry/api'; +import { SemanticAttributes } from '@opentelemetry/semantic-conventions'; +import { metrics } from '@opentelemetry/api'; + +const meter = metrics.getMeter('frontend'); +const requestCounter = meter.createCounter('app.frontend.requests'); + +const InstrumentationMiddleware = (handler: NextApiHandler): NextApiHandler => { + return async (request, response) => { + const {method, url = ''} = request; + const [target] = url.split('?'); + + const span = trace.getSpan(context.active()) as Span; + + let httpStatus = 200; + try { + await runWithSpan(span, async () => handler(request, response)); + httpStatus = response.statusCode; + } catch (error) { + span.recordException(error as Exception); + span.setStatus({ code: SpanStatusCode.ERROR }); + httpStatus = 500; + throw error; + } finally { + requestCounter.add(1, { method, target, status: httpStatus }); + span.setAttribute(SemanticAttributes.HTTP_STATUS_CODE, httpStatus); + } + }; +}; + +async function runWithSpan(parentSpan: Span, fn: () => Promise<unknown>) { + const ctx = trace.setSpan(context.active(), parentSpan); + return await context.with(ctx, fn); +} + +export default InstrumentationMiddleware; |
