# Anomaly detection Source: https://docs.appsignal.com/anomaly-detection With [Anomaly detection](https://appsignal.com/redirect-to/app?to=alerts), you can configure Triggers to send notifications when a metric value goes over or dips below a threshold value. For example: When the error rate of an application goes over 5 % or free memory dips below 100MB. Anomaly detection works by detecting changes in metric values on a minutely basis. When a threshold condition is reached, we will notify you of the new alert created by this event and notify you again when the threshold is no longer being reached. To ensure you are being alerted at a time that suits you, you can define [warm-ups and cooldowns](#warm-up-and-cooldown) to control when a new alert is opened. ## Alert states Alerts can have five different states: | State | Description | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | | Warming up | The Alert is in it's warm-up phase. You can configure per Trigger that a condition has to be true for a specified amount of time before you get alerted. | | Open | The Alert has become active because it has reached its threshold condition. | | Closed | The alert is no longer active, and has been closed. | | Cool Down | The Alert is no longer over its threshold condition but will not be ended or re-opened until the end of the cooldown duration. | | Ended | The Alert is ended. No further alert will be sent. If the triggers conditions are triggered again, a new alert will enter the warming up phase. | Alert States ### When will I be notified? After you've configured notifications, you will be notified when an alert goes into the open phase. You will be notified by any reminders you configured during that phase and when the Alert is closed. ### Email alerts Alert emails will include an overview of new alerts, reminders, and the status of other alerts that have yet to end. ## Creating and configuring triggers Anomaly detection can be configured per app in the ["Anomaly detection" section](https://appsignal.com/redirect-to/app?to=alerts) in the app navigation. By default you will see the latest alerts created by triggers that you've configured for the app. In the top navigation you can switch to the [triggers page](https://appsignal.com/redirect-to/app?to=triggers) to create new and edit existing triggers. You can create and manage Triggers from the ["Anomaly detection" section](https://appsignal.com/redirect-to/app?to=triggers) of your application's navigation menu. Creating a trigger You can configure Triggers with a variety of metrics: * Error rates * Error (absolute) counts * App throughput * Performance of actions (slow actions) * Queue time * Host metrics * CPU load * Disk I/O * Disk usage * Load averages * Memory usage * Network usage ### Warm-up and cooldown You can configure warm-up and cooldown settings for each trigger, allowing you to define the time the system waits before opening and closing an alert. ### Warm-up It's not recommended to use Anomaly detection and the Warmup feature to check if services such as hourly/daily jobs and cronjobs are running. Typically when a Trigger's threshold condition is reached, it opens an Alert; for example, the error rate is higher than 5%. When a warm-up period has been configured on the Trigger AppSignal will only open an alert once that time has passed and if the threshold trigger is still met; for example, the error rate is higher than 5% for more than 3 minutes. When a trigger has a warm-up period configured, the alert will only open once the warm-up time has passed. The threshold condition must be met for the entire warm-up period for the alert to open. AppSignal will notify you when the alert status shifts from warm-up to open. ### Cooldown Alerts opened by a Trigger are automatically closed when the threshold condition is no longer met. To avoid being overly notified, you can configure cooldown periods. If you have configured a cooldown period for a Trigger, a new alert will not be created unless the Trigger's conditions are met after the cooldown period has expired. For example: 1. An Alert is opened because the error rate is higher than 5% 2. The error rate drops, so the alert is automatically closed. 3. The trigger for the alert has a two-minute cooldown period. 4. The error rate goes above 5% again. 5. AppSignal will not create a new alert unless the error rate exceeds 5% after the cooldown period ends. ### Tags Some metrics require tags to be selected as well. For example, if you are sending a custom metric to AppSignal that has tags: ```ruby Ruby theme={null} Appsignal.set_gauge("my_metric_name", 100, :namespace => "web", :action => "hello") ``` Then while creating a Trigger for this metric you need to select tags as well. Trigger with tags ## Missing datapoints as 0 By default, Triggers assume that a data point is sent every minute. This may not be feasible in certain situations, such as incrementing a counter only if a specific action occurs. In such cases, you can use the option `"When checked, we will treat missing datapoints as a value of 0"`. Enabling this option will cause the system to assume that a missing data point has a value of zero. This will help ensure the alert closes as expected if no data is received in the next minute. ## Data processing The metrics used by triggers to create alerts are not instantly processed when the metrics are sent from your application to AppSignal. Your metrics data will go through multiple systems before it arrives at our processor. The data may also be sent from multiple servers that [send data at different intervals](/appsignal/how-appsignal-operates#agent). The processor then waits\* until all the data for a minute has arrived before processing that data and creating or updating alerts. If you experience problems with the metrics being reported by AppSignal for Anomaly detection, ensure that your application's servers are all reporting simultaneously by configuring them using [NTP](https://en.wikipedia.org/wiki/Network_Time_Protocol). Incorrect or different reported times for data sent by multiple app servers can result in Alerts never being opened or closed. You can learn more about how AppSignal processes data for Anomaly detection and what this means for the alerts in our [data life cycle documentation][data life cycle]. \*: For more information on wait time specifics, consult our [data life cycle page][data life cycle]. [data life cycle]: /appsignal/data-life-cycle.html ## Managing incidents You can view all alert incidents on the Anomaly Issues page in the AppSignal app. The Issues page displays an overview of all open alert incidents, ordered by their last occurrence, with columns for the anomaly: * Name * Status * Assignees * State * Last state change time You can also easily filter your incidents based on their [state](#alert-states). Overview of alert incidents To investigate an incident further, you can open the incident summary. Here you'll find all the tools and information needed to investigate further the anomaly triggering your alert. On the summary page, you will have access to: * **Alert information:** The metric name, alert state, and tags of the alert. * **Occurrence frequency graph:** A visual representation of the alert's occurrence. * **Incident Settings:** Ability to close the alert, set its severity, and assign it to a team member. * **Trigger Information:** The conditions required to trigger the alert. * **Latest occurrences:** A table of the most recent occurrences, with their start/end time, state, and peak value. * **Logbook:** A logbook for logging important alert information about this alert for your team or future self. * **Access to the Time Detective:** Use the Time Detective tool to view the state of your application when the alert last occurred. All of these features are easily accessible in our intuitive UI: Overview of alert incident page # Applications Source: https://docs.appsignal.com/application Applications (previously known as "sites", also referred to as "apps") are Ruby, Elixir and JavaScript front-end applications monitored by AppSignal. Every application is unique by the combination of its name and environment. A list of Applications appears on the [Application index] and in the application quick switcher. Every application has a parent [organization](/organization), which can have multiple applications. (Exception: Organizations created by the Heroku add-on only support one application.) ## Adding applications If you're just getting started with AppSignal and haven't set up your first app yet, please follow the [add a new application guide](/guides/new-application) first. 📖 Read our [add a new application guide](/guides/new-application). ## Environments An application can have multiple [environments](/appsignal/terminology#environments) as long as every environment uses the same application name. Every environment is currently listed separately on the [Application index]. * "Demo application" - development * "Demo application" - production * "Demo application" - staging * "Demo application" - test ## Namespaces Namespaces are a way to group error incidents, performance incidents from [actions](/appsignal/terminology#actions), and host metrics in your app. By default AppSignal provides three namespaces: the "web", "background" and "frontend" namespaces. You can add your own namespaces to separate parts of your app like the API or Admin panel. Namespaces can be used to group together incidents that are related to the same part of an application. It's also possible to configure notification settings on a per-namespace level. Read more about [namespaces](/application/namespaces) and how to configure them for your app. ## See also * [📖 Removing an application guide](/guides/application/deleting-applications) * [📖 Migrating an application between organizations guide](/guides/application/migrating-applications) * [📖 Running multiple applications on one host](/guides/application/multiple-applications-on-one-host) [application index]: https://appsignal.com/accounts # Backtrace links Source: https://docs.appsignal.com/application/backtrace-links With backtrace links you can spend less time figuring out where an exception happened and more time debugging the exception. Backtrace links make every line to source code in your app link to your app's source code on your source code hosting platform of choice. Backtrace with Git link ## Steps to enable backtrace links To enable backtrace links an app on AppSignal.com needs to: 1. [Enable deploy markers](/application/markers/deploy-markers). * This will allow AppSignal to link to the specific revision of the source code in which the error occurred. 2. Configure the "repo url" for an application, or [link your organization to GitHub](https://appsignal.com/redirect-to/organization?to=admin/integrations/github), so AppSignal knows where to link to. * See the steps below for either option. ## Configure the repo url Owners of an Organization can specify a Repo url on [the app settings page](https://appsignal.com/redirect-to/app?to=edit). This is especially useful for Git hosting platforms that are not GitHub (e.g. GitLab/BitBucket) or private repositories. App settings repo URL form ## Link your app to GitHub Alternatively organization owners can [link an app to GitHub](https://appsignal.com/redirect-to/app?to=integrations) and the "repo url" from the selected repository will be stored automatically. With the GitHub integration you'll also be able to send incidents to GitHub directly from AppSignal. Once the steps are completed we'll automatically enrich the backtrace lines with a link to the correct revision/file/line on the specified Git repository. ## Send error to GitHub When an error occurs, AppSignal will not create an issue automatically on GitHub, if you think it is an error that needs to be fixed then you can create this error as an issue in GitHub by clicking on the "Send to GitHub" button. Send error to github ## Open backtrace lines in your local editor Once configured, each app code line in an exception backtrace gets an **Open in editor** button that opens the file directly in your local editor. Before setup, the option is available in the extras menu, accessible via the there dots icon. ### Setup Go to **App Settings → Editor preferences**, select your editor, and enter the absolute path to the project on your local machine. These settings are personal — each developer on your team configures their own. Supported editors: **VS Code**, **Cursor**, **Windsurf**, **Zed**, **RubyMine**, and **Sublime Text**. # Configuration Source: https://docs.appsignal.com/application/configuration Configuration. Important, because without it the AppSignal integrations won't know which application it's instrumenting or in which environment. In this section we'll explain how configuration works in AppSignal integrations, what options can be configured in the integrations, what the minimal configuration needed is and in what order the configuration is loaded. 📖 Want a more practical read on how to add or change AppSignal configuration? Read our [guide on how to configure AppSignal][guide] in your apps. ## Minimal required configuration Every app needs to have four key configuration options set for AppSignal to report data for it. These config options help AppSignal identify an app, and group all the data for it in an app environment on AppSignal.com. Every app is a combination of the app name and environment, in AppSignal terminology this is an "app". These required configuration options are: * App name * The app name as it is reported and shown on AppSignal.com * App environment * The app environment as it is reported and shown on AppSignal.com * [Push API key] * The key used to identify which organization the app belongs to or which app is reporting data. Read more about the [Push API key] on our terminology page. * AppSignal active * The config option used to enable, or disable, environments on the host's config. This allows users to disable development and test environments, and only report data for the production and staging environment, for example. The detailed list of required options per integration can be found in the [configuration options section](#configuration-options). Find the list of required configuration options at the top of each config options page. For Front-end JavaScript all required options are combined in a [`key` config option][frontend config], and the app name and environment are configured on AppSignal.com during the "add app" wizard. Some of these configuration options may be set to a default value by the integrations, such as the app name for Rails apps, and environment for Elixir and Node.js apps. ## Configuration options Every integration has its own set of configuration options. There's a list of shared options and options specific to each integration. The full list of configuration options can be found in the language integration sections: * [Ruby](/ruby/configuration/options) * [Elixir](/elixir/configuration/options) * [Node.js](/nodejs/3.x/configuration/options) * [Python](/python/configuration/options) * [Front-end Javascript](/front-end/configuration/) * [Go](/go/configuration/options) ## Configuration methods There are two main ways to configure AppSignal integrations, by (configuration) file or by system environment variables. Use the configuration method that best fits your app setup. Read our [guide on how to configure AppSignal][guide] in your app. ## Configuration load order Depending on the integration the load order of the configuration may differ, please consult the load order page for the integrations for more information: * [Ruby configuration load order](/ruby/configuration/load-order) * [Elixir configuration load order](/elixir/configuration/load-order) * [Node.js configuration load order](/nodejs/3.x/configuration/load-order) * [Python configuration load order](/python/configuration/load-order) *If a language is not listed, it has no different configuration sources to load configuration options from.* ## See also * [AppSignal configuration guide][guide] * AppSignal integration configuration topics: * [Ruby configuration topic](/ruby/configuration) * [Elixir configuration topic](/elixir/configuration) * [Node.js configuration topic](/nodejs/3.x/configuration) * [Python configuration topic](/python/configuration) * [Front-end JavaScript configuration topic][frontend config] * [Go configuration topic](/go/configuration) [guide]: /guides/configuration.html [Push API key]: /appsignal/terminology.html#push-api-key [frontend config]: /front-end/configuration.html # Customizing data collection Source: https://docs.appsignal.com/application/data-collection By default AppSignal gathers relevant data for errors and performance measurements to help you find the cause of the issue. Sometimes you need more information, app specific data or a custom request header your app uses. You can configure AppSignal to gather more, or less, information than it does by default by tagging your transactions and configuring the request headers, parameter filtering, etc. Ideally we receive as little metadata for samples as possible, and only data that is needed to debug an exception or performance issue. 📖 Read our [filtering app data guide](/guides/filter-data/) about limiting what (sensitive) data is collected by AppSignal. It will guide you through configuring which parameters, session data and request headers to collect. ## Ignore actions By configuring the `ignore_actions` option it's possible to not record any data for the configured actions, requests, background jobs, etc. 📖 Read our [guide about ignoring actions](/guides/filter-data/ignore-actions). ## Ignore errors By configuring the `ignore_errors` option it's possible to ignore errors matching the exact name of an error for the entire app. 📖 Read our [guide about ignoring errors](/guides/filter-data/ignore-errors). ## Namespaces Namespaces allow grouping of [actions](/appsignal/terminology#actions). By default AppSignal uses the "web", "background" and "frontend" namespaces to group [transactions](/appsignal/terminology#transactions). It's possible to create a custom namespace such as "admin", "api" to group controllers in the same namespace. The grouped actions in the namespace can be configured with their own notification defaults, allowing a critical namespace to always notify about errors, while the "web" namespace does not. It's also possible to configure the AppSignal integration to ignore a namespace to ignore all transactional data from all actions in it. Read more about namespaces in the [namespaces section](/application/namespaces). ## Tagging Our tagging system allows you to attach more metadata to samples, besides what we already collect. Things such as the ID of the user making the request or other data that can help you identify who made the request or specific conditions for the request. ## Queries By default we parse SQL queries and try and remove any parameters in the query string. We've created an open-source (Rust) package that is used by our integrations. You can find [the sql\_lexer project on GitHub](https://github.com/appsignal/sql_lexer). If you see any query params in our UI, please open an issue in that repository. MongoDB queries in the Ruby integration are sanitized by default. # Environment metadata Source: https://docs.appsignal.com/application/environment-metadata The AppSignal integrations and agent collect metadata about the host and app it is integrating with. The specifics about which metadata is collected is listed below. This metadata is used to: * enrich the data available on AppSignal.com (to provide a more complete picture of the host and app), * provide additional information for debugging purposes as a supplement to the diagnose command, * product improvement as part of an anonymous aggregated dataset. To disable this feature, set the `send_environment_metadata` config option to `false`: * [Ruby](/ruby/configuration/options#option-send_environment_metadata) * [Elixir](/elixir/configuration/options#option-send_environment_metadata) * [Node.js](/nodejs/3.x/configuration/options#option-send_environment_metadata) * [Python](/python/configuration/options#option-send_environment_metadata) ## AppSignal metadata * AppSignal integration version * What package and version of AppSignal is installed. This is either the Ruby gem, Elixir package or the Node.js package. * AppSignal agent version * What version of the AppSignal agent is installed. This is used to recognize the version when [standalone mode] is used. * Agent release * Reports which architecture was installed, 32 or 64-bit. The AppSignal extension and agent are built for each architecture separately. * Reports whether the [musl build](/support/operating-systems#supported-versions) was installed. * Agent standalone mode enabled * If the agent is running in [standalone mode]. This is used for hosts that run systems such as databases, that still want to report host metrics for it. * Agent StatsD mode enabled * If the agent has [StatsD mode] enabled. * Optional enabled features * AppSignal integrations have some optional features that can be enabled, usually prefixed with the `enable_` name in the config options. It is reported only when they are enabled. ## App metadata * Integration language * What the integration language is (Ruby/Elixir/Node.js) and what version. * Integration language implementation * What the language implementation is, if any (MRI or JRuby), and what version. * Integration supported libraries * A list of which AppSignal supported libraries integrations are loaded and what version, e.g. Rails, Phoenix, Express. Only information of officially supported AppSignal packages is sent, but not any unsupported or private packages. ## Host metadata The host data is available for hosts in the [host metrics] feature, adding details to hosts in the overview. * Architecture * Whether the system is 32 or 64-bit architecture. * Operating System * Operating System, either Linux, macOS or Windows. * Operating System Distribution, for Linux this reports Ubuntu, Fedora, etc. * Operating System version, the version of the Operating System. * Kernel version, for Linux this reports the installed kernel version. * Containerized system * Is the host part of a container system such as Docker. On container system such as Docker the AppSignal agent is using a different method with which host metrics are reported. * Platform * If Heroku is detected as platform. Our integrations and agent use different settings on Heroku. [standalone mode]: /standalone-agent/installation.html [statsd mode]: /standalone-agent/statsd.html [host metrics]: /metrics/host-metrics.html # Request header collection Source: https://docs.appsignal.com/application/header-filtering AppSignal collects headers for HTTP requests by default for supported frameworks. This data may help track down errors or performance issues that were caused by requests header data a client is sending. To comply with [GDPR](/appsignal/gdpr) rules, collecting no user identifiable data, AppSignal collects a very limited amount of headers by default. To even further limit the request headers or collect more than the default list of headers, configure AppSignal which headers to collect. 🔐 Do not send Personal Identifiable Information (PII) to AppSignal. Filter PII (e.g., names, emails) and use an ID, hash, or pseudonymized identifier instead.

For HIPAA-covered entities, more info on signing a Business Associate Agreement (BAA) is available in our Business Add-Ons documentation.
## Configure headers An app's session data can be filtered by configuring keys in an *allowlist*. This allowlist system will filter out all the session data keys not in this list. All headers that are filtered out by these systems are not collected, neither the header name or value. 📖 Read our guide about [setting up request header collection and filtering](/guides/filter-data/filter-headers) for your app. ## Filter all request headers To filter all request headers without individual header filtering, configure the allowlist to an empty list in the integration configuration. Without any header names in the list, it will not collect any request headers. * [Ruby `request_headers` config option documentation](/ruby/configuration/options#option-request_headers) * [Elixir `request_headers` config option documentation](/elixir/configuration/options#option-request_headers) * [Node.js `requestHeaders` config option documentation](/nodejs/3.x/configuration/options#option-requestheaders) * [Python `request_headers` config option documentation](/python/configuration/options#option-request_headers) * [Go `request_headers` config option documentation](/go/configuration/options#option-request_headers) * [PHP `request_headers` config option documentation](/php/configuration/options#option-request_headers) ## Recommended headers to filter A non-exhaustive list of request header names that may be used by an application. Do not include these headers, and those like it, in the integrations "request headers" allowlist unless absolutely necessary. * Any personal identifiable headers: * IP Addresses * `Forwarded` * Browser type and versions headers * `User-Agent` * Referrer * `Referer` * Passwords and tokens * `Authorization` * `Proxy-Authorization` * Any custom API token headers. ## See also * [Data filtering guide](/guides/filter-data) - Filter app data in AppSignal integrations # Limits Source: https://docs.appsignal.com/application/limits This page is about the **Limits** view in your application's settings. It is not about reducing your billable request count. For that, see [Limiting requests](/support/limiting-requests). The **Limits** page shows the top-10 custom metrics in your app by unique key count from the last recorded minute. Above the table, it also shows your app's total unique keys and the recorded time for that minute. A unique key is one custom metric name plus one combination of tag values. ## What the page shows For each of the top 10 custom metrics, the page lists: * **Metric name:** the name of the custom metric. * **Unique keys:** how many distinct tag combinations were seen in the last recorded minute, and the share of your app's total. * **Tag examples:** a sample of the tag combinations being reported. Use this column to spot tags with many different values. If there are more examples, the page shows a `+ more` link. ## When to use this page If you're seeing gaps in your custom dashboards, use this page to check whether any metric is generating many unique keys. High-cardinality tags are a common cause. To reduce the number of unique keys, review the tags on that metric and use a limited range of tag values when possible. ## See also * [Custom metrics](/metrics/custom) * [Metric tags](/metrics/custom#metric-tags) # Link templates Source: https://docs.appsignal.com/application/link-templates AppSignal supports tagging of requests, as described in our [tagging guide][tagging-guide]. These tags make it possible to generate URLs to your own application to deep link to pages in your own system, such as related user profiles or blog posts. ## Tagging requests For link templates to work AppSignal needs to have the data necessary to create the links. Start by adding tags to request in your application. Add the following code in a location where it's executed for the related request, such as a `before_action` block in a Ruby on Rails application or using Plug in the Elixir Phoenix framework. ```ruby Ruby theme={null} # Ruby example Appsignal.tag_request( :user_id => current_user.id, :account_id => current_account.id ) ``` ```elixir Elixir theme={null} # Elixir example Appsignal.Span.set_sample_data( Appsignal.Tracer.root_span, "tags", %{ locale: "en", user_id: user_id, stripe_customer_id: stripe_customer_id, locale: locale, default_locale: default_locale } ) ``` 📖 For more information about tagging requests, please read the [tagging guide][tagging-guide]. ## Log attributes AppSignal can also generate links based on log attributes. For more information about logging and how to add log attributes see our [logging documentation](/logging) ## Creating a link template Link templates can be defined on AppSignal.com per application. The "Link templates" configuration can be found in the ["App settings" section](https://appsignal.com/redirect-to/app?to=edit) in the left-hand side navigation. link templates Link templates can contain variables, defined by wrapping them in percentage signs `%%`. For example, the `user_id` tag can be used in a link like so: ```shell Shell theme={null} https://yourapp.com/backend/users/%user_id% ``` A link can contain as many variables as you like, but in order for a link to be generated, all variables need to be present in the tags of a request. After adding tags in your app and defining link templates, links will be generated for each request in the "Overview" section. link templates ### Customizing link names By default the tags and links table will increment links, e.g. "Link 1", "Link 2", "Link 3". If you want to use more descriptive link names you can do so with this format: ```shell Shell theme={null} [Backend]https://yourapp.com/backend/users/%user_id% ``` [tagging-guide]: /guides/tagging.html # Markers Source: https://docs.appsignal.com/application/markers Markers are little icons used in graphs on AppSignal.com to indicate a change. This can be a code deploy using a "Deploy marker" or a special event with a "Custom marker". Deploy markers can be used to indicate a change in application version that's deployed, grouping together errors and performance issue per deploy. Custom markers can be used for anything from scaling operations, to sudden spikes in traffic and infrastructure issues such as when a database was acting up. # Custom markers Source: https://docs.appsignal.com/application/markers/custom-markers Markers are little icons used in graphs on AppSignal.com to indicate a change. This can be a code deploy using a ["Deploy marker"](/application/markers/deploy-markers) or a special event with a "Custom marker". Custom markers can be used for anything from scaling operations, to sudden spikes in traffic and infrastructure issues such as when a database was acting up. See also our announcement posts about Custom markers: * [Introducing custom markers](https://blog.appsignal.com/2016/10/28/custom-markers.html) * [Add custom markers from any graph](https://blog.appsignal.com/2016/11/28/custom-markers-from-any-graph.html) ## Creating a custom marker A custom marker can be created in two ways. Through the UI on AppSignal.com on the graphs or with a request to our API. ### Using the Graph UI When on AppSignal.com open a page with a graph on it, any graph. Hover over a space in a graph and you will be presented with a "Add marker" button. In the "Add marker" lightbox, select an icon, set a message and create your marker. To edit or delete a marker, click on the icon and you will be brought back to the editor. ### Using the AppSignal API There are two APIs to report custom markers to AppSignal. These two APIs use different authentication methods. Choose the one that's most convenient, there is no other difference. * [Markers API endpoint documentation](/api/markers): authenticate using Personal Access Token. This authentication method has read and write access to all data. * [Public endpoint markers API endpoint documentation](/api/public-endpoint/custom-markers): authenticate using a Push API key + app name and environment, or using a Front-end API key. This authentication method is write only. # Deploy markers Source: https://docs.appsignal.com/application/markers/deploy-markers Markers are little icons used in graphs on AppSignal.com to indicate a change. This can be a code deploy using a "Deploy marker" or a special event with a ["Custom marker"](/application/markers/custom-markers). Deploy markers can also be found in the ["Deploys" section](https://appsignal.com/redirect-to/app?to=markers) in the app navigation which provides a performance overview per deploy. A deploy marker indicates a change in the deployed version of an application. This can be used to group together occurrences of errors and performance issues within a certain time frame. From when the version was deployed until a newer version was deployed. Deploy markers are also required to enable [backtrace links](/application/backtrace-links) for an app. When a new deploy is detected, the list of incidents is empty for the newest deployment version. When an error, or any other issue, is reported by AppSignal in your application it gets listed for the newest deploy as well. On the sample page for an incident you can see in which deployments an incident occurred with the help of the rocket (🚀) separator icon. 📖 Also read our guide on [how to set up deploy markers](/guides/deploy-markers). Deploy markers in samples list ## Deploy methods There are two methods of notifying AppSignal of a new deploy. These two methods cannot be used together. 1. Using the `revision` config option, and; 2. Creating a deploy notification manually with the AppSignal Push API. The first method (`revision` config option) is our recommended approach, because it's the most reliable method and works better for applications with more than one host. We detect the revision from the application itself so we know which instance is running what version. The second approach (creating a deploy marker manually) is a method only really useful for small applications that use one host. It creates a new deploy marker at a specific time, regardless of the version the application is actually running. This also means it's more error prone. ## Revision config option The recommended approach of letting AppSignal know a new version of your application is deployed is by using the `revision` config option or the `APP_REVISION` environment variable (see the [deploy markers configuration guide](/guides/deploy-markers#configurations-per-language) for more information). This is automatically detected for [Heroku apps](#heroku-support) using the dyno metadata lab feature. This config option is set per instance of an application which has the benefit of every version of an application running at the same time reporting the errors under the correct deploy, rather than the latest deploy that [has been reported](#manually-create-a-deploy-marker) to AppSignal. For example: If one machine is still running an older version of the application all the errors from that instance are reported under the previous deploy marker rather than the last known deploy marker. AppSignal will create a new deploy marker when it receives [transaction data](/appsignal/terminology#transactions). When the revision config option is set for your app, the revision is stored on a transaction that tracks a web request / background job. When our processor on the AppSignal servers detects a new revision it will create a new deploy marker for the parent app with the revision from the transaction. ### Config option The `revision` config option can be used in any integration to report the app's current deploy. See the [deploy markers guide](/guides/deploy-markers) for more information. ```ruby Ruby theme={null} AppSignal.configure do |config| config.revision = "abcdef12" end ``` If you're running a version in which this config option is not available we recommend using the [`APP_REVISION` environment variable](#system-environment-variable) instead. ### System environment variable The `APP_REVISION` value can be any value you use to indicate a version/revision. For example: a version number `1.4.2` or a git SHA `cf8bc42`. The revision value should be set in the application's system environment and updated during a deploy of the application. ```bash Bash theme={null} export APP_REVISION="cf8bc42" # Start your application # bundle exec rackup app.rb ``` ### Heroku support When using Heroku with the [Heroku Labs: Dyno Metadata](https://devcenter.heroku.com/articles/dyno-metadata) enabled, Heroku will populate the `HEROKU_SLUG_COMMIT` environment variable with the SHA of the git commit being deployed. AppSignal will automatically set the `revision` config option to the value of the `HEROKU_SLUG_COMMIT` system environment variable. This will automatically report new deploys when the Heroku app is deployed. ### Render support When deploying an application using Render, it will populate the `RENDER_GIT_COMMIT` environment variable with the SHA of the git commit being deployed. AppSignal will automatically set the `revision` config option to the value of the `RENDER_GIT_COMMIT` system environment variable. This will automatically report new deploys when the Render app is deployed. ### Hatchbox support To use deploy markers with Hatchbox, first connect your Hatchbox account to AppSignal: 1. In Hatchbox, go to your profile settings and navigate to [**Connected accounts**](https://app.hatchbox.io/user/connected_accounts). 2. On the "Connected accounts" page, select **Sign in with AppSignal**. 3. In the AppSignal window that opens, authorize Hatchbox to access your AppSignal organization by selecting **Allow access**. When deploying an application using Hatchbox, it will add a `REVISION` file in the release folder with the SHA of the Git commit being deployed. AppSignal will automatically set the `revision` config option to the value of the `REVISION` file. This will automatically report new deploys when the Hatchbox app is deployed. ### Kamal support When deploying an application using Kamal, it will populate the `KAMAL_VERSION` environment variable within the container with the SHA of the git commit being deployed. AppSignal will automatically set the `revision` config option to the value of the `KAMAL_VERSION` system environment variable. This will automatically report new deploys when the app is deployed using Kamal. ### Docker support If your application runs in a Docker container, follow the instructions below to set your application's revision and create a deploy marker. First, add the following instructions to your Dockerfile, directly after the last `FROM` instruction: ```bash Bash theme={null} ARG COMMIT ENV APP_REVISION=$COMMIT ``` Once added you need to include your application's revision when building your Docker image: ```bash Bash theme={null} docker build --build-arg COMMIT=$(git rev-parse HEAD) -t image:latest ``` When using Fly.io to deploy your application, the `COMMIT` build argument is provided automatically during the build. This will set the `APP_REVISION` environment variable for your application and allow the AppSignal integration to use the revision as a deploy marker. ### GitLab support When deploying from a GitLab CI/CD pipeline, set the `APP_REVISION` environment variable in your deploy job to the commit SHA so AppSignal picks it up when the app starts: ```yaml YAML theme={null} deploy:production: stage: deploy variables: APP_REVISION: $CI_COMMIT_SHA script: - ./bin/deploy.sh ``` `CI_COMMIT_SHA` is one of GitLab's [predefined CI/CD variables](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html) and resolves to the commit being deployed. If your stack does not include an AppSignal integration, see the [GitLab CI/CD example](#gitlab-cicd-example) instead. ## Manually create a deploy marker This method of reporting deploy markers is **deprecated** and may be removed at any time in the future. Reporting deploy markers using this method is only useful for small applications that use one application instance. It creates a new deploy marker at a specific time, regardless of the version the application is actually running. This also means it's also more error prone to group data that shouldn't belong to it under the deploy. We automatically detect deployment by reading the `REVISION` file which Capistrano adds to the release directory since Ruby gem 4.5.18. This method of reporting new deploys to AppSignal requires that you send a POST request to the AppSignal Push API markers endpoint. This can be done with a manual HTTP POST request for other languages. When the deploy marker create/notify request is received by the AppSignal servers, all data that is processed by our servers after that time is tracked under the newly created deploy. To create a Deploy marker with a HTTP POST request you can use curl or some other tool like it. The payload of the request is a JSON object with data about the marker, such as the revision, user who deployed it and the application's repository. Read more about how to create Deploy markers with our API in our [API endpoint](/api/markers) documentation. ### GitLab CI/CD example If you can't use the [`revision` config option](#revision-config-option) — for example, because your stack does not include an AppSignal integration — you can call the Markers API from a separate GitLab CI/CD job after your deploy succeeds. First, store your AppSignal credentials as masked CI/CD variables in your GitLab project's **Settings → CI/CD → Variables**: * `APPSIGNAL_API_TOKEN` — your personal API token (Profile → Account settings → Personal → API). * `APPSIGNAL_APP_ID` — the AppSignal app ID for the environment you're deploying. Find it in the AppSignal URL: `https://appsignal.com//sites//...`. Then add a deploy-marker job to your `.gitlab-ci.yml`: ```yaml YAML theme={null} stages: - deploy - notify deploy:production: stage: deploy script: - ./bin/deploy.sh rules: - if: '$CI_COMMIT_BRANCH == "main"' appsignal:deploy_marker: stage: notify image: curlimages/curl:latest needs: ["deploy:production"] rules: - if: '$CI_COMMIT_BRANCH == "main"' script: - | curl --fail --silent --show-error \ -H "Content-Type: application/json" \ -X POST "https://appsignal.com/api/${APPSIGNAL_APP_ID}/markers.json?token=${APPSIGNAL_API_TOKEN}" \ -d "{ \"marker\": { \"kind\": \"deploy\", \"repository\": \"${CI_PROJECT_URL}.git\", \"revision\": \"${CI_COMMIT_SHA}\", \"user\": \"${GITLAB_USER_LOGIN}\" } }" ``` GitLab webhooks cannot be used to call the Markers API directly — GitLab webhook payloads have a fixed format that does not match the Markers API request body, and GitLab does not let you transform the payload before sending. #### Troubleshooting If the marker job fails with `401 Unauthorized`, re-check `APPSIGNAL_API_TOKEN`. It must be a personal API token from **Profile → Account settings → Personal → API**, not the Push API key. Confirm the variable is not restricted by Environment scope to a different environment than the job runs in. If the marker job fails with `404 Not Found`, the `APPSIGNAL_APP_ID` is wrong or belongs to a different organization. Copy it from the AppSignal app's URL (`https://appsignal.com//sites//...`). [backtrace links]: /application/backtrace-links.html # Metadata Source: https://docs.appsignal.com/application/metadata You can supply extra context on errors and performance traces using metadata. This can help to add information that is not already part of the request parameters, session data or request headers. 🔐 Do not send Personal Identifiable Information (PII) to AppSignal. Filter PII (e.g., names, emails) and use an ID, hash, or pseudonymized identifier instead.

For HIPAA-covered entities, more info on signing a Business Associate Agreement (BAA) is available in our Business Add-Ons documentation.
📖 Also read our guides on how to set up [metadata](/guides/custom-data) and how to [filter](/guides/filter-data) this metadata. ## Types of metadata To add more complex data structures to error and performance traces, different types of metadata can be used. Some of these are set by our instrumentations automatically and can be overwritten if needed. These are the kind of extra data that can be set. 1. [Request parameters](/guides/custom-data/request-parameters) * If you are using a supported web framework or library, AppSignal will store the request query parameters, request payload body or background job arguments for you automatically. 2. [Request session data](/guides/custom-data/request-session-data) * If you are using a supported web framework, AppSignal will store the request session data for you automatically. 3. [Request headers](/guides/custom-data/request-headers) * If you are using a supported web framework, AppSignal will store the request headers for you automatically. 4. [Function parameters](/guides/custom-data/function-parameters) * Function parameters are the parameters that background jobs or scripts start with. 5. [Custom data](/guides/custom-data/custom-data) * You can use custom data if additional details you want to send are not related to the above three types. AppSignal does not automatically save anything in custom data unless you specifically tell it. # Namespaces Source: https://docs.appsignal.com/application/namespaces Namespaces are a way to group error incidents, performance incidents and metrics from [actions](/appsignal/terminology#actions). [By default](#default-namespaces) AppSignal provides three namespaces: the "web", "background" and "frontend" namespaces. You can add your own namespaces to separate parts of your app like the API or Admin panel with [custom namespaces](#custom-namespaces). 📖 Read our guide on [how to set up namespaces][guide]. ## What can you do with namespaces? Let's start first with the things we can use namespaces for: * Group [error incidents](https://appsignal.com/redirect-to/app?to=exceptions) and [performance measurements](https://appsignal.com/redirect-to/app?to=performance) per namespace. Create overviews of the most important namespaces and fix those incidents first. * Track and graph metrics per namespace ([error rate, error count](https://appsignal.com/redirect-to/app?to=exceptions/graphs), [throughput, response times, queue times](https://appsignal.com/redirect-to/app?to=performance/graphs), and more). * Receive [Anomaly detection alerts per namespace](/anomaly-detection/). * Set up [notifications settings per namespace](/application/notification-settings). App Graphs Namespaces ## Default namespaces The "web" namespace holds all data for HTTP requests while the "background" namespace contains metrics from background job libraries and tasks. The "frontend" namespace is created by the [JavaScript front-end integration](/front-end). You can add your own namespaces to separate parts of your app like the API and Admin panel. ## Custom namespaces 📖 The custom namespaces feature was introduced in AppSignal for Ruby gem version 2.3.0 and AppSignal for Elixir package version 1.3.0. Using more than one namespace makes it easier to group metrics belonging to the same part of an application together. In AppSignal we use custom namespaces to accomplish this. The advantage of custom namespaces is the ability to group together error and performance incidents from separate parts of the same application. Think of an administration panel, public homepage versus private back-end, etc. The metrics from these three parts in one namespace can clutter the "web" namespace with incidents of varying importance. For example, when something in the administration panel breaks it's not as big of a problem when the sign up page breaks on the public front-end. The metrics from separate parts of an application can be grouped together in their own namespace. By using the AppSignal instrumentation helpers for setting a namespaces it's possible to assign [transactions](/appsignal/terminology#transactions) to a certain namespace. Once the namespace is configured and the application is sending data to the AppSignal, the new namespace will appear in the navigation on AppSignal.com. Note: Data previously reported for the same action is not moved to the new namespace. 📖 To set up custom namespaces in your app, read our guide to [setting up namespace with our integrations][guide]. Only letters and underscores are accepted for namespace names. ## Namespace limitations Namespaces are great to split out certain parts of your application, but there are a few limits to namespaces. For optimal performance it's recommended to not have more than **10-15** namespaces maximum. While we don't have a hard-limit on this number, we cannot guarantee performance when more than **15** namespaces are used. ## Ignoring namespaces Sometimes you have a certain part of an application that does not need to be monitored by AppSignal. The most common use case is an administration panel that you use internally which doesn't need constant monitoring. By ignoring an entire namespace AppSignal will ignore all transactional data from all actions in the configured namespaces. To ignore a namespace first make sure to configure AppSignal to report all actions you want to ignore under a certain namespace, as described in the [namespaces guide][guide]. Then configure AppSignal in your app to ignore the namespace, see our [ignore namespaces guide][ignore guide]. After restarting/deploying your app the actions in the selected namespace should no longer be reported on AppSignal.com. 📖 To configure AppSignal to ignore namespaces in your app, read our guide to [ignoring namespace with our integrations][ignore guide]. ## Deleting namespaces If you created a namespace that is no longer active you can delete it from the [namespaces](https://appsignal.com/redirect-to/app?to=namespaces) screen under app settings. We do not automatically delete a namespace if it is no longer receiving data. [guide]: /guides/namespaces.html [ignore guide]: /guides/filter-data/ignore-namespaces.html # Notification settings Source: https://docs.appsignal.com/application/notification-settings Whenever AppSignal detects a new error or performance measurement, we open an incident. You can find the incidents in the [Errors](https://appsignal.com/redirect-to/app?to=exceptions) and [Performance](https://appsignal.com/redirect-to/app?to=performance) sections. AppSignal can send out notifications whenever a new incident, or new instances of an already existing incident, is detected. Notifications can happen by email or by one of our [many notifiers](/application/integrations/). ## Notification options Whenever a new incident gets created it will inherit the [app's notification defaults](#app-notification-defaults). When an [Error](#error-incident-notification-settings) or [Performance](#performance-incident-notification-settings) incident has been created, its notification settings can be changed on the incident page itself. If an incident was closed, it will be reopened when a new notification is sent out. There are six notification options available: * [Every Occurrence](#every-occurrence) * [First in Deploy](#first-in-deploy) * [First After Close](#first-after-close) * [Never Notify](#never-notify) * [Every Nth per Hour](#every-nth-per-hourday) * [Every Nth per Day](#every-nth-per-hourday) New error incidents default to **First in Deploy**, and new performance incidents default to **Never Notify**. ### Every Occurrence A notification is sent every time an incident is triggered. This option has a cool down of 5 minutes. This means that if an incident is triggered 20 times a minute, for 20 minutes, you'll receive a notification on minute 0, 5, 10, 15 and 20. ### First in Deploy A notification is sent on the first occurrence of an incident after a new deploy marker is received. You'll need to set up [deploy markers](/application/markers/deploy-markers) for AppSignal to detect a deploy and know when an incident occurred for the first time in a deploy. ### First After Close A notification is sent at the first occurrence of an incident after the incident was previously closed. Incidents can opened and closed in the sidebar in the Incident detail page. This option is a good option for incidents that aren't triggered by a code bug, but out an outside source (e.g. 3rd party has a connection issue) and can't be closed by deploying a new version of the app. ### Never Notify No notification is ever sent out when the incident is triggered. Mostly used for errors that will continue to happen and you'd like to keep track of, but aren't getting fixed soon. If you don't want to receive the incident at all, [ignoring the action](/application/data-collection#ignore-actions) or [ignoring the error](/application/data-collection#ignore-errors) may help. ### Every Nth per Hour/Day No notification is sent every nth time per hour, or day, depending on your preferences. There are many scenarios where this may be beneficial: * **Billing Error:** Imagine a billing error occurring now and then, outside of your control. It happens a maximum of 5 times a day, and you want to know when this suddenly increases. Setting it to "every 10th time a day" will send you an alert on every 10th, 20th, 30th occurrence, etc. * **API Error:** You might have an API that many people use. When experimenting with an API, making mistakes that trigger errors is common. You might only want to be alerted when the number of errors reaches a threshold. You could, for instance, set it to notify you every 1000th time an hour, which might indicate that the API is failing for different reasons. * **During Incident:** Imagine something is severely broken. Hundreds of errors an hour are happening, but you're on top of it. It might not be a good idea to ignore all alerts completely, but getting each one of them will drown you in notifications. This is the perfect moment to manage the number of notifications you receive by temporarily setting your errors to Nth/hour. Visualization of notifications every 100th per hour Above is a visualization of when you would receive alerts. In this scenario, notifications are set to "Every 100th per hour". ## Error incident notification settings Error incidents are identified by the error (class)name, such as `ActiveRecord::RecordNotFound` and if the error happened inside of an action, the action name. (e.g. `StandardError` in `BlogpostsController#show`). Error incident notification options ## Performance incident notification settings Performance incidents are identified by their "action" name, such as `BlogpostsController#show`. Once we detect a new action we create an incident for it. At this point you can override the default notification settings and change when you'd like to be notified and what threshold the duration of the performance incident has to reach before a notification is sent. E.g. for actions where response times can be slow, because they interact with 3rd parties, you can set the duration threshold to 10 seconds, while for the homepage you can set a threshold of 200 milliseconds. The threshold filter is used in combination with the notification settings. E.g. if you have **First in deploy** and **200ms** as the notification settings and threshold, an incident occurrence has to satisfy both in order for a notification to be sent out. Performance incident notification options ## Organization and app namespace defaults Notification settings on an incident can only be changed after it has occurred at least once. This can be an issue if you never want to be notified, or want to set a different performance incident threshold than the default 200 milliseconds. It's possible to configure notification defaults [per app namespace](#app-notification-defaults) or even [for the entire organization](#organization-notification-defaults). This will make it easier to apply the desired notification settings to all new incidents and all existing incidents, for which the notification settings haven't been customized. ### App notification defaults Each application has its own [namespace defaults][app notifications] for notification settings. A new incident in the specified namespace will inherit the default settings set on this page. For more information, see the [notification defaults inheritance](#notification-defaults-inheritance) section. It's recommended to split up the application in [namespaces](/application/namespaces) that group potential incidents by severity. This way you can configure notification settings for a group of incidents and there's no need to configure each incident separately. For example, for an app's admin panel you could create a namespace called `admin` with a default notification setting of "Never notify" as errors that occur in this namespace have less priority. ### Organization notification defaults It's also possible to set up notification defaults on your organization. These defaults will be used when AppSignal detects and creates a new application. When it creates the new app it will apply the organization's notification defaults as the app's app notification defaults. Changes to the organization notification defaults do not apply to already existing apps. For more information, see the [notification defaults inheritance](#notification-defaults-inheritance) section. These organization level [notification defaults][org notifications] can be set up in the organization's admin panel. It's possible to configure defaults for each namespace detected in any of the current applications in your organization. ## Notification defaults inheritance The notification settings bubble up from the incident settings to the app's namespace settings. If the notification settings for an incident aren't changed the app's namespace defaults are used. This means you can also change all the incident notification settings for incidents that haven't customized their notification settings by changing the app defaults. * When a new app is detected by AppSignal, the [organization's namespace defaults][org notifications] are applied. * When organization namespace notification defaults are changed, they only apply to new apps. * When an [app's namespace notification defaults][app notifications] are changed, they apply to all new incidents and existing incidents without customized notification settings. * When a new incident is detected by AppSignal, the [app's namespace defaults][app notifications] are used. * When an incident's notification settings are customized, the incident's customized notification settings are used from then on. [app notifications]: https://appsignal.com/redirect-to/app?to=notifications [org notifications]: https://appsignal.com/redirect-to/organization?to=admin/notifications/edit # Parameter filtering Source: https://docs.appsignal.com/application/parameter-filtering For every request made on a web app, AppSignal collects the parameters that were sent with the request. This includes form data (POST), query parameters and keys in routes, e.g. `/user/:id/` in some frameworks. Data sent to applications that is sensitive or personally identifiable information should not leave the application. To prevent AppSignal from storing this data the integrations need to be configured to not send this data at all or filter out specific values. Parameter filtering ensures that no passwords, email addresses, two-factor authentication token, API tokens, sent to your application are stored in AppSignal. 🔐 Do not send Personal Identifiable Information (PII) to AppSignal. Filter PII (e.g., names, emails) and use an ID, hash, or pseudonymized identifier instead.

For HIPAA-covered entities, more info on signing a Business Associate Agreement (BAA) is available in our Business Add-Ons documentation.
## Integration parameter filtering All AppSignal integrations have a parameter filtering system. A list of parameter keys can be configured to be filtered out, e.g. email, password, two factor authentication API tokens, etc. This way the data is filtered out before it's sent to the AppSignal servers. Any parameter values that are filtered out by these systems will be replaced with a `[FILTERED]` value. This way the list of parameters in the app data on AppSignal.com still includes the parameter key, but not the value. Making it easier to see that a value was sent, but the potentially sensitive data was filtered out. 📖 Read our guide about [setting up parameter filtering](/guides/filter-data/filter-parameters) for your app. ### Filter all parameters To filter all parameters without individual parameter filtering, set "send parameters" config option to "false" in the integration configuration. * [Ruby `send_params` config option documentation](/ruby/configuration/options#option-send_params) * [Elixir `send_params` config option documentation](/elixir/configuration/options#option-send_params) * [Node.js `sendParams` config option documentation](/nodejs/3.x/configuration/options#option-sendparams) * [Python `send_params` config option documentation](/python/configuration/options#option-send_params) * Go [`send_request_query_parameters` config option](/go/configuration/options#option-send_request_query_parameters) and [`send_request_payload` config option](/go/configuration/options#option-send_request_payload) documentation * PHP [`send_request_query_parameters` config option](/php/configuration/options#option-send_request_query_parameters) and [`send_request_payload` config option](/php/configuration/options#option-send_request_payload) documentation ## Processor parameter filtering When some sensitive parameters are still sent by your app to AppSignal, we will filter these out during processing. This means the data was sent to our servers, where we received and temporarily store this "pre-processing data". AppSignal filters out [a list of keys](#processor-filtered-keys) from the parameters during processing. These keys are not customizable. These filtered values are replaced with `[REMOVED]` (rather than `[FILTERED]`) to indicate these values were filtered in our processors rather than in your app. Only after this processing, your data is viewable on AppSignal.com. Before that, none of the potentially sent sensitive data is visible to any member of your organization on AppSignal.com. The pre-processing data is removed shortly after processing. This step should **not** be relied upon. If a parameter value is shown as `[REMOVED]` on AppSignal.com, the app's config should be updated to filter out the parameter instead. This way sensitive data does not leave your app. *We always use SSL to encrypt data being sent between your apps and our servers. Any app data containing values that are removed by the processor is deleted shortly after processing.* ### Processor filtered keys The current list of filtered parameter keys by the processor: * `password` * `password_confirmation` ## Recommended keys to filter A non-exhaustive list of parameter keys that may be used by an application. Pick those keys that are relevant for your applications. * Names * `name` * `full_name` * `first_name` * `last_name` * Email addresses * `email` * `email_address` * Passwords * `password` * `password_confirmation` * `confirm_password` * (API) tokens * `token` * `api_token` * Addresses * `street` * `city` * `country` * `post_code` * User information * `phone_number` ## Managing PII and HIPAA Requirements If your app processes Personal Health Information (PHI) and you're a HIPAA-covered entity, you can sign a Business Associate Agreement (BAA) with AppSignal to ensure HIPAA compliance. More information about this can be found in our [Business Add-Ons documentation](/support/business-add-ons). ## See also * [Data filtering guide](/guides/filter-data) - Filter app data in AppSignal integrations # Session data filtering Source: https://docs.appsignal.com/application/session-data-filtering AppSignal gathers session data for HTTP requests by default for supported frameworks. This data may help track down errors or performance issues that were caused by some session data an app is using. Some of this session data may contain sensitive user information though which should not be sent to the AppSignal servers. Use session data filtering to [filter out specific keys](#filter-session-data) or [disable the feature entirely](#filter-all-session-data). 🔐 Do not send Personal Identifiable Information (PII) to AppSignal. Filter PII (e.g., names, emails) and use an ID, hash, or pseudonymized identifier instead.

For HIPAA-covered entities, more info on signing a Business Associate Agreement (BAA) is available in our Business Add-Ons documentation.
## Filter session data An app's session data can be filtered by configuring keys in a *denylist*. This denylist system will filter out all the session data keys configured in this list. Any session data values that are filtered out by these systems will be replaced with a `[FILTERED]` value. This way the list of session data in the app data on AppSignal.com still includes the session data key, but not the value. Making it easier to see that a value was present, but the potentially sensitive data was filtered out. 📖 Read our guide about [setting up session data filtering](/guides/filter-data/filter-session-data) for your app. ## Filter all session data To filter all session data without individual key filtering, set the "send session data" config option to "false" in the integration configuration. * [Ruby `send_session_data` config option documentation](/ruby/configuration/options#option-send_session_data) * [Elixir `send_session_data` config option documentation](/elixir/configuration/options#option-send_session_data) * [Node.js `sendSessionData` config option documentation](/nodejs/3.x/configuration/options#option-send_session_data) * [Python `send_session_data` config option documentation](/python/configuration/options#option-send_session_data) * [Go `send_request_session_data` config option documentation](/go/configuration/options#option-send_request_session_data) * [PHP `send_request_session_data` config option documentation](/php/configuration/options#option-send_request_session_data) ## Recommended keys to filter A non-exhaustive list of session data keys that may be used by an application. Pick those keys that are relevant for your applications. * Email addresses * `email` * `email_address` * Tokens * `token` * `api_token` * `sign_up_token` * `reset_password_token` ## Managing PII and HIPAA Requirements If your app processes Personal Health Information (PHI) and you're a HIPAA-covered entity, you can sign a Business Associate Agreement (BAA) with AppSignal to ensure HIPAA compliance. More information about this can be found in our [Business Add-Ons documentation](/support/business-add-ons). ## See also * [Data filtering guide](/guides/filter-data) - Filter app data in AppSignal integrations # Application settings Source: https://docs.appsignal.com/application/settings All settings for an application can be found by clicking the "App Settings" link in the main menu after you've navigated to an application. ## General If your app is not connected to a repository on GitHub you can connect it. If it is connected you can change the linked repository. You need to authenticate with GitHub to use this feature. You can either do this by signing in via GitHub, or by linking your GitHub account in your [user settings](/user-account). An application linked to GitHub gives you additional features like direct links to commits. [Visit the "General" page for your app](https://appsignal.com/redirect-to/app?to=edit) ## Notifications AppSignal can send alert for a number of events. Configure when a notification is sent on this page. See the [application integrations page](/application/integrations) to configure where the notification is sent to. [Visit the Notifications page for your app](https://appsignal.com/redirect-to/app?to=notifiers) ## Team permissions This page gives an overview of the teams and people that have access to an application. You can change the owners and permissions by editing clicking on the "Manage owners|this team" link. Read more about [team management](/organization/team/members) in the Organization topic. [Visit the Team permissions page for your app](https://appsignal.com/redirect-to/app?to=teams) App settings teams ## Push & Deploy On the "Push & Deploy" page you can find your application's "Push API Key" and some snippets to set up deploy notifications. [Visit the Push & Deploy page for your app](https://appsignal.com/redirect-to/app?to=info) # Tagging Source: https://docs.appsignal.com/application/tagging You can supply extra context on errors and performance traces using tags. Tags are key-value data that can be used to search and filter data. 🔐 Do not send Personal Identifiable Information (PII) to AppSignal. Filter PII (e.g., names, emails) and use an ID, hash, or pseudonymized identifier instead.

Use [Link Templates](https://docs.appsignal.com/application/link-templates) to link them back in your app.
📖 Also read our guides on how to set up [tags](/guides/tagging). ## Tags Tags can be used to add information that is not already part of the trace [metadata](/application/metadata) (request parameters, session data, request headers, etc.). Using tags you can easily add more information to errors and performance issues tracked by AppSignal. Maybe while debugging an issue you want to know which user faced the problem, you can pass in the user id or maybe to easily access the user data you can pass in the URL of your admin panel (using link templates) which will take you directly to the customer page. ### Link templates Tags can also be used to create link templates. Read more about link templates in our [link templates guide](/application/link-templates). # Process Monitoring Source: https://docs.appsignal.com/check-ins Learn how to set up and manage AppSignal Process Monitoring AppSignal Process Monitoring provides visibility into the state of background processes such as cron jobs. Process Monitoring helps answer questions like: Once configured, AppSignal will track the execution of background processes and scheduled jobs, giving insights into individual runs and notifying you if a process doesn't notify us of completion. You can configure two kinds of process monitors with AppSignal: **cron process monitors** and **heartbeat process monitors**. Use cron process monitors to track the execution of processes scheduled to run at a specific time, such as cron jobs. Use heartbeat process monitors to track the uptime of a process that should run continuously, such as a server application or a background job processor. ## Getting started First, [create a process monitor in AppSignal](/check-ins/create#create-a-process-monitor), setting the expected schedule for your cron job, or the expected interval between heartbeat process monitor events. For example, you can have a process monitor for a scheduled job that should run every hour for at most 20 minutes, or a background job processor that should report a heartbeat process monitor event at most every 5 minutes. Then, [configure your scheduled job or background process to send process monitor events to AppSignal](/check-ins/configuration). A cron job should send a process monitor event at the start and end of each occurrence, while a background job should send a process monitor event at regular intervals. AppSignal will then [track the process monitor events it receives and compare them to the expected occurrences](/check-ins/occurrences). When AppSignal expects a process monitor event but doesn't receive one in time, it will notify you as configured in the process monitor, helping you ensure that your application's vital processes are working as expected. # Sending process monitor events to AppSignal Source: https://docs.appsignal.com/check-ins/configuration In order to receive events for your AppSignal Process Monitoring, you must configure your application to send process monitor events to AppSignal. ## AppSignal integrations If your application is already using an AppSignal integration library, such as our Ruby gem or our Elixir, Node.js and Python packages, you can use the provided helper methods to send process monitor events. Follow the instructions in the [integration process monitor helpers documentation](/check-ins/configuration/integrations) for your integration. ## Process monitoring with AppSignal Wrap If the application you wish to send process monitors from is not using an AppSignal integration library, for example, if you wish to send cron process monitors when a process starts or finishes, or heartbeat process monitors while a process runs, you can send process monitor events using our wrap tool: ```shell Shell theme={null} appsignal-wrap my-process-name --cron -- /path/to/my/process appsignal-wrap my-process-name --heartbeat -- /path/to/my/process ``` Learn more about how to use `appsignal-wrap` to send process monitors to AppSignal in our [AppSignal Wrap documentation](/wrap#process-monitoring). ## HTTP API You can also send process monitors from any application using our HTTP API. Follow the instructions in the [process monitor events API documentation](/check-ins/configuration/api). # Sending process monitor events using the AppSignal API Source: https://docs.appsignal.com/check-ins/configuration/api Before sending process monitor events to AppSignal, you must first [create a process monitor in AppSignal](/check-ins/create#create-a-process-monitor). You can send process monitor events to AppSignal by performing HTTP POST requests to the AppSignal API, using any HTTP client. The examples in this page provide a sample cURL command, as well as the raw HTTP method and URL to use with any HTTP client of your choice. In the examples below, replace `YOUR-APP-LEVEL-API-KEY` with the AppSignal app-level push API key for your app, which can be found in [your application's "Push & Deploy" settings](https://appsignal.com/redirect-to/app?to=api_keys\&key_tab=app), and `YOUR-PROCESS-MONITOR-IDENTIFIER` with the identifier of the process monitor you wish to send events to. The Process Monitoring API still uses `check_ins` in endpoint URLs for compatibility with existing integrations. ## Sending cron process monitor events Cron process monitors are used to monitor the execution of scheduled jobs, such as cron jobs. AppSignal will expect to receive a finish cron process monitor event according to its configured schedule, and will notify you if no finish cron process monitor event is received within its configured maximum duration. Additionally, you can send start cron process monitor events to AppSignal to notify that a cron process monitor event has started, allowing you to measure the duration of your cron jobs. ### Finish cron process monitor To notify AppSignal that a cron job has finished successfully, send a POST request to the AppSignal API with the following URL query parameters: ```curl Curl theme={null} curl -D - -X POST -G 'https://appsignal-endpoint.net/check_ins/cron' \ -d 'api_key=YOUR-APP-LEVEL-API-KEY' \ -d 'identifier=YOUR-PROCESS-MONITOR-IDENTIFIER' ``` ```http HTTP theme={null} POST https://appsignal-endpoint.net/check_ins/cron ?api_key=YOUR-APP-LEVEL-API-KEY &identifier=YOUR-PROCESS-MONITOR-IDENTIFIER ``` AppSignal will notify you if no finish cron process monitor event is received within the cron process monitor's configured maximum duration. ### Start cron process monitor Sending a start cron process monitor event is entirely optional. Doing so allows you to measure the duration of your cron jobs. To notify AppSignal that a cron job has started, send a POST request to the AppSignal API with the following URL query parameters: ```curl Curl theme={null} curl -D - -X POST -G 'https://appsignal-endpoint.net/check_ins/cron' \ -d 'api_key=YOUR-APP-LEVEL-API-KEY' \ -d 'identifier=YOUR-PROCESS-MONITOR-IDENTIFIER' \ -d 'kind=start' ``` ```http HTTP theme={null} POST https://appsignal-endpoint.net/check_ins/cron ?api_key=YOUR-APP-LEVEL-API-KEY &identifier=YOUR-PROCESS-MONITOR-IDENTIFIER &kind=start ``` #### Sending a digest When sending a start cron process monitor, we recommend sending a digest for both the start and finish events. The digest is an arbitrary value that is used to correlate the start and finish cron process monitor events. It should be the same for both the start and finish events, and it should be unique for each pair of start and finish events. Sending a digest is optional, but it is highly recommended when sending a start cron process monitor event, as it ensures that the start and finish events are correlated correctly. ```curl Curl theme={null} curl -D - -X POST -G 'https://appsignal-endpoint.net/check_ins/cron' \ ... \ -d 'digest=abc123' ``` ```http HTTP theme={null} POST https://appsignal-endpoint.net/check_ins/cron ... &digest=abc123 ``` ## Sending heartbeat process monitor events Heartbeat process monitors are used to monitor the uptime of a process that should run continuously, such as a server application or a background job processor. AppSignal will expect to receive heartbeat process monitor events continuously, and will notify you if no heartbeat process monitor event is received within its configured maximum duration. To send a heartbeat process monitor event to AppSignal, send a POST request to the AppSignal API with the following URL query parameters: ```curl Curl theme={null} curl -D - -X POST -G 'https://appsignal-endpoint.net/check_ins/heartbeats' \ -d 'api_key=YOUR-APP-LEVEL-API-KEY' \ -d 'identifier=YOUR-PROCESS-MONITOR-IDENTIFIER' ``` ```http HTTP theme={null} POST https://appsignal-endpoint.net/check_ins/heartbeats ?api_key=YOUR-APP-LEVEL-API-KEY &identifier=YOUR-PROCESS-MONITOR-IDENTIFIER ``` # Sending process monitor events using the AppSignal integrations Source: https://docs.appsignal.com/check-ins/configuration/integrations The AppSignal integrations for [Ruby](/ruby), [Elixir](/elixir), [Node.js](/nodejs) and [Python](/python) offer helper methods and functions that allow you to easily send process monitor events to AppSignal. The integration helpers still use `CheckIn`, `checkIn`, and `check_in` in code for compatibility with existing applications. ## Cron process monitor events To notify AppSignal that a cron job has finished successfully, use the `cron` helper function, passing the name of the cron process monitor as an argument. ```ruby Ruby theme={null} def send_invoices # ... your code here ... Appsignal::CheckIn.cron("send_invoices") end ``` ```elixir Elixir theme={null} def send_invoices do # ... your code here ... Appsignal.CheckIn.cron("send_invoices") end ``` ```javascript Node.js theme={null} import { checkIn } from "@appsignal/nodejs"; function sendInvoices() { // ... your code here ... checkIn.cron("send_invoices"); } ``` ```python Python theme={null} from appsignal.check_in import cron def send_invoices(): # ... your code here ... cron("send_invoices") ``` It is safe to call the `cron` helper function many times in a short period, as the helper will only send a finish event to AppSignal at most once every ten seconds. ### Monitoring the job's duration To monitor the duration of a cron job, you can use the `cron` helper function with a block or function that contains the code you want to monitor. This will send events to AppSignal both when the job starts and when it finishes. ```ruby Ruby theme={null} def send_invoices() Appsignal::CheckIn.cron("send_invoices") do # ... your code here ... end end ``` ```elixir Elixir theme={null} def send_invoices do Appsignal.CheckIn.cron("send_invoices", fn -> # ... your code here ... end) end ``` ```javascript Node.js theme={null} import { checkIn } from "@appsignal/nodejs"; function sendInvoices() { checkIn.cron("send_invoices", () => { // ... your code here ... }); } // If the function passed to `cron` returns a promise, the finish event // will be reported to AppSignal if the promise resolves, allowing you // to track the duration of async functions: async function sendInvoices() { await checkIn.cron("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. ``` ```python Python theme={null} from appsignal.check_in import Cron def send_invoices(): with Cron("send_invoices"): # ... your code here ... ``` If an exception is raised within the function or method being monitored, the finish event will not be reported to AppSignal, triggering a missing process monitor notification. The exception will be re-raised. If the context in which the exception is raised is an AppSignal-monitored context, then the exception will be reported to AppSignal. Otherwise, if you wish to report the exception to AppSignal, you can use our exception handling helpers for [Ruby](/ruby/instrumentation/exception-handling#appsignalreport_error), [Elixir](/elixir/instrumentation/exception-handling#appsignalsend_error3), [Node.js](/nodejs/3.x/instrumentation/exception-handling#send-error) or [Python](/python/instrumentation/exception-handling#send_error). ## Heartbeat process monitor events To send a heartbeat process monitor event to AppSignal, use the `heartbeat` helper function, passing the name of the heartbeat process monitor as an argument. It is safe to call `heartbeat` many times, as the helper will only send a heartbeat event to AppSignal at most every ten seconds. ```ruby Ruby theme={null} loop do Appsignal::CheckIn.heartbeat("job_processor") # ... your code here ... end ``` ```elixir Elixir theme={null} def job_processing_loop do Appsignal.CheckIn.heartbeat("job_processor") # ... your code here ... job_processing_loop() end ``` ```javascript Node.js theme={null} import { checkIn } from "@appsignal/nodejs"; while (true) { checkIn.heartbeat("job_processor"); // ... your code here ... } ``` ```python Python theme={null} from appsignal.check_in import heartbeat while True: heartbeat("job_processor") # ... your code here ... ``` ### Sending heartbeats continuously To send heartbeat process monitors continuously, you can pass the `{ continuous: true }` option to the `heartbeat` helper function. This is useful to monitor the lifetime of the process itself. The helper will send a heartbeat event to AppSignal every thirty seconds. ```ruby Ruby theme={null} Appsignal::CheckIn.heartbeat("job_processor", continuous: true) ``` ```elixir Elixir theme={null} # This call spawns a new Elixir process, linked to the current process. # If the current process exits, the heartbeat process will also exit. Appsignal.CheckIn.heartbeat("job_processor", continuous: true) # It is also possible to add a continuous heartbeat sending process # to a supervision tree. This will ensure that the process is restarted # alongside the rest of the supervised children. Supervisor.start_link([ {Appsignal.CheckIn.Heartbeat, "job_processor"}, # ... other children processes ... ], strategy: :one_for_one) ``` ```javascript Node.js theme={null} import { checkIn } from "@appsignal/nodejs"; checkIn.heartbeat("job_processor", { continuous: true }); ``` ```python Python theme={null} from appsignal.check_in import heartbeat heartbeat("my_app", continuous=True) ``` ## Reviewing process monitor occurrences in AppSignal Once configured, AppSignal will begin to display information about occurrences for your process monitors. You can read more about occurrences in our [process monitor occurrences documentation](/check-ins/occurrences). # Creating and managing process monitors Source: https://docs.appsignal.com/check-ins/create ## Create a process monitor To create a process monitor, navigate to the [Process Monitoring page](https://appsignal.com/redirect-to/app?to=check_ins) and click "Add process monitor". On the side, you can select whether to create a cron process monitor or a heartbeat process monitor. The following options can be set: * **Identifier:** A name to uniquely identify this process monitor in your application. You will use this name later when [configuring your application to send process monitor events](/check-ins/configuration). * **Schedule:** The schedule at which AppSignal expects to receive cron process monitor events, specified using crontab syntax. You can learn more about crontab syntax in our [Crontab Learning Center article](https://www.appsignal.com/learning-center/how-can-i-use-the-cron-syntax-to-schedule-cron-jobs). * **Server timezone:** The timezone to use to interpret the cron process monitor schedule. If you're using `cron` to run your scheduled jobs, then this should match your server's configured timezone, as that is the timezone `cron` will use. When in doubt, **we recommend leaving this configuration option on its default value of UTC.** * **Maximum duration:** The maximum run-time of your job in minutes. If a cron process monitor event is not received between the start time determined by the schedule and the end of the maximum job duration, or if a heartbeat process monitor event is not received within this duration from the last heartbeat process monitor event, it will be reported as failing. * **Description:** An optional description of what this process monitor monitors. * **Notify me through:** The channels that AppSignal should use to notify you of any missed or late process monitor occurrences. Screenshot of cron process monitors form For a cron process monitor, a finish process monitor event will be expected for each of the occurrences defined by the schedule, before the maximum duration has passed. For a heartbeat process monitor, heartbeat events will be expected continuously, before the maximum duration since the last heartbeat event has passed. When this expectation isn't met, the process monitor occurrence will be considered failed, and AppSignal will notify you as configured. Once created, you need to [configure your application to send process monitor events](/check-ins/configuration) to AppSignal. ## View all process monitors To view all of your app's process monitors, go to [the process monitors overview page](https://appsignal.com/redirect-to/app?to=check_ins). You can get there from the AppSignal app navigation sidebar: Screenshot of Process Monitoring overview Clicking on the process monitor name will take you to the [process monitor's occurrence overview](/check-ins/occurrences). ### Edit a process monitor To edit a process monitor's settings, navigate to [the process monitors overview page](https://appsignal.com/redirect-to/app?to=check_ins) in the AppSignal app, click on the name of the process monitor you want to change the settings of, then click "Edit" to modify the process monitor's settings. See the [Create a process monitor](#create-a-process-monitor) section for more information on the settings. ### Remove a process monitor To remove a process monitor, click on the name of the process monitor you want to remove, then click "Remove" and follow the on-screen instructions. # Process monitor occurrences Source: https://docs.appsignal.com/check-ins/occurrences You'll be able to begin monitoring your process monitors in AppSignal after: * [Creating a process monitor in AppSignal](/check-ins/create) * [Configuring your application to send process monitors to AppSignal](/check-ins/configuration) A process monitor consists of occurrences which can succeed or fail. For a cron process monitor, an occurrence is a time at which, according to its configured schedule, AppSignal expects to receive a start and finish event for this process monitor. A cron process monitor's occurrence succeeds if it receives a finish event during its maximum duration. For a heartbeat process monitor, an occurrence is a time at which AppSignal has received a heartbeat event, and an occurrence succeeds if it receives another heartbeat event during its maximum duration. ## Viewing process monitors To view all of your app's process monitors, click on the Process Monitoring overview via the AppSignal app navigation: Screenshot of Process Monitoring overview Here, you will have an overview of your process monitors with the following columns: | Column name | Description | | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Identifier and type | The identifier of your process monitor and its type. | | Schedule | The schedule of your process monitor: the crontab syntax for cron process monitors, or the maximum duration between heartbeats for heartbeat process monitors. | | Last failure | The last time a process monitor occurrence failed. | | Last success | The last time a process monitor occurrence succeeded. | | Last occurrence | The status of the last process monitor occurrence. | ## Statuses The state of a process monitor will be that of its last occurrence. Process monitor occurrences will have one of the following statuses: | Status | Description | | ------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------- | | New | No events have yet been received for this process monitor. | | Success | The process monitor occurrence has been completed within its maximum duration. | | Late | The process monitor occurrence has been completed *after* its maximum duration. | | Missed | The process monitor occurrence has not been completed. | | Running | A start cron process monitor event has been received, or a previous heartbeat's maximum duration has not yet passed. | Late or missed process monitor occurrences are considered to have failed, and AppSignal will notify you that the process monitor has failed according to your process monitor's settings. ## Process monitor summary Clicking on the identifier of a process monitor will take you to an overview of: * **The last five occurrences:** The timestamps for the last five occurrences for the process monitor alongside their status. * **The last five failed occurrences:** The timestamps for the last five missed or late process monitor occurrences. Screenshot of Process Monitoring summary # Wrap process monitoring Source: https://docs.appsignal.com/check-ins/wrap-process-monitoring ## Process Monitoring [Read our Process Monitoring documentation](/check-ins) for more information on how AppSignal Process Monitoring works. By default, `appsignal-wrap` will not send any process monitor events. You can use the `--cron` or `--heartbeat` command-line options to enable cron or heartbeat process monitors respectively. The `appsignal-wrap` tool will use the name provided as the first argument as the process monitor identifier. For example, to report cron process monitor events with `backup-script` as the process monitor identifier: ```sh Shell theme={null} appsignal-wrap backup-script --cron -- bash /var/app/backup.sh ``` ### Cron process monitors When using `--cron` to send cron process monitors, `appsignal-wrap` will send a start cron process monitor event when the process starts, and a finish cron process monitor event if the process finishes successfully. If the process exits with a failure exit status, `appsignal-wrap` will not send a finish cron process monitor event. ### Heartbeat process monitors When using `--heartbeat` to send heartbeat process monitors, `appsignal-wrap` will send heartbeat process monitor events continuously during the lifetime of the process. ### Custom identifier To send process monitor events to AppSignal with an identifier different from the name provided as the first argument, you can pass a different identifier as an argument to the `--cron` or `--heartbeat` command-line options. For example: ```sh Shell theme={null} appsignal-wrap backup --cron daily-backup -- bash /var/app/backup.sh ``` In the above example, `appsignal-wrap` will send cron process monitor events with `daily-backup` as the process monitor identifier, but will still use `backup` as the name to identify the process when reporting logs and errors. # Custom instrumentation Source: https://docs.appsignal.com/custom-instrumentation Where to add manual instrumentation when automatic tracing is not enough. Automatic instrumentation gives AppSignal a strong starting point, but some important work in your application is specific to your product. Custom instrumentation helps you add spans, attributes, metadata, and error context in the places that matter most to you. Pick the guide that matches the SDK you use: * [Ruby](/ruby/instrumentation) * [Elixir](/elixir/instrumentation) * [Node.js](/nodejs/3.x/instrumentation) * [Front-end JavaScript](/front-end/span) * [Python](/python/instrumentation) * [Go](/go/custom-instrumentation) * [Java](/java/custom-instrumentation) * [PHP](/php/instrumentation) * [OpenTelemetry](/opentelemetry/custom-instrumentation) If you are extending OpenTelemetry setup specifically, also see [Add additional OpenTelemetry Instrumentation](/guides/instrumentation/additional-opentelemetry-instrumentation). # Errors Source: https://docs.appsignal.com/errors How AppSignal tracks, groups, and alerts on errors, and where to report handled exceptions. AppSignal captures the exceptions your application raises, groups them so they are easy to triage, and alerts you when something needs attention. Errors are tightly coupled to traces: an error usually happens inside a request, background job, or script run, and the surrounding trace gives you the timing and context you need to debug it. ## How AppSignal groups errors When your application reports an exception, AppSignal groups it into an **issue** with other occurrences of the same error type on the same action and namespace. A single bug that fires thousands of times becomes one issue to triage, not thousands of separate alerts. Each issue keeps a set of **samples**: representative occurrences with the full backtrace, request metadata (such as hostname, revision, and request path), and any tags you add. ## Triage and notifications Each issue can be assigned to a team member, given a state and a severity, and configured with its own notification settings. AppSignal notifies you through your configured channels (email, Slack, and other integrations) when a new error is detected. ## Namespaces Errors are grouped by namespace, so you can separate web requests from background jobs. The default namespaces are Web and Background, and you can configure custom ones. See [Namespaces](/guides/namespaces) for details. ## Alerting on error rates Beyond per-error notifications, [anomaly detection](/anomaly-detection) can alert you when the error rate for an application or namespace crosses a threshold you set. ## Reporting handled exceptions If you catch an exception yourself, you can still report it to AppSignal with the helper methods provided by your SDK. The exact helper names vary by SDK, but the goal is the same: keep the error attached to the trace, or send it with useful context. * Ruby: [`report_error`, `set_error`, and `send_error`](/ruby/instrumentation/exception-handling) * Elixir: [`Appsignal.set_error/2` and `Appsignal.send_error/3`](/elixir/instrumentation/exception-handling) * Node.js: [`setError()` and `sendError()`](/nodejs/3.x/instrumentation/exception-handling) * Python: [`set_error` and `send_error`](/python/instrumentation/exception-handling) * PHP: [Exception handling](/php/exception-handling) * Front-end JavaScript: [Error handling](/front-end/error-handling) ## Add debugging context To make errors easier to investigate, add more context with: * [Tagging](/application/tagging) * [Backtrace links](/application/backtrace-links) * [Performance / tracing](/performance-tracing) # AppSignal Documentation Source: https://docs.appsignal.com/getting-started Learn how to set up error tracking, performance monitoring, logging, and more for your application. AppSignal is an application monitoring platform that provides error tracking, performance monitoring, logging, and uptime monitoring for your projects. This documentation covers everything from initial setup to advanced configuration. 🛟 Looking for help? Check out the [support](#support) section. ## Getting Started New to AppSignal? The guides below walk you through all the steps required to set up AppSignal with your application. Step-by-step walkthroughs for setting up AppSignal in your application. ### YouTube — AppSignal in 5 minutes: A quick start guide