Cloudflare

TracesMetricsApp LogsCustom LogsProfiling

1. Prerequisites

Wrangler installed v2.2 or newer. Check your version:

wrangler version

2. Install

1 Install the Worker APM package

npm i @middleware.io/agent-apm-worker

2 Import the tracker

import { init, track } from '@middleware.io/agent-apm-worker';

3 Initialize the tracker (once per isolate)

Add this near the top of your Worker module (or inside fetch as shown on the docs page):

init({
  serviceName: "{APM-SERVICE-NAME}",
  accountKey: "<MW_API_KEY>",
  target: "https://{ACCOUNT-UID}.middleware.io",
  consoleLogEnabled: false, // set true to see instrumented logs locally
});

3. Capture application data

  • Trace the incoming request Use track(request, ctx) and return via sdk.sendResponse(response):
    export default {
       async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
          const sdk = track(request, ctx);
    
          // your app logic
          const response = new Response("ok", { status: 200 });
    
          return sdk.sendResponse(response);
       },
    };
  • Trace upstream calls (HTTP client propagation) If your Worker calls an external API, use sdk.fetch(...) to propagate context automatically:
    const sdk = track(request, ctx);
    const url = new URL(request.url);
    const upstream = await sdk.fetch(`https://httpbin.org${url.pathname}`);
    return sdk.sendResponse(upstream);

4. Custom logs (optional)

Emit structured logs correlated with the current trace:

// sdk.logger.SEVERITY(message, attributes?)
sdk.logger.error("error test");
sdk.logger.error("error with attributes", { "log.file.name": "error.log" });
sdk.logger.info("info test");
sdk.logger.debug("debug test");
sdk.logger.warn("warn test");

5. Configure secrets & env (Wrangler)

Use Wrangler vars/secrets to avoid hardcoding keys:

  • wrangler.toml
    name = "my-worker"
       main = "src/index.ts"
       compatibility_date = "2024-12-01"
    
       [vars]
       SERVICE_NAME = "orders-worker"
       MW_TARGET = "https://<ACCOUNT-UID>.middleware.io"
    
       # Per-environment overrides
       [env.staging.vars]
       SERVICE_NAME = "orders-worker-staging"
    
       [env.production.vars]
       SERVICE_NAME = "orders-worker"
  • Set your API key as a secret:
    wrangler secret put MW_API_KEY
       # optionally per-env:
       wrangler secret put MW_API_KEY --env production
  • Then read from env in your Worker:
    init({
       serviceName: env.SERVICE_NAME,
       accountKey: env.MW_API_KEY, // bound secret
       target: env.MW_TARGET,
       consoleLogEnabled: false,
    });

6. View your data

After deployment, give it 3–5 minutes, then open Middleware to see:

  • Traces (incoming Worker requests, plus any upstream calls done via sdk.fetch)
  • Logs (from sdk.logger.*)
  • Profiling is not yet available for Cloudflare Workers in Middleware.

7. Environment variables

KeyWherePurposeExample
SERVICE_NAMEWrangler varsLogical service name for APMorders-worker
MW_API_KEYWrangler secretAuth token for Middleware(secret)
MW_TARGETWrangler varsIngest endpoint (serverless)https://{ACCOUNT-UID}.middleware.io
consoleLogEnabledinit optionPrint instrumented logs to consolefalse / true

(Names/usage align with the Middleware Worker agent options.) (docs.middleware.io, npm)

8. Troubleshooting

  • No traces/logs:
    • Confirm init(...) is called and track(request, ctx) wraps every request.
    • Check that accountKey/target are set (or bound via env).
  • Upstream service not showing as a child span:
    • Use sdk.fetch(...) instead of fetch(...) to propagate context.
  • Local dev secrets:
    • Use wrangler secret put for real secrets and .dev.vars for local-only values.
  • Multiple environments:
    • Define vars per environment in wrangler.toml ([env.staging], [env.production]).

Need assistance or want to learn more about Middleware? Contact our support team at [email protected] or join our Slack channel.