> ## 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

> Verwenden Sie Webhooks, um AppSignal mit anderen Drittanbietern oder Ihrem eigenen System zu integrieren.

AppSignal kann Benachrichtigungen über neue Incidents an mehrere Dienste senden; sehen Sie sich unsere vollständige Liste auf der Seite [Integrations](/application/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.

<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" />

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.

<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-Marker

<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>

### Felder

| Feld     | Typ                 | Beschreibung                                        |
| -------- | ------------------- | --------------------------------------------------- |
| `marker` | `Hash<String, Any>` | Die Webhook-Payload betrifft einen Marker-Incident. |

#### Unterfelder des Deploy-Markers

| Feld          | Typ      | Beschreibung                                                                                                     |
| ------------- | -------- | ---------------------------------------------------------------------------------------------------------------- |
| `time`        | `String` | Zeitstempel, zu dem der Deploy-Marker erstellt wurde.                                                            |
| `marker_id`   | `String` | Interne AppSignal-Marker-ID für den Deploy-Marker.                                                               |
| `site`        | `String` | App-Name, wie auf AppSignal.com angezeigt. Das Feld `site` wird aus Legacy-Gründen anstelle von `app` verwendet. |
| `environment` | `String` | App-Umgebung der App, wie auf AppSignal.com angezeigt.                                                           |
| `revision`    | `String` | Der Revisionsname des [Deploy-Markers](/application/markers/deploy-markers){" "}.                                |
| `user`        | `String` | Der Benutzer, der den Marker erstellt hat.                                                                       |
| `repository`  | `String` | URL zum Repository, wie für die App auf AppSignal.com konfiguriert.                                              |
| `url`         | `String` | URL zur App auf AppSignal.com, die den Webhook ausgelöst hat.                                                    |

## Exception-Incidents

<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>

### Felder

| Feld        | Typ                 | Beschreibung                                           |
| ----------- | ------------------- | ------------------------------------------------------ |
| `exception` | `Hash<String, Any>` | Die Webhook-Payload betrifft einen Exception-Incident. |

#### Unterfelder der Exception

| Feld                   | Typ                    | Beschreibung                                                                                                                                                                                                                             |
| ---------------------- | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `time`                 | `String`               | Zeitstempel, zu dem die Exception aufgetreten ist.                                                                                                                                                                                       |
| `number`               | `Integer`              | Incident-ID, wie auf AppSignal.com angezeigt.                                                                                                                                                                                            |
| `site`                 | `String`               | App-Name, wie auf AppSignal.com angezeigt. Das Feld `site` wird aus Legacy-Gründen anstelle von `app` verwendet.                                                                                                                         |
| `environment`          | `String`               | App-Umgebung der App, wie auf AppSignal.com angezeigt.                                                                                                                                                                                   |
| `app_url`              | `String`               | URL zur App auf AppSignal.com, die den Webhook ausgelöst hat.                                                                                                                                                                            |
| `url`                  | `String`               | URL zum spezifischen Sample für den Incident auf AppSignal.com, der diesen Webhook ausgelöst hat.                                                                                                                                        |
| `revision`             | `String`               | Der Revisionsname des [Deploy-Markers](/application/markers/deploy-markers).                                                                                                                                                             |
| `user`                 | `String`               | Der 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.                                                                                  |
| `namespace`            | `String`               | Der Namespace, in dem diese Exception aufgetreten ist.                                                                                                                                                                                   |
| `exception`            | `String`               | Der von AppSignal aufgezeichnete Exception-Typ.                                                                                                                                                                                          |
| `message`              | `String`               | Die Exception-Nachricht mit weiteren Details zur Exception.                                                                                                                                                                              |
| `app_backtrace`        | `Array<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_line` | `String`               | Die erste Backtrace-Zeile aus dem Feld `app_backtrace`.                                                                                                                                                                                  |
| `action`               | `String`               | Die Aktion, in der diese Exception aufgetreten ist. Entweder eine Controller-Aktion, ein Background-Worker oder eine manuell gesetzte Aktion.                                                                                            |
| `path`                 | `String`               | Der 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.                 |
| `hostname`             | `String`               | Der Hostname des Hosts, auf dem diese Exception aufgetreten ist.                                                                                                                                                                         |
| `action_label`         | `String`               | Eine 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`. |
| `metadata`             | `Hash<String, String>` | Dies umfasst vom Benutzer gesetzte Metadaten (siehe [Tagging-Funktion](/guides/tagging)).                                                                                                                                                |

#### Metadaten-Felder {/* id: exception-metadata-fields */}

Sie können eigene Metadaten hinzufügen, indem Sie [Samples taggen](/guides/tagging).

| Feld          | Typ      | Beschreibung                                                                                                                                                                                                                                |
| ------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `demo_sample` | `String` | Wird von der AppSignal-Integration für Demo-Samples gesetzt, die mit unserem Demo-Kommandozeilen-Tool gesendet wurden ([Ruby](/ruby/command-line/demo) /{" "} [Elixir](/elixir/command-line/demo)). Nicht für alle anderen Samples gesetzt. |
| `method`      | `String` | Die zur Ausführung einer Anfrage verwendete Request-Methode. Nur für (Web-)Anfragen verfügbar.                                                                                                                                              |
| `path`        | `String` | Der 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

<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>

### Felder

| Feld          | Typ                 | Beschreibung                                             |
| ------------- | ------------------- | -------------------------------------------------------- |
| `performance` | `Hash<String, Any>` | Die Webhook-Payload betrifft einen Performance-Incident. |

#### Unterfelder der Performance

| Feld           | Typ                    | Beschreibung                                                                                                                                                                                                                                              |
| -------------- | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `time`         | `String`               | Zeitstempel, zu dem der Performance-Incident aufgetreten ist.                                                                                                                                                                                             |
| `number`       | `Integer`              | Incident-ID, wie auf AppSignal.com angezeigt.                                                                                                                                                                                                             |
| `site`         | `String`               | App-Name, wie auf AppSignal.com angezeigt. Das Feld `site` wird aus Legacy-Gründen anstelle von `app` verwendet.                                                                                                                                          |
| `environment`  | `String`               | App-Umgebung der App, wie auf AppSignal.com angezeigt.                                                                                                                                                                                                    |
| `app_url`      | `String`               | URL zur App auf AppSignal.com, die den Webhook ausgelöst hat.                                                                                                                                                                                             |
| `url`          | `String`               | URL zum spezifischen Sample für den Incident auf AppSignal.com, der diesen Webhook ausgelöst hat.                                                                                                                                                         |
| `revision`     | `String`               | Der Revisionsname des [Deploy-Markers](/application/markers/deploy-markers).                                                                                                                                                                              |
| `user`         | `String`               | Der 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.                                                                                                   |
| `namespace`    | `String`               | Der Namespace, in dem dieser Performance-Incident aufgetreten ist.                                                                                                                                                                                        |
| `duration`     | `Float`                | Die in Millisekunden gemessene Zeit, die der Request/Job/die Aktion bis zum Abschluss benötigt hat.                                                                                                                                                       |
| `action`       | `String`               | Die Aktion, in der dieser Performance-Incident aufgetreten ist. Entweder eine Controller-Aktion, ein Background-Worker oder eine manuell gesetzte Aktion.                                                                                                 |
| `path`         | `String`               | Der 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.                       |
| `hostname`     | `String`               | Der Hostname des Hosts, auf dem dieser Performance-Incident aufgetreten ist.                                                                                                                                                                              |
| `action_label` | `String`               | Eine 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`. |
| `metadata`     | `Hash<String, String>` | Dies umfasst vom Benutzer gesetzte Metadaten, siehe{" "} [Metadaten](/guides/tagging).                                                                                                                                                                    |

#### Metadaten-Felder {/* id: performance-metadata-fields */}

Sie können eigene Metadaten hinzufügen, indem Sie [Samples taggen](/guides/tagging).

| Feld          | Typ      | Beschreibung                                                                                                                                                                                                                                |
| ------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `demo_sample` | `String` | Wird von der AppSignal-Integration für Demo-Samples gesetzt, die mit unserem Demo-Kommandozeilen-Tool gesendet wurden ([Ruby](/ruby/command-line/demo) /{" "} [Elixir](/elixir/command-line/demo)). Nicht für alle anderen Samples gesetzt. |
| `method`      | `String` | Die zur Ausführung einer Anfrage verwendete Request-Methode. Nur für (Web-)Anfragen verfügbar.                                                                                                                                              |
| `path`        | `String` | Der 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

<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>

| Feld                     | Typ      | Beschreibung                                                                                                                         |
| ------------------------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| `alert_id`               | `String` | Interne AppSignal-Alert-ID für den Alert.                                                                                            |
| `state`                  | `String` | [Status](/anomaly-detection/#alert-states) des Alerts.                                                                               |
| `site`                   | `String` | Der Anwendungsname, zu dem der Alert gehört.                                                                                         |
| `environment`            | `String` | Der Name der Anwendungsumgebung, zu der der Alert gehört.                                                                            |
| `tags`                   | `Array`  | Dem Alert zugeordneter Namespace.                                                                                                    |
| `human_tags`             | `Array`  | Dem Alert zugeordneter benutzerdefinierter Namespace.                                                                                |
| `metric_name`            | `String` | Name der Metrik, für die der Alert erstellt wurde.                                                                                   |
| `field`                  | `String` | Feldname des Alerts.                                                                                                                 |
| `trigger_label`          | `String` | Name des Triggers.                                                                                                                   |
| `trigger_description`    | `String` | Beschreibung des Triggers.                                                                                                           |
| `last_value`             | `String` | Letzter für den Alert aufgezeichneter Wert.                                                                                          |
| `peak_value`             | `String` | Höchster für den Alert aufgezeichneter Wert.                                                                                         |
| `mean_value`             | `String` | Durchschnitt aller Werte für den Alert.                                                                                              |
| `comparison_operator`    | `String` | Vom Benutzer festgelegter Vergleichsoperator, basierend auf dem der Alert ausgelöst wird.                                            |
| `comparison_value`       | `String` | Vom Benutzer festgelegter Vergleichswert der Metrik, basierend auf dem der Alert ausgelöst wird.                                     |
| `human_last_value`       | `String` | Letzter Metrikwert, der für den Alert seit dem Öffnen in einem lesbareren Format aufgezeichnet wurde.                                |
| `human_peak_value`       | `String` | Höchster Wert des Metrikwerts, der für den Alert aufgezeichnet wurde, während er offen war.                                          |
| `human_mean_value`       | `String` | Durchschnittswert des Metrikwerts für den Alert, während er offen war, in einem lesbareren Format.                                   |
| `human_comparison_value` | `String` | Vom Benutzer festgelegter Vergleichswert für die Alert-Metrik, basierend auf dem der Alert ausgelöst wird, in einem lesbaren Format. |
| `created_at`             | `String` | Zeitstempel, zu dem der Alert erstellt wurde.                                                                                        |
| `opened_at`              | `String` | Zeitstempel (ISO8601), zu dem der Alert geöffnet wurde.                                                                              |
| `resolved_at`            | `String` | Zeitstempel (ISO8601), zu dem der Alert gelöst wurde.                                                                                |
| `closed_at`              | `String` | Zeitstempel (ISO8601), zu dem der Alert geschlossen wurde.                                                                           |
| `warmup_duration`        | `String` | Zeit in Minuten, die AppSignal wartet, bevor ein Alert geöffnet wird.                                                                |
| `cooldown_duration`      | `String` | Zeit in Minuten, die AppSignal wartet, bevor ein Alert geschlossen wird.                                                             |
| `alert_url`              | `String` | URL des Alerts, damit Benutzer ihn in AppSignal ansehen können.                                                                      |
| `edit_trigger_url`       | `String` | URL des Alerts, damit Benutzer ihn in AppSignal bearbeiten können.                                                                   |

<hr />

### Liste der Integrationen

* [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)
