> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appsignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhooks

> Use webhooks para integrar o AppSignal com outros serviços de terceiros ou com o seu próprio sistema.

O AppSignal pode enviar notificações de novos incidentes para diversos serviços; veja nossa lista completa nas [integrações](/application/integrations). Também oferecemos webhooks para essas notificações, para que você possa lidar com novos incidentes no seu próprio sistema.

Para receber um webhook, vá até a aba "Notifications" na barra lateral do site, clique em "Add integration" e preencha a URL na qual você gostaria de receber os dados do webhook.

<img src="https://mintcdn.com/appsignal-715f5a51/nF8c1Rwq1cS7b5hg/assets/images/screenshots/app_webhook.png?fit=max&auto=format&n=nF8c1Rwq1cS7b5hg&q=85&s=7d0bfa4afbbcf93a4e3241b53fdc06c3" alt="Webhook" width="1400" height="934" data-path="assets/images/screenshots/app_webhook.png" />

Existem vários webhooks disponíveis. Quais payloads o webhook recebe pode ser configurado no formulário de configuração do webhook, conforme mostrado na captura de tela acima.

## Verificando requisições de webhook do AppSignal

Para garantir a segurança da sua aplicação, você pode verificar se as requisições de webhook recebidas são realmente do AppSignal. A verificação é feita usando um token de verificação de Webhook para validar a assinatura da requisição.

### Localizando seu Webhook Verification Token

1. Navegue até **App settings > Integrations** no seu painel do AppSignal.
2. Configure a integração de webhook que você quer verificar.
3. Aqui você encontrará o **Webhook verification token** da integração.

Esse token é usado para validar que a requisição do webhook vem do AppSignal.

### Verificando uma requisição

Quando o AppSignal envia uma requisição de webhook, ele inclui uma assinatura no cabeçalho `X-Appsignal-Signature`. Você pode validar a requisição da seguinte forma:

1. Concatene o Webhook verification token do AppSignal com o corpo bruto da requisição.
2. Gere um hash SHA256 da string concatenada.
3. Compare o hash gerado com o valor do cabeçalho `X-Appsignal-Signature`.

Se os hashes forem iguais, a requisição pode ser verificada como vinda do AppSignal.

### Exemplos de implementação

Abaixo estão alguns exemplos de como você pode verificar se uma requisição está vindo do AppSignal em Ruby, Elixir, Node.js e Python.

**Observação:** Os exemplos abaixo são ilustrativos; você pode precisar adaptá-los dependendo dos frameworks, integrações e dependências usadas pelo seu app.

<CodeGroup>
  ```ruby Ruby theme={null}
      token = Rails.application.credentials.appsignal_webhook_token
      request_signature = request.headers["X-Appsignal-Signature"]

      message = request.raw_post
      signature = OpenSSL::Digest::SHA256.hexdigest(token + message.to_s)

      if signature == request_signature
        # logic here
      end
  ```

  ```elixir Elixir theme={null}
    token = Application.get_env(:my_app, :appsignal_webhook_token)
    request_signature = List.first(get_req_header(conn, "x-appsignal-signature"))

    {:ok, raw_body} = read_body(conn)

    message = token <> raw_body
    signature = Base.encode16(:crypto.hash(:sha256, message), case: :lower)

    if signature == request_signature do
      # logic here
    end
  ```

  ```js JavaScript theme={null}
  const crypto = require("crypto");

  const token = process.env.APPSIGNAL_WEBHOOK_TOKEN;
  const requestSignature = req.headers["x-appsignal-signature"];

  let rawBody = req.rawBody;

  const message = token + rawBody;

  const signature = crypto.createHash("sha256").update(message).digest("hex");

  if (signature === requestSignature) {
    // logic here
  }
  ```

  ```python Python theme={null}
    import hashlib
    import os

    token = os.getenv('APPSIGNAL_WEBHOOK_TOKEN')
    request_signature = request.headers['X-Appsignal-Signature']

    raw_body = request.get_data(as_text=True)

    message = token + raw_body

    signature = hashlib.sha256(message.encode()).hexdigest()

    if signature == request_signature:
      # logic here
  ```
</CodeGroup>

## Deploy markers

<CodeGroup>
  ```json JSON theme={null}
  {
    "marker": {
      "time": "2019-01-10 10:45:41 +0100",
      "marker_id": "5c3714455ac13f7df09437f0",
      "site": "My test app",
      "environment": "development",
      "revision": "abc123",
      "user": "tom",
      "repository": "https://github.com/my_org/my_repo",
      "url": "https://appsignal.com/test/sites/5bd867fa2213937f3666ae7b/dashboard"
    }
  }
  ```
</CodeGroup>

### Campos

| Campo    | Tipo                | Descrição                                                   |
| -------- | ------------------- | ----------------------------------------------------------- |
| `marker` | `Hash<String, Any>` | O payload do webhook diz respeito a um incidente de marker. |

#### Subcampos do deploy marker

| Campo         | Tipo     | Descrição                                                                                          |
| ------------- | -------- | -------------------------------------------------------------------------------------------------- |
| `time`        | `String` | Timestamp em que o deploy marker foi criado.                                                       |
| `marker_id`   | `String` | ID interno do AppSignal para o deploy marker.                                                      |
| `site`        | `String` | Nome do app como visto em AppSignal.com. Usamos o campo `site` em vez de `app` por razões legadas. |
| `environment` | `String` | Ambiente do app como visto em AppSignal.com.                                                       |
| `revision`    | `String` | O nome da revisão do [deploy marker](/application/markers/deploy-markers){" "}.                    |
| `user`        | `String` | O usuário que criou o marker.                                                                      |
| `repository`  | `String` | URL para o repositório, conforme configurado para o app em AppSignal.com.                          |
| `url`         | `String` | URL para o app em AppSignal.com que disparou o webhook.                                            |

## Incidentes de exceção

<CodeGroup>
  ```json JSON theme={null}
  {
    "exception": {
      "time": "2019-01-09 09:03:57 UTC",
      "number": 3,
      "site": "My test app",
      "environment": "development",
      "app_url": "https://appsignal.com/test/sites/5bd867fa2213937f3666ae7b",
      "url": "https://appsignal.com/test/sites/5bd867fa2213937f3666ae7b/incidents/3?timestamp=2019-01-09T09%3A03%3A57Z",
      "revision": "abc123",
      "user": "tom",
      "namespace": "web",
      "exception": "Appsignal::Demo::TestError",
      "message": "Hello world! This is an error used for demonstration purposes.",
      "app_backtrace": [
        "/Users/tombruijn/.gem/ruby/2.5.3/gems/appsignal-2.8.1/lib/appsignal/demo.rb:49:in `create_example_error_request'",
        "/Users/tombruijn/.gem/ruby/2.5.3/gems/appsignal-2.8.1/lib/appsignal/demo.rb:35:in `transmit'",
        "/Users/tombruijn/.gem/ruby/2.5.3/gems/appsignal-2.8.1/lib/appsignal/cli/demo.rb:53:in `run'",
        "/Users/tombruijn/.gem/ruby/2.5.3/gems/appsignal-2.8.1/lib/appsignal/cli.rb:31:in `run'",
        "/Users/tombruijn/.gem/ruby/2.5.3/gems/appsignal-2.8.1/bin/appsignal:7:in `<top (required)>'",
        "/Users/tombruijn/.gem/ruby/2.5.3/bin/appsignal:23:in `load'",
        "/Users/tombruijn/.gem/ruby/2.5.3/bin/appsignal:23:in `<top (required)>'",
        "/Users/tombruijn/.gem/ruby/2.5.3/bin/bundle:23:in `<main>'"
      ],
      "first_backtrace_line": "/Users/tombruijn/.gem/ruby/2.5.3/gems/appsignal-2.8.1/lib/appsignal/demo.rb:49:in `create_example_error_request'",
      "action": "DemoController#hello",
      "path": "/hello",
      "hostname": "Toms-MacBook-Pro.local",
      "action_label": "request",
      "metadata": {
        "demo_sample": "true",
        "method": "GET",
        "path": "/hello"
      }
    }
  }
  ```
</CodeGroup>

### Campos

| Campo       | Tipo                | Descrição                                                    |
| ----------- | ------------------- | ------------------------------------------------------------ |
| `exception` | `Hash<String, Any>` | O payload do webhook diz respeito a um incidente de exceção. |

#### Subcampos de exception

| Campo                  | Tipo                   | Descrição                                                                                                                                                                                                |
| ---------------------- | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `time`                 | `String`               | Timestamp em que a exceção ocorreu.                                                                                                                                                                      |
| `number`               | `Integer`              | ID do incidente, como mostrado em AppSignal.com.                                                                                                                                                         |
| `site`                 | `String`               | Nome do app como visto em AppSignal.com. Usamos o campo `site` em vez de `app` por razões legadas.                                                                                                       |
| `environment`          | `String`               | Ambiente do app como visto em AppSignal.com.                                                                                                                                                             |
| `app_url`              | `String`               | URL do app em AppSignal.com que disparou o webhook.                                                                                                                                                      |
| `url`                  | `String`               | URL para a amostra específica do incidente em AppSignal.com que disparou esse webhook.                                                                                                                   |
| `revision`             | `String`               | O nome da revisão do [deploy marker](/application/markers/deploy-markers).                                                                                                                               |
| `user`                 | `String`               | O usuário que criou o marker. O valor de user também pode ser{" "} `null` se não estiver definido para uma revisão de deploy marker.                                                                     |
| `namespace`            | `String`               | O namespace no qual essa exceção ocorreu.                                                                                                                                                                |
| `exception`            | `String`               | O tipo de exceção registrado pelo AppSignal.                                                                                                                                                             |
| `message`              | `String`               | A mensagem da exceção, com mais detalhes sobre a exceção.                                                                                                                                                |
| `app_backtrace`        | `Array<String>`        | As linhas do backtrace referentes ao app de onde se originaram. Isso exclui quaisquer linhas de backtrace de bibliotecas incluídas no app.                                                               |
| `first_backtrace_line` | `String`               | A primeira linha de backtrace do campo `app_backtrace`.                                                                                                                                                  |
| `action`               | `String`               | A action na qual essa exceção ocorreu. Pode ser uma action de controller, um background worker ou uma action definida manualmente.                                                                       |
| `path`                 | `String`               | O caminho da requisição em que a exceção ocorreu. Isso é definido apenas para requisições web. Esse metadado é definido pela integração do AppSignal por padrão e também é incluído no campo `metadata`. |
| `hostname`             | `String`               | O hostname do host em que essa exceção ocorreu.                                                                                                                                                          |
| `action_label`         | `String`               | Um rótulo amigável para o tipo de action em que essa exceção ocorreu. Usa `request` para o namespace `web` e{" "} `job` para o namespace `background`. Todos os outros namespaces usam `action`.         |
| `metadata`             | `Hash<String, String>` | Inclui metadados definidos pelo usuário (veja o [recurso de Tagging](/guides/tagging)).                                                                                                                  |

#### Campos de metadata {/* id: exception-metadata-fields */}

Você pode adicionar seus próprios metadados [taggeando samples](/guides/tagging).

| Campo         | Tipo     | Descrição                                                                                                                                                                                                                                                  |
| ------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `demo_sample` | `String` | Definido pela integração do AppSignal para samples de demonstração enviados usando nossa ferramenta de linha de comando de demo ([Ruby](/ruby/command-line/demo) /{" "} [Elixir](/elixir/command-line/demo)). Não é definido para todos os outros samples. |
| `method`      | `String` | O método de requisição usado para realizar uma requisição. Disponível apenas para requisições (web).                                                                                                                                                       |
| `path`        | `String` | O caminho da requisição em que a exceção ocorreu. Definido apenas para requisições web. Contém o mesmo valor do campo `path`.                                                                                                                              |

## Incidentes de desempenho

<CodeGroup>
  ```json JSON theme={null}
  {
    "performance": {
      "time": "2019-01-10 09:38:08 UTC",
      "number": 1,
      "site": "My test app",
      "environment": "development",
      "app_url": "https://appsignal.com/test/sites/5bd867fa2213937f3666ae7b",
      "url": "https://appsignal.com/test/sites/5bd867fa2213937f3666ae7b/incidents/1?timestamp=2019-01-10T09%3A38%3A08Z",
      "revision": "abc123",
      "user": "tom",
      "namespace": "web",
      "duration": 2004.904052734375,
      "action": "DemoController#hello",
      "path": "/hello",
      "hostname": "Toms-MacBook-Pro.local",
      "action_label": "request",
      "metadata": {
        "demo_sample": "true",
        "method": "GET",
        "path": "/hello"
      }
    }
  }
  ```
</CodeGroup>

### Campos

| Campo         | Tipo                | Descrição                                                       |
| ------------- | ------------------- | --------------------------------------------------------------- |
| `performance` | `Hash<String, Any>` | O payload do webhook diz respeito a um incidente de desempenho. |

#### Subcampos de performance

| Campo          | Tipo                   | Descrição                                                                                                                                                                                                             |
| -------------- | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `time`         | `String`               | Timestamp em que o incidente de desempenho ocorreu.                                                                                                                                                                   |
| `number`       | `Integer`              | ID do incidente, como mostrado em AppSignal.com.                                                                                                                                                                      |
| `site`         | `String`               | Nome do app como visto em AppSignal.com. Usamos o campo `site` em vez de `app` por razões legadas.                                                                                                                    |
| `environment`  | `String`               | Ambiente do app como visto em AppSignal.com.                                                                                                                                                                          |
| `app_url`      | `String`               | URL do app em AppSignal.com que disparou o webhook.                                                                                                                                                                   |
| `url`          | `String`               | URL para a amostra específica do incidente em AppSignal.com que disparou esse webhook.                                                                                                                                |
| `revision`     | `String`               | O nome da revisão do [deploy marker](/application/markers/deploy-markers).                                                                                                                                            |
| `user`         | `String`               | O usuário que criou o marker. O valor de user também pode ser{" "} `null` se não estiver definido para uma revisão de deploy marker.                                                                                  |
| `namespace`    | `String`               | O namespace no qual esse incidente de desempenho ocorreu.                                                                                                                                                             |
| `duration`     | `Float`                | O tempo em milissegundos medido para completar a requisição/job/action.                                                                                                                                               |
| `action`       | `String`               | A action na qual esse incidente de desempenho ocorreu. Pode ser uma action de controller, um background worker ou uma action definida manualmente.                                                                    |
| `path`         | `String`               | O caminho da requisição em que o incidente de desempenho ocorreu. Definido apenas para requisições web. Esse metadado é definido pela integração do AppSignal por padrão e também é incluído no campo `metadata`.     |
| `hostname`     | `String`               | O hostname do host em que esse incidente de desempenho ocorreu.                                                                                                                                                       |
| `action_label` | `String`               | Um rótulo amigável para o tipo de action em que esse incidente de desempenho ocorreu. Usa `request` para o namespace `web`{" "} e `job` para o namespace `background`{" "}. Todos os outros namespaces usam `action`. |
| `metadata`     | `Hash<String, String>` | Inclui metadados definidos pelo usuário; veja{" "} [metadata](/guides/tagging).                                                                                                                                       |

#### Campos de metadata {/* id: performance-metadata-fields */}

Você pode adicionar seus próprios metadados [taggeando samples](/guides/tagging).

| Campo         | Tipo     | Descrição                                                                                                                                                                                                                                                  |
| ------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `demo_sample` | `String` | Definido pela integração do AppSignal para samples de demonstração enviados usando nossa ferramenta de linha de comando de demo ([Ruby](/ruby/command-line/demo) /{" "} [Elixir](/elixir/command-line/demo)). Não é definido para todos os outros samples. |
| `method`      | `String` | O método de requisição usado para realizar uma requisição. Disponível apenas para requisições (web).                                                                                                                                                       |
| `path`        | `String` | O caminho da requisição em que o incidente de desempenho ocorreu. Definido apenas para requisições web. Contém o mesmo valor do campo{" "} `path`.                                                                                                         |

## Detecção de anomalias

<CodeGroup>
  ```json JSON theme={null}
  {
    "alert_id": "5bdb1fb301925b0c4b6c7017",
    "state": "closed",
    "site": "google",
    "environment": "production",
    "tags": {
      "namespace": "web"
    },
    "human_tags": ["namespace: web"],
    "metric_name": "transaction_exception_rate",
    "field": "gauge",
    "trigger_label": "Exception rate",
    "trigger_description": "This is a description",
    "last_value": 12.0,
    "peak_value": 20.0,
    "mean_value": 11.0,
    "comparison_operator": "<",
    "comparison_value": 21.0,
    "human_last_value": "12 %",
    "human_peak_value": "20 %",
    "human_mean_value": "11 %",
    "human_comparison_value": "21 %",
    "created_at": "2017-08-01T10:00:00Z",
    "opened_at": "2017-08-01T10:05:00Z",
    "resolved_at": "2017-08-01T12:00:00Z",
    "closed_at": "2017-08-01T13:43:00Z",
    "warmup_duration": 10,
    "cooldown_duration": 20,
    "alert_url": "http://example.com/#{site.account.slug}/sites/#{site.id}/alerts/#{alert.id}",
    "edit_trigger_url": "http://example.com/#{site.account.slug}/sites/#{site.id}/triggers?overlay=triggerForm&triggerId=#{alert.trigger.id}"
  }
  ```
</CodeGroup>

| Campo                    | Tipo     | Descrição                                                                                                                    |
| ------------------------ | -------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `alert_id`               | `String` | ID interno do AppSignal para o alerta.                                                                                       |
| `state`                  | `String` | [Estado](/anomaly-detection/#alert-states) do alerta.                                                                        |
| `site`                   | `String` | Nome da aplicação à qual o alerta pertence.                                                                                  |
| `environment`            | `String` | Nome do ambiente da aplicação ao qual o alerta pertence.                                                                     |
| `tags`                   | `Array`  | Namespace associado ao alerta.                                                                                               |
| `human_tags`             | `Array`  | Namespace personalizado associado ao alerta.                                                                                 |
| `metric_name`            | `String` | Nome da métrica para a qual o alerta foi criado.                                                                             |
| `field`                  | `String` | Nome do campo do alerta.                                                                                                     |
| `trigger_label`          | `String` | Nome do trigger.                                                                                                             |
| `trigger_description`    | `String` | Descrição do trigger.                                                                                                        |
| `last_value`             | `String` | Último valor registrado para o alerta.                                                                                       |
| `peak_value`             | `String` | Maior valor registrado para o alerta                                                                                         |
| `mean_value`             | `String` | Média de todos os valores do alerta.                                                                                         |
| `comparison_operator`    | `String` | Operador de comparação definido pelo usuário com base no qual o alerta será disparado.                                       |
| `comparison_value`       | `String` | Valor de comparação da métrica definido pelo usuário com base no qual o alerta será disparado.                               |
| `human_last_value`       | `String` | Último valor da métrica registrado para o alerta desde que ele foi aberto, em um formato mais legível.                       |
| `human_peak_value`       | `String` | Maior valor da métrica registrado para o alerta enquanto ele estava aberto.                                                  |
| `human_mean_value`       | `String` | Valor médio da métrica para o alerta enquanto ele esteve aberto, em um formato mais legível.                                 |
| `human_comparison_value` | `String` | Valor de comparação da métrica do alerta definido pelo usuário com base no qual o alerta será disparado, em formato legível. |
| `created_at`             | `String` | Timestamp em que o alerta foi criado.                                                                                        |
| `opened_at`              | `String` | Timestamp (ISO8601) em que o alerta foi aberto.                                                                              |
| `resolved_at`            | `String` | Timestamp (ISO8601) em que o alerta foi resolvido.                                                                           |
| `closed_at`              | `String` | Timestamp (ISO8601) em que o alerta foi fechado.                                                                             |
| `warmup_duration`        | `String` | Tempo em minutos que o AppSignal espera antes de abrir um alerta.                                                            |
| `cooldown_duration`      | `String` | Tempo em minutos que o AppSignal espera antes de fechar um alerta.                                                           |
| `alert_url`              | `String` | URL do alerta para que o usuário possa visualizá-lo no AppSignal.                                                            |
| `edit_trigger_url`       | `String` | URL do alerta para que o usuário possa editá-lo no AppSignal.                                                                |

<hr />

### Lista de integrações

* [Asana](/application/integrations/asana)
* [Discord](/application/integrations/discord)
* [Geckoboard](/application/integrations/geckoboard)
* [GitLab](/application/integrations/gitlab)
* [Google Hangouts Chat](/application/integrations/hangouts)
* [Jira](/application/integrations/jira)
* [Linear](/application/integrations/linear)
* [Microsoft Teams](/application/integrations/teams)
* [OpsGenie](/application/integrations/opsgenie)
* [PagerDuty](/application/integrations/pagerduty)
* [Shortcut](/application/integrations/shortcut)
* [Slack](/application/integrations/slack)
* [Squadcast](/application/integrations/squadcast)
* [Trello](/application/integrations/trello)
* [Webhooks](/application/integrations/webhooks)
