Pular para o conteúdo principal
O AppSignal pode enviar notificações de novos incidentes para diversos serviços; veja nossa lista completa nas integrações. 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. Webhook 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.
    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

Deploy markers

{
  "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"
  }
}

Campos

CampoTipoDescrição
markerHash<String, Any>O payload do webhook diz respeito a um incidente de marker.

Subcampos do deploy marker

CampoTipoDescrição
timeStringTimestamp em que o deploy marker foi criado.
marker_idStringID interno do AppSignal para o deploy marker.
siteStringNome do app como visto em AppSignal.com. Usamos o campo site em vez de app por razões legadas.
environmentStringAmbiente do app como visto em AppSignal.com.
revisionStringO nome da revisão do deploy marker.
userStringO usuário que criou o marker.
repositoryStringURL para o repositório, conforme configurado para o app em AppSignal.com.
urlStringURL para o app em AppSignal.com que disparou o webhook.

Incidentes de exceção

{
  "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"
    }
  }
}

Campos

CampoTipoDescrição
exceptionHash<String, Any>O payload do webhook diz respeito a um incidente de exceção.

Subcampos de exception

CampoTipoDescrição
timeStringTimestamp em que a exceção ocorreu.
numberIntegerID do incidente, como mostrado em AppSignal.com.
siteStringNome do app como visto em AppSignal.com. Usamos o campo site em vez de app por razões legadas.
environmentStringAmbiente do app como visto em AppSignal.com.
app_urlStringURL do app em AppSignal.com que disparou o webhook.
urlStringURL para a amostra específica do incidente em AppSignal.com que disparou esse webhook.
revisionStringO nome da revisão do deploy marker.
userStringO 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.
namespaceStringO namespace no qual essa exceção ocorreu.
exceptionStringO tipo de exceção registrado pelo AppSignal.
messageStringA mensagem da exceção, com mais detalhes sobre a exceção.
app_backtraceArray<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_lineStringA primeira linha de backtrace do campo app_backtrace.
actionStringA action na qual essa exceção ocorreu. Pode ser uma action de controller, um background worker ou uma action definida manualmente.
pathStringO 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.
hostnameStringO hostname do host em que essa exceção ocorreu.
action_labelStringUm 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.
metadataHash<String, String>Inclui metadados definidos pelo usuário (veja o recurso de Tagging).

Campos de metadata

Você pode adicionar seus próprios metadados taggeando samples.
CampoTipoDescrição
demo_sampleStringDefinido pela integração do AppSignal para samples de demonstração enviados usando nossa ferramenta de linha de comando de demo (Ruby / Elixir). Não é definido para todos os outros samples.
methodStringO método de requisição usado para realizar uma requisição. Disponível apenas para requisições (web).
pathStringO 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

{
  "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"
    }
  }
}

Campos

CampoTipoDescrição
performanceHash<String, Any>O payload do webhook diz respeito a um incidente de desempenho.

Subcampos de performance

CampoTipoDescrição
timeStringTimestamp em que o incidente de desempenho ocorreu.
numberIntegerID do incidente, como mostrado em AppSignal.com.
siteStringNome do app como visto em AppSignal.com. Usamos o campo site em vez de app por razões legadas.
environmentStringAmbiente do app como visto em AppSignal.com.
app_urlStringURL do app em AppSignal.com que disparou o webhook.
urlStringURL para a amostra específica do incidente em AppSignal.com que disparou esse webhook.
revisionStringO nome da revisão do deploy marker.
userStringO 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.
namespaceStringO namespace no qual esse incidente de desempenho ocorreu.
durationFloatO tempo em milissegundos medido para completar a requisição/job/action.
actionStringA action na qual esse incidente de desempenho ocorreu. Pode ser uma action de controller, um background worker ou uma action definida manualmente.
pathStringO 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.
hostnameStringO hostname do host em que esse incidente de desempenho ocorreu.
action_labelStringUm 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.
metadataHash<String, String>Inclui metadados definidos pelo usuário; veja metadata.

Campos de metadata

Você pode adicionar seus próprios metadados taggeando samples.
CampoTipoDescrição
demo_sampleStringDefinido pela integração do AppSignal para samples de demonstração enviados usando nossa ferramenta de linha de comando de demo (Ruby / Elixir). Não é definido para todos os outros samples.
methodStringO método de requisição usado para realizar uma requisição. Disponível apenas para requisições (web).
pathStringO 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

{
  "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}"
}
CampoTipoDescrição
alert_idStringID interno do AppSignal para o alerta.
stateStringEstado do alerta.
siteStringNome da aplicação à qual o alerta pertence.
environmentStringNome do ambiente da aplicação ao qual o alerta pertence.
tagsArrayNamespace associado ao alerta.
human_tagsArrayNamespace personalizado associado ao alerta.
metric_nameStringNome da métrica para a qual o alerta foi criado.
fieldStringNome do campo do alerta.
trigger_labelStringNome do trigger.
trigger_descriptionStringDescrição do trigger.
last_valueStringÚltimo valor registrado para o alerta.
peak_valueStringMaior valor registrado para o alerta
mean_valueStringMédia de todos os valores do alerta.
comparison_operatorStringOperador de comparação definido pelo usuário com base no qual o alerta será disparado.
comparison_valueStringValor de comparação da métrica definido pelo usuário com base no qual o alerta será disparado.
human_last_valueStringÚltimo valor da métrica registrado para o alerta desde que ele foi aberto, em um formato mais legível.
human_peak_valueStringMaior valor da métrica registrado para o alerta enquanto ele estava aberto.
human_mean_valueStringValor médio da métrica para o alerta enquanto ele esteve aberto, em um formato mais legível.
human_comparison_valueStringValor 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_atStringTimestamp em que o alerta foi criado.
opened_atStringTimestamp (ISO8601) em que o alerta foi aberto.
resolved_atStringTimestamp (ISO8601) em que o alerta foi resolvido.
closed_atStringTimestamp (ISO8601) em que o alerta foi fechado.
warmup_durationStringTempo em minutos que o AppSignal espera antes de abrir um alerta.
cooldown_durationStringTempo em minutos que o AppSignal espera antes de fechar um alerta.
alert_urlStringURL do alerta para que o usuário possa visualizá-lo no AppSignal.
edit_trigger_urlStringURL do alerta para que o usuário possa editá-lo no AppSignal.

Lista de integrações