Skip to content

Azure/azure-functions-nodejs-opentelemetry

OpenTelemetry Azure Functions Instrumentation for Node.js

Branch Status Support level Node.js Versions
main Build Status Test Status GA 18+

This module provides automatic instrumentation for the @azure/functions module, which may be loaded using the @opentelemetry/sdk-trace-node package.

Compatible with OpenTelemetry JS API and SDK 1.0+.

Install

npm install --save @azure/functions-opentelemetry-instrumentation

Supported Versions

  • @azure/functions: ^4.5.0

Usage

CommonJS

const { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node');
const { registerInstrumentations } = require('@opentelemetry/instrumentation');
const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http');
const { AzureFunctionsInstrumentation } = require('@azure/functions-opentelemetry-instrumentation');

const provider = new NodeTracerProvider();
provider.register();

registerInstrumentations({
  instrumentations: [
    // Azure Functions instrumentation expects HTTP layer to be instrumented
    new HttpInstrumentation(),
    new AzureFunctionsInstrumentation(),
  ],
});

ESM

ESM requires a separate setup because Node.js uses a different module loader for ESM vs CommonJS. Instrumentation patching in ESM needs an experimental loader hook (--experimental-loader=@opentelemetry/instrumentation/hook.mjs) and a minimum Node.js version of 18.19.0. The --import flag must be used to ensure the instrumentation is initialized before application code. For more details, see OpenTelemetry ESM Support.

import FunctionInstrumentation from "@azure/functions-opentelemetry-instrumentation";
import { HttpInstrumentation } from "@opentelemetry/instrumentation-http";
import { registerInstrumentations } from "@opentelemetry/instrumentation";
import { NodeTracerProvider, SimpleSpanProcessor } from "@opentelemetry/sdk-trace-node";
import { AzureMonitorTraceExporter } from "@azure/monitor-opentelemetry-exporter";

const { AzureFunctionsInstrumentationESM } = FunctionInstrumentation;

const tracerProvider = new NodeTracerProvider();
tracerProvider.addSpanProcessor(new SimpleSpanProcessor(new AzureMonitorTraceExporter()));
tracerProvider.register();

const azureFunctionsInstrumentation = new AzureFunctionsInstrumentationESM();
registerInstrumentations({
  tracerProvider,
  instrumentations: [new HttpInstrumentation(), azureFunctionsInstrumentation],
});

const azureFunctions = await import("@azure/functions");
azureFunctionsInstrumentation.registerAzFunc(azureFunctions);

azureFunctions.app.setup({
  capabilities: { WorkerOpenTelemetryEnabled: true },
  enableHttpStream: true,
});

Useful links

About

OpenTelemetry Azure Functions Instrumentation for Node.js

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Contributors