Improving AppSignal, one deploy at a time.

Jul 04, 2024

Fix same body in different events



  • Fix different spans of the same category incorrectly being reported with the same body.

View the Node.js package v3.4.8 changelog for more information.

Jun 20, 2024

OpenTelemetry dependency updates



  • Update OpenTelemetry dependencies.

View the Node.js package v3.4.7 changelog for more information.

Jun 14, 2024

Fix inaccurate span close times


Fix an issue where a later span close time than accurate, and therefore a longer span duration, is reported to AppSignal under certain circumstances.

View the Node.js package v3.4.6 changelog for more information.

Jun 12, 2024

Automatic BullMQ instrumentation and other improvements


Automatic BullMQ instrumentation

Add BullMQ support through the @appsignal/opentelemetry-instrumentation-bullmq instrumentation. AppSignal will automatically instrument the use of BullMQ in your application.

Calls to functions that enqueue jobs, such as Queue.add and others, will be instrumented as an event in the event timeline for the performance sample in which it takes place.

When a BullMQ Worker processes a job, this will result in a performance sample in the background namespace.


  • Add basic OpenTelemetry messaging support. This adds support for any OpenTelemetry instrumentation that complies with the OpenTelemetry Semantic Conventions specification for messaging.


  • Rename the hostname tag, which contains the host of the URI that an HTTP request was made against, to request_host. This fixes an issue where the hostname tag would later be internally overriden to the hostname of the machine processing the request, but notifications would still be emitted containing the previous hostname value.

  • Improve the amqlib instrumentation by parsing it like other messaging spans following the OpenTelemetry messaging spec.


  • Fix an issue where Redis events are misidentified as HTTP events.

View the Node.js package v3.4.5 changelog for more information.

May 14, 2024

Instrument `fetch` and other improvements


Instrument calls to fetch in Node.js. Requests made using Node.js' global fetch, or through the underlying undici library, will be automatically instrumented and shown as events in your performance samples' event timeline.

Support Kamal-based deployments. Read the KAMAL_VERSION environment variable, which Kamal exposes within the deployed container, if present, and use it as the application revision if it is not set. This will automatically report deploy markers for applications using Kamal.

See the Node.js package 3.4.4 changelog for more information.

May 07, 2024

Add support for amqplib



Added support for amqplib. All spans containing amqplib will now have child spans related to the amqplib operations.

See the Node.js package 3.4.2 changelog for more information.

Apr 22, 2024

Add heartbeats and `ignoreLogs` config option



ignoreLogs configuration option

Add the ignoreLogs configuration option, which can also be configured as the APPSIGNAL_IGNORE_LOGS environment variable.

The value of ignoreLogs is a list (comma-separated, when using the environment variable) of log line messages that should be ignored. For example, the value "start" will cause any message containing the word "start" to be ignored. Any log line message containing a value in ignoreLogs will not be reported to AppSignal.

The values can use a small subset of regular expression syntax (specifically, ^, $ and .*) to narrow or expand the scope of lines that should be matched.

For example, the value "^start$" can be used to ignore any message that is exactly the word "start", but not messages that merely contain it, like "Process failed to start". The value "Task .* succeeded" can be used to ignore messages about task success regardless of the specific task name.


Heartbeats are currently only available to beta testers. If you are interested in trying it out, send an email to!

Add heartbeats support. You can send heartbeats directly from your code, to track the execution of certain processes:

import { heartbeat } from "@appsignal/nodejs"; function sendInvoices() { // ... your code here ... heartbeat("send_invoices"); }

You can pass a function to heartbeat, to report to AppSignal both when the process starts, and when it finishes, allowing you to see the duration of the process:

import { heartbeat } from "@appsignal/nodejs"; function sendInvoices() { heartbeat("send_invoices", () => { // ... your code here ... }); }

If an exception is raised within the function, the finish event will not be reported to AppSignal, triggering a notification about the missing heartbeat. The exception will bubble outside of the heartbeat function.

If the function passed to heartbeat returns a promise, the finish event will be reported to AppSignal if the promise resolves. This means that you can use heartbeats to track the duration of async functions:

import { heartbeat } from "@appsignal/nodejs"; async function sendInvoices() { await heartbeat("send_invoices", async () => { // ... your async code here ... }); }

If the promise is rejected, or if it never resolves, the finish event will not be reported to AppSignal.


Appsignal.stop() must be awaited

Appsignal.stop() now returns a promise. For your application to wait until AppSignal has been gracefully stopped, this promise must be awaited:

import { Appsignal } from "@appsignal/nodejs"; await Appsignal.stop(); process.exit(0);

In older Node.js versions where top-level await is not available, terminate the application when the promise is settled:

import { Appsignal } from "@appsignal/nodejs"; Appsignal.stop().finally(() => { process.exit(0); });

See the Node.js package 3.4.0 changelog for more information.

Mar 22, 2024

Add CPU count configuration option


Implement CPU count configuration option. Use it to override the auto-detected, cgroups-provided number of CPUs that is used to calculate CPU usage percentages.

To set it, use the the cpuCount configuration option or the APPSIGNAL_CPU_COUNT environment variable.

Mar 22, 2024

Fix performance incidents in Next.js 14


Fix UNKNOWN HTTP method in Next.js 14 performance incidents.

See the Node.js 3.3.3 package changelog for more information.

Mar 21, 2024

Don’t evaluate environment variable values to read configuration


In previous versions of the Node.js integration, environment variables were evaluated to read their values. This version instead parses them based on their expected values.

Mar 06, 2024

Improved container CPU metrics and histogram support



  • Add histogram support to the OpenTelemetry HTTP server. This allows OpenTelemetry-based instrumentations to report histogram data to AppSignal as distribution metrics.


  • Breaking change: Normalize CPU metrics for cgroups v1 systems. When we can detect how many CPUs are configured in the container's limits, we will normalize the CPU percentages to a maximum of 100%. This is a breaking change. Triggers for CPU percentages that are configured for a CPU percentage higher than 100% will no longer trigger after this update. Please configure triggers to a percentage with a maximum of 100% CPU percentage.
  • Support fractional CPUs for cgroups v2 metrics. Previously a CPU count of 0.5 would be interpreted as 1 CPU. Now it will be correctly seen as half a CPU and calculate CPU percentages accordingly.
  • f99d4c5 patch - Update bundled trusted root certificates.


  • Fix (sub)traces not being reported in their entirety when the OpenTelemetry exporter sends one trace in multiple export requests. This would be an issue for long running traces, that are exported in several requests.

See the Node.js 3.2.0 package changelog for more information.

Mar 06, 2024

Apollo Gateway Support



  • Added support for Apollo Federation Gateways. Queries sent to the supergraph will now be instrumented.

See the Node.js 3.3.0 package changelog for more information.

Feb 07, 2024

OpenTelemetry metrics extractor



  • OpenTelemetry instrumentations that emit metrics are now automatically extracted and reported to AppSignal. The metric provider is also globally available for you to send custom metrics using OpenTelemetry. Only gauges and counters are supported at the moment.


  • An issue with boolean options not being correctly parsed in the appsignal configuration file.
  • An issue with MySQL queries with leading type indicators not being correctly sanitized.

See the Node.js 3.1.0 package changelog for more information.

Jan 15, 2024

Fix Alpine Linux disk usage metrics



  • When the AppSignal log level is set to "trace". Additional information from the OpenTelemetry instrumentations is now logged.


  • Fix disk usage returning a Vec with no entries on Alpine Linux when the df --local command fails.


  • Remove the appsignal_set_host_gauge and appsignal_set_process_gauge extension functions. These functions were already deprecated and did not report any metrics.


  • Fix the demo sample recognition. Demo samples didn't show the helpful explanation box in the UI, because the demo_sample tag was set incorrectly as an attribute.

See the Node.js 3.0.30 package changelog for more information.

Dec 07, 2023

Update OpenTelemetry dependencies



  • Update OpenTelemetry dependencies. This fixes a known issue with Next.js and webpack compatibility and includes other fixes.

See the Node.js 3.0.29 package changelog for more information.

Dec 06, 2023

Fix Koa error metrics and Alpine Linux disk metrics



  • Remove route tag from HTTP server spans. Since the span will already have the route attribute as part of its name, the tag is redundant.

  • Filter more disk mountpoints for disk usage and disk IO stats. This helps reduce noise in the host metrics by focussing on more important mountpoints.

    The following mountpoint are ignored. Any mountpoint containing:

    • /etc/hostname
    • /etc/hosts
    • /etc/resolv.conf
    • /snap/
    • /proc/


  • Fix an issue where the method tag extracted from an incoming HTTP request span would be overriden with the method used for an outgoing HTTP request span.
  • Support disk usage reporting (using df) on Alpine Linux. This host metric would report an error on Alpine Linux.
  • When a disk mountpoint has no inodes usage percentage, skip the mountpoint, and report the inodes information successfully for the inodes that do have an inodes usage percentage.
  • Fix missing error metrics for the error rate and error count graphs in some scenarios, like with Koa apps.

See the Node.js 3.0.27 package changelog for more information.

Dec 06, 2023

Node.js Python 3.12 compatibility



  • Update the diagnose tool URLs printed by the CLI and package to the new location in our documentation.
  • Fix compatibility issue with Node.js's node-gyp package and Python 3.12.0. Python 3.12.0 removed a package called "distutils", causing the extension to fail to install. Upgrade the node-gyp package with the fix for this issue.

See the Node.js 3.0.28 package changelog for more information.

Nov 21, 2023

CPU stats normalization for cgroups v2



  • CPU usage is now normalized to the number of CPUs available to the container. This means that a container with 2 CPUs will have its CPU usage reported as 50% when using 1 CPU instead of 100%. This is a breaking change for anyone using the cpu probe.
    • If you have CPU triggers set up based on the old behaviour, you might need to update those to these new normalized values to get the same behaviour. Note that this is needed only if the AppSignal integration package you're using includes this change.

See the Node.js package 3.0.26 changelog for more information.

Nov 06, 2023

Custom OpenTelemetry SDK initialization and other improvements



Add initializeOpentelemetrySdk configuration option

The initializeOpentelemetrySdk configuration option allows those who would rather take control of how OpenTelemetry is initialised in their application to skip AppSignal's initialization of the OpenTelemetry SDK.

Additionally, add an opentelemetryInstrumentations method on the client, which returns AppSignal's default OpenTelemetry instrumentations, already configured to work correctly with AppSignal. The provided list of instrumentations will follow the additionalInstrumentations and disableDefaultInstrumentations config options, if those are set.

This is not the recommended way to use AppSignal for Node.js. Only use this config option and this method if you're really sure that you know what you're doing.

When initialising OpenTelemetry, it is necessary to add the AppSignal span processor in order for data to be sent to AppSignal. For example, using the OpenTelemetry SDK:

import { SpanProcessor, Appsignal } from "@appsignal/nodejs"; // or: const { SpanProcessor, Appsignal } = require("@appsignal/nodejs") const sdk = new NodeSDK({ spanProcessor: new SpanProcessor(Appsignal.client) instrumentations: Appsignal.client.opentelemetryInstrumentations() }); sdk.start()

The above snippet assumes that the AppSignal client has been initialised beforehand.

When making use of this config option, the OpenTelemetry instrumentations must be configured in the same way as it is done in the AppSignal integration. In the above snippet, the instrumentations property in the OpenTelemetry SDK is set to the AppSignal client's list of OpenTelemetry instrumentations, which are configured to work correctly with AppSignal.

Add setSqlBody tracing helper

The setSqlBody tracing helper sets the body attribute on a span that contains a SQL query. When using this helper the given SQL query will be sanitized, reducing the chances of sending sensitive data to AppSignal.

import { setSqlBody } from "@appsignal/nodejs"; // Must be used in an instrumented context -- e.g. an Express route setSqlBody("SELECT * FROM users WHERE 'password' = 'secret'"); // Will be stored as: "SELECT * FROM users WHERE 'password' = ?"

When the setBody helper is also used, the setSqlBody overwrites the setBody attribute. More information about our tracing helpers can be found in our documentation.


  • Print more path details in the diagnose CLI output. It will now print details like if a path exists, the ownership of a path and if it's writable or not to help debug issues locally.
  • Add an exponential backoff to the retry sleep time to bind to the StatsD, NGINX and OpenTelemetry HTTP ports. This gives the agent a longer time to connect to the ports if they become available within a 4 minute window.
  • Logs from the agent and extension now use a more consistent format for spans and transactions.
  • The "debug" log level should now be enough for debugging most support issues.

See the Node.js package 3.0.25 changelog for more information.

Oct 20, 2023

Agent updated and Fastify v5 compatibility



  • Updated the AppSignal agent with the following features:

    • Add memory_in_percentages and swap_in_percentages host metrics that represent metrics in percentages.
    • Ignore /snap/ disk mount points.
    • Fix the issue with the open span count in logs being logged as a negative number.
    • Fix the agent's TCP server getting stuck when two requests are made within the same fraction of a second.
  • Updated the OpenTelemtry Fastify integration to be compatible with Fastify v5.

See the Node.js package 3.0.24 changelog for more information.

Start your free trial

Don’t let the bad bugs bite. Try AppSignal for free.

AppSignal offers a 30-day free trial, no credit card is required. All features are available in all plans. Start monitoring your application in just a few clicks!