Tracing Node.js Applications

Tracing Node.js Applications

Compatibility requirements

The latest version of the NodeJS Tracer officially supports versions >=12. Versions 8 and 10 are supported in maintenance mode on the 0.x release line. For more information about our Node version support and the supported versions, see the Compatibility Requirements page.

Installation and getting started

To add the Datadog tracing library to your Node.js applications, follow these steps:

  1. Install the Datadog Tracing library using npm for Node.js 12+:

    npm install dd-trace --save
    

    If you need to trace end-of-life Node.js versions 10 or 8, install version 0.x of dd-trace by running:

    npm install dd-trace@latest-node10
    

    or

    npm install dd-trace@latest-node8
    

    For more information on our distribution tags and Node.js runtime version support, see the Compatibility Requirements page.

  2. Import and initialize the tracer either in code or via command line arguments. The Node.js tracing library needs to be imported and initialized before any other module.

    Once you have completed setup, if you are not receiving complete traces, including missing URL routes for web requests, or disconnected or missing spans, confirm step 2 has been correctly done. The tracing library being initialized first is necessary for the tracer to properly patch all of the required libraries for automatic instrumentation.

    When using a transpiler such as TypeScript, Webpack, Babel, or others, import and initialize the tracer library in an external file and then import that file as a whole when building your application.

  3. Configure the Datadog Agent for APM

  4. Add any desired configuration to the tracer, such as service, env, and version for Unified Service Tagging.

Adding the tracer in code

JavaScript
// This line must come before importing any instrumented module.
const tracer = require('dd-trace').init();

TypeScript and bundlers

For TypeScript and bundlers that support EcmaScript Module syntax, initialize the tracer in a separate file in order to maintain correct load order.

// server.ts
import './tracer'; // must come before importing any instrumented module.

// tracer.ts
import tracer from 'dd-trace';
tracer.init(); // initialized in a different file to avoid hoisting.
export default tracer;

If the default config is sufficient, or all configuration is done via environment variables, you can also use dd-trace/init, which loads and initializes in one step.

import `dd-trace/init`;

Adding the tracer via command line arguments

Use the --require option to Node.js to load and initialize the tracer in one step.

node --require dd-trace/init app.js

Note: This approach requires using environment variables for all configuration of the tracer.

Configure the Datadog Agent for APM

Install and configure the Datadog Agent to receive traces from your now instrumented application. By default the Datadog Agent is enabled in your datadog.yaml file under apm_config with enabled: true and listens for trace traffic at localhost:8126. For containerized environments, follow the links below to enable trace collection within the Datadog Agent.

  1. Set apm_non_local_traffic: true in the apm_config section of your main datadog.yaml configuration file.

  2. See the specific setup instructions to ensure that the Agent is configured to receive traces in a containerized environment:


  1. After having instrumented your application, the tracing client sends traces to localhost:8126 by default. If this is not the correct host and port change it by setting the below env variables:

    DD_AGENT_HOST and DD_TRACE_AGENT_PORT.

    DD_AGENT_HOST=<HOSTNAME> DD_TRACE_AGENT_PORT=<PORT> node server
    

    To use a different protocol such as UDS, specify the entire URL as a single ENV variable DD_TRACE_AGENT_URL.

    DD_TRACE_AGENT_URL=unix:<SOCKET_PATH> node server
    

  1. Set DD_SITE in the Datadog Agent to to ensure the Agent sends data to the right Datadog location.

To set up Datadog APM in AWS Lambda, see the Tracing Serverless Functions documentation.

Tracing is available for a number of other environments, such as Heroku, Cloud Foundry, AWS Elastic Beanstalk, and Azure App Service.

For other environments, please refer to the Integrations documentation for that environment and contact support if you are encountering any setup issues.

See the tracer settings for the list of initialization options.

Configuration

Tracer settings can be configured as the following parameters to the init() method, or as environment variables.

Tagging

env
Environment variable: DD_ENV
Default: null
Set an application’s environment e.g. prod, pre-prod, stage, etc. Available for versions 0.20+
service
Environment variable: DD_SERVICE
Default: null
The service name to be used for this program. Available for versions 0.20+
version
Environment variable: DD_VERSION
Default: null
The version number of the application. Defaults to value of the version field in package.json. Available for versions 0.20+
tags
Environment variable: DD_TAGS
Default: {}
Set global tags that should be applied to all spans and runtime metrics. When passed as an environment variable, the format is key:value,key:value. When setting this programmatically: tracer.init({ tags: { foo: 'bar' } }) Available for versions 0.20+

It is recommended that you use DD_ENV, DD_SERVICE, and DD_VERSION to set env, service, and version for your services. Review the Unified Service Tagging documentation for recommendations on how to configure these environment variables.

Instrumentation

enabled
Environment variable: DD_TRACE_ENABLED
Default: true
Whether to enable the tracer.
debug
Environment variable: DD_TRACE_DEBUG
Default: false
Enable debug logging in the tracer.
url
Environment variable: DD_TRACE_AGENT_URL
Default: null
The URL of the Trace Agent that the tracer submits to. Takes priority over hostname and port, if set. Supports Unix Domain Sockets in combination with the apm_config.receiver_socket in your datadog.yaml file, or the DD_APM_RECEIVER_SOCKET environment variable.
hostname
Environment variable: DD_TRACE_AGENT_HOSTNAME
Default: localhost
The address of the Agent that the tracer submits to.
port
Environment variable: DD_TRACE_AGENT_PORT
Default: 8126
The port of the Trace Agent that the tracer submits to.
dogstatsd.port
Environment variable: DD_DOGSTATSD_PORT
Default: 8125
The port of the DogStatsD Agent that metrics are submitted to.
logInjection
Environment variable: DD_LOGS_INJECTION
Default: false
Enable automatic injection of trace IDs in logs for supported logging libraries.
sampleRate
Default: 1
Percentage of spans to sample as a float between 0 and 1.
flushInterval
Default: 2000
Interval (in milliseconds) at which the tracer submits traces to the Agent.
runtimeMetrics
Environment variable: DD_RUNTIME_METRICS_ENABLED
Default: false
Whether to enable capturing runtime metrics. Port 8125 (or configured with dogstatsd.port) must be opened on the Agent for UDP.

Environment Variable: DD_SERVICE_MAPPING
Default: null
Example: mysql:my-mysql-service-name-db,pg:my-pg-service-name-db
Provide service names for each plugin. Accepts comma separated plugin:service-name pairs, with or without spaces.

experimental
Default: {}
Experimental features can be enabled all at once using Boolean true or individually using key/value pairs. Contact support to learn more about the available experimental features.
plugins
Default: true
Whether or not to enable automatic instrumentation of external libraries using the built-in plugins.
DD_TRACE_DISABLED_PLUGINS
A comma-separated string of integration names automatically disabled when tracer is initialized. Environment variable only e.g. DD_TRACE_DISABLED_PLUGINS=express,dns.
logLevel
Environment variable: DD_TRACE_LOG_LEVEL
Default: debug
A string for the minimum log level for the tracer to use when debug logging is enabled, e.g. error, debug.

Further Reading