\[1] This time does not account for retries of data being transmitted from app servers. Data that has failed to be transmitted, because a server has lost its internet connection for example, will be retried up to 30 minutes by our agent.
β©
# General Data Protection Regulation (GDPR)
Source: https://docs.appsignal.com/appsignal/gdpr
AppSignal has always had a strong focus on protecting any data we collect and process. As a European owned and operated business we appreciate the solidification of this through the General Data Protection Regulation (GDPR) laws that enter into effect on May 25, 2018.
Below you'll read how GDPR applies to AppSignal, our customers and the people our customers collect data from.
## Compliance in relation to our employees and vendors
AppSignal B.V. is the entity that owns and operates the AppSignal service, a business located in the Netherlands and therefore bound by Dutch and European law. This entity is fully GDPR compliant, which means we only request and process data based on legal bases as defined in the GDPR. In cooperation with our counsel we have made a thorough assessment of all of our processes and data stores.
Where needed, we changed our internal policies and procedures to be in compliance with GDPR, and deleted data that we didn't need or want. We also defined a new Privacy Policy and wrote a Data Processing Agreement (more on that below).
Finally, we reached out to our vendors to request agreements to ensure that we remain compliant when using their services.
## Compliance in relation to our customers
In relation to our customers, AppSignal is both a Data Controller and a Data Processor depending on the type of data collected.
### Data Controller
AppSignal is the Data Controller for the information we collect about our customers and visitors, which means that we determine the "purposes and means" of the data we collect as the Controller. Some examples: their name, their email address, their credit card number, and any other data that we collect based on the GDPR legal bases. This data is safeguarded by various policies and procedures.
When sharing data with vendors, we have made sure there are contracts in place that ensure they also receive and process this data in a lawful way.
You can read more about the data we collect for which purpose in our new [Privacy Policy](https://www.appsignal.com/privacy-policy).
### Data Processor
Our customers are the Data Controllers for the data that their applications gather and send to AppSignal. AppSignal processes that data on behalf of them, which makes us the Data Processor. To enable our customers to be fully GDPR compliant while using AppSignal, we have taken various measures.
In short: AppSignal doesn't wish to receive any personal data about your visitors, and will provide the tools that enable you to strip this information before sending it to AppSignal for processing. For more details, see below.
#### Data Processing Agreement
We have created a Data Processing Agreement that explains eg. how we are a Data Processor, how we limit processing to the level needed to be able to provide the AppSignal service, that we will ensure that our vendors are compliant too, etc (this is an incomplete list for illustrative purposes only; please see the full Data Processing Agreement for all the details).
The Data Processing Agreement is accessible to all owners for an organization on AppSignal. Open the Data Processing Agreement for [your organization](https://appsignal.com/redirect-to/organization?to=admin/data_processing_agreements) (there is one for each organization). You can digitally sign the Data Processing Agreement, and once signed we will display who signed it and when.
#### Allowed request headers only
We have always made sure to strip any personal data from incoming events such as database queries, but we did store request headers such as `REMOTE_ADDR`. Depending on architecture, this can expose useful information about load balancers or internal IP addresses. In most cases though, this sent visitor IP addresses to AppSignal. Since IP addresses are personal data, we have created a default allowlist of headers that we believe will not contain personal data. Customers can add additional headers to the allowlist ([Ruby](/ruby/configuration/options#option-request_headers) / [Elixir](/elixir/configuration/options#option-request_headers)) as needed, as long a they don't identify an individual (eg. if `REMOTE_ADDR` contains the IP address of a load balancer, that's fine).
Any non-allowlisted headers are stripped before being sent to AppSignal.
#### Filtering options for parameters and session data
We've had filtering options for *parameters* for a long time already, but in our [parameter filtering documentation](/application/parameter-filtering) we now stress the importance with regard to GDPR.
Recent Ruby gem, Elixir package and Node.js package releases expand this filtering feature to [session data](/application/session-data-filtering) too. It allows customers to send parameters to AppSignal without exposing personal data, by replacing that data with `[FILTERED]`. Alternatively, a customer can choose to not send any parameters ([Ruby](/ruby/configuration/options#option-send_params)) or session data ([Ruby](/ruby/configuration/options#option-skip_session_data) / [Elixir](/elixir/configuration/options#option-skip_session_data) / [Node.js](/nodejs/3.x/configuration/options#option-sendsessiondata))) at all.
Data is filtered before being sent to AppSignal.
#### Requirements for Tagging
We have changed the documentation for our [Tagging](/application/tagging) and [Metadata](/application/metadata) features to strongly state that no personal data should be sent to AppSignal in tags, and that user IDs, hashes or pseudonymized identifiers should be used instead.
#### Documentation search (Algolia DocSearch)
Our documentation website at docs.appsignal.com uses Algolia DocSearch to provide search functionality. When you use the search, Algolia collects anonymous usage data such as search queries, clicks, and page views to improve search result relevance. Algolia generates an anonymous, ephemeral token for each page visit β no cookies are set and no cross-session tracking occurs. This data does not include any personally identifiable information (PII), and is retained for 90 days before being automatically purged. For more information, see [Algolia's privacy policy](https://www.algolia.com/policies/privacy).
#### Data removal procedure
Any details about a request are stored within what we call "samples". These samples have a retention of 30, 45 or 60 days depending on plan. This has always been the case, but is important with regard to GDPR as well. It means that if any personal data was collected accidentally, it will still be purged after a maximum of 60 days. After that, we only keep aggregated data.
If a customer notices that personal data was accidentally sent as part of a sample, we have instated a procedure that allows us to remove one or more samples when requested in an email to [support@appsignal.com](mailto:support@appsignal.com).
# How AppSignal integrations operate
Source: https://docs.appsignal.com/appsignal/how-appsignal-operates
AppSignal consists of many different systems working together. This page will explain what systems are part of the integrations we ship for [Ruby](/ruby) and [Elixir](/elixir), and how they work together.
* [Language libraries](#language-libraries)
* [Extension](#extension)
* [Agent](#agent)
* [Working directory](#working-directory)
* [Location](#location)
* [Permissions](#permissions)
## Language libraries
The AppSignal [Ruby gem](https://rubygems.org/gems/appsignal) and [Elixir package](https://hex.pm/packages/appsignal) provide integration for their respective programming language and popular libraries (for [Ruby](/ruby/integrations) and [Elixir](/elixir/integrations)) from its ecosystem, to provide error reporting and performance insights. It is currently required to use one of these libraries to integrate AppSignal into your app and collect [host metrics](/metrics/host-metrics) from its host.
When you install the AppSignal Ruby gem and Elixir package in your app, a native [extension](#extension) for the programming language is compiled alongside it. This extension communicates with the [agent](#agent) to efficiently process your data and sent it to the AppSignal [Push API](/appsignal/terminology#push-api).
When you boot your application with AppSignal installed, the AppSignal agent will be started in the background. It will only start one agent per configuration, if a new configuration is found a new agent will start and the agents for other versions will be shutdown.
## Extension
The AppSignal extension communicates between the programming language and the AppSignal agent. One part is written in Rust and the other in the C programming language. The host machine on which AppSignal is installed therefore need a working [C compiler](https://en.wikipedia.org/wiki/C_%28programming_language%29) present. Usually this is already installed on the host machine, but for a lot of Docker images this is often not the case in order to keep the images small. The required packages for your Operating System are listed on our [supported Operating Systems](/support/operating-systems) page.
There are two parts to AppSignal extension, the C-extension and the static/dynamic library written in [Rust](https://www.rust-lang.org/en-US/). The C-extension for [Ruby](https://github.com/appsignal/appsignal-ruby/blob/main/ext/appsignal_extension.c) and the [Nif](/elixir/why-nif) for [Elixir](https://github.com/appsignal/appsignal-elixir/blob/develop/c_src/appsignal_extension.c) will implement the AppSignal library interface so the AppSignal language library can communicate with it. A separate library is used so the implementation can be shared between AppSignal [libraries](#language-libraries).
The extension communicates with the agent over a socket, for which the pointer is stored in the agent's [working directory](#working-directory). This communication is one way only, the extension sends the recorded data to the agent and the agent sends this to the AppSignal servers.
## Agent
Once started by the [extension](#extension), the AppSignal agent will keep running in the background of your application as a daemonized process. It will handle connections from multiple clients (app processes through the [extension](#extension)) when needed. For example, if you run both Unicorn (web server) and Sidekiq (background job library) at the same time, there will only be one AppSignal agent running for both processes. If the connection to the agent is lost clients will automatically reconnect and/or start a new agent. (Restart behavior added in Ruby gem version `2.4.0`, Elixir package version `1.4.0` and Node.js `1.0.0`).
On boot the agent will try to locate a proper [working directory](#working-directory) in which it can store some of its temporary operating files. It needs to create and write files to the working directory and create the `appsignal.log` file before it can boot properly. If it fails to do so, it will not properly boot and exit. The agent requires a location to store the `appsignal.log` file as the `stdout` value for the `log` config option (for [Ruby](/ruby/configuration/options#option-log) and [Elixir](/elixir/configuration/options#option-log)) will not apply to the agent. The agent cannot communicate its logs back over the socket with the extension.
The agent itself is a lightweight process written in [Rust](https://www.rust-lang.org/en-US/), that uses very little resources. It only keeps your data in memory for a very short time until it sends it to the AppSignal Push API, after which it flushes the data. If it cannot connect to the AppSignal Push API it will temporarily store the data to disk, see [working directory](#working-directory).
Over time the agent will receive monitoring data from your apps and start to aggregate them. After a 30 second transmission interval it will push the aggregated data to the AppSignal Push API. Here it will be processed, incidents and Anomaly detection alerts are created, and eventually notifications are sent to you, the user.
Periodically the agent will also read the system stats from the machine its running on to collect [host metrics](/metrics/host-metrics). This is done with help of the [probes-rs](https://github.com/appsignal/probes-rs) library written by AppSignal. The host metrics data is used for the host metrics feature to provide graphs and to show host metrics data for [samples](/appsignal/terminology#samples) at that time.
If a request to our [Push API](/appsignal/terminology#push-api) has failed, the payload of that request is written to disk in the [working directory](#working-directory) and it will retry to send the payload at the next transmission interval.
### Working directory
The working directory is used for several things that the AppSignal agent needs to keep operating. It's a required part of being able to run the AppSignal agent. If no suitable place for the working directory can be found, the agent will shutdown and the extension in your app will disable itself. It will no longer report any data to the AppSignal servers.
The working directory's responsibilities:
* `appsignal.log` fallback location
* The working directory functions as the fallback location for the `appsignal.log` file when no valid path can be detected and the given `log_path` location is unusable (config option for [Ruby](/ruby/configuration/options#option-log_path) and [Elixir](/elixir/configuration/options#option-log_path)). If not suitable location is found, such as in your project's `log/` directory, it will be stored in `{working_directory}/appsignal.log`. Read more about the [AppSignal logs](/support/debugging#logs).
* `agent.socket` file storage
* The AppSignal agent stores a socket file in `{working_directory}/agent.socket`, which is used by the AppSignal extension in your application to communicate with the agent. Whenever an AppSignal transaction finishes or you send a custom metric, this data is written to the socket and received by the agent. It will then aggregates this data and transmit it to the AppSignal Push API.
* `agent.lock` file storage
* The AppSignal agent stores a lock file (`agent.lock`) to ensure there's only one instance of the agent running with your app's configuration. If a new version of the agent is started, older versions will shutdown when they detect a newer version is running, allowing the newly started agent to handle all incoming data from that point on.
* Using one working directory, and lock file, for multiple apps running on the same machine this can create some odd behavior. For this reason we recommend using one working directory location per app. Read more about [running multiple applications on one host](/application/#running-multiple-applications-on-one-host).
* If you delete this file, or the entire working directory, the agent will shutdown immediately.
* `payloads` storage
* The payloads directory contains cached payloads written to disk for when the agent is having trouble connecting to our Push API. To avoid the agent's memory footprint increasing over time, this data is stored on disk temporarily. This allows us to make sure we don't lose any of your precious data if your network connection is down for a limited time or our Push API has a small hiccup. The amount of payloads that is stored on disk is automatically limited to the last couple of payloads, so this will always use a small disk space.
#### Location
The default location of the working directory is `/tmp/appsignal`. If you use a [Capistrano](http://capistranorb.com/) style directory structure it will create a directory named `appsignal` in `app/shared`. On [Heroku](https://heroku.com) style deployments it will create the directory in `/app/tmp`. If neither of these paths are detected, the AppSignal directory will be created in the default location.
The location of the working directory can be customized with the `working_directory_path` config option ([Ruby](/ruby/configuration/options#option-working_directory_path) / [Elixir](/elixir/configuration/options#option-working_directory_path)). Any path configured this way will have precedence over any path it can detect.
#### Permissions
By default the working directly is writable for everyone (Unix permissions `0666`). This is the default, because over time we've seen many support requests that originated from the working directory existing, but not being writable by the AppSignal agent. For example: when the app is started by the deploy user on deploy of the app, but by another user during a host restart. This gives directory ownership to one of the user accounts, while making it unwritable for the other user.
It's possible to disable the global read and write permissions (and give the working directory Unix permissions `0644`) by setting the `files_world_accessible` config option ([Ruby](/ruby/configuration/options#option-files_world_accessible) / [Elixir](/elixir/configuration/options#option-files_world_accessible)) to `false` for your apps.
# Security overview
Source: https://docs.appsignal.com/appsignal/security
These are the things we do at AppSignal to keep your data safe.
## Language specific libraries
The [Ruby gem](https://github.com/appsignal/appsignal-ruby), [Elixir package](https://github.com/appsignal/appsignal-elixir) and [Node.js package](https://github.com/appsignal/appsignal-nodejs) are public code, hosted on GitHub. You can browse the source to see how we handle the data. Our closed-source [agent](/appsignal/terminology#agent) will send the actual data to the AppSignal servers.
We have built several systems to filter or redact sensitive data from reaching our servers, please see the [data collection page](/application/data-collection) for more information.
## System agent
With the release of the AppSignal Ruby gem version 1.0 on the 12th of January 2016 we started shipping all our language integrations with a system agent.
When an application with AppSignal integration starts the language integration starts a separate UNIX process. The Ruby gem, Elixir package and Node.js package will send all transaction samples to this agent through a UNIX socket. The agent will periodically sends the transaction samples to the AppSignal servers.
The system agent will also collect host specific data such as CPU usage, load average, memory usage, disk usage, etc. See the [Host metrics](/metrics/host-metrics) for more information.
The data is sent through a secure (SSL) connection to our servers.
The code of this system agent is not publicly available, but uses the same basic principle of how our Ruby gem pre `1.0` sends the data to our servers.
## Payment information
All payments are handled through [Stripe](https://stripe.com). We do not store
or log any credit card information on our servers. The payment provider is PCI
compliant, and all credit card and other payment data is also sent over a
secure (SSL) connection.
## The AppSignal application
AppSignal runs exclusively on secure (SSL) connections and is hosted in a top
tier data center. The data center is monitored 24/7, both physically and
virtually. Your data is stored redundantly and any sensitive information is
stored in separate databases from other customers and long-term data (e.g.
graphs). Our systems are kept up-to-date with the latest security patches and
our network is locked down with firewalls and limited access.
## Your data
All the data we collect from your application is yours and can be retrieved at any point in time through [our API](/api). You can remove your data at any time in the [App Settings](https://appsignal.com/redirect-to/app?to=edit) for your app.
## Incidents
If you think you've found a security issue with regards to our application,
network or integrations, please let us know immediately by sending an email to
[security@appsignal.com](mailto:security@appsignal.com).
# Terminology
Source: https://docs.appsignal.com/appsignal/terminology
At AppSignal we use a lot of technical terms. Read on to learn more about the
language of AppSignal. See the list of terminology on the right-hand side of this page.
## Actions
Actions are the location in the code where an HTTP request, background job, cron job or task is started. For Ruby on Rails and Elixir's Phoenix apps, this is the controller and action combination, such as `BlogPostsController#create` or `Api::UsersController#index`. For background jobs, this will be the worker/job name, such as `UserMailer#sign_up_mail`.
Actions are used to group [issues](#issues) along with the [namespace](#namespace) and [error](#errors).
## Agent
AppSignal uses an "agent" to communicate with the AppSignal servers and instrument the hosts an application is running on. The host data is used in our [host metrics](/metrics/host-metrics) feature.
The agent is started by the language-specific [library](#libraries) and runs as a separate UNIX process on the application's host. The language library and agent communicate with each other through a UNIX socket using an [extension](#extension).
The transaction instrumentation data collected by the agent is sent to the AppSignal servers. The [transaction](#transactions) data is processed and used to detect events worth alerting users about.
Read more about how the AppSignal [agent operates](/appsignal/how-appsignal-operates) and the [life cycle of an AppSignal request](/appsignal/data-life-cycle).
## Allocations
During an HTTP request or a background job, an application uses memory. Every
data structure that's loaded and object that's instantiated takes up memory.
When a request or job handles a lot of data a lot more memory may be
used than is normal.
The AppSignal integration libraries keep track of allocations per
[transaction](#transactions). The integration also keeps track of what part of the
application allocates more memory objects than others, so it's possible to see
if the application's ORM or template library is taking up more memory.
On AppSignal.com the number of allocations is displayed in an Integer for an
action, event groups and specific events. This allocation number is the
number of objects that have been created in memory during an action/group/event. The
size of the created object is not tracked.
## Anomaly detection
Anomaly detection is an AppSignal feature that allows users to detect abnormalities in their apps. An anomaly could be something like an increased error rate or a limited amount of free memory on the app's host.
Anomaly detection works with trigger threshold conditions that create Alerts when their threshold is reached. When an Alert is opened, AppSignal will send notifications to whichever notifiers have been selected for the specific trigger.
See our documentation about [Anomaly detection](/anomaly-detection/) for more information.
## API
An API is an "Application Programming Interface". The term API is broad
and is used in many ways. In the context of our documentation, we refer to the
AppSignal HTTP REST API when using "API".
The AppSignal API is a HTTP REST API which can be used to retrieve data from
the AppSignal servers and augment the existing data with more information such
as [Markers](#markers).
The API differs from the [Push API](#push-api) in its purpose. While the Push
API is used to send data to AppSignal by the [agent](#agent), the HTTP REST
API is primarily used to retrieve data from AppSignal. This allows users to use
the available data in other tooling.
You can read more about our API in our [API documentation](/api).
## API key
To connect with the AppSignal [API](#api) it's necessary to
be authenticated. Every user has their API key to authenticate with
AppSignal.
Your API key can be found on your [user
profile](https://appsignal.com/users/edit).
This key is not to be confused with the [Push API key](#push-api-key) which is
used by [applications](#applications) with an AppSignal [agent](#agent)
installed.
## Applications
Applications (previously known as "sites", also referred to as "apps") are Ruby
and Elixir applications monitored by AppSignal.
After installing the AppSignal [library](#libraries) in an application
AppSignal starts monitoring these applications. Once we receive data from an
application, we register it using the application name and environment it's
running in.
An application can have multiple [environments](#environments) as long as every
environment uses the same name.
* "Demo application" - Development
* "Demo application" - Production
* "Demo application" - Staging
* "Demo application" - Test
Multiple applications can exist in one [organization](#organizations).
Read more about applications in our [Applications
documentation](/application).
## AppSignal vs Appsignal vs appsignal
Wait, they're *three* different casings of the AppSignal name?
Yes! Let's explain:
| Casing | Usage |
| ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `AppSignal` | The brand name of the company, the application and almost everything else related to AppSignal. This is the version you should use when talking about AppSignal as a brand, product or service or [stroopwaffle supplier](#stroopwafels). |
| `Appsignal` | The library name of our AppSignal integrations ([Ruby integration](/ruby), [Elixir integration](/elixir), [Node.js integration](/nodejs/3.x/), [Front-end integration](/front-end) etc.). Only used in the code context. |
| `appsignal` | The AppSignal integration package names as published to package manager registries for the [Ruby gem](https://rubygems.org/gems/appsignal), [Elixir package and packages prefix](https://hex.pm/packages/appsignal) name, [Node.js packages prefix](https://www.npmjs.com/package/@appsignal/nodejs) and [Front-end packages prefix](https://www.npmjs.com/package/@appsignal/javascript), etc. |
## Blog
We have a blog at [blog.appsignal.com](https://blog.appsignal.com/)!
On our blog, we post all things relevant to AppSignal, such as new features, new
major agent releases, [Ruby Magic](#ruby-magic) articles and other awesome
stories from our internal process. Such as [how to eat
stroopwafels](https://blog.appsignal.com/blog/2016/02/01/stroopwafels-and-how-to-eat-them.html).
## Changelog
We keep a full product changelog at
[appsignal.com/changelog](https://www.appsignal.com/changelog).
All our new features, agent releases and other changes to the product can be
found in this neatly organized list.
We also have a small indicator in our top navigation that notifies
you if there's a new entry to the changelog.
## Configuration
The configuration is part of the libraries running in applications. It tells
the AppSignal [libraries](#libraries) what to instrument in an
[application](#applications), which application it is and in which environment
it's running.
The AppSignal libraries have multiple methods of configuration. The most common
method of configuration is the usage of an `appsignal.yml` configuration file.
The usage of environment variables is also recommended.
For the configuration of the Ruby agent, we recommend you read the
[configuration topic](/ruby/configuration) to get started.
## CPU usage
During the operation of an application, the CPU usage can vary wildly. Some
operations of an application can request more CPU time than others.
Other factors can also affect the CPU usage. If the monitored application is
not the only process on the host machine other processes can also affect the
CPU usage metric. For example, if a database running on the same machine has to
perform a complicated query it will request more CPU time.
On AppSignal.com the CPU usage of an application is displayed in two ways. For
an action where an error/performance issue occurred and for host metrics. This
way it's possible to see if the performance of an action was directly affected
by a busy CPU or if the entire host was affected for longer periods.
Learn more about what [CPU metrics](https://blog.appsignal.com/2018/03/06/understanding-cpu-statistics.html) mean on our blog.
## Cross-Site Request Forgery
Cross-Site Request Forgery (CSRF) is an attack that forces an end user to execute unwanted actions on a web application where they are authenticated.
A victim may click on a link sent to them via email or web chat, allowing the attacker to steal and use the victim's credentials. The severity of the attack can vary depending on the application and authorization access of the victim's account. An attacker may be able to make state-altering actions to a user's account, such as changing their login credentials, and can compromise an entire application in severe cases, such as when a victim is an administrator.
## Elixir Alchemy
Want to learn more about Elixir? In our email series Elixir Alchemy (1x p/mo)
we dive deeper into Elixir and Erlang.
You can sign up here:
[appsignal.com/elixir-alchemy](https://blog.appsignal.com/elixir-alchemy).
## Environments
Most [applications](#applications) can be run in different modes. During
development of an application other rules apply and errors are not usually
shown in the form of a "500 internal server error" page as they do in
"production".
AppSignal also understands the concept of an environment allowing different
settings be configured per environment. For every environment a separate
application is created on AppSignal.com to be configured with its own set of
alerting rules and [third-party
integrations](#third-party-integrations).
## Errors
Errors are problems that occur during the runtime of an application. This can
be anything ranging from a catastrophic failure causing the application to
crash or a simple typo causing an error page.
Once an error occurs in an application AppSignal sends an alert and records
the details of the error for later viewing on AppSignal.com.
Read more about the [errors feature](https://www.appsignal.com/tour/errors) on our
tour page. To learn more about error handling in Ruby, read our [Exception
handling](/ruby/instrumentation/exception-handling) topic describing how
to effectively track errors with AppSignal.
Errors are reported as issues. Learn more about what [issues](#issues) are.
## Events
An event is something that happened. This is a very vague statement because
the concept of an event is something very high-level. An [error](#errors) is an
event, and so is an [performance issue](#performance-issues).
AppSignal monitors many events inside an application and on a server using [host
metrics](#metrics). By collecting many different types of events and combining
the data we hope to provide an as complete as possible picture to gain more
insights into [applications](#applications) performance.
Also, see [instrumentation events documentation](#instrumentation-events).
## Extension
The AppSignal [libraries](#libraries) and [agent](#agent) are in constant communication with each other. The libraries send data to the agent over a UNIX socket. To do so the libraries use an extension for the programming language they're written in. This extension is written in C and Rust, and installed when the language-specific agent is installed.
Read more about the AppSignal [extension operates](/appsignal/how-appsignal-operates) and the [life cycle of an AppSignal request](/appsignal/data-life-cycle).
## Impact
The impact of an action on an application is based on its usage compared to
other actions. When one controller action or job takes more time or is executed
more often than others its impact grows.
For example:
* Action A is triggered 1000 times with an average duration of 0.5 seconds.
The combined duration is 500 seconds.
* Action B is triggered 500 times with an average duration of 3 seconds.
The combined duration is 1500 seconds.
The total combined duration of both actions is 2000 seconds.
* Action A has an impact of 25% (500 / 2000).
* Action B has an impact of 75% (1500 / 2000).
## Instrumentation
Instrumentation is what powers AppSignal. Without it, we wouldn't know anything
about what's going on inside Applications.
Instrumentation is hooks inside or around frameworks and libraries AppSignal
uses to monitor application code. This instrumentation reports errors and slow
code which is sent to AppSignal for analysis. Once a problem is detected an
alert is sent.
Learn more about [Ruby instrumentation](/ruby/instrumentation).
## Instrumentation events
Events are blocks of code that are executed. These can be methods, functions or smaller parts of either. Events can be nested to show hierarchy and the total duration of operations. These individual events make it possible to see which parts of the code are slower than others.
At the top [issue pages](#issues), we also group the event durations by group name, following [our event naming](/api/event-names), to give insights into what part of the app takes the longest.
Some types of events that can be shown are database queries, JSON parsing, views rendering, HTTP requests, [custom instrumentation](#instrumentation), etc.
Each event is shown on performance issue detail pages in the "performance timeline". If we detect the same event is repeated more than once in succession, we will mark them as potential N+1 events, such as N+1 queries.
Also see [instrumentation](#instrumentation).
## Issues
Whenever AppSignal detects a new error, an issue is created. Whenever AppSignal detects a new potential slow request, background job, etc. a new issue is created. This issue is grouped by [action](#actions), [namespace](#namespace) and [error](#errors).
Error issues also support errors without action, as an error can occur outside of an action, such as in the app's framework before reaching the app's own code.
Performance issues without an [action](#actions) are silently ignored.
The action, [namespace](#namespace) and the error type are the way we group issues. If an error of a new type occurs on the same action in the same namespace as another error issue, a new issue will be created for that error. If another potential slow request is detected on another endpoint or background job, a new issue will be created for that endpoint/job.
Per issue, it's possible to configure notification settings, assignment, state (open/closed/work in progress), and severity.
## Libraries
AppSignal uses language-specific libraries to monitor applications. Currently
we have a [Ruby](/ruby) gem and [Elixir](/elixir)
package. These libraries include hooks into frameworks and libraries to
instrument code blocks such as database calls, file system calls and view
rendering.
Every library is specialized in the instrumentation of its subject language. Most
AppSignal libraries also includes an "[agent](#agent)" which the libraries use
to communicate with the AppSignal servers.
Read more about how the AppSignal [agent operates](/appsignal/how-appsignal-operates) and the [life cycle of an AppSignal request](/appsignal/data-life-cycle).
### Library integrations
AppSignal libraries integrate with a variety of different libraries and
frameworks specific to the programming language. The Ruby gem integrates with
pure Ruby, Rails, Sinatra and other available frameworks. The Elixir package
integrates with pure Elixir and Phoenix.
These automatic integrations make it easier to get more insight into applications
without having to add AppSignal [instrumentation](#instrumentation) manually.
Read more about what [Ruby integrations we
offer](/ruby/integrations).
## 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". These custom markers can be anything from scaling operations,
sudden spikes in traffic or when a database is experiencing issues.
Read more about [markers](/application/markers).
## Metadata
Metadata is data that gives information about other data.
Metadata is information about an error or performance issue that provides more
context to the data collected. By sending extra metadata on a
[sample](#samples) it's easier to track down what the circumstances were around
the particular issue.
By default the metadata of a request includes the hostname on which the issue
occurred, the SCM revision on which the application is running, and the request ID
of the request the sample was derived from. It also includes data such as the
request path and the request method for web requests.
## Metrics
AppSignal provides two kinds of metrics.
* [Custom metrics](/metrics/custom)
* [Host metrics](/metrics/host-metrics)
Custom metrics allow the collection of data from just about anything. With a
couple lines of code it's possible to track and graph data such as the number
of registered users, visits to a page, database sizes, etc.
Host metrics are about data from the server an application is running on. Data
such as [CPU usage](#cpu-usage), load averages, memory usage, etc. give more
insight into performance issues than just the code itself. Maybe the disk space
is running out causing the application to run much slower.
Read more about [metrics](https://www.appsignal.com/tour/metrics) on our tour page.
## Namespace
Namespaces are grouping mechanisms used by AppSignal to differentiate between
different parts of the same application. By default, AppSignal splits an
application up into two namespaces: "Web" and "Background".
HTTP requests that are being monitored by AppSignal will be added to the "Web"
namespace and jobs performed by background job libraries are added to the
"Background" namespace. It's also possible to configure your namespaces to
differentiate between requests on an application and a private administration
panel.
For more information about namespaces, please see our
[namespaces](/application/namespaces) documentation.
## Notifications
AppSignal sends notifications whenever a problem is detected with an [application](#applications). These notifications can be email messages, Slack messages, a PagerDuty notification, and more depending on which [third-party integrations](#third-party-integrations) are configured.
We send notifications about [errors](#errors), [slow requests](#performance-issues) and [Anomaly detection](/anomaly-detection/) alerts that occur in an application using an AppSignal [library](#libraries). Once a problematic event is detected a notification is sent out to alert users of a problem.
## Organizations
Organizations are used to group [applications](#applications) and
[users](#user-account) for a business. A business can have many users and
clients that can be notified] whenever there's a problem with their applications.
[Billing](/support/billing) for applications is done on organization
level rather than per application.
[Team management](/organization/team/members) is made easy using
organizations. Whole teams can invited to an organization so there's no need
for sharing sign-in details.
Read more about organizations in our [Organizations
documentation](/organization).
## Owners
[Organizations](#organizations) have people that manage the organization. These
owners decide who's a member of an organization, in which [team](#teams) they
do or do not belong and decide how the billing is done.
Organization owners can manage everything about an organization and the
[applications](#applications) that belong to it. If you do not have permission
to view or change something, ask your organization's owner to change it for
you or give you more permission.
## Performance issues
Using performance monitoring it's possible to deep dive into individual requests and see what parts of an application are slow. Using this information it's possible to find and improve problem areas.
When AppSignal detects a slow web request or operation it will send notifications, because slow code can be as damaging as an [error](#errors) appearing.
Performance issues are grouped by [action](#actions) and [namespace](#namespace). On performance issue detail pages more information is available about each action. Not all issues are an "issue". It's up to you to determine if an HTTP request of 200ms is too slow.
Potential slow requests and background jobs are reported as performance issues. Learn more about what [issues](#issues) are.
Read more about the [performance feature](https://www.appsignal.com/tour/performance) on our tour page.
## Push API
The AppSignal "Push API" is the API endpoint used by the AppSignal
[agent](#agent) to send the collected data. This is different from the
normal AppSignal [API](#api) which is primarily used to read data and add more
context to the data that's sent to AppSignal.
This Push API is the API where application instrumentation is sent from
applications using the [Push API key](#push-api-key).
## Push API key
The "Push API key" is a write-only API key used by applications to authenticate themselves when sending data to the AppSignal servers. Apps report data to the [Push API](#push-api) and authenticate using this key.
There are several kinds of Push API keys that apps can use for different use cases. All Push API keys can be found on the [Push & deploy settings page](https://appsignal.com/redirect-to/app?to=info).
* **Organization-level Push API key:**
The recommended Push API key for back-end integrations, like Ruby, Elixir, Node.js, Python and Go. We recognize apps by a [combination of the Push API key, app name and app environment](/application/configuration), and create apps using this information if it does not yet exist.
* **App-level Push API key:**
After creation, an app also gets assigned its app-level Push API key. This key can be used to send data to a specific app, even if the app is configured to use a different app name or app environment. This is used when moving apps between organizations without data loss, or when no app name or app environment can be set, like for the [Vector](/vector) integration.
* **Front-end API key:**
This key is used by apps using our [front-end integration](/front-end) to report data and can be found in the "Front-end error monitoring" section.
Note: These write-only keys are not to be confused with the user-specific [API key](#api-key) which can be used to authenticate on the [AppSignal API](#api) to retrieve data about your apps from our system.
## Response time
The response time of an application's action is the time spent processing the
action. The longer an action takes to perform the more it qualifies as a
performance issue.
The duration of this action is displayed on AppSignal.com for
performance issues and in graphs for controllers/jobs and on the host level.
## Ruby Magic
Did you know we write articles about the magic that is Ruby? We do!
It's called Ruby Magic and you can sign up for it on
[appsignal.com/ruby-magic](https://blog.appsignal.com/ruby-magic).
A list of all the Ruby Magic articles we've written so far can be found on [our
blog](https://blog.appsignal.com/).
## Samples
When a page request is slow a hundred times in a row, it's not as relevant to
see all the slow requests, a smaller sample of these requests tells the same
story.
Instead, the AppSignal [agent](#agent) only sends a small set of performance
issues to the AppSignal servers. This saves data sent to the servers, the data
processed on the application host and the AppSignal servers, while still
telling the same story about the issues.
## Stroopwafels
Also written as "stroopwaffles".
At AppSignal, we love stroopwafels. We've shipped over 25,000 of them to
customers, friends and conferences. If you work at a tech company and have had
a stroopwaffle at the office, chances it came from us.
We've written a whole article about what stroopwafels are and how you should
eat them. Read on to [become a stroopwafel
expert](https://blog.appsignal.com/blog/2016/02/01/stroopwafels-and-how-to-eat-them.html).
## Tags
Error and performance issue [samples](#samples) can be tagged. By tagging these
samples it's easier to find and identify certain issues. By tagging it's
possible to add more [metadata](#metadata) to a sample that can be used in
[link templates](/application/link-templates) to easily link to
the relevant data in your application.
Read more about [tagging requests](/guides/tagging).
## Teams
To manage members of [organizations](#organizations), organization owners can
utilize teams to give access to applications. [Users](#user-account) that are
part of a team can only access the applications the team they belong to have
access to. If a user is part of more than one team this user can access all
applications of all the teams they belong to.
Teams give permission management to [owners](#owners) of an organization to
limit user access to applications without the need for multiple organizations.
Read more about organization [team management](/organization/team/teams).
## Third-party integrations
AppSignal.com provides connections with other services such as Slack and
PagerDuty to more effectively alert users about problems that are detected.
These integrations can be managed through the UI on AppSignal.com on an
application-by-application basis.
Read more about [which third-party integrations we
offer](/application/integrations/).
## Transactions
Transactions are created by the AppSignal [libraries](#libraries) for every
monitored web request and background job. Within this transaction, the agents
monitor for errors and slow code. A transaction is created at the start of a
web request or when a background job is started. Once the request or job
finishes or crashes, the transaction is closed and sent to the [agent](#agent)
for processing.
[Tags](#tags) and [metadata](#metadata) are added on transaction-level to more
easily identify differences between transaction samples.
## Throughput
The throughput of an application is the total number of requests sent through
an action/job in a certain time frame. The throughput can differ per action and
host.
On AppSignal.com the throughput is displayed per action and displayed in graphs
for every host.
## TLS
TLS stands for Transport Layer Security. TLS is a cryptographic protocol that provides secure connections for computer networks, for example, between a server and a web browser.
## Queue time
When a server or application is busy processing a lot of requests certain requests may be queued before they are processed. The time waiting to be
processed is referred to as "queue time".
Since queue time can negatively affect users' experience using an application
this metric is tracked by AppSignal for HTTP requests and background jobs.
For the background jobs, this represents the time between the request being queued (by a web request) and it being picked up by the background worker (sidekiq).
## User account
Every user using AppSignal has a user account. With this user account
you can configure notification preferences.
Many users can belong to one or more organizations. No need for separate user
accounts for every organization.
[Organizations](#organizations) manage which users can access which
applications and who can manage the billing as an [owner](#owners).
# 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: