From c3e297938009aae07ec3b9257446fdd3c91aaf97 Mon Sep 17 00:00:00 2001 From: jlenon7 Date: Wed, 22 Apr 2026 21:28:56 -0300 Subject: [PATCH] feat: use @athenna/otel api --- package-lock.json | 60 ++++++++++++++++++++++++++++++++-- package.json | 3 +- src/handlers/FastifyHandler.ts | 30 ++++++++--------- 3 files changed, 74 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 68585f8..ad70797 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@athenna/http", - "version": "5.61.0", + "version": "5.62.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@athenna/http", - "version": "5.61.0", + "version": "5.62.0", "license": "MIT", "devDependencies": { "@athenna/artisan": "^5.11.0", @@ -14,6 +14,7 @@ "@athenna/config": "^5.6.0", "@athenna/ioc": "^5.2.0", "@athenna/logger": "^5.14.0", + "@athenna/otel": "file:../Otel", "@athenna/test": "^5.6.0", "@athenna/tsconfig": "^5.0.0", "@athenna/view": "^5.4.0", @@ -53,6 +54,57 @@ "node": ">=20.0.0" } }, + "../Otel": { + "name": "@athenna/otel", + "version": "5.13.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/api-logs": "^0.213.0", + "@opentelemetry/auto-instrumentations-node": "^0.71.0", + "@opentelemetry/core": "^2.6.0", + "@opentelemetry/exporter-logs-otlp-grpc": "^0.213.0", + "@opentelemetry/exporter-logs-otlp-http": "^0.213.0", + "@opentelemetry/exporter-metrics-otlp-grpc": "^0.213.0", + "@opentelemetry/exporter-trace-otlp-grpc": "^0.213.0", + "@opentelemetry/instrumentation": "^0.213.0", + "@opentelemetry/resources": "^2.6.0", + "@opentelemetry/sdk-logs": "^0.213.0", + "@opentelemetry/sdk-metrics": "^2.6.0", + "@opentelemetry/sdk-node": "^0.213.0", + "@opentelemetry/sdk-trace-base": "^2.6.0", + "@opentelemetry/semantic-conventions": "^1.40.0", + "import-in-the-middle": "^3.0.0" + }, + "devDependencies": { + "@athenna/common": "^5.31.0", + "@athenna/config": "^5.6.0", + "@athenna/http": "^5.51.0", + "@athenna/ioc": "^5.2.0", + "@athenna/logger": "^5.15.0", + "@athenna/test": "^5.6.0", + "@athenna/tsconfig": "^5.0.0", + "@typescript-eslint/eslint-plugin": "^7.18.0", + "@typescript-eslint/parser": "^7.18.0", + "commitizen": "^4.3.1", + "cz-conventional-changelog": "^3.3.0", + "eslint": "^8.57.1", + "eslint-config-prettier": "^8.10.2", + "eslint-config-standard": "^17.1.0", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-n": "^15.7.0", + "eslint-plugin-prettier": "^4.2.5", + "eslint-plugin-promise": "^6.6.0", + "husky": "^3.1.0", + "lint-staged": "^12.5.0", + "prettier": "^2.8.8", + "semver": "^7.7.4" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@assemblyscript/loader": { "version": "0.19.23", "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.19.23.tgz", @@ -266,6 +318,10 @@ "node": ">=20.0.0" } }, + "node_modules/@athenna/otel": { + "resolved": "../Otel", + "link": true + }, "node_modules/@athenna/test": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/@athenna/test/-/test-5.6.0.tgz", diff --git a/package.json b/package.json index e1ddf11..ec3d103 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@athenna/http", - "version": "5.61.0", + "version": "5.62.0", "description": "The Athenna Http server. Built on top of fastify.", "license": "MIT", "author": "João Lenon ", @@ -80,6 +80,7 @@ "@athenna/config": "^5.6.0", "@athenna/ioc": "^5.2.0", "@athenna/logger": "^5.14.0", + "@athenna/otel": "file:../Otel", "@athenna/test": "^5.6.0", "@athenna/tsconfig": "^5.0.0", "@athenna/view": "^5.4.0", diff --git a/src/handlers/FastifyHandler.ts b/src/handlers/FastifyHandler.ts index fc83fec..bb5ccf4 100644 --- a/src/handlers/FastifyHandler.ts +++ b/src/handlers/FastifyHandler.ts @@ -11,14 +11,14 @@ import { Config } from '@athenna/config' import { Is, Module } from '@athenna/common' import { Request } from '#src/context/Request' import { Response } from '#src/context/Response' -import type { Context as OtelContext } from '@opentelemetry/api' +import type { Context as OtelContext } from '@athenna/otel' import type { RequestHandler } from '#src/types/contexts/Context' import type { ErrorHandler } from '#src/types/contexts/ErrorContext' import type { InterceptHandler, TerminateHandler } from '#src/types' import { NotFoundException } from '#src/exceptions/NotFoundException' import type { FastifyReply, FastifyRequest, RouteHandlerMethod } from 'fastify' -const otelApi = await Module.safeImport('@opentelemetry/api') +const otelModule = await Module.safeImport('@athenna/otel') const otelCurrentContextBagKey = Symbol.for('athenna.otel.currentContextBag') export class FastifyHandler { @@ -132,22 +132,18 @@ export class FastifyHandler { return req.otelContext as OtelContext } - let otelContext = otelApi.context.active() - const bag = new Map() - - for (const binding of Config.get('http.otel.contextBindings', [])) { - const value = binding.resolve(ctx) + if (!otelModule) { + throw new Error('The package @athenna/otel is not installed') + } - if (Is.Undefined(value) && !binding.includeIfUndefined) { - continue - } + const otelContext = otelModule.Otel.createContext({ + bindings: Config.get('http.otel.contextBindings', []), + resolveBinding: binding => binding.resolve(ctx) + }) - bag.set(binding.key, value) - otelContext = otelContext.setValue(binding.key, value) - } + const bag = otelContext.getValue(otelCurrentContextBagKey) req.data.otelCurrentContextBag = bag - otelContext = otelContext.setValue(otelCurrentContextBagKey as any, bag) req.otelContext = otelContext return otelContext as OtelContext @@ -158,10 +154,12 @@ export class FastifyHandler { ctx: any, callback: () => any ) { - if (!this.isOtelContextEnabled() || !otelApi) { + if (!this.isOtelContextEnabled() || !otelModule) { return callback() } - return otelApi.context.with(this.getOrCreateOtelContext(req, ctx), callback) + return otelModule.Otel.withContext(callback, { + ctx: this.getOrCreateOtelContext(req, ctx) + }) } }