Changelog

Improving AppSignal, one deploy at a time.

Mar 06, 2025

Ignore empty environment variables for config options

Added

  • Add the appsignal.config.otp_app resource attribute config option. When set for Elixir applications, we will use the OTP app name to detect which stacktrace lines originate from the app, and which lines are from dependencies.

Changed

  • Consider empty environment variables as unset. From now on, an environment variable that's set to an empty string is considered unset when reading the collector configuration from system environment variables.

    In the example below, the environment variable will be considered unset. It will not fail on parsing an empty string as a number and set the default HTTP port instead.

    Shell
    APPSIGNAL_HTTP_PORT=""

    This behavior is changed for the following config options:

    • APPSIGNAL_CPU_COUNT
    • APPSIGNAL_ENABLE_HOST_METRICS
    • APPSIGNAL_FILES_WORLD_ACCESSIBLE
    • APPSIGNAL_HOSTNAME
    • APPSIGNAL_HTTP_PORT
    • APPSIGNAL_LOG_LEVEL
    • APPSIGNAL_PUSH_API_ENDPOINT
    • APPSIGNAL_PUSH_API_KEY
    • APPSIGNAL_RUNNING_IN_CONTAINER
  • In the appsignal/collector Docker image we will now listen to the PORT environment variable if it's set, and use it to configure the HTTP server's port.

    If the APPSIGNAL_HTTP_PORT environment variable is also set in addition to the PORT environment variable, it will read from the APPSIGNAL_HTTP_PORT environment variable.

This release can be installed through our collector packages and Docker image.

Mar 06, 2025

Improve Sidekiq 8 support

Ruby4.5.3

Changed

  • Specify stricter Rack version requirement. The Ruby gem relies on the Rack::Events constant which was introduced in Rack 2. Update our version requirement to require Rack 2 or newer.

Fixed

  • Fix the queue time reporting for Sidekiq 8 jobs. It would report high negative values for the queue time with Sidekiq 8.

View the Ruby gem v4.5.3 changelog for more information.

Mar 05, 2025

Container host metrics and bug fixes

Changed

  • Log debug messages and warnings from the config initialization. Previously, any debug messages or warnings that should have been logged upon config initialization where not logged. Now, all config log messages are logged, including debug messages even if the log level is configured as info. This may be improved in the future.
  • Shut down the collector in case of an internal error. We've seen problems where internal channels close and it causes the collector to stop reporting data. In this case, log what happens and shut down.

Fixed

  • Disable the host metrics only on the collector container, by default. When the collector is installed on a container alongside the app, it will collect container host metrics.

This release can be installed through our collector packages and Docker image.

Mar 03, 2025

Filter OpenTelemetry query parameters span attributes

Added

  • Filter query parameters in the url.query span attribute. When an url.query attribute contains an URL encoded query parameter we will filter out the keys configured in the appsignal.config.filter_request_query_parameters resource attribute.

    In the situation that a url.query span attribute has the value password=secret&some_param=some_value, and the appsignal.config.filter_request_query_parameters resource attribute is configured with ["password"], the url.query span attribute will be stored as password=[FILTERED]&some_param=some_value.

    If no appsignal.request.query_parameters span attribute is set, we will store the query parameters as a JSON map on this attribute. For example:

    JSON
    { "password": "[FILTERED]", "some_param": "some_value" }

Changed

  • Rename the working_dir_path config option to working_directory_path. This names matches with the naming in our other tools and integrations.

    This is a breaking change: With this change the working_dir_path config option will no longer work.

  • When the appsignal.config.send_request_query_parameters resource attribute config option value is set to false, we will remove the url.query span attribute from spans.

This release can be installed through our collector packages and Docker image.

Feb 27, 2025

Cumulative histogram support and improved query sanitization

Added

  • Sanitize database query attributes following the OpenTelemetry Semantic Conventions 1.30 database specification. We now sanitize SQL queries in the db.query.text attribute and Redis queries in the db.operation.name attribute.
  • Add support for cumulative histograms. The previous known state of a cumulative histogram will be stored and its delta will be calculated, in order to send it to AppSignal as a delta histogram.

This release can be installed through our collector packages and Docker image.

Feb 24, 2025

More Heroku errors from logs

Added

We now detect all Hxx router and Rxx resource errors from Heroku logs by parsing logfmt messages instead of using a single regex pattern.

Feb 24, 2025

Elixir package v2.14.0

Elixir2.14.0

Changed

  • Update bundled trusted root certificates

Removed

  • Remove the OpenTelemetry beta feature in favor of the new AppSignal collector. If you are using the AppSignal agent to send OpenTelemetry data in our public beta through the /enriched endpoint on the agent's HTTP server, please migrate to the collector to continue using the beta. The collector has a much better implementation of this feature for the beta.

Fixed

  • Fix an issue where the AppSignal agent fails to download during installation, by restricting the Hackney dependency to version 1.21.0 or lower.

View the Elixir package v2.14.0 changelog for more information.

Feb 24, 2025

Invalid Sample Data Notifications

Added

Users now receive notifications when sending a sample or span with improperly formatted data, such as non-JSON parameters or unsupported keys.

Feb 24, 2025

Node.js package v3.6.0

Node.js3.6.0

Changed

  • Update span recognition following the OpenTelemetry Semantic Conventions 1.30 database specification. We now also sanitize SQL queries in the db.query.text attribute and Redis queries in the db.operation.name attribute.
  • Bump the log message when no span is active and one of our sample data helpers are used like setParams, setSessionData, setCustomData, etc from debug to warning.
  • Update bundled trusted root certificates

Removed

  • Remove the OpenTelemetry beta feature in favor of the new AppSignal collector. If you are using the AppSignal agent to send OpenTelemetry data in our public beta through the /enriched endpoint on the agent's HTTP server, please migrate to the collector to continue using the beta. The collector has a much better implementation of this feature for the beta.

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

Feb 24, 2025

Python package v1.5.0

Python1.5.0

Changed

  • Update span recognition following the OpenTelemetry Semantic Conventions 1.30 database specification. We now also sanitize SQL queries in the db.query.text attribute and Redis queries in the db.operation.name attribute.
  • Update bundled trusted root certificates

Removed

  • Remove the OpenTelemetry beta feature in favor of the new AppSignal collector. If you are using the AppSignal agent to send OpenTelemetry data in our public beta through the /enriched endpoint on the agent's HTTP server, please migrate to the collector to continue using the beta. The collector has a much better implementation of this feature for the beta.

Fixed

  • Fix an issue where calling appsignal.stop() after sending check-in events would leave a dangling thread, stopping the application from shutting down correctly.

View the Python package v1.5.0 changelog for more information.

Feb 24, 2025

Load appsignal.rb config for Capistrano tasks

Ruby4.5.2

Fixed

  • Validate application environment sources so nil values and empty strings are not valid app environments. Symbols are now always cast to a String before set as the application environment.

    Ruby
    # These will no longer be accepted as valid app environments Appsignal.configure("") Appsignal.configure(" ")
  • Fix Capistrano version 2 and 3 support when using an appsignal.rb config file. It will now pick up the config from appsignal.rb file.

View the Ruby gem v4.5.2 changelog for more information.

Feb 21, 2025

Public endpoint custom markers

Added

We've added an additional endpoint for creating Custom markers on our public endpoint API.

This is an alternative to our application API, which uses Personal Access Tokens for authentication.

The public endpoint API uses the push- or front-end keys, making it easier to create custom markers without exposing an API key with access to application data.

You can find the documentation here: Public endpoint API - Custom Markers

Feb 21, 2025

Report custom markers directly from the Ruby gem

Ruby4.5.0

Added

  • Add a helper to create custom markers from the Ruby gem.

    Create a custom marker (a little icon shown in the graph timeline on AppSignal.com) to mark events on the timeline.

    Create a marker with all the available options:

    Ruby
    Appsignal::CustomMarker.report( # The icon shown on the timeline :icon => "🎉", # The message shown on hover :message => "Migration completed", # Any time object or a string with a ISO8601 valid time is accepted :created_at => Time.now )

    Create a marker with just a message:

    Ruby
    Appsignal::CustomMarker.report( :message => "Migration completed", )

    The default icon is the 🚀 icon. The default time is the time the request is received by our servers.

Removed

  • Remove the OpenTelemetry beta feature in favor of the new AppSignal collector. If you are using the AppSignal agent to send OpenTelemetry data in our public beta through the /enriched endpoint on the agent's HTTP server, please migrate to the collector to continue using the beta. The collector has a much better implementation of this feature for the beta.

View the Ruby gem v4.5.0 changelog for more information.

Feb 20, 2025

OpenTelemetry compatability update

Changed

  • Update span recognition following the OpenTelemetry Semantic Conventions 1.30 database specification. We now also sanitize SQL queries in the db.query.text attribute and Redis queries in the db.operation.name attribute.

Removed

  • Remove the OpenTelemetry beta feature in favor of the new AppSignal collector. If you are using the AppSignal agent to send OpenTelemetry data in our public beta through the /enriched endpoint on the agent's HTTP server, please migrate to the collector to continue using the beta. The collector has a much better implementation of this feature for the beta.

This release can be installed through our standalone agent packages and as a Docker image.

Feb 19, 2025

Add data filtering options and host metrics

Added

  • Add the appsignal.config.app_path resource attribute config option. In the future this will be used to sanitize backtrace/stacktrace lines and detect which lines originate from the instrumented app and which lines originate from frameworks/libraries/dependencies/etc.

  • Add the hostname config option to allow customization of the hostname reported with the host metrics. By default, it will try to determine the hostname from the host itself. On Heroku it will read from the DYNO environment variable.

  • Add CPU count cpu_count config 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 APPSIGNAL_CPU_COUNT environment variable or the cpu_count configuration option in the configuration file.

    TOML
    # /etc/appsignal-collector.conf # These value formats are supported: cpu_count = 1 cpu_count = 2.5 cpu_count = 4
  • Collect host metrics from the machine where the collector is running. This is disabled by default when the collector is running in a container. If it's not, it's enabled by default.

    Use the APPSIGNAL_ENABLE_HOST_METRICS env var or enable_host_metrics option to true to enable it and to false to disable it. If this config option is set, it overrides the defaults.

  • Add resource attributes for config options to not send request query parameters, request session data and function parameters at all. If these options are set to false, their respective metadata attributes are removed from the span attributes.

    • appsignal.config.send_request_query_parameters: default is true, if set to false, the appsignal.request.query_parameters attribute is removed.
    • appsignal.config.send_request_payload: default is true, if set to false, the appsignal.request.payload attribute is removed.
    • appsignal.config.send_request_session_data: default is true, if set to false, the appsignal.request.session_data attribute is removed.
    • appsignal.config.send_function_parameters: default is true, if set to false, the appsignal.function.parameters attribute is removed.

    These options are for when the deny list appsignal.config.filter_<type> options are not enough and all data needs to be removed.

  • Add the running_in_container config option. Use it to override the automatic detection of containers. This determines the method of reading host metrics. Only set this when the reported host metrics seem wrong.

    To set it, use the APPSIGNAL_RUNNING_IN_CONTAINER environment variable or the running_in_container configuration option in the configuration file.

    Shell
    # These value formats are supported: export APPSIGNAL_RUNNING_IN_CONTAINER="true" export APPSIGNAL_RUNNING_IN_CONTAINER="false"
    TOML
    # /etc/appsignal-collector.conf # These value formats are supported: running_in_container = true running_in_container = false
  • Add a resource attribute for a config option to filter function parameters. Configure the appsignal.config.filter_function_parameters resource attribute deny list in OpenTelemetry with a list function parameter keys to filter out. The parameters are recursively filtered, so any nested objects will also be filtered.

    With this config:

    Shell
    appsignal.config.filter_function_parameters = ["email", "secret"]

    The function parameters, set in the appsignal.function.parameters span attribute, are filtered. The appsignal.function.parameters span attribute value needs to be a valid JSON object for it to be filtered.

  • Add a resource attribute for a config option to filter request query parameters. Configure the appsignal.config.filter_request_query_parameters resource attribute deny list in OpenTelemetry with a list request query parameter keys to filter out. The parameters are recursively filtered, so any nested objects will also be filtered.

    With this config:

    Shell
    appsignal.config.filter_request_query_parameters = ["password", "secret"]

    The request query parameters, set in the appsignal.request.query_parameters span attribute, are filtered. The appsignal.request.query_parameters span attribute value needs to be a valid JSON object for it to be filtered.

  • Add a resource attribute for a config option to filter request headers. Configure the appsignal.config.request_headers resource attribute allow list in OpenTelemetry to a list of header names to keep. All other headers are removed.

    Shell
    # Given this config: appsignal.config.request_headers = ["accept", "date"] # Results in these headers as span attributes to be stored on the span http.request.header.accept http.request.header.date

    By default the headers listed below are included. Setting the appsignal.config.request_headers resource attribute overrides this default. If you want to include them, you need to list them again. To include no headers, set the resource attribute value to an empty array.

    • content-length
    • accept
    • accept-charset
    • accept-encoding
    • accept-language
    • cache-control
    • connection
    • range
    • host
  • Add a resource attribute for a config option to filter request payloads. Configure the appsignal.config.filter_request_payload resource attribute deny list in OpenTelemetry with a list request payload keys to filter out. The parameters are recursively filtered, so any nested objects will also be filtered.

    With this config:

    Shell
    appsignal.config.filter_request_payload = ["password", "secret"]

    The request payload, set in the appsignal.request.payload span attribute, are filtered. The appsignal.request.payload span attribute value needs to be a valid JSON object for it to be filtered.

  • Add a resource attribute for a config option to filter response headers. Configure the appsignal.config.response_headers resource attribute allow list in OpenTelemetry to a list of header names to keep. All other headers stored by HTTP client instrumentations are removed.

    Shell
    # Given this config: appsignal.config.request_headers = ["accept", "date"] # Results in these headers as span attributes to be stored on the span http.request.header.accept http.request.header.date

    By default the headers listed below are included. Setting the appsignal.config.response_headers resource attribute overrides this default. If you want to include them, you need to list them again. To include no headers, set the resource attribute value to an empty array.

    • content-length
    • accept
    • accept-charset
    • accept-encoding
    • accept-language
    • cache-control
    • connection
    • range
    • host
  • Add a resource attribute for a config option to filter request session data. Configure the appsignal.config.filter_request_session_data resource attribute deny list in OpenTelemetry with a list request session data keys to filter out. The session data is recursively filtered, so any nested objects will also be filtered.

    With this config:

    Shell
    appsignal.config.filter_request_session_data = ["token", "secret"]

    The request session data, set in the appsignal.request.session_data span attribute, are filtered. The appsignal.request.session_data span attribute value needs to be a valid JSON object for it to be filtered.

Fixed

  • Fix an issue with the collector not shutting down when the HTTP server's port is in use and it cannot claim it. It would get stuck retrying to claim the port. It will now shut down properly when receiving a quit signal.
  • Fix value reporting of cumulative counter metrics. The conversion did not take into account metric attributes, so all metrics with the same name would be merged.
  • Fix an issue with the HTTP server not shutting down after it has started and received a quit signal. It would continue to receive requests and prevent the collector from shutting down.

This release can be installed through our collector packages and Docker image.

Feb 19, 2025

Imroved Heroku Log Severity parsing

Added

By default, the Heroku LogDrain emits all messages with an "Info" severity, and while we support overriding the severity by using custom attributes in either Logfmt or JSON format, it's not always possible to do this.

When creating (or updating) a Heroku log source, there's now an option to enable "Parse severity from a log message."

Heroku Log Parse Option

This option will attempt to parse the severity from any log message that does not contain a severity attribute, and allows you to get add-on and 3rd party logs into AppSignal with the correct severity.

You can find more information about what severity strings are parsed and how on our Heroku LogDrain documentation.

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!