Skip to main content
This guide will help you instrument your Express application(s) with OpenTelemetry and send traces to Checkly. The steps are largely the same as instrumenting any Node.js application with OpenTelemetry.

Step 1: Install the OpenTelemetry packages

Install the relevant OpenTelemetry packages:
Terminal

Step 2: Initialize the instrumentation

Create a file called tracing.js at the root of your project and add the following code:
tracing.js
Notice the sampler configuration. This is a custom, head-based sampler that will only sample spans that are generated by Checkly by inspecting the trace state. This way you only pay for the egress traffic generated by Checkly and not for any other traffic.

Step 3: Start your app with the instrumentation

Toggle on Import Traces and grab your OTel API key in the OTel API keys section of the Traces page in the Checkly app and take a note of the endpoint for the region you want to use. Checkly OTEL API keys Now, export your API key in your shell by setting the OTEL_EXPORTER_OTLP_HEADERS environment variable.
Next, export the endpoint for the region you want to use and give your service a name.
Then, explicitly set the protocol to use for the OTLP exporter.
We are using the standard OpenTelemetry environment variables here to configure the OTLP exporter. Then start your app with the extra -r flag to load the tracing.js file before any other files are loaded. In this case the index.js file holds your Express app and typically starts with code like:
index.js
Terminal
🎉 You are done. Any interactions with your app that are triggered by a Checkly synthetic monitoring check will now generate traces, which are sent back to Checkly and displayed in the Checkly UI.

Reducing noise in the auto Node.js instrumentation

We found the Node.js auto-instrumentation a bit noisy. There can be a lot of file i/o and a ton of DNS calls you might not be interested in. Luckily, you can easily tweak that by providing some extra options to the getNodeAutoInstrumentations() function. We use the following configuration to filter out some of the noise:
tracing.js