# 
        OpenTelemetry for Cloudflare Workers
    
Instrument your Cloudflare Worker applications with OpenTelemetry using the the otel-cf-workers SDK.
        # 
        Instrumentation
    
        # 
        Step 1: Install the SDK
    
Install @microlabs/otel-cf-workers in your project.
npm i @microlabs/otel-cf-workers 
        # 
        Step 2: Add Node.js Compatibility Flags
    
OpenTelemetry requires the Node.js Compatibility flag is enabled at the top level of your wrangler.toml
compatibility_flags = [ "nodejs_compat" ]
        # 
        Step 3: Configure the tracer
    
In your Cloudflare worker file, add the following configuration code to configure OpenTelemetry.
import { instrument, ResolveConfigFn } from '@microlabs/otel-cf-workers'
export interface Env {
	BASELIME_API_KEY: string
    SERVICE_NAME: string
}
const handler = {
	async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
		// your cloudflare worker code
	},
}
const config: ResolveConfigFn = (env: Env, _trigger) => {
	return {
		exporter: {
			url: 'https://otel.baselime.io/v1',
			headers: { 'x-api-key': env.BASELIME_API_KEY },
		},
		service: { name: env.SERVICE_NAME },
	}
}
export default instrument(handler, config)
        # 
        Step 4: Set the Baselime environment variables
    
In your Cloudflare Workers Secret Configuration add the BASELIME_API_KEY.
To enable tracing for local dev add your BASELIME_API_KEY to your .dev.vars file
BASELIME_API_KEY=$YOUR_BASELIME_API_KEYIn your wrangler.toml file set the SERVICE_NAME variable
Get your pulic BASELIME_API_KEY from the Baselime console.
[vars]
SERVICE_NAME = "my-service-name"Once these steps are completed, distributed traces from your Cloudflare Workers application should be available in Baselime to query via the console or the Baselime CLI.
 
    
        # 
        Adding custom OpenTelemetry spans
    
To add custom spans to your OpenTelemetry traces, install the @opentelemetry/api package.
npm i @opentelemetry/apiAnd manually add spans to your traces.
import { trace } from "@opentelemetry/api";
 
const tracer = trace.getTracer('your-custom-traces');
const handler = {
    async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
        const span = trace.getActiveSpan();
        span.setAttribute('search', search)
        const result = await tracer.startActiveSpan(`business-logic`, async (span) => {
            // your business logic
            const input = { search }
            span.setAttributes(input);
            const result = await yourBusinessLogic(input)
            span.setAttributes(result)
            return result
        });
    }
}
        # 
        Special Thanks
    
This is powered by otel-cf-workers developed by Erwin van der Koogh. It's a fantastic vendor agnostic OpenTelemetry SDK for Cloudflare Workers and you should check it out.