From 82e03978b89938219958032efb1448cc76baa181 Mon Sep 17 00:00:00 2001 From: Saumit Date: Sat, 27 Sep 2025 02:14:26 +0530 Subject: Initial snapshot - OpenTelemetry demo 2.1.3 -f --- .../utils/telemetry/InstrumentationMiddleware.ts | 40 ++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/frontend/utils/telemetry/InstrumentationMiddleware.ts (limited to 'src/frontend/utils/telemetry/InstrumentationMiddleware.ts') 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) { + const ctx = trace.setSpan(context.active(), parentSpan); + return await context.with(ctx, fn); +} + +export default InstrumentationMiddleware; -- cgit v1.2.3