diff --git a/js/package-lock.json b/js/package-lock.json index 97d25b5..0700f70 100644 --- a/js/package-lock.json +++ b/js/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "dependencies": { "@azure/functions": "^4.5.0", + "@azure/functions-opentelemetry-instrumentation": "^0.1.0", "@azure/monitor-opentelemetry-exporter": "^1.0.0-beta.23", "@opentelemetry/api": "^1.8.0", "@opentelemetry/auto-instrumentations-node": "^0.46.1", @@ -127,6 +128,80 @@ "node": ">=18.0" } }, + "node_modules/@azure/functions-opentelemetry-instrumentation": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@azure/functions-opentelemetry-instrumentation/-/functions-opentelemetry-instrumentation-0.1.0.tgz", + "integrity": "sha512-eRitTbOUDhlzc4o2Q9rjbXiMYa/ep06m2jIkN7HOuLP0aHnjPh3zHXtqji/NyeqT/GfHjCgJr+r8+49s7KER7w==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@azure/functions-opentelemetry-instrumentation/node_modules/@opentelemetry/api-logs": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz", + "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@azure/functions-opentelemetry-instrumentation/node_modules/@opentelemetry/instrumentation": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz", + "integrity": "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==", + "dependencies": { + "@opentelemetry/api-logs": "0.52.1", + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@azure/functions-opentelemetry-instrumentation/node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@azure/functions-opentelemetry-instrumentation/node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/@azure/functions-opentelemetry-instrumentation/node_modules/import-in-the-middle": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.11.0.tgz", + "integrity": "sha512-5DimNQGoe0pLUHbR9qK84iWaWjjbsxiqXnw6Qz64+azRgleqv9k2kTt5fw7QsOpmaGYtuxxursnPPsnTKEx10Q==", + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "node_modules/@azure/logger": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.2.tgz", diff --git a/js/package.json b/js/package.json index e9840aa..5069566 100644 --- a/js/package.json +++ b/js/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "@azure/functions": "^4.5.0", + "@azure/functions-opentelemetry-instrumentation": "^0.1.0", "@azure/monitor-opentelemetry-exporter": "^1.0.0-beta.23", "@opentelemetry/api": "^1.8.0", "@opentelemetry/auto-instrumentations-node": "^0.46.1", diff --git a/js/src/otelAppInsights.js b/js/src/otelAppInsights.js index 3142d72..bf1da14 100644 --- a/js/src/otelAppInsights.js +++ b/js/src/otelAppInsights.js @@ -1,7 +1,5 @@ -const { app } = require('@azure/functions'); +const { AzureFunctionsInstrumentation } = require('@azure/functions-opentelemetry-instrumentation'); const { AzureMonitorLogExporter, AzureMonitorTraceExporter } = require('@azure/monitor-opentelemetry-exporter'); -const { context: otelContext, propagation } = require('@opentelemetry/api'); -const { SeverityNumber } = require('@opentelemetry/api-logs'); const { getNodeAutoInstrumentations, getResourceDetectors } = require('@opentelemetry/auto-instrumentations-node'); const { registerInstrumentations } = require('@opentelemetry/instrumentation'); const { detectResourcesSync } = require('@opentelemetry/resources'); @@ -17,46 +15,8 @@ tracerProvider.register(); const loggerProvider = new LoggerProvider({ resource }); loggerProvider.addLogRecordProcessor(new SimpleLogRecordProcessor(new AzureMonitorLogExporter())); -registerInstrumentations({ tracerProvider, loggerProvider, instrumentations: [getNodeAutoInstrumentations()] }); - -// NOTE: The below code will soon be a part of a new package `@opentelemetry/instrumentation-azure-functions` -// See here for more info: https://github.com/Azure/azure-functions-nodejs-library/issues/245 -app.setup({ capabilities: { WorkerOpenTelemetryEnabled: true } }); - -const logger = loggerProvider.getLogger('default'); -app.hook.log((context) => { - logger.emit({ - body: context.message, - severityNumber: toOtelSeverityNumber(context.level), - severityText: context.level, - }); +registerInstrumentations({ + tracerProvider, + loggerProvider, + instrumentations: [getNodeAutoInstrumentations(), new AzureFunctionsInstrumentation()], }); - -app.hook.preInvocation((context) => { - context.functionHandler = otelContext.bind( - propagation.extract(otelContext.active(), { - traceparent: context.invocationContext.traceContext.traceParent, - tracestate: context.invocationContext.traceContext.traceState, - }), - context.functionHandler - ); -}); - -function toOtelSeverityNumber(level) { - switch (level) { - case 'information': - return SeverityNumber.INFO; - case 'debug': - return SeverityNumber.DEBUG; - case 'error': - return SeverityNumber.ERROR; - case 'trace': - return SeverityNumber.TRACE; - case 'warning': - return SeverityNumber.WARN; - case 'critical': - return SeverityNumber.FATAL; - default: - return SeverityNumber.UNSPECIFIED; - } -} diff --git a/js/src/otelOtlp.js b/js/src/otelOtlp.js index 1103516..861d598 100644 --- a/js/src/otelOtlp.js +++ b/js/src/otelOtlp.js @@ -1,6 +1,4 @@ -const { app } = require('@azure/functions'); -const { context: otelContext, propagation } = require('@opentelemetry/api'); -const { SeverityNumber } = require('@opentelemetry/api-logs'); +const { AzureFunctionsInstrumentation } = require('@azure/functions-opentelemetry-instrumentation'); const { getNodeAutoInstrumentations, getResourceDetectors } = require('@opentelemetry/auto-instrumentations-node'); const { OTLPLogExporter } = require('@opentelemetry/exporter-logs-otlp-http'); const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http'); @@ -18,46 +16,8 @@ tracerProvider.register(); const loggerProvider = new LoggerProvider({ resource }); loggerProvider.addLogRecordProcessor(new SimpleLogRecordProcessor(new OTLPLogExporter())); -registerInstrumentations({ tracerProvider, loggerProvider, instrumentations: [getNodeAutoInstrumentations()] }); - -// NOTE: The below code will soon be a part of a new package `@opentelemetry/instrumentation-azure-functions` -// See here for more info: https://github.com/Azure/azure-functions-nodejs-library/issues/245 -app.setup({ capabilities: { WorkerOpenTelemetryEnabled: true } }); - -const logger = loggerProvider.getLogger('default'); -app.hook.log((context) => { - logger.emit({ - body: context.message, - severityNumber: toOtelSeverityNumber(context.level), - severityText: context.level, - }); +registerInstrumentations({ + tracerProvider, + loggerProvider, + instrumentations: [getNodeAutoInstrumentations(), new AzureFunctionsInstrumentation()], }); - -app.hook.preInvocation((context) => { - context.functionHandler = otelContext.bind( - propagation.extract(otelContext.active(), { - traceparent: context.invocationContext.traceContext.traceParent, - tracestate: context.invocationContext.traceContext.traceState, - }), - context.functionHandler - ); -}); - -function toOtelSeverityNumber(level) { - switch (level) { - case 'information': - return SeverityNumber.INFO; - case 'debug': - return SeverityNumber.DEBUG; - case 'error': - return SeverityNumber.ERROR; - case 'trace': - return SeverityNumber.TRACE; - case 'warning': - return SeverityNumber.WARN; - case 'critical': - return SeverityNumber.FATAL; - default: - return SeverityNumber.UNSPECIFIED; - } -} diff --git a/ts/package-lock.json b/ts/package-lock.json index 4d48461..d47b719 100644 --- a/ts/package-lock.json +++ b/ts/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "dependencies": { "@azure/functions": "^4.5.0", + "@azure/functions-opentelemetry-instrumentation": "^0.1.0", "@azure/monitor-opentelemetry-exporter": "^1.0.0-beta.23", "@opentelemetry/api": "^1.8.0", "@opentelemetry/auto-instrumentations-node": "^0.46.1", @@ -133,6 +134,80 @@ "node": ">=18.0" } }, + "node_modules/@azure/functions-opentelemetry-instrumentation": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@azure/functions-opentelemetry-instrumentation/-/functions-opentelemetry-instrumentation-0.1.0.tgz", + "integrity": "sha512-eRitTbOUDhlzc4o2Q9rjbXiMYa/ep06m2jIkN7HOuLP0aHnjPh3zHXtqji/NyeqT/GfHjCgJr+r8+49s7KER7w==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@azure/functions-opentelemetry-instrumentation/node_modules/@opentelemetry/api-logs": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz", + "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@azure/functions-opentelemetry-instrumentation/node_modules/@opentelemetry/instrumentation": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz", + "integrity": "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==", + "dependencies": { + "@opentelemetry/api-logs": "0.52.1", + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@azure/functions-opentelemetry-instrumentation/node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@azure/functions-opentelemetry-instrumentation/node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/@azure/functions-opentelemetry-instrumentation/node_modules/import-in-the-middle": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.11.0.tgz", + "integrity": "sha512-5DimNQGoe0pLUHbR9qK84iWaWjjbsxiqXnw6Qz64+azRgleqv9k2kTt5fw7QsOpmaGYtuxxursnPPsnTKEx10Q==", + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "node_modules/@azure/logger": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.2.tgz", diff --git a/ts/package.json b/ts/package.json index b85f693..d0853c0 100644 --- a/ts/package.json +++ b/ts/package.json @@ -14,6 +14,7 @@ }, "dependencies": { "@azure/functions": "^4.5.0", + "@azure/functions-opentelemetry-instrumentation": "^0.1.0", "@azure/monitor-opentelemetry-exporter": "^1.0.0-beta.23", "@opentelemetry/api": "^1.8.0", "@opentelemetry/auto-instrumentations-node": "^0.46.1", diff --git a/ts/src/otelAppInsights.ts b/ts/src/otelAppInsights.ts index da8f63a..e8be4a3 100644 --- a/ts/src/otelAppInsights.ts +++ b/ts/src/otelAppInsights.ts @@ -1,7 +1,5 @@ -import { app, LogLevel } from '@azure/functions'; +import { AzureFunctionsInstrumentation } from '@azure/functions-opentelemetry-instrumentation'; import { AzureMonitorLogExporter, AzureMonitorTraceExporter } from '@azure/monitor-opentelemetry-exporter'; -import { context as otelContext, propagation } from '@opentelemetry/api'; -import { SeverityNumber } from '@opentelemetry/api-logs'; import { getNodeAutoInstrumentations, getResourceDetectors } from '@opentelemetry/auto-instrumentations-node'; import { registerInstrumentations } from '@opentelemetry/instrumentation'; import { detectResourcesSync } from '@opentelemetry/resources'; @@ -17,46 +15,8 @@ tracerProvider.register(); const loggerProvider = new LoggerProvider({ resource }); loggerProvider.addLogRecordProcessor(new SimpleLogRecordProcessor(new AzureMonitorLogExporter())); -registerInstrumentations({ tracerProvider, loggerProvider, instrumentations: [getNodeAutoInstrumentations()] }); - -// NOTE: The below code will soon be a part of a new package `@opentelemetry/instrumentation-azure-functions` -// See here for more info: https://github.com/Azure/azure-functions-nodejs-library/issues/245 -app.setup({ capabilities: { WorkerOpenTelemetryEnabled: true } }); - -const logger = loggerProvider.getLogger('default'); -app.hook.log((context) => { - logger.emit({ - body: context.message, - severityNumber: toOtelSeverityNumber(context.level), - severityText: context.level, - }); +registerInstrumentations({ + tracerProvider, + loggerProvider, + instrumentations: [getNodeAutoInstrumentations(), new AzureFunctionsInstrumentation()], }); - -app.hook.preInvocation((context) => { - context.functionHandler = otelContext.bind( - propagation.extract(otelContext.active(), { - traceparent: context.invocationContext.traceContext.traceParent, - tracestate: context.invocationContext.traceContext.traceState, - }), - context.functionHandler - ); -}); - -function toOtelSeverityNumber(level: LogLevel): SeverityNumber { - switch (level) { - case 'information': - return SeverityNumber.INFO; - case 'debug': - return SeverityNumber.DEBUG; - case 'error': - return SeverityNumber.ERROR; - case 'trace': - return SeverityNumber.TRACE; - case 'warning': - return SeverityNumber.WARN; - case 'critical': - return SeverityNumber.FATAL; - default: - return SeverityNumber.UNSPECIFIED; - } -} diff --git a/ts/src/otelOtlp.ts b/ts/src/otelOtlp.ts index bfa8d26..12b4c9d 100644 --- a/ts/src/otelOtlp.ts +++ b/ts/src/otelOtlp.ts @@ -1,6 +1,4 @@ -import { app, LogLevel } from '@azure/functions'; -import { context as otelContext, propagation } from '@opentelemetry/api'; -import { SeverityNumber } from '@opentelemetry/api-logs'; +import { AzureFunctionsInstrumentation } from '@azure/functions-opentelemetry-instrumentation'; import { getNodeAutoInstrumentations, getResourceDetectors } from '@opentelemetry/auto-instrumentations-node'; import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http'; import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; @@ -18,46 +16,8 @@ tracerProvider.register(); const loggerProvider = new LoggerProvider({ resource }); loggerProvider.addLogRecordProcessor(new SimpleLogRecordProcessor(new OTLPLogExporter())); -registerInstrumentations({ tracerProvider, loggerProvider, instrumentations: [getNodeAutoInstrumentations()] }); - -// NOTE: The below code will soon be a part of a new package `@opentelemetry/instrumentation-azure-functions` -// See here for more info: https://github.com/Azure/azure-functions-nodejs-library/issues/245 -app.setup({ capabilities: { WorkerOpenTelemetryEnabled: true } }); - -const logger = loggerProvider.getLogger('default'); -app.hook.log((context) => { - logger.emit({ - body: context.message, - severityNumber: toOtelSeverityNumber(context.level), - severityText: context.level, - }); +registerInstrumentations({ + tracerProvider, + loggerProvider, + instrumentations: [getNodeAutoInstrumentations(), new AzureFunctionsInstrumentation()], }); - -app.hook.preInvocation((context) => { - context.functionHandler = otelContext.bind( - propagation.extract(otelContext.active(), { - traceparent: context.invocationContext.traceContext.traceParent, - tracestate: context.invocationContext.traceContext.traceState, - }), - context.functionHandler - ); -}); - -function toOtelSeverityNumber(level: LogLevel): SeverityNumber { - switch (level) { - case 'information': - return SeverityNumber.INFO; - case 'debug': - return SeverityNumber.DEBUG; - case 'error': - return SeverityNumber.ERROR; - case 'trace': - return SeverityNumber.TRACE; - case 'warning': - return SeverityNumber.WARN; - case 'critical': - return SeverityNumber.FATAL; - default: - return SeverityNumber.UNSPECIFIED; - } -}