Zum Hauptinhalt springen
AppSignal kann Benachrichtigungen über neue Incidents an mehrere Dienste senden; sehen Sie sich unsere vollständige Liste auf der Seite Integrations an. Wir bieten auch Webhooks für diese Benachrichtigungen an, damit Sie neue Incidents in Ihrem eigenen System verarbeiten können. Um einen Webhook zu empfangen, gehen Sie zum Tab “Notifications” in der Seitenleiste der Website, klicken Sie auf “Add integration” und geben Sie die URL ein, an der Sie Ihre Webhook-Daten empfangen möchten. Webhook Es sind mehrere Webhooks verfügbar. Welche Payloads der Webhook empfängt, kann im Konfigurationsformular für den Webhook konfiguriert werden, wie im obigen Screenshot zu sehen.

AppSignal-Webhook-Anfragen verifizieren

Um die Sicherheit Ihrer Anwendung zu gewährleisten, können Sie überprüfen, ob eingehende Webhook-Anfragen tatsächlich von AppSignal stammen. Die Verifizierung erfolgt mithilfe eines Webhook-Verifizierungstokens, um die Signatur der Anfrage zu validieren.

Ihren Webhook-Verifizierungstoken finden

  1. Navigieren Sie in Ihrem AppSignal-Dashboard zu App settings > Integrations.
  2. Konfigurieren Sie die Webhook-Integration, die Sie verifizieren möchten.
  3. Hier finden Sie den Webhook verification token der Integration.
Dieses Token wird verwendet, um zu überprüfen, dass die Webhook-Anfrage von AppSignal stammt.

Eine Anfrage verifizieren

Wenn AppSignal eine Webhook-Anfrage sendet, enthält sie eine Signatur im Header X-Appsignal-Signature. Sie können die Anfrage wie folgt validieren:
  1. Verketten Sie das AppSignal-Webhook-Verifizierungstoken mit dem rohen Request-Body.
  2. Erzeugen Sie einen SHA256-Hash des verketteten Strings.
  3. Vergleichen Sie den erzeugten Hash mit dem Wert im Header X-Appsignal-Signature.
Wenn die Hashes übereinstimmen, kann die Anfrage als von AppSignal stammend verifiziert werden.

Beispielimplementierungen

Nachfolgend einige Beispiele dafür, wie Sie überprüfen können, ob eine Anfrage von AppSignal stammt, in Ruby, Elixir, Node.js und Python. Hinweis: Die folgenden Beispiele dienen nur zur Veranschaulichung; Sie müssen sie je nach den Frameworks, Integrationen und Abhängigkeiten Ihrer App möglicherweise anpassen.
    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-Marker

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

Felder

FeldTypBeschreibung
markerHash<String, Any>Die Webhook-Payload betrifft einen Marker-Incident.

Unterfelder des Deploy-Markers

FeldTypBeschreibung
timeStringZeitstempel, zu dem der Deploy-Marker erstellt wurde.
marker_idStringInterne AppSignal-Marker-ID für den Deploy-Marker.
siteStringApp-Name, wie auf AppSignal.com angezeigt. Das Feld site wird aus Legacy-Gründen anstelle von app verwendet.
environmentStringApp-Umgebung der App, wie auf AppSignal.com angezeigt.
revisionStringDer Revisionsname des Deploy-Markers.
userStringDer Benutzer, der den Marker erstellt hat.
repositoryStringURL zum Repository, wie für die App auf AppSignal.com konfiguriert.
urlStringURL zur App auf AppSignal.com, die den Webhook ausgelöst hat.

Exception-Incidents

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

Felder

FeldTypBeschreibung
exceptionHash<String, Any>Die Webhook-Payload betrifft einen Exception-Incident.

Unterfelder der Exception

FeldTypBeschreibung
timeStringZeitstempel, zu dem die Exception aufgetreten ist.
numberIntegerIncident-ID, wie auf AppSignal.com angezeigt.
siteStringApp-Name, wie auf AppSignal.com angezeigt. Das Feld site wird aus Legacy-Gründen anstelle von app verwendet.
environmentStringApp-Umgebung der App, wie auf AppSignal.com angezeigt.
app_urlStringURL zur App auf AppSignal.com, die den Webhook ausgelöst hat.
urlStringURL zum spezifischen Sample für den Incident auf AppSignal.com, der diesen Webhook ausgelöst hat.
revisionStringDer Revisionsname des Deploy-Markers.
userStringDer Benutzer, der den Marker erstellt hat. Der Wert von user kann auch null sein, wenn er für eine Deploy-Marker-Revision nicht gesetzt wurde.
namespaceStringDer Namespace, in dem diese Exception aufgetreten ist.
exceptionStringDer von AppSignal aufgezeichnete Exception-Typ.
messageStringDie Exception-Nachricht mit weiteren Details zur Exception.
app_backtraceArray<String>Die Zeilen des Backtrace, die die App betreffen, aus der sie stammen. Dies schließt Backtrace-Zeilen aus Bibliotheken aus, die in der App enthalten sind.
first_backtrace_lineStringDie erste Backtrace-Zeile aus dem Feld app_backtrace.
actionStringDie Aktion, in der diese Exception aufgetreten ist. Entweder eine Controller-Aktion, ein Background-Worker oder eine manuell gesetzte Aktion.
pathStringDer Request-Pfad, an dem die Exception aufgetreten ist. Dies wird nur für Web-Anfragen gesetzt. Dies sind Metadaten, die standardmäßig von der AppSignal-Integration gesetzt und auch im Feld metadata enthalten sind.
hostnameStringDer Hostname des Hosts, auf dem diese Exception aufgetreten ist.
action_labelStringEine benutzerfreundliche Bezeichnung für den Aktionstyp, bei dem diese Exception aufgetreten ist. Verwendet request für den Namespace web und job für den Namespace background. Alle anderen Namespaces verwenden action.
metadataHash<String, String>Dies umfasst vom Benutzer gesetzte Metadaten (siehe Tagging-Funktion).

Metadaten-Felder

Sie können eigene Metadaten hinzufügen, indem Sie Samples taggen.
FeldTypBeschreibung
demo_sampleStringWird von der AppSignal-Integration für Demo-Samples gesetzt, die mit unserem Demo-Kommandozeilen-Tool gesendet wurden (Ruby / Elixir). Nicht für alle anderen Samples gesetzt.
methodStringDie zur Ausführung einer Anfrage verwendete Request-Methode. Nur für (Web-)Anfragen verfügbar.
pathStringDer Request-Pfad, an dem die Exception aufgetreten ist. Dies wird nur für Web-Anfragen gesetzt. Enthält denselben Wert wie das Feld path.

Performance-Incidents

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

Felder

FeldTypBeschreibung
performanceHash<String, Any>Die Webhook-Payload betrifft einen Performance-Incident.

Unterfelder der Performance

FeldTypBeschreibung
timeStringZeitstempel, zu dem der Performance-Incident aufgetreten ist.
numberIntegerIncident-ID, wie auf AppSignal.com angezeigt.
siteStringApp-Name, wie auf AppSignal.com angezeigt. Das Feld site wird aus Legacy-Gründen anstelle von app verwendet.
environmentStringApp-Umgebung der App, wie auf AppSignal.com angezeigt.
app_urlStringURL zur App auf AppSignal.com, die den Webhook ausgelöst hat.
urlStringURL zum spezifischen Sample für den Incident auf AppSignal.com, der diesen Webhook ausgelöst hat.
revisionStringDer Revisionsname des Deploy-Markers.
userStringDer Benutzer, der den Marker erstellt hat. Der Wert von user kann auch null sein, wenn er für eine Deploy-Marker-Revision nicht gesetzt wurde.
namespaceStringDer Namespace, in dem dieser Performance-Incident aufgetreten ist.
durationFloatDie in Millisekunden gemessene Zeit, die der Request/Job/die Aktion bis zum Abschluss benötigt hat.
actionStringDie Aktion, in der dieser Performance-Incident aufgetreten ist. Entweder eine Controller-Aktion, ein Background-Worker oder eine manuell gesetzte Aktion.
pathStringDer Request-Pfad, an dem der Performance-Incident aufgetreten ist. Dies wird nur für Web-Anfragen gesetzt. Dies sind Metadaten, die standardmäßig von der AppSignal-Integration gesetzt und auch im Feld metadata enthalten sind.
hostnameStringDer Hostname des Hosts, auf dem dieser Performance-Incident aufgetreten ist.
action_labelStringEine benutzerfreundliche Bezeichnung für den Aktionstyp, bei dem dieser Performance-Incident aufgetreten ist. Verwendet request für den Namespace web und job für den Namespace background. Alle anderen Namespaces verwenden action.
metadataHash<String, String>Dies umfasst vom Benutzer gesetzte Metadaten, siehe Metadaten.

Metadaten-Felder

Sie können eigene Metadaten hinzufügen, indem Sie Samples taggen.
FeldTypBeschreibung
demo_sampleStringWird von der AppSignal-Integration für Demo-Samples gesetzt, die mit unserem Demo-Kommandozeilen-Tool gesendet wurden (Ruby / Elixir). Nicht für alle anderen Samples gesetzt.
methodStringDie zur Ausführung einer Anfrage verwendete Request-Methode. Nur für (Web-)Anfragen verfügbar.
pathStringDer Request-Pfad, an dem der Performance-Incident aufgetreten ist. Dies wird nur für Web-Anfragen gesetzt. Enthält denselben Wert wie das Feld path.

Anomalieerkennung

{
  "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}"
}
FeldTypBeschreibung
alert_idStringInterne AppSignal-Alert-ID für den Alert.
stateStringStatus des Alerts.
siteStringDer Anwendungsname, zu dem der Alert gehört.
environmentStringDer Name der Anwendungsumgebung, zu der der Alert gehört.
tagsArrayDem Alert zugeordneter Namespace.
human_tagsArrayDem Alert zugeordneter benutzerdefinierter Namespace.
metric_nameStringName der Metrik, für die der Alert erstellt wurde.
fieldStringFeldname des Alerts.
trigger_labelStringName des Triggers.
trigger_descriptionStringBeschreibung des Triggers.
last_valueStringLetzter für den Alert aufgezeichneter Wert.
peak_valueStringHöchster für den Alert aufgezeichneter Wert.
mean_valueStringDurchschnitt aller Werte für den Alert.
comparison_operatorStringVom Benutzer festgelegter Vergleichsoperator, basierend auf dem der Alert ausgelöst wird.
comparison_valueStringVom Benutzer festgelegter Vergleichswert der Metrik, basierend auf dem der Alert ausgelöst wird.
human_last_valueStringLetzter Metrikwert, der für den Alert seit dem Öffnen in einem lesbareren Format aufgezeichnet wurde.
human_peak_valueStringHöchster Wert des Metrikwerts, der für den Alert aufgezeichnet wurde, während er offen war.
human_mean_valueStringDurchschnittswert des Metrikwerts für den Alert, während er offen war, in einem lesbareren Format.
human_comparison_valueStringVom Benutzer festgelegter Vergleichswert für die Alert-Metrik, basierend auf dem der Alert ausgelöst wird, in einem lesbaren Format.
created_atStringZeitstempel, zu dem der Alert erstellt wurde.
opened_atStringZeitstempel (ISO8601), zu dem der Alert geöffnet wurde.
resolved_atStringZeitstempel (ISO8601), zu dem der Alert gelöst wurde.
closed_atStringZeitstempel (ISO8601), zu dem der Alert geschlossen wurde.
warmup_durationStringZeit in Minuten, die AppSignal wartet, bevor ein Alert geöffnet wird.
cooldown_durationStringZeit in Minuten, die AppSignal wartet, bevor ein Alert geschlossen wird.
alert_urlStringURL des Alerts, damit Benutzer ihn in AppSignal ansehen können.
edit_trigger_urlStringURL des Alerts, damit Benutzer ihn in AppSignal bearbeiten können.

Liste der Integrationen