Changelog

Improving AppSignal, one deploy at a time.

Oct 06, 2026

Fix cumulative metrics from forked processes

Python1.9.1

Fixed

  • Metrics are reported correctly when several processes of your application send the same metric, including processes forked after AppSignal starts. Each process reports under a service.instance.id and a process.pid of its own, which is what AppSignal uses to tell them apart.

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

Oct 02, 2026

Improve logging support

Python1.9.0

Added

  • AppSignal warns when your application attaches the OpenTelemetry log handler from opentelemetry.sdk._logs, which is deprecated and is removed in a future release of the OpenTelemetry SDK. Its replacement is in opentelemetry.instrumentation.logging.handler.

Changed

  • A log message that is not a string, such as the dictionary in logger.info({"message": "Order placed", "order_id": 1234}), is sent as text by the logging instrumentation. Pass the structured values in the extra argument to send a structured log line:

    Python
    logger.info("Order placed", extra={"order_id": 1234})

    The OpenTelemetry logs API sends a structured log line from a dictionary body.

Removed

  • AppSignal for Python no longer supports Python 3.8 and 3.9, requiring Python 3.10 or newer.

Fixed

  • Ensure that data sent for check-ins, to an external collector, or via the agent always honors the http_proxy configuration option and the APPSIGNAL_HTTP_PROXY environment variable first, falling back to the HTTP_PROXY and HTTPS_PROXY environment variables if the configuration option is unset, and always ignores the NO_PROXY environment variable.

  • Fix local traffic to the AppSignal agent being incorrectly sent to an external proxy when the http_proxy configuration option is set in agent mode.

  • Improve handling of the extension internal queue when full.

  • Fix issues in the extension that lead to gaps in data reporting.

  • Logs are now still sent after your application configures the logging module. logging.config.dictConfig(), logging.config.fileConfig() and logging.basicConfig() keep AppSignal's log handler attached, so a configuration that sets its own handlers on the root logger, such as Django's LOGGING setting, will now send its logs to AppSignal as well.

    If you have manually added an OpenTelemetry log handler to your LOGGING setting or to the root logger elsewhere, it should now be removed, as AppSignal's handler will now send those log lines as well, causing them to be sent twice. AppSignal will log a warning when it detects a redundant OpenTelemetry handler.

  • When disable_default_instrumentations is used to disable the logging instrumentation, prevent the log lines emitted internally by AppSignal from propagating to a manually configured OpenTelemetry handler in the root logger.

  • logging.basicConfig() applies the log level it is given. An application that calls it with a level below WARNING, such as logging.INFO, starts sending its log lines at that level.

  • Fix an issue where AppSignal would configure redundant handlers when starting again in a forked process, such as when a Celery worker calls appsignal.start() from the worker_process_init signal.

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

Sep 23, 2026

Collector mode fixes and improvements

Python1.8.0

Added

  • Add the set_request_payload, set_request_query_parameters and set_function_parameters helpers. Each one reports a kind of parameters that collector mode keeps apart, so the option that filters that kind, and the one that suppresses it, apply to what you report:

    Python
    from appsignal import set_function_parameters
     
    set_function_parameters({"user_id": 123})

    In collector mode, the set_params helper is now deprecated, and it reports the request payload. It does not say which kind of parameters it is given, so use set_request_payload, set_request_query_parameters or set_function_parameters instead. AppSignal warns the first time it is used.

    In agent mode there is one place to report parameters, so all four helpers report to it, the last one called is the one that takes effect, and set_params is not deprecated.

  • Report the response headers listed in the response_headers configuration option when a collector is used.

Changed

  • The filter_parameters and send_params configuration options are deprecated in collector mode. Use filter_request_payload, filter_function_parameters and filter_request_query_parameters to filter different kinds of parameters, and send_request_payload, send_request_query_parameters and send_function_parameters to choose which kinds of parameters to report.

    AppSignal warns about the deprecated options at startup, and names the value to set for each option that replaces them.

    In agent mode, filter_parameters and send_params still apply to every kind of parameter, and the new options have no effect.

  • In collector mode, the filter_request_payload, filter_function_parameters and filter_request_query_parameters configuration options now fall back to the value of filter_parameters, and the send_request_payload, send_request_query_parameters and send_function_parameters options fall back to the value of send_params. An application that filtered parameters or turned parameter reporting off keeps doing so after it switches to a collector, without having to set the new options.

    Setting one of the new options still overrides the value that would be derived for it.

  • The appsignal diagnose report now names where each configuration option's value came from. An option set from more than one source lists the value from each source.

  • In collector mode, the Django and Flask instrumentation now reports a request's query string as query parameters rather than as a request payload. So filter_request_query_parameters and send_request_query_parameters apply to a query string, and filter_request_payload and send_request_payload apply to a Django request's body.

    In agent mode, a Flask application's query parameters are now reported on their own, rather than nested under an args key.

Fixed

  • Report a request or response header whose name is written with capital letters or underscores in the request_headers or response_headers configuration option, such as Content-Type or content_type. The collector matches these names against the ones it receives the headers under, which follow the OpenTelemetry semantic convention: the header's own name, lowercased, with its dashes kept. A name written any other way matched nothing, so the header was left out.

    The set_header helper names a header the same way when a collector is in use.

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

Sep 15, 2026

Add `is_active` attribute

Python1.7.2

Added

  • Add an is_active attribute to the AppSignal client. It tells you whether AppSignal is configured to start, so you can use it to only run code that makes sense when AppSignal is active:

    Python
    from appsignal import Appsignal
     
    appsignal = Appsignal(name="My app name", push_api_key="my-push-api-key", active=True)
     
    if appsignal.is_active:
        # Only runs when AppSignal is active

    Before this change, the only way to check this was to read the client's private configuration object.

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

Sep 09, 2026

Python package v1.7.1

Python1.7.1

Fixed

  • Fix the sanitization of function arguments in SQL statements.

    Before this release, SQL sanitization of function arguments stripped out parts of the SQL statement after the function argument list.

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

Sep 08, 2026

Support host metrics in collector mode

Python1.7.0

Added

  • Add an ignore_logs option, which takes a list of patterns. Log lines that match any of the patterns are not sent to AppSignal. Set it with the APPSIGNAL_IGNORE_LOGS environment variable, or as an option on the Appsignal client. Read our ignore logs guide for the patterns that are supported.

    This option only has an effect in collector mode, because that is the only mode in which this package sends logs.

  • Report host metrics, NGINX metrics, StatsD metrics and environment metadata when using a collector. These are sent by the AppSignal agent, which now runs alongside the collector instead of being replaced by it.

  • Detect the revision that is being deployed from the environment variables set by Heroku, Render, Kamal and Scalingo: HEROKU_SLUG_COMMIT, RENDER_GIT_COMMIT, KAMAL_VERSION and CONTAINER_VERSION. Applications deployed on those platforms now report their revision without setting the revision configuration option.

    This affects collector mode, where deploys were reported as unknown when the revision was not configured.

Changed

  • Report app instead of unknown as the OpenTelemetry service name when the service_name configuration option is not set and collector mode is in use.
  • On Heroku, report the name of the dyno as the hostname. Before, the hostname of the container that the dyno runs in was reported, so applications running on Heroku will see their data reported under a new host name.
  • Update the agent to handle high traffic apps. On high-traffic apps that would exceed the maximum accepted internal payload size, send data to the Push API more frequently.

Fixed

  • An option set to None when initializing the Appsignal client no longer replaces a value that AppSignal detected itself. For example, Appsignal(hostname=None) now reports the detected hostname, instead of reporting no hostname at all. Options that AppSignal does not detect are unchanged: setting request_headers to None, for example, still turns off request header collection.
  • In collector mode, backtrace lines from your own application are now shown as paths relative to your application's root, and are recognized as your application's code.
  • Send the traces, metrics and logs that are still buffered when stop is called, instead of dropping them.
  • Apply the ca_file_path and http_proxy configuration options to the data sent to a collector. Before this change both options were only applied to the data sent by the agent, so a custom certificate authority file or a proxy had no effect when a collector was used.
  • Stop running minutely probes when stop is called. Before this change they kept running and kept reporting metrics after AppSignal was stopped.

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

Jun 23, 2026

Fixes for host metrics and collector mode

Python1.6.5

Changed

  • Bundled certificates have been updated.

  • Use system-specific operation name in messaging span names.

    When messaging.operation.name is present (e.g. Queue.add), it is used directly as the span name prefix: Queue.add (myQueue). When only the generic messaging.operation.type is available (e.g. send), the word "message" is added for clarity: send message (myQueue).

Fixed

  • Continue reporting non-disk host metrics when a mount is frozen.

  • Emit the appsignal.action_name attribute instead of appsignal.root_name when set_root_name is used in collector mode. The collector only reads the action name from appsignal.action_name, so root names set this way were previously ignored, falling back to the OpenTelemetry span name.

  • Update the OpenTelemetry span name directly when set_name is used in collector mode, instead of setting the appsignal.name attribute. The collector uses the span name as-is, so names set this way were previously ignored.

  • Emit the db.system.name and db.query.text semantic-convention attributes instead of appsignal.sql_body when set_sql_body is used in collector mode. This fixes SQL query sanitization when using the experimental collector mode.

  • Fix host-metrics leaking zombie [timeout] processes in Alpine linux containers.

    Before this release AppSignal agent relied on a proper init process that reaps child processes killed by system timeout. Now the agent terminates and reaps unresponsive child processes in host-metrics collection and a subreaper is no longer required.

  • Emit request parameters and headers using the attribute names the collector recognizes when in collector mode. set_params now emits appsignal.request.payload instead of appsignal.request.parameters, and set_header uses the http.request.header prefix instead of appsignal.request.headers. The collector and server do not recognize the previous names, so this sample data was previously dropped in collector mode.

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

Oct 09, 2025

External collector and logging support

Python1.6.0

Added

  • Support logging through the external collector experimental feature. When the collector_endpoint configuration option is provided, the OpenTelemetry stack will be automatically configured to instrument logs.

    The logging module will be automatically instrumented, such that log lines emitted through loggers that propagate to the root logger will be automatically sent to AppSignal. To disable this behaviour, add "logging" to the disable_default_instrumentations configuration option list.

  • Support usage with external collector. When the collector_endpoint configuration option is provided, instead of booting up the AppSignal agent bundled with the application, the OpenTelemetry stack will be configured to send data to the given collector.

    This is an experimental feature. The following functionality is not currently supported when using the collector:

    • NGINX metrics
    • StatsD metrics
    • Host metrics

    Some configuration options are only supported when using the agent or when using the collector. A warning will be emitted if a configuration option that is only supported by one is set while using the other.

View the Python package v1.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.

Dec 20, 2024

Improve query sanitisation performance and other improvements

Python1.4.1

Added

  • Set the app revision config option for Scalingo deploys automatically. If the CONTAINER_VERSION system environment variable is present, it will use used to set the revision config option automatically. Overwrite it's value by configuring the revision config option for your application.

Fixed

  • Fix a performance issue when sanitising INSERT INTO ... VALUES queries.

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

Oct 09, 2024

Add support for heartbeat check-ins

Python1.4.0

Added

  • Add support for heartbeat check-ins.

    Use the appsignal.check_in.heartbeat function to send a single heartbeat check-in event from your application. This can be used, for example, in your application's main loop:

    Python
    from appsignal.check_in import heartbeat
     
    while True:
      heartbeat("job_processor")
      process_job()

    Heartbeats are deduplicated and sent asynchronously, without blocking the current thread. Regardless of how often the .heartbeat function is called, at most one heartbeat with the same identifier will be sent every ten seconds.

    Pass continuous=True as the second argument to send heartbeats continuously during the entire lifetime of the current process. This can be used, for example, after your application has finished its boot process:

    Python
    def main():
      start_app()
      heartbeat("my_app", continuous=True)

Changed

  • Change the primary download mirror for integrations.
  • Send check-ins concurrently. When calling appsignal.check_in.cron, instead of blocking the current thread while the check-in events are sent, schedule them to be sent in a separate thread.

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

$appsignal install

Make your next crash make sense.

Free for 30 days. No credit card. Two-minute install.