summaryrefslogtreecommitdiff
path: root/src/frontend/utils/telemetry/InstrumentationMiddleware.ts
diff options
context:
space:
mode:
authorSaumit <justsaumit@protonmail.com>2025-09-27 02:14:26 +0530
committerSaumit <justsaumit@protonmail.com>2025-09-27 02:14:26 +0530
commit82e03978b89938219958032efb1448cc76baa181 (patch)
tree626f3e54d52ecd49be0ed3bee30abacc0453d081 /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.ts40
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;