受信 URL
外部サービスの Webhook をそのまま受けます。URL を貼るだけで、認証のヘッダーは要りません。
POST https://api.nodd.blipdrop.net/in/{integration}/{inbound_key}
URL の発行
アプリのチャンネルの詳細で「連携を追加」を開き、連携の種類を選んで、Face ID で発行します。URL は発行時にだけ表示します。分からなくなったら失効して発行し直してください。発行できるのは Manager、Owner、Admin です。
URL そのものが秘密です。 漏れても承認は求められません。受信 URL はボタンの要らない通知だけを受けます。
種類
slack | Incoming Webhook の形式です。text、なければ attachments[0].text、attachments[0].fallback を読みます。1 行目が見出し、2 行目以降が本文です。フォーム形式の payload= も読みます |
|---|---|
grafana | Grafana の Webhook の連絡先です |
alertmanager | Alertmanager の webhook_configs です |
datadog | Datadog の Webhooks 連携です。回復で解消します |
sentry | Sentry の Internal Integration とアラートルールです。解消も連動します |
pagerduty | PagerDuty の Generic Webhooks (v3) です。解消も連動します |
generic | POST /v1/messages と同じ形式で、notice、progress、alert だけを受けます。approval と choice は 422 です |
Datadog、Sentry、PagerDuty の URL は Nodd 1.1 以降のアプリで発行できます。
generic のURLは、アプリの「連携を追加 → 汎用Webhook」から発行します。認証ヘッダーを付けられないサービスから送るときに使います。
例
curl https://api.nodd.blipdrop.net/in/slack/nodd_live_i_... \
-H "Content-Type: application/json" \
-d '{"text":"デプロイ完了\nv2.4.1 を反映しました"}'
receivers:
- name: nodd
webhook_configs:
- url: https://api.nodd.blipdrop.net/in/alertmanager/nodd_live_i_...
send_resolved: true
curl https://api.nodd.blipdrop.net/in/generic/nodd_live_i_... \
-H "Content-Type: application/json" \
-d '{"kind":"alert","level":"high","title":"ディスクの残りが 5% です","alert_key":"disk.full:web-1"}'
Datadog
- アプリで Datadog の URL を発行します
- Datadog の Integrations で Webhooks を開き、新しい Webhook に URL を貼ります
- Payload に次の JSON を入れます
- モニターの通知の本文に
@webhook-名前を書きます
{"alert_id":"$ALERT_ID","scope":"$ALERT_SCOPE","title":"$EVENT_TITLE","message":"$TEXT_ONLY_MSG","transition":"$ALERT_TRANSITION","priority":"$ALERT_PRIORITY","url":"$LINK"}
回復の通知(Recovered)で、同じアラートを解消します。$ALERT_ID と $ALERT_SCOPE の組み合わせで、発火と回復を結びます。
Sentry
- アプリで Sentry の URL を発行します
- Sentry の Settings で Developer Settings を開き、Internal Integration を作ります
- Webhook URL に URL を貼り、Webhooks の Issue を有効にします
- アラートルールからも送るときは、Alert Rule Action を有効にして、ルールのアクションに選びます
Issue の作成で通知し、resolved で解消します。指標のアラートは critical で通知し、warning は normal にし、resolved で解消します。そのほかの知らせは 202 で受け取るだけで、通知しません。
PagerDuty
- アプリで PagerDuty の URL を発行します
- PagerDuty の Integrations で Generic Webhooks (v3) を開き、新しい Webhook に URL を貼ります
- イベントに
incident.triggeredとincident.resolvedを選びます
incident.resolved で同じアラートを解消します。incident.reopened も選ぶと、再開も通知します。確認などのほかのイベントは受け取るだけで、通知しません。
Datadog、Sentry、PagerDuty の変換
| 種類 | すべて alert です |
|---|---|
| 見出し | Datadog は title、Sentry は Issue の title、PagerDuty はインシデントの title。120 文字で切ります |
| 本文 | Datadog は message、Sentry は culprit、PagerDuty はサービス名。1,000 文字で切ります |
| 重要度 | Datadog は Warn、Re-Warn、P3 から P5 が normal、ほかは high。Sentry は fatal、error が high、debug が low、ほかは normal。PagerDuty は urgency: low が normal、ほかは high |
| リンク | 発生元の URL が https なら 1 件付けます |
alert_key, dedupe_key | 発火と回復が同じ値になるよう、サービスごとの ID から作ります |
n8n、Zapier などの自動化ツール
応答が要らなければ、HTTP の処理から generic の URL へ送ります。応答が要るなら、送信キーで POST /v1/messages を呼び、GET /v1/messages/{id} をポーリングして結果を読みます。詳しくは API をご覧ください。
Grafana と Alertmanager の変換
| 種類 | 発火は alert になり、status: resolved は同じアラートの解消になります |
|---|---|
| 見出し | ラベルの alertname、なければ注釈の summary |
| 本文 | 注釈の description、なければ summary |
| 重要度 | severity が critical、page、high、error なら high、info、low、none なら low、ほかは normal |
| 項目 | alertname と severity を除くラベルを 6 件まで |
| リンク | generatorURL、dashboardURL、panelURL のうち https のものを 2 件まで |
alert_key, dedupe_key | fingerprint。使えなければラベルから導きます。発火と回復は同じ値になります |
上限
- 本文は 256 KB までです
- 1 回で発火は 20 件まで届けます。超えるときは 19 件と、残りの件数をまとめた 1 件にします
- 1 回で解消は 100 件までです
- 回数の上限は送信 API と同じです。受け付けると
202を返します