diff --git a/docs.json b/docs.json
index a7da9cf8..684a0aa2 100644
--- a/docs.json
+++ b/docs.json
@@ -31,6 +31,14 @@
}
},
"redirects": [
+ {
+ "source": "/en/openapi/go-sdk",
+ "destination": "/en/developer/go-sdk"
+ },
+ {
+ "source": "/zh/openapi/go-sdk",
+ "destination": "/zh/developer/go-sdk"
+ },
{
"source": "/en/monitors/targets/overview",
"destination": "/en/monitors/quickstart/quickstart"
@@ -429,7 +437,7 @@
},
{
"source": "/en/flashduty/rum/android-error-event",
- "destination": "/en/rum/error-tracking/erro-reporting/android"
+ "destination": "/en/rum/error-tracking/error-reporting/android"
},
{
"source": "/en/flashduty/rum/android-sdk-integration",
@@ -497,11 +505,11 @@
},
{
"source": "/en/flashduty/rum/ios-error-event",
- "destination": "/en/rum/error-tracking/erro-reporting/ios"
+ "destination": "/en/rum/error-tracking/error-reporting/ios"
},
{
"source": "/en/flashduty/rum/ios-error-tracking",
- "destination": "/en/rum/error-tracking/erro-reporting/ios"
+ "destination": "/en/rum/error-tracking/error-reporting/ios"
},
{
"source": "/en/flashduty/rum/ios-sdk-integration",
@@ -601,7 +609,7 @@
},
{
"source": "/en/flashduty/rum/web-error-event",
- "destination": "/en/rum/error-tracking/erro-reporting/web"
+ "destination": "/en/rum/error-tracking/error-reporting/web"
},
{
"source": "/en/flashduty/rum/web-sdk-integration",
@@ -1089,7 +1097,7 @@
},
{
"source": "/zh/flashduty/rum/android-error-event",
- "destination": "/zh/rum/error-tracking/erro-reporting/android"
+ "destination": "/zh/rum/error-tracking/error-reporting/android"
},
{
"source": "/zh/flashduty/rum/android-sdk-integration",
@@ -1153,7 +1161,7 @@
},
{
"source": "/zh/flashduty/rum/ios-error-event",
- "destination": "/zh/rum/error-tracking/erro-reporting/ios"
+ "destination": "/zh/rum/error-tracking/error-reporting/ios"
},
{
"source": "/zh/flashduty/rum/ios-sdk-integration",
@@ -1467,6 +1475,26 @@
"source": "/zh/api-reference/on-call/status-pages/statuspage-read-page-list",
"destination": "/zh/api-reference/on-call/status-pages/status-page-read-page-list"
},
+ {
+ "source": "/zh/stsatuspage",
+ "destination": "/zh/statuspage"
+ },
+ {
+ "source": "/zh/rum/error-tracking/erro-reporting/:slug*",
+ "destination": "/zh/rum/error-tracking/error-reporting/:slug*"
+ },
+ {
+ "source": "/zh/rum/error-tracking/error-reporting",
+ "destination": "/zh/rum/error-tracking/error-reporting/web"
+ },
+ {
+ "source": "/en/rum/error-tracking/error-reporting",
+ "destination": "/en/rum/error-tracking/error-reporting/web"
+ },
+ {
+ "source": "/en/rum/error-tracking/erro-reporting/:slug*",
+ "destination": "/en/rum/error-tracking/error-reporting/:slug*"
+ },
{
"source": "/account/info",
"destination": "/zh/api-reference/platform/account/account-read-info"
@@ -2956,7 +2984,7 @@
"icon": "house",
"pages": [
"zh/home",
- "zh/stsatuspage"
+ "zh/statuspage"
]
},
{
@@ -3190,345 +3218,346 @@
"group": "告警集成",
"expanded": false,
"pages": [
+ "zh/on-call/integration/alert-integration/overview",
"zh/on-call/integration/alert-integration/alert-sources/standard-alert",
"zh/on-call/integration/alert-integration/alert-sources/email",
"zh/on-call/integration/alert-integration/alert-sources/http-pull",
"zh/on-call/integration/alert-integration/alert-sources/db-pull",
- "zh/on-call/integration/alert-integration/alert-sources/prometheus",
- "zh/on-call/integration/alert-integration/alert-sources/grafana",
- "zh/on-call/integration/alert-integration/alert-sources/datadog",
- "zh/on-call/integration/alert-integration/alert-sources/new-relic",
- "zh/on-call/integration/alert-integration/alert-sources/sumo-logic",
- "zh/on-call/integration/alert-integration/alert-sources/fortisiem",
- "zh/on-call/integration/alert-integration/alert-sources/ns1",
- "zh/on-call/integration/alert-integration/alert-sources/site24x7",
- "zh/on-call/integration/alert-integration/alert-sources/healthchecks-io",
- "zh/on-call/integration/alert-integration/alert-sources/cronitor",
- "zh/on-call/integration/alert-integration/alert-sources/uptimerobot",
- "zh/on-call/integration/alert-integration/alert-sources/pingdom",
- "zh/on-call/integration/alert-integration/alert-sources/coralogix",
- "zh/on-call/integration/alert-integration/alert-sources/gitguardian",
"zh/on-call/integration/alert-integration/alert-sources/aikido",
- "zh/on-call/integration/alert-integration/alert-sources/cato",
- "zh/on-call/integration/alert-integration/alert-sources/rollbar",
- "zh/on-call/integration/alert-integration/alert-sources/trigger-dev",
- "zh/on-call/integration/alert-integration/alert-sources/duplicati",
- "zh/on-call/integration/alert-integration/alert-sources/robotalp",
- "zh/on-call/integration/alert-integration/alert-sources/formant",
- "zh/on-call/integration/alert-integration/alert-sources/powerjob",
- "zh/on-call/integration/alert-integration/alert-sources/dolphinscheduler",
+ "zh/on-call/integration/alert-integration/alert-sources/airbrake",
"zh/on-call/integration/alert-integration/alert-sources/alertsite",
- "zh/on-call/integration/alert-integration/alert-sources/robusta",
- "zh/on-call/integration/alert-integration/alert-sources/pgdash",
- "zh/on-call/integration/alert-integration/alert-sources/infisical",
- "zh/on-call/integration/alert-integration/alert-sources/fivetran",
- "zh/on-call/integration/alert-integration/alert-sources/datto-rmm",
- "zh/on-call/integration/alert-integration/alert-sources/pulseway",
- "zh/on-call/integration/alert-integration/alert-sources/securityscorecard",
- "zh/on-call/integration/alert-integration/alert-sources/jfrog-xray",
- "zh/on-call/integration/alert-integration/alert-sources/lacework",
- "zh/on-call/integration/alert-integration/alert-sources/moesif",
- "zh/on-call/integration/alert-integration/alert-sources/rbltracker",
- "zh/on-call/integration/alert-integration/alert-sources/uptimeobserver",
- "zh/on-call/integration/alert-integration/alert-sources/dash0",
- "zh/on-call/integration/alert-integration/alert-sources/elastic",
- "zh/on-call/integration/alert-integration/alert-sources/mongodb-atlas",
- "zh/on-call/integration/alert-integration/alert-sources/checkly",
- "zh/on-call/integration/alert-integration/alert-sources/prtg",
- "zh/on-call/integration/alert-integration/alert-sources/netdata",
- "zh/on-call/integration/alert-integration/alert-sources/stackrox",
- "zh/on-call/integration/alert-integration/alert-sources/trivy-operator",
- "zh/on-call/integration/alert-integration/alert-sources/honeycomb",
- "zh/on-call/integration/alert-integration/alert-sources/panther",
+ "zh/on-call/integration/alert-integration/alert-sources/aliyun-arms",
+ "zh/on-call/integration/alert-integration/alert-sources/aliyun-cm-event",
+ "zh/on-call/integration/alert-integration/alert-sources/aliyun-cm-metrics",
+ "zh/on-call/integration/alert-integration/alert-sources/aliyun-dataworks-op",
+ "zh/on-call/integration/alert-integration/alert-sources/aliyun-prometheus",
+ "zh/on-call/integration/alert-integration/alert-sources/aliyun-sls",
+ "zh/on-call/integration/alert-integration/alert-sources/amazon-inspector",
+ "zh/on-call/integration/alert-integration/alert-sources/apcupsd",
+ "zh/on-call/integration/alert-integration/alert-sources/apimetrics",
+ "zh/on-call/integration/alert-integration/alert-sources/appdynamics",
+ "zh/on-call/integration/alert-integration/alert-sources/appsignal",
+ "zh/on-call/integration/alert-integration/alert-sources/argocd",
+ "zh/on-call/integration/alert-integration/alert-sources/atatus",
+ "zh/on-call/integration/alert-integration/alert-sources/auth0",
+ "zh/on-call/integration/alert-integration/alert-sources/auvik",
+ "zh/on-call/integration/alert-integration/alert-sources/aws-cloudwatch",
+ "zh/on-call/integration/alert-integration/alert-sources/aws-eventbridge",
+ "zh/on-call/integration/alert-integration/alert-sources/aws-health",
+ "zh/on-call/integration/alert-integration/alert-sources/aws-security-hub",
"zh/on-call/integration/alert-integration/alert-sources/axiom",
+ "zh/on-call/integration/alert-integration/alert-sources/azure-monitor",
+ "zh/on-call/integration/alert-integration/alert-sources/azure-service-health",
+ "zh/on-call/integration/alert-integration/alert-sources/baidu-bcm",
+ "zh/on-call/integration/alert-integration/alert-sources/bgpalerter",
+ "zh/on-call/integration/alert-integration/alert-sources/bigpanda",
+ "zh/on-call/integration/alert-integration/alert-sources/bitdefender",
+ "zh/on-call/integration/alert-integration/alert-sources/bleemeo",
+ "zh/on-call/integration/alert-integration/alert-sources/blueking",
+ "zh/on-call/integration/alert-integration/alert-sources/blumira",
+ "zh/on-call/integration/alert-integration/alert-sources/bugsnag",
+ "zh/on-call/integration/alert-integration/alert-sources/calibre",
+ "zh/on-call/integration/alert-integration/alert-sources/canarytokens",
+ "zh/on-call/integration/alert-integration/alert-sources/catchpoint",
+ "zh/on-call/integration/alert-integration/alert-sources/cato",
+ "zh/on-call/integration/alert-integration/alert-sources/censys",
+ "zh/on-call/integration/alert-integration/alert-sources/centreon",
+ "zh/on-call/integration/alert-integration/alert-sources/cert-spotter",
+ "zh/on-call/integration/alert-integration/alert-sources/cfengine",
+ "zh/on-call/integration/alert-integration/alert-sources/check-point-smartevent",
+ "zh/on-call/integration/alert-integration/alert-sources/checkly",
"zh/on-call/integration/alert-integration/alert-sources/checkmk",
+ "zh/on-call/integration/alert-integration/alert-sources/chronosphere",
+ "zh/on-call/integration/alert-integration/alert-sources/circonus",
+ "zh/on-call/integration/alert-integration/alert-sources/cloudamqp",
+ "zh/on-call/integration/alert-integration/alert-sources/cloudflare",
+ "zh/on-call/integration/alert-integration/alert-sources/clustercontrol",
+ "zh/on-call/integration/alert-integration/alert-sources/consul",
+ "zh/on-call/integration/alert-integration/alert-sources/contrast",
+ "zh/on-call/integration/alert-integration/alert-sources/coralogix",
+ "zh/on-call/integration/alert-integration/alert-sources/coroot",
+ "zh/on-call/integration/alert-integration/alert-sources/cronicle",
+ "zh/on-call/integration/alert-integration/alert-sources/cronitor",
+ "zh/on-call/integration/alert-integration/alert-sources/crowdsec",
+ "zh/on-call/integration/alert-integration/alert-sources/crowdstrike",
+ "zh/on-call/integration/alert-integration/alert-sources/crowdstrike-logscale",
+ "zh/on-call/integration/alert-integration/alert-sources/ctyun",
+ "zh/on-call/integration/alert-integration/alert-sources/cubeapm",
+ "zh/on-call/integration/alert-integration/alert-sources/dash0",
+ "zh/on-call/integration/alert-integration/alert-sources/datadog",
+ "zh/on-call/integration/alert-integration/alert-sources/datto-rmm",
+ "zh/on-call/integration/alert-integration/alert-sources/dbmarlin",
+ "zh/on-call/integration/alert-integration/alert-sources/dead-mans-snitch",
+ "zh/on-call/integration/alert-integration/alert-sources/dependency-track",
+ "zh/on-call/integration/alert-integration/alert-sources/dingtalk-alert",
"zh/on-call/integration/alert-integration/alert-sources/dkron",
- "zh/on-call/integration/alert-integration/alert-sources/auvik",
+ "zh/on-call/integration/alert-integration/alert-sources/dolphinscheduler",
"zh/on-call/integration/alert-integration/alert-sources/domotz",
- "zh/on-call/integration/alert-integration/alert-sources/ntopng",
- "zh/on-call/integration/alert-integration/alert-sources/honeybadger",
- "zh/on-call/integration/alert-integration/alert-sources/kener",
- "zh/on-call/integration/alert-integration/alert-sources/peekaping",
- "zh/on-call/integration/alert-integration/alert-sources/vigil",
- "zh/on-call/integration/alert-integration/alert-sources/ofelia",
- "zh/on-call/integration/alert-integration/alert-sources/dependency-track",
- "zh/on-call/integration/alert-integration/alert-sources/openobserve",
- "zh/on-call/integration/alert-integration/alert-sources/postman",
- "zh/on-call/integration/alert-integration/alert-sources/contrast",
- "zh/on-call/integration/alert-integration/alert-sources/censys",
- "zh/on-call/integration/alert-integration/alert-sources/jumpcloud",
- "zh/on-call/integration/alert-integration/alert-sources/zenoss",
- "zh/on-call/integration/alert-integration/alert-sources/semgrep",
- "zh/on-call/integration/alert-integration/alert-sources/sonarqube",
- "zh/on-call/integration/alert-integration/alert-sources/level",
- "zh/on-call/integration/alert-integration/alert-sources/juniper-mist",
+ "zh/on-call/integration/alert-integration/alert-sources/dotcom-monitor",
+ "zh/on-call/integration/alert-integration/alert-sources/duplicati",
+ "zh/on-call/integration/alert-integration/alert-sources/dynatrace",
+ "zh/on-call/integration/alert-integration/alert-sources/ecloud-cm",
+ "zh/on-call/integration/alert-integration/alert-sources/edge-delta",
+ "zh/on-call/integration/alert-integration/alert-sources/elastalert2",
+ "zh/on-call/integration/alert-integration/alert-sources/elastic",
+ "zh/on-call/integration/alert-integration/alert-sources/emqx",
"zh/on-call/integration/alert-integration/alert-sources/extrahop",
- "zh/on-call/integration/alert-integration/alert-sources/ohdear",
- "zh/on-call/integration/alert-integration/alert-sources/appsignal",
+ "zh/on-call/integration/alert-integration/alert-sources/fail2ban",
+ "zh/on-call/integration/alert-integration/alert-sources/falco",
+ "zh/on-call/integration/alert-integration/alert-sources/fastnetmon",
+ "zh/on-call/integration/alert-integration/alert-sources/firebase-crashlytics",
+ "zh/on-call/integration/alert-integration/alert-sources/firefly",
+ "zh/on-call/integration/alert-integration/alert-sources/fivetran",
+ "zh/on-call/integration/alert-integration/alert-sources/flashcat",
"zh/on-call/integration/alert-integration/alert-sources/fleet",
- "zh/on-call/integration/alert-integration/alert-sources/veracode-sca",
- "zh/on-call/integration/alert-integration/alert-sources/dbmarlin",
- "zh/on-call/integration/alert-integration/alert-sources/redash",
- "zh/on-call/integration/alert-integration/alert-sources/sublime",
- "zh/on-call/integration/alert-integration/alert-sources/cloudamqp",
- "zh/on-call/integration/alert-integration/alert-sources/canarytokens",
- "zh/on-call/integration/alert-integration/alert-sources/intersight",
- "zh/on-call/integration/alert-integration/alert-sources/insightidr",
- "zh/on-call/integration/alert-integration/alert-sources/upguard",
- "zh/on-call/integration/alert-integration/alert-sources/tracee",
- "zh/on-call/integration/alert-integration/alert-sources/airbrake",
- "zh/on-call/integration/alert-integration/alert-sources/opensearch",
- "zh/on-call/integration/alert-integration/alert-sources/logrocket",
- "zh/on-call/integration/alert-integration/alert-sources/redgate-sql-monitor",
- "zh/on-call/integration/alert-integration/alert-sources/gitlab",
- "zh/on-call/integration/alert-integration/alert-sources/hookdeck",
- "zh/on-call/integration/alert-integration/alert-sources/bugsnag",
- "zh/on-call/integration/alert-integration/alert-sources/raygun",
- "zh/on-call/integration/alert-integration/alert-sources/librenms",
- "zh/on-call/integration/alert-integration/alert-sources/last9",
- "zh/on-call/integration/alert-integration/alert-sources/signoz",
- "zh/on-call/integration/alert-integration/alert-sources/veeam-one",
- "zh/on-call/integration/alert-integration/alert-sources/veeam-service-provider-console",
- "zh/on-call/integration/alert-integration/alert-sources/raritan-px",
- "zh/on-call/integration/alert-integration/alert-sources/whatsup-gold",
"zh/on-call/integration/alert-integration/alert-sources/flowmon-ads",
- "zh/on-call/integration/alert-integration/alert-sources/aws-health",
- "zh/on-call/integration/alert-integration/alert-sources/azure-service-health",
+ "zh/on-call/integration/alert-integration/alert-sources/flowtriq",
+ "zh/on-call/integration/alert-integration/alert-sources/fluxcd",
+ "zh/on-call/integration/alert-integration/alert-sources/formant",
+ "zh/on-call/integration/alert-integration/alert-sources/fortimonitor",
+ "zh/on-call/integration/alert-integration/alert-sources/fortisiem",
+ "zh/on-call/integration/alert-integration/alert-sources/gatus",
"zh/on-call/integration/alert-integration/alert-sources/gcp-personalized-service-health",
- "zh/on-call/integration/alert-integration/alert-sources/nut",
- "zh/on-call/integration/alert-integration/alert-sources/apcupsd",
- "zh/on-call/integration/alert-integration/alert-sources/centreon",
- "zh/on-call/integration/alert-integration/alert-sources/opsview",
- "zh/on-call/integration/alert-integration/alert-sources/microsoft-sentinel",
- "zh/on-call/integration/alert-integration/alert-sources/microsoft-defender-for-cloud",
- "zh/on-call/integration/alert-integration/alert-sources/aws-security-hub",
- "zh/on-call/integration/alert-integration/alert-sources/amazon-inspector",
- "zh/on-call/integration/alert-integration/alert-sources/fail2ban",
- "zh/on-call/integration/alert-integration/alert-sources/suricata",
+ "zh/on-call/integration/alert-integration/alert-sources/ghost-inspector",
+ "zh/on-call/integration/alert-integration/alert-sources/gitguardian",
+ "zh/on-call/integration/alert-integration/alert-sources/github",
+ "zh/on-call/integration/alert-integration/alert-sources/gitlab",
+ "zh/on-call/integration/alert-integration/alert-sources/google-cloud-monitoring",
+ "zh/on-call/integration/alert-integration/alert-sources/google-scc",
+ "zh/on-call/integration/alert-integration/alert-sources/grafana",
+ "zh/on-call/integration/alert-integration/alert-sources/graylog",
+ "zh/on-call/integration/alert-integration/alert-sources/guance",
+ "zh/on-call/integration/alert-integration/alert-sources/hackerone",
+ "zh/on-call/integration/alert-integration/alert-sources/harbor",
+ "zh/on-call/integration/alert-integration/alert-sources/harness",
+ "zh/on-call/integration/alert-integration/alert-sources/healthchecks-io",
+ "zh/on-call/integration/alert-integration/alert-sources/hertzbeat",
+ "zh/on-call/integration/alert-integration/alert-sources/hetrixtools",
+ "zh/on-call/integration/alert-integration/alert-sources/honeybadger",
+ "zh/on-call/integration/alert-integration/alert-sources/honeycomb",
+ "zh/on-call/integration/alert-integration/alert-sources/hookdeck",
+ "zh/on-call/integration/alert-integration/alert-sources/hosted-graphite",
+ "zh/on-call/integration/alert-integration/alert-sources/huawei-aom",
+ "zh/on-call/integration/alert-integration/alert-sources/huawei-apm",
+ "zh/on-call/integration/alert-integration/alert-sources/huawei-ces",
+ "zh/on-call/integration/alert-integration/alert-sources/huawei-lts",
+ "zh/on-call/integration/alert-integration/alert-sources/hund",
+ "zh/on-call/integration/alert-integration/alert-sources/hyperdx",
+ "zh/on-call/integration/alert-integration/alert-sources/hyperping",
"zh/on-call/integration/alert-integration/alert-sources/ibm-qradar",
- "zh/on-call/integration/alert-integration/alert-sources/opnsense",
- "zh/on-call/integration/alert-integration/alert-sources/observium",
"zh/on-call/integration/alert-integration/alert-sources/icinga",
- "zh/on-call/integration/alert-integration/alert-sources/sensu",
- "zh/on-call/integration/alert-integration/alert-sources/sysdig",
- "zh/on-call/integration/alert-integration/alert-sources/circonus",
+ "zh/on-call/integration/alert-integration/alert-sources/imperva",
+ "zh/on-call/integration/alert-integration/alert-sources/infisical",
+ "zh/on-call/integration/alert-integration/alert-sources/influxdata",
+ "zh/on-call/integration/alert-integration/alert-sources/insightidr",
"zh/on-call/integration/alert-integration/alert-sources/instana",
- "zh/on-call/integration/alert-integration/alert-sources/logicmonitor",
- "zh/on-call/integration/alert-integration/alert-sources/uptime-com",
- "zh/on-call/integration/alert-integration/alert-sources/sematext",
- "zh/on-call/integration/alert-integration/alert-sources/fortimonitor",
- "zh/on-call/integration/alert-integration/alert-sources/uptrends",
- "zh/on-call/integration/alert-integration/alert-sources/searchstax",
- "zh/on-call/integration/alert-integration/alert-sources/logpoint",
- "zh/on-call/integration/alert-integration/alert-sources/hetrixtools",
- "zh/on-call/integration/alert-integration/alert-sources/mackerel",
- "zh/on-call/integration/alert-integration/alert-sources/thousandeyes",
+ "zh/on-call/integration/alert-integration/alert-sources/instatus",
+ "zh/on-call/integration/alert-integration/alert-sources/intersight",
+ "zh/on-call/integration/alert-integration/alert-sources/jdcloud",
+ "zh/on-call/integration/alert-integration/alert-sources/jfrog-xray",
+ "zh/on-call/integration/alert-integration/alert-sources/jiankongbao",
+ "zh/on-call/integration/alert-integration/alert-sources/jumpcloud",
+ "zh/on-call/integration/alert-integration/alert-sources/juniper-mist",
+ "zh/on-call/integration/alert-integration/alert-sources/kapacitor",
+ "zh/on-call/integration/alert-integration/alert-sources/keep",
+ "zh/on-call/integration/alert-integration/alert-sources/kener",
"zh/on-call/integration/alert-integration/alert-sources/kentik",
- "zh/on-call/integration/alert-integration/alert-sources/github",
- "zh/on-call/integration/alert-integration/alert-sources/tailscale",
- "zh/on-call/integration/alert-integration/alert-sources/logz-io",
- "zh/on-call/integration/alert-integration/alert-sources/split-io",
- "zh/on-call/integration/alert-integration/alert-sources/firefly",
- "zh/on-call/integration/alert-integration/alert-sources/hackerone",
- "zh/on-call/integration/alert-integration/alert-sources/dotcom-monitor",
+ "zh/on-call/integration/alert-integration/alert-sources/komodor",
+ "zh/on-call/integration/alert-integration/alert-sources/kscloud-monitor",
"zh/on-call/integration/alert-integration/alert-sources/kuvasz",
- "zh/on-call/integration/alert-integration/alert-sources/thinkst-canary",
- "zh/on-call/integration/alert-integration/alert-sources/falco",
- "zh/on-call/integration/alert-integration/alert-sources/blumira",
- "zh/on-call/integration/alert-integration/alert-sources/bitdefender",
- "zh/on-call/integration/alert-integration/alert-sources/snyk",
+ "zh/on-call/integration/alert-integration/alert-sources/lacework",
+ "zh/on-call/integration/alert-integration/alert-sources/langsmith",
+ "zh/on-call/integration/alert-integration/alert-sources/lark-alert",
+ "zh/on-call/integration/alert-integration/alert-sources/last9",
+ "zh/on-call/integration/alert-integration/alert-sources/level",
+ "zh/on-call/integration/alert-integration/alert-sources/librenms",
+ "zh/on-call/integration/alert-integration/alert-sources/limacharlie",
+ "zh/on-call/integration/alert-integration/alert-sources/loadster",
+ "zh/on-call/integration/alert-integration/alert-sources/loggly",
+ "zh/on-call/integration/alert-integration/alert-sources/logicmonitor",
+ "zh/on-call/integration/alert-integration/alert-sources/logpoint",
+ "zh/on-call/integration/alert-integration/alert-sources/logrocket",
+ "zh/on-call/integration/alert-integration/alert-sources/logz-io",
+ "zh/on-call/integration/alert-integration/alert-sources/mackerel",
+ "zh/on-call/integration/alert-integration/alert-sources/meraki",
+ "zh/on-call/integration/alert-integration/alert-sources/metoro",
+ "zh/on-call/integration/alert-integration/alert-sources/mezmo",
+ "zh/on-call/integration/alert-integration/alert-sources/microsoft-defender-for-cloud",
+ "zh/on-call/integration/alert-integration/alert-sources/microsoft-sentinel",
+ "zh/on-call/integration/alert-integration/alert-sources/moesif",
+ "zh/on-call/integration/alert-integration/alert-sources/mongodb-atlas",
+ "zh/on-call/integration/alert-integration/alert-sources/monit",
+ "zh/on-call/integration/alert-integration/alert-sources/monitive",
+ "zh/on-call/integration/alert-integration/alert-sources/monte-carlo",
+ "zh/on-call/integration/alert-integration/alert-sources/nagios",
+ "zh/on-call/integration/alert-integration/alert-sources/netbeez",
+ "zh/on-call/integration/alert-integration/alert-sources/netdata",
+ "zh/on-call/integration/alert-integration/alert-sources/new-relic",
+ "zh/on-call/integration/alert-integration/alert-sources/nobl9",
+ "zh/on-call/integration/alert-integration/alert-sources/nodeping",
+ "zh/on-call/integration/alert-integration/alert-sources/ns1",
+ "zh/on-call/integration/alert-integration/alert-sources/ntopng",
+ "zh/on-call/integration/alert-integration/alert-sources/nut",
+ "zh/on-call/integration/alert-integration/alert-sources/obkio",
+ "zh/on-call/integration/alert-integration/alert-sources/observium",
+ "zh/on-call/integration/alert-integration/alert-sources/oceanbase",
+ "zh/on-call/integration/alert-integration/alert-sources/oci-monitoring",
+ "zh/on-call/integration/alert-integration/alert-sources/odown",
+ "zh/on-call/integration/alert-integration/alert-sources/ofelia",
+ "zh/on-call/integration/alert-integration/alert-sources/ohdear",
"zh/on-call/integration/alert-integration/alert-sources/okta",
- "zh/on-call/integration/alert-integration/alert-sources/statuspage",
- "zh/on-call/integration/alert-integration/alert-sources/instatus",
- "zh/on-call/integration/alert-integration/alert-sources/statuspal",
- "zh/on-call/integration/alert-integration/alert-sources/hund",
- "zh/on-call/integration/alert-integration/alert-sources/argocd",
- "zh/on-call/integration/alert-integration/alert-sources/crowdstrike",
- "zh/on-call/integration/alert-integration/alert-sources/fluxcd",
- "zh/on-call/integration/alert-integration/alert-sources/harness",
- "zh/on-call/integration/alert-integration/alert-sources/komodor",
- "zh/on-call/integration/alert-integration/alert-sources/twilio",
- "zh/on-call/integration/alert-integration/alert-sources/pandora-fms",
- "zh/on-call/integration/alert-integration/alert-sources/openstatus",
+ "zh/on-call/integration/alert-integration/alert-sources/open-falcon",
"zh/on-call/integration/alert-integration/alert-sources/opennms",
- "zh/on-call/integration/alert-integration/alert-sources/stripe",
- "zh/on-call/integration/alert-integration/alert-sources/dead-mans-snitch",
- "zh/on-call/integration/alert-integration/alert-sources/oci-monitoring",
- "zh/on-call/integration/alert-integration/alert-sources/hyperdx",
- "zh/on-call/integration/alert-integration/alert-sources/consul",
- "zh/on-call/integration/alert-integration/alert-sources/firebase-crashlytics",
- "zh/on-call/integration/alert-integration/alert-sources/cert-spotter",
- "zh/on-call/integration/alert-integration/alert-sources/crowdsec",
- "zh/on-call/integration/alert-integration/alert-sources/cfengine",
- "zh/on-call/integration/alert-integration/alert-sources/mezmo",
- "zh/on-call/integration/alert-integration/alert-sources/crowdstrike-logscale",
- "zh/on-call/integration/alert-integration/alert-sources/bigpanda",
- "zh/on-call/integration/alert-integration/alert-sources/loggly",
- "zh/on-call/integration/alert-integration/alert-sources/catchpoint",
- "zh/on-call/integration/alert-integration/alert-sources/check-point-smartevent",
+ "zh/on-call/integration/alert-integration/alert-sources/openobserve",
+ "zh/on-call/integration/alert-integration/alert-sources/opensearch",
+ "zh/on-call/integration/alert-integration/alert-sources/openstatus",
+ "zh/on-call/integration/alert-integration/alert-sources/opmanager",
+ "zh/on-call/integration/alert-integration/alert-sources/opnsense",
+ "zh/on-call/integration/alert-integration/alert-sources/opsgenie",
+ "zh/on-call/integration/alert-integration/alert-sources/opsview",
"zh/on-call/integration/alert-integration/alert-sources/ossec",
- "zh/on-call/integration/alert-integration/alert-sources/zeek",
- "zh/on-call/integration/alert-integration/alert-sources/chronosphere",
- "zh/on-call/integration/alert-integration/alert-sources/cubeapm",
- "zh/on-call/integration/alert-integration/alert-sources/red-hat-openshift",
+ "zh/on-call/integration/alert-integration/alert-sources/pagerduty",
+ "zh/on-call/integration/alert-integration/alert-sources/pandora-fms",
+ "zh/on-call/integration/alert-integration/alert-sources/panther",
"zh/on-call/integration/alert-integration/alert-sources/papertrail",
- "zh/on-call/integration/alert-integration/alert-sources/zabbix",
- "zh/on-call/integration/alert-integration/alert-sources/flashcat",
- "zh/on-call/integration/alert-integration/alert-sources/open-falcon",
- "zh/on-call/integration/alert-integration/alert-sources/uptime-kuma",
+ "zh/on-call/integration/alert-integration/alert-sources/peekaping",
+ "zh/on-call/integration/alert-integration/alert-sources/pgdash",
+ "zh/on-call/integration/alert-integration/alert-sources/phare",
+ "zh/on-call/integration/alert-integration/alert-sources/pingdom",
+ "zh/on-call/integration/alert-integration/alert-sources/postman",
+ "zh/on-call/integration/alert-integration/alert-sources/powerjob",
"zh/on-call/integration/alert-integration/alert-sources/projectdiscovery",
- "zh/on-call/integration/alert-integration/alert-sources/statuscake",
+ "zh/on-call/integration/alert-integration/alert-sources/prometheus",
+ "zh/on-call/integration/alert-integration/alert-sources/prtg",
"zh/on-call/integration/alert-integration/alert-sources/pulsetic",
- "zh/on-call/integration/alert-integration/alert-sources/edge-delta",
- "zh/on-call/integration/alert-integration/alert-sources/loadster",
- "zh/on-call/integration/alert-integration/alert-sources/cronicle",
- "zh/on-call/integration/alert-integration/alert-sources/atatus",
- "zh/on-call/integration/alert-integration/alert-sources/calibre",
- "zh/on-call/integration/alert-integration/alert-sources/uptimia",
- "zh/on-call/integration/alert-integration/alert-sources/clustercontrol",
- "zh/on-call/integration/alert-integration/alert-sources/hertzbeat",
- "zh/on-call/integration/alert-integration/alert-sources/nobl9",
+ "zh/on-call/integration/alert-integration/alert-sources/pulseway",
+ "zh/on-call/integration/alert-integration/alert-sources/raritan-px",
+ "zh/on-call/integration/alert-integration/alert-sources/raygun",
+ "zh/on-call/integration/alert-integration/alert-sources/rbltracker",
+ "zh/on-call/integration/alert-integration/alert-sources/red-hat-openshift",
+ "zh/on-call/integration/alert-integration/alert-sources/redash",
+ "zh/on-call/integration/alert-integration/alert-sources/redgate-sql-monitor",
+ "zh/on-call/integration/alert-integration/alert-sources/rizhiyi",
+ "zh/on-call/integration/alert-integration/alert-sources/robotalp",
+ "zh/on-call/integration/alert-integration/alert-sources/robusta",
+ "zh/on-call/integration/alert-integration/alert-sources/rollbar",
+ "zh/on-call/integration/alert-integration/alert-sources/rum-alert",
+ "zh/on-call/integration/alert-integration/alert-sources/searchstax",
+ "zh/on-call/integration/alert-integration/alert-sources/securityscorecard",
+ "zh/on-call/integration/alert-integration/alert-sources/sematext",
+ "zh/on-call/integration/alert-integration/alert-sources/semgrep",
+ "zh/on-call/integration/alert-integration/alert-sources/sensu",
+ "zh/on-call/integration/alert-integration/alert-sources/sentry",
"zh/on-call/integration/alert-integration/alert-sources/sevone",
- "zh/on-call/integration/alert-integration/alert-sources/hosted-graphite",
- "zh/on-call/integration/alert-integration/alert-sources/netbeez",
- "zh/on-call/integration/alert-integration/alert-sources/coroot",
- "zh/on-call/integration/alert-integration/alert-sources/apimetrics",
- "zh/on-call/integration/alert-integration/alert-sources/gatus",
- "zh/on-call/integration/alert-integration/alert-sources/metoro",
- "zh/on-call/integration/alert-integration/alert-sources/odown",
- "zh/on-call/integration/alert-integration/alert-sources/bleemeo",
- "zh/on-call/integration/alert-integration/alert-sources/whatap",
- "zh/on-call/integration/alert-integration/alert-sources/fastnetmon",
- "zh/on-call/integration/alert-integration/alert-sources/updown",
- "zh/on-call/integration/alert-integration/alert-sources/hyperping",
- "zh/on-call/integration/alert-integration/alert-sources/statusgator",
+ "zh/on-call/integration/alert-integration/alert-sources/signoz",
"zh/on-call/integration/alert-integration/alert-sources/simple-observability",
- "zh/on-call/integration/alert-integration/alert-sources/xitoring",
- "zh/on-call/integration/alert-integration/alert-sources/phare",
- "zh/on-call/integration/alert-integration/alert-sources/monitive",
- "zh/on-call/integration/alert-integration/alert-sources/tideways",
- "zh/on-call/integration/alert-integration/alert-sources/wormly",
- "zh/on-call/integration/alert-integration/alert-sources/obkio",
- "zh/on-call/integration/alert-integration/alert-sources/flowtriq",
- "zh/on-call/integration/alert-integration/alert-sources/tactical-rmm",
- "zh/on-call/integration/alert-integration/alert-sources/bgpalerter",
- "zh/on-call/integration/alert-integration/alert-sources/imperva",
- "zh/on-call/integration/alert-integration/alert-sources/wazuh",
- "zh/on-call/integration/alert-integration/alert-sources/auth0",
- "zh/on-call/integration/alert-integration/alert-sources/twingate",
- "zh/on-call/integration/alert-integration/alert-sources/langsmith",
- "zh/on-call/integration/alert-integration/alert-sources/nodeping",
- "zh/on-call/integration/alert-integration/alert-sources/influxdata",
- "zh/on-call/integration/alert-integration/alert-sources/kapacitor",
- "zh/on-call/integration/alert-integration/alert-sources/graylog",
+ "zh/on-call/integration/alert-integration/alert-sources/site24x7",
"zh/on-call/integration/alert-integration/alert-sources/skywalking",
- "zh/on-call/integration/alert-integration/alert-sources/elastalert2",
- "zh/on-call/integration/alert-integration/alert-sources/keep",
- "zh/on-call/integration/alert-integration/alert-sources/aliyun-arms",
- "zh/on-call/integration/alert-integration/alert-sources/aliyun-cm-event",
- "zh/on-call/integration/alert-integration/alert-sources/aliyun-cm-metrics",
- "zh/on-call/integration/alert-integration/alert-sources/aliyun-sls",
- "zh/on-call/integration/alert-integration/alert-sources/aliyun-prometheus",
- "zh/on-call/integration/alert-integration/alert-sources/aliyun-dataworks-op",
- "zh/on-call/integration/alert-integration/alert-sources/aws-cloudwatch",
- "zh/on-call/integration/alert-integration/alert-sources/aws-eventbridge",
- "zh/on-call/integration/alert-integration/alert-sources/azure-monitor",
- "zh/on-call/integration/alert-integration/alert-sources/google-cloud-monitoring",
- "zh/on-call/integration/alert-integration/alert-sources/google-scc",
- "zh/on-call/integration/alert-integration/alert-sources/tencent-cls",
- "zh/on-call/integration/alert-integration/alert-sources/tencent-css",
- "zh/on-call/integration/alert-integration/alert-sources/tencent-cm",
- "zh/on-call/integration/alert-integration/alert-sources/tencent-eventbridge",
- "zh/on-call/integration/alert-integration/alert-sources/baidu-bcm",
- "zh/on-call/integration/alert-integration/alert-sources/ctyun",
- "zh/on-call/integration/alert-integration/alert-sources/ecloud-cm",
- "zh/on-call/integration/alert-integration/alert-sources/huawei-ces",
- "zh/on-call/integration/alert-integration/alert-sources/huawei-lts",
- "zh/on-call/integration/alert-integration/alert-sources/huawei-apm",
- "zh/on-call/integration/alert-integration/alert-sources/huawei-aom",
- "zh/on-call/integration/alert-integration/alert-sources/volcengine-cm-metrics",
- "zh/on-call/integration/alert-integration/alert-sources/volcengine-cm-event",
- "zh/on-call/integration/alert-integration/alert-sources/volcengine-tls",
- "zh/on-call/integration/alert-integration/alert-sources/pagerduty",
- "zh/on-call/integration/alert-integration/alert-sources/opsgenie",
- "zh/on-call/integration/alert-integration/alert-sources/dynatrace",
- "zh/on-call/integration/alert-integration/alert-sources/appdynamics",
+ "zh/on-call/integration/alert-integration/alert-sources/snyk",
"zh/on-call/integration/alert-integration/alert-sources/solarwinds",
"zh/on-call/integration/alert-integration/alert-sources/solarwinds-orion",
+ "zh/on-call/integration/alert-integration/alert-sources/sonarqube",
+ "zh/on-call/integration/alert-integration/alert-sources/split-io",
"zh/on-call/integration/alert-integration/alert-sources/splunk",
"zh/on-call/integration/alert-integration/alert-sources/splunk-observability",
- "zh/on-call/integration/alert-integration/alert-sources/sentry",
- "zh/on-call/integration/alert-integration/alert-sources/opmanager",
- "zh/on-call/integration/alert-integration/alert-sources/blueking",
- "zh/on-call/integration/alert-integration/alert-sources/guance",
- "zh/on-call/integration/alert-integration/alert-sources/jiankongbao",
- "zh/on-call/integration/alert-integration/alert-sources/oceanbase",
- "zh/on-call/integration/alert-integration/alert-sources/zilliz",
- "zh/on-call/integration/alert-integration/alert-sources/zstack",
- "zh/on-call/integration/alert-integration/alert-sources/cloudflare",
- "zh/on-call/integration/alert-integration/alert-sources/meraki",
- "zh/on-call/integration/alert-integration/alert-sources/monit",
- "zh/on-call/integration/alert-integration/alert-sources/rum-alert",
- "zh/on-call/integration/alert-integration/alert-sources/harbor",
+ "zh/on-call/integration/alert-integration/alert-sources/stackrox",
+ "zh/on-call/integration/alert-integration/alert-sources/statuscake",
+ "zh/on-call/integration/alert-integration/alert-sources/statusgator",
+ "zh/on-call/integration/alert-integration/alert-sources/statuspage",
+ "zh/on-call/integration/alert-integration/alert-sources/statuspal",
+ "zh/on-call/integration/alert-integration/alert-sources/stripe",
+ "zh/on-call/integration/alert-integration/alert-sources/sublime",
+ "zh/on-call/integration/alert-integration/alert-sources/sumo-logic",
+ "zh/on-call/integration/alert-integration/alert-sources/suricata",
+ "zh/on-call/integration/alert-integration/alert-sources/sysdig",
+ "zh/on-call/integration/alert-integration/alert-sources/tactical-rmm",
+ "zh/on-call/integration/alert-integration/alert-sources/tailscale",
+ "zh/on-call/integration/alert-integration/alert-sources/tencent-cls",
+ "zh/on-call/integration/alert-integration/alert-sources/tencent-cm",
+ "zh/on-call/integration/alert-integration/alert-sources/tencent-css",
+ "zh/on-call/integration/alert-integration/alert-sources/tencent-eventbridge",
+ "zh/on-call/integration/alert-integration/alert-sources/thinkst-canary",
+ "zh/on-call/integration/alert-integration/alert-sources/thousandeyes",
+ "zh/on-call/integration/alert-integration/alert-sources/tideways",
+ "zh/on-call/integration/alert-integration/alert-sources/tracee",
+ "zh/on-call/integration/alert-integration/alert-sources/trigger-dev",
+ "zh/on-call/integration/alert-integration/alert-sources/trivy-operator",
+ "zh/on-call/integration/alert-integration/alert-sources/twilio",
+ "zh/on-call/integration/alert-integration/alert-sources/twingate",
"zh/on-call/integration/alert-integration/alert-sources/ucloud-cloudwatch",
- "zh/on-call/integration/alert-integration/alert-sources/jdcloud",
- "zh/on-call/integration/alert-integration/alert-sources/kscloud-monitor",
- "zh/on-call/integration/alert-integration/alert-sources/volcengine-rtc",
+ "zh/on-call/integration/alert-integration/alert-sources/updown",
+ "zh/on-call/integration/alert-integration/alert-sources/upguard",
+ "zh/on-call/integration/alert-integration/alert-sources/uptime-com",
+ "zh/on-call/integration/alert-integration/alert-sources/uptime-kuma",
+ "zh/on-call/integration/alert-integration/alert-sources/uptimeobserver",
+ "zh/on-call/integration/alert-integration/alert-sources/uptimerobot",
+ "zh/on-call/integration/alert-integration/alert-sources/uptimia",
+ "zh/on-call/integration/alert-integration/alert-sources/uptrends",
+ "zh/on-call/integration/alert-integration/alert-sources/veeam-one",
+ "zh/on-call/integration/alert-integration/alert-sources/veeam-service-provider-console",
+ "zh/on-call/integration/alert-integration/alert-sources/veracode-sca",
+ "zh/on-call/integration/alert-integration/alert-sources/vigil",
+ "zh/on-call/integration/alert-integration/alert-sources/volcengine-cm-event",
+ "zh/on-call/integration/alert-integration/alert-sources/volcengine-cm-metrics",
"zh/on-call/integration/alert-integration/alert-sources/volcengine-dial",
- "zh/on-call/integration/alert-integration/alert-sources/nagios",
- "zh/on-call/integration/alert-integration/alert-sources/emqx",
- "zh/on-call/integration/alert-integration/alert-sources/rizhiyi",
- "zh/on-call/integration/alert-integration/alert-sources/dingtalk-alert",
- "zh/on-call/integration/alert-integration/alert-sources/lark-alert",
+ "zh/on-call/integration/alert-integration/alert-sources/volcengine-rtc",
+ "zh/on-call/integration/alert-integration/alert-sources/volcengine-tls",
+ "zh/on-call/integration/alert-integration/alert-sources/wazuh",
"zh/on-call/integration/alert-integration/alert-sources/wecom-alert",
- "zh/on-call/integration/alert-integration/alert-sources/ghost-inspector",
- "zh/on-call/integration/alert-integration/alert-sources/monte-carlo",
- "zh/on-call/integration/alert-integration/alert-sources/limacharlie"
+ "zh/on-call/integration/alert-integration/alert-sources/whatap",
+ "zh/on-call/integration/alert-integration/alert-sources/whatsup-gold",
+ "zh/on-call/integration/alert-integration/alert-sources/wormly",
+ "zh/on-call/integration/alert-integration/alert-sources/xitoring",
+ "zh/on-call/integration/alert-integration/alert-sources/zabbix",
+ "zh/on-call/integration/alert-integration/alert-sources/zeek",
+ "zh/on-call/integration/alert-integration/alert-sources/zenoss",
+ "zh/on-call/integration/alert-integration/alert-sources/zilliz",
+ "zh/on-call/integration/alert-integration/alert-sources/zstack"
]
},
{
"group": "变更集成",
"pages": [
+ "zh/on-call/integration/change-integration/apollo",
+ "zh/on-call/integration/change-integration/argo-rollouts",
+ "zh/on-call/integration/change-integration/argocd",
+ "zh/on-call/integration/change-integration/awx",
+ "zh/on-call/integration/change-integration/azure-devops",
+ "zh/on-call/integration/change-integration/bitbucket",
+ "zh/on-call/integration/change-integration/buildkite",
+ "zh/on-call/integration/change-integration/circleci",
+ "zh/on-call/integration/change-integration/coolify",
"zh/on-call/integration/change-integration/custom-event",
- "zh/on-call/integration/change-integration/heroku",
- "zh/on-call/integration/change-integration/teamcity",
- "zh/on-call/integration/change-integration/railway",
+ "zh/on-call/integration/change-integration/env0",
+ "zh/on-call/integration/change-integration/expo-eas",
+ "zh/on-call/integration/change-integration/flagsmith",
+ "zh/on-call/integration/change-integration/fluxcd",
+ "zh/on-call/integration/change-integration/gitea",
+ "zh/on-call/integration/change-integration/gitee",
"zh/on-call/integration/change-integration/github",
"zh/on-call/integration/change-integration/gitlab",
+ "zh/on-call/integration/change-integration/growthbook",
+ "zh/on-call/integration/change-integration/harness-fme",
"zh/on-call/integration/change-integration/hcp-terraform",
- "zh/on-call/integration/change-integration/argocd",
- "zh/on-call/integration/change-integration/netlify",
- "zh/on-call/integration/change-integration/vercel",
+ "zh/on-call/integration/change-integration/heroku",
+ "zh/on-call/integration/change-integration/jenkins",
"zh/on-call/integration/change-integration/jfrog-artifactory",
- "zh/on-call/integration/change-integration/buildkite",
+ "zh/on-call/integration/change-integration/jira",
"zh/on-call/integration/change-integration/launchdarkly",
- "zh/on-call/integration/change-integration/jenkins",
- "zh/on-call/integration/change-integration/circleci",
- "zh/on-call/integration/change-integration/bitbucket",
- "zh/on-call/integration/change-integration/unleash",
- "zh/on-call/integration/change-integration/gitea",
- "zh/on-call/integration/change-integration/rundeck",
- "zh/on-call/integration/change-integration/flagsmith",
- "zh/on-call/integration/change-integration/azure-devops",
- "zh/on-call/integration/change-integration/argo-rollouts",
+ "zh/on-call/integration/change-integration/nautobot",
+ "zh/on-call/integration/change-integration/netbox",
+ "zh/on-call/integration/change-integration/netlify",
"zh/on-call/integration/change-integration/octopus-deploy",
- "zh/on-call/integration/change-integration/awx",
- "zh/on-call/integration/change-integration/semaphore",
- "zh/on-call/integration/change-integration/coolify",
- "zh/on-call/integration/change-integration/scalr",
- "zh/on-call/integration/change-integration/growthbook",
- "zh/on-call/integration/change-integration/fluxcd",
"zh/on-call/integration/change-integration/pulumi",
- "zh/on-call/integration/change-integration/env0",
- "zh/on-call/integration/change-integration/expo-eas",
- "zh/on-call/integration/change-integration/harness-fme",
- "zh/on-call/integration/change-integration/gitee",
+ "zh/on-call/integration/change-integration/railway",
+ "zh/on-call/integration/change-integration/rundeck",
+ "zh/on-call/integration/change-integration/scalr",
+ "zh/on-call/integration/change-integration/semaphore",
+ "zh/on-call/integration/change-integration/teamcity",
+ "zh/on-call/integration/change-integration/unleash",
+ "zh/on-call/integration/change-integration/vercel",
"zh/on-call/integration/change-integration/yunxiao-appstack",
- "zh/on-call/integration/change-integration/zadig",
- "zh/on-call/integration/change-integration/netbox",
- "zh/on-call/integration/change-integration/nautobot",
- "zh/on-call/integration/change-integration/apollo",
- "zh/on-call/integration/change-integration/jira"
+ "zh/on-call/integration/change-integration/zadig"
]
},
{
@@ -3711,9 +3740,9 @@
{
"group": "异常上报",
"pages": [
- "zh/rum/error-tracking/erro-reporting/web",
- "zh/rum/error-tracking/erro-reporting/android",
- "zh/rum/error-tracking/erro-reporting/ios"
+ "zh/rum/error-tracking/error-reporting/web",
+ "zh/rum/error-tracking/error-reporting/android",
+ "zh/rum/error-tracking/error-reporting/ios"
]
},
"zh/rum/error-tracking/error-viewing",
@@ -3864,7 +3893,7 @@
"zh/openapi/introduction",
"zh/openapi/api-catalog",
"zh/openapi/pagination",
- "zh/openapi/go-sdk"
+ "zh/openapi/rate-limits"
]
},
{
@@ -4873,345 +4902,346 @@
"group": "Alert Integration",
"expanded": false,
"pages": [
+ "en/on-call/integration/alert-integration/overview",
"en/on-call/integration/alert-integration/alert-sources/standard-alert",
"en/on-call/integration/alert-integration/alert-sources/email",
"en/on-call/integration/alert-integration/alert-sources/http-pull",
"en/on-call/integration/alert-integration/alert-sources/db-pull",
- "en/on-call/integration/alert-integration/alert-sources/prometheus",
- "en/on-call/integration/alert-integration/alert-sources/grafana",
- "en/on-call/integration/alert-integration/alert-sources/datadog",
- "en/on-call/integration/alert-integration/alert-sources/new-relic",
- "en/on-call/integration/alert-integration/alert-sources/sumo-logic",
- "en/on-call/integration/alert-integration/alert-sources/fortisiem",
- "en/on-call/integration/alert-integration/alert-sources/ns1",
- "en/on-call/integration/alert-integration/alert-sources/site24x7",
- "en/on-call/integration/alert-integration/alert-sources/healthchecks-io",
- "en/on-call/integration/alert-integration/alert-sources/cronitor",
- "en/on-call/integration/alert-integration/alert-sources/uptimerobot",
- "en/on-call/integration/alert-integration/alert-sources/pingdom",
- "en/on-call/integration/alert-integration/alert-sources/coralogix",
- "en/on-call/integration/alert-integration/alert-sources/gitguardian",
"en/on-call/integration/alert-integration/alert-sources/aikido",
- "en/on-call/integration/alert-integration/alert-sources/cato",
- "en/on-call/integration/alert-integration/alert-sources/rollbar",
- "en/on-call/integration/alert-integration/alert-sources/trigger-dev",
- "en/on-call/integration/alert-integration/alert-sources/duplicati",
- "en/on-call/integration/alert-integration/alert-sources/robotalp",
- "en/on-call/integration/alert-integration/alert-sources/formant",
- "en/on-call/integration/alert-integration/alert-sources/powerjob",
- "en/on-call/integration/alert-integration/alert-sources/dolphinscheduler",
+ "en/on-call/integration/alert-integration/alert-sources/airbrake",
"en/on-call/integration/alert-integration/alert-sources/alertsite",
- "en/on-call/integration/alert-integration/alert-sources/robusta",
- "en/on-call/integration/alert-integration/alert-sources/pgdash",
- "en/on-call/integration/alert-integration/alert-sources/infisical",
- "en/on-call/integration/alert-integration/alert-sources/fivetran",
- "en/on-call/integration/alert-integration/alert-sources/datto-rmm",
- "en/on-call/integration/alert-integration/alert-sources/pulseway",
- "en/on-call/integration/alert-integration/alert-sources/securityscorecard",
- "en/on-call/integration/alert-integration/alert-sources/jfrog-xray",
- "en/on-call/integration/alert-integration/alert-sources/lacework",
- "en/on-call/integration/alert-integration/alert-sources/moesif",
- "en/on-call/integration/alert-integration/alert-sources/rbltracker",
- "en/on-call/integration/alert-integration/alert-sources/uptimeobserver",
- "en/on-call/integration/alert-integration/alert-sources/dash0",
- "en/on-call/integration/alert-integration/alert-sources/elastic",
- "en/on-call/integration/alert-integration/alert-sources/mongodb-atlas",
- "en/on-call/integration/alert-integration/alert-sources/checkly",
- "en/on-call/integration/alert-integration/alert-sources/prtg",
- "en/on-call/integration/alert-integration/alert-sources/netdata",
- "en/on-call/integration/alert-integration/alert-sources/stackrox",
- "en/on-call/integration/alert-integration/alert-sources/trivy-operator",
- "en/on-call/integration/alert-integration/alert-sources/honeycomb",
- "en/on-call/integration/alert-integration/alert-sources/panther",
+ "en/on-call/integration/alert-integration/alert-sources/aliyun-arms",
+ "en/on-call/integration/alert-integration/alert-sources/aliyun-cm-event",
+ "en/on-call/integration/alert-integration/alert-sources/aliyun-cm-metrics",
+ "en/on-call/integration/alert-integration/alert-sources/aliyun-dataworks-op",
+ "en/on-call/integration/alert-integration/alert-sources/aliyun-prometheus",
+ "en/on-call/integration/alert-integration/alert-sources/aliyun-sls",
+ "en/on-call/integration/alert-integration/alert-sources/amazon-inspector",
+ "en/on-call/integration/alert-integration/alert-sources/apcupsd",
+ "en/on-call/integration/alert-integration/alert-sources/apimetrics",
+ "en/on-call/integration/alert-integration/alert-sources/appdynamics",
+ "en/on-call/integration/alert-integration/alert-sources/appsignal",
+ "en/on-call/integration/alert-integration/alert-sources/argocd",
+ "en/on-call/integration/alert-integration/alert-sources/atatus",
+ "en/on-call/integration/alert-integration/alert-sources/auth0",
+ "en/on-call/integration/alert-integration/alert-sources/auvik",
+ "en/on-call/integration/alert-integration/alert-sources/aws-cloudwatch",
+ "en/on-call/integration/alert-integration/alert-sources/aws-eventbridge",
+ "en/on-call/integration/alert-integration/alert-sources/aws-health",
+ "en/on-call/integration/alert-integration/alert-sources/aws-security-hub",
"en/on-call/integration/alert-integration/alert-sources/axiom",
+ "en/on-call/integration/alert-integration/alert-sources/azure-monitor",
+ "en/on-call/integration/alert-integration/alert-sources/azure-service-health",
+ "en/on-call/integration/alert-integration/alert-sources/baidu-bcm",
+ "en/on-call/integration/alert-integration/alert-sources/bgpalerter",
+ "en/on-call/integration/alert-integration/alert-sources/bigpanda",
+ "en/on-call/integration/alert-integration/alert-sources/bitdefender",
+ "en/on-call/integration/alert-integration/alert-sources/bleemeo",
+ "en/on-call/integration/alert-integration/alert-sources/blueking",
+ "en/on-call/integration/alert-integration/alert-sources/blumira",
+ "en/on-call/integration/alert-integration/alert-sources/bugsnag",
+ "en/on-call/integration/alert-integration/alert-sources/calibre",
+ "en/on-call/integration/alert-integration/alert-sources/canarytokens",
+ "en/on-call/integration/alert-integration/alert-sources/catchpoint",
+ "en/on-call/integration/alert-integration/alert-sources/cato",
+ "en/on-call/integration/alert-integration/alert-sources/censys",
+ "en/on-call/integration/alert-integration/alert-sources/centreon",
+ "en/on-call/integration/alert-integration/alert-sources/cert-spotter",
+ "en/on-call/integration/alert-integration/alert-sources/cfengine",
+ "en/on-call/integration/alert-integration/alert-sources/check-point-smartevent",
+ "en/on-call/integration/alert-integration/alert-sources/checkly",
"en/on-call/integration/alert-integration/alert-sources/checkmk",
+ "en/on-call/integration/alert-integration/alert-sources/chronosphere",
+ "en/on-call/integration/alert-integration/alert-sources/circonus",
+ "en/on-call/integration/alert-integration/alert-sources/cloudamqp",
+ "en/on-call/integration/alert-integration/alert-sources/cloudflare",
+ "en/on-call/integration/alert-integration/alert-sources/clustercontrol",
+ "en/on-call/integration/alert-integration/alert-sources/consul",
+ "en/on-call/integration/alert-integration/alert-sources/contrast",
+ "en/on-call/integration/alert-integration/alert-sources/coralogix",
+ "en/on-call/integration/alert-integration/alert-sources/coroot",
+ "en/on-call/integration/alert-integration/alert-sources/cronicle",
+ "en/on-call/integration/alert-integration/alert-sources/cronitor",
+ "en/on-call/integration/alert-integration/alert-sources/crowdsec",
+ "en/on-call/integration/alert-integration/alert-sources/crowdstrike",
+ "en/on-call/integration/alert-integration/alert-sources/crowdstrike-logscale",
+ "en/on-call/integration/alert-integration/alert-sources/ctyun",
+ "en/on-call/integration/alert-integration/alert-sources/cubeapm",
+ "en/on-call/integration/alert-integration/alert-sources/dash0",
+ "en/on-call/integration/alert-integration/alert-sources/datadog",
+ "en/on-call/integration/alert-integration/alert-sources/datto-rmm",
+ "en/on-call/integration/alert-integration/alert-sources/dbmarlin",
+ "en/on-call/integration/alert-integration/alert-sources/dead-mans-snitch",
+ "en/on-call/integration/alert-integration/alert-sources/dependency-track",
+ "en/on-call/integration/alert-integration/alert-sources/dingtalk-alert",
"en/on-call/integration/alert-integration/alert-sources/dkron",
- "en/on-call/integration/alert-integration/alert-sources/auvik",
+ "en/on-call/integration/alert-integration/alert-sources/dolphinscheduler",
"en/on-call/integration/alert-integration/alert-sources/domotz",
- "en/on-call/integration/alert-integration/alert-sources/ntopng",
- "en/on-call/integration/alert-integration/alert-sources/honeybadger",
- "en/on-call/integration/alert-integration/alert-sources/kener",
- "en/on-call/integration/alert-integration/alert-sources/peekaping",
- "en/on-call/integration/alert-integration/alert-sources/vigil",
- "en/on-call/integration/alert-integration/alert-sources/ofelia",
- "en/on-call/integration/alert-integration/alert-sources/dependency-track",
- "en/on-call/integration/alert-integration/alert-sources/openobserve",
- "en/on-call/integration/alert-integration/alert-sources/postman",
- "en/on-call/integration/alert-integration/alert-sources/contrast",
- "en/on-call/integration/alert-integration/alert-sources/censys",
- "en/on-call/integration/alert-integration/alert-sources/jumpcloud",
- "en/on-call/integration/alert-integration/alert-sources/zenoss",
- "en/on-call/integration/alert-integration/alert-sources/semgrep",
- "en/on-call/integration/alert-integration/alert-sources/sonarqube",
- "en/on-call/integration/alert-integration/alert-sources/level",
- "en/on-call/integration/alert-integration/alert-sources/juniper-mist",
+ "en/on-call/integration/alert-integration/alert-sources/dotcom-monitor",
+ "en/on-call/integration/alert-integration/alert-sources/duplicati",
+ "en/on-call/integration/alert-integration/alert-sources/dynatrace",
+ "en/on-call/integration/alert-integration/alert-sources/ecloud-cm",
+ "en/on-call/integration/alert-integration/alert-sources/edge-delta",
+ "en/on-call/integration/alert-integration/alert-sources/elastalert2",
+ "en/on-call/integration/alert-integration/alert-sources/elastic",
+ "en/on-call/integration/alert-integration/alert-sources/emqx",
"en/on-call/integration/alert-integration/alert-sources/extrahop",
- "en/on-call/integration/alert-integration/alert-sources/ohdear",
- "en/on-call/integration/alert-integration/alert-sources/appsignal",
+ "en/on-call/integration/alert-integration/alert-sources/fail2ban",
+ "en/on-call/integration/alert-integration/alert-sources/falco",
+ "en/on-call/integration/alert-integration/alert-sources/fastnetmon",
+ "en/on-call/integration/alert-integration/alert-sources/firebase-crashlytics",
+ "en/on-call/integration/alert-integration/alert-sources/firefly",
+ "en/on-call/integration/alert-integration/alert-sources/fivetran",
+ "en/on-call/integration/alert-integration/alert-sources/flashcat",
"en/on-call/integration/alert-integration/alert-sources/fleet",
- "en/on-call/integration/alert-integration/alert-sources/veracode-sca",
- "en/on-call/integration/alert-integration/alert-sources/dbmarlin",
- "en/on-call/integration/alert-integration/alert-sources/redash",
- "en/on-call/integration/alert-integration/alert-sources/sublime",
- "en/on-call/integration/alert-integration/alert-sources/cloudamqp",
- "en/on-call/integration/alert-integration/alert-sources/canarytokens",
- "en/on-call/integration/alert-integration/alert-sources/intersight",
- "en/on-call/integration/alert-integration/alert-sources/insightidr",
- "en/on-call/integration/alert-integration/alert-sources/upguard",
- "en/on-call/integration/alert-integration/alert-sources/tracee",
- "en/on-call/integration/alert-integration/alert-sources/airbrake",
- "en/on-call/integration/alert-integration/alert-sources/opensearch",
- "en/on-call/integration/alert-integration/alert-sources/logrocket",
- "en/on-call/integration/alert-integration/alert-sources/redgate-sql-monitor",
- "en/on-call/integration/alert-integration/alert-sources/gitlab",
- "en/on-call/integration/alert-integration/alert-sources/hookdeck",
- "en/on-call/integration/alert-integration/alert-sources/bugsnag",
- "en/on-call/integration/alert-integration/alert-sources/raygun",
- "en/on-call/integration/alert-integration/alert-sources/librenms",
- "en/on-call/integration/alert-integration/alert-sources/last9",
- "en/on-call/integration/alert-integration/alert-sources/signoz",
- "en/on-call/integration/alert-integration/alert-sources/veeam-one",
- "en/on-call/integration/alert-integration/alert-sources/veeam-service-provider-console",
- "en/on-call/integration/alert-integration/alert-sources/raritan-px",
- "en/on-call/integration/alert-integration/alert-sources/whatsup-gold",
"en/on-call/integration/alert-integration/alert-sources/flowmon-ads",
- "en/on-call/integration/alert-integration/alert-sources/aws-health",
- "en/on-call/integration/alert-integration/alert-sources/azure-service-health",
+ "en/on-call/integration/alert-integration/alert-sources/flowtriq",
+ "en/on-call/integration/alert-integration/alert-sources/fluxcd",
+ "en/on-call/integration/alert-integration/alert-sources/formant",
+ "en/on-call/integration/alert-integration/alert-sources/fortimonitor",
+ "en/on-call/integration/alert-integration/alert-sources/fortisiem",
+ "en/on-call/integration/alert-integration/alert-sources/gatus",
"en/on-call/integration/alert-integration/alert-sources/gcp-personalized-service-health",
- "en/on-call/integration/alert-integration/alert-sources/nut",
- "en/on-call/integration/alert-integration/alert-sources/apcupsd",
- "en/on-call/integration/alert-integration/alert-sources/centreon",
- "en/on-call/integration/alert-integration/alert-sources/opsview",
- "en/on-call/integration/alert-integration/alert-sources/microsoft-sentinel",
- "en/on-call/integration/alert-integration/alert-sources/microsoft-defender-for-cloud",
- "en/on-call/integration/alert-integration/alert-sources/aws-security-hub",
- "en/on-call/integration/alert-integration/alert-sources/amazon-inspector",
- "en/on-call/integration/alert-integration/alert-sources/fail2ban",
- "en/on-call/integration/alert-integration/alert-sources/suricata",
+ "en/on-call/integration/alert-integration/alert-sources/ghost-inspector",
+ "en/on-call/integration/alert-integration/alert-sources/gitguardian",
+ "en/on-call/integration/alert-integration/alert-sources/github",
+ "en/on-call/integration/alert-integration/alert-sources/gitlab",
+ "en/on-call/integration/alert-integration/alert-sources/google-cloud-monitoring",
+ "en/on-call/integration/alert-integration/alert-sources/google-scc",
+ "en/on-call/integration/alert-integration/alert-sources/grafana",
+ "en/on-call/integration/alert-integration/alert-sources/graylog",
+ "en/on-call/integration/alert-integration/alert-sources/guance",
+ "en/on-call/integration/alert-integration/alert-sources/hackerone",
+ "en/on-call/integration/alert-integration/alert-sources/harbor",
+ "en/on-call/integration/alert-integration/alert-sources/harness",
+ "en/on-call/integration/alert-integration/alert-sources/healthchecks-io",
+ "en/on-call/integration/alert-integration/alert-sources/hertzbeat",
+ "en/on-call/integration/alert-integration/alert-sources/hetrixtools",
+ "en/on-call/integration/alert-integration/alert-sources/honeybadger",
+ "en/on-call/integration/alert-integration/alert-sources/honeycomb",
+ "en/on-call/integration/alert-integration/alert-sources/hookdeck",
+ "en/on-call/integration/alert-integration/alert-sources/hosted-graphite",
+ "en/on-call/integration/alert-integration/alert-sources/huawei-aom",
+ "en/on-call/integration/alert-integration/alert-sources/huawei-apm",
+ "en/on-call/integration/alert-integration/alert-sources/huawei-ces",
+ "en/on-call/integration/alert-integration/alert-sources/huawei-lts",
+ "en/on-call/integration/alert-integration/alert-sources/hund",
+ "en/on-call/integration/alert-integration/alert-sources/hyperdx",
+ "en/on-call/integration/alert-integration/alert-sources/hyperping",
"en/on-call/integration/alert-integration/alert-sources/ibm-qradar",
- "en/on-call/integration/alert-integration/alert-sources/opnsense",
- "en/on-call/integration/alert-integration/alert-sources/observium",
"en/on-call/integration/alert-integration/alert-sources/icinga",
- "en/on-call/integration/alert-integration/alert-sources/sensu",
- "en/on-call/integration/alert-integration/alert-sources/sysdig",
- "en/on-call/integration/alert-integration/alert-sources/circonus",
+ "en/on-call/integration/alert-integration/alert-sources/imperva",
+ "en/on-call/integration/alert-integration/alert-sources/infisical",
+ "en/on-call/integration/alert-integration/alert-sources/influxdata",
+ "en/on-call/integration/alert-integration/alert-sources/insightidr",
"en/on-call/integration/alert-integration/alert-sources/instana",
+ "en/on-call/integration/alert-integration/alert-sources/instatus",
+ "en/on-call/integration/alert-integration/alert-sources/intersight",
+ "en/on-call/integration/alert-integration/alert-sources/jdcloud",
+ "en/on-call/integration/alert-integration/alert-sources/jfrog-xray",
+ "en/on-call/integration/alert-integration/alert-sources/jiankongbao",
+ "en/on-call/integration/alert-integration/alert-sources/jumpcloud",
+ "en/on-call/integration/alert-integration/alert-sources/juniper-mist",
+ "en/on-call/integration/alert-integration/alert-sources/kapacitor",
+ "en/on-call/integration/alert-integration/alert-sources/keep",
+ "en/on-call/integration/alert-integration/alert-sources/kener",
+ "en/on-call/integration/alert-integration/alert-sources/kentik",
+ "en/on-call/integration/alert-integration/alert-sources/komodor",
+ "en/on-call/integration/alert-integration/alert-sources/kscloud-monitor",
+ "en/on-call/integration/alert-integration/alert-sources/kuvasz",
+ "en/on-call/integration/alert-integration/alert-sources/lacework",
+ "en/on-call/integration/alert-integration/alert-sources/langsmith",
+ "en/on-call/integration/alert-integration/alert-sources/lark-alert",
+ "en/on-call/integration/alert-integration/alert-sources/last9",
+ "en/on-call/integration/alert-integration/alert-sources/level",
+ "en/on-call/integration/alert-integration/alert-sources/librenms",
+ "en/on-call/integration/alert-integration/alert-sources/limacharlie",
+ "en/on-call/integration/alert-integration/alert-sources/loadster",
+ "en/on-call/integration/alert-integration/alert-sources/loggly",
"en/on-call/integration/alert-integration/alert-sources/logicmonitor",
- "en/on-call/integration/alert-integration/alert-sources/uptime-com",
- "en/on-call/integration/alert-integration/alert-sources/sematext",
- "en/on-call/integration/alert-integration/alert-sources/fortimonitor",
- "en/on-call/integration/alert-integration/alert-sources/uptrends",
- "en/on-call/integration/alert-integration/alert-sources/searchstax",
"en/on-call/integration/alert-integration/alert-sources/logpoint",
- "en/on-call/integration/alert-integration/alert-sources/hetrixtools",
- "en/on-call/integration/alert-integration/alert-sources/mackerel",
- "en/on-call/integration/alert-integration/alert-sources/thousandeyes",
- "en/on-call/integration/alert-integration/alert-sources/kentik",
- "en/on-call/integration/alert-integration/alert-sources/github",
- "en/on-call/integration/alert-integration/alert-sources/tailscale",
+ "en/on-call/integration/alert-integration/alert-sources/logrocket",
"en/on-call/integration/alert-integration/alert-sources/logz-io",
- "en/on-call/integration/alert-integration/alert-sources/split-io",
- "en/on-call/integration/alert-integration/alert-sources/firefly",
- "en/on-call/integration/alert-integration/alert-sources/hackerone",
- "en/on-call/integration/alert-integration/alert-sources/dotcom-monitor",
- "en/on-call/integration/alert-integration/alert-sources/kuvasz",
- "en/on-call/integration/alert-integration/alert-sources/thinkst-canary",
- "en/on-call/integration/alert-integration/alert-sources/falco",
- "en/on-call/integration/alert-integration/alert-sources/blumira",
- "en/on-call/integration/alert-integration/alert-sources/bitdefender",
- "en/on-call/integration/alert-integration/alert-sources/snyk",
- "en/on-call/integration/alert-integration/alert-sources/okta",
- "en/on-call/integration/alert-integration/alert-sources/statuspage",
- "en/on-call/integration/alert-integration/alert-sources/instatus",
- "en/on-call/integration/alert-integration/alert-sources/statuspal",
- "en/on-call/integration/alert-integration/alert-sources/hund",
- "en/on-call/integration/alert-integration/alert-sources/argocd",
- "en/on-call/integration/alert-integration/alert-sources/crowdstrike",
- "en/on-call/integration/alert-integration/alert-sources/fluxcd",
- "en/on-call/integration/alert-integration/alert-sources/harness",
- "en/on-call/integration/alert-integration/alert-sources/komodor",
- "en/on-call/integration/alert-integration/alert-sources/twilio",
- "en/on-call/integration/alert-integration/alert-sources/pandora-fms",
- "en/on-call/integration/alert-integration/alert-sources/openstatus",
- "en/on-call/integration/alert-integration/alert-sources/opennms",
- "en/on-call/integration/alert-integration/alert-sources/stripe",
- "en/on-call/integration/alert-integration/alert-sources/dead-mans-snitch",
- "en/on-call/integration/alert-integration/alert-sources/oci-monitoring",
- "en/on-call/integration/alert-integration/alert-sources/hyperdx",
- "en/on-call/integration/alert-integration/alert-sources/consul",
- "en/on-call/integration/alert-integration/alert-sources/firebase-crashlytics",
- "en/on-call/integration/alert-integration/alert-sources/cert-spotter",
- "en/on-call/integration/alert-integration/alert-sources/crowdsec",
- "en/on-call/integration/alert-integration/alert-sources/cfengine",
+ "en/on-call/integration/alert-integration/alert-sources/mackerel",
+ "en/on-call/integration/alert-integration/alert-sources/meraki",
+ "en/on-call/integration/alert-integration/alert-sources/metoro",
"en/on-call/integration/alert-integration/alert-sources/mezmo",
- "en/on-call/integration/alert-integration/alert-sources/crowdstrike-logscale",
- "en/on-call/integration/alert-integration/alert-sources/bigpanda",
- "en/on-call/integration/alert-integration/alert-sources/loggly",
- "en/on-call/integration/alert-integration/alert-sources/catchpoint",
- "en/on-call/integration/alert-integration/alert-sources/check-point-smartevent",
+ "en/on-call/integration/alert-integration/alert-sources/microsoft-defender-for-cloud",
+ "en/on-call/integration/alert-integration/alert-sources/microsoft-sentinel",
+ "en/on-call/integration/alert-integration/alert-sources/moesif",
+ "en/on-call/integration/alert-integration/alert-sources/mongodb-atlas",
+ "en/on-call/integration/alert-integration/alert-sources/monit",
+ "en/on-call/integration/alert-integration/alert-sources/monitive",
+ "en/on-call/integration/alert-integration/alert-sources/monte-carlo",
+ "en/on-call/integration/alert-integration/alert-sources/nagios",
+ "en/on-call/integration/alert-integration/alert-sources/netbeez",
+ "en/on-call/integration/alert-integration/alert-sources/netdata",
+ "en/on-call/integration/alert-integration/alert-sources/new-relic",
+ "en/on-call/integration/alert-integration/alert-sources/nobl9",
+ "en/on-call/integration/alert-integration/alert-sources/nodeping",
+ "en/on-call/integration/alert-integration/alert-sources/ns1",
+ "en/on-call/integration/alert-integration/alert-sources/ntopng",
+ "en/on-call/integration/alert-integration/alert-sources/nut",
+ "en/on-call/integration/alert-integration/alert-sources/obkio",
+ "en/on-call/integration/alert-integration/alert-sources/observium",
+ "en/on-call/integration/alert-integration/alert-sources/oceanbase",
+ "en/on-call/integration/alert-integration/alert-sources/oci-monitoring",
+ "en/on-call/integration/alert-integration/alert-sources/odown",
+ "en/on-call/integration/alert-integration/alert-sources/ofelia",
+ "en/on-call/integration/alert-integration/alert-sources/ohdear",
+ "en/on-call/integration/alert-integration/alert-sources/okta",
+ "en/on-call/integration/alert-integration/alert-sources/open-falcon",
+ "en/on-call/integration/alert-integration/alert-sources/opennms",
+ "en/on-call/integration/alert-integration/alert-sources/openobserve",
+ "en/on-call/integration/alert-integration/alert-sources/opensearch",
+ "en/on-call/integration/alert-integration/alert-sources/openstatus",
+ "en/on-call/integration/alert-integration/alert-sources/opmanager",
+ "en/on-call/integration/alert-integration/alert-sources/opnsense",
+ "en/on-call/integration/alert-integration/alert-sources/opsgenie",
+ "en/on-call/integration/alert-integration/alert-sources/opsview",
"en/on-call/integration/alert-integration/alert-sources/ossec",
- "en/on-call/integration/alert-integration/alert-sources/zeek",
- "en/on-call/integration/alert-integration/alert-sources/chronosphere",
- "en/on-call/integration/alert-integration/alert-sources/cubeapm",
- "en/on-call/integration/alert-integration/alert-sources/red-hat-openshift",
+ "en/on-call/integration/alert-integration/alert-sources/pagerduty",
+ "en/on-call/integration/alert-integration/alert-sources/pandora-fms",
+ "en/on-call/integration/alert-integration/alert-sources/panther",
"en/on-call/integration/alert-integration/alert-sources/papertrail",
- "en/on-call/integration/alert-integration/alert-sources/zabbix",
- "en/on-call/integration/alert-integration/alert-sources/flashcat",
- "en/on-call/integration/alert-integration/alert-sources/open-falcon",
- "en/on-call/integration/alert-integration/alert-sources/uptime-kuma",
+ "en/on-call/integration/alert-integration/alert-sources/peekaping",
+ "en/on-call/integration/alert-integration/alert-sources/pgdash",
+ "en/on-call/integration/alert-integration/alert-sources/phare",
+ "en/on-call/integration/alert-integration/alert-sources/pingdom",
+ "en/on-call/integration/alert-integration/alert-sources/postman",
+ "en/on-call/integration/alert-integration/alert-sources/powerjob",
"en/on-call/integration/alert-integration/alert-sources/projectdiscovery",
- "en/on-call/integration/alert-integration/alert-sources/statuscake",
+ "en/on-call/integration/alert-integration/alert-sources/prometheus",
+ "en/on-call/integration/alert-integration/alert-sources/prtg",
"en/on-call/integration/alert-integration/alert-sources/pulsetic",
- "en/on-call/integration/alert-integration/alert-sources/edge-delta",
- "en/on-call/integration/alert-integration/alert-sources/loadster",
- "en/on-call/integration/alert-integration/alert-sources/cronicle",
- "en/on-call/integration/alert-integration/alert-sources/atatus",
- "en/on-call/integration/alert-integration/alert-sources/calibre",
- "en/on-call/integration/alert-integration/alert-sources/uptimia",
- "en/on-call/integration/alert-integration/alert-sources/clustercontrol",
- "en/on-call/integration/alert-integration/alert-sources/hertzbeat",
- "en/on-call/integration/alert-integration/alert-sources/nobl9",
+ "en/on-call/integration/alert-integration/alert-sources/pulseway",
+ "en/on-call/integration/alert-integration/alert-sources/raritan-px",
+ "en/on-call/integration/alert-integration/alert-sources/raygun",
+ "en/on-call/integration/alert-integration/alert-sources/rbltracker",
+ "en/on-call/integration/alert-integration/alert-sources/red-hat-openshift",
+ "en/on-call/integration/alert-integration/alert-sources/redash",
+ "en/on-call/integration/alert-integration/alert-sources/redgate-sql-monitor",
+ "en/on-call/integration/alert-integration/alert-sources/rizhiyi",
+ "en/on-call/integration/alert-integration/alert-sources/robotalp",
+ "en/on-call/integration/alert-integration/alert-sources/robusta",
+ "en/on-call/integration/alert-integration/alert-sources/rollbar",
+ "en/on-call/integration/alert-integration/alert-sources/rum-alert",
+ "en/on-call/integration/alert-integration/alert-sources/searchstax",
+ "en/on-call/integration/alert-integration/alert-sources/securityscorecard",
+ "en/on-call/integration/alert-integration/alert-sources/sematext",
+ "en/on-call/integration/alert-integration/alert-sources/semgrep",
+ "en/on-call/integration/alert-integration/alert-sources/sensu",
+ "en/on-call/integration/alert-integration/alert-sources/sentry",
"en/on-call/integration/alert-integration/alert-sources/sevone",
- "en/on-call/integration/alert-integration/alert-sources/hosted-graphite",
- "en/on-call/integration/alert-integration/alert-sources/netbeez",
- "en/on-call/integration/alert-integration/alert-sources/coroot",
- "en/on-call/integration/alert-integration/alert-sources/apimetrics",
- "en/on-call/integration/alert-integration/alert-sources/gatus",
- "en/on-call/integration/alert-integration/alert-sources/metoro",
- "en/on-call/integration/alert-integration/alert-sources/odown",
- "en/on-call/integration/alert-integration/alert-sources/bleemeo",
- "en/on-call/integration/alert-integration/alert-sources/whatap",
- "en/on-call/integration/alert-integration/alert-sources/fastnetmon",
- "en/on-call/integration/alert-integration/alert-sources/updown",
- "en/on-call/integration/alert-integration/alert-sources/hyperping",
- "en/on-call/integration/alert-integration/alert-sources/statusgator",
+ "en/on-call/integration/alert-integration/alert-sources/signoz",
"en/on-call/integration/alert-integration/alert-sources/simple-observability",
- "en/on-call/integration/alert-integration/alert-sources/xitoring",
- "en/on-call/integration/alert-integration/alert-sources/phare",
- "en/on-call/integration/alert-integration/alert-sources/monitive",
- "en/on-call/integration/alert-integration/alert-sources/tideways",
- "en/on-call/integration/alert-integration/alert-sources/wormly",
- "en/on-call/integration/alert-integration/alert-sources/obkio",
- "en/on-call/integration/alert-integration/alert-sources/flowtriq",
- "en/on-call/integration/alert-integration/alert-sources/tactical-rmm",
- "en/on-call/integration/alert-integration/alert-sources/bgpalerter",
- "en/on-call/integration/alert-integration/alert-sources/imperva",
- "en/on-call/integration/alert-integration/alert-sources/wazuh",
- "en/on-call/integration/alert-integration/alert-sources/auth0",
- "en/on-call/integration/alert-integration/alert-sources/twingate",
- "en/on-call/integration/alert-integration/alert-sources/langsmith",
- "en/on-call/integration/alert-integration/alert-sources/nodeping",
- "en/on-call/integration/alert-integration/alert-sources/influxdata",
- "en/on-call/integration/alert-integration/alert-sources/kapacitor",
- "en/on-call/integration/alert-integration/alert-sources/graylog",
+ "en/on-call/integration/alert-integration/alert-sources/site24x7",
"en/on-call/integration/alert-integration/alert-sources/skywalking",
- "en/on-call/integration/alert-integration/alert-sources/elastalert2",
- "en/on-call/integration/alert-integration/alert-sources/keep",
- "en/on-call/integration/alert-integration/alert-sources/aliyun-arms",
- "en/on-call/integration/alert-integration/alert-sources/aliyun-cm-event",
- "en/on-call/integration/alert-integration/alert-sources/aliyun-cm-metrics",
- "en/on-call/integration/alert-integration/alert-sources/aliyun-sls",
- "en/on-call/integration/alert-integration/alert-sources/aliyun-prometheus",
- "en/on-call/integration/alert-integration/alert-sources/aliyun-dataworks-op",
- "en/on-call/integration/alert-integration/alert-sources/aws-cloudwatch",
- "en/on-call/integration/alert-integration/alert-sources/aws-eventbridge",
- "en/on-call/integration/alert-integration/alert-sources/azure-monitor",
- "en/on-call/integration/alert-integration/alert-sources/google-cloud-monitoring",
- "en/on-call/integration/alert-integration/alert-sources/google-scc",
- "en/on-call/integration/alert-integration/alert-sources/tencent-cls",
- "en/on-call/integration/alert-integration/alert-sources/tencent-css",
- "en/on-call/integration/alert-integration/alert-sources/tencent-cm",
- "en/on-call/integration/alert-integration/alert-sources/tencent-eventbridge",
- "en/on-call/integration/alert-integration/alert-sources/baidu-bcm",
- "en/on-call/integration/alert-integration/alert-sources/ctyun",
- "en/on-call/integration/alert-integration/alert-sources/ecloud-cm",
- "en/on-call/integration/alert-integration/alert-sources/huawei-ces",
- "en/on-call/integration/alert-integration/alert-sources/huawei-lts",
- "en/on-call/integration/alert-integration/alert-sources/huawei-apm",
- "en/on-call/integration/alert-integration/alert-sources/huawei-aom",
- "en/on-call/integration/alert-integration/alert-sources/volcengine-cm-metrics",
- "en/on-call/integration/alert-integration/alert-sources/volcengine-cm-event",
- "en/on-call/integration/alert-integration/alert-sources/volcengine-tls",
- "en/on-call/integration/alert-integration/alert-sources/pagerduty",
- "en/on-call/integration/alert-integration/alert-sources/opsgenie",
- "en/on-call/integration/alert-integration/alert-sources/dynatrace",
- "en/on-call/integration/alert-integration/alert-sources/appdynamics",
+ "en/on-call/integration/alert-integration/alert-sources/snyk",
"en/on-call/integration/alert-integration/alert-sources/solarwinds",
"en/on-call/integration/alert-integration/alert-sources/solarwinds-orion",
+ "en/on-call/integration/alert-integration/alert-sources/sonarqube",
+ "en/on-call/integration/alert-integration/alert-sources/split-io",
"en/on-call/integration/alert-integration/alert-sources/splunk",
"en/on-call/integration/alert-integration/alert-sources/splunk-observability",
- "en/on-call/integration/alert-integration/alert-sources/sentry",
- "en/on-call/integration/alert-integration/alert-sources/opmanager",
- "en/on-call/integration/alert-integration/alert-sources/blueking",
- "en/on-call/integration/alert-integration/alert-sources/guance",
- "en/on-call/integration/alert-integration/alert-sources/jiankongbao",
- "en/on-call/integration/alert-integration/alert-sources/oceanbase",
- "en/on-call/integration/alert-integration/alert-sources/zilliz",
- "en/on-call/integration/alert-integration/alert-sources/zstack",
- "en/on-call/integration/alert-integration/alert-sources/cloudflare",
- "en/on-call/integration/alert-integration/alert-sources/meraki",
- "en/on-call/integration/alert-integration/alert-sources/monit",
- "en/on-call/integration/alert-integration/alert-sources/rum-alert",
- "en/on-call/integration/alert-integration/alert-sources/harbor",
+ "en/on-call/integration/alert-integration/alert-sources/stackrox",
+ "en/on-call/integration/alert-integration/alert-sources/statuscake",
+ "en/on-call/integration/alert-integration/alert-sources/statusgator",
+ "en/on-call/integration/alert-integration/alert-sources/statuspage",
+ "en/on-call/integration/alert-integration/alert-sources/statuspal",
+ "en/on-call/integration/alert-integration/alert-sources/stripe",
+ "en/on-call/integration/alert-integration/alert-sources/sublime",
+ "en/on-call/integration/alert-integration/alert-sources/sumo-logic",
+ "en/on-call/integration/alert-integration/alert-sources/suricata",
+ "en/on-call/integration/alert-integration/alert-sources/sysdig",
+ "en/on-call/integration/alert-integration/alert-sources/tactical-rmm",
+ "en/on-call/integration/alert-integration/alert-sources/tailscale",
+ "en/on-call/integration/alert-integration/alert-sources/tencent-cls",
+ "en/on-call/integration/alert-integration/alert-sources/tencent-cm",
+ "en/on-call/integration/alert-integration/alert-sources/tencent-css",
+ "en/on-call/integration/alert-integration/alert-sources/tencent-eventbridge",
+ "en/on-call/integration/alert-integration/alert-sources/thinkst-canary",
+ "en/on-call/integration/alert-integration/alert-sources/thousandeyes",
+ "en/on-call/integration/alert-integration/alert-sources/tideways",
+ "en/on-call/integration/alert-integration/alert-sources/tracee",
+ "en/on-call/integration/alert-integration/alert-sources/trigger-dev",
+ "en/on-call/integration/alert-integration/alert-sources/trivy-operator",
+ "en/on-call/integration/alert-integration/alert-sources/twilio",
+ "en/on-call/integration/alert-integration/alert-sources/twingate",
"en/on-call/integration/alert-integration/alert-sources/ucloud-cloudwatch",
- "en/on-call/integration/alert-integration/alert-sources/jdcloud",
- "en/on-call/integration/alert-integration/alert-sources/kscloud-monitor",
- "en/on-call/integration/alert-integration/alert-sources/volcengine-rtc",
+ "en/on-call/integration/alert-integration/alert-sources/updown",
+ "en/on-call/integration/alert-integration/alert-sources/upguard",
+ "en/on-call/integration/alert-integration/alert-sources/uptime-com",
+ "en/on-call/integration/alert-integration/alert-sources/uptime-kuma",
+ "en/on-call/integration/alert-integration/alert-sources/uptimeobserver",
+ "en/on-call/integration/alert-integration/alert-sources/uptimerobot",
+ "en/on-call/integration/alert-integration/alert-sources/uptimia",
+ "en/on-call/integration/alert-integration/alert-sources/uptrends",
+ "en/on-call/integration/alert-integration/alert-sources/veeam-one",
+ "en/on-call/integration/alert-integration/alert-sources/veeam-service-provider-console",
+ "en/on-call/integration/alert-integration/alert-sources/veracode-sca",
+ "en/on-call/integration/alert-integration/alert-sources/vigil",
+ "en/on-call/integration/alert-integration/alert-sources/volcengine-cm-event",
+ "en/on-call/integration/alert-integration/alert-sources/volcengine-cm-metrics",
"en/on-call/integration/alert-integration/alert-sources/volcengine-dial",
- "en/on-call/integration/alert-integration/alert-sources/nagios",
- "en/on-call/integration/alert-integration/alert-sources/emqx",
- "en/on-call/integration/alert-integration/alert-sources/rizhiyi",
- "en/on-call/integration/alert-integration/alert-sources/dingtalk-alert",
- "en/on-call/integration/alert-integration/alert-sources/lark-alert",
+ "en/on-call/integration/alert-integration/alert-sources/volcengine-rtc",
+ "en/on-call/integration/alert-integration/alert-sources/volcengine-tls",
+ "en/on-call/integration/alert-integration/alert-sources/wazuh",
"en/on-call/integration/alert-integration/alert-sources/wecom-alert",
- "en/on-call/integration/alert-integration/alert-sources/ghost-inspector",
- "en/on-call/integration/alert-integration/alert-sources/monte-carlo",
- "en/on-call/integration/alert-integration/alert-sources/limacharlie"
+ "en/on-call/integration/alert-integration/alert-sources/whatap",
+ "en/on-call/integration/alert-integration/alert-sources/whatsup-gold",
+ "en/on-call/integration/alert-integration/alert-sources/wormly",
+ "en/on-call/integration/alert-integration/alert-sources/xitoring",
+ "en/on-call/integration/alert-integration/alert-sources/zabbix",
+ "en/on-call/integration/alert-integration/alert-sources/zeek",
+ "en/on-call/integration/alert-integration/alert-sources/zenoss",
+ "en/on-call/integration/alert-integration/alert-sources/zilliz",
+ "en/on-call/integration/alert-integration/alert-sources/zstack"
]
},
{
"group": "Change Integration",
"pages": [
+ "en/on-call/integration/change-integration/apollo",
+ "en/on-call/integration/change-integration/argo-rollouts",
+ "en/on-call/integration/change-integration/argocd",
+ "en/on-call/integration/change-integration/awx",
+ "en/on-call/integration/change-integration/azure-devops",
+ "en/on-call/integration/change-integration/bitbucket",
+ "en/on-call/integration/change-integration/buildkite",
+ "en/on-call/integration/change-integration/circleci",
+ "en/on-call/integration/change-integration/coolify",
"en/on-call/integration/change-integration/custom-event",
- "en/on-call/integration/change-integration/heroku",
- "en/on-call/integration/change-integration/teamcity",
- "en/on-call/integration/change-integration/railway",
+ "en/on-call/integration/change-integration/env0",
+ "en/on-call/integration/change-integration/expo-eas",
+ "en/on-call/integration/change-integration/flagsmith",
+ "en/on-call/integration/change-integration/fluxcd",
+ "en/on-call/integration/change-integration/gitea",
+ "en/on-call/integration/change-integration/gitee",
"en/on-call/integration/change-integration/github",
"en/on-call/integration/change-integration/gitlab",
+ "en/on-call/integration/change-integration/growthbook",
+ "en/on-call/integration/change-integration/harness-fme",
"en/on-call/integration/change-integration/hcp-terraform",
- "en/on-call/integration/change-integration/argocd",
- "en/on-call/integration/change-integration/netlify",
- "en/on-call/integration/change-integration/vercel",
+ "en/on-call/integration/change-integration/heroku",
+ "en/on-call/integration/change-integration/jenkins",
"en/on-call/integration/change-integration/jfrog-artifactory",
- "en/on-call/integration/change-integration/buildkite",
+ "en/on-call/integration/change-integration/jira",
"en/on-call/integration/change-integration/launchdarkly",
- "en/on-call/integration/change-integration/jenkins",
- "en/on-call/integration/change-integration/circleci",
- "en/on-call/integration/change-integration/bitbucket",
- "en/on-call/integration/change-integration/unleash",
- "en/on-call/integration/change-integration/gitea",
- "en/on-call/integration/change-integration/rundeck",
- "en/on-call/integration/change-integration/flagsmith",
- "en/on-call/integration/change-integration/azure-devops",
- "en/on-call/integration/change-integration/argo-rollouts",
+ "en/on-call/integration/change-integration/nautobot",
+ "en/on-call/integration/change-integration/netbox",
+ "en/on-call/integration/change-integration/netlify",
"en/on-call/integration/change-integration/octopus-deploy",
- "en/on-call/integration/change-integration/awx",
- "en/on-call/integration/change-integration/semaphore",
- "en/on-call/integration/change-integration/coolify",
- "en/on-call/integration/change-integration/scalr",
- "en/on-call/integration/change-integration/growthbook",
- "en/on-call/integration/change-integration/fluxcd",
"en/on-call/integration/change-integration/pulumi",
- "en/on-call/integration/change-integration/env0",
- "en/on-call/integration/change-integration/expo-eas",
- "en/on-call/integration/change-integration/harness-fme",
- "en/on-call/integration/change-integration/gitee",
+ "en/on-call/integration/change-integration/railway",
+ "en/on-call/integration/change-integration/rundeck",
+ "en/on-call/integration/change-integration/scalr",
+ "en/on-call/integration/change-integration/semaphore",
+ "en/on-call/integration/change-integration/teamcity",
+ "en/on-call/integration/change-integration/unleash",
+ "en/on-call/integration/change-integration/vercel",
"en/on-call/integration/change-integration/yunxiao-appstack",
- "en/on-call/integration/change-integration/zadig",
- "en/on-call/integration/change-integration/netbox",
- "en/on-call/integration/change-integration/nautobot",
- "en/on-call/integration/change-integration/apollo",
- "en/on-call/integration/change-integration/jira"
+ "en/on-call/integration/change-integration/zadig"
]
},
{
@@ -5394,9 +5424,9 @@
{
"group": "Error Reporting",
"pages": [
- "en/rum/error-tracking/erro-reporting/web",
- "en/rum/error-tracking/erro-reporting/android",
- "en/rum/error-tracking/erro-reporting/ios"
+ "en/rum/error-tracking/error-reporting/web",
+ "en/rum/error-tracking/error-reporting/android",
+ "en/rum/error-tracking/error-reporting/ios"
]
},
"en/rum/error-tracking/error-viewing",
@@ -5547,7 +5577,7 @@
"en/openapi/introduction",
"en/openapi/api-catalog",
"en/openapi/pagination",
- "en/openapi/go-sdk"
+ "en/openapi/rate-limits"
]
},
{
diff --git a/en/ai-sre.mdx b/en/ai-sre.mdx
index ebcb0d72..9a0a31cf 100644
--- a/en/ai-sre.mdx
+++ b/en/ai-sre.mdx
@@ -51,16 +51,7 @@ It is not a question-and-answer chatbot but a **hands-on troubleshooter**, integ
## Activation and billing
-AI SRE is available to accounts on an On-call Pro or higher subscription, with no application needed.
-
-
-
- AI SRE is billed on actual usage starting September 16, 2026, 08:00 Beijing time, settled in credits (1 credit = ¥1); usage before that date isn't charged. Metered items are model usage, sandbox online time, and web search. Activation is free, eligible accounts get gift credits each billing period, and you can also buy credit packages (1,000 / 5,000 / 20,000 credits for ¥950 / ¥4,500 / ¥17,000, valid 365 days from payment). Pay-as-you-go is off by default; an admin can turn it on and optionally set a per-period cap. Full terms: [AI SRE Credit Package Purchase Agreement](/en/compliance/ai-sre-credit-package-purchase-agreement).
-
-
- Production changes, restarts, rollbacks, and external notifications all require your confirmation before they execute.
-
-
+AI SRE must be activated in the console and is billed on actual usage in credits. Production changes, restarts, rollbacks, and external notifications all require your confirmation before they execute. For activation, billing rules, and subscription requirements, see [Activation and billing](/en/ai-sre/overview#activation-and-billing).
## Get Started
diff --git a/en/ai-sre/agents.mdx b/en/ai-sre/agents.mdx
index 42a3d889..387106be 100644
--- a/en/ai-sre/agents.mdx
+++ b/en/ai-sre/agents.mdx
@@ -5,14 +5,10 @@ keywords: ["AI SRE", "Agent", "A2A", "Agent-to-Agent", "Agent Card", "delegation
sidebarTitle: Agent
---
-
- AI SRE is available to accounts on an On-call Pro or higher subscription, with no application needed. Starting September 16, 2026, 08:00 Beijing time, it must be activated in the console before use and is billed on actual usage; see [billing terms](/en/compliance/ai-sre-credit-package-purchase-agreement).
-
+> AI SRE must be activated in the console, is available on On-call Pro or higher, and is billed on actual usage. See [Activation and billing](/en/ai-sre/overview#activation-and-billing).
## Overview
----
-
**Agent** is the resource category that connects AI SRE to external agent ecosystems. The currently supported type is **A2A (Agent-to-Agent)** — a standard protocol that lets different agents call one another (more agent types may be added later). A2A works in two directions:
@@ -24,55 +20,22 @@ sidebarTitle: Agent
-Delegation does not make you wait: after AI SRE hands a task to a remote agent, the conversation continues immediately, so you can keep working or delegate several tasks at once. When the remote agent finishes, its result appears in the conversation as a new message. Each A2A delegation appears in the conversation stream as a **task card** carrying an `A2A` badge, showing the remote agent name, task intent, run status (initializing / in progress / awaiting input / awaiting authorization / completed / failed (including orphaned) / interrupted / killed), and usage metrics such as tool call count, tokens, and elapsed time. Click the card to view the full delegation trace in the right-hand panel.
+Delegation does not make you wait: after AI SRE hands a task to a remote agent, the conversation continues immediately, so you can keep working or delegate several tasks at once. When the remote agent finishes, its result appears in the conversation as a new message.
+
+Each A2A delegation appears in the conversation stream as a **task card** carrying an `A2A` badge, showing the remote agent name, task intent, run status (initializing / in progress / awaiting input / awaiting authorization / completed / failed (including orphaned) / interrupted / killed), and usage metrics such as tool call count, tokens, and elapsed time. Click the card to view the full delegation trace in the right-hand panel.
-**Instructions have two levels and act as the agent-selection signal.** Before delegating, AI SRE sees a list of available agents where each entry is just `name: summary` — the summary comes from a `summary:` line at the top of the instructions (if omitted, the beginning of the body is excerpted automatically). AI SRE uses it to decide **whether and when** to delegate to this agent, so state clearly when to prefer it, what it excels at, and what it is not suited for. The body that follows the summary is not kept in the list — it is delivered to AI SRE in full only the **first time it delegates to this agent**, so you can write it as long and detailed as needed (procedures, hard rules, examples) without slowing down everyday conversations. See "[Writing Instructions](#writing-instructions)" below for the format.
+**The instructions decide whether AI SRE picks this agent.** Before delegating, AI SRE sees only one `name: summary` line per agent (the summary comes from the `summary:` line at the top of the instructions) and uses it to decide whether to delegate. The body is delivered in full only on the first delegation, so it can be long and detailed. See [Writing Instructions](#writing-instructions).
-The A2A agent list and management entry point are on the **Customize → Plugins → Agents** page (menu tab labeled **Agents**).
+The A2A agent list and management entry point are on the **Customize → Plugins → Agents** page.
-**Agents covers two distinct concepts.** This page (Agents) currently manages **A2A Agents** (external agent-to-agent calls). The other concept is the **Subagent** — a platform-built-in task executor that AI SRE dispatches on demand within a session. Subagents have no create / edit entry point; you only observe their behavior in sessions. See "[Subagent](#subagent)" below.
-
-
-## Subagent
-
----
-
-A **Subagent** is a platform **built-in** task executor. During an investigation, AI SRE can **dispatch** a self-contained subtask to a Subagent that completes it independently — dispatch always goes through the single long-running tool `agent_dispatch`, rather than exposing a separate tool per Subagent.
-
-The platform ships several **bootstrap Subagents** that work out of the box:
-
-| Name | Role |
-| --- | --- |
-| `general` | General-purpose worker with full tool access. Use it to offload work whose intermediate steps would otherwise pollute the parent's context (long reports, multi-file edits, end-to-end builds, repeated probing). Dispatch several in parallel for independent units of work |
-| `explore` | Read-only investigator restricted to `grep` / `glob` / `read`; it cannot write or execute. Returns a compact summary rather than raw search output — ideal for locating evidence inside a codebase or knowledge dump |
-
-**In the conversation**: each dispatch also appears as a **task card** in the conversation stream and shares the same status lifecycle as an A2A delegation (initializing / in progress / awaiting input / awaiting authorization / completed / failed (including orphaned) / interrupted / killed). The difference is the badge — a Subagent task card carries an `Agent` badge, whereas an A2A delegation carries an `A2A` badge. A Subagent card's reference line also leads its right-hand side with the **execution environment this dispatch runs in** (the cloud environment, or the BYOC Runner's name), so you can see where a subtask executed straight from the card — see "Dispatch target environment" below.
-
-**Runtime limits**:
-
-- **Concurrency cap**: a session runs **at most 20 Subagents concurrently** (`TaskMaxConcurrentPerSession = 20`). This caps how many run at the same instant, not how many a session dispatches over its lifetime — completing one frees a slot, so total work is unbounded. Dispatching past the cap errors (`too many active subagents (… running, limit 20)`), prompting the model to stop and wait for the running ones to finish before dispatching the rest.
-- **Nesting depth**: a dispatch chain nests **at most 3 levels deep** (`TaskMaxNestingDepth = 3`), preventing a Subagent from spawning itself indefinitely.
-
-**Dispatch target environment**: `agent_dispatch` also takes an optional `environment` argument that decides **which execution environment** the subtask runs in. Its values are:
-
-- **Omitted (the default)**: the subagent runs in the **same** environment as the current session and **shares its filesystem** — it can read your workspace's files directly. Naming the environment the session is *already* in (say, passing `cloud` from a cloud session) has the same result: an inheritance, not a second sandbox.
-- **`cloud`**: runs in a **fresh cloud environment** — an ephemeral container with its own filesystem and the account's default egress policy.
-- **A BYOC Runner's environment_id**: runs on **that Runner**. The selectable targets are **account-scope Runners** plus the Runners of the **team the session is bound to**, and online ones only; same-named Runners are tagged with their team so they can be told apart. `agent_dispatch`'s own description lists them, and each Runner's id is the value to pass. Naming an unusable Runner (offline, nonexistent, or belonging to another team) makes the dispatch fail outright with the reason — it is never silently re-routed elsewhere.
-- **Subagents only**: passing `environment` for an A2A Agent is rejected — a remote agent executes in its own environment and has no placement to choose; to move work to another environment, dispatch a Subagent.
-
-**A cross-environment dispatch cannot read the parent's files**: a child session shares the parent's sandbox / workspace only when its execution environment is **exactly the same**; dispatched to another environment, it gets **its own** sandbox or Runner scratch directory and **cannot see your (the parent's) files**. So put everything it needs **in the prompt** (file contents, paths, parameters, constraints) instead of writing "read file x in the workspace", and expect results back as **text** or through an external system (git, a ticket). See [Environments (BYOC)](/en/ai-sre/environments) for how the environments themselves differ and how to pick one.
-
-
-**Subagents currently have no user-facing create / management UI.** They are a built-in runtime capability: you can observe Subagent task cards and their sub-session traces within a session, but you cannot add, edit, or delete a Subagent the way you can an A2A Agent. This page (Agents) currently manages only A2A Agents.
+**Agents covers two distinct concepts.** This page (Agents) currently manages **A2A Agents** (external agent-to-agent calls). The other concept is the **Subagent** — a platform-built-in task executor that AI SRE dispatches on demand within a session. Subagents have no create / edit entry point; you only observe their behavior in sessions. See [Subagent](#subagent) below.
## Registering an Outbound A2A Agent
----
-
On the A2A Agents list page, click **Add A2A Agent** and fill in the form:
| Field | Type | Default | Description |
@@ -80,11 +43,11 @@ On the A2A Agents list page, click **Add A2A Agent** and fill in the form:
| Name | string | — | A2A agent identifier (e.g., `metrics-analyzer`). Required |
| Scope | Shared / Team | — | Scope: **Shared** (i.e., account level — visible account-wide) or a specific **Team** (visible and editable only to members of that team). Required — see "Scope" below |
| Execution Environment | Cloud / BYOC Runners (multiple) | All environments | Controls where this A2A agent is available. Select Cloud and one or more visible BYOC Runners; leave empty to make it available everywhere. It does not route delegated calls: an A2A call still runs in the current AI SRE session's environment. For a remote agent available only on a private network, select only the Runner(s) that can reach it |
-| Instructions | string | — | The agent-selection signal shown to AI SRE, as **a single document**: an optional `summary:` frontmatter block plus a body. The summary appears in the available-agent list; the body is delivered in full only on first delegation. Required; the whole document is at most 50 KB, and `summary` is at most 1,024 characters and must not contain `<` or `>`. See "[Writing Instructions](#writing-instructions)" below for the format |
-| Card URL | string | — | The Agent Card URL of the remote A2A agent, or just the service origin for agents that follow the default well-known location (for example, `https://agents.example.com`). If the URL includes a path, the platform reads that exact URL; if only an origin is provided, it resolves `/.well-known/agent-card.json` by A2A convention. Required. The platform only validates that the URL is well-formed (scheme is http/https, host is non-empty) — it does not classify hosts or IPs; actual network reachability and egress restrictions depend on the current AI SRE session's execution environment. The Execution Environment field above only limits where this agent is available. The remote agent must implement A2A Protocol 1.0 — see "[Protocol Version and Agent Card Requirements](#protocol-version-and-agent-card-requirements)" below |
-| Service authorization | enum | `none` | The identity AI SRE uses when calling the remote agent **as a service** (field `auth_type`): `none` / `bearer` (Bearer Token) / `api_key` (custom Header + Key). Marked **Recommended** in the form. See "[Authorization Modes](#authorization-modes)" below |
+| Instructions | string | — | The agent-selection signal shown to AI SRE, as **a single document**: an optional `summary:` frontmatter block plus a body. The summary appears in the available-agent list; the body is delivered in full only on first delegation. Required; the whole document is at most 50 KB, and `summary` is at most 1,024 characters and must not contain `<` or `>`. See [Writing Instructions](#writing-instructions) below for the format |
+| Card URL | string | — | The Agent Card URL of the remote A2A agent, or just the service origin for agents that follow the default well-known location (for example, `https://agents.example.com`). If the URL includes a path, the platform reads that exact URL; if only an origin is provided, it resolves `/.well-known/agent-card.json` by A2A convention. Required; must be an http/https URL. Whether it is reachable depends on the execution environment of the session that delegates. The remote agent must implement A2A Protocol 1.0 — see [Protocol Version and Agent Card Requirements](#protocol-version-and-agent-card-requirements) below |
+| Service authorization | enum | `none` | The identity AI SRE uses when calling the remote agent **as a service** (field `auth_type`): `none` / `bearer` (Bearer Token) / `api_key` (custom Header + Key). Marked **Recommended** in the form. See [Authorization Modes](#authorization-modes) below |
| Streaming | bool | on | Whether to communicate with the remote agent in streaming mode |
-| Member authorization | enum | `shared` (none) | The identity each member holds individually (field `auth_mode`): `shared` (none) / `per_user_secret` (Secret (Header)) / `per_user_oauth` (OAuth 2.1). See "[Authorization Modes](#authorization-modes)" below |
+| Member authorization | enum | `shared` (none) | The identity each member holds individually (field `auth_mode`): `shared` (none) / `per_user_secret` (Secret (Header)) / `per_user_oauth` (OAuth 2.1). See [Authorization Modes](#authorization-modes) below |
| Skip TLS certificate verification | bool | off | Shown only when the Card URL uses HTTPS. Enable only when the remote endpoint uses a self-signed certificate inside a controlled network; this skips certificate-chain and hostname verification |
| Allow fetching OAuth configuration over HTTP (testing only) | bool | off | Required only when **Member authorization** is set to "OAuth 2.1" and the Card URL is a non-local HTTP URL. Use only in controlled test environments; after you enable it, the AI SRE service can fetch OAuth metadata from that host |
@@ -147,7 +110,7 @@ Body: detailed instructions for the agent…
- **Hard limits**: the whole document (frontmatter + body) is at most **50 KB**; `summary` is at most **1,024 characters** and must not contain `<` or `>`; the body must be non-empty.
- If the document starts with `---`, that frontmatter block must be closed with another `---` line, or saving fails.
-The instructions used by "[Using the FlashAI Template](#using-the-flashai-template)" below are a working example — see its structure for reference.
+The instructions used by [Using the FlashAI Template](#using-the-flashai-template) below are a working example — see its structure for reference.
### Using the FlashAI Template
@@ -194,7 +157,7 @@ After FlashAI is prepared, enter the **FlashAI domain** in the panel (for exampl
https://demo.flashcat.cloud/api/fc-model/a2a/.well-known/agent-card.json
```
-The template only prefills common values. You still choose the **Scope** (Shared or Team) and configure authentication in the form. A2A agents can be installed multiple times for different scopes, so the FlashAI panel does not disappear just because one FlashAI agent already exists. Agent names must still be unique within the account; if the same FlashAI domain needs to be installed more than once, adjust the name in the form.
+The template prefills only common values; you still set the **Scope** (Shared or Team) and authentication in the form. The same FlashAI can be installed several times for different scopes, but agent names must be unique within the account, so change the name when installing it again.
Do not remove the instructions generated by the FlashAI template, especially the `summary:` line at the top — once registered, FlashAI always appears in the available-agent list, but whether AI SRE actually delegates to it hinges directly on that summary line. When the instructions are too short or too generic, AI SRE may keep reasoning locally or incorrectly delegate ordinary metrics / logs questions to FlashAI.
@@ -223,7 +186,7 @@ The "Identity resolution order" panel at the bottom of the form updates live as
- **Service authorization only**: all calls use the service authorization.
- **Member authorization only**: IM group chats use the speaking member's own authorization, turn by turn. If the remote system rejects several identities taking turns within one conversation (its identity check fails), add a service authorization.
-- **Both axes set to none**: calls carry no identity. Saving prompts for confirmation — "This Agent will call without any identity. Save anyway?". Configure a service authorization when the remote endpoint requires authentication.
+- **Both axes set to none**: calls carry no identity. Saving asks for confirmation. Configure a service authorization when the remote endpoint requires authentication.
A service authorization means any team-scope session or IM group chat in the account can call the remote system as that service identity. If the system exposes members' personal data or allows high-risk writes, enable member authorization as well.
@@ -245,16 +208,51 @@ OAuth 2.1 appears only on the **member authorization** axis. The service authori
-For security reasons, saved sensitive fields (such as `token`, `api_key`, and `client_secret`) are returned **masked** when read. When editing, leaving a sensitive field blank means "keep the current value" — not "clear it." The stored credential is only overwritten when you explicitly change it.
+Saved sensitive fields (such as tokens, API keys and client secrets) are shown **masked**. Leaving one blank when editing keeps the current value rather than clearing it.
Use HTTPS for member authorization (OAuth 2.1) discovery whenever possible. Enable "Allow fetching OAuth configuration over HTTP (testing only)" for a non-local HTTP Card URL only in controlled test environments. If an HTTPS endpoint uses a self-signed certificate, enable "Skip TLS certificate verification" only temporarily and only inside a trusted network.
-## Inbound: Letting External Agents Call AI SRE
+## Creating and Managing
----
+The full lifecycle of A2A agents is managed on the **Customize → Plugins → Agents** page.
+
+
+
+ Click **Add A2A Agent**, fill in the name, scope, instructions, Card URL, auth settings, and save. You must select a definite scope (shared or team) before submitting — the submit button remains disabled until a scope is chosen.
+
+
+ Use the toggle in the list to switch an A2A agent's enabled state. Only **enabled** agents appear in AI SRE's available-agent list and can receive delegated tasks; disabling one makes it immediately invisible to delegation.
+
+
+ Click any row in the list to open the form, where you can view and edit the name, instructions, scope, Card URL, service authorization, member authorization, and streaming. The form is **read-only** when you do not have edit permission.
+
+
+ Remove an A2A agent from the current scope. **Active sessions that delegated to it will fail.** Deletion requires confirmation.
+
+
+ Filter the list by scope (All / Shared / a specific team) or search by keywords in the name, instructions, or Card URL. Each row shows its scope (shared / team name).
+
+
+
+## Scope
+
+A2A agents share the same **two-level scope** model as other resources (skills, Knowledge, MCP, environments), divided into account level and team level. In the console UI, the account-level option is labeled "**Shared**" / "**Shared scope**" — synonymous with account level (visible account-wide):
+
+| Scope | Visibility |
+| --- | --- |
+| Account level | Visible to all members in the account |
+| Team level | Visible only to members of that team |
+
+**Edit permissions**: team-level agents can be acted on only by members of that team — organization admins must join the team first; account-level agents can be acted on only by the account owner or account admin; there is no creator-retains-rights exception. When you do not have edit permission, the corresponding row in the list is **read-only**.
+
+**Create and reassign**: to create a new team-level agent, you must belong to the target team; account-level creation is limited to the account owner or admins. When editing an existing agent, the account owner or admins can move it to any team to recover resources left behind by empty teams or departed members; regular members can move it only to teams they belong to.
+
+**Runtime visibility**: at session start, AI SRE's available-agent list shows only **account-level** resources plus resources belonging to the **team bound to the current session** (e.g., the team carried in by an incident / war room, or explicitly selected in the UI). A team's skills, MCP servers, and A2A agents are only mounted into the current session on demand after the agent reads that team's knowledge during an investigation. **The account is the only security perimeter at runtime; team is simply an ownership and editing tag.**
+
+## Inbound: Letting External Agents Call AI SRE
Expand the "**Let External Agents Call Flashduty's AI SRE**" panel at the top of the A2A Agents page to get the **Agent Card** URL for this account's AI SRE:
@@ -281,56 +279,40 @@ The Agent Card also declares Flashduty's "run options" A2A extension: callers ca
When a session **enters via an incident route** (e.g., AI SRE is triggered from an incident or war room), the platform binds the corresponding incident to the session and brings it in as context, anchoring troubleshooting to the correct incident from the start. Based on this, AI SRE can use built-in skills during the conversation to further act on the incident — reading incident details, querying the timeline, creating / viewing war rooms, linking changes, and more. For automatic war-room diagnosis on the IM side, see [IM Integration](/en/ai-sre/im).
-**Automatic incident integration** for A2A is currently supported conceptually and is under active development: automatic incident binding is not yet fully available, and bidirectional event streams across agents will be progressively completed with each release. Do not treat this as a fully available capability; rely only on features that have been explicitly enabled.
+**Automatic incident integration** for A2A is still under development: automatic incident binding is not yet fully available, and bidirectional event streams across agents will be completed over upcoming releases. Rely only on features that are actually enabled.
-## Creating and Managing
-
----
+## Subagent
-The full lifecycle of A2A agents is managed on the **Customize → Plugins → Agents** page.
+A **Subagent** is a platform **built-in** task executor. During an investigation, AI SRE can **dispatch** a self-contained subtask to a Subagent that completes it independently (via the `agent_dispatch` tool).
-
-
- Click **Add A2A Agent**, fill in the name, scope, instructions, Card URL, auth settings, and save. You must select a definite scope (shared or team) before submitting — the submit button remains disabled until a scope is chosen.
-
-
- Use the toggle in the list to switch an A2A agent's enabled state. Only **enabled** agents appear in AI SRE's available-agent list and can receive delegated tasks; disabling one makes it immediately invisible to delegation.
-
-
- Click any row in the list to open the form, where you can view and edit the name, instructions, scope, Card URL, service authorization, member authorization, and streaming. The form is **read-only** when you do not have edit permission.
-
-
- Remove an A2A agent from the current scope. **Active sessions that delegated to it will fail.** Deletion requires confirmation.
-
-
- The scope filter bar at the top of the list lets you switch between "All", "Shared", and "Specific team", making it easy to focus on relevant resources when managing many. Each row also has a label showing its scope (shared / team name). The search box to the right of the filter bar filters the list by keywords in the name, instructions, or Card URL.
-
-
+The platform ships several **bootstrap Subagents** that work out of the box:
-## Scope
+| Name | Role |
+| --- | --- |
+| `general` | General-purpose worker with full tool access. Use it to offload work whose intermediate steps would otherwise pollute the parent's context (long reports, multi-file edits, end-to-end builds, repeated probing). Dispatch several in parallel for independent units of work |
+| `explore` | Read-only investigator restricted to `grep` / `glob` / `read`; it cannot write or execute. Returns a compact summary rather than raw search output — ideal for locating evidence inside a codebase or knowledge dump |
----
+**In the conversation**: each dispatch also appears as a **task card** in the conversation stream with the same statuses as an A2A delegation, but with an `Agent` badge (A2A delegations show `A2A`). The card also shows the **execution environment** of the dispatch (the cloud environment or the BYOC Runner's name) — see "Dispatch target environment" below.
-A2A agents share the same **two-level scope** model as other resources (skills, Knowledge, MCP, environments), divided into account level and team level. In the console UI, the account-level option is labeled "**Shared**" / "**Shared scope**" — synonymous with account level (visible account-wide):
+**Runtime limits**:
-| Scope | Visibility |
-| --- | --- |
-| Account level | Visible to all members in the account |
-| Team level | Visible only to members of that team |
+- **Concurrency cap**: a session runs **at most 20 Subagents at the same time**. Total dispatches are unlimited — each completion frees a slot; at the cap, AI SRE waits for running ones to finish before dispatching the rest.
+- **Nesting depth**: a dispatch chain nests **at most 3 levels deep**, preventing a Subagent from spawning itself indefinitely.
-**Edit permissions**: team-level agents can be acted on only by members of that team — organization admins must join the team first; account-level agents can be acted on only by the account owner or account admin; there is no creator-retains-rights exception. When you do not have edit permission, the corresponding row in the list is **read-only**.
+**Dispatch target environment**: `agent_dispatch` also takes an optional `environment` argument that decides **which execution environment** the subtask runs in. Its values are:
-**Create and reassign**: to create a new team-level agent, you must belong to the target team; account-level creation is limited to the account owner or admins. When editing an existing agent, the account owner or admins can move it to any team to recover resources left behind by empty teams or departed members; regular members can move it only to teams they belong to.
+- **Omitted (the default)**: the subagent runs in the **same** environment as the current session and **shares its filesystem** — it can read your workspace's files directly. Naming the environment the session is *already* in (say, passing `cloud` from a cloud session) has the same result: an inheritance, not a second sandbox.
+- **`cloud`**: runs in a **fresh cloud environment** — an ephemeral container with its own filesystem and the account's default egress policy.
+- **A BYOC Runner's environment_id**: runs on **that Runner**. The selectable targets are **account-scope Runners** plus the Runners of the **team the session is bound to**, and online ones only; naming an unusable Runner (offline, nonexistent, or belonging to another team) makes the dispatch fail with the reason; it is never re-routed elsewhere.
+- **Subagents only**: passing `environment` for an A2A Agent is rejected — a remote agent executes in its own environment and has no placement to choose; to move work to another environment, dispatch a Subagent.
-**Runtime visibility**: at session start, AI SRE's available-agent list shows only **account-level** resources plus resources belonging to the **team bound to the current session** (e.g., the team carried in by an incident / war room, or explicitly selected in the UI). A team's skills, MCP servers, and A2A agents are only mounted into the current session on demand after the agent reads that team's knowledge during an investigation. **The account is the only security perimeter at runtime; team is simply an ownership and editing tag.**
+**A cross-environment dispatch cannot read the parent's files**: a child session shares the parent's sandbox / workspace only when its execution environment is **exactly the same**; dispatched to another environment, it gets **its own** sandbox or Runner scratch directory and **cannot see your (the parent's) files**. So put everything it needs **in the prompt** (file contents, paths, parameters, constraints) instead of writing "read file x in the workspace", and expect results back as **text** or through an external system (git, a ticket). See [Environments (BYOC)](/en/ai-sre/environments) for how the environments themselves differ and how to pick one.
## Related Pages
----
-
-
+
Observe A2A delegation task cards and their sub-session panels within a session.
diff --git a/en/ai-sre/apps.mdx b/en/ai-sre/apps.mdx
index 1049e34e..00d00c48 100644
--- a/en/ai-sre/apps.mdx
+++ b/en/ai-sre/apps.mdx
@@ -5,22 +5,16 @@ keywords: ["AI SRE", "Apps", "App", "GitHub", "GitHub App", "GitLab", "GitLab Ap
sidebarTitle: Apps
---
-
- AI SRE is available to accounts on an On-call Pro or higher subscription, with no application needed. Starting September 16, 2026, 08:00 Beijing time, it must be activated in the console before use and is billed on actual usage; see [billing terms](/en/compliance/ai-sre-credit-package-purchase-agreement).
-
+> AI SRE must be activated in the console, is available on On-call Pro or higher, and is billed on actual usage. See [Activation and billing](/en/ai-sre/overview#activation-and-billing).
## Overview
----
-
**Apps** is where you manage **authorized external applications**. Each external application appears as a **card** — you authorize it, manage its installations, and enable / disable or revoke it right from its card.
Apps includes **GitHub**, **GitLab**, and **Kubernetes Apps**. GitHub and GitLab authorize access to code repositories: AI SRE can read code, investigate changes / commits / PRs (MRs on GitLab), and, when asked, fix a bug or open a PR / MR or issue. A Kubernetes App connects a selected Kubernetes cluster to AI SRE and limits the agent to the configured namespaces and permission level.
## Main Scenario: Letting the Cloud Sandbox Reach Your Repositories
----
-
AI SRE sessions run in a **Flashduty cloud sandbox** by default. The sandbox is a clean, isolated, ephemeral environment that **carries none of your git credentials** — which is exactly what an App solves. Once you authorize the GitHub App or the GitLab App, the agent inside the sandbox can clone your repositories, read diffs, and open PRs / MRs, **without you handing it any password or token**; its access is limited to the repositories you granted, with only the least privilege needed to do the work. **This is what both Apps are mainly for.**
@@ -33,8 +27,6 @@ A RUM application can also record the repositories that build it (several may be
## Where to Find It
----
-
Go to **AI SRE → Customize → Plugins → Apps**. The Plugins group in the Customize sidebar lists Overview / Apps / Skill / MCP / Agents in that order, and clicking **Customize** opens **Overview** by default.
@@ -43,8 +35,6 @@ Viewing the Apps page requires the appropriate permission; without it, the entry
## Kubernetes Apps
----
-
A Kubernetes App connects an in-cluster agent to AI SRE. After installation, AI SRE can query cluster information and use the available Kubernetes tools within the namespaces and permission boundaries you configure.
### Create and install
@@ -87,7 +77,7 @@ Operations that differ between levels:
| Modify RBAC within the namespace | No | No | Yes |
| Operate cluster-scoped resources and cluster RBAC | No | No | All namespaces only |
-- **Read-only**: read access within the authorized namespaces is bound directly to Kubernetes' built-in `view` role — FlashDuty no longer maintains its own resource list. It covers Pods, logs, workloads, events, ConfigMaps, and similar resources, but never Secrets; CRDs that cluster components mark as view-readable are included as well. It also grants read-only access to cluster-level nodes, namespaces, persistentvolumes, storageclasses, and ingressclasses.
+- **Read-only**: read access within the authorized namespaces is bound directly to Kubernetes' built-in `view` role — Flashduty no longer maintains its own resource list. It covers Pods, logs, workloads, events, ConfigMaps, and similar resources, but never Secrets; CRDs that cluster components mark as view-readable are included as well. It also grants read-only access to cluster-level nodes, namespaces, persistentvolumes, storageclasses, and ingressclasses.
- **Read + limited modifications**: on top of read-only, this level may evict Pods (`pods/eviction`), scale Deployments and StatefulSets (`deployments/scale`, `statefulsets/scale`), and adjust HPA replica bounds (`horizontalpodautoscalers`). These rules can only change how many replicas a workload runs and rebuild Pods from the same configuration — they cannot change any Pod's image, startup command, environment variables, identity, or mounts. As a result, `kubectl rollout restart` and `kubectl rollout undo` are both denied (in Kubernetes both are patches to the workload); restart a workload by evicting its Pods one at a time. For rollbacks, AI SRE derives the target revision from the ReplicaSet history and gives you the complete `kubectl rollout undo --to-revision=N` command to run in your cluster.
- **Full access**: can read Secrets, modify ConfigMaps and Secrets, modify workload configurations, create or delete resources, and modify RBAC within the namespace; **All namespaces + Full access** additionally grants `cluster-admin` via a `ClusterRoleBinding`, covering cluster-scoped resources and cluster RBAC.
@@ -97,39 +87,31 @@ You can edit the cluster name, scope, and namespace access from the Kubernetes A
## The GitHub App
----
-
The following walks through **GitHub** first — authorization, installation management, and adjusting repository access; **GitLab** follows in the next section.
### Connecting a GitHub Organization
-Start the authorization from the GitHub card. The whole install completes in a popup through GitHub's official install page, and the list refreshes automatically after the callback.
+Authorization happens on GitHub's official install page, opened in a popup.
- Click **Authorize** on the GitHub card (if the App already has an installation, the button reads **More repositories**, with a + icon). The frontend opens a popup that loads GitHub's official install page.
+ Click **Authorize** on the GitHub card (**More repositories** if the App is already installed) and continue on the GitHub install page that pops up.
Choose the **organization** (or personal account) to install into, and grant a repository scope — **All repositories** or **Only select repositories**. The set of granted repositories determines which repositories AI SRE can access afterward.
- After you confirm on GitHub, the popup closes automatically, the Apps page shows **Authorized** and refreshes the installation list, and the new organization appears.
+ After you confirm on GitHub, the popup closes and the new organization appears in the installation list.
-If you are not the owner of the organization, GitHub routes the request to the organization owner through its request-to-install approval flow; the installation activates only after approval. Which organization to install into and which repositories to grant are decided entirely on GitHub's install page — Flashduty does not select on your behalf.
+If you are not an owner of the organization, GitHub sends the request to the organization owner for approval; the installation takes effect once approved.
### Managing Installations
-Each authorized organization adds one installation row under the GitHub card. Each row shows:
-
-| Element | Description |
-|---|---|
-| Organization name | The GitHub organization / account login the installation lives on |
-| Status dot | A colored dot plus a label: **Connected**, **Suspended**, **Revoked** |
-| Repository count | The number of repositories currently granted to this installation |
+Each authorized organization adds a row under the GitHub card, showing the organization name, status (**Connected**, **Suspended**, **Revoked**) and the number of repositories granted.
@@ -154,9 +136,7 @@ The organization is already connected, but you want AI SRE to reach more of its
## The GitLab App
----
-
-The **GitLab** App connects a GitLab instance — **GitLab.com**, **JihuLab** (GitLab's China distribution, SaaS at jihulab.com or a private deployment), or any other **self-managed** instance of your own. The connection method is **exactly the same for all of them**: register an OAuth application on that instance first, then authorize. Once authorized, AI SRE can read code and investigate changes / MRs, and — when you ask — file an issue or open an MR, in the repositories you authorized. Just like GitHub, **you never paste a personal token**: once Flashduty gets an OAuth grant, it provisions a dedicated bot identity for your account to do the actual work.
+The **GitLab** App connects **GitLab.com**, **JihuLab** (jihulab.com SaaS or a private deployment) or any other **self-managed** instance, the same way for all: register an OAuth application on the instance, then authorize. AI SRE can then read code and investigate changes / MRs in the authorized repositories, and file issues or open MRs when you ask. As with GitHub, **you never paste a personal token**; Flashduty provisions a dedicated bot identity for your account.
### Connecting a GitLab Instance
@@ -174,10 +154,9 @@ The **GitLab** App connects a GitLab instance — **GitLab.com**, **JihuLab** (G
The connect wizard shows a **copyable Redirect URI**. Take it to the GitLab instance you entered and create an OAuth application: a group **Owner** does this under **Group Settings → Applications**; on **GitLab.com**, if you're not the Owner of any group, a user-owned application under **User Settings → Applications** also works; an instance admin can also register one under **Admin Area → Applications**. Fill in the Redirect URI the wizard gave you, check **Confidential**, and check only the **api** scope. GitLab then issues an **Application ID** and a **Secret** — paste both back into the wizard.
- This step is the same for **every** GitLab instance — GitLab.com, JihuLab (jihulab.com SaaS or a private deployment), or any other self-managed instance: only the address changes, registering the OAuth application and pasting the Application ID / Secret works identically everywhere.
- This step shows which instance and which OAuth application it's about to authorize with; if you want to use a different application, click **Change OAuth application** to go back and register a different one. Once you confirm, the wizard opens a popup that loads GitLab's official authorization page; sign in with your GitLab account and confirm. The popup closes automatically once authorization completes, and the wizard advances to the next step.
+ Confirm the instance and OAuth application to use (click **Change OAuth application** to switch), then sign in and confirm on the GitLab authorization page that pops up.
AI SRE shows a repository picker listing the **groups where you have the Owner role** and the **projects where you have the Maintainer role**. Select the groups / projects you want AI SRE to access and save — selecting a group covers all of its projects, including ones created later.
@@ -192,7 +171,7 @@ An account can connect **only one** GitLab instance at a time (GitLab.com or one
After you save the repository selection, Flashduty provisions a dedicated bot for the account inside those groups / projects (a service account where the instance supports it, falling back to a group- or project-level access token otherwise) for AI SRE sessions to use. Either way, the bot's permissions are capped at **Developer** level — the same minimum access you'd grant it in GitLab yourself. Tokens are **rotated automatically** before they expire; there's nothing for you to manage.
-If the instance doesn't support service accounts, the bot falls back to a group- or project-level token — and a token like that can only ever bind to a single group or project, so the repository picker limits you to selecting at most **one** group or project. If you select multiple groups / projects while in multi-select mode and save, Flashduty shows "This GitLab instance doesn't support service accounts; select only one group or project and retry," and switches the picker to **single-select mode**: checking a new group or project after that automatically clears any other selection, so you need to leave just one group or project checked before saving again.
+If the instance does not support service accounts, the bot uses a group- or project-level token instead, and you can select only **one** group or project.
**One restriction on GitLab.com**: GitLab's own policy limits group- and project-level access tokens to **paid (non-free, non-trial) namespaces**. Connecting GitLab.com itself is unaffected, but if the group / project you authorize lives in a free or trial namespace, bot provisioning fails and the UI shows GitLab's own explanation ("provisioning_denied"). Upgrade that namespace to a paid plan and re-authorize to resolve it.
@@ -213,8 +192,6 @@ The GitLab card shows the connected instance's address and status.
## How AI SRE Works Inside a Repository
----
-
After authorization, you need no extra configuration. When you ask AI SRE to work on a task in a repository during a session, it works like an engineer joining the project — understand first, then change, then verify. This behavior is governed by the built-in `github` Skill and `gitlab` Skill respectively.
**Typical actions**
@@ -235,21 +212,17 @@ If the agent reports it cannot access a repository in a cloud session, it usuall
## Permissions & Scope
----
-
-**Authorize** and **revoke / disconnect** are **account-level** operations for both the GitHub App and the GitLab App. **The account is the only security boundary**; the team here is just an ownership / audit tag: any account member with the corresponding permission can authorize, revoke / disconnect, or enable / disable the whole App; when a session needs a repository, it obtains access from the account's currently active installation. Members of an account share one authorization — consistent with AI SRE's "usage = account-level, ownership = team tag" model for other resources.
+Authorizing and revoking / disconnecting the GitHub App and GitLab App are **account-level** operations: any member with the relevant permission can do them, members share one authorization, and sessions access repositories through the account's currently active installation. Teams are only an ownership tag; **the account is the only security boundary**.
The two Apps' scope models differ slightly: the **GitHub App** lets the same account install multiple organizations, each enabled / revoked independently; the **GitLab App** lets an account connect **only one** GitLab instance **at a time** — switching to a different instance requires disconnecting the current one first.
## Related Pages
----
-
Connect external tools and data sources via the Model Context Protocol.
-
+
Watch the agent clone a repo, read a diff, and open a PR / MR during a session.
diff --git a/en/ai-sre/artifacts.mdx b/en/ai-sre/artifacts.mdx
index 0b732859..336d6b36 100644
--- a/en/ai-sre/artifacts.mdx
+++ b/en/ai-sre/artifacts.mdx
@@ -5,152 +5,92 @@ keywords: ["AI SRE", "Artifacts", "present_files", "publish_artifact", "insight
sidebarTitle: Artifacts
---
-
- AI SRE is available to accounts on an On-call Pro or higher subscription, with no application needed. Starting September 16, 2026, 08:00 Beijing time, it must be activated in the console before use and is billed on actual usage; see [billing terms](/en/compliance/ai-sre-credit-package-purchase-agreement).
-
+> AI SRE must be activated in the console, is available on On-call Pro or higher, and is billed on actual usage. See [Activation and billing](/en/ai-sre/overview#activation-and-billing).
## Overview
----
-
An artifact is a file AI SRE produces in a session with the `present_files` tool and then publishes to the artifact gallery. There are two publish paths, and they accept different types:
- **The agent's `publish_artifact` tool**: publishes HTML / Markdown documents only (`.html` `.htm` `.md` `.markdown`) — a self-contained report or page, most typically the operational insight report generated by typing `/insight` in a session. Every other type is rejected with `unsupported_format`.
- **The "Publish to artifact gallery" button next to a `present_files` file in the console** (see [Creating an artifact](#creating-an-artifact) below): publishes the wider set of types:
-| Category | Common extensions |
-|---|---|
-| Web pages & documents | `.html` `.htm` `.md` `.markdown` `.txt` `.log` |
-| Data & config | `.csv` `.tsv` `.json` `.yaml` `.yml` `.xml` `.toml` `.ini` |
-| Images | `.png` `.jpg` `.jpeg` `.gif` `.svg` `.webp` |
-| PDF | `.pdf` |
-| Source code | `.py` `.go` `.js` `.mjs` `.ts` `.jsx` `.tsx` `.java` `.c` `.h` `.cpp` `.cs` `.rb` `.rs` `.php` `.sh` `.sql` `.kt` `.swift` `.scala` `.css` `.vue` `.svelte` `.proto` `.tf` `.hcl`, and more |
-| Archives | `.zip` `.tar` `.gz` `.tgz` |
+
+
+ | Category | Common extensions |
+ |---|---|
+ | Web pages & documents | `.html` `.htm` `.md` `.markdown` `.txt` `.log` |
+ | Data & config | `.csv` `.tsv` `.json` `.yaml` `.yml` `.xml` `.toml` `.ini` |
+ | Images | `.png` `.jpg` `.jpeg` `.gif` `.svg` `.webp` |
+ | PDF | `.pdf` |
+ | Source code | `.py` `.go` `.js` `.mjs` `.ts` `.jsx` `.tsx` `.java` `.c` `.h` `.cpp` `.cs` `.rb` `.rs` `.php` `.sh` `.sql` `.kt` `.swift` `.scala` `.css` `.vue` `.svelte` `.proto` `.tf` `.hcl`, and more |
+ | Archives | `.zip` `.tar` `.gz` `.tgz` |
+
+
Files outside the table above don't show a "Publish to artifact gallery" button in the session.
A published artifact initially inherits its source session's scope: artifacts from a personal session belong to their creator ("Personal"); artifacts from a session bound to a team belong to that team and can be shared with other account members. Users with edit permission can change the scope later.
-Entry point: **AI SRE → Artifacts** in the left navigation, route `/ai-sre/artifacts`.
+Entry point: **AI SRE → Artifacts** in the left navigation.
-The artifact gallery has no entry point for manually uploading or creating files — every artifact is produced and published by the agent using tools during a session. The console only lets you browse, search, and manage artifacts that already exist.
+You can't upload files to the artifact gallery directly: every artifact is produced and published by the agent in a session, and **New artifact** also takes you to a session to do this. The gallery is for browsing, searching, and managing published artifacts.
## List Page
----
-
-### Search and scope filter
-
-- **Search box**: fuzzy-search published artifacts by title; the query fires automatically 300ms after you stop typing.
-- **Scope**: a three-way **All / Personal / Team** switch (the same two-level scope shared with the other resources under AI SRE). Selecting "Team" expands a searchable, multi-select team picker; selecting no team means "all teams visible to me."
-
-### View toggle and sorting
+- **Search and filter**: search by title; filter by scope (**All / Personal / Team**). Choosing "Team" lets you pick specific teams; picking none means all teams visible to you.
+- **Views**: switch between card view (default) and list view at the top right; your choice is saved in the browser. List view shows the name, scope (team name, or the creator for personal artifacts), source conversation (click to jump; "Conversation deleted" if it no longer exists), created and updated times, a pin button, and actions.
+- **Sorting**: sort by created or updated time; the default is **updated time, newest first**. Whatever the sort, the artifacts you pinned always come first (most recently pinned first).
+- **Paging**: 12 / 24 / 48 per page, 24 by default.
+- **Shareable URL**: scope, search term, sorting, and page are kept in the page URL, so copying it shares or bookmarks the filtered list, and returning from a detail page lands you where you were.
-The top-right of the list page offers a **Card view / List view** toggle; your choice is persisted in the browser (card view is the default).
-
-**List view** presents artifacts in a table with these columns:
-
-| Column | Description |
-|---|---|
-| Name | Artifact title; click to open the detail page |
-| Scope | Team name for team artifacts, creator name for personal artifacts |
-| From conversation | Title of the source conversation; click to jump to it. Shows plain text "Conversation deleted" when the source conversation was deleted or has no title |
-| Created at | Artifact creation time |
-| Updated at | Artifact last-updated time |
-| Pin | An icon-only button (the column has no header); click it to pin or unpin the artifact for yourself — see [Pinning](#pinning) below |
-| Actions | Rename, download, delete, etc. |
-
-The **Created at** and **Updated at** columns support header sorting (ascending / descending toggle); sorting is executed server-side, with **Updated at descending** as the default.
-
-Whichever sort you pick, **the artifacts you pinned always come first** (most recently pinned first), and the chosen sort orders the rest.
-
-Scope, search term, sorting, page number, and page size are all reflected in the page URL (for example `?scope=team&teams=1,2&q=rebuild&page=2&size=48`), so copying the address shares or bookmarks a **filtered** list; returning from an artifact's detail page also lands back on the same filters and position instead of resetting to the default view.
-
-Page size can be **12 / 24 / 48**, defaulting to **24** (the URL's `?size=`; a value equal to the default is not written to the address). If the address is hand-edited to some other number, the nearest option is used rather than the literal value.
-
-### Artifact cards
-
-Each card shows:
-
-- A preview area rendering a **thumbnail of the artifact's own content**: HTML takes the head of the file (up to 256 KiB) and scales a desktop page laid out at 1200×630 into the box, Markdown is typeset onto that same scaled page, images show the image itself, and plain text shows its first 24 lines (up to 1400 characters). PDF and every other non-renderable kind show an empty frame. The thumbnail is a non-interactive still image — it renders inside a `sandbox=''` frame, so scripts don't run and links and buttons don't respond. It is also lazy: nothing is signed or downloaded until the card comes near the viewport (about 400px), and an empty skeleton frame shows until then;
-- The kind icon: determined by file extension and content type — images, PDF, HTML, Markdown, tables (CSV / TSV), JSON, archives, and source code each get a dedicated icon, falling back to a generic file icon when the type can't be recognized. It is a 30×30 badge straddling the divider between thumbnail and body, rather than filling the preview area;
-- The title (single line, truncated beyond that; hover to see the full title);
-- A single **Edited …** relative timestamp in the grey caption line under the title (the artifact's last update time; for an artifact never updated after creation, the update time is its creation time) — just now / N minutes ago / N hours ago / N days ago. Relative time is used at any age: an older artifact still shows "Nd ago" instead of falling back to a concrete date. Hover the timestamp for the exact time down to the minute, and note that the **Created at** / **Updated at** columns of the list view give exact times directly;
-- The same caption line also carries the scope (a small icon plus a name: team artifacts show the team name, personal artifacts show the creator's name) — cards no longer use coloured scope badges; badges appear only in the list view and on the detail page. When the artifact has a live public link, the caption line leads with a small globe glyph that has a tooltip; a pinned artifact shows a pin glyph at the end of the caption line.
-
-Clicking the card body opens the artifact's detail page. Hovering over a card reveals a "More actions" button in the top-right corner (always visible on touch devices), with an equally hover-only pin button beside it — one click pins or unpins. The public-link preview inside the share panel uses this same thumbnail.
+Cards show a content thumbnail (a static preview for HTML, Markdown, images, and plain text; an empty frame for PDFs and other types), a type icon, the title, the edited time (hover for the exact time), the scope, and whether a public link is on and whether it is pinned.
### Pinning
-Every list row and every card has a pin button — on a card it sits in the top-right corner next to "More actions" and appears on hover (always visible on touch devices); in the list it is a fixed-width column of its own, between "Updated at" and the action buttons. The first item in the "More actions" menu is the same toggle, labelled "Pin" or "Unpin" according to the current state.
-
-Pinning is **a personal preference, not an edit**:
+Click the pin button on a row or card, or choose **Pin** / **Unpin** from the **More actions** menu.
-- You can pin any artifact you can see — other people's personal artifacts and team artifacts included — with **no edit permission required** (rename, change scope, and delete do require it);
-- A pin only floats the artifact to the top of **your own** gallery. It does not change the artifact's content, title, or scope, and it does not affect the order anyone else sees;
-- Pinning and unpinning are both idempotent: re-pinning only refreshes the pin time (a later pin time sorts higher), and unpinning an artifact that was never pinned does not fail;
-- Pinning refetches the whole page. The server owns the ordering, so pinning an artifact on page 2 moves it to page 1 rather than reordering in place.
-
-The `pinned_at` field on a gallery list item is **the calling person's own** pin time (unix milliseconds); it is absent when the artifact is not pinned — so the same artifact can carry a different `pinned_at` for each member.
+Pinning is **your personal preference, not an edit**: you can pin any artifact you can see (including other people's personal artifacts and team artifacts) with **no edit permission**. It only floats the artifact to the top of your own gallery; it doesn't change the artifact or the order anyone else sees. Pinning an artifact on page 2 moves it to page 1.
### Creating an artifact
-Click **New artifact** in the upper-right corner of the page to jump to the chat page with a prefilled draft prompt:
-
-> I want to build a publishable Artifact in Flashduty AI-SRE: a self-contained web page or report, published to the artifact gallery when done. Ask me a few focused questions about the audience, content/data, interactions, and visual style, then build it and publish it.
-
-The agent first asks you about the target audience, content/data source, interactions, and visual style, then builds and publishes the artifact — there is no form to fill out directly.
+Click **New artifact** at the top right to open a chat with a prefilled draft prompt. The agent first asks about the target audience, content/data source, interactions, and visual style, then builds and publishes the artifact — there is no form to fill out.
-Separately, any file shown in a session with `present_files` also has a "Publish to artifact gallery" button next to it, letting you publish a file that session already produced directly as an artifact — a more direct path than "New artifact" when you don't need a fresh conversation.
+If a session has already produced the file, click "Publish to artifact gallery" next to it instead — it's faster than starting a new conversation.
## Card Actions
----
-
The "More actions" menu on each card offers:
| Action | Notes |
|---|---|
-| Pin / Unpin | The menu's first item, labelled "Pin" (when not pinned) or "Unpin". Pinning is a **personal preference** and skips the edit-permission check entirely — you can pin any artifact you can see, and it only changes the order of your own list without modifying the artifact (see [Pinning](#pinning) above) |
-| Copy link | Copies the full URL of the artifact's detail page, which you can share with other account members |
-| Download | Only appears when the artifact is linked to a file (`file_id` is non-empty); downloads the original file |
-| Rename | Only appears when you have edit permission on the artifact; opens a dialog to change the title |
-| Change scope | Only appears when you have edit permission; choose Personal or an accessible team. Only the artifact creator can change the scope to Personal |
-| Delete | Only appears when you have edit permission on the artifact; requires confirmation. Deleting removes the artifact from the gallery, but the source session and underlying file are unaffected |
+| Pin / Unpin | Changes only your own list order; no edit permission needed. See [Pinning](#pinning) |
+| Copy link | Copies the link to the artifact's detail page to share with other account members |
+| Download | Shown when the artifact has a linked file; downloads the original file |
+| Rename | Requires edit permission |
+| Change scope | Requires edit permission; choose Personal or an accessible team. Only the creator can change it back to Personal |
+| Delete | Requires edit permission and confirmation. Removes the artifact from the gallery only; the source session and the file itself are kept |
## Detail Page
----
-
-The detail page route is `/ai-sre/artifacts/:artifactId`. The top toolbar offers:
-
-- **Title**: if you have edit permission, click the title to edit it inline (no separate form) — press Enter to save, Esc to cancel;
-- **Creator**: shown below the title as "Artifact by [creator]";
-- **Share**: opens the share panel, where you can choose between "Account only" and "Public link" visibility — see [Share an artifact](#share-an-artifact) below;
-- **Delete**: shown only when you have edit permission; requires confirmation;
-- **More actions**: this menu appears only when at least one of the following is available —
- - **Download**: shown when the artifact is linked to a file.
- - **Change scope**: shown when you have edit permission. You can move the artifact to an accessible team; the creator can also change it back to Personal.
+The top of the detail page offers:
-Below the title there is a **source-session strip**:
+- **Title**: with edit permission, click the title to edit it — Enter saves, Esc cancels. The creator is shown below the title;
+- **Share**: choose "Account only" or "Public link" — see [Share an artifact](#share-an-artifact) below;
+- **Delete** and **Change scope** (edit permission required) and **Download** (when there is a linked file);
+- **Source session**: the edited time and "Recently updated from session 〈session name〉", which opens the source session's full conversation. It is hidden if the session was deleted or you lack access; the artifact itself stays viewable.
-- It shows the artifact's own **"Edited …"** relative timestamp (like the list cards; hover it for the exact time down to the minute);
-- When you still have access to the artifact's source session, the strip also shows a **"Recently updated from session 〈session name〉"** button — the session name is resolved from the source session via `/safari/session/get`, and clicking it opens that session's full conversation (`chat?session_id=`, messages, tool calls, artifact history). If the source session was deleted or you no longer have access, the button is hidden and the artifact itself remains fully viewable.
-
-The body renders the artifact according to its actual content type (for example, an HTML report renders inline as a page).
+The body renders according to the artifact's content type (for example, an HTML report renders inline as a page).
-On a phone the detail page degrades to a **read-only reader**: the title is no longer editable inline, the share, change-scope, and delete entries are all hidden, and the toolbar drops the back-to-list button, the file-kind icon, the scope badge, the public-link badge, the "Edited …" time, and the "Recently updated from session" entry, keeping only the title and the artifact body. When the artifact is linked to a file, **Download** remains available under "More actions". The list page and card view are unaffected.
+On a phone, the detail page is a **read-only reader**: only the title and body are shown, with no editing, sharing, scope changes, or deletion. When the artifact has a linked file, **Download** is still available under "More actions".
## Share an artifact
----
-
The **Share** button in the detail page toolbar opens the share panel. **Manage permission** at the top lists who can manage sharing for this artifact (the creator is labeled "Owner"; team artifacts also list team members). **Visibility** below offers two modes:
| Mode | Who can open it | Content |
@@ -168,13 +108,13 @@ After you choose **Public link**, the panel first shows a content preview and a
Once you generate a public link, anyone who gets the link can view this artifact, and the link can be forwarded further. Don't share secrets, personal information, or unauthorized third-party content.
-On success, the link is copied to your clipboard automatically (a "Public link generated and copied to clipboard" toast appears). The public link takes the form `https:///share/artifact/` — it's identified by the artifact's own ID and carries no token; anonymous access is served entirely by the CDN, without going through any endpoint that requires sign-in.
+The link is copied to your clipboard automatically. Public links take the form `https:///share/artifact/`; they contain no token, so anyone with the link can open it.
On private deployments, public links require the instance to be configured with a reachable share static-asset base (CDN). When it is not configured, the share panel does not offer the **Public link** option and only "Account only" sharing is available; public links generated earlier remain manageable and revocable. SaaS is not affected by this restriction.
-Visitors who open a public link see a read-only content page: next to the title, the top of the page carries the disclaimer "**Content is user-generated and unverified.**" and a "**Feedback**" entry — clicking it opens a report form (pre-filled with the current link) so anyone can report inappropriate content to Flashduty. The page also provides a "Sign in" entry that leads visitors to the console.
+Visitors see a read-only page marked "Content is user-generated and unverified." next to the title, with **Feedback** (to report inappropriate content) and **Sign in** entries.
| Action | Description |
|---|---|
@@ -188,50 +128,43 @@ Artifacts larger than **16 MiB** can't generate a public link — you'll see a n
## Update a published artifact
----
+Publishing the same file again does **not** silently overwrite a published artifact. When the agent updates an artifact, it must say which artifact it is updating and which version it based the change on. If someone changed the artifact in the meantime, the agent reads the currently published content and merges before retrying, instead of overwriting it. The link and artifact ID stay the same after an update.
-Republishing the same file does **not** silently overwrite a published artifact. When the agent updates one with `publish_artifact`, it must pass both the artifact's `artifact_id` and the `if_revision` returned by the previous publication (an opaque revision fingerprint shaped like `rev_…`):
+A few more details:
-| Case | Result envelope | Outcome |
-|---|---|---|
-| `artifact_id` and `if_revision` both match | `status: published`, with an `operation` (`created` / `updated` / `unchanged`) and a new `revision` | The artifact is updated in place (an `unchanged` operation means the content did not change); the link and artifact ID stay the same |
-| Only a file path was given (no `artifact_id`) and the content differs from the published version | `status: needs_review`, `reason: explicit_artifact_id_required` | Nothing is published |
-| `artifact_id` was given but `if_revision` was not | `status: needs_review`, `reason: revision_required` | Nothing is published |
-| `if_revision` does not match the current revision (the artifact changed after you got the revision) | `status: needs_review`, `reason: revision_conflict` | Nothing is published |
+- If the content hasn't changed, the artifact is left alone.
+- Showing the same file again in a session does **not** update the published artifact; ask the agent to publish again.
+- The agent will not revive a deleted artifact by republishing it; only clicking "Publish to artifact gallery" next to the file in a session restores a deleted artifact.
-On `needs_review`, the agent also writes a copy of the **currently published content** into the session workspace along with the current `revision`; it reads that copy, merges deliberately, and retries with the same `artifact_id` and the new `revision` instead of overwriting blindly.
+
+When the agent updates an artifact with `publish_artifact`, it must pass both the `artifact_id` and the `if_revision` returned by the previous publication (a revision fingerprint shaped like `rev_…`):
-A few more details:
+| Case | Result envelope | Outcome |
+|---|---|---|
+| `artifact_id` and `if_revision` both match | `status: published`, with an `operation` (`created` / `updated` / `unchanged`) and a new `revision` | Updated in place |
+| Only a file path was given, and the content differs from the published version | `status: needs_review`, `reason: explicit_artifact_id_required` | Nothing published |
+| `artifact_id` given without `if_revision` | `status: needs_review`, `reason: revision_required` | Nothing published |
+| `if_revision` doesn't match the current revision | `status: needs_review`, `reason: revision_conflict` | Nothing published |
-- When the content is byte-identical to the published version, the result is `operation: unchanged` and the artifact is left alone.
-- Re-presenting the same file with `present_files` does **not** update a published artifact — it only offers preview and download; publishing an update goes through `publish_artifact`.
-- If the artifact was deleted, a path-based republish fails with `artifact_deleted` instead of reviving it; only the "Publish to artifact gallery" button next to the `present_files` file in a session restores a deleted artifact.
-- Failures come back with a code: `unsupported_format` / `permission_denied` / `artifact_deleted` / `storage_unavailable` / `file_too_large` / `invalid_path`, of which `storage_unavailable` is retryable. When the commit cannot be confirmed the tool returns `status: unknown` with an `op_…` operation ID, and the agent does not create a second artifact.
+On `needs_review`, a copy of the currently published content and the current `revision` are written to the session workspace. Failures return a code: `unsupported_format` / `permission_denied` / `artifact_deleted` / `storage_unavailable` (retryable) / `file_too_large` / `invalid_path`. When the commit can't be confirmed, the tool returns `status: unknown` with an `op_…` operation ID, and the agent does not create a second artifact.
+
## Permissions
----
-
-Whether an artifact is editable (rename, change scope, delete) is determined by the `can_edit` field returned by the backend. Any one of the following grants management access:
+Any one of the following lets you rename, change the scope of, or delete an artifact:
| Condition | Notes |
|---|---|
| Creator | The owner of the session the artifact was published from |
-| Account Owner / admin | Has management access to any artifact in the account, personal or team scope |
-| Team member (team artifacts only) | When an artifact belongs to a team (`team_id > 0`), other members of that team can also manage it |
+| Account Owner / admin | Any artifact in the account, including other members' personal artifacts (unlike automation rules) |
+| Team member | Members of the team that owns a team artifact |
-Artifacts you cannot edit only expose read-only actions such as "Pin", "Copy link", and "Download" — the "Rename" and "Delete" buttons do not appear. **Pinning is not part of that check**: it is a personal preference rather than an edit, so you can pin any artifact you can see (other members' personal artifacts included), and it only changes your own list order, affecting nobody else.
-
-
-This differs from the automation rule permission model: the account Owner / admins have management access to **any** artifact, including other members' personal artifacts — there is no "no exemption for personal resources" restriction here.
-
+Without edit permission you can only pin, copy the link, and download.
## Related Pages
----
-
-
+
Learn how sessions surface files with the present_files tool — the source of every published artifact.
diff --git a/en/ai-sre/automations.mdx b/en/ai-sre/automations.mdx
index 47339646..3dd98052 100644
--- a/en/ai-sre/automations.mdx
+++ b/en/ai-sre/automations.mdx
@@ -5,14 +5,10 @@ keywords: ["AI SRE", "Automation", "inspection", "scheduled task", "cron", "HTTP
sidebarTitle: Automations
---
-
- AI SRE is available to accounts on an On-call Pro or higher subscription, with no application needed. Starting September 16, 2026, 08:00 Beijing time, it must be activated in the console before use and is billed on actual usage; see [billing terms](/en/compliance/ai-sre-credit-package-purchase-agreement).
-
+> AI SRE must be activated in the console, is available on On-call Pro or higher, and is billed on actual usage. See [Activation and billing](/en/ai-sre/overview#activation-and-billing).
## Overview
----
-
An automation lets AI SRE run a **hidden session** on a cadence you set. The session does not appear in the session list in the left sidebar of the console; instead it runs in the background, driven by a fixed **task prompt**, to have the agent complete its work and produce results such as routine inspections, operational insights, or incident post-mortems.
Each automation is a **rule**. A rule carries at least one trigger:
@@ -31,16 +27,14 @@ Every run produced by an automation is, at its core, still an AI SRE session —
## Creating an Automation
----
-
-The page header offers two creation entry points: an outline-style **Create via chat** button that jumps to the chat page with a prefilled prompt — "Let's create an automation task. First explain how automation tasks work. Then ask me questions to figure out what task I need to schedule and when it should run." — letting the agent work out the task content and trigger through conversation, skipping the form; and a primary-style **Create** button that opens a start panel with two entry points:
+The page header offers two ways to create: **Create via chat** opens a session with a prefilled prompt, where the agent asks questions to work out the task and when it should run, with no form to fill in; **Create** opens a start panel with two entry points:
Choose **Start from scratch** to open a blank form and manually fill in the name, task prompt, and triggers. This suits cases where you already know what you want the agent to do and want a fully custom prompt.
- Below, a set of **preset template** cards is listed (delivered by the backend per UI language: `zh-CN` for Chinese, `en-US` for English). Common ones include **Weekly On-call Review**, **Alert Governance**, **On-call Incident Analysis**, and **On-call Load Analysis**. Click any template card to prefill the form with the template's name and task prompt; tweak from there.
+ Below, a set of **preset template** cards is listed (shown in Chinese or English to match the UI language). Common ones include **Weekly On-call Review**, **Alert Governance**, **On-call Incident Analysis**, and **On-call Load Analysis**. Click any template card to prefill the form with the template's name and task prompt; tweak from there.
@@ -48,26 +42,22 @@ Either entry point leads to the same configuration form.
## Configuration Fields
----
-
The configuration form has the following fields:
| Field | Required | Notes |
|---|---|---|
| Name | Yes | The rule name, up to 255 characters. Placeholder example: `Weekly on-call insights`. |
| Scope | Yes | Use the **scope selector** to choose **Personal** (`team_id=0`) or a **Team** (`team_id>0`). Scope determines both the rule's ownership and edit permissions, and constrains the self-hosted Runners selectable in **Environment** — only account-global Runners and Runners belonging to the same team as the scope are selectable. |
-| Environment | No | Use the **environment picker** to choose the runtime environment: **Auto** (the backend picks the best available environment, the default), **Cloud Sandbox**, or a **self-hosted (BYOC) Runner**. After picking a team scope, a team Runner that does not belong to that scope is cleared automatically. |
+| Environment | No | Use the **environment picker** to choose the runtime environment: **Auto** (the system picks the best available environment, the default), **Cloud Sandbox**, or a **self-hosted (BYOC) Runner**. After picking a team scope, a team Runner that does not belong to that scope is cleared automatically. |
| Task prompt | Yes | Describe the task for AI SRE to perform, written in a rich-text editor. This prompt is exactly what is sent to the agent on each run. Placeholder: `Describe the task for Flashduty AI SRE to perform.` |
| Time zone | No | A field on the **Schedule** trigger card (see "Schedule (cron)" below): the **rule time zone** the cron expression is read in. Pick an IANA zone name (for example `Asia/Shanghai`) from a searchable dropdown; the options are ordered by their UTC offset. On create it defaults to your effective time zone (member time zone first, falling back to the account time zone); when no zone is available the field is left empty and the create request omits it. |
-For **Environment**, "Auto" has the backend pick the best available environment at each run; "Cloud Sandbox" is a platform-managed ephemeral sandbox; a self-hosted Runner runs on your own machine. See Environments for the differences and how to connect them.
+For **Environment**, "Auto" has the system pick the best available environment at each run; "Cloud Sandbox" is a platform-managed ephemeral sandbox; a self-hosted Runner runs on your own machine. See Environments for the differences and how to connect them.
## Triggers
----
-
A rule must have **at least one trigger** configured. The current console form exposes **Schedule**, **Call via API**, and **On-call incident** in the "Triggers" section, and all three can be enabled at the same time.
### Schedule (cron)
@@ -97,7 +87,7 @@ To avoid hand-writing the expression, the UI offers four modes:
| Custom | Type a 4-field or 5-field cron expression directly |
-**Time zone**: a **Schedule** run is read against the cron's **rule time zone** — pick it from the **Time zone** dropdown on the trigger card. All four modes (**Hourly / Daily / Weekly / Custom**) share that one field; there is no split between "this mode uses your local zone, that one uses UTC". Saving stores the IANA zone you picked as-is, no longer converting the hour and minute to UTC, and the cadence summary no longer carries a time zone label beside it.
+**Time zone**: **Schedule** runs use the **Time zone** chosen on the trigger card; all four modes (**Hourly / Daily / Weekly / Custom**) share this setting.
@@ -164,7 +154,7 @@ Add the **On-call incident** trigger when you want AI SRE to start automatically
Select one or more severities from `Critical`, `Warning`, and `Info`. When this trigger is enabled, at least one channel and one severity are required.
- **Merge similar incidents into one analysis** is on by default: a new incident from this rule is first compared with the incidents being analysed now (or analysed within the last 10 minutes), and one scoring at least 0.9 joins that analysis instead of starting a session of its own; with it off, every incident is analysed separately. See "Merging similar incidents into one analysis" below.
+ **Merge similar incidents into one analysis** is on by default: a new incident that is similar enough to one already being analysed joins that analysis instead of starting its own session; with it off, every incident is analysed separately. See [Merging similar incidents into one analysis](#merging-similar-incidents-into-one-analysis) for the rules.
@@ -204,15 +194,13 @@ The similarity comparison depends on the account's AIOps capability and on a Pro
## Run History
----
-
-Every rule keeps its run history. Clicking anywhere on the rule row (there is no dedicated history icon) opens the rule's detail page at `/ai-sre/automations/:ruleId`: the left column shows "Configuration" and the right column shows "Run History", side by side. The right column has its own **Run now** button at the top, so you can trigger a run directly from the detail page.
+Every rule keeps its run history. Click a rule row to open its detail page (`/ai-sre/automations/:ruleId`): the left column shows **Configuration** and the right column shows **Run History**; the **Run now** button at the top of the right column triggers a run directly.
Run history is shown as a table with these columns:
| Column | Notes |
|---|---|
-| Name | The hidden session behind this run. The backend batch-resolves each run's session title (`session_name`, the hidden session's auto-generated name); when it can't be resolved, the cell falls back to the session ID (`session_id`). A run merged into another analysis (see "Merging similar incidents into one analysis" above) has no session of its own, so this column shows the incident it is about (`#`) and names, on the line below, the analysis it joined |
+| Name | The title of the run's hidden session (`session_name`), or the session ID (`session_id`) if it can't be resolved. A run merged into another analysis has no session of its own, so this shows its incident (`#`) and, on the line below, the analysis it joined |
| Started at | The start time of the run |
| Duration | How long the run took |
| Triggers | The trigger type of the run, such as `Schedule`, `HTTP POST`, `On-call incident`, or `Run manually` |
@@ -239,32 +227,29 @@ Three filters are available above the table:
Run records returned by the API also include `trigger_kind`, which can be `schedule`, `manual`, `http_post`, `oncall_incident`, or `debug`. `manual` means the run was started through the run-now API, and `oncall_incident` means it was started by a matching On-call incident event. A run merged into another analysis carries no `session_id` of its own: it carries that analysis's session ID in `joined_session_id` and its session name in `joined_session_name`, and both being empty means the run has a hidden session of its own.
-Click a row to jump to the chat page of the hidden session for that run (`chat?session_id=`), where you can view the full messages, tool calls, and artifacts of that run. A run merged into another analysis has no session of its own, so clicking it opens the analysis that took over the incident.
+Click a row to jump to the chat page of the hidden session for that run, where you can view the full messages, tool calls, and artifacts of that run. A run merged into another analysis has no session of its own, so clicking it opens the analysis that took over the incident.
### The reason line on an unsuccessful run
-When a run's status is `failed`, `blocked`, `abandoned`, or `skipped`, the **Name** cell shows one extra line under the session name: the **reason** — clamped to one line, with the full text on hover. If the run has no session name to show, the reason takes the cell instead. The reason line sometimes carries a link beside it, which opens in a new tab.
+When a run's status is `failed`, `blocked`, `abandoned` or `skipped`, the **Name** column shows the **reason** under the session name (hover for the full text). Common reasons:
-Reasons the platform itself decides on have fixed wording:
+| Reason (`error_code`) | What to do |
+|---|---|
+| AI SRE is not enabled, or this period's credits or balance are used up; the run did not execute (`BalanceNotEnough`) | Enable or top up on the AI SRE tab of **Payment → Plan** |
+| The On-call subscription has expired or its plan does not include AI SRE; AI SRE is paused (`NoLicense`) | Renew or upgrade on the On-call tab of **Payment → Plan** |
+| The run did not finish in time and was abandoned (`task_run_stale`) | — |
+| The run was interrupted (`interrupted`) | — |
+| The run ended without a final reply (`no_final_response`) | — |
+| Joined another analysis (`similar_incident_fan_in`) | Click the row to open the analysis that took over the incident |
-| `error_code` | Reason shown | Link |
-|---|---|---|
-| `BalanceNotEnough` | AI SRE is not enabled, or this period's credits or balance are used up. This run did not execute. | Go to AI SRE billing (`/wallet/plan?product=ai-sre`) |
-| `NoLicense` | The On-call subscription has expired or its plan does not include AI SRE. AI SRE is paused. | Go to On-Call subscription (`/wallet/plan?product=oncall`) |
-| `task_run_stale` | The run did not finish in time and was abandoned. | None |
-| `interrupted` | This run was interrupted. | None |
-| `no_final_response` | The run ended without a final reply. | None |
-| `similar_incident_fan_in` | Joined “``”; shows “another analysis” when the name cannot be resolved | None |
-| Any other `error_code` | The reason text recorded by the backend, shown as is; if there is none, the `error_code` itself | None |
+Other reasons show the text recorded by the system.
-Run history is embedded in the rule's detail page, and opening the detail page itself already requires edit permission on that rule — a rule you cannot edit cannot be opened at all (it shows "Automation rule not found or access denied"), so its run history is likewise unreachable.
+Run history is shown on the rule's detail page, so viewing it requires edit permission on the rule.
## Management and Permissions
----
-
### Enable / Disable, Edit, and Delete
Each rule offers a set of actions in the **Actions** column:
@@ -276,7 +261,7 @@ Each rule offers a set of actions in the **Actions** column:
Clicking anywhere on the rule row opens its detail page, where you can edit the configuration, delete the rule, and view its run history (see "Run History" above).
-For read-only rules you **cannot edit** (`can_edit=false`), the switch and all action buttons are disabled; opening its form shows "Read-only — you can view this automation but cannot edit it." at the top.
+Rules you **cannot edit** are view-only: you cannot toggle them or use their actions.
Above the list there are also two filters: **Scope** (All / Personal / Team, where selecting "Team" lets you multi-select specific teams) and **Status** (All statuses / Enabled / Disabled).
@@ -286,10 +271,10 @@ Automation rules share the same two-level scope model as the other resources und
| Dimension | Rule |
|---|---|
-| Ownership | **Personal rules** (`team_id=0`) belong to their creator; **team rules** (`team_id>0`) belong to that team. **Scope is fixed at creation and cannot be changed afterward**: when editing a rule, the scope selector is disabled with the hint "Scope can't be changed after creation. To use a different one, clone this automation and pick a new scope for the copy." To switch scopes, use the **Clone** button on the rule's detail page — cloning opens a prefilled create form where you pick the new scope for the copy before saving (the update API no longer accepts `team_id`, so the scope cannot be changed even by bypassing the UI). To create a team rule, the **operator themselves** must be a real member of the target team (join-to-govern); account Owners and admins have no exemption. A team rule does not stop with its creator: even after the creator has left the team, the team carries on running the rule. Only personal rules are disabled when their Owner is no longer an active account member — the system disables the rule automatically once a trigger attempt's preflight finds the Owner inactive. |
+| Ownership | **Personal rules** belong to their creator; **team rules** belong to that team. **Scope cannot be changed after creation**; to use a different scope, click **Clone** on the rule's detail page and pick a new scope for the copy. To create a team rule, the operator must be a member of that team; account Owners and admins are no exception. A team rule keeps running after its creator leaves the team; a personal rule is disabled automatically once its creator is no longer an active account member. |
| Visibility / list | The account Owner and admins see all rules; ordinary members see rules they created and rules of teams they belong to. |
| Edit / manage (team rules) | Only **current members** of the rule's owning team can act on the rule (enable / disable, edit, delete, run now); once the creator has left the team, they keep no standing privilege. The account Owner and admins have no exemption and must join the team first. |
-| Edit / manage (personal rules) | Only the creator can manage a personal rule. The account Owner and admins have **no** exemption for other members' personal rules — they cannot even view its detail page; opening one returns "access denied" outright, not just a grayed-out button. |
+| Edit / manage (personal rules) | Only the creator can view and manage a personal rule. Account Owners and admins cannot view or manage other members' personal rules. |
| HTTP POST trigger | When initiating a real run through the trigger URL, authorization is only the trigger's Bearer Token. Any external system holding that Token can trigger the rule, and the run creates a hidden session under the rule's personal or team scope. |
| On-call incident trigger | Started by a registered incident subscription, not by an HTTP POST Bearer token. The run still creates a hidden session under the rule's personal or team scope. |
@@ -303,10 +288,8 @@ The account is the only security perimeter at runtime; the team is an ownership
## Related Pages
----
-
-
+
Learn how a session holds one complete conversation — every run produced by an automation is, at its core, a hidden session.
diff --git a/en/ai-sre/context.mdx b/en/ai-sre/context.mdx
index aa475732..2356d3b0 100644
--- a/en/ai-sre/context.mdx
+++ b/en/ai-sre/context.mdx
@@ -2,17 +2,13 @@
title: Learn about Context
description: Context is the long-lived material AI SRE carries into troubleshooting. People maintain knowledge. The system organizes memory. The console gives each its own page under Customize → Context.
keywords: ["AI SRE", "context", "knowledge", "memory", "DUTY.md"]
-sidebarTitle: Learn about Context
+sidebarTitle: "Context"
---
-
- AI SRE is available to accounts on an On-call Pro or higher subscription, with no application needed. Starting September 16, 2026, 08:00 Beijing time, it must be activated in the console before use and is billed on actual usage; see [billing terms](/en/compliance/ai-sre-credit-package-purchase-agreement).
-
+> AI SRE must be activated in the console, is available on On-call Pro or higher, and is billed on actual usage. See [Activation and billing](/en/ai-sre/overview#activation-and-billing).
## What context is
----
-
Context is the material AI SRE can reuse across troubleshooting sessions. It has two parts, each with its own page under the **Context** group of the **AI SRE → Customize** sidebar.
- **[Knowledge](/en/ai-sre/knowledge)** is maintained by people. It describes how this environment runs: a guide named `DUTY.md`, plus runbooks, service lists, and similar files. A session reads the guide first and opens the other files when it needs them. Entry: **AI SRE → Customize → Context → Knowledge**.
@@ -22,8 +18,6 @@ Both pages have an input box at the bottom: write what to change, and the consol
## Three scopes
----
-
Both kinds of material are organized by scope, but they support different scopes.
| Scope | Memory | Knowledge |
@@ -36,8 +30,6 @@ Personal scope has no knowledge. Shared scope has no memory.
## Read next
----
-
How the guide, runbooks, and files are organized, and how the assistant reads them in a session.
diff --git a/en/ai-sre/environments.mdx b/en/ai-sre/environments.mdx
index b0b8904e..4ca1a5d0 100644
--- a/en/ai-sre/environments.mdx
+++ b/en/ai-sre/environments.mdx
@@ -5,14 +5,10 @@ keywords: ["AI SRE", "environment", "Environment", "Sandbox", "BYOC", "Runner",
sidebarTitle: Environments
---
-
- AI SRE is available to accounts on an On-call Pro or higher subscription, with no application needed. Starting September 16, 2026, 08:00 Beijing time, it must be activated in the console before use and is billed on actual usage; see [billing terms](/en/compliance/ai-sre-credit-package-purchase-agreement).
-
+> AI SRE must be activated in the console, is available on On-call Pro or higher, and is billed on actual usage. See [Activation and billing](/en/ai-sre/overview#activation-and-billing).
## Overview
----
-
An **Environment** is where AI SRE agents actually execute actions. Every tool call the agent makes, including running commands, reading and writing files, running Skills, and connecting to MCP services, happens inside an Environment.
AI SRE provides two types of Environments:
@@ -36,8 +32,6 @@ The console record is called an **Environment**. The process running on your mac
## Cloud sandbox
----
-
The cloud Sandbox is a temporary execution container managed by Flashduty. It is best for quick starts, demos, and investigations that do not need access to your private network. You do not install a process or maintain a machine.
Use the cloud Sandbox when:
@@ -55,8 +49,6 @@ For lifecycle, egress boundaries, and session-selection details, see [Sandbox](/
## Cloud environment templates
----
-
A cloud environment template is a reusable, predefined configuration for the Flashduty-managed cloud Sandbox: egress policy, environment variables, and a setup script. If a session's cloud Sandbox has no template bound, it starts with the system default configuration; once a template is bound, new Sandboxes start with that template's configuration.
Go to **AI SRE → Customize → Environments → Cloud** to view, create, edit, or delete cloud environment templates.
@@ -67,7 +59,7 @@ Go to **AI SRE → Customize → Environments → Cloud** to view, create, edit,
|---|---|---|
| Name | Yes | Must be unique within the account, up to 128 characters. |
| Scope | Yes | Shared-scope templates are visible to the whole account. Team-scoped templates are visible and editable only by that team. |
-| Network access | No, defaults to "Allow all" | The dropdown shows three options — "Default allowlist," "Custom (your domain list)," and "Allow all" — but currently only **"Allow all"** can be selected. "Default allowlist" and "Custom" are shown in the UI but disabled; this is a known limitation, not yet available. In other words, creating or editing a cloud environment template today always leaves the Sandbox it's bound to with fully open egress. |
+| Network access | No, defaults to "Allow all" | Only "Allow all" can be selected for now, so the Sandbox can reach any external address; "Default allowlist" and "Custom" are not yet available |
| Environment variables | No | `.env` format (`KEY=value`, one per line, multi-line quoted values supported), up to 32 KB, with a live byte counter in the UI. |
| Setup script | No | A Bash script, up to 64 KB, with a live byte counter in the UI. |
@@ -75,7 +67,7 @@ Go to **AI SRE → Customize → Environments → Cloud** to view, create, edit,
Environment variables are visible in plaintext to everyone who uses this cloud environment template — do not put secrets or credentials here.
-**Platform-reserved environment variable names.** Some names are injected by the platform itself into the session's runtime environment, and a template may not set them — a template that does is **rejected at save time** (the server is the single source of truth for this list; a hint list in the UI can lag behind it):
+**Platform-reserved environment variable names.** The platform injects the following variables; templates cannot set them, and saving a template that does is rejected:
| Reserved name | Notes |
|---|---|
@@ -83,9 +75,9 @@ Environment variables are visible in plaintext to everyone who uses this cloud e
| `FLASHDUTY_DOCS_URL` | The static address of the official docs bundle; the built-in `flashduty-docs` skill downloads its copy of the docs from here. |
| `GH_TOKEN`, the `GH_TOKEN_` prefix, `GH_PROMPT_DISABLED`, the `GIT_CONFIG_` prefix | The GitHub-side token and git configuration the platform injects (an account can have more than one GitHub App installation, so names such as `GH_TOKEN_1` and `GH_TOKEN_2` are reserved too). |
| `PATH` / `HOME` | The runtime environment's base variables. |
-| `GITLAB_TOKEN`, `GITLAB_ACCESS_TOKEN`, `OAUTH_TOKEN`, `GITLAB_HOST`, `GL_HOST`, `GITLAB_URI`, `GITLAB_API_HOST`, `GITLAB_SSH_HOST`, `GITLAB_SUBFOLDER`, `CA_CERT`, `SKIP_TLS_VERIFY`, the `GLAB_` prefix | GitLab / `glab` authentication, host and TLS configuration; letting a template override any one of these is the same as letting a session bypass the bot identity the platform injects and redirect `glab`'s transport. |
+| `GITLAB_TOKEN`, `GITLAB_ACCESS_TOKEN`, `OAUTH_TOKEN`, `GITLAB_HOST`, `GL_HOST`, `GITLAB_URI`, `GITLAB_API_HOST`, `GITLAB_SSH_HOST`, `GITLAB_SUBFOLDER`, `CA_CERT`, `SKIP_TLS_VERIFY`, the `GLAB_` prefix | GitLab / `glab` authentication, host and TLS configuration, so sessions cannot bypass the bot identity the platform injects. |
-The platform injects these names **before every command**; a same-named entry in the template is discarded and the platform's value wins (this holds identically on the cloud Sandbox and on a BYOC Runner). So use the template's environment variables for business-related, non-sensitive configuration only — when a secret is needed, use MCP member authorization or the relevant App integration.
+Even if a same-named variable is set some other way, the platform's value is used when commands run (on both the cloud Sandbox and BYOC Runners). Use template environment variables only for non-sensitive business configuration; for secrets, use MCP member authorization or the relevant App integration.
The setup script runs inside a **fresh sandbox (Ubuntu 24.04, running as root)**, **before the agent starts** — typically used to `apt install` packages the agent needs.
@@ -99,8 +91,6 @@ Cloud environment templates only configure egress, environment variables, and th
## BYOC Runner
----
-
A BYOC (Bring Your Own Compute) Runner is a `flashduty-runner` process that you deploy on your own machine. It keeps a persistent WebSocket connection to AI SRE. When it receives work, it runs commands, reads and writes files, executes Skills, and connects to MCP services that are reachable from that machine.
The value of BYOC Runner comes from where execution happens:
@@ -183,7 +173,7 @@ The setup guide automatically fills in the real `TOKEN` and `URL`. The examples
-Both `connect-url` and `install_script_url` are returned by the backend; the frontend does not hardcode them. Private or air-gapped deployments can replace the install-script distribution source with an internal mirror, but the mirror must serve `install.sh`, `releases/latest`, and `releases/download//...` release assets.
+Both `connect-url` and `install_script_url` are issued dynamically by the platform rather than being fixed addresses. Private or air-gapped deployments can replace the install-script distribution source with an internal mirror, but the mirror must serve `install.sh`, `releases/latest`, and `releases/download//...` release assets.
### Connect to a private endpoint with a self-signed certificate
@@ -295,8 +285,6 @@ Uninstall commands are also in the setup guide, and differ by installation metho
## Permission Configuration
----
-
By default, Runner uses an allow-all rule — the same trust model as running the AI model directly in your own shell:
```yaml
@@ -411,35 +399,31 @@ So the real file-access boundary is the **OS user** the Runner runs as, plus the
## Selecting an environment in a session
----
-
The environment selector at the bottom of the chat input decides where a new session executes:
| Option | Meaning |
|---|---|
| **Auto** | The default for new sessions. Tries an online BYOC Runner under the session's bound team, then an online Shared-scope (account-level) Runner, and falls back to the cloud Sandbox when neither is available. |
| **Cloud Sandbox · Default** | Forces the system-managed cloud Sandbox and ignores self-hosted Runners. |
-| **Self-hosted environment** | Lists Runners the current member can use. Offline, never-connected, or team-mismatched Runners cannot be selected; Runners in **Degraded** status **remain selectable**, and selecting one shows a "Degraded — you can continue, but responses may be slower" notice. |
+| **Self-hosted environment** | Runners you can use. Offline, never-connected or team-restricted Runners cannot be selected; **degraded** Runners can still be selected but may respond slowly. |
-Environment selection is locked once per session: the Environment determined when the session sends its first message is recorded and reused for all later turns. Changing the selector afterward does not change that session. To switch environments, start a new session.
+A session's environment is fixed when its first message is sent and does not change if you switch the selector later. To change environments, start a new session.
-When you open a historical session, the selector shows the Environment that session originally locked to, along with its current status, in read-only mode. If the bound Runner is offline or deleted, the session cannot continue sending messages; reconnect that Runner or start a new session and use the cloud Sandbox.
+When you open a past session, the selector shows its environment and status read-only. If the bound Runner is offline or deleted, the session cannot send messages; restore the Runner or start a new session.
### A child session's environment
A dispatched subagent brings its own **child session**, whose execution-environment rules differ from the root session's:
-- **It inherits the parent by default**: when `agent_dispatch` carries no `environment`, the child session **shares the parent's sandbox / workspace**, so it can read the parent's files directly — and the environment shown on the child session panel is therefore the same as the parent's.
-- **Only a cross-environment dispatch gets its own environment**: when the subtask is sent to another environment (via `agent_dispatch`'s `environment` argument — another BYOC Runner or the cloud environment, see [Agent](/en/ai-sre/agents)), the child session gets **its own** sandbox or Runner scratch directory and cannot read the parent's files.
-- **The child session panel offers no environment selector**: it only shows that child session's bound environment and its current status, in **read-only** form — the cloud environment, or the self-hosted Runner's name — reusing the same status vocabulary as the root session's read-only display (no extra marking while it is healthy; a short label and a hover explanation for offline / degraded / never connected / deleted).
+- **Shares the parent's environment by default**: the child session uses the same sandbox / workspace as the parent and can see its files.
+- **Gets its own environment when dispatched elsewhere**: when the subtask is sent to another BYOC Runner or the cloud environment (see [Agents](/en/ai-sre/agents)), the child session has its own sandbox or Runner directory and cannot see the parent's files.
+- **The child session panel shows the environment read-only**: you cannot switch environments in a child session.
- **An A2A child session shows no runtime environment**: the remote agent executes in its own environment, and the platform does not choose that location.
## Scope
----
-
Each BYOC Environment has Shared or team-level scope:
| Scope | Visibility |
@@ -459,8 +443,6 @@ The account remains the runtime security boundary, but team scope also participa
## Troubleshooting
----
-
When troubleshooting Runner issues, start with the **Status** and **Last heartbeat** columns in the self-hosted environment list.
@@ -484,13 +466,11 @@ Fastest split: **Offline / Pending** points to the Runner-to-AI-SRE connection;
## Related pages
----
-
Learn the cloud Sandbox lifecycle, use cases, and egress boundary.
-
+
View the Environment, team, and resources invoked by the agent that are bound to a session.
diff --git a/en/ai-sre/im.mdx b/en/ai-sre/im.mdx
index c13319a4..bb20579a 100644
--- a/en/ai-sre/im.mdx
+++ b/en/ai-sre/im.mdx
@@ -5,14 +5,10 @@ keywords: ["AI SRE", "IM", "Slack", "Lark", "DingTalk", "WeCom", "war room", "@m
sidebarTitle: IM Platform
---
-
- AI SRE is available to accounts on an On-call Pro or higher subscription, with no application needed. Starting September 16, 2026, 08:00 Beijing time, it must be activated in the console before use and is billed on actual usage; see [billing terms](/en/compliance/ai-sre-credit-package-purchase-agreement).
-
+> AI SRE must be activated in the console, is available on On-call Pro or higher, and is billed on actual usage. See [Activation and billing](/en/ai-sre/overview#activation-and-billing).
## Overview
----
-
Incident response usually happens right inside your IM group — alerts come in, the team discusses in the channel, and someone spins up a war room. AI SRE puts the agent directly into that collaboration chain: **you never have to switch to the console; you can summon it from IM to investigate**, and your teammates can follow every step of its analysis in real time.
AI SRE's IM integration has two trigger modes:
@@ -28,8 +24,6 @@ AI SRE's IM integration has two trigger modes:
## Supported IM Platforms
----
-
AI SRE's IM interaction covers four major platforms. Each platform supports inbound @mentions (webhook), historical message reads, and outbound replies:
| Platform | Group @mention | Direct message (DM) | Processing receipt | War room auto-diagnosis |
@@ -47,8 +41,6 @@ IM interaction requires that you have already connected the corresponding platfo
## AI SRE Settings in IM Integrations
----
-
Open the corresponding IM integration under **On-call → Integration Center → Integration List → Instant Messaging** and configure its AI SRE behavior under **Enhanced features**. The following switches are on by default:
- **Automatically start AI incident analysis**: available after you enable War Room. When the integration creates a war room, AI SRE starts one preliminary diagnosis and posts the result back to the room.
@@ -61,8 +53,6 @@ If AI SRE is not enabled for the account, these switches do not take effect. Aft
## @Mention Summon
----
-
In a connected IM group where **Allow AI SRE conversations in IM** is enabled, **@mention the bot** and type your question (for example, "@AI SRE check why the payment service's 5xx rate is spiking") — the message is forwarded to AI SRE for processing via the platform webhook:
@@ -104,18 +94,16 @@ AI SRE's replies in IM are delivered **only through the `reply` tool** — ordin
- **Result**: an answer to your concrete question, or an actionable interim finding.
- **Progress**: a one-or-two-sentence update while work is still going on — confirmed progress, what it is currently waiting on, a real blocker. A progress message is **not the answer**: it does not finish the turn, and the result is delivered separately as usual.
-If a turn ends naturally with the conclusion written as ordinary text instead of submitted through `reply`, the system adds one automatic **delivery-only** correction: that correction exposes `reply` alone and runs no investigative or mutating operations; if nothing has been submitted even then, the turn ends with an error — that draft never appears in the group. Non-natural endings — a cancellation, an interruption by a new message, a dispatched subagent, a wait on a subagent's reply, a truncated output — do not trigger this correction.
+If a conclusion is not submitted as a reply, the system asks AI SRE to submit it once more (submission only, with no investigation or changes); if it still is not submitted, the turn ends with an error and the draft never appears in the chat.
-This delivery contract applies only to **human-initiated IM requests**: console sessions still answer with streaming text, and war-room auto-diagnosis is an unattended background turn that also keeps native streaming output.
+This reply style applies only to **human-initiated IM requests**: console sessions still answer with streaming text, and war-room auto-diagnosis is an unattended background turn that also keeps native streaming output.
-A single reply also has a soft reading-length budget: when it is too long, `reply` refuses it once and suggests trimming the repetition, or publishing the detailed evidence and comparisons as an artifact and sending only the key conclusions plus the artifact link into the chat. That is why a long analysis in IM usually arrives as "conclusions + artifact link" rather than one very long message — see [Artifacts](/en/ai-sre/artifacts). If you explicitly ask to have the full report pasted directly into the chat, this constraint does not apply.
+When a reply is too long, AI SRE trims it or publishes the detailed evidence as an artifact and posts only the conclusion and the artifact link (see [Artifacts](/en/ai-sre/artifacts)). This limit does not apply when you explicitly ask for the full report in the chat.
## War Room Auto-Diagnosis
----
-
When you open a **war room** for an incident in IM and the integration keeps **Automatically start AI incident analysis** enabled, AI SRE intervenes automatically — no one needs to @mention it:
@@ -136,8 +124,6 @@ War room auto-diagnosis is bound to the incident context: when the investigation
## Standing Tasks and the Monitoring Card
----
-
When the agent's current turn ends but a **standing process-type task** it started is still running (e.g. a monitor watcher or a background command), AI SRE posts a monitoring card to the chat:
```
@@ -151,15 +137,15 @@ Each standing task gets one line: tasks with a deadline show the remaining minut
While any standing task is alive, the IM session's root message stays open (the incident view is not closed): later turns triggered by task notifications keep posting into the **same chat** — no re-@mention needed.
-Notification rounds follow a silent "no message = no news" semantics: if a notification round has nothing new to deliver, AI SRE closes that round silently — **no placeholder receipt** is posted to the chat, and the monitoring card is not re-posted either. A new message appears in the chat only when there is a real new finding.
+When a notification turn has nothing new, AI SRE posts nothing; it speaks only when there is a new conclusion.
### Progress Messages During a Long Investigation
-When an investigation runs long, the chat can stay quiet for a while — interim prose is not delivered, and the monitoring card only appears once a standing task exists. So when an IM request has been **silent for about 60 seconds** with no public reply submitted, the system may add a transient reminder telling the model how long you have already been waiting, and lets the model decide whether to post a progress message:
+In long investigations, if a request has had no reply for **about 60 seconds**, AI SRE gets a reminder and decides whether to post a progress update:
-- **Reminder cadence**: two reminders for the same request are at least **3 minutes** apart, and one uninterrupted silence stretch gets **at most two reminders**. Any successfully submitted reply (result or progress) opens a new silence stretch and resets the count, but does not shorten that 3-minute minimum gap.
-- **Where the waiting time starts**: at the moment your message entered the platform's pending queue, so queueing time counts — not when the agent actually started working on it.
-- **A reminder sends nothing by itself**: it only tells the model how long you have waited; it never writes anything to the group on the model's behalf. When the wait was already explained and nothing has changed, or the model is waiting on information from you, sending nothing is the correct choice.
+- Reminders for the same request are at least **3 minutes** apart, with at most **2** per stretch of silence; any reply restarts the count.
+- Waiting time counts from when your message entered the queue, including time spent queued.
+- A reminder posts nothing by itself; AI SRE may stay quiet if nothing has changed or it is waiting for your input.
- **A progress message is not the answer**: it says "still investigating, what it is stuck on, what it checks next", does not finish the turn, and the result follows separately.
@@ -170,23 +156,19 @@ Waiting reminders appear only on **attended IM requests**; the console, API, and
## Connections and Authorization
----
-
-When a credential is missing, the console renders inline cards (**"Authorize [resource name] to continue"**, **"Connect [vendor] to continue"** — see [Console](/en/ai-sre/sessions#when-authorization-is-required)). **IM and API channels get no card** — the agent hands the matter to you according to this session's channel, as follows:
+In the console, a missing credential shows an authorization card (see [Console conversations](/en/ai-sre/sessions#when-authorization-is-required)). **IM and API channels have no cards**, so the agent handles it this way:
| Situation | Behavior on IM / API channels |
| --- | --- |
-| Your OAuth authorization is missing (`per_user_oauth`) | The agent pastes the authorize link into the chat as a plain message (not a card); open it in a **desktop / PC browser** to complete the authorization, then reply **"已授权"** (or `authorized` in an English session) to continue. Continuing is your explicit action — a successful OAuth callback does not resume the task by itself |
-| Your secret-type credential is missing (`per_user_secret`) | There is no safe way to collect it over IM: the agent simply tells you to open **this same session in the web console** and complete it there. It never asks you to paste the secret into the chat, and never points you at a settings page instead |
-| The whole connection is missing (in the marketplace catalog, not connected in the account) | The agent gives the connect URL (a deep link into the console's plugins page) as a plain link; connect, then reply **"继续"** (or `continue`) to carry on |
+| Your OAuth authorization is missing | The agent posts the authorize link; open it in a **desktop browser**, complete authorization, then reply **"已授权"** (or `authorized` in an English session) to continue. A successful authorization does not resume the task by itself |
+| Your secret is missing | The agent asks you to open **this same session in the web console** to enter it; it never asks you to paste a secret into the chat |
+| The account has not connected the required integration | The agent posts the console link to connect it; connect, then reply **"继续"** (or `continue`) |
| A shared server's own credentials (environment variables / headers) | Not any of the above: fill them in under **Customize → Plugins → MCP** (that server), then tell the agent to retry |
On the automation channel nobody is watching and no reply will ever arrive: the agent does not wait and does not phrase anything as a question — it **records the missing connection or authorization as a blocker** in its final report and delivers whatever the evidence already supports.
## In-session Switch Commands
----
-
IM sessions have no picker UI like the console, but they support two slash commands that let you **switch bindings mid-conversation** — neither command is available for console sessions, whose environment and team bindings are set at creation and cannot be changed afterwards.
### /env — Switch Runner Environment
@@ -227,11 +209,9 @@ Knowledge bundles already mounted into this session are not removed — mounts a
## /feedback — Rate an AI SRE Reply
----
-
Once an AI SRE reply lands in a group chat, anyone in the group can rate it — not only whoever started the investigation. Send `/feedback` to the bot to rate or comment on the reply you are looking at:
-- **Entry and resolution:** `/feedback` is backed by the AI SRE side (POST /safari/session/latest-reply → POST /safari/feedback/create); it resolves "the message you are looking at" into the corresponding reply event even if you never took part in that conversation.
+- **Entry and resolution:** `/feedback` is handled by AI SRE; it resolves "the message you are looking at" into the corresponding reply event even if you never took part in that conversation.
- **Eligibility:** **not limited to session members** — any account member who can use AI SRE may rate (read-only group-chat readers included); an AI SRE answer posted into a group chat is public, and the reader who spotted the error is exactly whose opinion we want.
- **How to rate:** choose `like` / `dislike` / `none`; a comment-only submission (no rating) is allowed and does not wipe an earlier rating you gave, while an explicit `none` clears the existing rating.
- **Stored per rater:** each reply is keyed by **(reply event, rater)** — when several people rate the same reply, each gets its own row and they do not overwrite one another.
@@ -239,8 +219,6 @@ Once an AI SRE reply lands in a group chat, anyone in the group can rate it —
## Relationship to Console Sessions
----
-
Whether you start a session from IM or the console, it's **the same AI SRE**: messages are handled one at a time, with streaming output, automatic context compaction for long conversations, and optional team and environment bindings. The only difference is the entry point —
- **Console**: ask questions one at a time in the **Chat** workspace and view the full tool-call and sub-session panels; environment and team bindings are fixed at creation and cannot be changed.
@@ -250,13 +228,11 @@ For more about sessions, see [Conversations](/en/ai-sre/sessions).
## Related Pages
----
-
Learn about AI SRE's overall capabilities, typical use cases, and console navigation.
-
+
Learn about sessions, streaming output, cancellation, and context compaction.
diff --git a/en/ai-sre/init.mdx b/en/ai-sre/init.mdx
index afd8846e..9db474d8 100644
--- a/en/ai-sre/init.mdx
+++ b/en/ai-sre/init.mdx
@@ -5,26 +5,20 @@ keywords: ["AI SRE", "init", "operational map", "knowledge", "onboarding", "DUTY
sidebarTitle: Setup
---
-
- AI SRE is available to accounts on an On-call Pro or higher subscription, with no application needed. Starting September 16, 2026, 08:00 Beijing time, it must be activated in the console before use and is billed on actual usage; see [billing terms](/en/compliance/ai-sre-credit-package-purchase-agreement).
-
+> AI SRE must be activated in the console, is available on On-call Pro or higher, and is billed on actual usage. See [Activation and billing](/en/ai-sre/overview#activation-and-billing).
## Overview
----
-
Type `/init` in the input box of any AI SRE session, and the agent switches into an **operational onboarding interviewer** that walks you through building operational knowledge from scratch — your team's "operational map." It scans your Flashduty incidents and notification channels, asks you questions, captures the service topology, runbooks, cluster access, and more that you describe into knowledge files, and helps you connect external tools (MCP) when needed.
`/init` is the **starting point** for knowledge. AI SRE's diagnostic quality depends directly on how much real knowledge it can read about your systems: the more complete and accurate your [knowledge](/en/ai-sre/knowledge) is, the faster and more reliably the agent pinpoints root causes. `/init` is the guided flow that builds that knowledge from zero — and once it's built, every session loads it automatically.
-`/init` will **never** write or install anything without your consent. Before anything lands at each phase, it lists exactly "which files will be created/updated," and only acts after you confirm them one by one. Credentials (tokens, passwords, AK/SK) are never echoed back in plain text in the conversation — only recorded as ``. See [Safety and consent](#safety-and-consent).
+`/init` asks for your item-by-item confirmation before it writes or installs anything, and never echoes credentials in plain text. See [Safety and consent](#safety-and-consent).
## When to use /init vs. plain natural language
----
-
`/init` is for **structured setup from scratch / systematic backfilling**; small, one-off edits don't need it.
| Scenario | What to use |
@@ -39,20 +33,18 @@ Type `/init` in the input box of any AI SRE session, and the agent switches into
## How to run
----
-
Type `/init` in the input box of any AI SRE session and send it. No parameters are required.
- `/init` first locks the scope it will write to: **account level** (visible to all sessions in the account) or a specific **team level** (loaded only in that team's sessions). The scope is determined by whether the current session is bound to a team, and the agent confirms it with you first; a single session locks one scope and does not switch mid-way.
+ The agent first confirms the scope it will write to: the bound team's **team level** (loaded only in that team's sessions) if the session is bound to a team, otherwise **account level** (visible to all sessions in the account). One session uses one scope.
The agent asks questions phase by phase, topic by topic (services and topology, observability, runbooks, common failures, cluster access, and so on), turning your answers into draft knowledge files. At the end of each phase it asks whether to "continue to the next item or stop here for now."
- Before anything lands at each phase, the agent presents a list of "which files will be created/updated," each with a 3–5 line summary. Only after you confirm does it write to the knowledge and link the new files into the `DUTY.md` table of contents.
+ Before writing at each phase, the agent lists the files it will create or update (each with a 3–5 line summary). It writes only after you confirm, then links the new files into the `DUTY.md` table of contents.
You can say "skip this," "go back to step N," or "stop here" at any time. `/init` is not a one-shot run — typing `/init` again at any later point continues backfilling from the existing knowledge.
@@ -61,8 +53,6 @@ Type `/init` in the input box of any AI SRE session, and the agent switches into
## The interview
----
-
`/init` works through a fixed sequence of phases, each with clear entry and exit conditions. You can skip, go back, or stop at any time.
@@ -90,7 +80,7 @@ Type `/init` in the input box of any AI SRE session, and the agent switches into
| 7 | Cluster access & runtime probing | `clusters.md` (k8s) / appended to `tools.md` (MCP) |
- In Phase 4, every datasource gap goes through the same **Monitors-first** two-step route: when the scan digest already shows Monitors usage (a datasource or alert rules), the agent names the gap's `type_ident` and hands over the console deep link `/monit/datasource?create=` — opening it lands in Monitors' add-datasource form with that type preselected; `type_ident` values are prometheus / loki / victorialogs / tencent_cls / sls / mysql / postgres / oracle / clickhouse / elasticsearch. Once the datasource is enabled, the built-in `monit-query` capability picks it up automatically — nothing to install. Only when there is no Monitors evidence at all does it fall back to registering the tools you already run as a direct MCP connection (see [MCP](/en/ai-sre/mcp)). `/init` itself never creates or edits a Monitors datasource.
+ In Phase 4, datasource gaps are filled through Monitors first: if the account already uses Monitors (it has datasources or alert rules), the agent gives you a link that opens the Monitors add-datasource form with the right type preselected (Prometheus, Loki, VictoriaLogs, Tencent Cloud CLS, SLS, MySQL, PostgreSQL, Oracle, ClickHouse or Elasticsearch). Once the datasource is enabled, AI SRE can query it, with nothing to install. Only when the account does not use Monitors at all does it register the tools you already run as a direct MCP connection (see [MCP](/en/ai-sre/mcp)). `/init` itself never creates or edits a Monitors datasource.
@@ -104,29 +94,15 @@ Type `/init` in the input box of any AI SRE session, and the agent switches into
## Safety and consent
----
-
`/init` writes knowledge, may install MCP, and touches credentials, so consent and least privilege are hard constraints:
-
-
- Any write or install requires your explicit consent. Before anything lands, each collection phase lists "which files will be created/updated" (each with a 3–5 line summary), and it only proceeds after you say yes — it never triggers a write off a vague "ok."
-
-
- When you provide sensitive information such as a token, password, or AK/SK, the agent only confirms "recorded (length=N)" and never reprints the plaintext in the conversation.
-
-
- Whenever you need to provide or generate a credential (kubeconfig, cloud AK/SK, database account, API token), the agent asks you to configure it as **read-only / least privilege**; when the boundary is machine-verifiable, it runs a read-only boundary check before recording it.
-
-
- Not every detail belongs in the knowledge. The agent only writes content where "without it, the AI would make a worse decision during an incident" — optional, nice-to-have details aren't crammed in, keeping the knowledge from bloating.
-
-
+- **Per-item explicit consent**: any write or install requires your explicit consent. Before writing, each phase lists the files it will create or update (each with a 3–5 line summary) and proceeds only after you say yes — never off a vague "ok."
+- **Credentials are never echoed**: when you provide a token, password, or AK/SK, the agent records it only as `` and never reprints the plaintext.
+- **Least-privilege credentials**: whenever you provide or generate a credential (kubeconfig, cloud AK/SK, database account, API token), the agent asks you to make it **read-only / least privilege**; when the boundary is machine-verifiable, it runs a read-only boundary check before recording it.
+- **Minimality**: the agent only writes content without which the AI would make worse decisions during an incident; nice-to-have details are left out so the knowledge doesn't bloat.
## What it produces
----
-
The result of `/init` is a [Knowledge](/en/ai-sre/knowledge) base that every subsequent session loads automatically:
- **`DUTY.md`** — the table-of-contents entry point for the knowledge, holding only a one-line introduction and a list of `@filename` links pointing to each topic file;
@@ -139,8 +115,6 @@ The result of `/init` is a [Knowledge](/en/ai-sre/knowledge) base that every sub
## /init and /insight: a best-practice pair
----
-
`/init` and [`/insight`](/en/ai-sre/insight) are the two ends of the operational-knowledge "build → refine" loop:
@@ -158,8 +132,6 @@ The recommended rhythm: use `/init` to lay a solid foundation, run a few real in
## Related pages
----
-
Where `/init`'s output lands — learn the DUTY.md structure, file constraints, and how to edit and maintain it manually.
diff --git a/en/ai-sre/insight.mdx b/en/ai-sre/insight.mdx
index 9e3f32d2..c0f19ca5 100644
--- a/en/ai-sre/insight.mdx
+++ b/en/ai-sre/insight.mdx
@@ -5,14 +5,10 @@ keywords: ["AI SRE", "insight", "operational insight", "friction report", "knowl
sidebarTitle: Usage Insights
---
-
- AI SRE is available to accounts on an On-call Pro or higher subscription, with no application needed. Starting September 16, 2026, 08:00 Beijing time, it must be activated in the console before use and is billed on actual usage; see [billing terms](/en/compliance/ai-sre-credit-package-purchase-agreement).
-
+> AI SRE must be activated in the console, is available on On-call Pro or higher, and is billed on actual usage. See [Activation and billing](/en/ai-sre/overview#activation-and-billing).
## Overview
----
-
Type `/insight` in the input box of any AI SRE session and AI SRE will look back at **your** last 30 days of sessions to produce a single-page operational insight report. The report uses a parchment-style HTML layout and renders directly in the session as a chat card, which you can preview and download.
It is a **coach's read on the month**, not a problem list. It leads with **what's working** — where AI SRE genuinely pulled its weight this month; then covers the **frictions worth eliminating now** — the patterns that repeatedly drain your time, such as pasting the same database connection string across multiple sessions, an agent missing a runbook it should already know, or it repeatedly querying the wrong data source; and finally offers **2–3 higher-leverage next steps** — shifts in *how* you work with AI SRE that are worth trying.
@@ -21,12 +17,8 @@ It is a **coach's read on the month**, not a problem list. It leads with **what'
`/insight` is **read-only**. It only analyzes and presents; it will **not** automatically modify any knowledge, skill, or MCP configuration. Every suggestion is copyable text — whether to act on it is entirely up to you. See [How to Act on Suggestions](#how-to-act-on-suggestions).
-`/insight` is a built-in AI SRE skill: it automatically exports your past sessions, computes quantitative metrics, analyzes the session content section by section, and renders a consolidated report. The entire process is transparent to you — all you need to do is type `/insight`.
-
## How to Generate
----
-
Type `/insight` in the input box of any AI SRE session and send it. No parameters are required.
@@ -58,20 +50,18 @@ Understanding how the report is put together helps you see where the numbers com
- AI SRE first lists the sessions within scope for the last 30 days (up to 200 by default), covering **all four entry kinds** — web, IM, API, and automation; IM is a primary AI SRE entry point, so IM-originated sessions are analyzed alongside web. After exporting their full records, it keeps the sessions with **real signal**: **≥ 2 user-message turns OR ≥ 3 tool calls** (either one qualifies — `INSIGHT_MIN_MSGS` / `INSIGHT_MIN_CALLS`). The tool-call arm matters: it lets autonomous runs kicked off by an alert or a schedule — which may have zero human turns yet a dozen tool calls of real investigation — into the report, instead of being silently dropped by a user-turns-only filter. The quantitative overview also renders an **entry mix** line (`entry_mix`) showing where these sessions came from.
+ AI SRE first lists the sessions within scope for the last 30 days (up to 200 by default), covering all four entry kinds (web, IM, API, and automation), then keeps only sessions with **real signal**: **≥ 2 user-message turns or ≥ 3 tool calls** (either qualifies). That way, autonomous runs started by an alert or a schedule — no human turns, but real investigation — are included too.
- The report's quantitative overview — session count, your turn count, tool call count, average turns, daily activity, tool and skill distribution, entry mix, and outcome distribution — is computed deterministically across all sessions by program logic, not estimated by the model, so it is reliable and always present even when no friction is found.
+ The report's quantitative overview — session count, your turn count, tool call count, average turns, daily activity, tool and skill distribution, entry mix, and outcome distribution — is computed by the program, not estimated by the model, and is shown even when no friction is found.
- AI SRE reads the session records in sections, distilling "session topics," "wins," and "friction findings" from each, then consolidates everything: topics are aggregated into a narrative overview, the most representative wins are surfaced, and findings are deduplicated, clustered, and ranked by importance into friction cards. Every conclusion carries a **verbatim quote** as its evidence; session IDs are used internally only — to count how often a friction recurs — and are **never shown** in the report. The report contains only the distilled topics and findings — it does not copy your full raw session content verbatim.
+ AI SRE reads the session records in sections, distilling "session topics," "wins," and "friction findings" from each, then consolidates everything: topics are aggregated into a narrative overview, the most representative wins are surfaced, and findings are deduplicated, clustered, and ranked by importance into friction cards. Every conclusion carries a **verbatim quote** as evidence. The report shows no session IDs and does not copy full raw session content.
## Report Contents
----
-
The report has **six parts** from top to bottom. Regardless of whether any friction is found, the quantitative overview is always present.
### 1. At a glance
@@ -80,18 +70,18 @@ A **2–4 sentence** coaching synthesis at the very top of the report, written *
### 2. Overview (quantitative)
-Computed deterministically by program logic, not estimated by the model; the model only transcribes the numbers into the report. Includes:
+Computed by the program, not estimated by the model. Includes:
| Metric | Description |
|---|---|
-| Sessions | Number of sessions included in this analysis (`sessions`) |
-| Your turns | Total number of messages you sent across those sessions (`your turns`) |
-| Tool calls | Total number of tool calls initiated by the agent (`tool calls`) |
-| Avg turns | Average number of turns per session (`avg turns / session`, one decimal place) |
+| Sessions | Number of sessions included in this analysis |
+| Your turns | Total number of messages you sent across those sessions |
+| Tool calls | Total number of tool calls initiated by the agent |
+| Avg turns | Average number of turns per session (one decimal place) |
| Activity | Per-day session activity bar chart, with start and end dates labeled |
| Tool distribution | Ranking of tools the agent relied on most (top ~6) |
| Skill distribution | Ranking of skills invoked during sessions; shows "No skills invoked" if none were called |
-| Entry mix | Where the sessions came from, formatted as `web (60) · IM (25) · automation (5)` (`entry_mix`) |
+| Entry mix | Where the sessions came from, formatted as `web (60) · IM (25) · automation (5)` |
| Outcome distribution | Count of completed / incomplete / errored sessions (zero values omitted) |
### 3. Narrative
@@ -109,25 +99,24 @@ Friction cards ranked **from highest to lowest importance**, up to approximately
- A **rank** and a **friction type label** (one of five types; see the next section);
- A **frequency badge** showing how many distinct sessions this friction consumed your time in (deduplicated evidence session count);
- A one-line title and a second-person explanation;
-- **Evidence**: a single **verbatim quote** from the transcript (the most telling user or agent line); session IDs are used internally only — to count recurrence — and are **not shown**;
-- **A copyable recommendation**: text you can paste directly, whose first line is the destination (`Add this to knowledge//…`), so the target file travels with the paste.
+- **Evidence**: a single **verbatim quote** from the transcript (the most telling user or agent line);
+- **A copyable recommendation**: text you can paste directly, whose first line (`Add this to knowledge//…`) names the target file.
### 6. Next steps
About **2–3** forward-looking, grounded suggestions. These are **strategic** (a shift in *how* you work with AI SRE, higher-leverage), distinct from the tactical, file-level fixes in the friction cards; each names the exact observation it's grounded in (a stat from the overview or a friction cluster) and maps to a real AI SRE capability.
-When the report surfaces the `expensive-automation` emergent pattern — an automation-entry session that pulls raw listings into context and counts / groups / ranks them itself instead of scripting the aggregation — the next steps include a **Tested-script automation rewrite**: ask the agent in chat to move that automation's deterministic collection and aggregation into a tested script under its knowledge folder (`knowledge//automations//`), leaving the task prompt as the goal, the delivery, and a pointer to that folder.
+Two common kinds of next step:
-When sessions expose a root-cause gap on the datasource side, the next steps gain another shape: a recommendation to add the matching datasource in Monitors (10 `type_ident` values: prometheus / loki / victorialogs / sls / tencent_cls / elasticsearch / mysql / postgres / oracle / clickhouse). These suggestions carry an evidence bar — the same `type_ident` gap must appear in ≥ 2 distinct sessions, or a single session must give explicit evidence. Once the datasource is added, the built-in `monit-query` capability becomes available automatically, with no skill to install; the report only suggests, never creates or enables a datasource on your behalf, and no longer suggests "install a skill from the Marketplace."
+- **Tested-script automation rewrite**: when an automation session pulls raw listings into context and has the agent count / group / rank them itself (the `expensive-automation` pattern), ask the agent in chat to move the collection and aggregation into a tested script under `knowledge//automations//`, leaving the task prompt with just the goal, the delivery, and a pointer to that folder.
+- **Add a datasource**: when sessions expose a root-cause gap on the datasource side (the same type in ≥ 2 sessions, or explicit evidence in one), the report suggests adding the matching datasource in Monitors (prometheus / loki / victorialogs / sls / tencent_cls / elasticsearch / mysql / postgres / oracle / clickhouse). Once added, the built-in `monit-query` capability is available automatically with no skill to install; the report never creates the datasource for you.
-Every friction and win must be grounded in at least one real session and carry a verbatim quote as evidence — the report never fabricates sessions, facts, or runbook gaps. If no rankable friction is found, the frictions part displays an empty-state message while the rest of the report still renders — in that case, "the overview itself is the report."
+Every friction and win must be grounded in at least one real session and carry a verbatim quote as evidence — the report never fabricates sessions, facts, or runbook gaps. If no friction is found, the frictions part shows an empty-state message and the rest of the report still renders.
## Friction Types
----
-
`/insight` recognizes exactly five friction types, each corresponding to a clear, adjustable "dial." Listed in default importance order:
| Friction type | What it looks like in sessions | Recommended destination |
@@ -144,36 +133,32 @@ Every friction and win must be grounded in at least one real session and carry a
## How to Act on Suggestions
----
-
-The report is **read-only**: it surfaces problems and provides copyable fix text, but **never** automatically applies any changes. For now, all suggestions are copy-paste style: you confirm them, then manually apply them in the corresponding resource.
+The report only provides copyable fix text; you apply it yourself in the corresponding resource.
Friction cards are already ranked by importance. Start with the top-ranked cards that have high frequency badge numbers — those are the patterns consuming your time most repeatedly.
- Each card's "Copyable suggestion" contains text you can paste directly, and its first line (`Add this to knowledge//…`) is the destination — telling you which file it belongs in, and traveling with the paste.
+ Copy the card's "Copyable suggestion" text; its first line (`Add this to knowledge//…`) names the target file.
Based on the friction type, paste and save in the appropriate resource: repeated context and hallucinated entities go into the knowledge's `services.md` or DUTY.md; a missing runbook means adding a new runbook to the knowledge; a wrong data source gets pinned in `observability.md` / `clusters.md`; stale knowledge means updating the outdated file directly. These are all standard edits under [Knowledge](/en/ai-sre/knowledge).
-
-`/insight` will never perform any writes on your behalf — it does not invoke any sync or install actions, and does not modify knowledge, skills, or MCP. If you later want AI SRE to "add this runbook," that is an **independent** natural-language instruction and is outside the scope of `/insight`.
-
+
+You can also ask AI SRE in a later message to "add this runbook" — that is a separate instruction, not something `/insight` does.
+
-`/insight` runs on demand, one report at a time — it does not "continuously watch" or generate reports on a schedule. The recommended approach is to run it again after accumulating a few more incident investigations, to see which frictions have been resolved and which new ones have emerged.
+`/insight` runs only when you type it; it does not generate reports on a schedule. Run it again after a few more investigations to see which frictions are gone and which are new.
## Related Pages
----
-
-
+
Learn about session creation, team binding, and war rooms — these determine the analysis scope of `/insight`.
diff --git a/en/ai-sre/knowledge.mdx b/en/ai-sre/knowledge.mdx
index 9e48e00c..c7fff822 100644
--- a/en/ai-sre/knowledge.mdx
+++ b/en/ai-sre/knowledge.mdx
@@ -2,17 +2,13 @@
title: Learn about Knowledge
description: People maintain knowledge. It describes how this environment runs. A DUTY.md plus runbooks and service lists. A session reads the guide first and opens the other files when needed.
keywords: ["AI SRE", "knowledge", "DUTY.md", "runbook", "context"]
-sidebarTitle: Learn about Knowledge
+sidebarTitle: "Knowledge"
---
-
- AI SRE is available to accounts on an On-call Pro or higher subscription, with no application needed. Starting September 16, 2026, 08:00 Beijing time, it must be activated in the console before use and is billed on actual usage; see [billing terms](/en/compliance/ai-sre-credit-package-purchase-agreement).
-
+> AI SRE must be activated in the console, is available on On-call Pro or higher, and is billed on actual usage. See [Activation and billing](/en/ai-sre/overview#activation-and-billing).
## Overview
----
-
Knowledge is the operational knowledge you hand to AI SRE: a `DUTY.md` file plus a collection of runbooks, FAQs, service catalogs, cluster configs, and similar files. When a session starts, the agent reads `DUTY.md` first, then opens other files as needed — bringing your team's incident-handling experience, naming conventions, and system topology into every diagnosis.
Console entry: **AI SRE → Customize → Context → Knowledge**. [Memory](/en/ai-sre/memory), in the same group, is a separate page and is managed separately.
@@ -30,8 +26,6 @@ Knowledge is one type of AI SRE resource and follows the same two-level scope mo
## DUTY.md Structure
----
-
`DUTY.md` is the **table of contents entry point** for the whole knowledge and is loaded automatically in every session. The agent reads `DUTY.md` in full, then fetches other files on demand via `@filename` references. The system attaches no file listing beside `DUTY.md`: knowledge files sit under the `knowledge/` directory of the session workspace, and the agent finds them with ls / glob / grep the way it browses a code repository, so files that `DUTY.md` does not reference can still be found.
If a scope has no `DUTY.md` yet, that scope is not silently skipped: the system tells the agent that this scope has no guide and which directory holds its files, and requires it to list that directory and read the relevant files before doing substantive work.
@@ -71,8 +65,6 @@ After reading `DUTY.md`, the agent decides which `@references` to expand based o
## Maintain it in the console
----
-
Go to **AI SRE → Customize → Context → Knowledge**. Each row of the list is one knowledge, labeled by scope ("Shared" or the team name), with its file count, `DUTY.md` status, and last edit time. The `DUTY.md` status is one of **Not created**, **Up to date**, or **Needs refresh · N changes since** (other files changed after `DUTY.md` was written). Click **Create** to add knowledge for the Shared scope or for a team you belong to; when the account and every team available to you already have one, the button is disabled.
When no knowledge exists yet, the page shows a starter instead: **Set up AI-SRE** opens a new chat that runs [`/init`](/en/ai-sre/init), and **Upload existing docs** opens a new chat with the attachment picker open.
@@ -87,13 +79,13 @@ Files still have to meet the limits above: plain text, at most 1 MiB each, and a
### Ask AI to change it
-Below the body is an input box (placeholder: "How should the AI change this knowledge? e.g. add an OOM troubleshooting runbook"). Write what to change and send it: the console opens a new chat whose input already holds a reference to this knowledge and your request; for team knowledge, the chat switches to that team. Once sent, the AI first explains in text which files it will change and how, and saves only after you agree. The page itself offers no change preview or item-by-item review.
+Type what to change in the input box below the body (for example, "add an OOM troubleshooting runbook") and send it. The console opens a new chat with a reference to this knowledge and your request (switching to the team for team knowledge). The AI first explains which files it will change and how, and saves only after you agree.
**Let AI generate it** and **Let AI update it** (below) follow the same flow: they move to a new chat with the request already written.
### When DUTY.md needs a refresh
-If other files change after `DUTY.md` was written, a notice appears above the file tree: "Changes since DUTY.md was written: N. It may need updating." With edit permission, two actions sit below it:
+If other files change after `DUTY.md` was written, a notice above the file tree says it may need updating. With edit permission, you can:
- **Let AI update it**: moves to a new chat and has the AI update the `DUTY.md` index against the current files; the change is confirmed with you first.
- **Still accurate**: confirms `DUTY.md` is still correct. The notice disappears until the next file change.
@@ -104,8 +96,6 @@ If other files change after `DUTY.md` was written, a notice appears above the fi
## How the Agent Uses Knowledge
----
-
Knowledge is not all loaded at once — it follows a **catalog-first, expand-on-demand** pattern:
@@ -125,13 +115,11 @@ Knowledge is not all loaded at once — it follows a **catalog-first, expand-on-
- If knowledge fails to load into the current session, a warning banner appears above the message list: "Knowledge failed to load - AI-SRE may not have access to DUTY.md and runbooks in this session.", along with a **Retry** button that re-attempts the load. Until the retry succeeds, the agent may be unable to read DUTY.md and runbooks in that session.
+ If knowledge fails to load into the current session, a warning appears above the message list, and the agent may be unable to read DUTY.md and runbooks. Click **Retry** to load it again.
## Scope & Visibility
----
-
Every knowledge has a scope: Shared (account-level, visible across the entire account) or team-level.
| Dimension | Shared | Team |
@@ -141,7 +129,7 @@ Every knowledge has a scope: Shared (account-level, visible across the entire ac
| Loaded in session | All sessions | Only sessions bound to that team |
| Readable at runtime | All sessions | Sessions bound to that team, plus personal sessions whose creator belongs to that team (mounting occurs on read) |
-**Edit permissions**: team knowledge can be acted on only by members of that team — organization admins must join the team first; Shared knowledge can be acted on only by the Account Owner or admins; there is no "creator retains extra rights" rule. The console grays out rows the current user cannot edit, and disables toggles and action buttons when you lack edit permission.
+**Edit permissions**: team knowledge can be edited only by members of that team (organization admins must join the team first); Shared knowledge only by the Account Owner or admins. Creators have no extra rights.
**Create and reassign**: to create new team knowledge, you must belong to the target team; Shared-scope creation is limited to the Account Owner or admins. When editing existing knowledge, the Account Owner or admins can move it to any team to recover resources left behind by empty teams or departed members; regular members can move it only to teams they belong to. Promoting existing knowledge to Shared scope (**Set to Shared**) carries the same gate as Shared-scope creation: only the Account Owner or admins can do it — a regular member cannot self-serve this even for their own team's knowledge.
@@ -155,8 +143,6 @@ This two-level scope model applies uniformly to all resources within the account
## Best Practices
----
-
Keep `DUTY.md` to link lists and one-line descriptions only — all substantive content goes into the sibling files it `@references`. This keeps the catalog concise and readable, and lets the agent expand only the branches relevant to the current incident, avoiding irrelevant content consuming context.
@@ -180,8 +166,6 @@ This two-level scope model applies uniformly to all resources within the account
## Related Pages
----
-
Encapsulate reusable diagnostic workflows as Skills, sharing the same scope model as Knowledge.
@@ -192,7 +176,7 @@ This two-level scope model applies uniformly to all resources within the account
Preferences, procedures, facts, and lessons the AI notes in conversations, managed separately from knowledge.
-
+
Learn how sessions bind to teams and how knowledge is read and mounted during a session.
diff --git a/en/ai-sre/mcp.mdx b/en/ai-sre/mcp.mdx
index cee49789..a9ead0d1 100644
--- a/en/ai-sre/mcp.mdx
+++ b/en/ai-sre/mcp.mdx
@@ -2,17 +2,13 @@
title: MCP (External Tool Connections)
description: Use the Model Context Protocol (MCP) to connect AI SRE agents to external tools and data sources — such as GitHub, Slack, Kubernetes, and observability platforms. Configure MCP servers, authentication, and scope in the console; agents will call their tools on demand during a session.
keywords: ["AI SRE", "MCP", "Model Context Protocol", "MCP server", "external tools", "OAuth", "API Key", "agent"]
-sidebarTitle: MCP
+sidebarTitle: "MCP Tools"
---
-
- AI SRE is available to accounts on an On-call Pro or higher subscription, with no application needed. Starting September 16, 2026, 08:00 Beijing time, it must be activated in the console before use and is billed on actual usage; see [billing terms](/en/compliance/ai-sre-credit-package-purchase-agreement).
-
+> AI SRE must be activated in the console, is available on On-call Pro or higher, and is billed on actual usage. See [Activation and billing](/en/ai-sre/overview#activation-and-billing).
## Overview
----
-
**MCP** (Model Context Protocol) lets AI SRE agents connect to external tools and data sources. Each **MCP server** is a standardized endpoint that exposes a set of tools (functions) — for example, querying GitHub issues, sending Slack messages, reading Kubernetes resources, or retrieving metrics from an observability platform.
Once you configure and enable an MCP server in the console, agents will **autonomously decide** when they need an external capability during incident investigation and call the corresponding tool directly — no manual data-shuttling required.
@@ -25,8 +21,6 @@ This is **different** from the [Flashduty MCP Server](/en/developer/mcp-server)
## What Is MCP
----
-
**MCP** (Model Context Protocol) is an open protocol that describes in a uniform way "what tools a server exposes, what parameters each tool accepts, and what it returns." Think of it as the "USB port" of the AI agent world — any MCP-compliant server can be discovered and called plug-and-play by an agent, with no per-system adapter code required.
In AI SRE, MCP extends an agent's capability from "built-in tools" to "any external system":
@@ -41,61 +35,51 @@ In AI SRE, MCP extends an agent's capability from "built-in tools" to "any exter
## Installing MCP Servers from the Marketplace
----
-
Go to **Customize → Plugins → Overview** to see Flashduty's curated catalog of third-party MCP templates. The catalog is grouped into category tabs (All / Observability / Cloud & Infrastructure / Database & Middleware / Code & Collaboration / Skill), and the search box in the top-right corner filters it by name or description.
-The **Recommended** block above the catalog ("Recommended from your alert sources and common usage. Once connected, AI SRE can use them during investigations.") picks the templates that match the **alert integrations already configured** in your account (ranked by alert count over the last 30 days), then fills in the picks promoted for your current locale, showing at most 3. Installed templates, templates that need a Runner, and templates you may not install never appear here.
+The **Recommended** block above the catalog suggests up to 3 templates based on the alert integrations configured in your account (ranked by alert volume over the last 30 days). Templates that are already installed, need a Runner, or that you cannot install are not recommended.
- Each catalog row shows the template name and description; when MCP / App / Skill rows are mixed on the same screen, the row also carries a kind tag. An uninstalled row has a round **+** button on its right: clicking **+** or clicking the row itself opens the **Connect** dialog. When a template needs a self-hosted Runner and the account has no Runner available, the row's tag reads **Requires a self-hosted runner**; for a template you may not install, the row shows no **+** and is not clickable.
+ Click a template row or its **+** to open the **Connect** dialog. Templates that need a self-hosted Runner when the account has none are marked **Requires self-hosted Runner**; templates you are not allowed to install cannot be clicked.
- The dialog first shows the template's details: the vendor ("Official Datadog · MCP" or "Community · MCP"), a link to its official docs, its description, and a set of "**Ask things like this once connected**" example questions. Then come the connection parameters the template declares — URL / endpoint placeholders and environment variables. **Shared** fields (shared account-wide under service authorization) are labelled "Shared by the whole account."; in **Member authorization (key)** mode there is also a "**Your API token**" field (a password input) labelled "Only for your own use — other members fill in their own the first time they use it.", with a "How to get one" docs link beside it.
+ The dialog shows the template's vendor, official docs, description and example questions, followed by the connection parameters. **Shared** fields are used by the whole account; templates in member authorization (key) mode also ask for **your own API token**, which other members enter separately on first use.
- Choose the **execution environment** this connection should be made from — "Connects in the session's own environment by default."; for a template that needs a self-hosted Runner, the hint reads "If 〈name〉 is only reachable on your internal network, pick a self-hosted Runner on that network." The primary button is **Connect**; for a **Member authorization (OAuth)** template it reads "**Authorize 〈name〉**" and creates the connector first, then opens the browser authorization window (OAuth discovery, Dynamic Client Registration, and token exchange all run from the chosen environment; when the authorization server does not support DCR, fc-safari falls back to a Client ID Metadata Document — see "Authentication" below).
+ Choose the **execution environment** to connect from (defaults to the session's environment). For systems reachable only from an internal network, choose a self-hosted Runner on that network. For templates in member authorization (OAuth) mode, click the **Authorize** button and finish authorization in the browser; see [Authentication](#authentication).
- On submit, the system creates the connector and runs one connection test against it. On success the dialog shows "**〈name〉 connected**" plus the example questions: click **Done** to close it, or click an example question to open a new chat with that question **prefilled** (it is not sent automatically). On failure it shows "**The connection test failed**" with the raw error: click **Retry** to re-run the test; for a template that needs a Runner, a non-cloud environment also offers a "Let AI SRE install it on the Runner" entry, which opens a new chat that carries no token and asks the agent to install the missing command-line tools (`npx`'s Node.js, `uvx`'s uv) on the self-hosted Runner.
+ The system creates the connector and tests the connection. On success, you can click an example question to start a chat prefilled with it. On failure, the error is shown and you can **Retry**; templates that need a Runner can also have AI SRE install missing command-line tools on the Runner (such as Node.js for `npx` or uv for `uvx`).
-The dialog creates the connector on the **first submit only**. After that its connection parameters are locked, and it shows "This connector already exists, created from the values you first submitted. To change them, edit it under Plugins → MCP." When the name collides with a connector that already exists, the dialog no longer echoes the backend error and instead shows "This account already has a connector named “〈name〉”. If that is the one you want, finish authorizing it under Plugins → MCP; otherwise an account owner or admin has to rename or delete it there first, then connect again."
+Connection parameters are fixed at the first submit; to change them later, edit the server under **Plugins → MCP**. If a connector with the same name already exists in the account, use it, or have an account owner or admin rename or delete it before connecting again.
-Installed MCP servers record a `source_template_name` field that points back to the originating template, making it easy to trace the server's provenance later. **Marketplace-installed MCP servers are fixed to Shared scope** (account-level, `team_id` is 0) and available to all members of the account; no team owner can be chosen at install time, and the same template can only produce one instance per account.
+MCP servers installed from the marketplace record their source template and are **always Shared scope** (available to all members of the account). Each template can be installed only once per account.
-A template that **requires a Runner** (the `requires_runner` flag in its details) can only be used in an environment where you have deployed a BYOC Runner; cloud Sandboxes do not support it. `requires_runner` is independent of transport, and today's 50-template catalog contains both kinds: 23 **HTTP Streaming** templates that need no Runner, and 27 **stdio** templates that do — including Alibaba Cloud OpenAPI, Alibaba Cloud Observability, Nightingale (n9e), Gitee, GreptimeDB, Prometheus, Grafana (Self-Hosted), Kafka (Confluent), AWS, ClickHouse, MySQL, PostgreSQL, Alibaba Cloud RDS, Redis, and MongoDB. Those stdio templates are launched locally on each environment via `uvx` / `npx`, and a cloud Sandbox cannot launch local subprocesses; confirm your account has a working BYOC Runner configured before installing. See [Environments (BYOC)](/en/ai-sre/environments).
+Templates that **require a Runner** work only on a BYOC Runner you deploy; cloud Sandboxes do not support them. Of the 50 templates in the marketplace today, 23 are **HTTP Streaming** and need no Runner; 27 are **stdio** and need one, including Alibaba Cloud OpenAPI, Alibaba Cloud Observability, Nightingale (n9e), Gitee, GreptimeDB, Prometheus, Grafana (Self-Hosted), Kafka (Confluent), AWS, ClickHouse, MySQL, PostgreSQL, Alibaba Cloud RDS, Redis, and MongoDB. They start locally via `uvx` / `npx`, so make sure the account has a working BYOC Runner before installing. See [Environments (BYOC)](/en/ai-sre/environments).
### Systems only Monitors can query
-The catalog also contains a class of rows for **systems only Monitors can query** (currently Loki, VictoriaLogs, and Oracle): they appear under their category (Observability / Database), and when MCP / App / Skill rows are mixed on the same screen they carry a `Monitors` kind tag. They are **not connectors you can onboard from the marketplace** — they are entry points meaning "once you add a datasource in Monitors, AI SRE can query this system" — so they never appear in the **Recommended** block above (that block lists connectable templates).
+The catalog also lists **systems queried through Monitors** (currently Loki, VictoriaLogs and Oracle). They cannot be connected from the marketplace: once you add such a data source in Monitors, AI SRE can query it directly, without an address, token or Runner. Clicking one of these rows shows the account's data sources of that type; click **Try it in chat** if some exist, or **Add more in Monitors →** if none do (requires permission to add data sources).
-Clicking such a row (or its **+**, which opens the same panel) opens a panel with **no Connect button**, showing only:
-
-- The account's **datasources of that type** and their status, e.g. "N connected · runs through the alert engine — no URL, token or Runner needed"; with none yet it reads "No 〈type〉 datasource yet · add one in Monitors and you can query it, no Runner needed". The row's **+** appears only while the account has no datasource of that type and you have permission to add one; otherwise that slot shows "N connected" or "Added by a Monitors admin".
-- When datasources of that type exist, the primary button is **Try it in chat**: it opens a new session prefilled with a question against your datasource (it is not sent automatically).
-- With none yet, it offers **Add more in Monitors →**, opening Monitors → Datasources → Add in a new tab (the type preselected); a member without add permission only sees "A Monitors admin adds it and this updates automatically" and is not offered that action.
-
-Some MCP templates support both routes — a direct MCP connector and the Monitors one (for example Prometheus, MySQL, PostgreSQL, ClickHouse, Elasticsearch, SLS). Those rows are tagged `MCP · Monitors` and their dialog adds an "Access method" choice between the two.
+Some templates (such as Prometheus, MySQL, PostgreSQL, ClickHouse, Elasticsearch and SLS) support both a direct MCP connection and querying through Monitors. They are labeled `MCP · Monitors`, and you choose the access method when connecting.
-Row names share a namespace with template names: if a system already has a template of the same name, only the template row is shown (the template row is the one carrying connection parameters). On a private deployment **without the Monitors module**, these rows are not listed and a template's dialog offers no Monitors route — the list API returns `monit_available: false` and the console hides the related affordances based on it.
+Row names share a namespace with template names: if a system already has a template of the same name, only the template row is shown. On a private deployment **without the Monitors module**, these rows and the Monitors access method are not shown.
## Adding an MCP Server
----
-
Go to **Customize → Plugins → MCP**. The list page has two entries in the top-right corner:
- **Add MCP**: opens a form for defining an MCP server by hand (its fields are listed under "Basic Fields" below).
-- **Add in chat**: opens a new AI SRE session with this prompt prefilled — "I want to add an MCP server. First ask whether I want to connect my own service or install an existing one. If it is an existing one, ask which system I want to connect. If the plugin catalog has it, install it; if not, search the web and show me a few to pick from. Install the one I choose." The agent first asks whether you want to connect your own service or install an existing one; for an existing one it checks the plugin catalog first and only searches the web for candidates when the catalog has none, then completes the connection once you pick (nothing is sent automatically — you can edit the prompt first). The button appears only when there is an unambiguous scope to write into: always when you can author at account scope, otherwise when the current scope filter selects exactly one team you belong to (or you belong to exactly one team).
+- **Add in chat**: opens a session with a prefilled prompt; the agent asks whether you want to connect your own service or install an existing one, checks the plugin catalog first, and searches the web for candidates if nothing matches. The button appears only when the target scope is unambiguous (you have account-level permission, or exactly one of your teams is selected).
### Basic Fields
@@ -104,11 +88,11 @@ Go to **Customize → Plugins → MCP**. The list page has two entries in the to
| Name | string | Yes | The server name, used as the identifier when agents call it (e.g., `sqlite-explorer` in `mcp:sqlite-explorer/query`). Must start with a letter; may only contain letters, digits, `-`, and `_`; length 1–255. **Case-insensitive and unique** within an account; cannot duplicate a built-in server name. |
| Transport | enum | Yes | How the agent communicates with the server. See "Transport" below. |
| Scope | Shared / Team | Yes | The scope of this MCP server: **Shared** (visible account-wide) or a specific **Team** (visible only to members of that team). See "Scope" below. |
-| Execution Environment | Cloud / BYOC Runners (multiple) | No | Controls where this MCP server is available. Select Cloud and one or more visible BYOC Runners; leave empty to make it available everywhere. It does not route calls: an MCP call still runs in the current AI SRE session's environment. For a service available only on a private network, select only the Runner(s) that can reach it. Conversely, when this list **does not** include the session's own environment, that session cannot call it directly — but the agent still knows the server exists and which environment can run it; see "Cross-environment connectors" below. See [Environments (BYOC)](/en/ai-sre/environments). |
+| Execution Environment | Cloud / BYOC Runners (multiple) | No | Where this server is available; if none are selected, it is available everywhere. Calls are always made from the session's own environment, so for services reachable only from an internal network select only Runners that can reach them. If the session's environment is not listed, see [Cross-environment connectors](#cross-environment-connectors). See [Environments (BYOC)](/en/ai-sre/environments). |
| Description | string | Yes | Describes what this server does, for identification in the list. |
-Each MCP server also has an **AI description**: after an agent first lists a server's tools, the system automatically generates a capability summary from the tool list and displays it in the console. This summary refreshes automatically as the tool set changes — no manual maintenance needed.
+After an agent first lists a server's tools, the system generates an **AI description** shown in the list, and keeps it updated as the tools change.
### Transport
@@ -124,13 +108,13 @@ Each MCP server also has an **AI description**: after an agent first lists a ser
-stdio server commands run on the **machine where the Runner is deployed**, not on the machine of the person who configured them. Shared configuration must be portable: do not write personal machine paths into commands or arguments (e.g., `/Users/your-name/...`, `/home/your-name/...`), and make sure the executing environment has the runtime the command needs (`uv` / `uvx` / `node` / `npx`). A missing runtime makes the server fail to connect.
+stdio commands run on the **machine where the Runner is deployed**, not on your computer. Avoid personal paths (such as `/Users//...`), and make sure the Runner has the required runtime (such as `uv` / `uvx` / `node` / `npx`) installed; otherwise the connection fails.
There is a default timeout for both connection and tool calls: 10 seconds for connection, 60 seconds for tool invocation.
-Use "Skip TLS certificate verification" only when the remote HTTPS MCP server uses a self-signed certificate and the network is controlled. After you enable it, the agent execution environment skips certificate-chain and hostname verification when connecting to that server. Do not use it for untrusted public endpoints.
+Enable "Skip TLS certificate verification" only when the HTTPS server uses a self-signed certificate and the network is controlled. Never enable it for untrusted public endpoints.
### Authentication
@@ -141,12 +125,15 @@ MCP servers support three **authorization modes** that determine how credentials
All sessions call with the same service identity. Credentials are written directly into the server configuration — for HTTP/SSE transport, in the **Headers** (JSON) (e.g., `{ "Authorization": "Bearer xxx" }`); for stdio transport, in the **environment variables** (JSON) (e.g., `{ "API_KEY": "xxx" }`). Suitable for internal systems accessed with account-level service tokens.
- Credentials are **encrypted at rest**: on save, any entry whose key name contains `KEY`, `SECRET`, `TOKEN`, `PASSWORD`, `PASSWD`, `CREDENTIAL`, or `AUTHORIZATION` (case-insensitive) has its value encrypted before storage and returned masked on read; in addition, an entry whose key name has a whole non-alphanumeric-delimited segment equal to `PWD` or `PASS` is treated the same way — `REDIS_PWD`, `db-pass` and a bare `PWD` all qualify, while `BYPASS` and `COMPASS` (which only contain that text inside a segment) do not. Entries matching none of these rules are stored as-is, so put credentials under a recognizable key name (such as `Authorization`, `X-API-Key`, or `GITHUB_TOKEN`).
+ Values under the following key names (case-insensitive) are **encrypted at rest** and shown masked; all other entries are stored as-is, so put credentials under such key names (for example `Authorization`, `X-API-Key`, `GITHUB_TOKEN`):
+
+ - names containing `KEY`, `SECRET`, `TOKEN`, `PASSWORD`, `PASSWD`, `CREDENTIAL` or `AUTHORIZATION`;
+ - names with a segment (split on non-alphanumeric characters) that is exactly `PWD` or `PASS` (such as `REDIS_PWD`, `db-pass`; `BYPASS` and `COMPASS` do not count).
- A service authorization means any session in the account can call the system as that service identity. If it exposes members' personal data or allows high-risk writes, prefer "Member authorization (key)" or "Member authorization (OAuth)".
+ Any session in the account can call the system with this identity. For personal data or high-risk write operations, use member authorization instead.
- Each member provides their own key the **first time** they invoke a tool on this server. Keys are encrypted and stored at the account level, isolated per member.
+ Each member provides their own key on **first use**. Keys are encrypted and isolated per member.
Selecting this mode requires filling in a **Key Schema**:
@@ -158,47 +145,41 @@ MCP servers support three **authorization modes** that determine how credentials
Suitable for third-party SaaS where each engineer uses their own API key (e.g., a personal GitHub token).
- Each member authorizes individually via **OAuth 2.1**. An authorization window pops up automatically the first time a tool on this server is invoked. Server discovery and client registration are performed as needed: when the authorization server advertises a registration endpoint, fc-safari uses **Dynamic Client Registration (DCR)**; when there is no registration endpoint but the server declares **Client ID Metadata Document** support, fc-safari registers no client and instead uses the `/safari/oauth/client-metadata.json` document it publishes as its `client_id`, leaving the authorization server to fetch it by that URL — nothing extra to configure on your side. Tokens are stored per member and refreshed automatically near expiry. Suitable for services that support OAuth.
+ Each member authorizes individually via **OAuth 2.1**; an authorization window pops up on first use. Dynamic Client Registration (DCR) is supported; authorization servers that support Client ID Metadata Documents instead of DCR also work without extra configuration. Tokens are stored per member and refreshed automatically before they expire. Suitable for services that support OAuth.
-For "Member authorization (key)" and "Member authorization (OAuth)", if credentials are missing the agent's tool call is paused and a credential entry or authorization dialog is shown to the current member; execution resumes once credentials are supplied. In service authorization mode, no credentials are requested from members.
+In member authorization modes, a tool call with missing credentials pauses and prompts the current member to enter a key or authorize, then continues.
### MCP Server Authorization (Settings)
-Member authorization credentials — both key and OAuth — are isolated **per member**, so besides the inline "prompted on demand during a conversation" path above, you can also **manage your own authorization** for an MCP server directly **in settings** — both paths write to the **same** per-member credential.
+Member authorization credentials (key or OAuth) are isolated per member. Besides authorizing when prompted in a chat, you can manage your own authorization from the MCP list; both paths save the same credential.
-**Auth-status chip in the list**: the MCP list's **Member authorization** column shows a per-viewer auth-status chip for each MCP server, reflecting the **current viewer's** credential. The wording depends on the authorization mode — since a saved member key is never verified for validity, it deliberately avoids the word "Connected":
+**Authorization status**: the **Member authorization** column of the MCP list shows your own status:
-- **Member authorization (OAuth)**: **● Connected** (a valid credential is saved) / **○ Disconnected** (no credential provided yet).
-- **Member authorization (key)**: **● Saved** (a key is saved) / **○ Not set** (no key provided yet).
-- Shared across both modes: **⚠ Expired** (the credential has expired — OAuth token lapsed — and needs re-authorization).
+- **Member authorization (OAuth)**: **● Connected** / **○ Disconnected**.
+- **Member authorization (key)**: **● Saved** / **○ Not set**. The key is not checked for validity.
+- Both modes: **⚠ Expired** (the OAuth token has expired and needs reauthorization).
-MCP servers using service authorization have no per-member authorization step and render a dash ("—"). For a server that needs your personal credential, open the **Credential** dialog from its authorization entry in the list. It manages only your credential and never changes the server endpoint, authorization mode, or scope.
+Service authorization shows a dash ("—"). Click the authorization entry to open the **Credential** dialog; it manages only your own credential and does not change the server's configuration.
-**Actions in the Credential dialog**: the dialog offers actions based on its authorization mode and your current credential state:
+**Actions in the Credential dialog**:
-- **Member authorization (OAuth)**: first choose an **execution environment**, then click **Authorize** (when disconnected) / **Reauthorize** (when connected or expired). Choose a Cloud Sandbox or an online BYOC Runner; **Auto** is not available. OAuth discovery, Dynamic Client Registration, token exchange, and later refreshes all run from that environment (when the authorization server does not support DCR, fc-safari falls back to a Client ID Metadata Document — see "Authentication" above). On each open, the dialog prefers the last successful environment if it is still online, then an online runner bound to the connector, and finally the Cloud Sandbox. For an OAuth service reachable only on a private network, choose a BYOC Runner that can reach it. A browser popup then opens the authorization window (initiated via `/safari/credentials/oauth/initiate`, which returns an authorize URL opened in the popup).
-- **Member authorization (key)**: click **Enter Key** (when disconnected) / **Update Key** (when connected) to open the secret-entry modal, which submits to `/safari/credentials/secret`.
-- **Revoke**: when a credential exists, click **Revoke** (via `/safari/credentials/revoke`) to delete your saved credential; the status returns to Disconnected.
-
-
-OAuth authorization completes through a browser **bounce page** at `/oauth-callback`: the authorization server calls back to fc-safari, which then 302-redirects to the bounce page; the page `postMessage`s the result to the window that initiated the flow (the settings page or the chat page) and closes itself automatically. No manual token copy-pasting is required.
-
+- **Member authorization (OAuth)**: choose an **execution environment** (the cloud Sandbox or an online BYOC Runner; "Auto" is not available), then click **Authorize** or **Reauthorize** and finish in the browser window, with no tokens to copy. For OAuth services reachable only from an internal network, choose a Runner that can reach them. The last environment that authorized successfully and is still online is preselected.
+- **Member authorization (key)**: click **Enter Key** or **Update Key**.
+- **Revoke**: deletes your saved credential.
## Management & Inspection
----
-
-The MCP list displays each server's **name** (including its AI description), **scope** (Shared or team name), **transport**, an **enabled** toggle, and an **actions** column — the list only contains MCP servers you have added to the account; the built-in Flashduty MCP server is injected by the runtime and does not appear in this list, see "Inspection" below. The scope filter bar at the top lets you switch between All / Shared / Team views, and the search box to its right filters the list by keywords in the name, description, transport, or URL.
+The MCP list shows each server you added with its name and description, scope (Shared or team), transport and enabled state. You can filter by All / Shared / Team and search by name, description, transport or URL. The built-in Flashduty MCP server is not listed.
Toggle the switch in the list. Only **enabled** servers are available to the agent; disabled servers are invisible to agents and cannot be called.
- A disabled connector (any status other than `enabled`) is **not reported as connected** by the connect entry point: opening its **Connect** dialog shows "**Connector disabled**" and "This connector is disabled, so AI SRE can't use it. An account owner or admin has to re-enable it under Plugins → MCP.", with an **Open Plugins → MCP** button that jumps to that connector's row. An account owner or admin re-enables it there with the **Enable** toggle. Disabled connectors also drop out of the **Enabled** strip on Plugins → Overview.
+ A disabled connector cannot be used from the **Connect** entry and does not appear in the enabled section of **Plugins → Overview**; an account owner or admin must re-enable it under **Plugins → MCP**.
Click the edit button (or click the row) to open the form. You can modify the name, transport, description, endpoint/command, authorization mode, and scope. If you do not have edit permission, the form opens in **read-only** mode with an explanation.
@@ -210,33 +191,29 @@ The MCP list displays each server's **name** (including its AI description), **s
### Inspection: Viewing the Tools a Server Exposes
-The tools an MCP server exposes are discovered **during a session** by agents on demand — not displayed statically in the console. This is because the same MCP server may have different reachability and tool sets across different environments (Runners); connection state and tool count are per-environment properties, not global ones.
+The console does not list the tools an MCP server exposes, because the same server may be reachable with different tools in different environments.
To confirm which tools a given MCP server actually exposes in a particular environment, the most direct way is to ask the agent in **Chat** to list that server's tools — it will show the tools and how to use each one. See [Conversations](/en/ai-sre/sessions).
-Reading Flashduty incidents, alerts, and other data is a **built-in** agent capability: the **Flashduty MCP server** is injected directly into the agent at the start of every session by the runtime, bypassing this page's MCP server list API — it does not appear in the server list above, and there is nothing to configure, enable, or view here for it. This capability is maintained by the platform and is available to every account by default.
+Reading Flashduty incidents, alerts and other data is a **built-in** agent capability (the Flashduty MCP server). It is available by default and is not configured here.
### Cross-environment connectors
-An MCP server can be bound to execution environments **other than the current session's own**. That session cannot call it directly — execution environments do not share a network, and a tool call is always made from the session's own environment. But the agent does not conclude the connector is absent:
+An MCP server may be bound to execution environments **other than the current session's**. Because environments do not share a network, the session cannot call it directly, but the agent knows it exists:
-- **The agent knows about it from the start**: at session start the agent sees the connectors that are connected but bound to another execution environment — their names, what they do, and **which execution environments they run in**. The same connector can resolve to different names in different environments, so directory entries carry a team annotation to keep them distinguishable.
-- **A search states where it can run**: when a search matches such a connector, the result carries the environments it runs in.
-- **Asking for it by name is not answered with "not found"**: when the agent looks a connector up by name, it gets an explanation that the connector is connected but bound to another execution environment, plus how to use it — rather than being told the account has no such thing.
-- **The way to use it is to dispatch a subagent into that environment**: the agent hands the work to a subagent running in the target execution environment (`agent_dispatch`'s `environment` argument — see [Agent](/en/ai-sre/agents)), and that subagent discovers and calls the server's tools on its own side, then brings the results back into the conversation.
-- **Only environments it can actually dispatch to are listed**: the targets are **account-scope Runners** plus the Runners of the **team the current session is bound to**, and online ones (plus the bound cloud environment). Environments that are offline, never connected, deleted, or scoped to a team this session cannot dispatch to are annotated with the reason, and the agent says so plainly instead of pretending the call is possible.
-- **Only the conversation's main session sees this directory**: a dispatched subagent has no dispatch capability of its own and reports only the connectors it can call directly in its own environment; when another environment is needed, the subagent reports back to its parent.
+- The agent sees the connector's name, purpose and available environments, and asking for it by name gets an explanation rather than "not found".
+- The agent dispatches a subagent into the target environment to call it (see [Agents](/en/ai-sre/agents)) and brings the result back to the conversation.
+- Only **online** account-level Runners, Runners of the team bound to the session, and the bound cloud environment are valid targets; for others the agent explains it cannot use them right now.
+- Only the main session can dispatch this way; subagents cannot dispatch further.
Conversely, to make a connector directly usable **here**, add the current environment to that server's Execution Environment list (provided the server is reachable from this session). See [Environments (BYOC)](/en/ai-sre/environments) for how the environments themselves differ.
## Scope
----
-
MCP shares the same **two-level scope** model as other resources (Skills, Knowledge, Agents, Environments), divided into Shared scope and team scope:
| Scope | Visibility |
@@ -244,15 +221,18 @@ MCP shares the same **two-level scope** model as other resources (Skills, Knowle
| Shared | Visible to all members of the account |
| Team-level | Visible only to members of that team |
-**Edit permissions**: team-level MCP servers can be acted on only by members of that team — organization admins must join the team first; Shared-scope MCP servers can be acted on only by the account owner or admins. There is no creator-retains-rights exception. When you lack edit permission, the toggle and action buttons for that row appear as **read-only**.
+**Edit permissions**: team-level MCP servers can be edited only by members of that team (organization admins must join the team first); Shared-scope servers only by account owners or admins.
-**Create and reassign**: to create a new team-level MCP server, you must belong to the target team; Shared-scope creation is limited to the account owner or admins. **Marketplace installs are the exception**: they are fixed to Shared scope and started by the installer, and any account member can install an ordinary template (no owner/admin permission required). One class of template is the exception to that exception: when a template in a **member authorization** mode (key or OAuth) also asks for a free-form address / host parameter, the installer would effectively decide where other members' credentials are sent — so, to keep other members' credentials from flowing to a host the installer chose, installing and connecting that template is **limited to the account owner or admins**. A regular member sees no **+** on that row (and cannot click it), and opening its **Connect** dialog directly says "You don't have permission to install this. Ask your account owner or an admin." When editing an existing MCP server, the account owner or admins can move it to any team to recover resources left behind by empty teams or departed members; regular members can move it only to teams they belong to. However, **Marketplace-installed MCP servers cannot be reassigned to a team** — their scope is shown as a fixed Shared value in the edit form. A small number of legacy team-scoped Marketplace rows from earlier versions can still be changed back to Shared scope; the reverse is not allowed. **Promoting to Shared scope carries the same gate as Shared-scope creation: only the account owner or admins can do it** — a regular member is denied even for servers belonging to their own team, and the prompt now reads "ask an admin to make it shared" instead of naming the owning team.
+**Create and reassign**:
-**Runtime visibility**: At session start, the agent is offered only **Shared-scope** MCP servers and servers belonging to the **team bound to the current session**. Once the agent reads a team's knowledge during an investigation, that team's MCP servers and Skills are mounted into the session on demand. **The account is the only security boundary at runtime; the team is an ownership and editing tag only.**
+- Creating a team-level server requires membership in that team; creating a Shared-scope server is limited to account owners or admins.
+- Marketplace installs are always Shared scope and any member can install them. Exception: templates in member authorization mode that also take a free-form address can be installed only by account owners or admins, so that other members' credentials are not sent to an address chosen by the installer.
+- Account owners or admins can move a server to any team (for taking over resources of empty teams or departed members); regular members can move it only to teams they belong to.
+- Marketplace-installed servers cannot be moved to a team; a few early team-level installs can be changed back to Shared scope by an account owner or admin.
-## Related Pages
+**Runtime visibility**: at session start, the agent can use only Shared-scope MCP servers and those of the team bound to the session; servers and Skills of another team are loaded on demand after the agent reads that team's knowledge. **The account is the only security boundary at runtime; teams only determine ownership and edit permissions.**
----
+## Related Pages
@@ -264,7 +244,7 @@ MCP shares the same **two-level scope** model as other resources (Skills, Knowle
stdio MCP servers must run on a BYOC Runner; learn the difference between cloud Sandbox and self-hosted environments.
-
+
Observe how agents inspect and invoke MCP tools during a session.
diff --git a/en/ai-sre/memory.mdx b/en/ai-sre/memory.mdx
index 36dcc3d4..a7f45ef2 100644
--- a/en/ai-sre/memory.mdx
+++ b/en/ai-sre/memory.mdx
@@ -2,25 +2,19 @@
title: Learn about Memory
description: Memory is the preferences, procedures, facts, and lessons the AI notes in conversations, and later conversations use them automatically. View and edit it at AI SRE → Customize → Context → Memory. Personal and team scopes stay separate.
keywords: ["AI SRE", "memory", "preference", "context", "personal", "team"]
-sidebarTitle: Learn about Memory
+sidebarTitle: "Memory"
---
-
- AI SRE is available to accounts on an On-call Pro or higher subscription, with no application needed. Starting September 16, 2026, 08:00 Beijing time, it must be activated in the console before use and is billed on actual usage; see [billing terms](/en/compliance/ai-sre-credit-package-purchase-agreement).
-
+> AI SRE must be activated in the console, is available on On-call Pro or higher, and is billed on actual usage. See [Activation and billing](/en/ai-sre/overview#activation-and-billing).
## Overview
----
-
A new session starts from the memory files already in the current scope. If you had to re-explain your habits, where to look first for a kind of failure, or why a previous approach was abandoned, troubleshooting would begin with the same background every time. Memory keeps those points as Markdown files and later sessions reuse them.
Memory is not [knowledge](/en/ai-sre/knowledge). People maintain knowledge, and it describes how the environment runs. The system organizes memory: preferences, procedures, facts, and lessons kept from conversations. Both belong to the console's [Context](/en/ai-sre/context) group, but each has its own page: **AI SRE → Customize → Context → Memory**.
## Memory Types
----
-
Each memory file starts with a name, a one-line description, and a type. There are four types:
| Type | What it is for |
@@ -34,8 +28,6 @@ Where the file is saved follows the session. A session bound to a team writes th
## How Memory Is Created
----
-
Memory arrives in two ways:
- **You ask for it.** In the conversation, tell the assistant to remember, change, or forget something. It writes or updates the matching memory file.
@@ -45,16 +37,12 @@ Both ways write into the scope of the current session.
## How the Agent Uses Memory
----
-
When a session starts, the memory files in the current scope are ready. The assistant sees each file's name and description first, and opens the body when it needs the detail. A session bound to a team uses that team's memory. A session with no team uses your personal memory.
The four types carry different weight: procedure, fact, and lesson are past records that must be checked against the current situation before use; preference is a request you made explicitly, followed within its stated scope, and it wins when it conflicts with a Skill's or tool's default behavior.
## Scope & Isolation
----
-
Memory has only two scopes, personal and team. There is no account-level memory, and cross-account reads are rejected outright.
| Dimension | personal | team |
@@ -68,8 +56,6 @@ This isolation follows the same permission model as other AI SRE resources: team
## View and edit it in the console
----
-
Go to **AI SRE → Customize → Context → Memory**.
- **Pick a scope**: switch between **Personal** and **Team** at the top; for Team, pick one of your teams from the dropdown. There is no Shared (account-level) memory. The scope and team are kept in the page URL, so a refresh or a shared link opens the same set of memories.
@@ -85,8 +71,6 @@ With edit permission, an input box sits below the body (placeholder: "What shoul
## Related pages
----
-
How memory and knowledge differ, and what personal, team, and shared scopes each contain.
diff --git a/en/ai-sre/overview.mdx b/en/ai-sre/overview.mdx
index 602c2294..75eedf22 100644
--- a/en/ai-sre/overview.mdx
+++ b/en/ai-sre/overview.mdx
@@ -11,8 +11,6 @@ sidebarTitle: Overview
## What Is AI SRE
----
-
AI SRE is Flashduty's autonomous SRE agent platform. You give the AI instructions through conversation, and it independently investigates incidents, diagnoses root causes, calls tools to run diagnostics, and captures the operational knowledge gained from each investigation for future reuse.
It is not a simple Q&A chatbot — it is a **hands-on troubleshooting worker**: it plans its own steps, reads and writes files, queries monitoring and logs, executes commands, calls external tools (MCP), and delegates subtasks when needed, ultimately delivering conclusions backed by a full investigation trail.
@@ -30,8 +28,6 @@ AI SRE is deeply integrated with Flashduty's incident response system. When Flas
## Typical Use Cases
----
-
AI SRE is more than a chat box in the console — it covers multiple collaboration entry points across the full lifecycle from incident trigger to retrospective:
@@ -51,15 +47,13 @@ AI SRE is more than a chat box in the console — it covers multiple collaborati
## Activation and billing
----
-
AI SRE is available to accounts holding a **valid (enabled)** On-call Pro or higher subscription, with no application needed.
AI SRE is billed on actual usage starting September 16, 2026, 08:00 Beijing time, settled in credits (1 credit = ¥1); usage before that date isn't charged. Metered items are model usage, sandbox online time, and web search. Activation is free, eligible accounts get gift credits each billing period, and you can also buy credit packages (1,000 / 5,000 / 20,000 credits for ¥950 / ¥4,500 / ¥17,000, valid 365 days from payment). Pay-as-you-go is off by default; an admin can turn it on and optionally set a per-period cap. Full terms: [AI SRE Credit Package Purchase Agreement](/en/compliance/ai-sre-credit-package-purchase-agreement).
- When the gift credits, credit packages, and wallet balance are all used up, AI SRE refuses new conversation requests: the composer is disabled and a **non-dismissible** notice stays pinned above it (the text comes from the server and covers all four shapes — "not activated yet", "turned off", "this period's allowance is spent", and "the wallet is empty"), with a **Go to AI SRE billing** button that opens the billing center (`/wallet/plan?product=ai-sre`). An admin turns on pay-as-you-go, buys a credit package, or tops up the wallet there; once the state recovers, you can continue the conversation. A lapsed subscription, or a plan that doesn't include AI SRE, is a different kind of block whose banner button becomes **Go to On-Call subscription** — see [When the subscription lapses](#when-the-subscription-lapses).
+ When gift credits, credit packages and the wallet balance are all used up, AI SRE pauses new conversations and shows the reason above the composer with a **Go to AI SRE billing** button. An admin can turn on pay-as-you-go, buy a credit package or top up there, and you can then continue.
Production changes, restarts, rollbacks, and external notifications all require your confirmation before they execute.
@@ -68,58 +62,33 @@ AI SRE is available to accounts holding a **valid (enabled)** On-call Pro or hig
### Activating and closing AI SRE
-Both directions are self-service on the same card in the console: open the billing center from the left navigation (**Payment** → **Plan**, the page titled "Your Plans") and select the **AI SRE** tab — that is `/wallet/plan?product=ai-sre`, the same destination as the **Go to AI SRE billing** entry in the credits notice. The billing center is available on SaaS only, so On-Premises deployments have no such tab.
+In the console, open **Payment → Plan** and select the **AI SRE** tab to activate or close AI SRE yourself. This is available on SaaS only and requires the **Payment Read** and wallet purchase permissions.
-Opening the page requires **Payment Read**. The **Enable AI SRE** and **Disable AI SRE** buttons additionally require wallet purchase permission (the console's own wording next to the activation entry is "Wallet purchase permission required"); without it the buttons are disabled and hovering shows "You are not authorized for this operation".
-
-| Action | Button | Cost | Result |
-|--------|--------|------|--------|
-| Enable | **Enable AI SRE** (shown while the card reads **Not enabled**) | ¥0, nothing is charged | Places a ¥0 order; once it completes, the card reads **Enabled** |
-| Disable | **Disable AI SRE** (shown while the card reads **Enabled**) | ¥0, nothing is charged and nothing is refunded | Places a ¥0 unsubscribe order; the order completes once the server confirms the service is off, and the card reads **Not enabled** again |
-
-**Disable AI SRE** first opens a confirmation dialog, "Disable AI SRE?", whose body reads "After you disable it, this account can no longer start AI SRE investigations. Purchased credit packages and gift credits are retained, and you can enable it again at any time." Once you confirm, the console polls the order status and reports one of the following:
-
-| Order outcome | Console message |
-|---------------|-----------------|
-| Completed | AI SRE disabled |
-| Still no terminal state after about a minute of polling (order still being processed) | Your request to disable AI SRE was submitted and is still being processed. Refresh in a moment to see the result. |
-| Failed | Failed to disable AI SRE. Please try again. |
-
-What disabling changes:
+| Action | Cost | Result |
+|------|------|------|
+| **Enable AI SRE** | Free | AI SRE is available right away |
+| **Disable AI SRE** | No charge and no refund | The account can no longer start new investigations; a run already in progress is not interrupted and its usage is still metered |
-- **No new investigations**: after you disable it, this account can no longer start AI SRE investigations, and a refused request gets the server's own sentence, "AI SRE is turned off for this account. Turn it back on to continue." (the credits overview reports `blocked_reason=turned_off`). A top-level run that has already started is not interrupted, and the usage it goes on to produce is still metered.
-- **Credits and packages are retained**: neither the gift credits nor the balance and validity of purchased credit packages are cleared by disabling the service, and they are usable again after you re-enable it (gift credits themselves remain usable only within the billing period they were granted for, per the Agreement). Re-enabling is simply running **Enable AI SRE** again — nothing else is required.
-- **Nothing is charged or refunded**: disabling itself costs nothing and triggers no refund; package refunds still follow the [AI SRE Credit Package Purchase Agreement](/en/compliance/ai-sre-credit-package-purchase-agreement).
-- **Arrears and a lapsed subscription do not block it**: disabling checks neither the wallet balance nor a valid On-call subscription, so an account in arrears or with a lapsed subscription can still turn the service off.
+After closing:
-
-Disabling requires the server to confirm the service is off. If that confirmation fails, the order is not completed and the console shows "Failed to disable AI SRE. Please try again." — retry directly; nothing else has to be done first.
-
+- Gift credits and purchased credit packages **keep** their balances and validity and are available again when you re-activate (gift credits are still valid only in the billing period they were granted for).
+- Credit package refunds follow the [AI SRE Credits Package Purchase Agreement](/en/compliance/ai-sre-credit-package-purchase-agreement).
+- You can close AI SRE even with an overdue balance or a lapsed subscription.
+- If closing fails, simply retry.
### When the subscription lapses
-Every request re-checks the account's On-call subscription, so a subscription that lapses pauses AI SRE immediately. The interface shows the server's own sentence, and distinguishes two cases whose remedies differ — don't apply the wrong one:
+AI SRE requires an **active** On-call Pro or higher subscription. When that is not the case, AI SRE pauses immediately, and the console, IM, automations and A2A calls report why:
-| Case | Notice | Remedy |
-|------|--------|--------|
-| The subscription's tier is Pro or higher, but the subscription isn't enabled (expired, or disabled for any other reason) | "This account's On-call subscription is no longer active (expired or disabled), so AI SRE is paused. It resumes automatically once the On-call subscription is renewed." | Renew the On-call subscription |
-| The account has no subscription, or its subscription is below Pro (whether or not it is enabled) | "AI SRE requires the On-call Professional plan. Upgrade the subscription to continue." | Upgrade to Pro or higher |
+| Situation | What to do |
+|------|----------|
+| A Pro or higher subscription has expired or been disabled | Renew the On-call subscription |
+| No subscription, or a plan below Pro | Upgrade to Pro or higher |
-The notice also appears in the console chat page, in IM sessions, in automation run records, and in A2A call errors; the credits overview reports the same sentence as `blocked_reason=no_license`.
-
-On the console chat page it stays pinned above the composer, and the button on its right **follows the blocking reason**:
-
-| Blocking reason | Button | Destination |
-|-----------------|--------|-------------|
-| The subscription lapsed, or the plan doesn't include AI SRE (`blocked_reason=no_license` — the two cases on this page) | **Go to On-Call subscription** | The page that sells the On-call subscription, `/wallet/plan?product=oncall` |
-| Everything else (not activated yet, turned off, this period's allowance spent, wallet empty) | **Go to AI SRE billing** | The page that sells AI SRE credits, `/wallet/plan?product=ai-sre` |
-
-A subscription block never points at AI SRE billing — that page sells AI SRE credits, which fixes nothing about the subscription. Recovery needs no re-activation: once the renewal or upgrade lands, the next request is admitted automatically.
+In the console the button next to the notice is then **Go to On-Call subscription** (for other reasons it is **Go to AI SRE billing**). After renewing or upgrading, AI SRE resumes automatically without re-activation.
## Core Capabilities
----
-
AI SRE is built around "conversational troubleshooting + knowledge accumulation + autonomous execution," with every capability configurable and manageable from the console.
@@ -157,8 +126,6 @@ AI SRE is built around "conversational troubleshooting + knowledge accumulation
## Console Navigation
----
-
After entering AI SRE, the left sidebar has four entries (menu names match the console):
| Entry | Purpose |
@@ -182,16 +149,12 @@ Visibility of each area is determined by your access permissions in the account:
## Quick Start
----
-
For the full walkthrough from activating access to finishing your first investigation, see [Quickstart](/en/ai-sre/quickstart).
## Next Steps
----
-
-
+
Learn about sessions, streaming output, cancellation and context compaction, and how to launch an investigation from an incident.
diff --git a/en/ai-sre/quickstart.mdx b/en/ai-sre/quickstart.mdx
index d82e2ad6..1dc1c3ba 100644
--- a/en/ai-sre/quickstart.mdx
+++ b/en/ai-sre/quickstart.mdx
@@ -11,8 +11,6 @@ sidebarTitle: Quick Start
## Key Concepts (30 Seconds)
----
-
Four things to know before you start:
| Concept | What it is |
@@ -24,8 +22,6 @@ Four things to know before you start:
## Three Entry Points
----
-
There's no single way into AI SRE — start from wherever you already are:
### Chat
@@ -42,8 +38,6 @@ Where incidents actually happen. In any Slack, Feishu, DingTalk, or WeCom group
## Your First Investigation (~5 min)
----
-
Prerequisite: at least one incident in your account. AI SRE needs no application; starting September 16, 2026, 08:00 Beijing time, activate it in the console first.
If you don't have an incident on hand right now, skip ahead to "Growing It Into Your SRE" below.
@@ -80,8 +74,6 @@ If you don't have an incident on hand right now, skip ahead to "Growing It Into
## Growing It Into Your SRE (As Needed)
----
-
Your first investigation is just the starting point. From here you can make analysis automatic, and keep sharpening its diagnoses — the latter depends on how much it knows about your systems and how much real data it can reach. All of this builds up over time, not all at once.
### Get every new incident analyzed automatically
@@ -119,8 +111,6 @@ Permission rules (limiting what the agent may do on that machine), upgrades, and
## What's Next
----
-
What AI SRE is, its full capability set, and console navigation.
diff --git a/en/ai-sre/sandbox.mdx b/en/ai-sre/sandbox.mdx
index 00868f03..a317c4e4 100644
--- a/en/ai-sre/sandbox.mdx
+++ b/en/ai-sre/sandbox.mdx
@@ -5,14 +5,10 @@ keywords: ["AI SRE", "cloud sandbox", "Sandbox", "environment", "fallback", "egr
sidebarTitle: Sandbox
---
-
- AI SRE is available to accounts on an On-call Pro or higher subscription, with no application needed. Starting September 16, 2026, 08:00 Beijing time, it must be activated in the console before use and is billed on actual usage; see [billing terms](/en/compliance/ai-sre-credit-package-purchase-agreement).
-
+> AI SRE must be activated in the console, is available on On-call Pro or higher, and is billed on actual usage. See [Activation and billing](/en/ai-sre/overview#activation-and-billing).
## Overview
----
-
The **cloud sandbox** is a **temporary execution environment** managed by Flashduty — an isolated, ready-to-use container. The AI SRE agent's tool calls (running commands, reading and writing files, running Skills, connecting to MCP) all happen inside it, and you **don't have to install or maintain anything**.
It is AI SRE's **default fallback**: when no usable self-hosted Runner ([BYOC Runner](/en/ai-sre/environments#byoc-runner)) is online for the current member, sessions automatically run in the cloud sandbox; you can also **pin a session to it manually**.
@@ -30,8 +26,6 @@ The cloud sandbox executes on the hosting provider's serverless platform, in **H
## When to use the cloud sandbox
----
-
The cloud sandbox is best for **investigations that don't depend on your private network**, and for getting started quickly:
- **Quick start / demos**: you haven't deployed a Runner yet and want to try AI SRE's troubleshooting first;
@@ -44,8 +38,6 @@ The cloud sandbox **cannot reach your private network**: its egress is restricte
## Using it in a session
----
-
The **environment selector** at the bottom of the chat box decides where the session executes. Two of its options relate to the cloud sandbox:
| Option | Behavior |
@@ -59,8 +51,6 @@ The environment choice is **locked once per session**: the environment determine
## Cloud sandbox vs. self-hosted Runner
----
-
| Dimension | Cloud sandbox | Self-hosted Runner ([BYOC Runner](/en/ai-sre/environments#byoc-runner)) |
|---|---|---|
| Deployment | No install, system-managed | Deploy a persistent process on your own machine |
@@ -75,13 +65,11 @@ The two aren't mutually exclusive: keep sessions on **Auto** day to day — they
## Related pages
----
-
Deploy a persistent Runner on your own machine so investigations reach your private network.
-
+
See the execution environment and status bound to a session.
diff --git a/en/ai-sre/sessions.mdx b/en/ai-sre/sessions.mdx
index 19ce4245..fd3e5760 100644
--- a/en/ai-sre/sessions.mdx
+++ b/en/ai-sre/sessions.mdx
@@ -1,545 +1,333 @@
---
-title: Console
+title: "Console Chat"
description: An AI SRE session holds one complete conversation between you and the agent, including messages, streaming responses, tool calls, and artifacts. This page covers creating and managing sessions, sharing, sending messages, the task panel and background tasks, previewing artifacts, session forking, context compaction, team binding, and session data export.
keywords: ["AI SRE", "session", "chat", "streaming response", "tool call", "task panel", "background tasks", "Artifacts", "Fork", "context compaction", "team binding", "export", "NDJSON"]
-sidebarTitle: Console
+sidebarTitle: "Console Chat"
---
-
- AI SRE is available to accounts on an On-call Pro or higher subscription, with no application needed. Starting September 16, 2026, 08:00 Beijing time, it must be activated in the console before use and is billed on actual usage; see [billing terms](/en/compliance/ai-sre-credit-package-purchase-agreement).
-
+> AI SRE must be activated in the console, is available on On-call Pro or higher, and is billed on actual usage. See [Activation and billing](/en/ai-sre/overview#activation-and-billing).
## Overview
----
-
A session is one complete conversation between you and AI SRE. It holds every message you send, the agent's streaming replies, tool calls made along the way, and any artifacts the agent produces (such as code, reports, charts, or Skill archives).
-Each session is fully independent, with its own context, bound team, and environment. You switch between sessions in the left sidebar, and exchange messages, read replies, and view artifacts in the central chat area.
-
-
-Sessions are isolated from one another: context, bound team, and environment do not affect each other. Switching sessions does not interrupt a turn that is already running — AI SRE keeps writing progress to the session, so when you return you can still see the streaming output.
-
+Each session is isolated, with its own context, bound team, and environment. You switch between sessions in the left sidebar, and exchange messages, read replies, and view artifacts in the central chat area. Switching sessions does not interrupt a running turn; when you come back, the streaming output is still there.
## Creating and Managing Sessions
----
-
-The left sidebar is the single entry point for sessions. Click **New Chat** to start a fresh session. The list is sorted by most recent activity in descending order; only the most recent entries are shown initially, and older history is revealed incrementally with **Show more**.
+Click **New Chat** in the left sidebar to start a session. The list is sorted by recent activity; click **Show more** for older sessions.
-In a blank AI SRE session, four scenario suggestion cards appear above the composer: **Investigate an incident**, **Query data with natural language**, **Reduce alert noise**, and **Schedule an automated inspection**. Selecting a card only fills the composer; it does not send the prompt. You can edit it before pressing Enter.
+A new session shows four suggestion cards above the input: **Investigate an incident**, **Query data with natural language**, **Reduce alert noise** and **Schedule an automated inspection**. Clicking a card fills in a prompt you can edit before sending.
### Search and Filter
-
-
- The search box at the top filters sessions by name. When there are no results, it displays **No matching chats found**.
-
-
- Click the **Filter** icon in the upper-right corner of the list to open the filter panel and combine the dimensions below. When any non-default filter is active, a small dot appears on the filter button as a reminder.
-
-
-
-Dimensions available in the filter panel:
+The search box filters by session name. Click the **Filter** icon at the top right of the list to combine these filters (a dot on the icon means filters are active):
-| Dimension | Options | Notes |
-|---|---|---|
-| Scope | All / Personal / Team | After selecting **Team**, switch between **My teams / Selected teams** (default: **My teams**); only **Selected teams** expands the inline list where you can search and multi-select teams you belong to |
-| Creator | All / Started by me / Selected members | Narrows results by who started the session: **Started by me** shows only sessions you created; **Selected members** expands a searchable member list (up to 50 loaded at a time, with distinct empty, no-match, and load-failure states) and keeps sessions started by any of the picked members — picking none is the same as not filtering by creator. This dimension appears only when **Scope** is not **Personal** |
-| Status | Active / Archived / All | Defaults to showing only **Active** sessions; switch to **Archived** to view archived sessions |
-| Recent activity | All / 24 hours / 7 days / 30 days | Narrows results by the session's most recent activity time |
-
-The panel footer provides **Reset** (restore default filters) and **Done** (close the panel).
+| Filter | Options |
+|---|---|
+| Scope | All / Personal / Team (for Team, **My teams** or specific teams you belong to) |
+| Source | All / Started by me / Selected members (hidden when Scope is Personal) |
+| Status | Active (default) / Archived / All |
+| Recent activity | All / 24 hours / 7 days / 30 days |
### Session Visibility and Permissions
-The account is the hard access boundary for sessions: sessions are never accessible across accounts. Within the same account, personal sessions and team sessions use different rules for reading, continuing, and managing the conversation:
+Sessions are never accessible across accounts. Within an account:
-| Session type | Can read / continue the conversation | Can rename, archive, delete, or attach an incident |
+| Session type | Can read / continue | Can rename, archive, delete or link to an incident |
|---|---|---|
-| Personal session (no team bound) | Only the creator | Only the creator |
-| Team session (team bound) | Members in the same account who have the session ID | Session creator, account owner / admin, or members of the bound team |
+| Personal session (no team) | Creator only | Creator only |
+| Team session (bound to a team) | Members of the account who have the session link | Session creator, account Owner / admins, or team members |
-Pinning is a personal preference and does not modify the session itself; if you can read a session, you can pin or unpin it for yourself. Account owners and admins can manage team sessions, but they cannot read or manage another member's personal session.
+Pinning affects only your own list. Account Owners and admins can manage team sessions but cannot read other members' personal sessions.
### Sharing a Session
-The chat page header provides share controls, shown only when you have manage permission on the current session. Click the **Copy share link** button to enable sharing and copy the link to your clipboard (a "Share link copied" toast appears). The link appends a `share_token` to the current session URL, with the token in the URL fragment (after `#`). The share link is **stable**: while sharing stays enabled, copying it again yields the same link.
+If you can manage a session, click **Copy share link** in the chat header.
-| Topic | Details |
-|---|---|
-| Who can share | Members with manage permission on the session — the creator of a personal session, or the creator / account owner / admin / team members of a team session |
-| Who can open it | Members who hold the link and are signed in to the **same account**; the link does not work across accounts or for anonymous visitors |
-| What link holders see | The session opens in **read-only** mode with a "This is a read-only shared session" notice: they can inspect the full context (messages, tool calls, artifacts), and can also open a Subagent dispatch chip to view the child session's execution details (also read-only); but the composer is replaced by the notice — they cannot continue the conversation or modify the original session |
-| How to keep working | Link holders can click **Fork into a new session** to derive their own session and continue from there |
-| How to revoke | Once sharing is enabled, a **Remove share** button appears in the header; clicking it invalidates the link immediately (a "Share removed" toast appears). Re-enabling sharing later generates a new link — the old link is not restored |
-
-Sharing mainly changes the visibility of **personal sessions**: a team session is already readable by any member of the same account who has the session ID (see the table above), whereas a personal session is visible only to its creator by default — a share link is the only way for other members of the account to open it.
+- Only members signed in to the **same account** can open the link; anonymous access is not supported. The link stays the same while sharing is on.
+- People with the link see the whole session **read-only** (including subagent details) and cannot continue it; they can click **Fork into a new session** to continue in their own session.
+- Click **Remove share** to invalidate the link immediately; sharing again creates a new link.
+- Personal sessions are visible only to their creator by default, so a share link is how other members of the account can view one.
-Incognito sessions cannot be shared.
-
-Subagent / A2A child sessions can't have sharing enabled on their own either — sharing can only be enabled on the **root session**. But once you share the root session, link holders can open a Subagent dispatch chip in the read-only view and view the corresponding child session's execution details, also read-only; child sessions are view-only and don't offer **Fork into a new session**. Revoking the root session's share also invalidates access to its child sessions.
+Incognito sessions cannot be shared. Sharing is enabled on the root session only; subagent (Subagent / A2A) sessions cannot be shared on their own.
### Per-Session Actions
-Hover over a session row to reveal the pin and archive actions. A pinned session displays a persistent pin icon to the left of its name.
-
-| Action | Entry point | Notes |
+| Action | Where | Notes |
|---|---|---|
-| Pin / Unpin | Inline pin button on hover | Pinned sessions appear at the top of the list |
-| Archive / Unarchive | Inline archive button on hover | Archived sessions are hidden from the active list by default; switch to **Archived** in the filter to find them |
-| Rename | Click the chat title to edit in place | Press Enter or click away to confirm; press Esc to cancel; maximum 60 characters |
-| Delete | Delete button in the chat header (requires manage permission) | Deletes the session after confirmation; the conversation history cannot be recovered. Deletion also best-effort stops the session's still-running background command / monitor processes — a failed stop does not block the deletion, and no task notifications are sent for it |
+| Pin / unpin | Hover over the session row | Pinned sessions stay at the top |
+| Archive / unarchive | Hover over the session row | Find archived sessions by setting Status to **Archived** |
+| Rename | Click the chat title | Up to 60 characters |
+| Delete | Chat header (requires manage permission) | Cannot be undone; background tasks still running in the session are stopped |
-A new session does not need a manual title: after the first turn completes, the system auto-generates a title server-side from the session's content and pushes it back through the session stream as a `session.renamed` frame, which updates the sidebar and title in place. Until that finishes, a placeholder title derived from your first message is shown so the sidebar never sticks at "Untitled." You can **rename** the session at any time to override the auto-generated title (title limit: 60 characters).
-
-
-Hovering over a session row for a moment shows a tooltip with the full session name, the associated team, and the exact timestamp — useful when the name is truncated and you need to confirm you have the right session.
-
+A new session gets an automatic title after its first turn; you can rename it at any time.
### List Status Indicators
-Each row shows status indicators by priority: while a session is running, only the spinner is shown; otherwise the background-task badge and the unread dot can appear together; when neither applies, the relative time is shown.
-
| Indicator | Meaning |
|---|---|
-| Spinning circle | The agent in this session is running (a turn is in progress or waiting on subtask reports); takes priority over all other indicators |
-| 🔭 + count | The session has that many live background tasks (monitors / background commands) — see "Task Panel and Background Tasks" below |
-| Blue dot (unread) | The agent has produced new content you have not yet viewed; can appear alongside the 🔭 badge |
-| Relative time | When none of the above applies, the relative time of the last activity is shown (e.g. `5m`, `3h`, `3d`) |
-
-Opening a session clears its unread dot.
+| Spinning circle | The agent is running |
+| 🔭 + number | Number of background tasks running — see [Task Panel and Background Tasks](#task-panel-and-background-tasks) |
+| Blue dot | New content you have not seen; cleared when you open the session |
+| Relative time | Last activity (e.g. `5m`, `3h`) |
## Sending Messages and Streaming Responses
----
-
-Type a message in the input box at the bottom and press Enter to send. The input box supports Markdown and slash commands (type `/` to open the command menu) to trigger built-in skills and commands.
-
-When the console publishes a new version, a **version update notice** appears above the input box: "A new version of the console has been published. Refresh the page to continue." Click **Refresh** to reload the page and use the new version; clicking the close button hides the notice, and it will not repeat for the same version (the notice only appears in the full web console, not in embedded mode or on-premises deployments).
+Type a message in the input and press Enter. The input supports Markdown; type `/` for the Skill and command menu. When a new console version is released, a notice above the input asks you to refresh.
### Attachments and Context References
-
- Click the plus button at the lower left of the input box to choose files, or paste images directly. Supported formats include images, PDFs, text / Markdown / CSV / HTML, Office documents (Word / Excel / PowerPoint), and archives (`.zip` / `.rar`), up to **50 MB** per file. HTML files are read as plain text and rendered in the sandbox — any scripts inside them are not executed. Archives are **never parsed into inline text**: the agent receives only the archive's path in the sandbox, so it first inspects the declared listing (`unzip -l` / `bsdtar -tv`) and unpacks the archive in the sandbox to read the contents — a modest archive can expand into a large number of files. A single message can carry at most **9 attachments**, and the total size of all attachments in one message cannot exceed **50 MB**; the **per-file cap** and the **per-message attachment total** are two independent limits that happen to share the same 50 MB value, so don't conflate them. Both limits are validated client-side as soon as you pick the files, and exceeding either shows a corresponding message — at this point the attachments are only staged locally (pending chips) and uploaded together when the message is sent. Screenshots can be pasted directly into the chat.
-
- Extensions not listed above — such as code and config files like `.go`, `.py`, `.yaml` — are also accepted as plain text, as long as the entire file content is valid UTF-8. Empty files are the exception and are still rejected.
-
- Besides individual files, you can **upload a whole folder**: choose **Upload folder** from the plus menu to pick a local folder, or drag a folder straight into the input area. Folders are handled as follows:
+
+ Click the plus button at the bottom left of the input, or paste a screenshot.
- - **File count limit**: a single folder may contain at most **50 files**; a folder over the limit is rejected outright ("This folder exceeds the 50-file limit; please choose a smaller folder") instead of keeping only the first 50. `node_modules` directories and files / directories starting with `.` are silently ignored and don't count toward the limit.
- - **Per-file validation**: every file in the folder is still checked against the single-file rules (50 MB per file, 50 MB total, type validation). Files that fail are skipped, and after you pick a folder the input area shows a "Skipped N files" list naming each file and its skip reason (over 50 MB / over the 50 MB attachment total / not a text file / unsupported file type).
- - **Attachment counting**: the whole folder counts as **1 attachment** in a message, toward the same 9-attachment limit.
- - **Directory structure preserved**: the relative path of every file in the folder (including the top-level folder name) is preserved and staged into the sandbox. The agent sees a path-sorted file listing (an envelope with the file count and total size) rather than the file contents inlined into context; it reads individual files on demand with the read / bash / grep tools inside the sandbox.
-
- **Inline truncation of large files**: apart from archives (which are not parsed — the agent gets only their sandbox path), attachments reach the agent as extracted text. When the extracted text exceeds **64 KB**, only the first **32 KB** is inlined (cut at a valid UTF-8 boundary), and the attachment envelope carries a pointer to the full file staged in the sandbox (like `~/.flashduty/attachments/...`) — if the full content matters, ask the agent to read the file from the sandbox with the read / bash tools; nothing is lost. In addition, PDFs larger than **3 MB** are no longer passed natively to the model; they fall back to text extraction under the same truncation rule.
+ - **Supported types**: images, PDF, text / Markdown / CSV / HTML, Office documents, archives (`.zip` / `.rar`), and any UTF-8 text file (such as `.go`, `.py`, `.yaml`). Empty files are rejected.
+ - **Size and count**: up to **50 MB** per file; up to **9 attachments** per message, **50 MB** in total.
+ - **Folders**: choose **Upload folder** from the plus menu or drag a folder onto the input. A folder can hold up to **50 files** (`node_modules` and dot-files are not counted); a larger folder is rejected as a whole, and individual files that do not qualify are skipped with the reason listed. A folder counts as 1 attachment and keeps its directory structure.
+ - **How the agent reads them**: attachments are provided as text; for text over 64 KB only the beginning is provided directly, and the agent reads the full file from the sandbox when needed. Archives and folders are not expanded up front; the agent unpacks and reads them in the sandbox as needed.
- When you enter AI SRE from an incident, alert, monitor rule, monitor target, datasource, or RUM issue detail page (its **AI fix** button at the top right), the related object is embedded into the input box as a **reference capsule** — a small inline tag indicating the kind of object referenced — an incident, alert event, alert, monitor rule, host, monitor target, datasource, on-call analytics, or RUM issue — that travels with the message so the agent can start its analysis from that object directly. Click the capsule to open the referenced object in a new tab, or click its close button to remove the reference before sending.
+ When you open AI SRE from an incident, alert, alert rule, monitored object, data source or RUM issue (the **AI fix** button), that object is added to the input as a **reference capsule** and sent to the agent with your message. Click the capsule to open the object, or remove it before sending.
- **These entry points also carry a default question**, and the capsule sits at the spot the entry marks inside that sentence. Entering from a monitor target page, for instance, pre-fills "请分析这个监控对象 〈reference capsule〉:基于真实观测数据判断当前是否有问题或隐患,说明依据与影响面,并给出下一步排查或处置建议。请区分已确认事实、合理推断和待确认项;证据不足时明确说明不确定,不要过度归因"; entering from the datasource list pre-fills "调用 〈reference capsule〉 的 overview tool,校验 overview tool 是否可用"; entering from a RUM issue detail page by clicking **AI fix** pre-fills "Use the rum skill to fix this RUM issue 〈reference capsule〉: follow the issue-fix workflow to fetch the issue context, then locate the failing code in the repositories linked to the application. Only when the root cause is confirmed and you are confident in the change, create a branch and open a Draft PR that links this issue in its description; otherwise give the analysis and fix suggestions without opening a PR. Never push directly to the default branch. Distinguish confirmed facts, reasonable inferences, and items to confirm.", and that button only appears when AI SRE is enabled for the account. The prefill is only a draft — edit it, delete it, or send it as-is.
+ These entry points usually pre-fill a question as well (for example, asking the agent to separate confirmed facts from inferences); edit it as you like before sending. No question is pre-filled when several references are brought in at once.
- **A handoff carrying exactly one reference pre-fills its question**: when the merged context refs resolve to a single ref that carries the entry's default question, the input box is pre-filled with that question and the `[[ref]]` placeholder becomes the reference capsule. Clicking **AI analysis** on several incidents from the incident list, for example, pre-fills "Batch-analyze these incidents 〈reference capsule〉: first determine how they relate to each other (a shared root cause, a cascading chain, or fully independent) and group them accordingly; then give the likely root cause and impact for each group; finally give an overall remediation recommendation with priority. Fetch a single incident's details with tools only when needed, rather than expanding every incident up front. Separate confirmed facts, reasonable inferences, and open questions; state clearly when the evidence is insufficient, and never claim to have performed actions that were not performed.", with the capsule titled "Incident list (N)". A handoff carrying several references pre-fills nothing and leaves the input box as it is. A single message can carry multiple references. Besides objects carried in automatically from a related page, you can also type `@` directly in any session's input box to trigger an incident search dropdown (supporting fuzzy keyword search and a list of recent incidents); selecting one inserts the same kind of reference capsule — a standalone entry point available at any time. Typing an email address does not false-trigger it: when the `@` directly follows an email-address character (a letter, a digit, or one of `._%+-`), the picker does not open; an `@` after a space or adjacent to Chinese text still triggers it.
+ In any session, type `@` to search incidents and insert a reference. Typing an email address does not trigger the search.
-
- When a session starts, the knowledge and skills for the bound team are loaded automatically. See Knowledge and Skills for details.
+
+ When a session starts, knowledge and Skills for the bound team are loaded automatically; see Knowledge and Skills.
### Real-Time Streaming Output
-After you send a message, the agent's reply is streamed back in real time — text appears as it is generated, and tool calls and reasoning steps are rendered as they occur.
-
-The moment you send, the frontend optimistically marks the turn as "running"; the backend's running status takes over after roughly 300 ms, so the running state is not lost even if you navigate away and return.
+The agent's reply streams in real time, including text, tool calls and reasoning. The run state is kept if you switch pages and come back.
-While a turn is running, **the Send button changes to a Stop button**. Clicking Stop immediately interrupts the current turn: the UI reflects this right away, and the interrupted turn is labeled "Interrupted" and remains visible after a page refresh.
-
-
-
-The session stream pushes progress as **frames**, and every frame may carry `is_error` and `error_code` to mark a **runtime failure**. The test is deliberately narrow: a frame only carries them once the runtime has converted a real failure into a user-facing error and stamped that marker on the persisted event row. **The platform's internal control rows (bookkeeping events such as turn settlement and automation turn outcomes) and raw provider / model error text never enter this path.** So a frame with an `error_code` can be consumed as "a runtime error the platform is exposing to the user"; conversely, the absence of these fields does not mean a frame carries no internal diagnostics. This is not the same thing as the `error` line in [Session data export](#session-data-export) below, which reports the export stream itself failing: `is_error` / `error_code` ride on ordinary event frames, while `error` is a separate line appended when the stream itself breaks.
+While a turn runs, the Send button becomes a **Stop** button. Stopping interrupts the turn immediately and marks it as interrupted.
### Queueing Messages While Running
-The input box remains active while a turn is running: you can keep typing and send messages, which are queued and executed in order after the current turn completes. Queued messages appear in a collapsible card above the input box, with a header showing the queue count (e.g. "3 queued"); each queued message can be edited or removed individually, and when more than one message is queued, the card also offers a **Clear all** action in its top-right corner.
-
-The queue is authoritative server-side: messages you have sent but the agent (actor) has not read yet live in the server-side session queue, projected by the `pending_messages` field of the `POST /safari/session/get` response (in execution order). Before the agent starts processing one, you can **withdraw** it — the endpoint is `POST /safari/session/message/cancel`, whose request body carries `session_id` and `invocation_id` (the call ID the 202 ack / `user_message_enqueued` frame handed you when the message was sent); the response's `result` field tells you what happened:
-
-| Result | Meaning |
-|---|---|
-| `removed` | The message was removed from the queue and will **never be executed**; the server pushes a `user_message_cancelled` frame to every subscriber, and clients drop the corresponding pending bubble |
-| `consumed` | The actor had already read the message — it belongs to the running turn; the withdrawal does not take effect and that turn still executes ("too late") |
-| `forbidden` | Only the message's author may withdraw it; a call by anyone else returns `ErrAccessDenied` |
-
-Withdrawal only touches the waiting queue: an envelope the actor has already read can no longer be withdrawn (it returns `consumed`) — to interrupt a turn that is actually executing, use **Stop**. Only plain human messages can be withdrawn — question answers (`function_response`) and internal-producer envelopes (automation, child-session notifications, parent initial messages) are not included. The capability also applies to queued messages sent through API integration. The caller needs **participate permission** on the session (the same gate as sending a message or interrupting), and only the message's author can actually withdraw it — both conditions must hold for the result to be `removed`.
+You can keep sending messages while a turn runs; they queue and run in order after the current turn. Queued messages appear above the input, where you can edit, remove or **Clear all** of them. Once the agent has started on a message it can no longer be withdrawn; use Stop to interrupt.
### Environment Initialization
-The first time a session runs, an **environment initialization** card appears in the chat stream and steps through how the runtime environment (the sandbox) becomes ready: **set up a cloud container → start the runtime**; if the cloud template carries a setup script, init and reclaim runs add a third phase, **run the setup script** (resuming an existing sandbox never reruns it). The phases run serially, showing only the step currently in progress; once everything is done, the card collapses into a single result line that reflects whether this run created, resumed, or rebuilt the sandbox:
+The first time a session runs, an **environment initialization** card shows the sandbox being prepared and then collapses to one line:
-| Mode | Collapsed label | Meaning |
-|---|---|---|
-| Init | Initialized session | A brand-new cloud container was created for the session |
-| Resume | Resumed session | The previous sandbox was reused, with its files intact |
-| Reclaim | Rebuilt session | The previous sandbox had been reclaimed, so a new container was created |
+| Message | Meaning |
+|---|---|
+| Session initialized | A new cloud sandbox was created |
+| Session restored | The previous sandbox was reused; files are unchanged |
+| Session rebuilt | The previous sandbox had been reclaimed, so a new one was created |
-
-Sessions bound to a self-hosted [BYOC Runner](/en/ai-sre/environments#byoc-runner) skip the cloud phases: the init card shows a single phase — **Connecting to the self-hosted runner** (for init, resume, and reclaim alike) — which becomes **Connected to the self-hosted runner** once it succeeds, then collapses into the same result line. If connecting to the self-hosted runner fails, the card shrinks to a single-line error notice (**Failed to connect to the self-hosted runner**, with the specific reason) and offers no cloud phase-history expansion.
-
+Sessions on a self-hosted [BYOC Runner](/en/ai-sre/environments#byoc-runner) show only the step of connecting to the runner.
-When the previous sandbox was reclaimed after being idle, the card warns: **Previous sandbox was reclaimed after N min idle — saved files were reset**. This means anything previously written to the sandbox filesystem is gone. Persist long-lived outputs by **saving them as an Artifact or to knowledge**, rather than relying on transient sandbox files.
-
-
-
-If an error occurs during initialization, the card switches to a **Session setup failed** error state; click it to expand the phase history and the specific error details. You typically need to retry with a new session, or contact Flashduty support.
+When an idle sandbox is reclaimed, its files are reset. Keep anything you need by **saving it as an Artifact or to knowledge**. If initialization fails, click the card for details; starting a new session usually helps, or contact Flashduty support.
## Tool Calls and Artifacts
----
-
-Tools the agent invokes during a turn (reading and writing files, querying monitors, executing commands, calling MCP tools, etc.) are rendered inline in the conversation as collapsible blocks. Click one to expand and inspect its inputs and outputs; they are collapsed by default to keep the chat readable.
+Tools the agent calls (reading and writing files, querying monitoring, running commands, MCP tools, and so on) are collapsed in the conversation by default; click to see input and output.
### Todo List
-For multi-step tasks, the agent places a clickable progress badge in the chat stream (shaped like "Step X / N," with a ring progress indicator); clicking it expands into a task plan list, with each step carrying a status icon (Pending / In progress / Completed / Cancelled) and a priority tag (High / Medium / Low). If the agent ends its turn while a step is still "In progress," that step is shown as "Paused," signaling that you need to send a new message before it can proceed — it is not still running in the background.
+For tasks with three or more steps, the agent shows a progress badge (such as "Step X / N"); click it to see the task list with each step's status and priority. If the turn ends with a step unfinished, that step shows as paused and continues only after you send a new message.
-The task plan is maintained only on surfaces that actually have someone watching it: `write_todos` (the built-in tool that maintains the list) is available only in console (`web`) and IM sessions — the web panel renders the TodoList card, and the IM side renders it as a progress card. **Automation (`automation`) and API (`api`) sessions do not get the tool**: the agent cannot call `write_todos` there and receives no "keep your todo list current" nudge, so multi-step work runs directly without producing a progress list (an automation run can still be opened in the console to see the full messages and tool calls, but there is no checklist). Dispatched child sessions (Subagent / A2A) are excluded as well — todo state is per-session, and a child writing todos would clobber the parent's list.
-
-A list is only created when the task genuinely is multi-step: **three or more distinct steps** (previously judged as "2+ tool calls," now tightened). Single-step lookups and pure conversation with no investigation behind it produce no list. Session entry kinds are described under "Session entry kind" above.
+Todo lists are available in console and IM sessions only, not in automation, API or subagent sessions.
### Agent Questions
-While troubleshooting, the agent may need you to clarify something, in which case it inserts an interactive question card into the chat stream: single-select (picking an option automatically advances to the next question), multi-select (after checking options you must click **Confirm** / **Next** to proceed), or free-text input (press Enter to submit). The **✕** button in the top-right corner of the card skips the whole question (not shown for required questions); a multi-question batch also shows a "Question i of N" pager, which you can navigate with the ←→ keys or by clicking, and returning to an already-answered question preserves your previous selection. Keyboard shortcuts: ↑↓ to move between options, Enter to confirm, Esc to skip.
+When the agent needs clarification, it adds a question card — single choice, multiple choice or free text. You can use the keyboard (↑↓ to choose, Enter to confirm, Esc to skip); optional questions can be skipped with **✕**.
-**A parked question is auto-skipped by a new message**: when the model is parked on a question card waiting for your answer, sending a new message marks the parked question as skipped — the server writes a `function_response` (`reason=user_replied_with_message`, one entry per question in a batch) **without driving the model**; your new message runs immediately as the next turn, and the model in that turn sees "question skipped + what you said" instead of being blocked by the parked question. Conversely, **a late answer never resumes that question branch**: submitting an answer to a question that already has a user-side response (auto-skipped, or answered from another device) converts the answer into a plain message (rendered as the answer text — e.g. "(skipped)") that joins the next turn — the same question is never resumed twice.
+If you send a new message instead of answering, the question is treated as skipped and your message runs immediately. Answering a question that was already skipped or answered elsewhere sends your answer as a regular message.
### When Authorization Is Required
-When a tool or MCP call is blocked because it lacks credentials or has not completed OAuth authorization, an **"Authorize [resource name] to continue"** card appears inline in the chat stream, in one of two forms:
+When a tool or MCP call needs a credential or OAuth authorization, an **"Authorize [resource name] to continue"** card appears:
-- **Secret-based**: clicking the card's button opens an input field; paste your API key / token and save it, and the task resumes automatically. If a help link is configured, the card also shows "How do I get a key?"
-- **OAuth-based**: click **Authorize** to complete third-party authorization in the popup window. Once authorized, the card's button changes to **Continue task** — you must click it manually to actually resume the blocked tool call.
+- **Secret-based**: click the button, paste the API key or token and save; the task continues automatically.
+- **OAuth-based**: click **Authorize**, complete the third-party authorization, then click **Continue task**. If the authorization link expires, start the task again.
-OAuth authorization links expire. After expiry, the card shows "Authorization link expired, please retrigger the task" — you need to start a new task to get a fresh authorization link.
-
-
-
-Channel differences: only the console (`web`) renders this card. IM and API channels get no card — the agent pastes the OAuth authorize link into its reply as plain text, and you open it in a desktop browser, complete the authorization, then reply "authorized" or "已授权" to continue (continuing is your explicit action, not an automatic OAuth callback side effect); for a secret-type credential there is no safe way to collect it over IM, so the agent tells you to open **this same session in the web console** and **never** asks you to paste the secret into the chat. On the automation channel nobody is watching, so the agent does not wait — it records the missing authorization as a blocker and delivers what it can. See [IM Platforms](/en/ai-sre/im#connections-and-authorization).
+Only the console shows the authorization card. In IM and API sessions the agent posts the OAuth link; finish authorizing in a browser and reply that you have authorized. Secrets must be entered in **this same session in the web console** — **never** paste a secret into the chat. Automation sessions do not wait and list the missing authorization as a blocker. See [IM Platforms](/en/ai-sre/im#connections-and-authorization).
### When a Connection Is Required
-When the agent searches for a capability to fulfil your request (`tool_search`), that search matches no tool at all, and the query happens to name a vendor that **exists in the marketplace catalog but your account has not connected**, a **"Connect [vendor] to continue"** card appears inline in the chat stream: the vendor's icon and name on the left, a **Connect** button on the right, and nothing else.
-
-This means you **don't have to go hunting in the plugins marketplace first**: name the vendor right in the conversation (for example, "connect Datadog for me") and you reach the connection step from there. If the catalog has no connector for that vendor at all, the agent just says so instead of showing a card.
+When you ask the agent to use a vendor that is in the plugin marketplace but not yet connected to your account (for example "connect Datadog for me"), a **"Connect [vendor] to continue"** card appears, so you do not have to look for it in the marketplace first.
-Clicking **Connect** opens that vendor's connect dialog (the same one as in the plugins marketplace: enter credentials, complete authorization and the connection test). Once the connection succeeds, the card flips in place:
-
-| Phase | Card state |
-|---|---|
-| Not connected | Title **"Connect [vendor] to continue"**, the vendor's description underneath, button **Connect** |
-| Connected | Title **"[vendor] connected"**, subtitle "Click Continue task and AI SRE will pick up where it left off", button **Continue task** |
+1. Click **Connect** and fill in credentials and run the connection test in the dialog.
+2. Once connected, the card shows **"[vendor] connected"**; click **Continue task** and the agent resumes the original task.
-Clicking **Continue task** makes the console send "连接已完成,请继续之前的任务。" to the agent on your behalf so it resumes the original task — **closing the connect dialog does not resume the turn by itself**; resuming is always an explicit click from you. After a page reload the card still shows as connected: the console re-derives that from the template's own install state in the account, not from temporary browser state.
-
-In the following cases **no card** appears and the agent just says so in one sentence:
-
-- The account already has a connector for that vendor (in any team, in any environment): the agent says it is connected (or that it must be enabled or its credentials re-entered).
-- Only an account Owner or admin may connect that vendor: the agent says an admin has to do it.
-- The vendor's template requires a self-hosted Runner and this session has no Runner available.
-- The search matched a connected tool — a connect card only appears for "zero matches + the query names an unconnected marketplace template".
+No card appears — the agent explains instead — when the vendor is already connected (it may need enabling or new credentials), only an Owner or admin can connect it, it needs a self-hosted runner and the session has none, or the marketplace has no connector for it.
-Channel differences: only the console (`web`) renders this card. IM and API channels get no card — the agent gives the connect URL as a plain link and asks you to reply "继续" or "continue" once connected, then carries on; on the automation channel nobody is watching, so the agent does not wait — it records the missing connection as a blocker and delivers what it can. The full per-channel behavior is in [IM Platforms](/en/ai-sre/im#connections-and-authorization).
+Only the console shows the connection card. In IM and API sessions the agent posts a link; connect and reply "continue". Automation sessions do not wait and list the missing connection as a blocker. See [IM Platforms](/en/ai-sre/im#connections-and-authorization).
### Subagents
-When the agent delegates a subtask, a clickable **dispatch reference line** appears in the conversation: a status ring, a type badge (Agent / A2A), the subtask's name and current intent, and right-aligned **target execution environment**, status and elapsed time; once finished it adds the tool-call count / token usage / total duration, and on failure a red reason line appears underneath. The environment segment states the location only — the **cloud environment**, or the BYOC Runner's name (just "self-hosted" when no name resolves) — and carries **no status dot**; an A2A delegation (the remote agent executes on its own side) and legacy tasks with no environment binding show no such segment. The reference line is a compact single row and carries **no stop button** — stopping lives in the task panel's detail header (see "Task Panel and Background Tasks" below). Clicking the line opens a subagent session panel on the right, side by side with the main conversation — the main chat area shrinks accordingly rather than being covered by a modal. The panel can be expanded to fill the main area, or collapsed back to the side-by-side layout.
+When the agent delegates work, a subagent line appears in the conversation with its type (Agent / A2A), name, execution environment, status and duration, and afterwards its tool calls, token usage and any failure reason. Click it to open the subagent session side by side; it can be expanded to full screen.
-Besides running, completed, failed, and interrupted, a subtask can also sit in one of two "needs you" states:
+A subagent may also need you:
-- **Awaiting authorization**: an action area unfolds beneath the reference line — click **Authorize** to open the OAuth popup; once authorization completes, the button becomes **Continue task**, and clicking it lets the main agent resume the same task in place instead of starting a new one.
-- **Awaiting input**: the subtask has asked you a question and is parked waiting for an answer; the question text is read on the task's row in the task panel, not inline on the reference line.
+- **Awaiting authorization**: click **Authorize**, then **Continue task**; the subagent resumes the original task.
+- **Awaiting input**: read and answer the subagent's question in the task panel.
-An orphaned subtask (its executor is gone) renders as **Failed**; a task terminated by the platform shows as **Killed**.
+Stop subagents from the task panel. A subagent whose executor was lost shows as **Failed**; one terminated by the platform shows as **Killed**.
### Task Panel and Background Tasks
-Beyond subagents, the agent can push time-consuming work into the background. Tasks dispatched within a session come in three kinds:
-
-| Kind | Dispatched by | Notes |
-|---|---|---|
-| agent | Subagent / A2A subagent dispatch | Has its own child session — see "Subagents" above |
-| shell | The `bash` tool with `run_in_background` | A long one-shot command (build, batch job, data pull); only its completion needs reporting |
-| monitor | The `monitor` tool | A standing watcher task: watches a condition until it hits or reaches its deadline, and the script's output flows back to the agent as event batches; a one-shot delayed action (e.g. "check again in half an hour") is done with a monitor plus `sleep` |
-
-A unified **Tasks** panel on the right side of the session tracks every task of the session, grouped into **Needs you / Running / Finished**. There are three entry points:
-
-- **The tasks button in the chat header**: carries a count badge for "needs you + running" tasks, capped at `9+`; the badge is red when any task needs you (awaiting authorization / awaiting input), and blue when tasks are only running.
-- **The generation status row while a turn is running**: shows the live task count (e.g. "3 tasks · 1 agent needs you"); clicking it opens the same task panel.
-- **The tool row that started a monitor / background bash**: the tool row in the conversation that started a `monitor` or a background command (`bash` with `run_in_background`) — when it is the only tool in its group, that group's header — is itself that task's handle in the transcript: its trailing external-link icon marks it clickable, the tooltip reads **Open task detail**, and clicking it opens that task's detail panel directly. Such rows no longer expand into raw Input/Output (a background bash row used to show only the command, with no status or output). In a read-only shared session the detail opens in read-only mode as well.
-
-Task details differ by kind: clicking an **agent** task opens the child session's execution transcript (see above); clicking a **shell / monitor** task opens its own event-timeline detail, which includes the status (a running task also shows how many seconds ago its last liveness probe landed — probing happens roughly every 30 seconds), run duration, event count, output bytes, the monitor's deadline (standing tasks with no deadline show "Persistent"), the exit code, the full command, and the event timeline in order. **The stop button lives in the detail header** — **Stop task** for shell / monitor tasks and **Stop Subagent** for subagents — and interrupts only that task, without affecting the main session.
+Besides subagents, the agent can run long commands in the background (builds, bulk data pulls) or start monitors that watch a condition until it is met or a deadline passes.
-How this surfaces in the conversation stream:
+Click the **Tasks** button in the chat header to see all tasks in the session, grouped as **Needs you / Running / Finished**. The number on the button counts tasks that need you or are running, and turns red when something needs you. You can also click the line in the conversation that started a task to open its details.
-- A tool line that starts a background command reads **Started background command**; when a turn mixes foreground and background commands, the collapsed tool group counts each category separately (e.g. `Ran 1 command, started 1 background command`).
-- Each time a monitor's condition hits, a 🔭 system line is inlined into the conversation: the first line shows the monitor's description plus a first-line summary of that output batch, and clicking it expands the full batch in place.
-- When a task ends, a terminal line appears with the end state and a result summary, plus the exit code and a note when the task envelope carries them.
-- The `monitor` tool line itself does not expand into input / output — clicking it opens the corresponding task's detail panel, where the bookkeeping it returns (task ID, output file, deadline, and so on) is presented more completely.
+- **Subagent** details show the subagent's transcript.
+- **Background command and monitor** details show status, run time, deadline, exit code, the full command and an event timeline.
+- **Stop task** or **Stop Subagent** in the detail header stops only that task, not the main session.
-Two status indicators related to background tasks:
-
-- **The 🔭 badge on a session list row** means the session has live background tasks (`standing_tasks`; the number is the count). When the session is running, the spinner takes priority.
-- **A session's "running" indicator reflects only agent turns and subagent tasks**: standing monitors / background commands do not keep a session "running" — a session with only standing tasks alive shows as idle.
+Each time a monitor's condition fires, a 🔭 line appears in the conversation; click to expand the output. When a task ends, its final status and result summary are shown. A session with only monitors or background commands left counts as idle and shows 🔭 with the task count in the list.
### Artifacts Preview
-Files the agent produces are available as artifacts with an inline preview. Click an artifact to open the preview panel on the right, which renders the content by type:
+Click a file the agent produced to preview it on the right:
| Type | Preview |
|---|---|
-| Code (multiple languages) | Syntax highlighting + line numbers |
-| Markdown | Rendered view by default; toggle to **Source** |
-| HTML | Rendered view by default (iframe sandbox); toggle to **Source** |
-| Image | Displayed directly; a retryable error message is shown if loading fails |
-| PDF | Rendered in the browser's built-in PDF viewer |
-| Skill archive (`.skill`) | Left-side file tree + right-side content; the whole package can be downloaded, and you can **Save Skill** to your account with one click |
-
-The preview panel provides **Copy**, **Download**, and **Close** actions.
-
-
-Report-type artifacts (such as operational insight reports) can be generated as HTML containing Mermaid diagrams and charts, viewable directly in the rendered view. For operational insight capabilities, see Operational Insight Reports.
-
+| Code | Syntax highlighting and line numbers |
+| Markdown / HTML | Rendered view, with a **Source** toggle |
+| Images, PDF | Shown directly |
+| Skill package (`.skill`) | File tree and contents; download it or **Save Skill** to your account |
-All published artifacts can also be viewed and managed in one place on the **Artifacts** page in the left navigation (list, search, filter by personal / team scope, card / list view toggle, sort by created / modified time, rename, download, and delete) — see Artifacts.
+Previews support **Copy** and **Download**. All artifacts can also be managed on the **Artifacts** page in the left navigation — see Artifacts.
### Status Page Update Drafts
-The agent can call the `statuspage_draft` tool to **draft** an announcement for your public status page — a new incident or maintenance event, or an update appended to an existing event. Drafts are saved server-side and rendered in the conversation as a **status page update draft card**; but a draft is **never published automatically**: publishing a status page reaches subscribers immediately and cannot be recalled, so that step is always left to a human — review each item in the status page publish form in the console, then click publish.
+The agent can **draft** an announcement for a public status page: a new incident or maintenance event, or an update to an existing one. Drafts are **never published automatically** — you review and publish them in the console, because publishing notifies subscribers immediately and cannot be undone.
-#### What's on the draft card
+The draft card shows exactly what would be published: title, status or schedule, the Markdown message, affected components and their status, and the target status page and event type. If the message uses formatting the status page does not support (such as headings, code blocks, quotes or images), the card lists it, because it would be lost on publishing.
-The card reuses the visuals, field order, and component status icons of the console's corresponding cards (IncidentCard / MaintenanceCard), so what reviewers see is exactly what will be published:
-
-| Content | Description |
-|---|---|
-| Title | For a new event, the form's `name` field (backend `title`, up to 255 characters); for an appended update, the title of the event it attaches to — the append-update form has no title field, so this serves as identification only (shows "Untitled status page update" when not provided) |
-| Status / scheduled time | New maintenance shows "Scheduled for 〈start〉 → 〈end〉" (shows "No schedule set" when unset); otherwise the status text — incidents: Investigating / Identified / Monitoring / Resolved; appended maintenance updates: Scheduled / Ongoing / Completed |
-| Body | The `message` field is **fully rendered** as Markdown — this is what customers will read; reviewers must see the whole picture, and it must not appear as plain text |
-| Affected components | One chip per component: component status icon + name (hover shows "name · status") |
-| Target & type | Bottom left shows "Will publish to 〈status page〉" (appended updates show "Update · 〈event title〉"); the right side labels the type: Incident / Maintenance |
-| Warning banner | If the draft message contains Markdown the status page editor doesn't support and that would be **silently dropped** when loaded into the form (headings, code blocks, block quotes, images, strikethrough, inline code), the card lists each one in a warning banner — already detected by the tool at draft time |
-
-#### Card states
-
-| State | Behavior |
-|---|---|
-| Drafting | Skeleton screen, with "Drafting status page update…" at the bottom |
-| Tool error | "Failed to generate draft" + the specific reason; you can ask the AI to try again, or create it manually on the status page |
-| Incomplete draft | "Incomplete draft" + the same hint (the tool returned a result but no usable draft object) |
-| Ready to review | Button is **Review →**: opens the corresponding status page form in the console in a new tab, with the draft content pre-filled (URL convention below) |
-| Published | Button becomes a disabled **Published**; the bottom target becomes a link to the **published change** (`/status-page/{page_id}?menu=incidents\|maintenance&incident\|maintenance={change_id}`), so you can look back at what the draft eventually became |
-| Draft expired / not found | Button becomes a disabled **Draft expired**, with "Draft expired or not found — ask the AI to draft a new one" — treated the same when the console query returns ResourceNotFound or a network error |
-
-Whether it has been published is a fact the card cannot observe on its own (publishing happens in the console, in another tab), so the card queries `GET /status-page/draft/info?draft_id=...` by draft ID, which returns `status: pending | published`. While the draft is still pending, it refreshes every time the window regains focus ("review here, publish there, come back" is the normal path); `published` and "draft not found" are both terminal states, and the result is cached for the lifetime of the current page. Read-only shared sessions don't render the review button, and the draft status query is skipped as well.
-
-#### Handoff URL for review
-
-The draft itself lives server-side (fc-statuspage's draft storage); only the `draft_id` crosses over to the console: the form pulls the body from `/status-page/draft/info` by ID. The URLs combine into four variants by "new / append" × "incident / maintenance":
-
-| Scenario | URL |
-|---|---|
-| New incident | `/status-page/{page_id}?menu=incidents&incident=new&draft={draft_id}` |
-| New maintenance | `/status-page/{page_id}?menu=maintenance&maintenance=new&draft={draft_id}` |
-| Append incident update | `/status-page/{page_id}?menu=incidents&incident={change_id}&action=add-update&draft={draft_id}` |
-| Append maintenance update | `/status-page/{page_id}?menu=maintenance&maintenance={change_id}&action=add-update&draft={draft_id}` |
-
-`action=add-update` makes the detail page auto-expand the append-update form; without it, the route only opens the event itself and the draft is never read. `?draft=` carries only the draft ID — the draft is server-side state, not a chunk of JSON in the URL.
-
-#### Tool specifics
-
-| Field | Description |
-|---|---|
-| `page_id` / `page_name` | Target status page (required) and its display name (used on the card) |
-| `type` | `incident` (incident) / `maintenance` (maintenance) |
-| `change_id` | Omitted = new event; set = append an update to that event. Before drafting, the tool first checks `fduty status-page list` and `fduty status-page change-active-list` — if the target already has an active event, it should append rather than open another one (a second event reads to customers as another separate outage) |
-| `title` / `message` | Title for a new event (≤255 characters) and the body (required, Markdown; the status page editor keeps only bold, italic, links, bulleted / numbered lists, tables, and `---` dividers) |
-| `status` | New incident: `investigating` / `identified` / `monitoring` / `resolved`; new maintenance: omit (whether it advances on schedule is decided by the publish form's toggle); appended maintenance update: `scheduled` / `ongoing` / `completed` |
-| `affected_components` | Affected components (`component_id` + `status`, optionally with display name `name`); incident component status: `operational` / `degraded` / `partial_outage` / `full_outage`, maintenance component status: `operational` / `under_maintenance` |
-| `start_at_seconds` / `end_at_seconds` | Only for a new maintenance: planned window start and end, unix **seconds** (milliseconds and ISO strings are treated as invalid) |
+Click **Review →** to open the status page publishing form in a new tab with the draft filled in. After publishing, the button becomes **Published** and links to the published event; if the draft has expired or is missing, ask the agent to draft it again.
-Channel differences: the console (`web`) and automation channels render the card above; IM and API channels don't render cards — instead the agent puts a "[Review & publish](〈the same handoff URL〉)" link at the **start of the reply**, then summarizes the draft points in a sentence or two (IM message truncation doesn't parse Markdown, so the link comes first to be safe). If saving the draft failed (no `review_url`), it falls back to a text summary and points you to the status page in the console to verify manually.
+IM and API sessions show no card; the agent puts a "Review and publish" link at the **start of the reply** and summarizes the draft. If saving the draft failed, the agent summarizes it in text and asks you to check it in the console.
### Message Actions
-Hover over a message to reveal action buttons:
+Hover over a message to:
| Action | Applies to | Notes |
|---|---|---|
-| Copy | User message / artifact | Copies the message or file content to the clipboard |
-| Retry | User message | Restarts a turn using that message |
-| Edit | User message | Fills the message back into the input box for editing; if a turn is currently running it is interrupted first, attachments cannot be added while editing, and the Send button label changes to **Send rewind** |
-| Fork | Agent reply from a completed turn | Creates a new session from the completed turn that produced that reply, so you can continue down a different investigation path |
+| Copy | User messages / artifacts | Copy the content |
+| Retry | User messages | Run a new turn with this message |
+| Edit | User messages | Change and resend it — see below |
+| Fork | Replies of completed turns | Start a new session from here to try another approach |
-Editing a historical message is, under the hood, a **rewind** operation: once submitted, the conversation regenerates from that message onward, and any content after that message is replaced. Confirm before submitting. If the turn that produced the target message is still running or stopping, the rewind is rejected (`rewind target invocation is still active`) — wait for that turn to settle before submitting. A rewind is also rejected while the session is busy with another operation (compacting its context, for example), in which case you get "The session is busy with another operation. Please try again in a moment." — that is not a permanent failure; just resubmit after a moment. When a rewind takes effect, the background processes and dispatched subagents spawned by the wiped turns are stopped along with it, and their task rows are removed from the task panel.
+Editing an earlier message **rewinds** the session: everything after it is replaced, and related background tasks and subagents are stopped. You cannot edit while that turn is still running or while the session is busy (for example, compacting); try again shortly.
### Forking a session
-After a turn has fully completed, a **Fork** button appears beside the agent reply. Click it to open the **Fork new conversation** dialog. It pre-fills the source session's scope and environment as suggestions, but every fork requires an explicit target scope and environment. Choose Personal or an accessible team, then choose **Auto**, a cloud Sandbox, or an online BYOC Runner. Click **Confirm** to create — and automatically open — a new session forked from the completed turn that produced that reply.
-
-Forking is useful when you want to try another path from the same investigation context. The new session keeps the conversation and tool-call history up to the selected turn, but it never inherits the source environment binding on the server. Available environments are filtered by the target scope. If you are not a member of the source team, the dialog changes to Personal; if the source environment is deleted, offline, never connected, or outside the target scope, it changes to **Auto**. Later turns from the source session are not included. The forked session includes a "Forked from conversation" divider; click it to return to the source position in the original session.
+After a turn completes, click **Fork** next to the reply, choose the new session's scope (personal or a team you can access) and runtime environment, and confirm to create and open it.
-
-You can fork only from a **completed** turn in a top-level session. If the source session is still running, the selected turn has not settled, or the target is a Subagent child session, AI SRE rejects the fork.
-
-
-If the forked portion of the conversation dispatched any Subagent or A2A tasks, those dispatch chips are copied over to the new session along with their respective child sessions — opening one still shows the execution details, and it never points at an original task you don't have access to. **Dispatches that had already completed or failed in the source session keep their real status** (completed / failed), copied together with their result; only **dispatches still in progress at fork time** show as "Interrupted" — the new session has no executor picking them up, so they cannot continue running. If you need to rerun one, just start a fresh dispatch in the new session.
-
-Forking clears temporary state that only belongs to an in-progress run, such as active-turn caches, pending mount state, frontend state that has not been persisted, and current-turn counters. Persisted history, tool calls, and reusable compaction state are retained; team and environment binding are written to the new session based on your choice in the fork dialog. The forked session has its own context, so later messages, compaction, and run results do not write back to the source session.
+- The new session contains the conversation and tool calls up to that turn; from then on the two sessions are independent.
+- If the source team or environment is not available to you, the new session uses personal scope or **Auto** instead.
+- Completed or failed subagents are copied with their results; subagents still running at fork time show as interrupted and can be started again.
+- You can fork only from completed turns of a main session, not from subagent sessions.
### Session Feedback
-The chat header has a pair of session-level feedback buttons, **Helpful** / **Not helpful** (thumbs up / down), for rating the quality of the whole session.
-
-Clicking **Not helpful** opens a feedback card where you can select preset reasons and add a note:
-
-| Preset reason | Meaning |
-|---|---|
-| Wrong diagnosis / root cause | The diagnosis or identified root cause is incorrect |
-| Didn't find the root cause | The real root cause was never located |
-| Remediation unavailable | The suggested remediation cannot be applied |
-| Off-topic | The reply drifted away from your question |
-
-The card also has a free-text box to add specifics (optional). On submit, the feedback is persisted via `POST /safari/feedback/create`; when you reopen the session, the earlier rating is automatically refilled onto the header buttons.
+Use **Helpful** or **Not helpful** in the chat header to rate the whole session. With **Not helpful** you can pick reasons (wrong diagnosis / root cause, did not find the problem, unusable remediation, off-topic) and add a comment.
## Context Compaction
----
-
-As a conversation grows longer, the session context approaches the model's context-window limit. AI SRE automatically compacts older conversation history — summarizing it into a digest while preserving recent content — to free up context space without losing critical information.
-
-Every compaction boundary summary also appends a deterministic **folded-resources manifest**: it lists the resources folded out of context this round and how to get them back — skills re-read via `skill(name)`, MCP server tool definitions re-discovered via `tool_search`, and A2A agent usage notes re-delivered automatically on the next dispatch or message. Post-compaction turns can recover those definitions on demand without keeping them in context.
-
-Compaction is triggered in four ways:
+As a conversation grows, AI SRE automatically summarizes older history while keeping recent content and key conclusions, so the conversation carries on. Content folded out of context, such as Skills or MCP tool definitions, is reloaded by the agent when needed.
-| Trigger | Timing |
+| Trigger | When |
|---|---|
-| Automatic (before a turn) | Before a turn starts, when context usage exceeds the threshold |
-| Automatic (mid-turn) | During a turn, if context continues to grow and crosses the threshold again |
-| Automatic (event count) | Once the conversation reaches about **500 events**, even if token usage is still below the threshold |
-| Manual | You explicitly trigger compaction with the `/compact` command |
+| Automatic | When context usage passes the threshold (before or during a turn), or when the session reaches about **500 events** |
+| Manual | Type `/compact` |
-The **event-count trigger** is a safety net: in a session made of many short turns, the token estimate can stay below the threshold for a long time while the number of events (messages, tool calls, and so on) keeps growing. Compaction fires once the count reaches about 500, so the history window cannot freeze against the model's per-load row cap. If you see compaction happen while the Context percentage is well below the threshold, this is why.
-
-### What You Will See
-
-- **Compaction in progress**: A status line reading "Compacting conversation context…" appears in the chat stream, showing elapsed time and progress; it disappears automatically when compaction finishes.
-- **Compaction complete**: The conversation remains coherent with no action needed from you. The most direct indicator is the **Context** usage percentage in the chat header dropping — it reflects the current utilization of the context window, and hovering over it shows exact token usage.
-- **No compaction needed**: When compaction is unnecessary (for example, the conversation history is too short, or it is already in a compacted state), a manual trigger returns an appropriate message such as "Context does not need compaction" or "Conversation history is too short to compact."
-
-
-Compaction is transparent to you: what you perceive is a continuous conversation. The agent retains a summary of the compacted content in the background, so subsequent turns can still build on earlier key conclusions.
-
+Progress is shown while compacting; afterwards the **Context** percentage in the chat header drops (hover for token usage). If compaction happens while usage is far below the threshold, the event limit was reached.
## Choosing a Runtime Environment
----
-
-When creating a session, the input area has a separate **environment** selector alongside the team selector, which determines where the agent's tool, Skill, and MCP calls actually execute. The selector has three sections:
+When creating a session, choose the **runtime environment** in the input area to decide where the agent's tools, Skills and MCP run:
| Option | Description |
|---|---|
-| Auto (default) | The backend automatically picks an available environment; falls back to the cloud sandbox if none is available |
-| Cloud environment | Uses a Flashduty-managed cloud sandbox (the default template, or a cloud environment template already created for the account / team) |
-| A specific BYOC runner | Pick one of the online self-hosted runners in your account, so the investigation reaches your private network |
+| Auto (default) | The system picks an available environment, falling back to the cloud sandbox |
+| Cloud environment | A Flashduty-hosted cloud sandbox (the default template or one you created) |
+| BYOC Runner | An online self-hosted runner, so troubleshooting runs inside your network |
-Self-hosted runners are shown by their current status: runners that are offline or have never connected appear dimmed in the list and cannot be selected; if a selected runner goes offline afterward, sending messages is also blocked with a corresponding notice.
-
-The environment choice is fixed once the first message is sent and the session is created. To switch afterward, see the in-place switching capability for IM sessions under "Session entry kind" below, or fork a new session.
+Offline runners cannot be selected, and if the selected runner goes offline you cannot send messages. The environment is fixed once the session is created; to change it, fork a new session (IM sessions can switch in place).
## Binding a Team
----
+When creating a session you can **bind a team**; the session then loads that team's knowledge, Skills and MCP. Your choice is remembered. In a personal session without a team, the agent can load knowledge from your teams when needed; a team session uses only shared content and that team's content.
-When you create a session you can **bind a team** to it. Once bound, the session automatically loads that team's knowledge, skills, and MCP servers at startup, giving the agent the team's domain context and capabilities from the very beginning. When no team is bound, the session runs in account scope.
+
+Automatic team binding for incidents and war rooms is still being improved.
+
-
-
- Use the team selector in the new-session input area to choose the team to bind. Your last selection is remembered, so you do not have to repeat it each time.
-
-
- As soon as the session starts, the knowledge / skill / MCP metadata for "account scope + bound team" is loaded and the agent is ready to use.
-
-
- In a personal session not bound to a team, the agent can read the knowledge of teams the session creator belongs to on demand, mounting that team's knowledge and capabilities as persistent context in the current session — a mount remains active for the lifetime of the session. A session bound to a team uses only the Shared knowledge and that team's knowledge, and cannot mount other teams'.
-
-
+## Session source
-The bound team stays with the session: reopening the same session restores the original team binding, and the session's team is also shown in the sidebar tooltip.
+Each session records where it came from, which affects some behavior:
-
-Automatic linking between incidents / war rooms and teams is still evolving. You can currently bind a team to a session explicitly; automatic binding in incident scenarios will continue to improve in future updates.
-
+| Source | Notes |
+|---|---|
+| Console | Runtime environment and team are fixed at creation |
+| IM platforms (Feishu / DingTalk / WeCom / Slack) | Switch environment and team in the conversation with `/env` and `/scope` |
+| API | Programmatic integrations. When creating a session with `POST /safari/session/create` you can pass `entry_kind` (`web` / `im` / `api` / `automation`, default `web`); it cannot be changed later |
+| Automation | Triggered by automation rules |
-For the rules governing team scope for resources (account scope vs. team scope, visibility, and edit permissions), see the "Scope" section on each resource page.
+## Reply language
-## Session entry kind
+The **reply language** is set when the session is created and used for the whole session.
----
+| Source | Reply language |
+|---|---|
+| Console | The console UI language at creation; changing the UI language later does not affect existing sessions |
+| IM / API / Automation | The account's default notification language |
-Every session is created with an **entry kind** (`entry_kind`) that identifies which surface produced it. The value is persisted to the database and returned in the create response.
+## Integrating sessions through the API
-| Value | Source | Notes |
-|---|---|---|
-| `web` | Console | Default; unknown or missing values are automatically normalized to `web` |
-| `im` | IM platform (Feishu / DingTalk / WeCom / Slack) | Set automatically by the IM path; enables **in-place switching** for the session (see below) |
-| `api` | External API call | For programmatic integration scenarios |
-| `automation` | Automated workflow | Sessions triggered by automation tasks |
+This section is for developers integrating AI SRE sessions through the [Open API](/en/api-reference/ai-sre/sessions/session-read-info).
-When calling `POST /safari/session/create`, you may include `entry_kind` in the request body (optional; defaults to `web`). The `entry_kind` cannot be changed after the session is created.
+### Withdrawing a queued message
-
-Sessions with `entry_kind=im` support **in-place environment and team switching** — the IM `/env` and `/scope` commands can rebind the session to a different execution environment (a BYOC runner or the cloud sandbox) or team scope without discarding the conversation. Console sessions (`web`) have their environment and team fixed at creation time and do not support in-place switching.
-
-
-## Reply language
+The `pending_messages` field in the `POST /safari/session/get` response lists queued messages the agent has not read yet, in execution order. Before the agent reads one, its author can withdraw it with `POST /safari/session/message/cancel`, passing `session_id` and `invocation_id` (the invocation ID returned when the message was sent). The `result` field means:
----
+| Result | Meaning |
+|---|---|
+| `removed` | Removed from the queue and will never run; clients receive a `user_message_cancelled` frame |
+| `consumed` | The agent already read it, so withdrawing has no effect; use Stop to interrupt |
+| `forbidden` | The caller is not the message author |
-Every session determines a **reply language** at creation time. The agent replies in that language for the entire session and never switches midway; reopening the session later continues in the same language.
+Only regular human messages can be withdrawn, not question answers or messages produced internally. The caller needs permission to chat in the session.
-| Entry kind | Where the reply language comes from |
-|---|---|
-| Console (`web`) | Follows the console UI language when the session is created; it is fixed at creation, so switching the UI language afterward does not affect existing sessions |
-| IM / API / automation (`im` / `api` / `automation`) | These entries carry no UI-language signal, so they default to the account's notification language |
+### Error markers in stream frames
-## Session data export
+Frames in the session stream may carry `is_error` and `error_code`, marking a runtime error the platform surfaces to the user. A frame without them may still contain diagnostics; they also differ from the `error` line that marks a broken export stream below.
----
+### Session data export
`POST /safari/session/export` streams all events from a session as **NDJSON** (`application/x-ndjson`), one JSON object per line. This is intended for auditing, archiving, offline analysis, or feeding session data into external systems.
-### Request fields
+#### Request fields
| Field | Type | Required | Description |
|---|---|---|---|
| `session_id` | string | Yes | ID of the session to export |
| `include_subagents` | bool | No | When `true`, recursively includes the event streams of all subagent child sessions; defaults to `false` |
-### Response format
+#### Response format
The response `Content-Type` is `application/x-ndjson`. The **first line is always** a `session_meta` envelope containing the session's metadata; subsequent lines are session events. When `include_subagents=true`, each `subagent_dispatch` line is immediately followed by the complete event stream of the child session, which also begins with its own `session_meta` line.
@@ -554,7 +342,8 @@ The response `Content-Type` is `application/x-ndjson`. The **first line is alway
{"type":"final_answer","seq":5,"session_id":"s_...","content":"...","usage":{"input_tokens":0,"output_tokens":0,"cache_read":0,"cache_creation":0},"ts":"2026-09-08T08:05:00Z"} // turn-final answer
```
-#### Line types
+
+
The export stream contains only the line types below (the `type` field); no other types occur:
@@ -571,26 +360,28 @@ The export stream contains only the line types below (the `type` field); no othe
| `session_fork` | The "Forked from conversation" divider row | `content` |
| `error` | Appended at the end of the stream when an error occurs after streaming started, or inlined when a child session is unavailable under `include_subagents` | `content` (error text; consumers must inspect this line to tell whether the stream completed — see the Warning below) |
-#### Fields and behavioral conventions
+
+
- **`seq`**: a monotonic counter over **lines emitted**, starting at 1 (reset per child session; never reset across pages). When one DB event yields several lines (see below), the lines are numbered consecutively in part order. `session_meta` lines carry no `seq`.
-- **`call_id` (the pairing key)**: the ADK `function_call` / `function_response` id (both sides of a call share the same `id`). A single model response can bundle several tool calls into **one DB event** (e.g. 2 `agent_dispatch` calls + 1 `bash` call in the same event); the export emits one line per part, in the original part order, and `call_id` lets a consumer re-pair a response line with its call line without relying on emission order.
+- **`call_id` (the pairing key)**: the `function_call` / `function_response` id (both sides of a call share the same `id`). A single model response can bundle several tool calls into **one DB event** (e.g. 2 `agent_dispatch` calls + 1 `bash` call in the same event); the export emits one line per part, in the original part order, and `call_id` lets a consumer re-pair a response line with its call line without relying on emission order.
- **`usage` (token counts)**: per-event totals (`input_tokens` / `output_tokens` / `cache_read` / `cache_creation`), emitted as `0` rather than omitted when absent. It is **stamped on the first line of the event only** — the lines of a batched dispatch share one usage figure, so a consumer that sums per line is not over-counted N times.
-- **No model identifier**: the export deliberately carries **no serving model identifier** — neither `session_meta` nor `llm_call` lines have a `model` field. The export is a customer-downloadable artifact, and the model identifier combined with the per-call token counts is enough to reconstruct the underlying usage cost, so it stays server-side only (`t_session.chat_model`); no customer-facing export or query returns it (`/safari/session/get` does not expose it either), so scripts that parsed `model` from the export must be adjusted.
+- **No model identifier**: the export deliberately carries **no serving model identifier** — neither `session_meta` nor `llm_call` lines have a `model` field. The export is a customer-downloadable artifact, and the model identifier combined with the per-call token counts is enough to reconstruct the underlying usage cost, so neither the export nor the query APIs (including `/safari/session/get`) return it.
- **Timing**: `ts` is the event's write time (RFC 3339). `llm_call` and `tool_call` lines use it as an approximation of the **end time** (`ended_at`); start times and durations (`started_at` / `duration_ms`) are not provided (empty / 0).
- **`include_subagents=true`**: each `subagent_dispatch` line is immediately followed by the child session's complete export stream, recursively (every dispatch line of a batch is inlined, not just the first); the child's `seq` restarts at 1 and its `session_meta` carries `parent_session_id`. If a child session is missing or fails to export, the parent stream is not interrupted — an inlined `error` line is emitted and the stream continues.
- Some bookkeeping rows produce no export line (e.g. OAuth-authorized markers), so the line count can be lower than the session's event count.
+
+
+
If an error occurs after streaming has already begun, the server cannot switch to a standard JSON error envelope. Instead, a JSON-encoded error object is appended as the final line of the stream. Consumers must inspect this last line to determine whether the stream completed successfully.
-**Permissions**: the export endpoint uses the same access gate as sending messages (`CanChatSession`), meaning the caller must have message-send permission on the session — read-only access is not sufficient. Personal sessions can be exported only by their creator; team sessions can be exported by same-account members who can access the session.
+**Permissions**: the export endpoint uses the same access gate as sending messages, meaning the caller must have message-send permission on the session — read-only access is not sufficient. Personal sessions can be exported only by their creator; team sessions can be exported by same-account members who can access the session.
## Related Pages
----
-
Learn about AI SRE's positioning, capabilities, and use cases.
diff --git a/en/ai-sre/skills.mdx b/en/ai-sre/skills.mdx
index 29930de0..2650ff68 100644
--- a/en/ai-sre/skills.mdx
+++ b/en/ai-sre/skills.mdx
@@ -5,14 +5,10 @@ keywords: ["AI SRE", "Skill", "SKILL.md", "Marketplace", "skill-creator", "agent
sidebarTitle: Skills
---
-
- AI SRE is available to accounts on an On-call Pro or higher subscription, with no application needed. Starting September 16, 2026, 08:00 Beijing time, it must be activated in the console before use and is billed on actual usage; see [billing terms](/en/compliance/ai-sre-credit-package-purchase-agreement).
-
+> AI SRE must be activated in the console, is available on On-call Pro or higher, and is billed on actual usage. See [Activation and billing](/en/ai-sre/overview#activation-and-billing).
## Overview
----
-
A Skill is a **reusable capability bundle**. Every skill consists of two parts:
- A **SKILL.md** instruction document that tells the agent "when to use it, how to use it, and what steps to follow";
@@ -34,7 +30,7 @@ If you just want to **mention** `/skill-name` in a message (for example, asking
The difference between Skills and MCP: MCP provides **connectivity to external tools**; Skills provide **the methodology for orchestrating those tools to complete a category of tasks**. They work together — a skill declares in SKILL.md which tools it needs, including built-in tools and MCP tools in the form `mcp:server/tool`.
-### SKILL.md Format
+## SKILL.md Format
`SKILL.md` consists of two parts — YAML frontmatter (metadata) and a body (human-readable instructions for the agent) — separated by `---`:
@@ -82,28 +78,29 @@ Tools can be specified in two ways:
- **Built-in tools**: write the tool name directly. Available built-in tools include `read`, `write`, `edit`, `bash`, `grep`, `glob`, `skill`, `mcp`, `todo`, `time`, `webfetch`, `web_search`, and others.
- **MCP tools**: write them as `mcp:server/tool` (e.g., `mcp:my-server/query`). At upload time, only the existence of the MCP server is validated; the specific tool name is verified when the MCP is loaded during a session.
-
-The AI SRE runtime bundles a few skills that are available without installation. `flashduty` is one such reference: it uses the `fduty` CLI to cover the entire Flashduty API, allowing the agent to investigate incidents, read AI insights, query alerts, correlate changes, and more — use it as a template when writing your own skills. Another bundled skill is `github`, which the agent self-selects from `` to let AI SRE work directly inside a GitHub repository — explore code, investigate PRs and commits, and open a PR or issue on request; it requires the GitHub App (cloud) or the runner host's `gh` (BYOC). A third bundled skill is `gitlab`, symmetric with `github` in capability: the agent self-selects it to work directly inside a GitLab repository — explore code, trace MRs and issues, and open an MR or issue on request; it requires the GitLab App (cloud) or the runner host's `glab` (BYOC). See [Apps](/en/ai-sre/apps).
+## Built-in Skills
-There is also `flashduty-docs`: it downloads Flashduty's **official documentation** (both the Chinese and English page sets, the glossary and the Open API specs) into the runtime environment and answers questions about **how the product itself works** by searching it by topic — features, settings, limits, plans, compatibility, SDK behaviour and performance impact, API fields and errors — across On-call, RUM, Monitors, AI SRE, Status Page, the platform and Open API. Its answers cite public docs.flashduty.com links and are drawn from the docs alone; where the docs do not cover something it says so plainly. It only reads documentation and does not replace hands-on work (actual RUM instrumentation belongs to `rum`), and the docs bundle's address is injected by the platform, so there is nothing to configure.
-
+The AI SRE runtime bundles these skills; no installation needed:
-
-Those are examples, not the whole set: the runtime also bundles `init`, `insight`, `artifact-design`, `alert-governance`, `monit-query` and more, and the set grows between releases. What the agent actually sees in a session is ``; to find out which bundled skills a given session has, just ask the agent.
-
+| Skill | What it does | Requirements |
+| --- | --- | --- |
+| `flashduty` | Covers the entire Flashduty API through the `fduty` CLI: investigate incidents, read AI insights, query alerts, correlate changes, and more. A good reference when writing your own skills | — |
+| `github` | Works inside a GitHub repository: explore code, investigate PRs and commits, open a PR or issue on request | The GitHub App (cloud) or the runner host's `gh` (BYOC); see [Apps](/en/ai-sre/apps) |
+| `gitlab` | The GitLab counterpart of `github`: explore code, trace MRs and issues, open an MR or issue on request | The GitLab App (cloud) or the runner host's `glab` (BYOC) |
+| `flashduty-docs` | Searches Flashduty's official docs (Chinese and English pages, glossary, Open API specs) to answer how the product works — features, settings, limits, plans, compatibility, SDK behaviour, API fields and errors — citing docs.flashduty.com links. Answers from the docs only and says so when they don't cover something. Doesn't replace hands-on work (RUM instrumentation belongs to `rum`) | Nothing to configure |
-## Install from Marketplace
+There are more — `init`, `insight`, `artifact-design`, `alert-governance`, `monit-query` and others — and the set grows between releases. To see which skills a given session has, just ask the agent.
----
+## Install from Marketplace
-The skill catalog is part of the plugin catalog on **Customize → Plugins → Overview**: skill templates are listed alongside MCP templates and the built-in Apps, grouped by category, with skills in their own **Skill** category (they also appear under the "All" tab, tagged `Skill`). The search box above the catalog filters by name or description, the tabs narrow the list to one category, and "See all N" next to a category heading expands that category; the search term and the selected tab live in the page URL, so leaving and coming back lands you where you were.
+The skill Marketplace is part of the plugin catalog on **Customize → Plugins → Overview**, under the **Skill** category; search by name or description.
On **Customize → Plugins → Overview**, find the template under the **Skill** category; each row shows the template name and description.
- An uninstalled row has a round **+** button on its right; clicking **+** or the row itself opens the `Install skill ""` confirmation dialog: "Installs to the account — available to all members." Marketplace installs are always **shared scope** (shared = account level), with no owner selection. Click **Install** to actually call the install endpoint — this copies the template content into your account as a regular skill entry and marks its source template (shown on the list as a `From Marketplace — v` tooltip). A successful install reports `"" installed`.
+ Click a template row or its **+**, then confirm to install. Marketplace installs are always **shared scope** (available to all members of the account); the template is copied into your account as a regular skill, labeled with its source template and version.
An installed row no longer shows **+**; it shows **Enabled**. Managing and updating it happens on the **Customize → Plugins → Skill** list — see "Management and Inspection" and "Automatic and Manual Updates" below.
@@ -137,8 +134,6 @@ Updating a modified skill **overwrites your local changes with the latest Market
## Custom Skills
----
-
In addition to installing from the Marketplace, you can upload your own skill packages. On the skill list page, click **Upload Skill** and fill in the form:
| Field | Type | Required | Description |
@@ -154,26 +149,19 @@ All metadata other than the skill name (description, version, tags, author, tool
### Overwrite upload (Replace)
-When you want to replace an existing skill with a new version, the upload endpoint supports two overwrite modes. The UI presents a "Replace" confirmation dialog at the appropriate moment:
-
-| Mode | Trigger | Behavior |
-| --- | --- | --- |
-| **Replace by name** | Upload with `replace=true` and no `skill_id` | Matches an existing skill in the account by the `name` field in the new archive's `SKILL.md` and overwrites its content. The SkillID remains the same, so all existing references (e.g., `/` triggers) continue to work. |
-| **Replace by ID** | Upload with `replace=true` and a `skill_id` | Ignores the `name` field in the zip and directly targets the skill with the specified ID. Use this when you want to overwrite a specific record even if the skill has been renamed. |
+By default, uploading an archive whose name matches an existing skill is rejected. To replace an existing skill with a new version, choose "Replace" in its detail panel, or confirm the "Replace" dialog that appears when you upload a skill with the same name. The SkillID stays the same, so references such as `/` keep working; a replace never creates a new skill.
-Both modes return the updated skill object on success. If the target skill does not exist, a 404 error is returned — neither mode silently creates a new skill. **Without the `replace` parameter (the default), a name collision is rejected outright**; the upload endpoint never implicitly overwrites an existing skill.
+Via the API, upload with `replace=true` to match and overwrite by the `name` in `SKILL.md`; add a `skill_id` to overwrite by ID instead (useful after a rename). A missing target returns 404.
### Add in conversation (skill-creator)
Besides uploading a zip, you can **create and refine skills right inside an AI SRE session**. `skill-creator` is a Flashduty-provided Marketplace skill, pre-installed into your account by default, that exists specifically to "build skills." Trigger it with `/skill-creator` in any session, or just describe what you want in natural language:
-**Add in conversation** at the top right of the skill list page opens a new session with a pre-filled brief: "I want to add a Skill. First ask me whether I'm authoring it myself or installing an existing one from the web. For an existing one, search a few candidates for me to pick from, and install the one I choose." In other words the agent first asks whether you want to **author a new one** or **install an existing one**; for an existing one it checks the plugin catalog / Marketplace first, searches the web only when the catalog has nothing, and installs what you pick. The prompt is only pre-filled, never sent automatically. The button appears only when you have a scope you can author into: always when you can author at account scope, otherwise when the current scope filter selects exactly one team you belong to (or you belong to only one team).
-
- **Create from scratch**: say "help me create a skill for troubleshooting X," or after an investigation, "turn that workflow into a skill." skill-creator clarifies your intent, drafts the `SKILL.md`, optionally sets up test cases and iterates on them, and saves the result as a skill in your account once you're happy.
-- **Find an existing one online**: when you enter through "Add in conversation" and choose to install an existing skill, the agent checks the plugin catalog first and searches the web only when the catalog has nothing; once you pick one it completes the install, which becomes a regular skill entry.
+- **Install an existing one**: click **Add in conversation** at the top right of the skill list page and choose to install an existing skill. The agent checks the plugin catalog first, then searches the web if nothing matches; once you pick one, it completes the install. (The button appears only when the target scope is unambiguous — you have account-level permission, or exactly one of your teams is selected.)
- **Rewrite & optimize**: click **"Edit in Chat"** in a skill's detail panel to have skill-creator rewrite that skill; it can also tune the `description` to improve triggering accuracy.
-Once the draft is ready, the agent saves it as a skill with one click. If the name conflicts with an existing skill, a "Replace" confirmation dialog appears — under the hood this invokes the replace-by-name mode (`replace=true`, no `skill_id`).
+Once the draft is ready, the agent saves it as a skill with one click. If the name conflicts with an existing skill, a "Replace" confirmation dialog appears.
Skill archive size limits: archives saved by the agent in-conversation are capped at **10 MB**; archives uploaded via the web form or file upload in a session are capped at **100 MB**.
@@ -181,9 +169,7 @@ Skill archive size limits: archives saved by the agent in-conversation are cappe
## Management and Inspection
----
-
-The skill list displays each skill's **name** (with source template badge, **Update available** marker, and **Local runner only** badge), **scope** (shared or team), **version**, **enabled** toggle, and an **actions** column. Skills that declare `venues: [byoc]` carry a **Local runner only** badge whose tooltip reads "Available only in sessions bound to a local runner; unavailable in cloud sandbox sessions"; Marketplace template cards show the same badge, so you know a template needs a self-hosted Runner before you install it. The toolbar above the list provides a scope filter (All / Account / Team) and a search box that filters the list by keywords in the name, description, or author.
+The skill list shows each skill's name, scope (shared or team), version and enabled state, with labels for the source template, **Update available** and **Local runner only**. Skills that declare `venues: [byoc]` are labeled **Local runner only**: they work only in sessions bound to a local runner, not in cloud sandbox sessions. Marketplace templates carry the same label so you can tell before installing. You can filter by scope (All / Account / Team) and search by name, description or author.
@@ -209,9 +195,9 @@ Click any row in the list to open the skill's **detail panel**:
- **Left side**: the file tree of the skill package (`SKILL.md`, `README.md`, etc. are prioritized as the default preview file).
- **Right side**: content preview of the selected file, with the skill description shown at the top.
-- **Header area**: skill name (short reference in the form `skill-xxxxxx`), scope label (shared / team name), source template version badge (hover to see "From Marketplace — template name `v`"), **Update available** marker, author, `version`, and the full SkillID.
+- **Header area**: skill name and short reference (such as `skill-xxxxxx`), scope, source template version, **Update available** marker, author, `version` and the full SkillID.
- **Actions**: try in chat (injects `/` into a new session), update to latest version, edit in chat, replace, download, uninstall.
-- **Try asking**: if the skill declares `examples` in the `SKILL.md` frontmatter, a **Try asking** toggle appears below the header area of the detail panel, **collapsed by default** — the sample questions are not laid out until you click it; expanding it lists up to 2 sample questions, and clicking one opens a new session with that skill plus the question pre-filled (never sent automatically). The bottom of the expanded area carries the hint "Clicking a question opens a new chat with it filled in. Review it, then send."
+- **Try asking**: if the skill declares `examples` in the `SKILL.md` frontmatter, you can expand up to 2 sample questions; clicking one opens a new chat prefilled with the skill and question, ready for you to review and send.
When a skill package is **too large to preview**, the detail panel displays the file size and suggests using "Download" instead.
@@ -219,8 +205,6 @@ When a skill package is **too large to preview**, the detail panel displays the
## Scope
----
-
Skills share the same **two-level scope** model with other resources (Knowledge, MCP, Agents, environments), divided into account level and team level:
| Scope | Visibility |
@@ -230,18 +214,21 @@ Skills share the same **two-level scope** model with other resources (Knowledge,
**Edit permissions**: team-level skills can be acted on only by members of that team — organization admins must join the team first; account-level skills can be acted on only by the account owner or an account administrator. There is no "creator retains rights" exception. Rows you cannot edit appear as **read-only** in the list.
-**Create and reassign**: to upload a new team-level skill, you must belong to the target team; account-level upload is limited to the account owner or admins. **Marketplace installs are the exception**: they are always shared scope (account level), any account member can install one (no owner/admin permission required), and no team can be chosen at install time. When editing an existing skill, the account owner or admins can move it to any team to recover resources left behind by empty teams or departed members; regular members can move it only to teams they belong to. However, **Marketplace-installed skills cannot be reassigned to a team** — their scope is shown as a fixed account value in the edit form. A small number of legacy team-scoped Marketplace skills from earlier versions can be promoted to account scope via **Set to Shared** in the detail panel. **Set to Shared carries the same gate as account-level upload: only the account owner or admins can do it** — a regular member cannot self-serve the promotion even for their own team's skill, and the denied action prompts them to ask an admin to make it shared.
+**Create and reassign**:
-**Runtime visibility**: at session start, only **shared-scope (account-level)** skills and skills belonging to the **team bound to the current session** are loaded into the session. Skills and MCP servers from other teams are mounted into the current session on demand only after the agent reads that team's knowledge during an investigation. **The account is the sole security boundary at runtime, and using a team-level skill is bound by the same visibility rules — a team is no longer just an ownership and editing tag on this surface.**
+- Uploading a team-level skill requires membership in the target team; uploading an account-level skill is limited to the account owner or admins.
+- **Marketplace installs are the exception**: always shared scope, any member can install one, no team can be chosen at install time, and the skill cannot be reassigned to a team later.
+- When editing an existing skill, the account owner or admins can move it to any team (to recover resources left by empty teams or departed members); regular members can move it only to teams they belong to.
+- A few legacy team-scoped Marketplace skills can be promoted to account scope with **Set to Shared** in the detail panel — **account owner or admins only**.
+
+**Runtime visibility**: at session start, only **shared-scope (account-level)** skills and skills belonging to the **team bound to the current session** are loaded into the session. Skills and MCP servers from other teams are mounted into the current session on demand only after the agent reads that team's knowledge during an investigation. **The account is the sole security boundary at runtime, and using a team-level skill is bound by the same visibility rules — a team is not just an ownership and editing tag here.**
-The `/` autocomplete dropdown in the chat input only shows **shared-scope skills** plus team-level skills for **teams you belong to** — and that visibility is the resolution boundary, not just menu cosmetics. Manually typed slash commands pass through the exact same per-row scope gate ("resolve == visible"), so a team-level skill outside the current session's reach is never parsed or executed. Concretely: in a team session, invoking another team's command is rejected with a message explaining why; in a personal session, the command resolves (mounting the team on demand) only for members of the team that owns the skill — a non-member's input is refused exactly as if the command did not exist.
+The `/` autocomplete in the chat input lists only shared-scope skills and skills of teams you belong to, and typed slash commands follow the same scope. In a team session, invoking another team's skill is rejected with the reason; in a personal session, only members of the owning team can invoke it (the team is mounted on demand).
## Related Pages
----
-
Use DUTY.md and knowledge to provide the agent with team context and troubleshooting experience.
@@ -252,7 +239,7 @@ The `/` autocomplete dropdown in the chat input only shows **shared-scope skills
Extend AI SRE's collaboration and task-delegation capabilities with Agents.
-
+
Explicitly trigger a skill in a session with `/`, or let the agent invoke it autonomously.
diff --git a/en/compliance/service-sla.mdx b/en/compliance/service-sla.mdx
index 18bb92d6..96654144 100644
--- a/en/compliance/service-sla.mdx
+++ b/en/compliance/service-sla.mdx
@@ -10,7 +10,6 @@ This Service Level Agreement (hereinafter referred to as "SLA") stipulates the s
Please note that unless otherwise agreed, this agreement does not apply to Flashduty's beta, invitation-only, free features and versions, nor does it apply to Flashduty's on-premises version.
## How We Ensure SLA
----
1. **Multi-Active in Same City**: Infrastructure is built on multiple data centers, with stateful components all running in multi-active mode within the same city;
2. **Asynchronous Processing**: After an alert is reported, it immediately enters an asynchronous process with retry mechanisms, reducing the risk of alert loss;
@@ -19,7 +18,6 @@ Please note that unless otherwise agreed, this agreement does not apply to Flash
5. **Continuous Monitoring**: Comprehensive collection of system metrics, regular stress testing to identify system issues proactively or in advance.
## Our SLA Commitment
----
- **Feature Availability (Error Rate)**: Core features are available 99.9% of the time
- **Delivery Timeliness (Delay Rate)**: 99.9% of alerts are delivered within 5 minutes of triggering
@@ -58,7 +56,6 @@ Service unavailability due to the following reasons will not be counted as servi
- Force majeure events.
## How to Apply for Compensation
----
### Compensation Standards
@@ -75,7 +72,6 @@ You can submit compensation applications for Flashduty services that didn't meet
Compensation applications must be submitted within two (2) months after the end of the month when Flashduty failed to meet service availability commitments.
## Additional Notes
----
Flashcat Cloud reserves the right to modify these SLA terms.
diff --git a/en/compliance/terms-of-service.mdx b/en/compliance/terms-of-service.mdx
index 0b922e95..6878f4f3 100644
--- a/en/compliance/terms-of-service.mdx
+++ b/en/compliance/terms-of-service.mdx
@@ -8,7 +8,6 @@ Last Updated: 2023-02-10
Welcome to sign this "Flashcat Cloud Product Service Agreement" (hereinafter referred to as "this Agreement") with Beijing Flashcat Cloud Technology Co.,Ltd. (hereinafter referred to as "Flashcat Cloud") and use Flashcat Cloud services!
## **General Terms**
----
1.1. You confirm that before using this service, you have fully read, understood, and accepted all contents of this agreement and other related agreements and rules (especially the content marked in bold and/or underlined). Once you select "Agree" on this website (specific wording detailed on the registration page) and complete the purchase process or choose to use this service in any other way, you agree to comply with all terms under the aforementioned agreements and/or rules and are willing to be bound by them.
@@ -19,7 +18,6 @@ Welcome to sign this "Flashcat Cloud Product Service Agreement" (hereinafter ref
1.4. Flashcat Cloud only provides technical services and technical support related to Flashcat Cloud services, and is a neutral information storage space and related technical service provider. The websites, applications, and any products, services, and related content that you own, upload, store, or manage and operate in any form through Flashcat Cloud are developed and operated by you, and you bear full responsibility. Flashcat Cloud assumes no responsibility for any such products, services, and related content.
## **Standard Service Terms**
----
### **1. Contracting Parties and Agreement Scope**
diff --git a/en/compliance/user-agreement.mdx b/en/compliance/user-agreement.mdx
index 99e11841..777d9632 100644
--- a/en/compliance/user-agreement.mdx
+++ b/en/compliance/user-agreement.mdx
@@ -11,7 +11,6 @@ This "Flashduty User Agreement" (hereinafter referred to as "this Agreement") is
Please carefully read and fully understand each clause of this Agreement, as well as any separate agreements or rules (hereinafter referred to as "other relevant agreements and rules") that should apply and be followed when activating or using certain Flashcat Cloud Services, especially the terms highlighted in bold or underlined text.
## **1 General Terms**
----
1.1 You confirm that before using the Services, you have fully read, understood, and accepted all contents of this Agreement and other relevant agreements and rules (especially the content marked in bold and/or underlined). Once you select "Agree" on this website (specific wording detailed on the registration page) and complete the registration process or choose to use the Services in any other way, you agree to comply with all terms under the aforementioned agreements and/or rules and are willing to be bound by them.
@@ -22,7 +21,6 @@ Please carefully read and fully understand each clause of this Agreement, as wel
1.4 Flashcat Cloud only provides technical services and technical support related to Flashcat Cloud Services, and is a neutral provider of information storage space and related technical services. Any products, services, and related content that you own, upload, store, or manage and operate in any form through Flashcat Cloud are developed and operated by you, and you shall bear full responsibility. Flashcat Cloud does not assume any responsibility for any such products, services, and related content.
## **2 User Service Account**
----
### **2.1 Account Registration**
@@ -64,7 +62,6 @@ If you are a minor or a person with limited capacity for civil conduct, you do n
2.4.3 You have the right to actively cancel your account by sending an email to [support@flashcat.cloud](mailto:support@flashcat.cloud) to request account cancellation.
## **3 Service Rules**
----
3.1 Instructions sent by you to Flashcat Cloud in the following ways are irrevocable or irreversible instructions issued by you personally, and you shall bear any results and responsibilities arising from Flashcat Cloud executing such instructions:
@@ -112,7 +109,6 @@ If you are a minor or a person with limited capacity for civil conduct, you do n
3.10.5 If you believe content generated by AI Features is illegal, incorrect, or infringes your lawful rights, you may complain or report via the in-product feedback entry or by emailing [contact-us@flashcat.cloud](mailto:contact-us@flashcat.cloud), and Flashcat Cloud will review and act promptly.
## **4 Your Rights and Obligations**
----
4.1 Flashcat Cloud will provide you with network technical and information services, and will provide Flashcat Cloud's technical support, customer consultation, and other services when providing services to you. The content of such services is detailed on the relevant pages of this website.
@@ -167,7 +163,6 @@ If you violate the above promises, Flashcat Cloud can not only take measures suc
4.6 You acknowledge and recognize that installing and using pirated software and other unauthorized software that violates this Service Agreement is not allowed on Flashcat Cloud services. At the same time, you should take all necessary and appropriate security protection measures for your computer information system according to national regulations, including but not limited to installing computer information system security special products permitted by the state.
## **5 Flashcat Cloud's Rights and Obligations**
----
5.1 According to your service selection and payment situation, Flashcat Cloud will provide you with qualified network technical and information services.
@@ -195,7 +190,6 @@ If you violate the above promises, Flashcat Cloud can not only take measures suc
If circumstances occur where your account funds are frozen according to the above provisions, Flashcat Cloud will notify you through one or multiple methods such as email, in-site messages, SMS, or phone calls. You can appeal according to the corresponding procedures. If you appeal according to the requirements of Article 3.8 of this Agreement and pass Flashcat Cloud's review, Flashcat Cloud will immediately lift the fund freezing measures; if you fail to appeal within the specified time, or your appeal fails to pass Flashcat Cloud's review, you acknowledge that Flashcat Cloud has the right to freeze such funds long-term, or return the relevant frozen funds to the original recharge source account through the original route, including but not limited to bank accounts, WeChat accounts, Alipay accounts, etc.
## **6 Personal Information Protection**
----
6.1 Flashcat Cloud collects, uses, stores, shares, and protects your personal information in accordance with the [Privacy Policy](/en/compliance/privacy-policy). The Privacy Policy sets out the categories of information we collect, the purposes for which we use it, whom we share it with, cross-border transfers, retention periods, device permission and third-party SDK disclosures, and the rights you have over your personal information.
@@ -204,7 +198,6 @@ If circumstances occur where your account funds are frozen according to the abov
6.3 For your responsibility in safeguarding your account and password, see Article 2.3 of this Agreement.
## **7 System Interruption or Failure**
----
When the following circumstances occur, the Flashcat Cloud service system may not operate normally, thus causing you to be unable to use the services and producing corresponding consequences, for which Flashcat Cloud shall not bear any responsibility:
@@ -218,7 +211,6 @@ When the following circumstances occur, the Flashcat Cloud service system may no
- 8. Other circumstances not due to Flashcat Cloud's fault, beyond Flashcat Cloud's control or reasonable foresight.
## **8 Scope of Responsibility and Limitation of Liability**
----
8.1 Flashcat Cloud only assumes responsibility within the scope of responsibility stated in this Agreement.
@@ -231,14 +223,12 @@ When the following circumstances occur, the Flashcat Cloud service system may no
8.5 In any case, unless otherwise stipulated in this Agreement or separately agreed between Flashcat Cloud and you regarding a specific product and/or service, you agree that the total compensation liability borne by Flashcat Cloud under the terms of this Agreement and other relevant agreements and rules shall not exceed the total service fee charged to you for that particular service.
## **9 Intellectual Property**
----
9.1 Except for third-party products or services, all content on this website, including but not limited to all content of related products or services, as well as images, logos, files, information, architecture, page design, etc., are legally owned by Flashcat Cloud or Flashcat Cloud affiliated companies for their intellectual property rights, including but not limited to copyright, trademark rights, patent rights, trade secrets, etc. For any behavior infringing upon Flashcat Cloud's intellectual property rights, Flashcat Cloud has the right to require legal responsibility according to relevant applicable laws and the provisions of this Agreement.
9.2 Without written permission from Flashcat Cloud or Flashcat Cloud affiliated companies, no one may use, modify, copy, distribute, spread, publish or publicly display any part of the products, services, software, programs, information, etc. on this website in any way or for any reason, or bundle them with other products for use or sale, or use them through hyperlinks or transmission or for any other commercial purposes.
## **10 Confidentiality**
----
10.1 Under this Agreement, for any information received by either party ("Receiving Party") from the other party ("Disclosing Party"), if marked or can be reasonably considered as confidential or proprietary information of the Disclosing Party (including but not limited to technical, commercial related information, hereinafter referred to as "Confidential Information"), the Receiving Party shall keep it confidential, and without written consent from the Disclosing Party, shall not use it for any purpose outside this Agreement. The Receiving Party shall handle the Disclosing Party's Confidential Information with the same degree of care as it uses to protect its own confidential information (and not less than reasonable prudent duty).
@@ -254,7 +244,6 @@ When the following circumstances occur, the Flashcat Cloud service system may no
10.4 Both parties' confidentiality obligations remain valid during the effective period of this Agreement and after its expiration, until the relevant information no longer has confidential significance.
## **11 Complete Agreement**
----
11.1 This Agreement consists of these Agreement terms and various rules displayed on this website. If there are different understandings of the meanings of words used in this Agreement and various rules displayed on this website, the terms of this Agreement shall prevail.
@@ -265,14 +254,12 @@ When the following circumstances occur, the Flashcat Cloud service system may no
11.4 If part of the content of this Agreement is determined to be invalid or unenforceable by a court with jurisdiction, it does not affect the validity or enforceability of other content.
## **12 Notice Delivery**
----
12.1 You understand and recognize that after reasonable judgment, Flashcat Cloud can send notices to you through webpage announcements, emails, SMS, or regular mail delivery, etc., and Flashcat Cloud can presume that the contact information you provide to this website is complete, accurate, and currently valid; the above notices are deemed delivered to the recipient on the date of sending.
12.2 Unless otherwise agreed in the terms of this Agreement or explicitly specified in a special agreement signed between Flashcat Cloud and you, any notice you send to Flashcat Cloud must be delivered through Flashcat Cloud's officially announced communication address, fax number, email address, and other contact information.
## **13 Applicable Law and Dispute Resolution**
----
13.1 The signing place of this Agreement is Haidian District, Beijing.
diff --git a/en/developer/cli.mdx b/en/developer/cli.mdx
index 6c3c6dbc..1958f03a 100644
--- a/en/developer/cli.mdx
+++ b/en/developer/cli.mdx
@@ -54,7 +54,7 @@ A copy installed under another command name uses that name in help output, error
flashduty login
```
-When prompted, paste your APP Key. To obtain one, sign in to the [Flashduty console](https://console.flashcat.cloud) and copy your APP Key from **Profile > Personal Info**.
+When prompted, paste your APP Key. To obtain one, sign in to the [Flashduty console](https://console.flashcat.cloud) and copy your APP Key from **Profile → Personal Info**.
### Credential resolution order
@@ -892,7 +892,7 @@ Table view with no column truncation — useful for copy-paste or wide terminals
-#### Generated-command output bound
+### Generated-command output bound
Generated commands (the ones covering the OpenAPI through the code generator, such as `safari session-list`, `monit datasource-list`, `safari a2a-agent-list`) apply a 16 KiB bound to **list-shaped** responses in `json`/`toon` mode. The reduction has three tiers, plus a machine-readable marker:
diff --git a/en/developer/go-sdk.mdx b/en/developer/go-sdk.mdx
index 52cac98b..019432e4 100644
--- a/en/developer/go-sdk.mdx
+++ b/en/developer/go-sdk.mdx
@@ -7,8 +7,6 @@ keywords: ["Go SDK", "go-flashduty", "Open API", "Golang", "client"]
## Overview
----
-
`go-flashduty` is the official open-source Go client for Flashduty, covering every REST endpoint of the Flashduty Open API. It follows the same design as [go-github](https://github.com/google/go-github) — service groups, typed requests and responses, a composable transport layer — and stays strictly 1:1 with the OpenAPI spec: each method maps to exactly one HTTP call, returns `(*T, *Response, error)`, and performs no implicit cross-endpoint aggregation or enrichment.
The SDK provides typed API operations generated from the Flashduty OpenAPI spec, covered by unit tests, and end-to-end verified against the live API.
@@ -30,8 +28,6 @@ The module path is `github.com/flashcatcloud/go-flashduty`, the package name is
## Installation
----
-
Make sure your local Go toolchain is at least 1.24.
@@ -50,8 +46,6 @@ import flashduty "github.com/flashcatcloud/go-flashduty"
## Quick start
----
-
Here is a minimal runnable example: construct the client, list incidents in the "Triggered" state, and handle the returned triple `(data, *Response, error)`.
```go
@@ -100,8 +94,6 @@ Every call returns three values:
## Create a client
----
-
`NewClient` takes an `app_key` plus zero or more `Option`s. An empty `app_key` returns an error directly. The default Base URL is `https://api.flashcat.cloud`, the default HTTP timeout is 30 seconds, and the default User-Agent is `go-flashduty`.
```go
@@ -146,8 +138,6 @@ Access tokens are issued by the Flashduty OAuth authorization server, whose addr
## Services and methods
----
-
Endpoints are grouped by service and hang off the client: the call convention is uniformly `client..(ctx, req)`, returning `(*T, *Response, error)`. For example, `client.Incidents.List(ctx, req)` or `client.Sessions.Info(ctx, req)`.
| Service field | Description |
@@ -190,20 +180,40 @@ Endpoints are grouped by service and hang off the client: the call convention is
| `client.SessionReplay` | RUM session replay |
| `client.Sourcemaps` | RUM sourcemaps |
+
+All identifiers, service field names, and method names match the generated code. For exactly which methods each service has and their request and response types, rely on `services_gen.go` and the per-service files, plus the [Open API reference](/en/openapi/introduction).
+
+
+The following services have behavior that needs extra explanation:
+
+### Status page drafts
+
`client.StatusPages.DraftCreate` (`POST /status-page/draft/create`) stores a status page event draft for a human to review and publish from the console; it is never directly visible to the public: `draft` is arbitrary JSON stored verbatim, up to 64 KB serialized, with `page_id`, `type` (`incident` or `maintenance`), `name`, and `message` validated; `change_id` (> 0 appends an update to an existing event), `status`, and `affected_components` are optional, and for a new maintenance you can set `start_time` / `end_time` (Unix seconds) for the window. The request-level `source` is an opaque marker of the drafting origin (up to 64 characters, e.g. `ai_sre:sess_xxx`); the response returns a `draft_id` matching `draft_[A-Za-z0-9]{22}`, which the console review link carries.
+### Knowledge
+
`client.Knowledge` covers the 9 operations under `/safari/knowledge/*`: on the knowledge side `PackReadGet` (get the account knowledge), `PackReadList` (list knowledge), `PackWriteEnsure` (ensure the knowledge exists), `PackWriteUpdate` (change its scope), and `PackWriteDelete` (delete it); on the file side `FileReadGet`, `FileReadList`, `FileWritePut` (upload/overwrite), and `FileWriteDelete`. Exported types include `KnowledgePackItem`, `KnowledgeFileItem`, `KnowledgeWarning`, and the various `Knowledge*Request` / `Knowledge*Response` structs.
+### AI SRE artifacts
+
`client.Artifacts` (AI SRE artifacts) covers the 11 operations under `/safari/artifact/*`: on the gallery read side `ReadGet` (get a single published artifact by ID), `ReadList` (list artifacts visible to the caller, with title substring search and `scope` (`all` / `personal` / `team`) plus `team_ids` filtering), and `ReadGetFileState` (probe up to 50 presented-file IDs (`pf_` prefix) in one call for ones that already have a live published artifact); on the file side `ReadSign` (issue short-lived download/preview URLs for a presented file, valid 5 minutes, `expires_in` is fixed at 300) and `ReadStream` (download or preview the file's bytes with a signed token — the success body is a file, not a JSON envelope, with the raw bytes on `Response.Raw`); on the write side `WritePublish` (publish a session-produced file to the gallery), `WriteUpdate` (rename the artifact or transfer it between personal and team scope), and `WriteDelete` (detach it from the gallery; the source file stays with its session); public sharing `WriteShareEnable` (turn on anonymous public sharing and return the public link — anyone with the link can view it, no login required), `WriteShareRevoke` (turn sharing off; the link stops resolving immediately), and `WriteShareSync` (refresh the public snapshot with the latest content — when `share_enabled` is true and `share_file_id` differs from `file_id`, the snapshot is stale and calling this refreshes it). Exported types include `PublishedArtifactItem`, `ArtifactShareState`, `SignedUrLs`, and the various `Artifact*Request` / `Artifact*Response` structs.
+### Member email notifications
+
`client.Members.MemberNotify` (`POST /member/notify`, `memberNotify`) sends an email to account members on behalf of the caller, and is callable only with a credential minted for an AI SRE session — any other credential, a plain `app_key` included, is rejected with `AccessDenied` (check it with `IsAccessDenied` / `ErrorCodeOf`). Request fields: `subject` (required, 1–200 characters) and `html` (required, the entire email body the recipients see, up to 102,400 bytes), while `person_ids` is optional (at most 20, no duplicates; omitted or empty sends to the caller only). `script`, `meta`, `link`, and `base` tags and `on*` event handlers are silently stripped from `html` before sending; a `style`, `svg`, `iframe`, `object`, `embed`, `form`, `input`, or `button` tag, an `img` without an `https` `src`, or a link outside `http`/`https`/`mailto` instead fails the call with `InvalidParameter` before anything is queued, naming each offending construct. Delivery is asynchronous, so `accepted` only means the email was queued; the response's `recipients[]` returns one entry per recipient (`person_id` plus `status`), where `status` is `accepted` or `skipped`, and a skipped entry carries a `reason` of `not_member`, `no_email`, `email_disabled`, `duplicate`, `rate_limited` (at most 20 emails per recipient per hour), or `send_failed`. The response carries only two fields, `recipients[]` and an optional `agent_instructions`, and never echoes the sanitized email HTML back; `agent_instructions` is returned when the submitted `html` does not follow the default email layout (no `max-width:600px` wrapper table) and holds guidance addressed to the calling AI SRE agent on how to conform — advisory only, so a layout the caller deliberately chose needs no change.
+### Diagnostic queries
+
`client.Diagnostics.QueryData` runs a synchronous query via `POST /monit/query/data` and returns a stable `query_result.v1` structured result (`result.kind` is one of `frames`, `records`, or `samples`). This API requires monit-edge v0.65.0 or later. For log-pattern and metric-trend analysis, use `client.DataSources.ToolsInvoke` with `prometheus.metric_trends`, `loki.log_patterns`, or `victorialogs.log_patterns`.
`client.Diagnostics.QueryExplore` (`POST /monit/query/explore`, `monit-read-query-explore`) runs an explore query against a configured data source and returns the data source's native `explore_result.v1` shape: `ExploreData.format` is always `explore_result.v1`; `result.kind` is `frames` (columnar tables or time series, see `ExploreFrame` / `ExploreField`), `samples` (instant values with labels, `ExploreSample`), or `logs` (log entries as `ExploreLogEntry`, at most 1,000, with `has_more` set when truncated and `applied_limit` reporting the effective cap); and `execution.effective_step_seconds` echoes the step actually used after applying `max_data_points` and `min_step_seconds`. Request fields: `datasource_id` (from `/monit/datasource/list`, and it must belong to the authenticated account), `expr` (a query expression in the data source's native language — PromQL, LogsQL, SQL, and so on), `args` (macro substitutions keyed by variable name, used for Grafana-style variables; required in the request, so pass an empty `map[string]string{}` when you have none — a nil Go map serializes to `null`, which does not satisfy the schema), and `execution` (`QueryExploreExecution`: `kind` is `instant`, `range`, or `window`; `to_ms` is required for all three; `range` additionally requires `from_ms` and `max_data_points`, `window` additionally requires `from_ms`; `min_step_seconds` is accepted only for `range`). How it differs from `QueryData`: reach for `QueryExplore` when you need the data source's native result shape (raw logs included) and `QueryData` when you need the stable `query_result.v1` contract. This API requires the **data source view** (`monit`) permission and monit-edge v0.68.0 or later in supported deployments.
+### RUM remote config and repositories
+
Beyond application management, `client.Applications` (RUM applications) covers the five **RUM remote configuration** methods: `RemoteConfigReadGet` (`POST /rum/application/remote-config/get`, read the live configuration and its `version`), `RemoteConfigReadHistoryList` (`/rum/application/remote-config/history/list`, page through published history versions), `RemoteConfigReadPreview` (`/rum/application/remote-config/preview`, evaluate a draft configuration against a simulated client's `env` / `app_version` / `sdk` and return the matching rule index `hit_rule_index` plus the `values` finally delivered, without publishing), `RemoteConfigWriteUpdate` (`/rum/application/remote-config/update`, publish a complete new configuration), and `RemoteConfigWriteHistoryRevert` (`/rum/application/remote-config/history/revert`, republish a history version's content as a new version). Main types: `RemoteConfig` (`enabled`, `activation`, `default`, `rules`, `custom`, `refresh_on_foreground`), `RemoteConfigValues` (the four SDK knobs a configuration can set), `RemoteConfigRule` (`match` conditions plus the `set` values), `RemoteConfigHistoryItem` (with `version`, `reason`, `content_hash`, and `updated_by`), and the `GetRemoteConfigRequest` / `ListRemoteConfigHistoryRequest` / `PreviewRemoteConfigRequest` / `UpdateRemoteConfigRequest` / `RevertRemoteConfigRequest` structs with their matching `*Response` types. The application's own `WriteCreate` / `WriteUpdate` / `ReadInfo` / `ReadInfos` / `ReadList` also carry `repositories` (`[]RUMApplicationRepository`, a body-only field rather than a top-level flag): it links the application to the source code repositories that build it — ordered, first entry is the primary repository, at most 10 entries, each one a `Repo` (GitHub repository in `owner/name` form, required) plus an optional `Subdir` (the directory holding the application inside the repository, relative to the repository root — `.` is the repository root, an empty value is saved as `.`). Passing it on create establishes the links; on update the field is presence-based — passing it replaces the whole list, an empty array clears the links, and omitting it leaves them unchanged; `ReadInfo` / `ReadInfos` / `ReadList` echo it back on `RUMApplicationItem`. Linking grants no access by itself: AI sessions can only read repositories granted to the account's GitHub App installations. This field is currently available through the API and SDK only; the console's application management page does not expose repository links.
+### Data source tool invocation
+
`client.DataSources.ToolsInvoke` (`POST /monit/datasource/tools/invoke`, `monit-datasource-tools-invoke`) executes one deterministic tool against a configured datasource: `tool` is a single tool name prefixed by the datasource type (e.g. `mysql.overview`), and `params` is the tool-specific JSON parameters (omitted means `{}`; an explicit `null` is invalid). Alongside diagnostic tools, the entry supports `.query` query tools (`prometheus`, `mysql`, `postgres`, `oracle`, `clickhouse`, `elasticsearch`, `loki`, `victorialogs`, `sls`, `tencent_cls`); the `/monit/query/data` entry stays unchanged. It requires all currently online routable Edge sessions in the cluster to support the v0.71.0 base invoke protocol (individual tools may require a newer implementation), and there is no tool catalog, no automatic replay, and no fallback to legacy diagnose. The request body limit is 128 KiB, the complete success response limit is 10 MiB, and the tool timeout is at most 25 seconds; the response is a `DatasourceToolResult` (`data` is tool-specific JSON, never null, `summary` is optional, and a `truncated` object with `reason` indicates truncation).
To call a `.query` tool, build the request with `NewDatasourceQueryInvokeRequest(datasourceID, tool, params)` and pass the matching typed struct for that tool: `PrometheusQueryParams`, `MySQLQueryParams`, `PostgresQueryParams`, `OracleQueryParams`, `ClickHouseQueryParams`, `ElasticsearchQueryParams`, `LokiQueryParams`, `VictoriaLogsQueryParams`, `SLSQueryParams`, or `TencentCLSQueryParams`. All of them pair `expr` with an `execution` (`DatasourceQueryExecution`: `kind` is `instant`, `range`, or `window`, and `from_ms` / `to_ms` are Unix-millisecond `*int64` values; `range` additionally requires `max_data_points` and accepts `min_step_seconds` to raise the computed step). Optional fields are pointers — a nil pointer omits the key and lets the server apply its default. Query-tool `params` may not be empty: `NewDatasourceQueryInvokeRequest(..., nil)` returns an error, unlike the general "omitted means `{}`" rule. The execution mode is constrained by datasource type: Prometheus and Loki use `instant` or `range` (`instant` carries only `to_ms`); the SQL types (MySQL, Postgres, Oracle, ClickHouse, and the SQL-flavored Elasticsearch) plus SLS and Tencent CLS use `window`; VictoriaLogs uses `window` for raw logs and `instant` / `range` for stats queries. `limit` and `direction` on Loki, VictoriaLogs, SLS, and Tencent CLS bound raw-log retrieval only, and `SLSQueryParams` also requires `project` / `logstore` while `TencentCLSQueryParams` requires `region` / `topic_id` / `syntax`.
@@ -223,20 +233,18 @@ if err != nil {
out, _, err := client.DataSources.ToolsInvoke(ctx, req)
```
+### Prometheus label values
+
`client.DataSources.ReadPrometheusLabelValues(ctx, dataSourceID, labelName)` (`GET /monit/prometheus/api/v1/label/{label_name}/values`, `monit-prometheus-read-label-values`) lists every value of one label on a Prometheus-compatible data source through the monitoring proxy: the label name goes in the URL path (the SDK escapes it), and the target data source is selected by the `X-DSID` request header — the SDK sets it from the `dataSourceID` argument (a `0` ID or an empty `labelName` errors immediately), with the ID taken from `/monit/datasource/list` and required to be a Prometheus-compatible data source of the current account. It is the only method whose success body is not the Flashduty `{request_id, data}` envelope: the response decodes straight into `PrometheusLabelValuesResponse` (`data` carries the label-value strings when `status` is `success`; `errorType` and `error` are present when it is `error`). Failures before the data source is reached (`X-DSID` missing or invalid, data source absent, or not a Prometheus type) come back as `text/plain`, while the data source's own failures use its own JSON error shape; the SDK treats both alike and carries the raw body as-is on `*ErrorResponse.Message`. Supported deployments require monit-edge v0.35.0 or later.
+### Data source configuration
+
For `client.DataSources`, the `payload` selects a type-specific configuration block by `type_ident`. Fifteen `type_ident` values are allowed: `prometheus`, `loki`, `mysql`, `oracle`, `postgres`, `clickhouse`, `elasticsearch`, `sls`, `tencent_cls`, `victorialogs`, plus the new diagnostic-only types `redis_node`, `redis_sentinel`, `mongodb_mongod`, `mongodb_mongos`, and `kafka` — diagnostic-only types always have `alerting_enabled` false (which does not block non-alerting queries or tools) and reject true. Connection address rules: Redis/MongoDB diagnostic types take a single `host:port` (bracket IPv6), with no URI, userinfo, or query; `kafka` takes 1–32 unique comma-separated `host:port` bootstrap addresses (at most 4096 characters after normalization, and the payload has no broker list); for `mongodb_mongod` / `mongodb_mongos` the configuration block's `auth_source` defaults to `admin`, username and password must be configured together, and client certificates are unsupported; the Redis node configuration's `database` defaults to 0. Sensitive fields such as the diagnostic types' `password` and Kafka's `tls_key` support `${env:NAME}` references: literal values are omitted from responses (only `${env:...}` references are echoed back), omitting the fields on update preserves the stored values, and explicitly sending an empty string clears them.
`enabled` and `alerting_enabled` are independent: `enabled` (whether business execution is enabled) defaults to true on create; `alerting_enabled` (whether alert evaluation is allowed; alerting also requires `enabled` true and an alerting-capable type) defaults to true for alerting types and false for diagnostic-only types on create. On update, omitting either preserves the current value and an explicit `null` is invalid; disabling (`enabled` false) is rejected with a conflict when enabled rules reference the datasource. Also note that `payload` is always `null` in `/monit/datasource/list` responses (the list query does not read the payload column); it is populated in create/update/info responses.
-
-All identifiers, service field names, and method names match the generated code. For exactly which methods each service has and their request and response types, rely on `services_gen.go` and the per-service files, plus the [Open API reference](/en/openapi/introduction).
-
-
## Response timestamps
----
-
Time fields in responses are no longer bare integers but self-describing `Timestamp` (Unix seconds) or `TimestampMilli` (milliseconds) types (types shared by requests and responses are the exception — see the warning below). They serialize to RFC3339 strings in the local time zone, so JSON, logs, and LLM-facing output are directly readable; the raw epoch is still one method call away.
- **Serialization (outbound)**: a non-zero value serializes to a quoted RFC3339 string (`TimestampMilli` uses RFC3339Nano to preserve millisecond precision). A zero value serializes to the bare integer `0` — an "unset" sentinel rather than a 1970 date, and dropped by `json:",omitempty"`.
@@ -277,8 +285,6 @@ zero := inc.StartTime.IsZero() // whether it's the unset sentinel
## Pagination
----
-
All list endpoints share `ListOptions`, which you embed in the request struct. Zero values are omitted and never override server defaults (the backend defaults to `p=1`, `limit=20`).
| Field | Type | Wire field | Description |
@@ -315,11 +321,9 @@ for page := 0; page < 100; page++ {
## Error handling
----
-
An unsuccessful call returned by the Flashduty API — whether the envelope carries an error or the HTTP status is non-2xx — returns `*ErrorResponse`. It has `Code`, `Message`, an optional `Reason`, and `RequestID` fields; when troubleshooting, give `RequestID` to the support team to pinpoint the request. `Reason` carries the server-supplied optional cause (the envelope's `DutyError` has the same field, JSON `reason`,omitempty); when non-empty it is also appended to the end of the error string, as `, reason X`.
-When the API returns 429, the error is promoted to `*RateLimitError`: it embeds `*ErrorResponse` (so `errors.As` for `*ErrorResponse` still matches) and additionally carries a `RetryAfter` hint.
+When the API returns 429, the error is promoted to `*RateLimitError`: it embeds `*ErrorResponse` (so `errors.As` for `*ErrorResponse` still matches) and additionally carries a `RetryAfter` hint. `Code` values match the Open API [error code list](/en/openapi/introduction#error-code-list).
For **generated endpoints**, if you receive a non-2xx response with a non-JSON body, the SDK returns a plain `error`, not `*ErrorResponse`. This indicates that a gateway, load balancer, proxy, or other intermediary produced the response, usually because the request exceeded an intermediary timeout. Retry the request or split a long-running batch into smaller batches, and do not assume that `errors.As(err, &apiErr)` matches this error.
@@ -366,8 +370,6 @@ case flashduty.ErrorCodeAccessDenied, flashduty.ErrorCodeUnauthorized:
## Retry
----
-
The core client has **no** built-in automatic retry. Compose the optional `retry` subpackage through the transport layer — a safe-by-default retrying `http.RoundTripper`.
Features of `github.com/flashcatcloud/go-flashduty/retry`:
@@ -400,8 +402,6 @@ The `retry` subpackage is pure `net/http` and deliberately does not import the p
## Streaming export
----
-
`client.Sessions.Export` exports the full event transcript of an AI SRE session, returning an `io.ReadCloser` (an NDJSON stream, `application/x-ndjson`) rather than a JSON envelope. The first line is always a `session_meta` envelope, and each subsequent line is a session event; when `req.IncludeSubagents` is true, each `subagent_dispatch` line is followed by the subagent's own full event stream.
Because the response body can be large, read it line by line and write directly to a file — do **not** buffer the whole transcript into memory. The returned `io.ReadCloser` is the live HTTP response body, held by the caller and which you **must** `Close` (a `defer` close is correct). Pair it with `NewExportScanner` to scan line by line and `DecodeExportLine` to decode a line into an `ExportLine`:
diff --git a/en/developer/mcp-server.mdx b/en/developer/mcp-server.mdx
index bff49425..2b610d11 100644
--- a/en/developer/mcp-server.mdx
+++ b/en/developer/mcp-server.mdx
@@ -1,6 +1,6 @@
---
title: MCP Server
-sidebarTitle: MCP Server
+sidebarTitle: "Flashduty MCP Server"
description: "Connect the Flashduty API to AI tools via the MCP protocol for intelligent incident management and automation in clients like Cursor and Claude."
keywords: ["MCP", "Model Context Protocol", "AI", "Claude", "Cursor", "Flashduty", "incident management"]
---
@@ -13,8 +13,6 @@ Flashduty MCP Server is a [Model Context Protocol (MCP)](https://modelcontextpro
## Use cases
----
-
Hand incident creation, acknowledgment, and closure in Flashduty over to AI orchestration, wired into your operations workflow.
@@ -32,8 +30,6 @@ Flashduty MCP Server is a [Model Context Protocol (MCP)](https://modelcontextpro
## Deployment
----
-
Flashduty MCP Server offers three deployment modes; choose based on your MCP client's capabilities and your runtime environment.
@@ -131,8 +127,6 @@ Flashduty MCP Server offers three deployment modes; choose based on your MCP cli
## Authentication and transport
----
-
| Item | Description |
| --- | --- |
| Auth (local) | Provide the Flashduty APP Key via the `FLASHDUTY_APP_KEY` environment variable or the `--app-key` command-line flag. |
@@ -161,8 +155,6 @@ In each metadata response, `resource` is the request origin plus the matching pa
## Configuration
----
-
Flashduty MCP Server supports toolset trimming, read-only mode, output format, and other settings to suit different scenarios. Local deployments are configured via environment variables or command-line flags; the remote service is configured dynamically by appending query parameters to the URL.
### Environment variables
@@ -241,8 +233,6 @@ The server supports outputting tool results in [TOON (Token-Oriented Object Nota
## Toolsets and tools
----
-
The server provides **8 toolsets and 23 tools** in total, all enabled by default. The table below summarizes each toolset:
| Toolset | Tools | Description |
@@ -366,8 +356,6 @@ The tools in each toolset are as follows:
## Related resources
----
-
The Go SDK that MCP Server depends on, covering the entire Flashduty Open API.
diff --git a/en/home.mdx b/en/home.mdx
index d4924b36..7205aa76 100644
--- a/en/home.mdx
+++ b/en/home.mdx
@@ -1,201 +1,124 @@
---
title: Flashduty
-description: A unified observability platform covering On-call alert management, RUM user experience monitoring, and Monitors unified monitoring
+description: Official Flashduty documentation covering AI SRE autonomous troubleshooting, On-call alert response, RUM user experience monitoring, and the Monitors alert engine
sidebarTitle: Overview
---
-
+Flashduty is a unified observability platform for DevOps, SRE, and operations teams, covering everything from monitoring and alerting to incident response. Pick a task below to get started, or search the docs from the top bar (Ctrl K).
-## Product Suite
+## Start here
-Flashduty is a unified observability platform designed for DevOps, SRE, and operations teams, providing end-to-end solutions from monitoring and alerting to incident response.
-
-
-
- Autonomous troubleshooting Agent
+
+
+ Go from alert ingestion to a phone notification end to end
-
- Accelerate alert response
+
+ Create on-call schedules, then route incidents to the on-call person with escalation rules
-
- Real user experience monitoring
+
+ Look up the setup guide for your monitoring tool or cloud platform
-
- Unified monitoring platform
+
+ Run your first AI SRE investigation
+
+
+ Add real user monitoring to web, mobile, or mini program apps
+
+
+ Deploy monitedge and create your first Monitors alert rule
----
+## Products
-## AI SRE Autonomous Troubleshooting
+### AI SRE: autonomous troubleshooting agent
-A conversational, autonomous SRE Agent: issue instructions in natural language, and the AI investigates incidents, finds root causes, calls tools, and accumulates reusable operational knowledge. Integrated deeply with Flashduty incident response and IM collaboration.
+Issue instructions in natural language, and the AI investigates incidents, finds root causes, calls tools, and accumulates reusable operational knowledge. It works with Flashduty incident response and IM collaboration.
-
-
- - **Chat to troubleshoot**: the Agent plans, calls tools, and streams its investigation and conclusion
- - **Integrated with incident response**: spin up a session from an incident or war room with full context
- - **Knowledge that compounds**: DUTY.md-rooted knowledge holds long-lived operational context
- - **Extensible tooling**: Skills, MCP, A2A Agents, and self-hosted Runners
-
+- **Chat to troubleshoot**: the Agent plans, calls tools, and streams its investigation and conclusion
+- **Integrated with incident response**: spin up a session from an incident or war room with full context
+- **Knowledge that compounds**: DUTY.md-rooted knowledge holds long-lived operational context
+- **Extensible tooling**: Skills, MCP, A2A Agents, and self-hosted Runners
-
- - Start an investigation from the console or an IM group, visible to the whole team
- - Automatic initial diagnosis posted back to the incident war room
- - Use /insight to review the last 30 days and quantify operational friction
- - Build reusable runbooks and troubleshooting flows
-
-
+AI SRE is available to accounts on an On-call Pro or higher subscription and is billed on actual usage. See the [billing terms](/en/compliance/ai-sre-credit-package-purchase-agreement).
-
-AI SRE is available to accounts on an On-call Pro or higher subscription, with no application needed. Starting September 16, 2026, 08:00 Beijing time, it's billed on actual usage. See the [AI SRE introduction](./ai-sre) and [billing terms](./compliance/ai-sre-credit-package-purchase-agreement).
-
+[Introduction](/en/ai-sre) · [Product overview](/en/ai-sre/overview) · [Quickstart](/en/ai-sre/quickstart)
-
-
- Learn the full capability map and console navigation
-
-
- Create a session and start conversational troubleshooting
-
-
+### On-call: alert response
----
+Reduce noise, schedule, assign, escalate, and notify so teams can respond to production incidents quickly.
-## On-call Alert Management
-
-A unified intelligent alert response platform: reduce noise, schedule, assign, escalate, and notify to help teams respond to and handle production incidents quickly.
-
-
-
- - **Intelligent noise reduction**: Alert grouping, inhibition, and deduplication to reduce 90% of alert noise
- - **Flexible assignment**: Multi-level escalation, dynamic routing, and rotation scheduling
- - **Multi-channel notifications**: Feishu/Lark, Dingtalk, WeCom, Slack, phone calls, SMS
- - **Rich integrations**: Native support for 267 alert sources
-
-
-
- - Build 7x24 on-call systems to ensure service availability
- - Aggregate alerts from multiple sources into a unified incident management portal
- - Establish escalation mechanisms to ensure timely response
- - Analyze alert data to continuously improve monitoring quality
-
-
+- **Noise reduction**: alert grouping, inhibition, and deduplication cut repeated notifications
+- **Flexible assignment**: multi-level escalation, dynamic routing, and rotation scheduling
+- **Multi-channel notifications**: Feishu/Lark, DingTalk, WeCom, Slack, Microsoft Teams, phone calls, SMS, and email
+- **Rich integrations**: 290+ alert integrations covering mainstream monitoring tools and cloud platforms
-
-
- Complete your first alert integration in 5 minutes
-
-
- In-depth comparisons with PagerDuty and Opsgenie
-
-
+[Introduction](/en/on-call) · [Getting started](/en/on-call/quickstart/quickstart) · [Compare with PagerDuty / Opsgenie](/en/on-call/comparison/vs-pagerduty)
----
+### RUM: real user monitoring
-## RUM User Experience Monitoring
-
-Real User Monitoring helps you understand how real users experience your application and quickly identify and resolve frontend issues.
-
-
-
- - **Performance monitoring**: Full-chain tracking of page loads, resource loads, and API calls
- - **Error tracking**: Automatic collection and grouping of JS errors and network errors
- - **Session replay**: Reproduce user operation paths to quickly replicate issues
- - **Custom metrics**: Report business-specific metrics to meet personalized needs
-
-
-
- - Monitor core web vitals (LCP, FID, CLS) for web applications
- - Track and analyze frontend errors to improve application stability
- - Analyze user behavior paths to optimize product experience
- - Correlate with backend traces for full-stack observability
-
-
+Understand how real users experience your application and quickly find and fix frontend issues.
-
-
- Integrate SDK to start monitoring
-
-
- Learn about performance metrics and analysis methods
-
-
+- **Performance monitoring**: full-chain tracking of page loads, resource loads, and API calls
+- **Error tracking**: automatic collection and grouping of JS errors and network errors
+- **Session replay**: reproduce user paths to replicate issues quickly
+- **Custom metrics**: report business-specific metrics
----
+[Introduction](/en/rum) · [Getting started](/en/rum/quickstart/quickstart) · [Performance monitoring](/en/rum/performance/overview)
-## Monitors Management
+### Monitors: alert engine
Onboard data sources scattered across network zones and manage alert rules centrally; rules are evaluated locally by the alert engine deployed next to your data, and the events they produce flow into On-call.
-
-
- - **Multiple data source types**: Prometheus, VictoriaLogs, Loki, Elasticsearch, SLS, and Tencent Cloud CLS for metrics and logs, plus MySQL, PostgreSQL, Oracle, ClickHouse, Redis, Kafka, and MongoDB for databases and middleware
- - **Local evaluation next to your data**: `monitedge` runs inside your private network, syncs rules from SaaS and queries data sources locally, so data never leaves your network; engine instances in the same cluster shard the rules automatically
- - **Three evaluation modes**: threshold, no-data, and any-data, with consecutive or cumulative hit counting and per-level recovery semantics
- - **Unified management views**: manage rules in a folder tree, with overview, active alerts, Query Workbench, Entity Tree and dashboards, plus rule import/export and change audit
-
-
-
- - Monitoring is spread across multiple clouds and data centers, and you want to onboard sources and manage alert rules in one place
- - Data sources live in a private network without public access, and alert evaluation should stay local
- - Manage Prometheus, log, database, and middleware alerting under one workflow
- - Let rule-generated alerts flow straight into Flashduty grouping, escalation, and routing
-
-
+- **Multiple data source types**: Prometheus, VictoriaLogs, Loki, Elasticsearch, SLS, and Tencent Cloud CLS for metrics and logs, plus MySQL, PostgreSQL, Oracle, ClickHouse, Redis, Kafka, and MongoDB for databases and middleware
+- **Local evaluation next to your data**: `monitedge` runs inside your private network, syncs rules from SaaS and queries data sources locally, so data never leaves your network; engine instances in the same cluster shard the rules automatically
+- **Three evaluation modes**: threshold, no-data, and any-data, with consecutive or cumulative hit counting and per-level recovery semantics
+- **Unified management views**: manage rules in a folder tree, with overview, active alerts, Query Workbench, Entity Tree and dashboards, plus rule import/export and change audit
-
-
- Create your first monitoring task
-
-
- Answers to common questions
-
-
+[Introduction](/en/monitors) · [Getting started](/en/monitors/quickstart/quickstart) · [FAQ](/en/monitors/faq/faq)
----
+## Product video
+
+
## Developers
-Integrate Flashduty through Open API and Webhooks for automation and custom development.
+Integrate Flashduty through the Open API, CLI, SDKs, and Webhooks for automation and custom development.
-
+
Authentication, request specs, error handling
-
- All 354 endpoints organized by module
+
+ All endpoints, organized by module
-
- Traditional and cursor pagination
+
+ CLI, Go SDK, MCP Server, and Terraform Provider
----
-
-## Contact Us
+## Contact us
Scan to add our WeCom for one-on-one technical support
-
+
Scan to add our business manager on WeCom
-
+
- Sign in to the console and submit feedback in the bottom left corner
+ Sign in to the console and submit feedback from the bottom left corner
support@flashcat.cloud
diff --git a/en/monitors.mdx b/en/monitors.mdx
index 215d53d9..52bbe77c 100644
--- a/en/monitors.mdx
+++ b/en/monitors.mdx
@@ -98,6 +98,13 @@ Monitors supports cluster deployment to ensure high availability of the alert en
+## Use Cases
+
+- Monitoring is spread across multiple clouds and data centers, and you want to onboard sources and manage alert rules in one place
+- Data sources live in a private network without public access, and alert evaluation should stay local
+- Manage Prometheus, log, database, and middleware alerting under one workflow
+- Let rule-generated alerts flow straight into Flashduty grouping, escalation, and routing
+
## Quick Start
diff --git a/en/monitors/alert-rules/clickhouse.mdx b/en/monitors/alert-rules/clickhouse.mdx
index 80ca7071..02896f47 100644
--- a/en/monitors/alert-rules/clickhouse.mdx
+++ b/en/monitors/alert-rules/clickhouse.mdx
@@ -13,29 +13,29 @@ Monitors supports using standard SQL syntax to query ClickHouse and trigger aler
| **Field Processing** | All field names are automatically converted to lowercase; please use lowercase letters when configuring |
| **Type Conversion** | Recommended to use `toString()`, `toFloat64()` and other functions to convert complex types |
-## 1. Threshold Evaluation Mode
+## Threshold Evaluation Mode
This mode is suitable for scenarios requiring threshold comparison on aggregated values.
### Configuration
1. **Query Statement**: Write SQL aggregate query, returning value columns and (optional) label columns.
- - Example: Count error log quantity by service in the last 5 minutes.
- ```sql
- SELECT
- service_name,
- count(*) AS error_cnt
- FROM app_log
- WHERE timestamp > now() - INTERVAL 5 MINUTE AND level = 'error'
- GROUP BY service_name
- ```
+ - Example: Count error log quantity by service in the last 5 minutes.
+ ```sql
+ SELECT
+ service_name,
+ count(*) AS error_cnt
+ FROM app_log
+ WHERE timestamp > now() - INTERVAL 5 MINUTE AND level = 'error'
+ GROUP BY service_name
+ ```
2. **Field Mapping**:
- - **Value fields**: Select `error_cnt` for threshold evaluation.
- - **Label fields**: Select `service_name` to identify the alert object. After you select label fields, other non-value fields are carried with the alert as additional information.
- - See [Query Result Field Mapping](/en/monitors/alert-rules/query-result-fields) for the complete behavior.
+ - **Value fields**: Select `error_cnt` for threshold evaluation.
+ - **Label fields**: Select `service_name` to identify the alert object. After you select label fields, other non-value fields are carried with the alert as additional information.
+ - See [Query Result Field Mapping](/en/monitors/alert-rules/query-result-fields) for the complete behavior.
3. **Threshold Conditions**:
- - Use `$A.field_name` to reference values.
- - Example: `Critical: $A.error_cnt > 50`, `Warning: $A.error_cnt > 10`.
+ - Use `$A.field_name` to reference values.
+ - Example: `Critical: $A.error_cnt > 50`, `Warning: $A.error_cnt > 10`.
### How It Works
@@ -50,23 +50,23 @@ Monitors distinguishes alert objects by their label fields and evaluates thresho
| **Recovery Query** | Independent SQL for recovery evaluation, supports `${label_name}` variables |
| **Manual Close** | Keep the alert active until it is closed manually |
-## 2. Data Exists Mode
+## Data Exists Mode
This mode is suitable for scenarios where filter logic is written directly in SQL.
### Configuration
1. **Query Statement**: Use `HAVING` clause in SQL to directly filter out anomalous data.
- - Example: Directly query services with error count exceeding 50.
- ```sql
- SELECT
- service_name,
- count(*) AS error_cnt
- FROM app_log
- WHERE timestamp > now() - INTERVAL 5 MINUTE AND level = 'error'
- GROUP BY service_name
- HAVING count(*) > 50
- ```
+ - Example: Directly query services with error count exceeding 50.
+ ```sql
+ SELECT
+ service_name,
+ count(*) AS error_cnt
+ FROM app_log
+ WHERE timestamp > now() - INTERVAL 5 MINUTE AND level = 'error'
+ GROUP BY service_name
+ HAVING count(*) > 50
+ ```
2. **Evaluation Rules**: As long as SQL query returns data, triggers alert.
### Pros and Cons Analysis
@@ -82,20 +82,20 @@ This mode is suitable for scenarios where filter logic is written directly in SQ
- **Recovery Query**: Supports configuring additional query statements to assist in determining recovery status
- **Manual Close**: Keep the alert active until it is closed manually
-## 3. No Data Mode
+## No Data Mode
This mode is used to monitor scenarios where "data is expected but actually missing".
### Configuration
1. **Query Statement**: Write a SQL query that is expected to continuously return data.
- - Example: Query heartbeat reports from all probes.
- ```sql
- SELECT probe_id, max(timestamp) as last_seen
- FROM probe_heartbeat
- WHERE timestamp > now() - INTERVAL 5 MINUTE
- GROUP BY probe_id
- ```
+ - Example: Query heartbeat reports from all probes.
+ ```sql
+ SELECT probe_id, max(timestamp) as last_seen
+ FROM probe_heartbeat
+ WHERE timestamp > now() - INTERVAL 5 MINUTE
+ GROUP BY probe_id
+ ```
2. **Evaluation Rules**: If a `probe_id` appeared in previous cycles but cannot be found in current and N consecutive cycles, triggers "No Data" alert.
### Recovery Logic
@@ -108,7 +108,7 @@ A no-data alert's **recovery mode** is configured inside the "Alert if previousl
| **End when data reappears or the timeout expires** | The alert ends when the data reappears or the automatic close timeout is reached. The timeout is in seconds with a minimum of 1. Available only when the "Alert if previously found data is now missing" mode is enabled |
| **Manual close only** | The alert stays active until you close it manually |
-## 4. Best Practices
+## Best Practices
diff --git a/en/monitors/alert-rules/elasticsearch.mdx b/en/monitors/alert-rules/elasticsearch.mdx
index 520e57ba..1260227b 100644
--- a/en/monitors/alert-rules/elasticsearch.mdx
+++ b/en/monitors/alert-rules/elasticsearch.mdx
@@ -20,28 +20,28 @@ Due to SQL feature dependency, only **ElasticSearch 6.3** and above versions are
Use explicit, stable column aliases in SQL and match their casing exactly in field mappings. This prevents mappings from breaking when query fields change.
-## 1. Threshold Evaluation Mode
+## Threshold Evaluation Mode
This mode is suitable for scenarios requiring threshold comparison on aggregated values, such as monitoring "error log count in the last 5 minutes".
### Configuration
1. **Query Statement**: Write SQL aggregate query, returning value columns and (optional) grouping columns.
- - Example: Count error log quantity by service in the last 5 minutes.
- ```sql
- SELECT service_name, count(*) AS error_cnt
- FROM "app-logs-*"
- WHERE "@timestamp" > now() - INTERVAL 5 MINUTES AND log_level = 'ERROR'
- GROUP BY service_name
- ```
+ - Example: Count error log quantity by service in the last 5 minutes.
+ ```sql
+ SELECT service_name, count(*) AS error_cnt
+ FROM "app-logs-*"
+ WHERE "@timestamp" > now() - INTERVAL 5 MINUTES AND log_level = 'ERROR'
+ GROUP BY service_name
+ ```
2. **Field Mapping**:
- - **Label fields**: Select `service_name` to identify the alert object. After you select label fields, other non-value fields are carried with the alert as additional information.
- - **Value fields**: Select `error_cnt` for threshold evaluation.
- - If Label fields is empty, every returned field except the value fields becomes a label. See [Query Result Field Mapping](/en/monitors/alert-rules/query-result-fields) for the complete behavior.
+ - **Label fields**: Select `service_name` to identify the alert object. After you select label fields, other non-value fields are carried with the alert as additional information.
+ - **Value fields**: Select `error_cnt` for threshold evaluation.
+ - If Label fields is empty, every returned field except the value fields becomes a label. See [Query Result Field Mapping](/en/monitors/alert-rules/query-result-fields) for the complete behavior.
3. **Threshold Conditions**:
- - Use `$A.field_name` to reference values.
- - Example: `Critical: $A.error_cnt > 50`, `Warning: $A.error_cnt > 10`.
- - Shorthand: If only one value field is configured, you can directly use `$A`, like `$A > 50`.
+ - Use `$A.field_name` to reference values.
+ - Example: `Critical: $A.error_cnt > 50`, `Warning: $A.error_cnt > 10`.
+ - Shorthand: If only one value field is configured, you can directly use `$A`, like `$A > 50`.
### How It Works
@@ -74,24 +74,24 @@ WHERE "@timestamp" > now() - INTERVAL 5 MINUTES
The engine will replace variables with actual values before executing the query. If data is found, recovery is determined.
-## 2. Data Exists Mode
+## Data Exists Mode
This mode is suitable for scenarios where filter logic is written directly in SQL, or when you only care about "whether data is returned".
### Configuration
1. **Query Statement**: Use `HAVING` clause in SQL to directly filter out anomalous data.
- - Example: Directly query services with error count exceeding 50.
- ```sql
- SELECT service_name, count(*) AS error_cnt
- FROM "app-logs-*"
- WHERE "@timestamp" > now() - INTERVAL 5 MINUTES AND log_level = 'ERROR'
- GROUP BY service_name
- HAVING count(*) > 50
- ```
+ - Example: Directly query services with error count exceeding 50.
+ ```sql
+ SELECT service_name, count(*) AS error_cnt
+ FROM "app-logs-*"
+ WHERE "@timestamp" > now() - INTERVAL 5 MINUTES AND log_level = 'ERROR'
+ GROUP BY service_name
+ HAVING count(*) > 50
+ ```
2. **Field Mapping**:
- - Label fields and value fields are **optional** in this mode. If both are empty, Monitors treats every returned field as a label.
- - To identify alerts with only stable fields and keep other columns as troubleshooting context, explicitly select Label fields. See [Query Result Field Mapping](/en/monitors/alert-rules/query-result-fields).
+ - Label fields and value fields are **optional** in this mode. If both are empty, Monitors treats every returned field as a label.
+ - To identify alerts with only stable fields and keep other columns as troubleshooting context, explicitly select Label fields. See [Query Result Field Mapping](/en/monitors/alert-rules/query-result-fields).
### Recovery Logic
@@ -109,24 +109,24 @@ This mode is suitable for scenarios where filter logic is written directly in SQ
| **Pros** | Leverages ES cluster's computing power for filtering, reducing network transmission with better performance |
| **Cons** | Cannot differentiate multi-level alerts (like Info/Warning); SQL can only return data satisfying specific conditions |
-## 3. No Data Mode
+## No Data Mode
This mode is used to monitor scenarios where "data is expected but actually missing", commonly used to monitor log collection pipeline interruption or periodic task non-execution.
### Configuration
1. **Query Statement**: Write a SQL query that is expected to continuously return data.
- - Example: Query log reporting heartbeat from all hosts.
- ```sql
- SELECT host_name
- FROM "heartbeat-logs-*"
- WHERE "@timestamp" > now() - INTERVAL 5 MINUTES
- GROUP BY host_name
- ```
+ - Example: Query log reporting heartbeat from all hosts.
+ ```sql
+ SELECT host_name
+ FROM "heartbeat-logs-*"
+ WHERE "@timestamp" > now() - INTERVAL 5 MINUTES
+ GROUP BY host_name
+ ```
2. **Evaluation Rules**:
- - The engine periodically executes this SQL.
- - If a `host_name` appeared in previous cycles but no longer appears in current cycle (and N consecutive cycles) query results, triggers "No Data" alert.
- - Note: This is opposite to Data Exists mode. Data Exists means "alert when data found", No Data means "alert when data not found".
+ - The engine periodically executes this SQL.
+ - If a `host_name` appeared in previous cycles but no longer appears in current cycle (and N consecutive cycles) query results, triggers "No Data" alert.
+ - Note: This is opposite to Data Exists mode. Data Exists means "alert when data found", No Data means "alert when data not found".
### Recovery Logic
@@ -138,7 +138,7 @@ A no-data alert's **recovery mode** is configured inside the "Alert if previousl
| **End when data reappears or the timeout expires** | The alert ends when the data reappears or the automatic close timeout is reached. The timeout is in seconds with a minimum of 1. Available only when the "Alert if previously found data is now missing" mode is enabled |
| **Manual close only** | The alert stays active until you close it manually |
-## 4. Use Case
+## Use Case
Log alerting often encounters this requirement: count ERROR logs in the last 5 minutes, alert if exceeding threshold, and display the most recent ERROR log as a sample in the alert message. Configuration approach:
diff --git a/en/monitors/alert-rules/loki.mdx b/en/monitors/alert-rules/loki.mdx
index fe8b635f..66ac651e 100644
--- a/en/monitors/alert-rules/loki.mdx
+++ b/en/monitors/alert-rules/loki.mdx
@@ -18,7 +18,7 @@ Loki's query language LogQL is divided into two types:
When writing LogQL, the query input autocompletes label names and label values from the data source, helping you locate log streams quickly.
-## 1. Threshold Evaluation Mode
+## Threshold Evaluation Mode
This mode is suitable for scenarios requiring multi-level threshold evaluation on log aggregate values (e.g., Info/Warning/Critical).
@@ -48,7 +48,7 @@ The engine executes LogQL query and gets time series data with labels (Vector).
| **Recovery Query** | Supports independent LogQL for recovery evaluation |
| **Manual Close** | Keep the alert active until it is closed manually |
-## 2. Data Exists Mode
+## Data Exists Mode
This mode is suitable for users who prefer writing filter conditions directly in LogQL, or scenarios that only care about "whether anomalous data exists". Recommended for log anomaly detection alerts.
@@ -77,7 +77,7 @@ count_over_time({job="ingress"} |= "error-code-500" [5m]) / count_over_time({job
- **Recovery Query**: Supports configuring additional query statements to assist in determining recovery status
- **Manual Close**: Keep the alert active until it is closed manually
-## 3. No Data Mode
+## No Data Mode
This mode is used to monitor whether log reporting pipeline is interrupted, or whether logs that should be continuously generated have stopped.
@@ -108,7 +108,7 @@ A no-data alert's **recovery mode** is configured inside the "Alert if previousl
- Monitor whether Promtail/Fluentd and other collection Agents have stopped working
- Monitor whether critical business logs (like order creation logs) are abnormally interrupted
-## 4. Using a raw log query as the primary query
+## Using a raw log query as the primary query
To alert whenever matching log rows exist, select **Raw log** and use **Data exists** mode. Suppose the query returns `job`, `service`, `__time__`, and `__log__`:
@@ -122,11 +122,11 @@ Do not use frequently changing fields such as `__time__`, `__log__`, or a trace
See [Query Result Field Mapping](/en/monitors/alert-rules/query-result-fields) for default behavior, threshold references, and multi-query matching requirements.
-## 5. Getting raw logs through a related query
+## Getting raw logs through a related query
Original logs can be obtained through related queries during alerts. But typically not recommended to get too many; just get 1 as a log sample to include in alert message.
-
+
Related query results can be rendered in "Notes Description", example:
diff --git a/en/monitors/alert-rules/mysql.mdx b/en/monitors/alert-rules/mysql.mdx
index 18a21e43..3d5d9a0e 100644
--- a/en/monitors/alert-rules/mysql.mdx
+++ b/en/monitors/alert-rules/mysql.mdx
@@ -13,29 +13,29 @@ Monitors supports using standard SQL syntax to query MySQL and trigger alerts ba
| **Field Processing** | All field names are automatically converted to lowercase; please use lowercase letters when configuring |
| **Time Processing** | Recommended to use `now()`, `unix_timestamp()` and other functions for time filtering |
-## 1. Threshold Evaluation Mode
+## Threshold Evaluation Mode
This mode is suitable for scenarios requiring threshold comparison on aggregated values.
### Configuration
1. **Query Statement**: Write SQL aggregate query, returning value columns and (optional) label columns.
- - Example: Count error log quantity by service in the last 5 minutes (assuming there's a log table).
- ```sql
- SELECT
- service_name,
- count(*) AS error_cnt
- FROM app_log
- WHERE log_time > now() - INTERVAL 5 MINUTE AND level = 'error'
- GROUP BY service_name
- ```
+ - Example: Count error log quantity by service in the last 5 minutes (assuming there's a log table).
+ ```sql
+ SELECT
+ service_name,
+ count(*) AS error_cnt
+ FROM app_log
+ WHERE log_time > now() - INTERVAL 5 MINUTE AND level = 'error'
+ GROUP BY service_name
+ ```
2. **Field Mapping**:
- - **Value fields**: Select `error_cnt` for threshold evaluation.
- - **Label fields**: Select `service_name` to identify the alert object. After you select label fields, other non-value fields are carried with the alert as additional information.
- - See [Query Result Field Mapping](/en/monitors/alert-rules/query-result-fields) for the complete behavior.
+ - **Value fields**: Select `error_cnt` for threshold evaluation.
+ - **Label fields**: Select `service_name` to identify the alert object. After you select label fields, other non-value fields are carried with the alert as additional information.
+ - See [Query Result Field Mapping](/en/monitors/alert-rules/query-result-fields) for the complete behavior.
3. **Threshold Conditions**:
- - Use `$A.field_name` to reference values.
- - Example: `Critical: $A.error_cnt > 50`, `Warning: $A.error_cnt > 10`.
+ - Use `$A.field_name` to reference values.
+ - Example: `Critical: $A.error_cnt > 50`, `Warning: $A.error_cnt > 10`.
### How It Works
@@ -50,23 +50,23 @@ Monitors distinguishes alert objects by their label fields and evaluates thresho
| **Recovery Query** | Independent SQL for recovery evaluation, supports `${label_name}` variables |
| **Manual Close** | Keep the alert active until it is closed manually |
-## 2. Data Exists Mode
+## Data Exists Mode
This mode is suitable for scenarios where filter logic is written directly in SQL.
### Configuration
1. **Query Statement**: Use `HAVING` clause in SQL to directly filter out anomalous data.
- - Example: Directly query services with error count exceeding 50.
- ```sql
- SELECT
- service_name,
- count(*) AS error_cnt
- FROM app_log
- WHERE log_time > now() - INTERVAL 5 MINUTE AND level = 'error'
- GROUP BY service_name
- HAVING count(*) > 50
- ```
+ - Example: Directly query services with error count exceeding 50.
+ ```sql
+ SELECT
+ service_name,
+ count(*) AS error_cnt
+ FROM app_log
+ WHERE log_time > now() - INTERVAL 5 MINUTE AND level = 'error'
+ GROUP BY service_name
+ HAVING count(*) > 50
+ ```
2. **Evaluation Rules**: As long as SQL query returns data (Result Set is not empty), triggers alert.
### Pros and Cons Analysis
@@ -82,20 +82,20 @@ This mode is suitable for scenarios where filter logic is written directly in SQ
- **Recovery Query**: Supports configuring additional query statements to assist in determining recovery status
- **Manual Close**: Keep the alert active until it is closed manually
-## 3. No Data Mode
+## No Data Mode
This mode is used to monitor scenarios where "data is expected but actually missing".
### Configuration
1. **Query Statement**: Write a SQL query that is expected to continuously return data.
- - Example: Query heartbeat reports from all probes.
- ```sql
- SELECT probe_id, max(check_time) as last_seen
- FROM probe_heartbeat
- WHERE check_time > now() - INTERVAL 5 MINUTE
- GROUP BY probe_id
- ```
+ - Example: Query heartbeat reports from all probes.
+ ```sql
+ SELECT probe_id, max(check_time) as last_seen
+ FROM probe_heartbeat
+ WHERE check_time > now() - INTERVAL 5 MINUTE
+ GROUP BY probe_id
+ ```
2. **Evaluation Rules**: If a `probe_id` appeared in previous cycles but cannot be found in current and N consecutive cycles, triggers "No Data" alert.
### Recovery Logic
@@ -108,7 +108,7 @@ A no-data alert's **recovery mode** is configured inside the "Alert if previousl
| **End when data reappears or the timeout expires** | The alert ends when the data reappears or the automatic close timeout is reached. The timeout is in seconds with a minimum of 1. Available only when the "Alert if previously found data is now missing" mode is enabled |
| **Manual close only** | The alert stays active until you close it manually |
-## 4. Best Practices
+## Best Practices
diff --git a/en/monitors/alert-rules/oracle.mdx b/en/monitors/alert-rules/oracle.mdx
index e4405fea..fa6a61b1 100644
--- a/en/monitors/alert-rules/oracle.mdx
+++ b/en/monitors/alert-rules/oracle.mdx
@@ -13,29 +13,29 @@ Monitors supports using standard SQL syntax to query Oracle and trigger alerts b
| **Field Processing** | All field names are automatically converted to lowercase; please use lowercase letters when configuring |
| **Time Processing** | Recommended to use `SYSDATE`, `SYSTIMESTAMP` and other functions for time filtering |
-## 1. Threshold Evaluation Mode
+## Threshold Evaluation Mode
This mode is suitable for scenarios requiring threshold comparison on aggregated values.
### Configuration
1. **Query Statement**: Write SQL aggregate query, returning value columns and (optional) label columns.
- - Example: Count error log quantity by service in the last 5 minutes.
- ```sql
- SELECT
- service_name,
- count(*) AS error_cnt
- FROM app_log
- WHERE log_time > SYSDATE - INTERVAL '5' MINUTE AND level = 'error'
- GROUP BY service_name
- ```
+ - Example: Count error log quantity by service in the last 5 minutes.
+ ```sql
+ SELECT
+ service_name,
+ count(*) AS error_cnt
+ FROM app_log
+ WHERE log_time > SYSDATE - INTERVAL '5' MINUTE AND level = 'error'
+ GROUP BY service_name
+ ```
2. **Field Mapping**:
- - **Value fields**: Select `error_cnt` for threshold evaluation.
- - **Label fields**: Select `service_name` to identify the alert object. After you select label fields, other non-value fields are carried with the alert as additional information.
- - See [Query Result Field Mapping](/en/monitors/alert-rules/query-result-fields) for the complete behavior.
+ - **Value fields**: Select `error_cnt` for threshold evaluation.
+ - **Label fields**: Select `service_name` to identify the alert object. After you select label fields, other non-value fields are carried with the alert as additional information.
+ - See [Query Result Field Mapping](/en/monitors/alert-rules/query-result-fields) for the complete behavior.
3. **Threshold Conditions**:
- - Use `$A.field_name` to reference values.
- - Example: `Critical: $A.error_cnt > 50`, `Warning: $A.error_cnt > 10`.
+ - Use `$A.field_name` to reference values.
+ - Example: `Critical: $A.error_cnt > 50`, `Warning: $A.error_cnt > 10`.
### How It Works
@@ -50,23 +50,23 @@ Monitors distinguishes alert objects by their label fields and evaluates thresho
| **Recovery Query** | Independent SQL for recovery evaluation, supports `${label_name}` variables |
| **Manual Close** | Keep the alert active until it is closed manually |
-## 2. Data Exists Mode
+## Data Exists Mode
This mode is suitable for scenarios where filter logic is written directly in SQL.
### Configuration
1. **Query Statement**: Use `HAVING` clause in SQL to directly filter out anomalous data.
- - Example: Directly query services with error count exceeding 50.
- ```sql
- SELECT
- service_name,
- count(*) AS error_cnt
- FROM app_log
- WHERE log_time > SYSDATE - INTERVAL '5' MINUTE AND level = 'error'
- GROUP BY service_name
- HAVING count(*) > 50
- ```
+ - Example: Directly query services with error count exceeding 50.
+ ```sql
+ SELECT
+ service_name,
+ count(*) AS error_cnt
+ FROM app_log
+ WHERE log_time > SYSDATE - INTERVAL '5' MINUTE AND level = 'error'
+ GROUP BY service_name
+ HAVING count(*) > 50
+ ```
2. **Evaluation Rules**: As long as SQL query returns data, triggers alert.
### Pros and Cons Analysis
@@ -82,20 +82,20 @@ This mode is suitable for scenarios where filter logic is written directly in SQ
- **Recovery Query**: Supports configuring additional query statements to assist in determining recovery status
- **Manual Close**: Keep the alert active until it is closed manually
-## 3. No Data Mode
+## No Data Mode
This mode is used to monitor scenarios where "data is expected but actually missing".
### Configuration
1. **Query Statement**: Write a SQL query that is expected to continuously return data.
- - Example: Query heartbeat reports from all probes.
- ```sql
- SELECT probe_id, max(check_time) as last_seen
- FROM probe_heartbeat
- WHERE check_time > SYSDATE - INTERVAL '5' MINUTE
- GROUP BY probe_id
- ```
+ - Example: Query heartbeat reports from all probes.
+ ```sql
+ SELECT probe_id, max(check_time) as last_seen
+ FROM probe_heartbeat
+ WHERE check_time > SYSDATE - INTERVAL '5' MINUTE
+ GROUP BY probe_id
+ ```
2. **Evaluation Rules**: If a `probe_id` appeared in previous cycles but cannot be found in current and N consecutive cycles, triggers "No Data" alert.
### Recovery Logic
@@ -108,7 +108,7 @@ A no-data alert's **recovery mode** is configured inside the "Alert if previousl
| **End when data reappears or the timeout expires** | The alert ends when the data reappears or the automatic close timeout is reached. The timeout is in seconds with a minimum of 1. Available only when the "Alert if previously found data is now missing" mode is enabled |
| **Manual close only** | The alert stays active until you close it manually |
-## 4. Best Practices
+## Best Practices
diff --git a/en/monitors/alert-rules/postgres.mdx b/en/monitors/alert-rules/postgres.mdx
index ecd7b1c5..7a1281ec 100644
--- a/en/monitors/alert-rules/postgres.mdx
+++ b/en/monitors/alert-rules/postgres.mdx
@@ -13,29 +13,29 @@ Monitors supports using standard SQL syntax to query PostgreSQL and trigger aler
| **Field Processing** | All field names are automatically converted to lowercase; please use lowercase letters when configuring |
| **Time Processing** | Recommended to use `NOW()`, `CURRENT_TIMESTAMP` and other functions for time filtering |
-## 1. Threshold Evaluation Mode
+## Threshold Evaluation Mode
This mode is suitable for scenarios requiring threshold comparison on aggregated values.
### Configuration
1. **Query Statement**: Write SQL aggregate query, returning value columns and (optional) label columns.
- - Example: Count error log quantity by service in the last 5 minutes.
- ```sql
- SELECT
- service_name,
- count(*) AS error_cnt
- FROM app_log
- WHERE log_time > NOW() - INTERVAL '5 minutes' AND level = 'error'
- GROUP BY service_name
- ```
+ - Example: Count error log quantity by service in the last 5 minutes.
+ ```sql
+ SELECT
+ service_name,
+ count(*) AS error_cnt
+ FROM app_log
+ WHERE log_time > NOW() - INTERVAL '5 minutes' AND level = 'error'
+ GROUP BY service_name
+ ```
2. **Field Mapping**:
- - **Value fields**: Select `error_cnt` for threshold evaluation.
- - **Label fields**: Select `service_name` to identify the alert object. After you select label fields, other non-value fields are carried with the alert as additional information.
- - See [Query Result Field Mapping](/en/monitors/alert-rules/query-result-fields) for the complete behavior.
+ - **Value fields**: Select `error_cnt` for threshold evaluation.
+ - **Label fields**: Select `service_name` to identify the alert object. After you select label fields, other non-value fields are carried with the alert as additional information.
+ - See [Query Result Field Mapping](/en/monitors/alert-rules/query-result-fields) for the complete behavior.
3. **Threshold Conditions**:
- - Use `$A.field_name` to reference values.
- - Example: `Critical: $A.error_cnt > 50`, `Warning: $A.error_cnt > 10`.
+ - Use `$A.field_name` to reference values.
+ - Example: `Critical: $A.error_cnt > 50`, `Warning: $A.error_cnt > 10`.
### How It Works
@@ -50,23 +50,23 @@ Monitors distinguishes alert objects by their label fields and evaluates thresho
| **Recovery Query** | Independent SQL for recovery evaluation, supports `${label_name}` variables |
| **Manual Close** | Keep the alert active until it is closed manually |
-## 2. Data Exists Mode
+## Data Exists Mode
This mode is suitable for scenarios where filter logic is written directly in SQL.
### Configuration
1. **Query Statement**: Use `HAVING` clause in SQL to directly filter out anomalous data.
- - Example: Directly query services with error count exceeding 50.
- ```sql
- SELECT
- service_name,
- count(*) AS error_cnt
- FROM app_log
- WHERE log_time > NOW() - INTERVAL '5 minutes' AND level = 'error'
- GROUP BY service_name
- HAVING count(*) > 50
- ```
+ - Example: Directly query services with error count exceeding 50.
+ ```sql
+ SELECT
+ service_name,
+ count(*) AS error_cnt
+ FROM app_log
+ WHERE log_time > NOW() - INTERVAL '5 minutes' AND level = 'error'
+ GROUP BY service_name
+ HAVING count(*) > 50
+ ```
2. **Evaluation Rules**: As long as SQL query returns data, triggers alert.
### Pros and Cons Analysis
@@ -82,20 +82,20 @@ This mode is suitable for scenarios where filter logic is written directly in SQ
- **Recovery Query**: Supports configuring additional query statements to assist in determining recovery status
- **Manual Close**: Keep the alert active until it is closed manually
-## 3. No Data Mode
+## No Data Mode
This mode is used to monitor scenarios where "data is expected but actually missing".
### Configuration
1. **Query Statement**: Write a SQL query that is expected to continuously return data.
- - Example: Query heartbeat reports from all probes.
- ```sql
- SELECT probe_id, max(check_time) as last_seen
- FROM probe_heartbeat
- WHERE check_time > NOW() - INTERVAL '5 minutes'
- GROUP BY probe_id
- ```
+ - Example: Query heartbeat reports from all probes.
+ ```sql
+ SELECT probe_id, max(check_time) as last_seen
+ FROM probe_heartbeat
+ WHERE check_time > NOW() - INTERVAL '5 minutes'
+ GROUP BY probe_id
+ ```
2. **Evaluation Rules**: If a `probe_id` appeared in previous cycles but cannot be found in current and N consecutive cycles, triggers "No Data" alert.
### Recovery Logic
@@ -108,7 +108,7 @@ A no-data alert's **recovery mode** is configured inside the "Alert if previousl
| **End when data reappears or the timeout expires** | The alert ends when the data reappears or the automatic close timeout is reached. The timeout is in seconds with a minimum of 1. Available only when the "Alert if previously found data is now missing" mode is enabled |
| **Manual close only** | The alert stays active until you close it manually |
-## 4. Best Practices
+## Best Practices
diff --git a/en/monitors/alert-rules/prometheus.mdx b/en/monitors/alert-rules/prometheus.mdx
index b0a773ba..436cfd32 100644
--- a/en/monitors/alert-rules/prometheus.mdx
+++ b/en/monitors/alert-rules/prometheus.mdx
@@ -21,7 +21,7 @@ Used for monitoring data reporting interruption scenarios
-## 1. Threshold Evaluation Mode
+## Threshold Evaluation Mode
This mode is suitable for scenarios requiring multi-level alerts on the same metric (e.g., Info/Warning/Critical) or needing precise recovery values.
@@ -69,7 +69,7 @@ Supports multiple recovery strategies:
Recovery query statements support embedded variables (format `${label_name}`), which are automatically replaced with corresponding label values from the alert event, enabling precise detection for specific alert objects.
-## 2. Data Exists Mode
+## Data Exists Mode
This mode behaves consistently with Prometheus native alerting rules. Suitable for users who prefer defining thresholds directly in PromQL, or scenarios requiring high-performance processing of large numbers of Series.
@@ -101,7 +101,7 @@ This mode behaves consistently with Prometheus native alerting rules. Suitable f
-## 3. No Data Mode
+## No Data Mode
This mode is specifically for monitoring whether monitored objects are alive or whether data reporting pipelines are normal.
@@ -178,7 +178,7 @@ The validator tries to parse the expression as PromQL first, then as MetricsQL;
- **Length limit**: A single query statement is limited to 64KB; exceeding this limit also prevents saving.
-Save-time validation is a conservative syntax-level check only. Passing the check does not guarantee that the backend Prometheus/VictoriaMetrics instance can execute the statement.
+Save-time validation is a conservative syntax-level check only. Passing the check does not guarantee that the data source (the Prometheus/VictoriaMetrics instance) can execute the statement.
### Labels and Variables
diff --git a/en/monitors/alert-rules/query-result-fields.mdx b/en/monitors/alert-rules/query-result-fields.mdx
index 75f90150..3cbc489c 100644
--- a/en/monitors/alert-rules/query-result-fields.mdx
+++ b/en/monitors/alert-rules/query-result-fields.mdx
@@ -155,7 +155,7 @@ A data source can impose a stricter limit. For example, raw log queries for SLS,
When a query exceeds its effective limit, it fails with `too many rows`. Monitors does not return a partial result or evaluate alerts with truncated data.
-The query preview table on the rule editor page paginates in the frontend: 100 rows per page by default, with options of 100 / 200 / 500, and the paginator is hidden when the results fit in a single page. This pagination affects display only and is independent of the Edge `--alerter.previewMaxRows` limit — a query that exceeds the Edge limit still fails with `too many rows`.
+The query preview table on the rule editor page is paginated: 100 rows per page by default, with options of 100 / 200 / 500, and the paginator is hidden when the results fit in a single page. This pagination affects display only and is independent of the Edge `--alerter.previewMaxRows` limit — a query that exceeds the Edge limit still fails with `too many rows`.
Increasing the Edge row limit does not disable safeguards for response bytes, field size, or total result values. High-cardinality Prometheus queries and large SQL results can still fail on another resource limit.
diff --git a/en/monitors/alert-rules/sls.mdx b/en/monitors/alert-rules/sls.mdx
index f1a54296..40d119fc 100644
--- a/en/monitors/alert-rules/sls.mdx
+++ b/en/monitors/alert-rules/sls.mdx
@@ -14,29 +14,29 @@ Monitors retrieves data through SLS SQL query interface (GetLogsV3) and triggers
| **Time Range** | Controlled by API parameters; no need to write `WHERE __time__ > ...` in SQL |
| **Field Processing** | `__source__` and `__time__` fields are ignored by default |
-## 1. Threshold Evaluation Mode
+## Threshold Evaluation Mode
This mode is suitable for scenarios requiring threshold comparison on aggregated values.
### Configuration
1. **Query Statement**: Write SLS SQL aggregate query.
- - Example: Count error log quantity by host in the last 15 minutes.
- ```sql
- * | SELECT host, count(*) as error_cnt WHERE level = 'ERROR' GROUP BY host
- ```
+ - Example: Count error log quantity by host in the last 15 minutes.
+ ```sql
+ * | SELECT host, count(*) as error_cnt WHERE level = 'ERROR' GROUP BY host
+ ```
2. **Query Parameters**:
- - `sls.project`: (Required) Project name.
- - `sls.logstore`: (Required) Logstore name.
- - `sls.timespan.value`: (Optional) Time span value, default is 15.
- - `sls.timespan.unit`: (Optional) Time span unit, supports `s` (seconds), `m` (minutes), `h` (hours), `d` (days). Default is `m`.
+ - `sls.project`: (Required) Project name.
+ - `sls.logstore`: (Required) Logstore name.
+ - `sls.timespan.value`: (Optional) Time span value, default is 15.
+ - `sls.timespan.unit`: (Optional) Time span unit, supports `s` (seconds), `m` (minutes), `h` (hours), `d` (days). Default is `m`.
3. **Field Mapping**:
- - **Value fields**: Select `error_cnt` for threshold evaluation.
- - **Label fields**: Select `host` to identify the alert object. After you select label fields, other non-value fields are carried with the alert as additional information.
- - See [Query Result Field Mapping](/en/monitors/alert-rules/query-result-fields) for the complete behavior.
+ - **Value fields**: Select `error_cnt` for threshold evaluation.
+ - **Label fields**: Select `host` to identify the alert object. After you select label fields, other non-value fields are carried with the alert as additional information.
+ - See [Query Result Field Mapping](/en/monitors/alert-rules/query-result-fields) for the complete behavior.
4. **Threshold Conditions**:
- - Use `$A.field_name` to reference values.
- - Example: `Critical: $A.error_cnt > 50`, `Warning: $A.error_cnt > 10`.
+ - Use `$A.field_name` to reference values.
+ - Example: `Critical: $A.error_cnt > 50`, `Warning: $A.error_cnt > 10`.
### How It Works
@@ -51,17 +51,17 @@ Monitors runs the SLS query for the configured time range, distinguishes alert o
| **Recovery Query** | Independent SQL for recovery evaluation, supports `${label_name}` variables |
| **Manual Close** | Keep the alert active until it is closed manually |
-## 2. Data Exists Mode
+## Data Exists Mode
This mode is suitable for scenarios where filter logic is written directly in SQL.
### Configuration
1. **Query Statement**: Use `HAVING` clause to filter anomalous data.
- - Example: Query hosts with error count exceeding 50.
- ```sql
- * | SELECT host, count(*) as error_cnt WHERE level = 'ERROR' GROUP BY host HAVING error_cnt > 50
- ```
+ - Example: Query hosts with error count exceeding 50.
+ ```sql
+ * | SELECT host, count(*) as error_cnt WHERE level = 'ERROR' GROUP BY host HAVING error_cnt > 50
+ ```
2. **Query Parameters**: Same as above, need to configure `sls.project` and `sls.logstore`.
3. **Evaluation Rules**: As long as query returns data, triggers alert.
@@ -78,39 +78,29 @@ This mode is suitable for scenarios where filter logic is written directly in SQ
- **Recovery Query**: Supports configuring additional query statements
- **Manual Close**: Keep the alert active until it is closed manually
-## 3. No Data Mode
+## No Data Mode
This mode is used to monitor scenarios where "data is expected but actually missing".
-SLS is a cloud log service data source and does not support per-series no-data detection. It keeps only one condition, **Alert when all queries return no data**:
-
-- The UI shows a single condition card, "Alert when all queries return no data", backed by the `alert_on_empty_result` and `alert_on_empty_result_severity` fields.
-- The per-series card, "Alert if previously found data is now missing", is not rendered for SLS rules, so its config field `check_nodata.enabled` cannot be set at all.
-- Tencent Cloud CLS also disables this condition, and enforces it in the backend (submitting `check_nodata.enabled` is rejected with a 400); SLS is currently disabled by the frontend, without a backend guard.
+SLS does not support per-series no-data detection. Only "**Alert when all queries return no data**" is available; "Alert if previously found data is now missing" is not supported.
### Configuration
1. **Query Statement**: Write a query that is expected to continuously return data.
- - Example: Query log reporting heartbeat from all hosts.
- ```sql
- * | SELECT host, max(__time__) as last_seen GROUP BY host
- ```
+ - Example: Query log reporting heartbeat from all hosts.
+ ```sql
+ * | SELECT host, max(__time__) as last_seen GROUP BY host
+ ```
2. **Evaluation Rules**: The alert fires when all queries return empty results for N consecutive checks. N comes from the **Trigger condition** shared by the tab.
### Existing Rules with Per-Series Detection Enabled
-For an existing SLS rule that has per-series no-data detection enabled, opening its edit page turns that condition off automatically (`check_nodata.enabled` is loaded as off) and shows a toast:
-
-
-This datasource type does not support "Alert if previously found data is now missing"; the check has been turned off automatically and takes effect on save
-
-
-The rule detail page is read-only and does not show this toast. The condition is turned off inside the edit page: as long as you do not open the edit page, the rule's config does not change; once you open it and save, the off state is written back to the rule. The automatic turn-off applies to this condition only, so at save time:
+If an existing SLS rule has per-series no-data detection enabled, opening its edit page turns that condition off automatically; the change takes effect when you save. The rule does not change unless you open the edit page.
-- If the rule still has other enabled conditions (threshold evaluation, data exists), the "at least one must be enabled" validation does not block this downgrade, and per-series detection stops working with that save — which is exactly why the toast above is shown.
-- If this was the rule's only condition, the save is blocked by the "Threshold evaluation, Data missing, Data exists at least one must be enabled" validation, and you must change the configuration explicitly before it can be saved.
+- If the rule has other enabled conditions (threshold evaluation, data exists), you can save directly.
+- If this was its only condition, enable at least one condition before saving.
-After opening such a rule, switch its no-data detection to "Alert when all queries return no data", make sure at least one alert condition is enabled, and then save.
+Switch to "Alert when all queries return no data" and make sure at least one condition is enabled before saving.
### Recovery Logic
@@ -122,7 +112,7 @@ The **recovery mode** of "Alert when all queries return no data" is not configur
The former recovery-mode dropdown (`End automatically when data reappears` / `End when data reappears or the timeout expires` / `Manual close only`) exists only inside the per-series card, so it is unavailable for SLS. The only configurable items shared by the conditions on the no-data tab are the trigger and recovery settings (`Trigger mode`, `Trigger condition`, `Recovery condition`).
-## 4. Advanced Configuration
+## Advanced Configuration
diff --git a/en/monitors/alert-rules/tencent-cls.mdx b/en/monitors/alert-rules/tencent-cls.mdx
index 5dcd5503..e05dba4c 100644
--- a/en/monitors/alert-rules/tencent-cls.mdx
+++ b/en/monitors/alert-rules/tencent-cls.mdx
@@ -10,7 +10,7 @@ Monitors retrieves data through the Tencent Cloud Log Service (CLS) search and a
| Config Item | Description |
|--------|------|
| **Query Resource** | Each query must specify `tencent_cls.region` (region) and `tencent_cls.topic_id` (log topic); logsets are used only for filtering in the UI and are neither saved nor executed |
-| **Query Mode** | `raw` log search returns log lines; `analysis` SQL analysis returns aggregated rows. The backend executes exactly what is stored and never infers it from the expression |
+| **Query Mode** | `raw` log search returns log lines; `analysis` SQL analysis returns aggregated rows. The rule runs in the selected mode; it is never inferred from the query |
| **Search Syntax** | Raw log search uses the syntax set by `tencent_cls.syntax`: `CQL` or `Lucene` |
| **Time Range** | Controlled by parameters; no need to write time filters in the query statement |
| **Execution Identifier** | Only the log topic ID is used at execution time; the topic name is for display only |
@@ -50,7 +50,7 @@ Searches logs with CQL or Lucene syntax and returns matching log lines. Each ret
Aggregates logs with SQL and returns aggregated rows, suitable for threshold and data-exists evaluation.
- The time window is capped at **24 hours**.
-- `tencent_cls.limit` is not allowed; including it is rejected by the backend.
+- `tencent_cls.limit` is not allowed; including it is rejected.
## Time Range
@@ -60,23 +60,22 @@ The default query window is the last 15 minutes (`tencent_cls.timespan.value=15`
### Single Data Source Binding
-Tencent CLS rules can bind exactly **one data source** and do not support name patterns. When creating a rule, the data source picker is single-select and the name-pattern input is hidden. An invalid configuration is rejected on save with "This data source type can bind only one data source" or "This data source type does not support name patterns. Clear them and pick one data source."
+Tencent CLS rules can bind exactly **one data source** and do not support name patterns.
### Topic Index Requirement
-A log topic must have indexing enabled for search and SQL analysis to return results. Topics without indexing are tagged "Index not enabled" in the topic list; after you select such a topic, the editor warns: "This topic has no index configured, so neither search nor SQL analysis will return results. Configure an index in the Tencent Cloud console first." Queries against such topics keep returning empty results.
+A log topic must have indexing enabled, otherwise search and SQL analysis return no results. Topics without indexing are marked in the topic list; configure an index in the Tencent Cloud console first.
### Topic ID Execution
-The topic picker supports searching by name or pasting a topic ID directly. Only the topic ID is saved into the rule and used at execution time; the logset filter is display-only and never saved. When editing an existing rule whose topic has been deleted, the UI reports "Topic does not exist or has been deleted" and you need to pick a topic again.
+You can search topics by name or paste a topic ID. Rules save and run against the topic ID only (the logset filter is just for finding topics and is not saved). If the topic has been deleted, pick a topic again when editing the rule.
## No Data Detection
Tencent CLS does not support per-series no-data detection:
-- Only one condition card is supported: "**Alert when all queries return no data**".
-- The "Alert if previously found data is now missing" option is not available — enabling it submits `check_nodata.enabled`, which the backend rejects with a 400 — so the card does not appear in the UI.
-- The **recovery mode** is not configurable: there are no options, and the engine fixes it to "Recovers automatically once any query returns data again", shown as read-only text in the UI. "Manual close only" does not exist here — the recovery-mode dropdown (`End automatically when data reappears` / `End when data reappears or the timeout expires` / `Manual close only`) is rendered only inside the per-series card, which never appears for CLS rules, so none of the three is selectable.
+- Only "**Alert when all queries return no data**" is available; "Alert if previously found data is now missing" is not supported (not even through the API).
+- Recovery is fixed to **recovering automatically once any query returns data again**; it cannot be configured, and manual-close-only is not available.
## Recovery Queries and Related Queries
diff --git a/en/monitors/alert-rules/victorialogs.mdx b/en/monitors/alert-rules/victorialogs.mdx
index f6858533..e17784ef 100644
--- a/en/monitors/alert-rules/victorialogs.mdx
+++ b/en/monitors/alert-rules/victorialogs.mdx
@@ -5,7 +5,7 @@ description: "Configure alert rules for VictoriaLogs data sources"
Monitors queries VictoriaLogs via HTTP, supporting querying raw logs and statistical analysis, and performing threshold evaluation and data exists/missing checks based on results.
-## 1. Prerequisites
+## Prerequisites
### Query Modes
@@ -39,7 +39,7 @@ Query statement must include `_time` filter condition (like `_time:5m`), otherwi
VictoriaLogs data source most recommends using "Data Exists Mode", best suited for log scenarios.
-## 2. Threshold Evaluation Mode
+## Threshold Evaluation Mode
Both **Query Raw** and **Do Stats** query modes can be used. Examples below explain each.
@@ -89,7 +89,7 @@ Different threshold different level configuration examples:
| **Recovery Query** | Independent query for recovery evaluation, supports `${label_name}` variables |
| **Manual Close** | Keep the alert active until it is closed manually |
-## 3. Data Exists Mode
+## Data Exists Mode
This is the **most recommended VictoriaLogs alert configuration method**, because log scenarios are better suited for "alert when anomalous data exists" mode.
@@ -115,7 +115,7 @@ If Label fields is empty, every returned field except the value fields becomes a
See [Query Result Field Mapping](/en/monitors/alert-rules/query-result-fields) for details.
-## 4. No Data Mode
+## No Data Mode
No Data mode is used to monitor "logs that should be continuously generated are no longer appearing", common scenarios:
@@ -142,11 +142,11 @@ A no-data alert's **recovery mode** is configured inside the "Alert if previousl
| **End when data reappears or the timeout expires** | The alert ends when the data reappears or the automatic close timeout is reached. The timeout is in seconds with a minimum of 1. Available only when the "Alert if previously found data is now missing" mode is enabled |
| **Manual close only** | The alert stays active until you close it manually |
-## 5. Getting Original Logs During Alert
+## Getting Original Logs During Alert
Alert query conditions typically use "Do Stats" mode, which doesn't return original logs. Monitors supports configuring "Related Query" in alert rules to additionally query original logs when alert triggers.
-
+
"Related Query" results can be rendered in "Notes Description", example:
diff --git a/en/monitors/dashboards/dashboards.mdx b/en/monitors/dashboards/dashboards.mdx
index a87d62cf..f3c4a675 100644
--- a/en/monitors/dashboards/dashboards.mdx
+++ b/en/monitors/dashboards/dashboards.mdx
@@ -6,315 +6,255 @@ keywords: ["dashboard", "panel", "template variables", "comparison", "version hi
A dashboard turns queries into charts: it is made of tabs, sections and panels, and each panel binds one data source with a set of queries, evaluated live for the current time range and variable selections every time it opens. It is the right place to pin down the few charts you keep opening for routine inspection and incident review, instead of rewriting the queries in the [Query Workbench](/en/monitors/explore/explore) every time.
-## Overview and entry points
+## Where to find it
-- **Menu entry**: **Visualization → Dashboards** in the left menu (frontend route `/monit/dashboards`). Both the menu item and the page routes are gated on the "Datasource Visit" permission, so anyone who can see data sources can see the dashboard entry.
-- **From the Query Workbench**: a query that has produced a result can be saved straight to a dashboard through **Save to dashboard**, see [Create and save a dashboard](#create-and-save-a-dashboard).
+- **Menu**: **Visualization → Dashboards** in the left menu. Members who can view data sources see this entry.
+- **From the Query Workbench**: save a query that returns results straight to a dashboard — see [Create and save a dashboard](#create-and-save-a-dashboard).
-Access to a dashboard is decided by the **folder** it lives in, not by the dashboard itself: reads inherit the folder read permission, while write operations require the "Dashboard Manage" permission plus read access to the folder. See [Permissions](#permissions).
+Whether you can view or edit a dashboard depends on its **folder** — see [Permissions](#permissions).
## List and folders
-**Menu entry**: Visualization → Dashboards
+The left side is the folder tree shared with alert rules; the right side lists the dashboards in the current folder. Folders are created, renamed, moved and deleted on the tree — see [Folder management](/en/monitors/folders/folders).
-The left side is the folder tree shared with alert rules (the same `/monit/folder/list` API), and the right side lists the dashboards in the selected folder. Creating, renaming, moving and deleting folders all happen on that tree, and are governed by folder permissions — see [Folder management](/en/monitors/folders/folders).
-
-| Column | Description |
-|--------|-------------|
-| **Title** | Dashboard name; click to open the viewer |
-| **Updated by** | The user who last saved this dashboard |
-| **Updated at** | Time of the last save |
-| **Actions** | Shown with the "Dashboard Manage" permission: edit, delete, and the **More** menu (Move to another folder / Clone in this folder / Clone to another folder) |
-
-- **The search box only searches the current folder**, never across folders. Input is debounced by 300 ms, and the folder, search term and page number are all reflected in the URL (`folder_id`, `q`), so a list link can be shared and survives a refresh. Clicking the breadcrumb in the viewer returns you to the list with the same conditions you left it in.
-- **Paging** defaults to 20 rows per page.
-- An empty folder shows "No dashboards in this folder yet", and users with manage permission can create one straight from that empty state.
+- Search covers the **current folder** only.
+- The folder, search term and page are kept in the page address, so links can be shared and returning from a dashboard restores the list.
+- Each row's **More** menu offers: move to another folder, clone to this folder, clone to another folder. A clone is a new dashboard whose title gets a "copy" suffix and **does not carry version history**; moving or cloning into another folder requires read access to that folder.
## Create and save a dashboard
-**Create**: **New dashboard** at the top right of the list page (manage permission required), which opens `/monit/dashboards/new?edit=1`. A new dashboard starts with the title "Untitled dashboard", a default time range of the last hour, auto-refresh off, a single tab titled `Overview`, and no panels.
-
-**Save from the Query Workbench**: the workbench's **Save to dashboard** button turns the current query into a panel. In the dialog you can choose:
-
-| Option | Description |
-|--------|-------------|
-| **New dashboard** | Pick a folder and type a dashboard title; the dashboard is really created in that folder first, then opened in edit mode |
-| **Existing dashboard** | Pick a folder, then pick one of the dashboards in it; the dashboard opens in edit mode with this panel appended to the bottom of its first tab — **nothing is written until you save** |
-| **Panel title** | Panel name; empty means "Untitled panel" |
-| **Visualization** | Recommended from the last successful result (logs → Logs, sampled time series → Time series, otherwise → Table), and changeable |
-
-Prometheus runs both a range and an instant query in the workbench (Both); when the panel is saved it is stored as `Range` with the notice "Query type Both was saved as Range" — dashboards do not accept Both.
+**Create**: click **New dashboard** at the top right of the list (requires the Dashboard management permission). A new dashboard defaults to "Last 1 hour" and starts with one empty `Overview` tab.
-**Edit mode** works on a whole-dashboard draft kept in the browser:
+**Save from the Query Workbench**: click **Save to dashboard** in the workbench, choose a new or an existing dashboard, enter a chart title and pick a chart type (one is suggested from the query result; you can change it). When saving to an existing dashboard the panel is appended to the bottom of the first tab and takes effect only when you save.
-- The header lets you change the folder (new dashboards only) and the title; on the right are the time range, undo / redo (`⌘Z` / `⌘⇧Z`), cancel and save.
-- Every change (adding a panel, dragging the layout, editing variables or configuration) goes into the draft, one undo step per action, and is **lost when you refresh** (there is no server-side draft); leaving the page with unsaved changes is intercepted with "The draft is not saved. Leave anyway?".
-- **Save**: the title is required, and a new dashboard also requires a folder. The dialog takes an optional **version message** (up to 1024 characters) and states "The full definition will be submitted as a new revision (current vN)". The whole definition is submitted and a successful save creates a new revision; when the server finds nothing changed it reports "No changes". For an existing dashboard with no changes the save button is disabled.
-- **Use the current time range as the dashboard default**: when the range you browsed with is one of the relative presets (15m / 30m / 1h / 3h / 6h / 12h / 24h / 7d) and differs from the stored default, the save dialog offers the checkbox "Set current time range (…) as dashboard default".
-- **Concurrent edits**: if someone saved while you were editing, the save fails with "Dashboard was updated by someone else" and three options: **Save as copy…** (pick a folder and save a second copy), **Discard draft and load latest** (drop your draft and return to the viewer), or **Keep editing** (keep the draft — it is never merged automatically).
-- **Validation failure**: a "Save failed: definition validation errors" dialog lists each offending JSON Pointer path with its reason.
+
+Dashboards do not support Prometheus's Both query mode. A workbench query that runs as Both is saved to the panel as Range.
+
-**The remaining list actions**:
+**Editing and saving**:
-| Action | Description |
-|--------|-------------|
-| **Clone in this folder / Clone to another folder** | Builds a second dashboard from the full definition (new ID, title suffixed with "(copy)") and **does not carry history** |
-| **Move to another folder** | Changes the folder; the destination must be readable |
-| **Edit** | Opens the dashboard in edit mode |
-| **Delete** | See [Delete and trash](#delete-and-trash) |
+- Every change while editing is a draft you can undo / redo (`⌘Z` / `⌘⇧Z`). The draft lives only in the current browser page and is **lost on refresh**; you are warned before leaving the page.
+- When saving you can add a **version message** (optional, up to 1024 characters). Every save creates a new version.
+- If the relative time range you were previewing differs from the default, you can tick an option to make it the dashboard's default time range.
+- If someone else saved while you were editing, the save fails and you can save a copy, discard your draft and load the latest version, or keep editing. Drafts are never merged automatically.
## Tabs, sections and panel layout
-- **Tabs** are the top-level divisions of a dashboard: one by default, at most 10. Double-click a tab title to rename it; deleting a tab asks for confirmation first and reports "Contains N sections and M panels."
-- **Sections** sit inside a tab, like Grafana rows: the title row is always visible and the section can be collapsed. **A collapsed section loads no data**, and its header reads "(N panels · collapsed, not loading)". A tab holds at most 10 sections.
-- **Panels** are laid out on a 24-column grid. A new panel is `12×8` and lands at the bottom of its container; on the canvas you can drag, resize, duplicate (the copy is inserted below the original) and delete them.
-- A tab holds at most 30 panels and a whole dashboard at most 100.
-- A panel can carry a description next to its title: by default it is tucked into the ⓘ tooltip, and the panel option **Use as subtitle** moves it below the title. Descriptions render Markdown like text panels do, without images or raw HTML.
-- An empty canvas points you at "Start with your first chart / Pick a datasource, write a query, and refine with live preview", with **Add panel** and **New section** buttons.
+- **Tabs** are the top-level divisions of a dashboard. Double-click a title to rename it.
+- **Sections** live inside a tab and can be collapsed. **Collapsed sections do not load data**, which makes them a good place for charts you rarely need.
+- **Panels** sit on a 24-column grid and can be dragged, resized, duplicated and deleted.
+- A panel description appears in the ⓘ tooltip next to the title by default, or as a subtitle below it; descriptions do not support images or HTML.
+- Only panels in the current tab and in expanded sections load, with panels in view first.
-Panels are **lazy-loaded**: only the panels of the active tab and of expanded sections are scheduled, at most 4 queries are in flight at once, and panels inside the viewport go first. While refreshing, the previous chart stays on screen at half opacity; only the very first load shows a skeleton.
+For limits, see [Quotas and limits](#quotas-and-limits).
## Panel types and queries
-The panel editor shows a preview on the left and configuration on the right, grouped like Grafana: panel / legend / graph styles / standard options / thresholds / drill-down. **Visualization** offers seven types:
+The panel editor shows a preview on the left and configuration on the right. Available chart types:
-| Visualization | Description | Selectable |
-|---------------|-------------|-----------|
-| **Time series** | Trends over time; compare multiple series | Yes |
-| **Table** | Rows and columns of details; good for instant queries | Yes |
-| **Stat** | One key number with threshold coloring | Yes |
-| **Text** | Markdown notes, without a data source or queries | Yes |
-| **Bar** | Compare values across categories | Greyed out, marked "Coming in a later release" |
-| **Gauge** | Where a value sits within a range | Greyed out, marked "Coming in a later release" |
-| **Logs** | Stream of log lines | Greyed out, marked "Coming in a later release" |
+| Chart type | Best for |
+|---------|------|
+| **Time series** | Trends over time, with multiple series for comparison |
+| **Table** | Rows and columns of detail, good for instant query results |
+| **Stat** | One key number, with threshold colouring |
+| **Text** | Markdown notes; needs no data source or query |
-Bar, gauge and logs are supported by the backend contract but have no renderer in the console yet, so they cannot be selected in the type picker. If you saved a Logs panel through the workbench's "Save to dashboard", the viewer shows "This visualization (logs) will be supported in a later release".
+Bar, gauge and logs chart types will be supported in a later release.
-The **datasource** dropdown only lists the types a dashboard can query at runtime — **prometheus, mysql, loki** (the same set as Dashboard Runtime; diagnostic-only data source types never appear) — and a panel can reference either a **fixed datasource** or a **datasource variable** (switch the variable to move every panel that uses it to another datasource).
+**Data source**: Prometheus, MySQL and Loki are supported. Pick a fixed data source or a **data source variable**, so switching the variable switches the whole dashboard.
-The **query type** follows from the data source and the visualization and is not chosen by hand: MySQL data sources run a time-window query (`window`), tables take an instant snapshot (`instant`), and time series and stats take a range (`range`).
+**Query mode** is chosen automatically from the data source and chart type: tables use instant values, time series and stat use ranges, and MySQL queries a time window.
| Setting | Description |
-|---------|-------------|
-| **Query expression** | Prometheus and Loki panels support `${variable}` templates (the braces are optional — `$variable` works too) as well as built-in time variables such as `$__interval`, see [Built-in time variables](#built-in-time-variables); MySQL panels support no variable interpolation; PromQL data sources prompt for a PromQL query, other types prompt by type |
-| **Multiple queries** | Queries are labelled `A`~`Z`; only time series support more than one. Switching to any other visualization forces you to pick which one to keep, and the rest are removed |
-| **Series name** | Shown for time series only. Sets the display name used by the legend, tooltip and data links; `{{instance}}` is replaced with that series' `instance` label value, and leaving it empty shows all labels. If both the legend and the tooltip are hidden, the editor tells you the setting is invisible |
-| **Min step** | Shown for Prometheus range queries only. A lower bound for the query step, 15s by default (matching Prometheus' default scrape interval); it is dropped when you switch to a data source or query type that does not accept it |
-| **Value fields** | Which fields a stat panel shows as values (several are shown side by side, names are case-sensitive); a Prometheus result has only `value`, so a Prometheus stat is fixed to it |
-| **Unit / decimals / thresholds** | Threshold direction "Higher is worse / Lower is worse", with warning and critical levels colored as text or as background |
-| **Table column configuration** | Tables configure unit, thresholds and coloring per numeric column; a Prometheus table has only the `value` column to configure. Coloring can be "None / Text / Background", and a background-colored column can be **applied to the entire row** |
-| **Value mappings** | Turn numbers into text and color (e.g. show 0 as "Offline" in red). The first matching mapping from the top wins, and its color overrides threshold colors |
-| **Drill-down** | Panel links and data links, see [Click-to-filter and drill-down links](#click-to-filter-and-drill-down-links) |
+|--------|------|
+| **Query expression** | Prometheus / Loki panels can reference template variables as `$name` or `${name}` and use [built-in time variables](#built-in-time-variables). MySQL panels do not support variables |
+| **Multiple queries** | Only time series supports multiple queries (`A`–`Z`). When switching to another chart type you choose which one to keep |
+| **Series name** | The display name of each series in a time series, e.g. `{{instance}}` becomes the `instance` label value; empty shows all labels |
+| **Min step** | The lower bound of the step for Prometheus range queries, 15s by default |
+| **Value fields** | The fields a stat panel shows; case-sensitive |
+| **Unit / decimals / thresholds** | Thresholds can be "higher is worse" or "lower is worse", with warning / critical levels coloured as text or background |
+| **Table columns** | Unit, thresholds and colouring for numeric columns; background colouring can apply to the whole row |
+| **Value mappings** | Show values as text and colour (e.g. 0 as "Offline" in red). The first matching mapping wins and overrides threshold colours |
+| **Drill-down** | Panel links and data links — see [Click-to-filter and drill-down links](#click-to-filter-and-drill-down-links) |
+
+After changing a query, press Enter (or `⌘/Ctrl + Enter`) to run the preview; changing the data source, chart type or time reruns it automatically, and display settings (unit, thresholds, etc.) apply instantly. **Saving does not require a successful preview.**
### Panel-level query options
-**Query options** sit next to the datasource and apply to **every query on the panel** (A / B share them):
+These options apply to **all queries** of the panel:
| Option | Description |
-|--------|-------------|
-| **Max data points** | Maximum points per series, which sets the query step (time range ÷ max data points). Leave it empty to derive it from the panel width; the placeholder shows the value currently in effect |
-| **Relative time** | This panel always queries the last N and ignores the dashboard time range — e.g. `5m` always shows the last 5 minutes |
-| **Time shift** | Shifts the whole query range back by N, e.g. `1d` to compare with the same time yesterday |
-| **Compare** | Period-over-period comparison, see [Period-over-period comparison](#period-over-period-comparison) |
-
-Durations are always written as a number plus a unit (`s` / `m` / `h` / `d` / `w`), such as `5m`, `1h`, `1d`; an invalid value turns the input red with "Use a duration like 5m, 1h or 1d". A panel with a relative time or a time shift is marked next to its title in blue with the range it actually queries (e.g. "Last 5 minutes · timeshift -1d"), so viewers can tell it does not follow the dashboard time range.
+|------|------|
+| **Max data points** | The maximum points per series, which sets the query step. Empty means it is calculated from the panel width |
+| **Relative time** | Always query the most recent period instead of following the dashboard's time range, e.g. `5m` |
+| **Time shift** | Shift the query window back, e.g. `1d` to compare with the same period yesterday |
+| **Comparison** | Period-over-period — see [Period-over-period comparison](#period-over-period-comparison) |
-Previewing happens live inside the panel editor: editing the query itself runs it on Enter (or `⌘/Ctrl + Enter`), while changing the datasource, visualization or time re-runs it automatically; display settings (unit, thresholds, alias and so on) apply immediately without re-querying. **Saving does not require a successful preview.** On a new dashboard with no folder selected yet, the preview area shows "Select a folder before previewing".
+Durations are "number + unit" (`s` / `m` / `h` / `d` / `w`), e.g. `5m`, `1h`, `1d`. Panels with a relative time or time shift show the actual queried time next to the title, so viewers know they do not follow the global time.
### Built-in time variables
-A panel query expression can reference built-in time variables directly; they render the seconds computed from that panel's own execution window and step, so `$__range` spares you from maintaining a hand-written variable for how long the window is.
+You can use these variables directly in a panel's query expression; they are calculated from that panel's time window and step:
-| Variable | What it renders |
-|----------|-----------------|
-| `$__interval` | The panel's query step in seconds, such as `30s`; the step follows from the time range and the **Max data points**, bounded by the **Min step** |
-| `$__rate_interval` | The larger of `step + 15s` and `60s` (15s is the assumed scrape interval) — the value to hand straight to `rate()` |
-| `$__range` | The length of the panel's execution window in seconds, e.g. `86400s` for a 24-hour window |
-| `$__auto` | In a Loki instant query, the duration of the whole window in the largest unit that divides it — `1h`, `5m`, `90s` or `90500ms`; in a Loki range query it is the step in seconds, like `$__interval` |
+| Variable | Meaning |
+|------|-----------|
+| `$__interval` | The query step, e.g. `30s`, calculated from the time range and max data points and never below the min step |
+| `$__rate_interval` | The larger of `step + 15s` and `60s`, ready to use in `rate()` |
+| `$__range` | The length of the time window, e.g. `86400s` for 24 hours |
+| `$__auto` | In Loki instant queries, the whole window length (e.g. `1h`, `5m`); in Loki range queries, the same as `$__interval` |
-The reference syntax matches variables: both `${__interval}` and `$__interval` are accepted (the braces are optional), but a built-in takes no formatter — `${__interval:raw}` and the like are rejected.
+Where they are available:
-Which ones you can use follows from the datasource and the query type; every combination outside the table below (MySQL included) is unavailable, and such a definition fails validation on save — the dialog lists the offending JSON Pointer and the reason — while the panel itself queries nothing at run time:
-
-| Datasource · query type | Available built-in time variables |
-|-------------------------|-----------------------------------|
+| Data source · query mode | Variables |
+|------------------|------------------|
| Prometheus · range | `$__interval`, `$__rate_interval`, `$__range` |
| Loki · range | `$__auto`, `$__interval`, `$__range` |
| Loki · instant | `$__auto`, `$__range` |
-Built-in time variables exist only in a **panel query expression**: neither a template variable's candidate query nor a panel query's `args` can resolve them, and the definition is rejected on save.
+
+Built-in time variables work only in **panel query expressions** — not in template variable candidate queries — and do not accept format suffixes such as `:raw`. They are not available for MySQL panels. Using them anywhere else prevents the dashboard from being saved.
+
## Template variables
-The variable bar sits above the canvas and uses the same filter control as the rest of the product: each variable is a permanent filter field, single- or multi-select according to its configuration. In edit mode the bar has a **Manage variables** button at the end, opening a drawer where every variable can be added, edited or deleted.
+The variable bar sits above the canvas; each variable is a filter. While editing, click **Manage variables** at the end of the bar to add, change or delete variables.
-There are three **variable kinds**:
+| Type | Values come from | Settings |
+|------|---------|--------|
+| **Datasource** | A specific data source | Data source type (Prometheus / MySQL / Loki), default data source |
+| **Custom** | A hand-written list | One option per line, `text=value` or a bare value |
+| **Query** | A data source query | Data source (fixed or a data source variable) + query + when to refresh options |
-| Kind | Where values come from | Settings |
-|------|------------------------|----------|
-| **Datasource** | One concrete data source | Datasource type (only prometheus / mysql / loki) and default datasource |
-| **Custom** | A hand-written candidate list | Options (one per line, `text=value` or a bare value) |
-| **Query** | Candidates fetched by querying a data source | Datasource (fixed or a datasource variable) + query definition + when to refresh candidates |
+**Candidate queries for Query variables**:
-A **Query variable's candidate query** has three flavours by data source type: Prometheus needs `label` (required) and `metric` (optional) plus any number of **label filters** using `= / != / =~ / !~`; SQL data sources take an expression and a value field; Loki takes an expression and a field, where the field must be a stream label name (`^[A-Za-z_][A-Za-z0-9_]*$` — dotted or JSON field names do not work), and the candidates are that label's values on the streams the expression selects **within the dashboard's time range**, with an empty expression meaning every stream; the expression may reference dashboard variables but not built-in time variables (those exist only in panel query expressions, see [Built-in time variables](#built-in-time-variables)). **Preview candidates** in the drawer fetches candidates once with the current configuration to confirm the datasource and query are right, and shows the failure reason next to the variable when they are not.
+- **Prometheus**: `label` (required) and `metric` (optional), plus `= / != / =~ / !~` label filters.
+- **SQL data sources**: an expression and a value field.
+- **Loki**: an expression and a field. The field must be a stream label name (dotted or JSON field names do not work); options are that label's values on the selected streams within the dashboard's time range. An empty expression means all streams.
-**Names and references**: a variable name must match `^[A-Za-z_][A-Za-z0-9_]{0,63}$` and must not start with `__` (that prefix is reserved for built-in time variables), and a name already in use is rejected. Renaming is an atomic frontend refactor — every `${oldName}` reference (query expressions, query args, datasource variable references and the variable's own candidate query) is rewritten, and the editor warns "N references will be rewritten" before doing it. A variable that is still referenced cannot be deleted: "Variable x is referenced in N places; remove the references first." A dashboard holds at most 20 variables.
+Expressions may reference other dashboard variables but not built-in time variables. Click **Preview candidates** to check the query.
-**Selection mode and the 「All」 option**:
+**Naming and references**:
-- **Single**: must hold one concrete value, defaulting to the first candidate when the dashboard opens.
-- **Multi**: may be left empty, and **empty means everything**; the control then shows the placeholder "All". "All" is not a candidate — it is the state of having no concrete selection, so candidates added later are not implied by it, and there is no "select all" button.
-- **Clearing means All**: a variable that allows "All" has its own clear affordance (the × on the tag, or "clear" in the dropdown), and clearing writes an explicit All rather than falling back to the default. A variable that does not allow "All" has no clear affordance and must always keep a concrete value.
-- When a dashboard opens, a variable with no value in the URL first takes its default; with no default it falls back to the first candidate (or to All for a variable that allows it), and that selection is written back to the URL.
-- **Values outside the candidate list** (carried in by a URL or by an alert entry point) still run normally: the control shows them as "value (not in candidates)" with a warning, and does not block the query.
+- Names start with a letter or underscore, contain only letters, digits and underscores, are at most 64 characters, must not start with `__`, and must be unique.
+- Renaming a variable updates every place that references it.
+- A variable that is still referenced cannot be deleted; remove the references first.
-The URL is the single source of truth for variable selections: a single value is written as `var-=value`, several values as repeated parameters, and All as `var-=$__all` — the same parameters a dashboard URL uses, so a link can be shared with its variable selections attached.
+**Single, multi and "All"**:
+
+- A **single-select** variable always has one value; it defaults to the first option.
+- A **multi-select** variable can be left empty, and **empty means "All"**. "All" means no filtering, not "every current option".
+- Variables that allow "All" can be cleared; others must keep a value.
+- When the page address has no value, the variable uses its default, or else the first option ("All" if allowed).
+- A value passed in through a link applies even if it is not among the options; the control marks it as such.
+
+Variable selections are written to the page address, so they travel with shared links.
## Time range and auto-refresh
-- The **time range** comes from the URL's `from` / `to`, either absolute milliseconds or a `now-*` relative expression; with no URL parameters the stored **default time range** applies (the last hour for a new dashboard, and one of eight presets — 15m / 30m / 1h / 3h / 6h / 12h / 24h / 7d — when saved, always ending at "now").
-- **Auto-refresh**: the interval stored on the dashboard is one of Off / 30s / 1m / 5m; the viewer's refresh picker offers finer steps (Off / 10s / 30s / 1m / 5m / 15m / 30m / 1h). Picking one writes the `refresh` URL parameter and refreshes immediately rather than waiting a full interval. Relative ranges roll forward with "now" on each refresh, and the refresh button on the left runs a manual refresh at any time, spinning while queries are still running.
-- **Display time zone**: the bottom of the time picker's dialog holds a time zone row — the current zone (city plus abbreviation) and its UTC offset on the left, and a **Change time zone** button on the right that opens a searchable city list (search by city name, abbreviation or IANA name), grouped by continent, whose first group **Common** holds the three special entries in the table below. It applies to dashboards only (viewer, edit mode, panel editor and panel fullscreen) and decides how the time picker displays and parses times, the time series x-axis and tooltip times, and the time range label; what actually renders in the zone is absolute instants, while a relative range (such as the last hour) is a duration and does not shift with the zone. When the display zone differs from your personal effective zone, the time picker carries that zone's abbreviation as a reminder.
+- **Time range**: the dashboard's saved default is used. The defaults you can save are 15m / 30m / 1h / 3h / 6h / 12h / 24h / 7d.
+- **Auto-refresh**: a dashboard can save off / 30s / 1m / 5m; while viewing you can pick more intervals (10s to 1h). Choosing one refreshes immediately.
+- **Display time zone**: click **Change time zone** at the bottom of the time picker to choose a city time zone or one of the three shortcuts below. It only affects dashboards and is remembered in this browser. Relative ranges (such as "Last 1 hour") are durations and are not shifted by time zone.
-| Common entry | Meaning |
-|--------------|---------|
-| **Default** | Follow your personal effective time zone |
-| **Browser time** | Follow the current browser's time zone |
+| Shortcut | Meaning |
+|--------|------|
+| **Default** | Your effective time zone from personal settings |
+| **Browser time** | The browser's current time zone |
| **Coordinated Universal Time** | Always UTC |
-The choice is stored in this browser (the localStorage key `monit.dashboards.timeZone`) and reused when you come back; picking **Default** clears that record and returns to your personal effective zone.
-
## Period-over-period comparison
-The **Compare** entry in a panel's **query options** makes the same query run a second time over the period one cycle earlier — "1d before" or "1w before" — and merges both results into the same panel.
+In a time series or stat panel, set **Query options → Comparison** to "1 day ago" or "1 week ago". The same query runs again for the previous period and both results appear in one chart:
-- **Supported panels**: only **time series** and **stat** panels have this option; every other visualization has neither the setting nor an extra request.
-- **Available periods**: only "1d before" and "1w before", plus "No comparison"; arbitrary durations are not offered.
-- **Time series**: the comparison run is drawn as a **dashed line in the same color**, and the legend spells out the period, e.g. `series name (1d ago)`.
-- **Stat**: shows the percentage change against the comparison period, e.g. "▲ 12.3% vs 1d ago" (flat values get no arrow, so 0% is not read as a rise); no percentage is shown when the comparison value is 0 or missing.
-- **Failure handling**: if the comparison query fails you only lose the comparison line — the current results still render, and the panel's overall state still reflects the current run.
+- **Time series**: the comparison series is a dashed line in the same colour, with the period in the legend, e.g. "series (1 day ago)".
+- **Stat**: shows the percentage change against the comparison period, e.g. "▲ 12.3% vs 1 day ago". No percentage is shown when the comparison value is 0 or missing.
+- If the comparison query fails, only the comparison line is missing; the current results are unaffected.
## Cross-panel cursor linking
-Every **time series** panel in a dashboard shares one cursor synchronisation group: moving the mouse over any of them draws the same **vertical line and points** on the others, which makes it easy to line up several metrics at the same instant.
-
-- Only mouse move and mouse leave are synchronised, not press and release (otherwise a drag-zoom would zoom every panel), and the **Y axis is not synchronised** — only the vertical line is drawn.
-- The tooltip stays on the panel under the mouse; a linked cursor does not raise one.
-- **Panels with a relative time or a time shift do not take part** — their time axis differs from the dashboard's, so linking by timestamp would point at the wrong instant.
-- The editor's preview canvas and the panel fullscreen view do not link; only the time series in the dashboard grid do.
+Moving the mouse over any time series shows a vertical line at the same moment on the dashboard's other time series, so you can line up several metrics. Panels with a relative time or time shift do not take part.
## Click-to-filter and drill-down links
-**Click-to-filter**: clicking data in a chart (a point on a time series, a stat, a numeric or label cell in a table) opens an overlay. If the clicked data carries a **label — or table column — whose name matches a dashboard variable**, the overlay offers "Filter by `k = v`", which sets that variable to that value and re-queries the whole dashboard.
-
-- The variables that can be set this way are all variables **except datasource variables** (a datasource variable is a single-choice datasource selector and does not take part).
-- When a time series point carries a timestamp, the overlay header shows the series name (with a copy button), the point's time and its value formatted with the panel's unit.
-- Label cells in tables only offer filtering, never drill-down: a drill-down link expands the labels of the whole row or series, so handing it a single label would build a broken URL.
-
-**Drill-down links (data links)**: with data links configured, clicking data can open an `http(s)://` URL or a site-relative `/` URL, carrying the clicked value, labels and time. The rules are:
+**Click-to-filter**: when you click data in a chart (a point, a stat, a table cell) whose label or column name matches a dashboard variable, you can choose "Filter by `k = v`" to set that variable and refresh the whole dashboard. Data source variables are not used for filtering.
-- A time series panel can enable **One click** on one link (clicking data opens it straight away, with no menu; at most one link per panel). A stat or table panel opens the only available link directly and pops a menu when there are several.
-- Links are expanded **at click time**: dashboard variables and the time range come from the current view context, while point-related placeholders come from the point that was clicked. Inserted values are URL-encoded, and `${xxx:raw}` splices a value in verbatim when it belongs inside a path.
-- Available placeholders: `${__value.raw}` (the point's value), `${__value.time}` (the point's time in ms), `${__series.name}` (series name), `${__field.labels.
-
+
**Menu Entry**: Overview
The overview page provides a global view of alert rules, consisting of the following cards:
| Card | Description |
|------|-------------|
-| **Alert rule total trend** | An area chart showing how the total number of alert rules changes over time. The x-axis represents dates and the y-axis represents rule count, helping you track overall growth or reduction trends |
-| **Alert rules by channel** | A pie chart showing the distribution of alert rules across channels. The top 10 channels are displayed by default; the remainder are aggregated as "Others." You can click to expand and view all details |
-| **System event list** | Displays system events generated by the alert engine (such as engine disconnection, configuration anomalies, etc.), with pagination and delete support, helping you promptly discover and address infrastructure-level issues |
+| **Alert rule total trend** | Total number of alert rules over time (area chart) |
+| **Alert rules by channel** | Alert rules per channel (pie chart). Shows the top 10 by default, with the rest grouped as "Others"; click to expand |
+| **System event list** | System events from the alert engine (such as engine disconnection or configuration anomalies); paginated, and you can delete them |
The overview page checks whether you have installed an alert engine. If not, a prompt guides you to the alert engine page to complete installation.
-
+
On the alert rule edit or detail page, you can find the **Clone** action button. Clicking it creates a new rule based on the current rule's configuration, with all settings copied over (except the name), making it easy to quickly create similar alert rules.
-
+
When creating or editing an alert rule, after configuring the query conditions, you can click the **Query Preview** button. The system immediately executes a query and displays the results, helping you verify whether the query expression is correct and whether the returned data meets expectations, without waiting for the next detection cycle.
-If the backend returns an unrecognized result format, the preview shows a hint that the frontend and backend versions may be out of sync and to contact the administrator. When debug arguments (debug JSON) for SLS / VictoriaLogs / Loki are invalid or contain nested structures, the preview aborts the query with an error ("Invalid JSON format" / "Nested structures are not supported") instead of silently ignoring them. If the data source returns an authorization denial (HTTP 403, error code `AccessDenied`), the preview shows a fixed hint: "You don't have access to this data source. Please contact the team responsible for the data source or an administrator." Check the data source's authorization configuration in [Data source permissions (team authorization)](/en/monitors/data-sources/data-sources#data-source-permissions-team-authorization).
+If the preview fails, common causes are:
+
+| Message | Cause and fix |
+| --- | --- |
+| Unrecognized result format | The frontend and backend versions may be out of sync; contact your administrator |
+| Invalid JSON format / Nested structures are not supported | The debug arguments (debug JSON) for SLS / VictoriaLogs / Loki are invalid or nested; fix them and retry |
+| No access to this data source | The data source denied authorization (HTTP 403). Check its authorization in [Data source permissions (team authorization)](/en/monitors/data-sources/data-sources#data-source-permissions-team-authorization), or contact the team that owns it |
-
+
The notes description supports Markdown format. You can use headings, lists, links, code blocks, and other Markdown syntax to organize content. It also supports variable references, embedding dynamic information such as alert event label values and query results into the notes, making it convenient for responders to quickly understand the alert context.
diff --git a/en/monitors/quickstart/quickstart.mdx b/en/monitors/quickstart/quickstart.mdx
index b5e9880c..051ad625 100644
--- a/en/monitors/quickstart/quickstart.mdx
+++ b/en/monitors/quickstart/quickstart.mdx
@@ -66,7 +66,7 @@ For an engine cluster composed of multiple instances, as long as at least one in
There may be many alert rules. Monitors provides a tree-structured grouping for categorized management. Each alert rule must belong to a group. You can create groups first, then create alert rules under the groups.
-The create/edit alert rule page is a single-page form divided into five numbered sections — **Basic Configuration**, **Data Sources and Queries**, **Alert Conditions**, **Detection Frequency & Effective Time**, and **Event Configuration** — arranged top to bottom, so you fill them in by scrolling a single page; there is no step wizard.
+The create / edit alert rule page is a single form with five sections, top to bottom: **Basic Configuration**, **Data Sources and Queries**, **Alert Conditions**, **Detection Frequency & Effective Time**, and **Event Configuration**.
### Basic Configuration
@@ -74,7 +74,7 @@ The create/edit alert rule page is a single-page form divided into five numbered
| Config Item | Description |
|--------|------|
-| **Group** | Shows the group the rule belongs to as a breadcrumb path (e.g., "Default / Database Alerts"). When the group is unavailable (deleted, or you don't have permission for it), the panel turns red and shows "This group is unavailable. Return to the alerting rule list and select it again." — go back to the alert rules list and select a group again |
+| **Group** | The group path of the rule (e.g., "Default / Database Alerts"). If the group has been deleted or you cannot access it, go back to the rule list and pick a group again |
| **Rule Name** | Name of the alert rule; does not support variable references (fixed names facilitate filtering and grouping operations). It must be unique within its group; imports, edits, and moves fail if the target group already contains that name |
| **Additional Labels** | Similar to `labels` in Prometheus; attached to all alert events for filtering, routing, and inhibition |
@@ -86,64 +86,55 @@ Section 2 has two parts: **Data Sources** decides which data sources the rule ap

-To the right of the sub-heading there is a hint icon explaining the scope of the binding, plus a **Go to Data Source Management** entry — it opens in a new tab so unsaved edits in the current form are not lost.
+First choose a **data source type**. Only types that already have data sources are listed; if you have none yet, click **Go to Data Source Management** (it opens in a new tab, so your form is kept) to create one.
-First choose a **data source type**. Only types that **already have at least one configured data source** are listed here — types with none don't appear, so you can't end up picking a type with no data sources to query. When you're editing an existing rule, its current type always stays visible, even if all the data sources under that type have since been deleted.
+Then choose which data sources the rule applies to — one rule can cover many:
-If the list is empty (showing "No data sources available"), your account hasn't configured any data sources yet — click **Go to Data Source Management** to create one first. If only the selected type has none, the page shows "The current data source type has no available data sources. Create one or switch type." If the type list fails to load, a **Reload** button appears.
+- **Wildcard by name**: matches by name and defaults to `*` (every data source of the type) for a new rule. `*` matches any string (e.g. `db-*`), `?` matches one character, `[0-9]` or `[a-z]` match a range, and `[!0-9]` matches characters outside it. Renaming a data source affects matching.
+- **Exact match by ID**: pick specific data sources from the list; unaffected by renames.
-After choosing a type, Monitors supports a single rule applying to multiple data sources with two binding methods:
-
-- **Wildcard by name**: Match data sources by name using wildcards. `*` matches a string of any length (`*` matches all data sources; `db-*` matches all data sources starting with `db-`), and `?` matches any single character. Character classes are also supported, e.g. `db-[0-9]` matches `db-0` through `db-9` and `svc-[a-z]` matches `svc-a` through `svc-z` (character ranges compare by Unicode code point), while `[!0-9]` matches any non-digit character. Stores name strings, so renaming a data source affects matching.
-- **Exact match by ID**: Select specific data sources from a dropdown by ID. Unaffected by data source renames.
-
-Both methods can be used together, and at least one must be specified. The rule applies to all data sources matched by either method.
-
-When you create a rule — and each time you switch the **data source type** card afterwards — **Wildcard by name** is pre-filled with `*`, so by default the rule applies to every data source of that type. The one exception is Tencent CLS: it can only bind a single data source by exact match, the form never offers a pattern value for it, and saving requires exactly one selection. In the pattern selector `*` is mutually exclusive with the other entries: choosing `*` clears the rest, and choosing anything other than `*` drops the `*`. If both methods are left empty, saving fails with "Name pattern and exact match cannot both be empty".
+Use at least one method, or both; the rule applies to the union of their matches. Tencent CLS is the exception: it binds exactly one data source by exact match.
If you need stable rule bindings that are unaffected by data source renames, prefer exact match. See [Data Source Management](/en/monitors/data-sources/data-sources) for details.
-**Saving a rule also requires query rights on the data sources it references.** Except for the account subject and Admin, creating a rule, editing a rule, and batch field updates (including batch edits of custom fields and additional labels) all require the author to have query (readonly) rights on every data source the rule references — both the data sources picked explicitly under **Exact match by ID** and those matched by **Wildcard by name** at the moment of saving — so a wildcard rule can fail to save because of a data source you never picked explicitly. If any referenced data source is not permitted, create/edit fails outright with `no permission to reference datasource ""`; in a batch field update that rule is reported as its own failure while the others still update (the toast reads e.g. "2 / 10 rules failed to update. First error: ...").
-
-**Pure disable is the only exempt operation**: merely disabling a rule (the enable switch in the list, or batch disable — both boil down to "only `enabled` changes") is not checked against data source rights, so a member who lost data source access can still turn a rule off; re-enabling it or changing any other field is checked as usual. For how data source access itself is granted (who can query, who can manage), see [Data Source Management](/en/monitors/data-sources/data-sources).
+To save a rule you need query permission on every data source it references, including those matched by a wildcard at save time (the owner account and Admins excepted). A wildcard rule can therefore fail to save because it matches a data source you cannot query. Disabling a rule is exempt. See [Data Source Management](/en/monitors/data-sources/data-sources#data-source-permissions-team-authorization) for data source authorization.
#### Query Statements

-Under the **Query Statements** sub-heading you configure the query type and the statements themselves. To the right of the sub-heading is the **Usage guide** entry, which opens a drawer titled "Query Statements" with the guide to writing statements. For how value fields, label fields, and additional information are mapped from tabular query results, see [Query result field mapping](/en/monitors/alert-rules/query-result-fields).
+Configure the query type and statements. Click **Usage guide** for help writing them. For how value fields, label fields, and additional information are mapped from tabular query results, see [Query result field mapping](/en/monitors/alert-rules/query-result-fields).
#### AI Query Assistant
-Every query statement input has a rainbow **Write with AI** button in its top-right corner. It fades in on hover or focus, and appears once a data source type is selected. Clicking it opens the **Query Assistant** panel, which reads the current rule context — the data source, query type, configured alert thresholds, and the other query statements — to generate or rewrite the current query.
+Once a data source type is selected, click **Write with AI** at the top right of a query input. The Query Assistant uses the rule's data source, query type, thresholds and other queries to generate or rewrite the statement.
-- The generated statement is written back into the input together with data source private parameters (such as the SLS project/logstore, Tencent CLS region/topic, or the Loki and VictoriaLogs result limit), and the field is re-validated immediately, so the required-field error clears along with it. The **Apply** button on the result card re-applies that version of the statement at any time.
-- The entry is available on the main query, the recovery queries for threshold and data-exists modes, related queries, the query preview dialog, and the entity tree's rule PromQL and entity-category discovery PromQL. In the entity tree, the assistant only writes back the statement and never switches the data source.
-- Applying a statement changes the current form only; the rule is not saved automatically. Confirm that the statement matches the alert thresholds before saving.
+- The statement and related parameters (such as the SLS project / logstore or Tencent CLS region / topic) are filled into the form; click **Apply** on a result card to fill it in again.
+- The assistant is available for main queries, recovery queries, related queries, the query preview, and PromQL in the entity tree.
+- Applying does not save the rule; check that the statement matches the thresholds before saving.
### Alert Conditions
-Section 3 offers three check modes, presented as tabs: **Threshold evaluation**, **Missing data**, and **Data exists**. The enable switches are not on the tab titles but on the right of each enabling card inside the tab: on **Threshold evaluation** it is the "When higher-level threshold triggers, lower-level thresholds are skipped" card, and on **Data exists** it is the "Alert when data is found" card; **Missing data** has two cards you can enable independently — "Alert when all queries return no data" and "Alert if previously found data is now missing" — so that tab has two switches. The tabs still mark their state: once any condition in a tab is enabled, a check mark appears after the tab title.
+Alert Conditions offers three check modes, one per tab; enable each with the switch on the card title inside the tab. Enabled tabs show a check mark.
+
-| Tab | What it evaluates |
|-----|-------------------|
-| **Threshold evaluation** | Set a threshold expression per level; once a condition is met for the required number of checks, an alert of that level fires. When a higher-level threshold triggers, lower-level thresholds are skipped. With this tab enabled, at least one of Critical, Warning, and Info must be filled in |
-| **Missing data** | Evaluates "alert if previously found data is now missing" or "alert when all queries return no data"; the two cards can be enabled independently |
+| **Threshold evaluation** | Set a threshold expression per level; once a condition is met for the required number of checks, an alert of that level fires. Once a higher level fires, lower levels are skipped. Fill in at least one of Critical, Warning and Info |
+| **Missing data** | Alerts when "previously found data is now missing" or "all queries return no data"; the two conditions can be enabled separately |
| **Data exists** | Any returned data counts as a match; once the trigger count is reached, an alert of the configured level fires |
-The settings are grouped into cards: except on the **Missing data** tab, each tab has an **Alert fired** card and an **Alert recovered** card; the **Missing data** tab merges both into a single **Trigger & recovery conditions** card that applies to all enabled conditions above. The rows inside these cards are:
+Each tab has an **Alert fired** card and an **Alert recovered** card (**Missing data** combines them into one **Trigger & recovery conditions** card). Key fields:
| Field | Description |
|-------|-------------|
| **Trigger mode** | `Consecutive` or `Cumulative`; see the next section |
-| **Trigger condition** | The sentence matching the trigger mode. On the **Threshold evaluation** tab, the level expression rows (`Critical` / `Warning` / `Info`) sit above the trigger mode and are the trigger condition itself |
-| **Alert level** | `Critical`, `Warning`, or `Info`; defaults to `Critical`. The **Threshold evaluation** tab has no such row — the level comes from whichever expression row matched; on the **Data exists** and **Missing data** tabs it is set per condition |
-| **Recovery mode** | Sits in the **Alert recovered** card; on the **Missing data** tab it is set per condition — see the end of this section |
-| **Recovery condition** | **N consecutive normal checks to recover**, defaults to 1. At 1, a single check that meets the recovery condition produces a recovery event; above 1, several consecutive normal checks are required |
+| **Alert level** | `Critical`, `Warning`, or `Info`; defaults to `Critical`. For threshold evaluation, the level comes from the expression that matched |
+| **Recovery mode** | See [Alert recovery](#alert-recovery) below |
+| **Recovery condition** | Recover after N consecutive normal checks; defaults to 1 |
#### Trigger mode: consecutive vs cumulative
@@ -152,12 +143,10 @@ The settings are grouped into cards: except on the **Missing data** tab, each ta
| **Consecutive** (default) | Alerts after the set number of consecutive matches | `alert after N consecutive checks all match` — the rule alerts only after N consecutive checks meet the condition, where N is the **Matches** count, default 3 |
| **Cumulative** | Alerts when enough of the last checks match, even if not consecutive | `alert once N of the last M checks match` — the rule alerts when N of the last M checks meet the condition, where M is the **Checks** count, defaulting to `max(Matches, 5)` when you switch to cumulative |
-- Under **Cumulative**, the match count cannot exceed the check count, and the check count cannot be lower than the match count. Neither can exceed 10000; going over is reported as a validation error rather than being silently clamped to the maximum
-- The two modes are mutually exclusive: after switching back to **Consecutive**, the check count is no longer submitted with the rule (the server tells the modes apart by whether that field is present), so the "N of the last M checks" semantics cannot linger
-- The underlying rule fields: match count `alerting_check_times`, check count `alerting_window_size`, recovery condition `recovery_check_times`
+- Under Cumulative, the match count cannot exceed the check count, and neither can exceed 10000
-**Cumulative matching requires alert engine ≥ `v0.69.0`.** When you select **Cumulative**, a "Supported in v0.69.0+" badge appears next to the option. Older engines fall back to consecutive matches, which may delay or miss alerts, but never fires earlier than the new semantics.
+**Cumulative matching requires alert engine `v0.69.0` or later.** Older engines evaluate it as consecutive matching, so alerts may be delayed or missed.
#### Alert recovery
@@ -172,18 +161,14 @@ The available recovery modes depend on the check mode:
### Detection Frequency and Effective Time
-This section is always visible: there is no one-line summary and no expand/collapse control — the detection frequency, query time offset, rule timezone, and effective time fields are laid out directly in the section.
-
-When you click save, if a field fails validation the page scrolls to and highlights the first invalid field: if the error is inside a tab of **Alert Conditions**, that tab is activated first, and if it is inside **Custom Fields & Related Queries** in **Event Configuration**, that area is expanded first.
-

| Config Item | Description |
|--------|------|
-| **Detection Frequency** | Usually periodic detection; also supports `cron` expressions (down to seconds) and the `@every` shorthand. A new rule defaults to `@every 15s`; the dropdown presets are `@every 15s`, `@every 30s`, `@every 45s`, `@every 60s`, `@every 120s`, `@every 150s`, `@every 180s`, and `@every 300s`, and you can type any other valid expression |
+| **Detection Frequency** | Usually periodic detection; also supports `cron` expressions (down to seconds) and the `@every` shorthand. Defaults to `@every 15s`; pick a preset from the dropdown or type your own |
| **Query Time Offset** | Sets the query time offset (in seconds) to handle data source ingestion lag. For example, setting it to 60 shifts the query window back by 60 seconds, ensuring data has been fully written before querying. Only applies to Prometheus, Loki, VictoriaLogs, SLS, and Tencent CLS data sources |
| **Rule Timezone** | The timezone in which the rule executes. It controls how `cron` schedules and **Effective Time** windows are interpreted. Defaults to `Asia/Shanghai`. Must be a valid IANA timezone name such as `Asia/Shanghai`, `UTC`, `Europe/London`, or `America/New_York` |
-| **Effective Time** | Time period when the alert rule is effective; alerts will not trigger outside this period. Time windows are evaluated in the **Rule Timezone** above. It is a list of addable and removable time windows: each row is a **weekday** multi-select (any of Monday through Sunday) plus a **start time** and an **end time** (both `HH:mm`), and all three are required. A new rule starts with one row covering all 7 days, `00:00`–`23:59`, that is, all day. The **Add active period** button adds a row and the delete button at the end of each row removes one (both are unavailable when viewing rule details) |
+| **Effective Time** | Time period when the alert rule is effective; alerts will not trigger outside this period. Time windows are evaluated in the **Rule Timezone** above. You can add several windows, each made of weekdays (multi-select) and a start / end time (`HH:mm`). Defaults to all day, every day |
**Timezone rules**:
@@ -195,16 +180,16 @@ When you click save, if a field fails validation the page scrolls to and highlig
- `cron` expressions must be **6-field second-level expressions**, in the order seconds, minutes, hours, day of month, month, day of week. 5-field forms (for example `*/5 * * * *`) are rejected; add the seconds field (for example `0 */5 * * * *`).
- The `@every` shorthand is supported, for example `@every 30s` for a check every 30 seconds. The duration must be a **whole number of seconds of at least 1 second**; combined durations such as `@every 1m30s` are accepted, while `@every 0s`, `@every 1500ms`, or any sub-second or non-whole-second value is rejected.
-- The detection frequency is validated when editing an existing rule as well; historically saved invalid expressions must be fixed before the rule can be saved.
+- When editing an older rule, a detection frequency that does not follow these rules must be fixed before saving.
-Saving a rule also validates its runtime configuration: the repeat notification **maximum count** (`repeat_total`) and **repeat interval** (`repeat_interval`), as well as the **alerting check times** and **recovery check times** of every check mode (Threshold, Data exists, No data), must all be ≥ 1. A rule that fails validation is not scheduled, and the alert engine reports the failure as an `alert-rule-schedule-invalid` problem. Fix the rule configuration according to the error message.
+The repeat notification maximum count and interval, and the match and recovery counts of every check mode, must all be at least 1; otherwise the rule does not run.
### Event Configuration
-Section 5 contains, in order, **Custom Fields & Related Queries** (collapsed by default, with Expand / Collapse on the right; while collapsed the summary line shows how many custom fields and related queries are configured, or a hint line when there are none), the notes description, and the repeat notification settings.
+Event Configuration covers **Custom Fields & Related Queries** (collapsed by default), the notes description, and repeat notification settings.
| Config Item | Description |
|--------|------|
@@ -252,7 +237,7 @@ When the state is `Waiting for first run` or `Status stale`, the page explains w
Query the rule's historical execution records by time range (last 15 minutes, 1 hour, 4 hours, or 1 day; up to 24 hours back). Each record carries an execution summary badge: `Execution failed`, `Event produced`, `Alert recovered`, or `Periodic sample`. Expanding a record shows the log ingestion time, Edge instance and cluster, runtime phase, consecutive failures, active instance counts per check mode, events produced, and the error summary.
-Execution history depends on server-side VictoriaLogs queries: if the server has not configured a query endpoint or the query service is unavailable, the panel shows "Execution history temporarily unavailable". Records only capture key execution summaries (errors, events, recoveries, and periodic samples) — not every evaluation is guaranteed to produce a record. When more than 200 records match, only the latest 200 are shown; narrow the time range to see more.
+Execution history only records key execution summaries (errors, events, recoveries, and periodic samples) — not every evaluation is guaranteed to produce a record. When more than 200 records match, only the latest 200 are shown; narrow the time range to see more.
## Batch operations
@@ -274,7 +259,7 @@ After selecting multiple rules, click **Batch Update** to uniformly modify the f
| **Detection Frequency** | Uniformly adjust the detection period |
| **Rule Timezone** | Uniformly switch the IANA timezone of the alert rule |
| **Effective Time** | Uniformly configure effective time periods |
-| **Query Time Offset** | Uniformly set the query time offset. Batch update is available only when the data sources of all selected rules support query time offset (Prometheus, Loki, VictoriaLogs, SLS, and Tencent CLS); otherwise this option is disabled |
+| **Query Time Offset** | Uniformly set the query time offset. Available only when all selected rules use data sources that support it (Prometheus, Loki, VictoriaLogs, SLS, Tencent CLS) |
| **Custom Fields** | Uniformly configure annotations; supports both incremental modification and full replacement |
| **Channel** | Uniformly specify the channel for alert delivery |
| **Repeat Notification Config** | Uniformly set repeat notification interval and count |
@@ -286,14 +271,14 @@ When batch updating **Additional Labels** and **Custom Fields**, a dedicated met
| Update Mode | Description |
|-------------|-------------|
-| **Incremental modification** (default) | Add one or more modification operations (`Set` / `Delete`), each specifying a key and a value. Candidate keys and values are aggregated from the selected rules' existing content (autocomplete, with hit counts per candidate), with a live impact preview such as "Set key=value: X added, Y updated, Z unchanged" or "Delete key: affects N rules, others unchanged". When more than 500 rules are selected, candidate values are not loaded, but you can still type them manually. Note that Custom Fields keys must not start with `$`. Keys are trimmed of surrounding whitespace; if a key is empty after trimming or collides with another operation's key (for example `env` and `" env"` together), the whole batch fails validation with an error |
+| **Incremental modification** (default) | Add "Set" or "Delete" operations, each with a key and value. Keys and values autocomplete from the selected rules, with a preview of how many rules each operation affects. Custom field keys must not start with `$`, and keys in one batch must be unique |
| **Full replacement** | Completely replaces the field on each rule with the content below, deleting any other content on each rule that is not filled in here |
Modifying additional labels may affect alert routing, grouping, or noise reduction. Proceed with caution.
-When a batch update fails, the toast reports the number of failed rules and the first error reason (for example, "2 / 10 rules failed to update. First error: ..."), so you can troubleshoot rule by rule.
+If some rules fail to update, you see the number of failures and the first reason; the other rules are still updated.
### Batch move
@@ -322,7 +307,7 @@ After uploading the file, you can configure:
### Pre-import check results
-After parsing the file, the system shows a pre-import check table listing, rule by rule, the import name, status (`Ready to import` / `Skipped` / `Invalid`), and explanation. Check the rules you want to import (all importable rules are selected by default), then click "Import N rules" at the bottom to submit.
+After parsing the file, the system shows a pre-import check table listing, rule by rule, the import name, status (`Ready to import` / `Skipped` / `Invalid`), and explanation. Select the rules to import (all importable rules are selected by default) and submit.
Nightingale rules are imported disabled and must be checked for data source matching and conversion warnings before you enable them manually. Common conversion notes include: Doris data sources mapped to MySQL, only the highest-severity alert condition kept, level inhibition / query correlation / notification target configs not preserved, recovery semantics approximated with Flashduty rule capabilities, `Local` timezone converted to `Asia/Shanghai`, all-day effective time converted to `00:00-23:59`, and durations converted at a 15-second interval when the evaluation interval is missing.
@@ -330,7 +315,7 @@ Nightingale rules are imported disabled and must be checked for data source matc
### Import results
-After submission, the system reports the import result: counts of imported, skipped, and invalid rules. When everything succeeds, it shows a success message; if nothing was imported, the dialog stays open so you can review why rules were skipped or invalid and select again.
+After submission, the system reports the import result: counts of imported, skipped, and invalid rules. If nothing was imported, review the reasons in the dialog and select again.
## Export alert rules
diff --git a/en/on-call.mdx b/en/on-call.mdx
index 5bdf0cfa..0145bb15 100644
--- a/en/on-call.mdx
+++ b/en/on-call.mdx
@@ -25,7 +25,7 @@ On-call is Flashduty's core product, serving thousands of enterprises and proces
Feishu/Lark, Dingtalk, WeCom, Slack, Microsoft Teams, phone calls, SMS, email
- Native support for 100+ monitoring tools and cloud platforms, complete setup in 5 minutes
+ 290+ alert integrations covering mainstream monitoring tools and cloud platforms
@@ -68,6 +68,13 @@ The Flashduty On-call workflow is intuitive:
+## Use Cases
+
+- Build 7x24 on-call systems to ensure service availability
+- Aggregate alerts from multiple sources into a unified incident management portal
+- Establish escalation mechanisms to ensure timely response
+- Analyze alert data to continuously improve monitoring quality
+
## Quick Start
@@ -77,7 +84,7 @@ The Flashduty On-call workflow is intuitive:
Learn how to create and configure channels to manage team incident response
-
+
Set up alert notification rules, escalation paths, and responders
diff --git a/en/on-call/advanced/war-room.mdx b/en/on-call/advanced/war-room.mdx
index 3ed1aee3..136114af 100644
--- a/en/on-call/advanced/war-room.mdx
+++ b/en/on-call/advanced/war-room.mdx
@@ -115,17 +115,17 @@ If the IM integration used by the war room is later disabled or deleted, **Add s
-**Platform-created war room chats cannot be used as standing notification targets.** Every chat carries an origin mark: `origin=system` means the platform created it (today, that is only war rooms), distinguishing it from human-created chats. Accordingly, the group-chat pickers in escalation rules' **IM app groups** (Feishu/DingTalk, Slack, and Microsoft Teams group chats) and in schedule handoff notifications' **group chat channels** (Feishu/DingTalk and Slack) automatically exclude war rooms — the Feishu/DingTalk and Slack pickers even read "Select … group chat (war rooms excluded)". A war room is born with an incident and dies with it: configuring one as a standing notification target points the configuration at a group that is bound to disappear. If a saved chat ID no longer resolves (war room dissolved, bot removed from the group, group deleted), the picker shows that target as **Chat unavailable**, with a remove button to clear it.
+**War room chats cannot be used as standing notification targets.** War rooms are created and closed with their incidents, so the **IM app groups** picker in escalation rules and the **group chat channels** picker in schedule handoff notifications do not list them. If a saved chat no longer exists (war room dissolved, bot removed, or group deleted), it shows as **Chat unavailable** and can be removed.
### Mobile App
-The Flashduty App supports the full war room lifecycle, sharing the same war room capabilities as the console and IM apps. Key mobile behaviors:
+The Flashduty App supports the full war room lifecycle, consistent with the console and IM apps:
-- **Capability gating**: The mobile war room requires an On-call Pro or higher subscription and at least one IM integration with war room enabled; when the plan requirement is not met, neither the overview entry nor war-room actions are shown
-- **Overview entry card**: When the incident has a war room, the incident overview page shows a **War room** entry card. Tapping it opens the IM chat directly when the integration supports deep links; if the link cannot be opened or the integration does not provide a share link, a dialog shows the group name (one-tap copy) so you can search for the group name in your IM app to join
-- **Create war room**: The entry lives in **More Actions** in the bottom action bar of the incident details page. It is hidden when the incident already has a war room or is closed; when the incident has no responders, it is disabled with the toast "This incident has no responders, so a war room cannot be created" (the group is created by the backend based on the responders)
-- **Add stakeholders to war room / Dissolve war room**: Also in **More Actions**. Both remain available after the incident is closed (for review), and dissolving requires confirmation; they do, however, require the war room's IM integration to still be available. Once that integration is disabled or deleted, the two entries disappear from **More Actions** and an administrator must unlink the war room from the incident details page in the console; the **War room** entry card on the overview page stays, and tapping it shows "The integration is disabled or deleted. Ask an administrator to unlink the war room from the incident details on desktop. The original group chat will not be dissolved."
+- **Requirements**: same as the console: On-call Pro or higher, and at least one IM integration with war room enabled
+- **Opening the war room**: the **War room** card on the incident overview page opens the IM chat directly; if it cannot, it shows the group name for you to copy and search
+- **Create war room**: in **More Actions** at the bottom of the incident details page. Hidden when the incident already has a war room or is closed; unavailable when the incident has no responders (the group is created from the responders)
+- **Add stakeholders to war room / Dissolve war room**: also in **More Actions**, and still available after the incident is closed (for review); dissolving asks for confirmation. If the war room's IM integration is disabled or deleted, both disappear and an administrator must unlink the war room from the incident details page in the console (the original group chat is not dissolved)
By deeply integrating emergency processes with instant messaging tools, Flashduty War Room brings you an **automated**, **visual**, and **traceable** incident collaboration experience.
@@ -145,6 +145,31 @@ Key incident operations (acknowledgment, closure, snooze, comments, etc.) are sy
- In messages for follow-up operations, `Action` is replaced with `Follow-up`
- When the operator cannot be resolved to a specific member, the message shows **System** as the operator
+## AI SRE
+
+War rooms integrate deeply with **AI SRE**: when a war room opens, AI SRE automatically runs a first round of diagnosis and posts its findings back to the group; you can also **@ AI SRE** in the chat to follow up or start a new investigation. See the [AI SRE introduction](/en/ai-sre) and [IM platforms](/en/ai-sre/im).
+
+### AI SRE in the War Room
+
+
+
+ When a war room opens, AI SRE analyzes the incident and posts a first round of findings — before anyone has started investigating
+
+
+ @ AI SRE in the group to start or continue an investigation; the agent replies in the thread, visible to the whole team
+
+
+ Reply to an alert or incident card and the agent resolves the referenced incident automatically — no manual context-pasting
+
+
+ Generate structured post-mortems from the incident timeline and investigation evidence
+
+
+
+
+To build a more comprehensive context of the incident's full lifecycle, AI-generated post-mortem reads war room chat history. Ensure your IM integration has been granted the necessary permissions — see [Feishu/Lark](/en/on-call/integration/instant-messaging/lark) or [Slack](/en/on-call/integration/instant-messaging/slack) integration guides for details.
+
+
## FAQ
@@ -203,27 +228,3 @@ Key incident operations (acknowledgment, closure, snooze, comments, etc.) are sy
-## AI SRE
-
-War rooms integrate deeply with **AI SRE**: when a war room opens, AI SRE automatically runs a first round of diagnosis and posts its findings back to the group; you can also **@ AI SRE** in the chat to follow up or start a new investigation. See the [AI SRE introduction](/en/ai-sre) and [IM platforms](/en/ai-sre/im).
-
-### AI SRE in the War Room
-
-
-
- When a war room opens, AI SRE analyzes the incident and posts a first round of findings — before anyone has started investigating
-
-
- @ AI SRE in the group to start or continue an investigation; the agent replies in the thread, visible to the whole team
-
-
- Reply to an alert or incident card and the agent resolves the referenced incident automatically — no manual context-pasting
-
-
- Generate structured post-mortems from the incident timeline and investigation evidence
-
-
-
-
-To build a more comprehensive context of the incident's full lifecycle, AI-generated post-mortem reads war room chat history. Ensure your IM integration has been granted the necessary permissions — see [Feishu/Lark](/en/on-call/integration/instant-messaging/lark) or [Slack](/en/on-call/integration/instant-messaging/slack) integration guides for details.
-
diff --git a/en/on-call/analytics/insights.mdx b/en/on-call/analytics/insights.mdx
index 233b4076..5b255b8a 100644
--- a/en/on-call/analytics/insights.mdx
+++ b/en/on-call/analytics/insights.mdx
@@ -6,7 +6,7 @@ description: "Use insights for data analysis, with statistics and analysis of in
**Plan requirement**: This feature requires an On-call Standard or higher subscription. [Learn more](https://flashcat.cloud/flashduty/price/)
-**The dashboard can be empty while your subscription is expired**: once your On-call subscription expires or is disabled, alert ingestion has stopped and the dashboard produces no new analytics data, so the default time window is naturally empty — this is not data loss. A non-dismissable banner stays at the top of the page stating that the subscription has expired, that alert ingestion has stopped so no new analytics data is produced, and that historical data is unaffected and can still be viewed and exported. Historical data stays viewable and exportable, and everything resumes automatically after renewal. For the account-level explanation, see [What happens when your subscription expires](/en/platform/pricing#what-happens-when-your-subscription-expires).
+**The dashboard can be empty while your subscription is expired**: once the subscription expires or is disabled, alert ingestion stops and no new statistics are produced, so the default time window may be empty. This is not data loss: historical data can still be viewed and exported, and everything resumes after renewal. See [What happens when your subscription expires](/en/platform/pricing#what-happens-when-your-subscription-expires).
## Key Features
@@ -40,8 +40,8 @@ When customizing filter conditions, the system remembers your selections. Even a
| Channel | Select channel names to query, supports multiple selection. Dashboard data updates based on selected channels |
| Severity | Select severity levels to query, supports multiple selection. Dashboard data updates based on selected severity levels |
| Time Range | Select time range to query. Supports this week, last two weeks, this month, last month, and custom time ranges, querying up to the last **2 years (720 days)** of data (the exact limit depends on your plan) |
-| Data Interval | Supports day, week, and month dimensions. Defaults to hourly queries, but when time range exceeds 31 days, daily preview is not available. Day/week/month bucketing follows the viewer's effective time zone (personal time zone preferred, falling back to the organization's) |
-| Time Zone | Dashboard times, day/week/month aggregation, and queries are all displayed and counted in the viewer's effective time zone (personal time zone preferred, falling back to the organization's). The filter bar shows the current effective time zone on the right, with the tooltip "Times are shown and bucketed in your local timezone." |
+| Data Interval | Hourly by default; day, week or month also available. Daily view is not available for time ranges over 31 days |
+| Time Zone | Times and day/week/month statistics use your time zone (personal time zone first, otherwise the organization's), shown on the right of the filter bar |
| Sorting | Team, channel, and individual dimension dashboards support ascending and descending order. Defaults to showing TOP 10 data; expand to show more |
## Time Period Segmentation
diff --git a/en/on-call/channel/escalation-rule.mdx b/en/on-call/channel/escalation-rule.mdx
index 09dce253..0d8f9504 100644
--- a/en/on-call/channel/escalation-rule.mdx
+++ b/en/on-call/channel/escalation-rule.mdx
@@ -20,20 +20,7 @@ src="https://download.flashcat.cloud/flashduty/video/escalate-rule.mp4"
An escalation rule contains six core elements. The system matches rules from top to bottom, **stopping after the first successful match**.
-You can enable or disable individual escalation rules. Disabled rules are skipped during matching and will not trigger notifications. You can also copy an escalation rule to the current channel or another channel to quickly reuse existing configurations.
-
-### Copy an Escalation Rule
-
-Each escalation rule card shows a **Copy** icon on hover. Clicking it opens the copy dialog (the same component used for copying silence rules), which contains:
-
-| Field | Description |
-| :--- | :--- |
-| **Rule name** | Required; pre-filled with "Copy " plus the original name, **39 characters max** (the backend limit is 40) — overlong input is truncated in the field |
-| **Channel** | Choose **This channel** or **Another channel**. Copying to another channel requires picking the target from a dropdown that excludes the source rule's channel; non-admin users only see channels they manage |
-| **Description** | Optional; pre-filled with the original description, **500 characters max** — overlong input is truncated in the field |
-
-- The copy reuses the source rule's full configuration (trigger conditions, notification targets, notification methods, delay window, notification template, and escalation levels), but the **priority (list matching order) is not copied** — reposition the new rule in the list after copying
-- Copying to the current channel makes the new rule appear in the list immediately; copying to another channel shows the **Copy succeeded** result dialog with the target channel, rule name, description, and creator. Click **Go to view** to open the target channel and locate the new rule
+You can enable or disable individual escalation rules. Disabled rules are skipped during matching and will not trigger notifications. You can also copy an escalation rule to the current channel or another channel to quickly reuse existing configurations; see [Copy an Escalation Rule](#copy-an-escalation-rule).
### 1. Trigger Conditions
@@ -150,6 +137,18 @@ The minimum escalation timeout is 1 minute.
- **Add or remove levels**: you can add or remove levels freely; a rule must keep at least 1 level
- **Reorder**: you can move a level up or down, or insert a new level between any two existing levels
+## Copy an Escalation Rule
+
+Click the **Copy** icon on an escalation rule card to set the new rule's name, target channel and description:
+
+| Field | Description |
+| :--- | :--- |
+| **Rule name** | Required; defaults to "Copy \", **39 characters max** |
+| **Channel** | This channel or another channel (non-admins can choose only channels they manage) |
+| **Description** | Optional; defaults to the original description, **500 characters max** |
+
+The copy keeps the source rule's full configuration (trigger conditions, notification targets, notification methods, delay window, notification template and escalation levels), but **not its position in the list**; move the new rule to the right position after copying. After copying to another channel, click **Go to view** to open the new rule.
+
## Best Practices
diff --git a/en/on-call/channel/integrate-data.mdx b/en/on-call/channel/integrate-data.mdx
index 1b46e148..4dc93611 100644
--- a/en/on-call/channel/integrate-data.mdx
+++ b/en/on-call/channel/integrate-data.mdx
@@ -47,7 +47,7 @@ Integration created within a channel, alerts automatically enter that channel.
-A dedicated integration belongs to the channel it was created in: **editing, enabling/disabling, and deleting** it requires the "Channels Manage" or "Integrations Manage" functional permission together with the data permission for that channel — only **account admins, the channel creator, or the channel's managing team** can operate. Other members see these buttons disabled, with the reason on hover.
+A dedicated integration belongs to the channel it was created in. **Editing, enabling/disabling, and deleting** it requires the "Channels Manage" or "Integrations Manage" permission, and you must be an account admin, the channel creator, or a member of the channel's managing team.
### Shared Integration
@@ -98,7 +98,7 @@ Clicking the **All** chip opens a full-screen catalog:
- The number next to the title is how many integrations the catalog covers, and the search box at the top searches all of them.
- The category rail on the left lists every category with its entry count; clicking one scrolls the right side to that category (and clears the search).
-- The right side lays out cards by category (logo, name, and a two-line blurb); hovering a card reveals **Add**, which opens the new-integration page for that system.
+- The right side lists systems by category; click **Add** to open the new-integration page for that system.
At the bottom the catalog keeps a "Can't find your system?" fallback area with two ways out: connect it with a generic integration, or request an integration.
@@ -240,7 +240,7 @@ Exceeding any of these limits returns a `429` status code — please wait and re
- After the subscription expires, every integration (dedicated and shared) stops receiving alert events, a persistent subscription-expired banner appears at the top of the Integration Center, and the cards for adding a new integration are disabled (hover for the reason). Configured integrations are not deleted, and ingestion resumes automatically after renewal — no reconfiguration needed.
+ After the subscription expires, every integration (dedicated and shared) stops receiving alert events, and new integrations cannot be added. Configured integrations are not deleted, and ingestion resumes automatically after renewal, with no reconfiguration needed.
diff --git a/en/on-call/channel/noise-reduction.mdx b/en/on-call/channel/noise-reduction.mdx
index 32337770..b60b3fdd 100644
--- a/en/on-call/channel/noise-reduction.mdx
+++ b/en/on-call/channel/noise-reduction.mdx
@@ -176,7 +176,7 @@ Flashduty On-call provides two grouping modes:
### Configuration Limits
-To protect grouping performance and stability, the following fields have hard backend caps:
+To protect grouping performance and stability, the following fields have hard system caps:
| Grouping mode | Limit | Cap | Description |
| :--- | :--- | :--- | :--- |
@@ -317,7 +317,7 @@ Quickly create temporary silence rules based on existing incidents.

-When creating a quick silence, the drawer shows "N labels identified, M labels automatically excluded" and lists each excluded label with its reason: system format rules are marked as **JSON / Numeric / Too long / Datetime**, account rules as **Globally excluded** or the owning integration name. From the drawer you can click **Manage exclusion rules** or **View exclusion rules** to open the account configuration (only the main account or Account.Admin can modify it; other members can view it read-only). The matching conditions are generated automatically from the source incident's labels — conditions that are too precise may cause similar alerts to escape silencing, so review the list carefully before creating.
+When creating a quick silence, the drawer lists labels that were excluded automatically, with the reason: their format (JSON, numeric, too long, datetime) or an account exclusion rule. Only the main account or account admins can change account exclusion rules. The matching conditions are generated from the source incident's labels; conditions that are too precise may let similar alerts escape silencing, so review them before creating.
When repeatedly using quick silence on the same incident, it edits the original rule rather than creating a new one.
@@ -325,18 +325,16 @@ When creating a quick silence, the drawer shows "N labels identified, M labels a
### Copy a Silence Rule
-Every rule card in the silence rule list (except rules created by **Quick Silence**) shows a **Copy** icon on hover. Clicking it opens the copy dialog, where you can set the new rule's name and description and choose the target channel:
+Click the **Copy** icon on a silence rule card (not available for rules created by **Quick Silence**) to set the new rule's name, description and target channel:
| Configuration | Description |
| :--- | :--- |
-| **Rule name** | Required; pre-filled with "Copy " plus the original name (e.g. `Copy Database Maintenance`), **39 characters max** — overlong input is truncated in the field |
-| **Description** | Pre-filled with the original description, **500 characters max** — overlong input is truncated in the field |
-| **Channel** | Choose **This channel** (the current one) or **Another channel**. Copying to another channel requires picking the target from a dropdown that excludes the source rule's channel; non-admin users only see channels they manage |
+| **Rule name** | Required; defaults to "Copy \", **39 characters max** |
+| **Description** | Defaults to the original description, **500 characters max** |
+| **Channel** | This channel or another channel (non-admins can choose only channels they manage) |
-The result is **a new, independent rule**: it reuses the source rule's silence conditions, silence behavior (Drop directly / Retain and mark), auto-delete-on-expiration setting, and schedule (one-time or recurring), but it does not carry over identity fields such as `rule_id` or `from_incident_id`, nor the quick-silence link to the source incident.
+The copy is **a new, independent rule** that keeps the source rule's silence conditions, silence behavior, auto-delete setting and schedule, but is no longer linked to the source incident. After copying to another channel, click **Go to view** to open the new rule.
-- **Copying to the current channel**: on success, the new rule appears in the list immediately and a "Copied" toast is shown.
-- **Copying to another channel**: on success, a **Copy succeeded** dialog appears showing the target channel, rule name, description, and creator. Click **Go to view** to open the target channel and jump straight to the new rule's detail page.
**Quick silence** rules cannot be copied: a quick-silence rule is bound to its source incident (repeating the action on the same incident edits the original rule), so its card has no **Copy** action.
diff --git a/en/on-call/comparison/vs-opsgenie.mdx b/en/on-call/comparison/vs-opsgenie.mdx
index f52d7a54..51f41900 100644
--- a/en/on-call/comparison/vs-opsgenie.mdx
+++ b/en/on-call/comparison/vs-opsgenie.mdx
@@ -6,8 +6,6 @@ keywords: ["Opsgenie", "Opsgenie alternative", "Opsgenie sunset", "Opsgenie migr
## Introduction
----
-
Atlassian has given Opsgenie a definite end: **new sales stopped on June 4, 2025**; existing customers can keep using it until **support ends on April 5, 2027**, after which Opsgenie access shuts off and customer data that has not been moved out will be deleted (see the [Atlassian Opsgenie Licensing FAQ](https://www.atlassian.com/licensing/opsgenie)).
@@ -33,8 +31,6 @@ The feature and pricing information on this page is current **as of September 20
## Sunset Timeline and the Official Migration Path
----
-
### Key Dates
| Date | Event | Impact |
@@ -57,8 +53,6 @@ For organizations already standardized on Jira, Confluence, and JSM, this is the
## Product Feature Comparison
----
-
### On-call
On-call solves "getting the alert to the right person": reduce noise first, then notify according to scheduling and escalation policies.
@@ -137,7 +131,7 @@ Response solves "closing the loop quickly once the right person is found": a sin
| Core Capability | Flashduty | Opsgenie |
| --- | --- | --- |
-| **Alert Integration** | 267 integration sources with full coverage of China-region cloud and monitoring ecosystems (Alibaba Cloud, Tencent Cloud, Huawei Cloud, etc.), compatible with the PagerDuty protocol | 200+ integrations with a mature overseas ecosystem |
+| **Alert Integration** | 290+ integration sources with full coverage of China-region cloud and monitoring ecosystems (Alibaba Cloud, Tencent Cloud, Huawei Cloud, etc.), compatible with the PagerDuty protocol | 200+ integrations with a mature overseas ecosystem |
| **Heartbeat Monitoring** | Monitoring-side heartbeats are covered by the [Monitors engine-lost alert](/en/monitors/engine/engine-lost-alert); On-call has no standalone cron-job heartbeat capability | ✅ Heartbeats are a mature Opsgenie capability — evaluate alternatives for cron/scheduled-job monitoring before migrating |
| **Alert Pipelines & Label Enrichment** | Routing, filtering, severity reset, regex extraction, and [data mapping](/en/on-call/integration/alert-integration/label-enhancement) (import CMDB tables to dynamically generate labels) | Alert Policies cover basic filtering and field modification |
| **Insights & Reporting** | MTTA/MTTR, personnel workload, frequency analysis, and **time period analysis** (work/rest/sleep) | Basic reporting |
@@ -148,8 +142,6 @@ Response solves "closing the loop quickly once the right person is found": a sin
## Pricing Comparison
----
-
| Dimension | Flashduty | Opsgenie / JSM Path |
| --- | --- | --- |
| **Billing Model** | License fee + excess communication fees | Per-user seats; after migrating to JSM, billed by the JSM plan |
@@ -176,8 +168,6 @@ Opsgenie's seat price is modest, but it is a sunset product — the meaningful c
## Migration Path Comparison
----
-
### Path One: Migrate into Jira Service Management (Stay in Atlassian)
Best for organizations already standardized on the Atlassian suite. The official in-app tool syncs most configuration into the selected JSM plan, but note:
@@ -216,8 +206,6 @@ Whichever path you choose, **complete the migration and export the data you need
## How to Choose
----
-
- You need a durable on-call / incident-response home outside Atlassian's merge path
@@ -241,8 +229,6 @@ Still comparing other vendors? See the in-depth [Flashduty vs PagerDuty comparis
## Summary
----
-
Opsgenie was an excellent alerting and on-call product, but its lifecycle is now on a countdown. For existing users, April 5, 2027 is a firm planning boundary: **migration is not a question of whether, but of where to**.
- If your organization already runs on the Atlassian suite, JSM is the official, lowest-friction path;
diff --git a/en/on-call/comparison/vs-pagerduty.mdx b/en/on-call/comparison/vs-pagerduty.mdx
index 1b34ce66..6a1c6682 100644
--- a/en/on-call/comparison/vs-pagerduty.mdx
+++ b/en/on-call/comparison/vs-pagerduty.mdx
@@ -6,8 +6,6 @@ keywords: ["product comparison", "PagerDuty", "feature comparison", "pricing com
## Introduction
----
-
In the rapidly evolving digital era, enterprises increasingly rely on **monitoring and incident management tools**—these are essential foundations for ensuring business continuity and service stability. However, as monitoring systems scale, the flood of **alerts and event notifications** presents unprecedented operational challenges for IT teams.
@@ -37,8 +35,6 @@ When your organization encounters the following situations, it's time to conside
## Procurement Guide Overview
----
-
This guide provides **comprehensive On-call tool procurement recommendations**. We'll analyze the points IT managers should focus on when seeking efficient collaborative incident management solutions for development and operations teams, across three core dimensions: **Product Features**, **Service Quality**, and **Pricing Strategy**.
We'll also provide detailed comparison analysis between **Flashduty** and **PagerDuty**, two leading On-call vendors, to help you make an informed choice.
@@ -51,8 +47,6 @@ The feature and pricing information on this page is current **as of July 2026**;
## Product Feature Comparison
----
-
Product features are compared module by module, following Flashduty's current product structure: **On-call** (noise reduction, scheduling, escalation, notifications), **Response** (war room collaboration and incident resolution), **Status Pages** (external status communication), **AI SRE** (autonomous troubleshooting agent), and the **platform foundation** that underpins them (integrations, alert pipelines, insights, security, and the open developer ecosystem). This breakdown roughly maps to PagerDuty's own product lines, making it easy to compare block by block.
### On-call
@@ -177,7 +171,7 @@ Platform is the shared foundation underneath the four products above: how data g
| Core Capability | Flashduty | PagerDuty | Notes |
| --- | --- | --- | --- |
-| **Alert Integration** | 267 integration sources with full coverage of China-region cloud and monitoring ecosystems (Alibaba Cloud, Tencent Cloud, Huawei Cloud, JD Cloud, Kingsoft Cloud, UCloud, etc.), **compatible with the PagerDuty protocol** | 750+ integrations with broad overseas ecosystem coverage | PagerDuty offers more integrations overall; Flashduty covers the China-region tech stack more completely, and existing PagerDuty integration configs can switch over directly |
+| **Alert Integration** | 290+ integration sources with full coverage of China-region cloud and monitoring ecosystems (Alibaba Cloud, Tencent Cloud, Huawei Cloud, JD Cloud, Kingsoft Cloud, UCloud, etc.), **compatible with the PagerDuty protocol** | 750+ integrations with broad overseas ecosystem coverage | PagerDuty offers more integrations overall; Flashduty covers the China-region tech stack more completely, and existing PagerDuty integration configs can switch over directly |
| **Pull-based Ingestion** | [HTTP Pull](/en/on-call/integration/alert-integration/alert-sources/http-pull) periodically polls an endpoint; [DB Pull](/en/on-call/integration/alert-integration/alert-sources/db-pull) queries MySQL/PostgreSQL/ClickHouse directly to generate alerts from incremental changes | Push-based integration is the primary model | Legacy systems with no Webhook push capability can still integrate with Flashduty |
| **Two-way Ticket Sync** | [Jira](/en/on-call/integration/webhooks/jira-sync) (status mapping is configurable; field mapping supports incident ID / incident URL), [ServiceNow](/en/on-call/integration/webhooks/servicenow-sync), [ServiceDesk Plus](/en/on-call/integration/webhooks/servicedesk-plus-sync) | Jira, ServiceNow, etc. | Both support |
| **Change Event Integration** | ✅ Supports change event ingestion, dynamic routing, and label enrichment | ✅ Change Events | Both support |
@@ -239,8 +233,6 @@ Before reaching the team, alerts pass through routing, filtering, and transforma
## Pricing Comparison
----
-
Pricing is a critical factor in enterprise decisions—you need to choose the most cost-effective option that meets your requirements.
| Dimension | Flashduty | PagerDuty |
@@ -296,8 +288,6 @@ Take a 100-person engineering team where 15 people are routinely involved in inc
## Service Quality Comparison
----
-
Quality service support is essential for successful product implementation.
| Service Item | Flashduty | PagerDuty |
@@ -317,8 +307,6 @@ Quality service support is essential for successful product implementation.
## Migrating from PagerDuty / Opsgenie
----
-
Flashduty is **compatible with the PagerDuty protocol**—existing alert integration configs can switch over with essentially no rework. A dedicated service group provides one-on-one expert support throughout the migration.
@@ -332,8 +320,6 @@ Quality service support is essential for successful product implementation.
## Summary and Recommendations
----
-
### Core Advantages Comparison
diff --git a/en/on-call/configuration/custom-forms.mdx b/en/on-call/configuration/custom-forms.mdx
index bc7fd0f2..a684c02a 100644
--- a/en/on-call/configuration/custom-forms.mdx
+++ b/en/on-call/configuration/custom-forms.mdx
@@ -47,21 +47,17 @@ These forms also work in the Flashduty App: creating, acknowledging, and closing
If an action has no configured form elements, or no element is visible for the current incident and user, Flashduty runs the normal create, acknowledge, or close flow without asking for additional input.
-## Union interaction for batch operations
+## Batch Acknowledge or Close
-When you select **multiple** incidents in the incident list and batch **acknowledge** or batch **close** them, the system first splits the selection into two groups by form applicability, then handles each group separately:
+When you **acknowledge** or **close** several incidents at once from the incident list:
-- **Incidents that don't need the form**: the action has no configured form elements, or no element is visible for the current incident/user. Clicking **Acknowledge / Close** **executes immediately** and deselects them from the selection, then the form for the remaining incidents is shown
-- **Incidents that need the form**: a **union form** is shown — you fill it once and the values are written to every listed incident in a single request (all-or-nothing; on failure the dialog stays open so you can retry)
+- **Incidents that need no form** (no form elements are configured for the action, or the incident/user meets no element's display condition) are processed immediately and removed from the selection.
+- **The remaining incidents** get one **union form**: an element appears if it is visible for any incident and is required if it is required for any incident. You fill it in once and it is written to every incident in a single request that succeeds or fails as a whole; on failure the dialog stays open so you can retry.
-The union form's fields are the union of all incidents awaiting the form: an element appears if any incident can see it and is required if any incident requires it.
-
-**Overview in mixed scenarios**: when the selection contains both no-form and form incidents, the dialog starts with an overview — "N incidents acknowledged / M incidents pending acknowledgment" ("closed / pending closure" for the close action) — noting that "the incidents below require the form before acknowledgment and the form values are written to each of them". If every selected incident needs the form, the dialog goes straight to the form with no overview.
-
-**Abandon warning**: if you close the dialog without submitting (Cancel or the top-right close) after some incidents have already been executed, a warning appears — "N acknowledged, M remaining not filled in and not processed" ("closed" for the close action) — so you don't assume the whole batch was completed.
+When both kinds are selected, the top of the dialog shows how many incidents were already processed and how many are pending; if every incident needs the form, the form opens directly. If you close the dialog without submitting, you are told that the remaining incidents were left unprocessed, so you don't assume the whole batch is done.
- **Fallback when the form cannot be resolved**: for single-incident acknowledge/close, the existing semantics hold — a resolution failure raises the error and is not silently bypassed; for batch acknowledge/close, a resolution failure does not block the action and the whole batch is executed as if no form existed (consistent with the backend's degradation for form-less batch requests).
+If the form fails to parse, a single acknowledge / close shows an error; a batch acknowledge / close is not blocked and runs the whole batch as if no form were needed.
## Recommendations
diff --git a/en/on-call/configuration/filter-conditions.mdx b/en/on-call/configuration/filter-conditions.mdx
index 8b5809c2..8be649be 100644
--- a/en/on-call/configuration/filter-conditions.mdx
+++ b/en/on-call/configuration/filter-conditions.mdx
@@ -5,8 +5,6 @@ description: Filter specific alerts or incidents through condition matching, use
## Where Are Filter Conditions Used?
----
-
Filter conditions apply to the following scenarios:
| Scenario | Description |
@@ -21,13 +19,9 @@ Filter conditions apply to the following scenarios:
## How to Configure Filter Conditions?
----
-
### Rule Design
-Flashduty On-call abstracts the entire filter condition system, aiming for minimal configuration while meeting most scenario requirements.
-
-The overall judgment logic consists of multiple condition groups:
+A filter consists of one or more condition groups:
- **Conditions within a group**: `AND` relationship—each condition must match for the group to match
- **Between groups**: `OR` relationship—any group matching means overall match
@@ -65,10 +59,6 @@ Both take integration instance IDs as values; in the UI you pick integrations fr
Historically, `alert_severity` (alert severity) and `incident_severity` (incident severity) were used as two separate fields. They are now unified as `severity`. When loading legacy rules, the system automatically migrates both keys to `severity` — you don't need to edit anything manually; simply saving the rule will persist the new key.
-
-Target values in conditions are all strings, supporting **exact**, **regex**, **wildcard**, **IP range**, and **numeric comparison** matching methods.
-
-

As shown above, we have two condition groups, each with two conditions, and conditions have multiple match values. The expression is:
@@ -81,6 +71,8 @@ or
### Matching Methods
+Target values are always strings; the format decides the matching method: **regex**, **wildcard**, **IP range**, or **numeric comparison**, and anything else is an **exact** match.
+
When a value string has `/` as prefix and suffix, the entire value is recognized as **regex**.
@@ -113,7 +105,7 @@ or
When a value has `cidr` as prefix, the entire value is recognized as **IP range**.
**Example**:
- - `labels.host`: `cidr:10.0.0.206/24` — matches when ip label is within "10.0.0.206/24" range
+ - `labels.host`: `cidr:10.0.0.206/24` — matches when the host label is within "10.0.0.206/24" range
This filter condition doesn't apply in: incident list filtering by labels, alert list filtering by labels, and alert inhibit rule filtering for active alerts.
@@ -145,8 +137,6 @@ or
## FAQ
----
-
Flashduty On-call receives large volumes of data. To ensure system stability, the system only searches the most recent 500 alert events from the past 24 hours for label deduplication. Therefore, extracted labels may change dynamically, or no labels may be extracted if there's no new data in the past 24 hours.
diff --git a/en/on-call/configuration/notifications.mdx b/en/on-call/configuration/notifications.mdx
index d5ad98ab..f62bdec6 100644
--- a/en/on-call/configuration/notifications.mdx
+++ b/en/on-call/configuration/notifications.mdx
@@ -4,8 +4,6 @@ description: Comprehensive guide to Flashduty On-call supported notification cha
---
## Overview
----
-
### Supported Channel Matrix
Flashduty On-call provides a comprehensive notification matrix covering mobile App, traditional communication, and mainstream instant messaging (IM) tools.
@@ -23,8 +21,6 @@ Flashduty On-call provides a comprehensive notification matrix covering mobile A
## Core Notification Channel Configuration
----
-
### Flashduty App
The Flashduty App is the most efficient mobile work tool for On-call engineers. Wherever you are, you can fully control the incident handling process just like at your computer.
@@ -119,8 +115,6 @@ The Flashduty App is the most efficient mobile work tool for On-call engineers.
## Instant Messaging (IM) Integration
----
-
Integrating Flashduty On-call with your team's daily IM tools (like Feishu/Lark, Dingtalk) allows receiving and handling incidents in familiar collaboration environments, greatly improving On-call efficiency.
### App Integration (Recommended)
@@ -364,8 +358,6 @@ Verify the following:
## General Configuration
----
-
Flashduty On-call allows you to customize personalized notification messages for different channels.
@@ -397,8 +389,6 @@ Flashduty On-call allows you to customize personalized notification messages for
## Related Topics
----
-
Configure alert notification rules and escalation paths
diff --git a/en/on-call/configuration/personal-settings.mdx b/en/on-call/configuration/personal-settings.mdx
index dacdf140..7646abf7 100644
--- a/en/on-call/configuration/personal-settings.mdx
+++ b/en/on-call/configuration/personal-settings.mdx
@@ -10,16 +10,12 @@ description: Set personal contact information, notification preferences, and API
## Accessing Personal Center
----
-
Hover over the user icon in the lower left corner and select **Personal Information**. Related personal settings (**Notification Preferences**, APP Key, Flashduty APP) live in the same menu; for organization-level settings, go to **Platform Management → Organization → Organization Information**.

## Personal Information
----
-
Personal settings are accessed via the user icon in the lower left corner → **Personal Information**. The page shows an **account profile card** at the top and a **Login & Security** section below.
### Account Profile Card
@@ -61,8 +57,6 @@ The organization time zone is maintained by the subject account or an Account.Ad
## Notification Preferences
----
-
The Notification Preferences page configures notification channels **per notification scene**: **Incident Dispatch**, **Collaboration & Follow-up**, **Schedule Shift**, and **Internal Status Page**.
Supported channels per scene:
@@ -140,8 +134,6 @@ Status-page notifications are pushed only through IM apps; subscription emails a
## APP Key
----
-
APP Keys are used for API request authentication.
| Limit | Description |
@@ -159,8 +151,6 @@ When creating or editing an APP Key, choose its mode under **Permission Scope**.
## Flashduty APP
----
-
### Download the app
| Platform | Download Method |
@@ -197,8 +187,6 @@ The Flashduty APP supports free push notifications for alerts, ensuring critical
## FAQ
----
-
1. Check if the channel has escalation rules configured. Without escalation rules, incidents won't trigger notifications
@@ -210,8 +198,6 @@ The Flashduty APP supports free push notifications for alerts, ensuring critical
## Related Topics
----
-
Set notification channel to "Follow Personal Preferences"
diff --git a/en/on-call/configuration/schedule.mdx b/en/on-call/configuration/schedule.mdx
index 9cdb026b..1b37909c 100644
--- a/en/on-call/configuration/schedule.mdx
+++ b/en/on-call/configuration/schedule.mdx
@@ -10,15 +10,11 @@ Flashduty On-call provides highly flexible scheduling capabilities, supporting d
{/*
## Video Introduction
----
-
*/}
## Core Concepts
----
-
Understanding these concepts before configuration will help you better plan your schedules:
| Concept | Description |
@@ -35,8 +31,6 @@ Understanding these concepts before configuration will help you better plan your
## Configuration Process
----
-
Go to **Schedule Management**, click "Create Schedule"
@@ -96,8 +90,6 @@ Understanding these concepts before configuration will help you better plan your
## Delete a schedule
----
-
You can delete a schedule from the schedule list or the schedule detail page. The system asks for confirmation before deletion.
@@ -106,8 +98,6 @@ If a schedule is referenced by escalation rules, the delete button is disabled.
## On-call roles
----
-
On-call roles distinguish responders with different responsibilities within the same schedule (e.g., "primary" and "backup") and are an account-level resource:
- **Shared across the account**: Roles take effect at the account level and are shared by all schedules
@@ -120,8 +110,6 @@ By default, each account has only one on-call role, so you don't need to choose
## Override and time off
----
-
When on-call personnel need time off or have a temporary conflict, **don't modify permanent rules** — use the "Override" feature instead. An override is an independent rule type that **fully preempts** the normal on-call rules within its effective window. Once the window ends, the original rules resume automatically.
### Two ways to create an override
@@ -155,8 +143,6 @@ We recommend having a brief sync meeting between outgoing and incoming on-call p
## Date mask and continuous rotation
----
-
### Date mask
Date mask controls which days of the week an on-call rule takes effect. By selecting different day combinations, you can flexibly implement differentiated scheduling between weekdays and weekends.
@@ -186,8 +172,6 @@ Consider enabling continuous rotation in the following scenarios:
## Common scheduling scenarios
----
-
**Requirement**: Ops team has A, B, C—each person on-call for one week, handoff Monday at 10:00 AM.
@@ -234,8 +218,6 @@ Consider enabling continuous rotation in the following scenarios:
## View schedule details
----
-
Click a schedule name to enter the detail page, where you can view the scheduling calendar and manage on-call rules. The upper right corner provides these options:
- **View switcher**: Toggle between "Week", "Two Weeks", and "Calendar" (month view)
@@ -245,8 +227,6 @@ Click any time slot in the calendar to view the current responders or create an
## View My Schedule
----
-
The **Schedules** list page embeds a **My Schedule** section at the top, summarizing your on-call assignments in a week view: the left column lists the schedules in which you have shifts this week, and the calendar on the right shows your on-call time slots in each schedule.
Click the left and right arrows next to the section title to browse previous or upcoming weeks, and click the dot button in the middle to quickly jump back to the current week.
@@ -255,8 +235,6 @@ Shift times are rendered in your effective time zone; when a schedule's time zon
## Related Topics
----
-
Configure alert notification rules and escalation paths
diff --git a/en/on-call/configuration/service-calendar.mdx b/en/on-call/configuration/service-calendar.mdx
index d3aafec9..bb25fead 100644
--- a/en/on-call/configuration/service-calendar.mdx
+++ b/en/on-call/configuration/service-calendar.mdx
@@ -9,16 +9,12 @@ description: Service calendars define workdays and rest days, working with escal
{/*
## Video Introduction
----
-
*/}
## Use Cases
----
-
| Scenario | Description |
| --- | --- |
| **Escalation Rules** | Assign to different on-call personnel based on workdays/rest days |
@@ -26,8 +22,6 @@ description: Service calendars define workdays and rest days, working with escal
## Creating a Calendar
----
-
Go to **Configuration → Service Calendar** and click **Add Calendar**.
| Configuration | Description |
@@ -48,8 +42,6 @@ New calendars default to all workdays. After creation, open the calendar detail
## Editing a Calendar
----
-
| Action | Description |
| --- | --- |
| **Modify Basic Info** | Calendar name, description, management team |
@@ -65,8 +57,6 @@ Deleting a calendar is irreversible. Please confirm no escalation rules or silen
## FAQ
----
-
They serve different purposes:
@@ -80,8 +70,6 @@ Deleting a calendar is irreversible. Please confirm no escalation rules or silen
## Related Topics
----
-
Reference service calendars in escalation rules
diff --git a/en/on-call/configuration/templates.mdx b/en/on-call/configuration/templates.mdx
index f462509e..0242baa5 100644
--- a/en/on-call/configuration/templates.mdx
+++ b/en/on-call/configuration/templates.mdx
@@ -164,166 +164,6 @@ Complete variable list for incident objects:
-## FAQ
-
-
-
-- Manually created incidents have no labels
-- Auto-created incidents have labels, same as the first merged alert's labels
-
-Go to **Incident List** → view incident details to see all label information.
-
-
-
-When creating custom templates, the system uses mock data to check syntax. Mock data covers limited scenarios; rendering may fail at runtime, and system falls back to default template.
-
-
-Recommend checking if variable exists before referencing:
-
-```go
-// ❌ Wrong: Read label directly
-{{.Labels.resource}}
-
-// ✅ Recommended: Check then read
-{{if .Labels.resource}}{{.Labels.resource}}{{end}}
-```
-
-
-
-
-Use `toHtml` function to handle:
-
-```go
-// Escape HTML characters
-{{toHtml .Title}}
-
-// Render with first non-empty value
-{{toHtml .Title .TitleEnglish}}
-```
-
-
-
-```go
-// date function: Convert timestamp to readable format
-{{date "2006-01-02 15:04:05" .StartTime}}
-
-// ago function: Convert time difference to readable format (e.g., "5 minutes ago")
-{{ago .StartTime}}
-```
-
-
-
-Add `$` before external variable:
-
-```go
-{{range .Responders}}
- {{if eq $.Progress "Triggered"}}
- 【Pending】{{.Email}}
- {{end}}
-{{end}}
-```
-
-
-
-Use `index` function:
-
-```go
-{{index .Labels "obj.instance"}}
-```
-
-
-
-```go
-// alertLabels: Get deduplicated array
-{{alertLabels . "resource"}}
-
-// joinAlertLabels: Deduplicate and join with delimiter as string
-{{joinAlertLabels . "resource" ", "}}
-```
-
-
-
-```go
-// Complete iteration
-{{range $k, $v := .Labels}}
- {{$k}} : {{toHtml $v}}
-{{end}}
-
-// Exclude single label
-{{range $k, $v := .Labels}}
- {{if ne $k "resource"}}
- {{$k}} : {{toHtml $v}}
- {{end}}
-{{end}}
-
-// Exclude multiple labels
-{{range $k, $v := .Labels}}
- {{if not (in $k "resource" "body_text")}}
- {{$k}} : {{toHtml $v}}
- {{end}}
-{{end}}
-```
-
-
-
-Use `jsonGet` function to extract values by path from valid JSON. Syntax reference at [gjson.dev](https://gjson.dev/).
-
-```go
-// Extract detail_url field from rule_note label
-{{jsonGet .Labels.rule_note "detail_url"}}
-
-// Extract name field of first element in JSON array
-{{jsonGet .Labels.slice "0.name"}}
-
-// Iterate array, match instanceId field where userId==7777
-{{jsonGet .Labels.rule_note "#(userId==7777)#.instanceId"}}
-```
-
-
-
-**imageSrcToURL**: Convert image_key or URL to accessible address (for Dingtalk/Slack App)
-
-```go
-{{ $root := . }}
-{{ range $i, $v := .Images }}
- {{ $imageURL := imageSrcToURL $root $v.Src }}
- {{ if $imageURL }}{{ end }}
-{{ end }}
-```
-
-**transferImage**: Upload image to third-party platform (for Feishu/Lark App)
-
-```go
-{{ $root := . }}
-{{ range $i, $v := .Images }}
- {{ $transferURL := transferImage $root $v.Src }}
- {{ if $transferURL }}{{ end }}
-{{ end }}
-```
-
-
-Image size cannot exceed 10 MB, supports JPG, PNG, WEBP, GIF, BMP formats.
-
-
-
-
-| Function | Description | Example |
-| :--- | :--- | :--- |
-| `and` | Logical AND | `{{if and (eq .A "x") (eq .B "y")}}` |
-| `or` | Logical OR | `{{if or (eq .A "x") (eq .A "y")}}` |
-| `not` | Logical NOT | `{{if not (eq .A "x")}}` |
-| `eq` | Equal | `{{if eq .A "x"}}` |
-| `ne` | Not equal | `{{if ne .A "x"}}` |
-| `gt` / `ge` | Greater than / Greater or equal | `{{if gt .AlertCnt 1}}` |
-| `lt` / `le` | Less than / Less or equal | `{{if lt .AlertCnt 10}}` |
-
-
-
-- Function list: [functions.go](https://github.com/flashcatcloud/sprig/blob/master/functions.go#L97)
-- Usage examples: Check corresponding `_test.go` files, e.g., [date_test.go](https://github.com/flashcatcloud/sprig/blob/master/date_test.go)
-
-
-
## Channel Templates
Different notification channels support different template formats and limitations.
@@ -365,21 +205,21 @@ Requires [Feishu/Lark integration](/en/on-call/integration/instant-messaging/lar
### Card Fields and Bottom Action Buttons
-When editing a Feishu/Lark app template, the **Additional info** tab next to the **Content** tab provides a card-fields switch panel ("These fields are rendered by the system. Use the switches to show or hide them at the bottom of the message."), which controls whether 7 system fields — channel, snooze deadline, severity, aggregated alert count, responders, the details button, and AI analysis — are rendered at the bottom of the card.
-
-**Create war room** can be configured on Feishu/Lark app, Dingtalk app, and Slack app templates (backed respectively by the `feishu_app_war_room_enabled`, `dingtalk_app_war_room_enabled`, and `slack_app_war_room_enabled` fields, **off** by default; save the template to apply the change). The switch itself is labelled **Create war room**, and the panel describes it as "Once enabled, a dedicated Create War Room button is shown at the bottom of the card when the group-creation conditions are met."
+The **Additional info** tab next to **Content** controls which system content appears at the bottom of the card. Switches available per channel:
-- **On**: when the incident is not closed, has no war room yet, and has responders, the card for that channel shows a dedicated **👥 Create War Room** button at the bottom; clicking it starts group creation
-- **Off**: no such button is shown
+| Switch | Feishu/Lark app | Dingtalk app | Slack app | Microsoft Teams | WeCom app |
+| --- | --- | --- | --- | --- | --- |
+| Channel, snooze deadline, severity, aggregated alert count, responders, details button | ✓ | ✓ | ✓ | ✓ | ✓ |
+| AI analysis | ✓ | ✓ | ✓ | — | — |
+| Create war room | ✓ | ✓ | ✓ | — | — |
+| Keep custom actions after incident closure | ✓ | ✓ | ✓ | ✓ | — |
-**Keep custom actions after incident closure** is offered on Feishu/Lark app, Dingtalk app, Slack app, and Microsoft Teams templates; the WeCom app template does not offer it (the panel does not render the switch for that channel). It is backed by the `incident_card_closed_action_apps` field — an array of the channel keys for which the capability is enabled (e.g. `["feishu_app"]`), **off** by default (an empty array means off); save the template to apply the change.
+- **Create war room** (off by default): when on, and the incident is not closed, has no war room yet and has responders, the card shows a **👥 Create War Room** button at the bottom; click it to create the group.
+- **Keep custom actions after incident closure** (off by default): when on, configured custom actions can still be run from the message card for 3 days after the incident is closed; when off, or after 3 days, run them from the incident details page.
-- **On** (panel description: "Enabled. Configured custom actions can be run from the message card for 3 days after the incident is closed. After that, run them from the incident details."): configured custom actions can still be run directly from the message card for 3 days after the incident is closed; after that, run them from the incident details page
-- **Off** (panel description: "Disabled. Custom actions are hidden from the message card after the incident is closed. You can still run them from the incident details."): the message card no longer shows the custom actions entry once the incident is closed; they can still be run from the incident details page
+Save the template for switch changes to take effect.
-Together with the 7 card-field switches above, the **Additional info** panel holds **9 switches** on Feishu/Lark app, Dingtalk app, and Slack app templates, **7** on Microsoft Teams, and **6** on WeCom app (see the channel template tabs below).
-
-The card's bottom action area has changed as well: **More Actions** (that placeholder is its label) is now a dropdown select menu holding custom actions, snooze durations, and unacknowledge — the war room button is no longer one of its entries.
+On Feishu/Lark app cards, **More Actions** at the bottom is a dropdown menu with custom actions, snooze durations, and unacknowledge; the **👥 Create War Room** button is shown separately, not in that menu.
@@ -402,7 +242,7 @@ Requires [Dingtalk integration](/en/on-call/integration/instant-messaging/dingta
-As with the Feishu/Lark app, the **Additional info** tab next to the **Content** tab provides a card-fields switch panel ("These fields are rendered by the system. Use the switches to show or hide them at the bottom of the message."), controlling whether 7 system fields — channel, snooze deadline, severity, aggregated alert count, responders, the details button, and AI analysis — are rendered at the bottom of the card; the Dingtalk app template also offers the **Create war room** switch (backed by the `dingtalk_app_war_room_enabled` field, **off** by default; save the template to apply the change) and the **Keep custom actions after incident closure** switch (recorded in the `incident_card_closed_action_apps` channel-key array, **off** by default), so the **Additional info** panel holds **9 switches**.
+For the switches on the **Additional info** tab, see [Card Fields and Bottom Action Buttons](#card-fields-and-bottom-action-buttons).
@@ -428,7 +268,7 @@ WeCom limits card length, template render area max **8 lines**, excess will be h
-As with the Feishu/Lark app, the **Additional info** tab next to the **Content** tab provides a card-fields switch panel ("These fields are rendered by the system. Use the switches to show or hide them at the bottom of the message."), controlling whether 6 system fields — channel, snooze deadline, severity, aggregated alert count, responders, and the details button — are rendered at the bottom of the card. The WeCom app template does not offer the **AI Analysis**, **Create war room**, or **Keep custom actions after incident closure** switches, so its **Additional info** panel holds **6 switches**.
+For the switches on the **Additional info** tab, see [Card Fields and Bottom Action Buttons](#card-fields-and-bottom-action-buttons).
@@ -459,7 +299,7 @@ When displaying images, separate images from other content with `---`, format st
-As with the Feishu/Lark app, the **Additional info** tab next to the **Content** tab provides a card-fields switch panel ("These fields are rendered by the system. Use the switches to show or hide them at the bottom of the message."), controlling whether 7 system fields — channel, snooze deadline, severity, aggregated alert count, responders, the details button, and AI analysis — are rendered at the bottom of the card; the Slack app template also offers the **Create war room** switch (backed by the `slack_app_war_room_enabled` field, **off** by default; save the template to apply the change) and the **Keep custom actions after incident closure** switch (recorded in the `incident_card_closed_action_apps` channel-key array, **off** by default), so the **Additional info** panel holds **9 switches**.
+For the switches on the **Additional info** tab, see [Card Fields and Bottom Action Buttons](#card-fields-and-bottom-action-buttons).
@@ -478,7 +318,7 @@ Requires [Teams integration](/en/on-call/integration/instant-messaging/microsoft
-As with the Feishu/Lark app, the **Additional info** tab next to the **Content** tab provides a card-fields switch panel ("These fields are rendered by the system. Use the switches to show or hide them at the bottom of the message."), controlling whether 6 system fields — channel, snooze deadline, severity, aggregated alert count, responders, and the details button — are rendered at the bottom of the card, plus a **Keep custom actions after incident closure** switch (recorded in the `incident_card_closed_action_apps` channel-key array, **off** by default), so its **Additional info** panel holds **7 switches**. The Microsoft Teams template does not offer the **AI Analysis** or **Create war room** switches.
+For the switches on the **Additional info** tab, see [Card Fields and Bottom Action Buttons](#card-fields-and-bottom-action-buttons).
@@ -722,6 +562,166 @@ Supports full HTML format. Default template provides professional email layout i
+## FAQ
+
+
+
+- Manually created incidents have no labels
+- Auto-created incidents have labels, same as the first merged alert's labels
+
+Go to **Incident List** → view incident details to see all label information.
+
+
+
+When creating custom templates, the system uses mock data to check syntax. Mock data covers limited scenarios; rendering may fail at runtime, and system falls back to default template.
+
+
+Recommend checking if variable exists before referencing:
+
+```go
+// ❌ Wrong: Read label directly
+{{.Labels.resource}}
+
+// ✅ Recommended: Check then read
+{{if .Labels.resource}}{{.Labels.resource}}{{end}}
+```
+
+
+
+
+Use `toHtml` function to handle:
+
+```go
+// Escape HTML characters
+{{toHtml .Title}}
+
+// Render with first non-empty value
+{{toHtml .Title .TitleEnglish}}
+```
+
+
+
+```go
+// date function: Convert timestamp to readable format
+{{date "2006-01-02 15:04:05" .StartTime}}
+
+// ago function: Convert time difference to readable format (e.g., "5 minutes ago")
+{{ago .StartTime}}
+```
+
+
+
+Add `$` before external variable:
+
+```go
+{{range .Responders}}
+ {{if eq $.Progress "Triggered"}}
+ 【Pending】{{.Email}}
+ {{end}}
+{{end}}
+```
+
+
+
+Use `index` function:
+
+```go
+{{index .Labels "obj.instance"}}
+```
+
+
+
+```go
+// alertLabels: Get deduplicated array
+{{alertLabels . "resource"}}
+
+// joinAlertLabels: Deduplicate and join with delimiter as string
+{{joinAlertLabels . "resource" ", "}}
+```
+
+
+
+```go
+// Complete iteration
+{{range $k, $v := .Labels}}
+ {{$k}} : {{toHtml $v}}
+{{end}}
+
+// Exclude single label
+{{range $k, $v := .Labels}}
+ {{if ne $k "resource"}}
+ {{$k}} : {{toHtml $v}}
+ {{end}}
+{{end}}
+
+// Exclude multiple labels
+{{range $k, $v := .Labels}}
+ {{if not (in $k "resource" "body_text")}}
+ {{$k}} : {{toHtml $v}}
+ {{end}}
+{{end}}
+```
+
+
+
+Use `jsonGet` function to extract values by path from valid JSON. Syntax reference at [gjson.dev](https://gjson.dev/).
+
+```go
+// Extract detail_url field from rule_note label
+{{jsonGet .Labels.rule_note "detail_url"}}
+
+// Extract name field of first element in JSON array
+{{jsonGet .Labels.slice "0.name"}}
+
+// Iterate array, match instanceId field where userId==7777
+{{jsonGet .Labels.rule_note "#(userId==7777)#.instanceId"}}
+```
+
+
+
+**imageSrcToURL**: Convert image_key or URL to accessible address (for Dingtalk/Slack App)
+
+```go
+{{ $root := . }}
+{{ range $i, $v := .Images }}
+ {{ $imageURL := imageSrcToURL $root $v.Src }}
+ {{ if $imageURL }}{{ end }}
+{{ end }}
+```
+
+**transferImage**: Upload image to third-party platform (for Feishu/Lark App)
+
+```go
+{{ $root := . }}
+{{ range $i, $v := .Images }}
+ {{ $transferURL := transferImage $root $v.Src }}
+ {{ if $transferURL }}{{ end }}
+{{ end }}
+```
+
+
+Image size cannot exceed 10 MB, supports JPG, PNG, WEBP, GIF, BMP formats.
+
+
+
+
+| Function | Description | Example |
+| :--- | :--- | :--- |
+| `and` | Logical AND | `{{if and (eq .A "x") (eq .B "y")}}` |
+| `or` | Logical OR | `{{if or (eq .A "x") (eq .A "y")}}` |
+| `not` | Logical NOT | `{{if not (eq .A "x")}}` |
+| `eq` | Equal | `{{if eq .A "x"}}` |
+| `ne` | Not equal | `{{if ne .A "x"}}` |
+| `gt` / `ge` | Greater than / Greater or equal | `{{if gt .AlertCnt 1}}` |
+| `lt` / `le` | Less than / Less or equal | `{{if lt .AlertCnt 10}}` |
+
+
+
+- Function list: [functions.go](https://github.com/flashcatcloud/sprig/blob/master/functions.go#L97)
+- Usage examples: Check corresponding `_test.go` files, e.g., [date_test.go](https://github.com/flashcatcloud/sprig/blob/master/date_test.go)
+
+
+
## Related Topics
diff --git a/en/on-call/incident/alert-management.mdx b/en/on-call/incident/alert-management.mdx
index 5925e3f8..ce930f57 100644
--- a/en/on-call/incident/alert-management.mdx
+++ b/en/on-call/incident/alert-management.mdx
@@ -59,11 +59,11 @@ Click the view settings button at the top of the list to adjust the following op
| Option | Description |
| :--- | :--- |
-| **Detail Display** | Choose to open alert details as a **Page** or in a **Side Panel** when clicking an alert |
+| **Detail Display** | Choose to open alert details as a **Page** or in a **Side Panel** when clicking an alert; the side panel lets you browse without leaving the list |
| **Auto Refresh** | Options: Off / 5 seconds / 10 seconds / 20 seconds / 30 seconds / 1 minute / 2 minutes / 3 minutes / 5 minutes / 10 minutes, defaulting to 10 seconds |
| **Display Attributes** | Toggle visibility of columns such as recovery status, incident progress, associated events, associated incident, trigger time, integration source, and channel |
-View settings are retained per view and persist long-term in the current browser.
+View settings are saved per view in the current browser.
### Batch Operations
@@ -91,7 +91,7 @@ In aggregate view, the system matches at most **100** records for grouping displ
## Alert Details
-Click an alert title to enter the alert details page. The top of the page is a **HeaderInfo bar** that shows the alert title, severity tag, alert ID (hover to copy the full ID), recovery status (Recovered / Not Recovered), and the progress tag of the incident it belongs to. If the alert has ever been silenced or inhibited, the corresponding icon is displayed before the title. The right side of the header provides a **Merge** action button to merge the current alert into an incident.
+Click an alert title to enter the alert details page. The header bar at the top shows the alert title, severity tag, alert ID (hover to copy the full ID), recovery status (Recovered / Not Recovered), and the progress tag of the incident it belongs to. If the alert has ever been silenced or inhibited, the corresponding icon is displayed before the title. The right side of the header provides a **Merge** action button to merge the current alert into an incident.
The details page body is split into two tabs:
@@ -100,17 +100,13 @@ The details page body is split into two tabs:
| **Alert Overview** | The left side shows the alert description, labels, and **related events preview** (up to 5 entries, with a link to the *Associated Events* tab for the full list); the right side shows attributes (channel, trigger time), images, alert source, associated incident, and Links |
| **Associated Events** | Shows the list of all raw events associated with this alert |
-The active tab is controlled by the URL parameter `tab`: appending `?tab=events` to the alert details URL (e.g. `/alert/detail/{id}?tab=events`) opens the **Associated Events** tab directly, and tab switches are synced to the address bar. The **View full event history** entry in the "showing only the latest N alert events" hint on the incident details page uses this mechanism.
+Append `?tab=events` to the alert details URL (e.g. `/alert/detail/{id}?tab=events`) to open the **Associated Events** tab directly; switching tabs updates the address bar. The **View full event history** link on the incident details page opens alerts this way.
The **Alert Source** is clickable so you can quickly trace where an alert came from:
- **Alerts from the Monit integration**: Display the name of the rule that produced the alert. Click to jump to that alert rule — Entity Tree rules open the rule editing view directly in Entity Tree, while standalone rules open the rule details page. When older data lacks rule labels, it falls back to showing the integration name and links to the integration details
- **Alerts from other integrations**: Display the integration name and type tag (shared or dedicated); click to jump to the corresponding integration details page
-
-You can also choose to view details in the **Side Panel** mode from the alert list view settings, allowing you to quickly browse alert information without navigating to a new page.
-
-
### Alert Lifecycle Records
The entire process from trigger to close is fully recorded by the system. Common record types include:
diff --git a/en/on-call/incident/custom-actions.mdx b/en/on-call/incident/custom-actions.mdx
index e88dd31b..661be2d3 100644
--- a/en/on-call/incident/custom-actions.mdx
+++ b/en/on-call/incident/custom-actions.mdx
@@ -1,5 +1,6 @@
---
title: "Custom Actions"
+sidebarTitle: "Incident Custom Actions"
description: "Learn about custom action use cases and configuration methods"
---
@@ -26,7 +27,7 @@ When confirmed that incidents affect production services, trigger external Statu
-Login to console, go to **Integration Center => Webhook**.
+Login to console, go to **Integration Center → Webhook**.
diff --git a/en/on-call/incident/handle-update-incident.mdx b/en/on-call/incident/handle-update-incident.mdx
index c7ac7285..5d4b3d4c 100644
--- a/en/on-call/incident/handle-update-incident.mdx
+++ b/en/on-call/incident/handle-update-incident.mdx
@@ -65,12 +65,12 @@ You have three ways to acknowledge a newly triggered incident.
- **Single Acknowledge**: Click incident details in console, click **Acknowledge** button to complete
- **Batch Operation**: In console incident list, select multiple triggered incidents, click **Acknowledge** button for batch acknowledgment
-- **AI Analysis**: After selecting multiple incidents, click the **AI Analysis** button to batch-send the selected incidents as context to the AI SRE Agent for analysis. This button requires the AI SRE module to be enabled and the `AiSreChatVisit` permission; if all selected incidents belong to the same team, the session defaults to that team's scope.
+- **AI Analysis**: After selecting multiple incidents, click the **AI Analysis** button to batch-send the selected incidents as context to the AI SRE Agent for analysis. This requires AI SRE to be activated and permission to use AI SRE chat; if all selected incidents belong to the same team, the session defaults to that team's scope.
-- **App Messages**: App message main card provides an **Acknowledge** button, click the card to complete acknowledgment. If clicking the card has no effect, you may not have completed login account linking in the app or other reasons. See [Feishu/Lark Integration Guide](/en/on-call/integration/instant-messaging/lark) for details
-- **Bot Messages**: Most bot channels push messages in Markdown format. You can modify notification templates to add an **Acknowledge** redirect link for jumping to console to acknowledge. See default templates for details
+- **App Messages**: Click **Acknowledge** on the message card. If nothing happens, you have most likely not linked your Flashduty account in the app yet. See [Feishu/Lark Integration Guide](/en/on-call/integration/instant-messaging/lark) for details
+- **Bot Messages**: Most bot channels push messages in Markdown format. You can add an **Acknowledge** link in the [notification template](/en/on-call/configuration/templates) that opens the console to acknowledge.
@@ -135,7 +135,7 @@ Open the incident detail in the [Flashduty App](/en/on-call/quickstart/mobile-ap
## Close Incident
-You have multiple ways to close an incident.
+You can close an incident in any status. Closing sets its progress to **Closed**, and its alerts stop merging new events. If an alert hasn't recovered in the original monitoring system, later events will trigger new alerts and incidents in Flashduty On-call.
@@ -144,7 +144,7 @@ You have multiple ways to close an incident.
-App message main card provides a **Close** button, click the card to complete closure. If clicking the card has no effect, you may not have completed login account linking in the app or other reasons. See [Feishu/Lark Integration Guide](/en/on-call/integration/instant-messaging/lark) for details.
+Click **Close** on the message card. If nothing happens, you have most likely not linked your Flashduty account in the app yet. See [Feishu/Lark Integration Guide](/en/on-call/integration/instant-messaging/lark) for details.
@@ -158,9 +158,7 @@ If an authorized account member has configured a close custom form and the curre
### Reopen Incident
-Manually closing an incident changes progress to **Closed**. You can click **Close** in any status. Once manually closed, associated alerts stop merging new events. If alerts haven't recovered in the original monitoring system, new notification events may occur, triggering new alerts and incidents in Flashduty On-call.
-
-You can reopen accidentally closed incidents. Follow these steps:
+If you closed an incident by mistake, reopen it:
@@ -208,7 +206,7 @@ You can manually merge between incidents, or between incidents and alerts. Mergi
| Merge Alert to Incident | Alerts may be grouped into incidents by grouping rules, but you may want to adjust alert-incident associations. Go to alert details, click **Merge Into**, migrate the alert to target incident |
-The essence of merging is: changing alert-incident associations. If all alerts of an incident merge into others, that incident closes directly, and you only need to handle the target incident. Timeline completely records your modification process.
+Merging changes which incident an alert belongs to. If all alerts of an incident are merged into others, that incident closes automatically and you only need to handle the target incident. The timeline records every merge.
## FAQ
diff --git a/en/on-call/incident/search-view-incident.mdx b/en/on-call/incident/search-view-incident.mdx
index 8d4be9e3..aaeb1872 100644
--- a/en/on-call/incident/search-view-incident.mdx
+++ b/en/on-call/incident/search-view-incident.mdx
@@ -5,7 +5,7 @@ description: "Learn how to use the incident list and details page, including agg
## Incident List
-Flashduty On-call provides two entry points to view the incident list. One is within a channel, the other is under the Incident Management menu. The difference is that under Incident Management, you can see incidents from multiple channels, even all incidents across the entire account.
+The incident list has two entry points: the list inside a channel shows only that channel's incidents, while the list under the **Incident Management** menu spans channels, up to every incident in the account.
@@ -13,7 +13,7 @@ Flashduty On-call provides two entry points to view the incident list. One is wi
| # | Feature | Description |
| :---: | :--- | :--- |
-| 1 | Assignment toggle | A three-state control at the head of the filter bar: **All** / **Assigned to Me** (incidents where I am a responder) / **My Teams** (incidents in channels I belong to). It is mutually exclusive with the **Responders** and **Channels** filters in More Filters: manually selecting either one resets the toggle to **All** (manual selection takes precedence and is kept); the toggle only applies once those manual filters are cleared |
+| 1 | Assignment toggle | A three-state control at the head of the filter bar: **All** / **Assigned to Me** (I am a responder) / **My Teams** (in channels I belong to). Selecting **Responders** or **Channels** under **More Filters** resets the toggle to **All** and the manual filter wins; the toggle applies again once both filters are cleared |
| 2 | Time Filter | Supports relative time and custom range filtering |
| 3 | Severity | Filter incidents by severity |
| 4 | Processing Progress | Filter incidents by progress, defaults to **All** |
@@ -38,7 +38,7 @@ To improve performance, when search conditions match more than **1000** incident
### Using Aggregate View
-Aggregate view provides a different perspective for viewing incidents, where you can define different aggregation dimensions. The essence of aggregation dimensions is real-time Group By, such as viewing grouped by severity.
+Aggregate view groups incidents in real time by the dimensions you define (a live Group By), for example by severity.
@@ -57,14 +57,14 @@ To improve performance, in aggregate view, the system matches at most **100** re
### Using More Filters
-Flashduty On-call provides filtering capabilities across various dimensions with ample flexibility. Typical scenarios include:
+**More Filters** lets you combine many dimensions. Common uses:
- Search for incidents triggered by the "Host Down" alert policy based on `check` label
- Search for incidents marked as "false positive" based on the false alarm field
- Set **Unfinished actions / follow-ups** to **Yes** to surface incidents that still have open work to wrap up
-Flexibility often means lower performance, and Flashduty On-call is no exception, despite our many performance optimizations. We always recommend narrowing your query time range and using conditions like **Assigned to Me** and **Processing Progress** to reduce query scope.
+For faster queries, narrow the time range and use conditions such as **Assigned to Me** and **Processing Progress** to reduce the scope.
### Saving Filter Views
@@ -73,6 +73,7 @@ Flexibility often means lower performance, and Flashduty On-call is no exception
The **Saving Filter Views** feature is temporarily offline. The filter bar currently offers no entry point for saving, applying, or managing filter views. It will be restored in a future release — stay tuned.
+
You can save the current filter conditions on the filter bar as a named **filter view** and reapply it with one click later — ideal for frequently used search combinations:
- **Save a view**: After configuring your filter conditions, save them as a named view; names must be unique, and each user can save at most **10** views
@@ -82,6 +83,7 @@ You can save the current filter conditions on the filter bar as a named **filter
Filter views are saved per user and are only visible to you. A view saves all filter conditions except the **time range** — when you apply a view, the time range keeps your current selection.
+
### Row content
@@ -122,7 +124,7 @@ Click the **Settings** button in the upper right corner of the incident list to
## Incident Details
-Incident details is the main entry point for investigating incidents, displaying all available information. Especially on the incident overview page, Flashduty On-call centrally displays the information you need most.
+Incident details is the main entry point for investigating an incident and shows everything known about it; the default **Incident Overview** tab gathers what you need most often.
@@ -138,18 +140,49 @@ Incident details is the main entry point for investigating incidents, displaying
### Label Deep Links
-Incident labels are displayed in the **Details** area of the details page. When an incident is aggregated from alerts produced by a monitoring integration (`monit.alert`) or a RUM integration (`rum.alert`), certain label values are rendered as deep links, letting you jump straight to the rule or issue that generated the alert:
+Incident labels appear in the **Details** area of the details page. For incidents aggregated from Monitors or RUM alerts, some labels show a link:
-| Integration Type | Label Key | Link Behavior |
+| Alert source | Label | Link |
| :--- | :--- | :--- |
-| `rum.alert` | `issue_id` | A **View Issue** link is rendered next to the label value, jumping to the corresponding issue in RUM error tracking |
-| `monit.alert` | `rule_id` | A **View Rule** link is rendered next to the label value, jumping to the standalone alert rule that generated the alert |
-| `monit.alert` | `__alert_rule_id` | A **View Rule** link is rendered next to the label value, jumping to the standalone alert rule that generated the alert. New data prefers this label; historical data falls back to `rule_id` |
-| `monit.alert` | `__entity_alert_rule_id` | A **View Rule** link is rendered next to the label value, jumping to the edit view of the corresponding alert rule in the entity tree |
+| RUM | `issue_id` | **View Issue**: opens the RUM issue |
+| Monitors alert rule | `__alert_rule_id` (`rule_id` for older data) | **View Rule**: opens the alert rule that generated the alert |
+| Monitors entity tree | `__entity_alert_rule_id` | **View Rule**: opens the alert rule in the entity tree |
+
+If a label value is invalid or the needed context is missing, it is shown as plain text. Labels on the alert details page support the same links.
+
+If a label carries the query from when the alert fired (such as PromQL or a log expression), an **Explore** icon appears on the right of the label. Clicking it opens the Query Workbench in a new tab with that query and a time window around the alert's start time; with several queries, pick one from the list.
+
+### AI Summary
-Jumping to an entity-tree rule requires contextual labels such as `__entity_alert_account_id`, `__entity_alert_entity_definition_id`, `__entity_alert_data_source_id`, and `__entity_alert_policy_scope_group_id` for locating; when any required label is missing or invalid, the label value is shown as plain text. Standalone alert rules (`rule_id` / `__alert_rule_id`) likewise require a positive integer value (e.g. `123`); when the value is empty, `0`, or non-numeric, the label is shown as plain text to avoid generating an invalid link. This deep-link capability also applies to the label area of the alert details page.
+
+**Plan requirement**: This feature requires an On-call Pro or higher subscription. [Learn more](https://flashcat.cloud/flashduty/price/)
+
-Additionally, when a label carries query-type information (such as the PromQL / log expression that was active when the alert triggered), an **Explore** icon appears on the right side of the label row. Clicking it opens the Query Workbench in a new tab, pre-filled with the alert's triggering query and a time window set around the alert's start time. A single query links directly; multiple queries (primary + related) display a popover list for selection.
+Click the **AI Summary** button in the details area to generate a structured summary from the incident's associated alerts (up to 20):
+
+- **Summary**: A one-sentence description of what happened
+- **Impacts**: Key affected resources such as services, systems, environments, and instances
+- **Actions**: Immediately actionable investigation and remediation steps (up to 3)
+
+AI Summary is always generated with the DeepSeek V4 Pro (`deepseek-v4-pro`) model; the console does not offer a model selector. The generated summary supports real-time streaming output, can be regenerated, and can be saved as the incident description.
+
+
+AI Summary is only available for incidents automatically triggered by alerts. Manually created incidents do not support this feature.
+
+
+### Comprehensive Info Panel
+
+The comprehensive info panel on the right side of the incident details page consolidates auxiliary information around the incident. From top to bottom:
+
+| Section | Description |
+| :--- | :--- |
+| **Attributes** | Basic attributes such as channel, incident trigger time, and alert count |
+| **Images** | Displayed when alerts associated with the incident include image information reported via API. Click a thumbnail to preview, and hover to view the Alt description and source link |
+| **Key Timestamps** | A timeline view of key timestamps in the incident lifecycle, including **trigger time**, **first acknowledgment time**, **close time**, and reopen events, so you can quickly grasp incident progress |
+| **Responders** | Lists all responders (individuals or on-call personnel) assigned to the incident along with their acknowledgment status |
+| **Related Links** | Shortcut links preconfigured in the owning channel (such as dashboards, runbooks, knowledge bases). Parameters are dynamically rendered from the current incident's labels or fields, enabling one-click navigation to related systems. Link templates are maintained in channel settings |
+| **Custom Fields** | Displays and allows editing of the incident's custom field values; unset fields are shown as `-` |
+| **External Tickets** | If you have configured ticket integrations such as Jira, ServiceNow, or ServiceDesk Plus, external tickets created from this incident appear here and can be clicked to open in the external system |
### Detail Tabs
@@ -165,30 +198,6 @@ The incident details page contains 7 tabs; some appear only under certain condit
| **Post-Mortem** | A built-in post-mortem editor that lets you create, edit, AI-generate, and publish a post-mortem report without leaving the details page | Subject to subscription tier; always visible when enabled |
| **Past Incidents** | Shows historical incidents similar to the current one, so you can draw on prior handling experience | Always visible |
-### Action Item and Follow-Up Events
-
-Every operation on [action items and follow-ups](/en/on-call/incident/work-items) is written to the timeline as an iconized record, displayed alongside comments, acknowledgments, and other events. The supported event types are:
-
-| Event Type | Timeline Record |
-| :--- | :--- |
-| `i_wi_created` | Created action / Created follow-up |
-| `i_wi_updated` | Updated action / Updated follow-up |
-| `i_wi_assignees` | Updated action assignees / Updated follow-up assignees |
-| `i_wi_completed` | Completed action / Completed follow-up |
-| `i_wi_converted` | Converted action to follow-up |
-| `i_wi_bound` | Linked follow-up to the post-mortem |
-| `i_wi_auto_converted` | Converted N unfinished actions to follow-ups: title, title… (a batch conversion on incident close; one record summarizes all items) |
-| `i_wi_deleted` | Deleted action / Deleted follow-up |
-
-### AI SRE Action Records
-
-Actions that AI SRE performed on behalf of a member — for example when an [automation rule](/en/ai-sre/automations) finishes a run and writes its conclusion back to the incident — are recorded on the timeline under a **joint signature**: the byline reads `{{name}} and AI SRE`, and both names carry equal weight because AI SRE acts with that member's identity and permissions. Such records are flagged `via: ai_sre` on the backend.
-
-- **Signature hover card**: hovering the **AI SRE** part of the byline opens a hover card that states "Acting as `{{name}}` with their permissions" and offers a **Continue conversation** button, which opens that session in the AI SRE panel
-- **Always-visible entry**: every AI-performed action row also carries a persistent **Continue conversation** entry with a ↗ icon, so you can jump straight into the session without hovering; one incident can contain several AI sessions, so the entry sits on each row rather than being a single incident-level entry
-
-Both entries require the AI SRE module to be enabled and the current member to hold the `AiSreChatVisit` permission. When the session is a personal session (visible only to its creator) or has expired, the always-visible entry is not rendered and the hover card shows "This session is visible only to its creator or has expired" instead; when the row has no associated session, the hover card shows "This action is not linked to a session".
-
### Timeline Comments
The top of the Timeline tab provides a Markdown comment box that supports:
@@ -204,7 +213,7 @@ The top of the Timeline tab provides a Markdown comment box that supports:
-Posting a comment requires update permission on the incident. On the Timeline tab, the comment input box is always visible to all members, but only members with incident update permission see the **Send** button. On the incident overview page's "Recent Timeline" section, the **Leave Comment** button and the comment input box it opens are likewise visible only to members with update permission.
+Posting a comment requires update permission on the incident; members without it do not see the send controls.
### Comment Types
@@ -233,41 +242,28 @@ The operations and limits above (name up to **40** characters, 6 preset colors p
- Renaming, recoloring, deleting, and reordering must be done in the console
-### War Room Operations
+### Action Item and Follow-Up Events
-If a war room has been created for the incident (requires enabling [War Room](/en/on-call/advanced/war-room) in IM integration), the **More** menu on the action bar reveals two additional war-room management actions:
+Every operation on [action items and follow-ups](/en/on-call/incident/work-items) is written to the timeline as an iconized record, alongside comments, acknowledgments, and other events: create, update, change assignees, complete, delete, convert an action to a follow-up, and link a follow-up to the post-mortem. Unfinished actions converted automatically when the incident closes are summarized in one record.
-| Action | Description |
+
+| Event Type | Timeline Record |
| :--- | :--- |
-| **Invite Followers to War Room** | Pull additional members into the existing IM war room group for multi-party collaboration |
-| **Close War Room** | End the current war room and close the IM group. If collaboration is needed again later, you can create a new war room |
-
-
-War-room management actions are only visible when a war room already exists for the current incident; the create action is still initiated by the **Create War Room** button on the action bar.
-
-
-If the IM integration used by the war room is later disabled or deleted, **Invite Followers to War Room** and **Close War Room** both disappear (the original chat can no longer be operated on). The **View War Room** dialog then reads "The original integration is disabled or deleted. An administrator can unlink this war room without dissolving the group chat. Before creating another room, make sure the original group has been handled." and, for account owners/admins with incident update permission, offers a **Confirm unlink** button. That action only removes the link between the incident and the original group — it does **not** dissolve the chat — and the timeline records it as "Requested war room unlink".
-
-In the Flashduty App (mobile), war room behavior matches the console: the incident overview page shows a **War room** entry card (IM integrations with deep-link support open the chat directly; otherwise a dialog shows the group name to search for); **Create war room** lives in **More Actions** at the bottom, hidden when the incident already has a war room or is closed, and disabled with a toast when the incident has no responders; **Add stakeholders to war room** and **Dissolve war room** remain available after the incident is closed, but they do depend on the war room's IM integration being available — once it is disabled or deleted, both entries disappear from **More Actions**, while the overview entry card stays and shows "The integration is disabled or deleted. Ask an administrator to unlink the war room from the incident details on desktop. The original group chat will not be dissolved." on tap.
-
-### Post-Mortem
-
-The incident details page has a built-in post-mortem editor, allowing you to complete the entire post-mortem workflow without leaving the page. The action area includes a shortcut button that navigates directly to the **Post-Mortem** tab.
+| `i_wi_created` | Created action / Created follow-up |
+| `i_wi_updated` | Updated action / Updated follow-up |
+| `i_wi_assignees` | Updated action assignees / Updated follow-up assignees |
+| `i_wi_completed` | Completed action / Completed follow-up |
+| `i_wi_converted` | Converted action to follow-up |
+| `i_wi_bound` | Linked follow-up to the post-mortem |
+| `i_wi_auto_converted` | Converted N unfinished actions to follow-ups: title, title… (a batch conversion on incident close; one record summarizes all items) |
+| `i_wi_deleted` | Deleted action / Deleted follow-up |
+
-In the Post-Mortem tab, you can perform the following actions:
+### AI SRE Action Records
-| Action | Description |
-| :--- | :--- |
-| **Create** | Click the create button to start writing a post-mortem report |
-| **AI Generate** | Use AI to auto-generate initial post-mortem content, which you can then refine |
-| **Edit Title** | Modify the post-mortem report title to accurately reflect the incident |
-| **Edit Content** | Write and modify post-mortem content using the rich text editor |
-| **Publish** | Publish the post-mortem report to make it visible to the team |
-| **Re-edit** | Published post-mortem reports can be re-opened for editing |
-| **Delete** | Remove post-mortem reports that are no longer needed |
-| **Export Markdown** | Export the post-mortem report as Markdown for sharing or archiving on other platforms |
+Actions that AI SRE performed on behalf of a member (for example when an [automation rule](/en/ai-sre/automations) finishes a run and writes its conclusion back to the incident) are recorded on the timeline under the joint signature **`{{name}} and AI SRE`**, because AI SRE acts with that member's identity and permissions.
-See [Post-Mortem](/en/on-call/post-mortem/create-edit-post-mortem) for details.
+Each such row has a **Continue conversation** entry that opens the original session in the AI SRE panel (one incident can have several sessions). This requires AI SRE to be enabled for the account and permission to use AI SRE chat; personal sessions (visible only to their creator) and expired sessions cannot be continued.
### Change History
@@ -288,37 +284,28 @@ The change event list displays the following information:
You can adjust the query scope through the filter at the top, including time range and change source. Expand any row to view a timeline visualization of that change event, allowing comparison with the incident trigger time.
-### AI Summary
+### Post-Mortem
-The incident details page supports one-click AI summary generation to help you quickly understand the full picture of an incident. Click the **AI Summary** button in the details area, and the system will automatically generate a structured summary based on the incident's associated alerts (up to 20), including:
+The incident details page has a built-in post-mortem editor, and a shortcut button in the action area jumps straight to the **Post-Mortem** tab. There you can create a post-mortem, AI-generate a first draft, edit the title and rich-text content, publish, re-edit after publishing, delete, and export as Markdown.
-
-**Plan requirement**: This feature requires an On-call Pro or higher subscription. [Learn more](https://flashcat.cloud/flashduty/price/)
-
+See [Post-Mortem](/en/on-call/post-mortem/create-edit-post-mortem) for details.
-- **Summary**: A one-sentence description of what happened
-- **Impacts**: Key affected resources such as services, systems, environments, and instances
-- **Actions**: Immediately actionable investigation and remediation steps (up to 3)
+### War Room Operations
-AI Summary is always generated with the DeepSeek V4 Pro (`deepseek-v4-pro`) model; the console does not offer a model selector. The generated summary supports real-time streaming output, can be regenerated, and can be saved as the incident description.
+If a war room has been created for the incident (requires enabling [War Room](/en/on-call/advanced/war-room) in IM integration), the **More** menu on the action bar reveals two additional war-room management actions:
-
-AI Summary is only available for incidents automatically triggered by alerts. Manually created incidents do not support this feature.
-
+| Action | Description |
+| :--- | :--- |
+| **Invite Followers to War Room** | Pull additional members into the existing IM war room group for multi-party collaboration |
+| **Close War Room** | End the current war room and close the IM group. If collaboration is needed again later, you can create a new war room |
-### Comprehensive Info Panel
+
+War-room management actions are only visible when a war room already exists for the current incident; the create action is still initiated by the **Create War Room** button on the action bar.
+
-The comprehensive info panel on the right side of the incident details page consolidates auxiliary information around the incident. From top to bottom:
+If the war room's IM integration is disabled or deleted, **Invite Followers to War Room** and **Close War Room** are no longer shown. Account owners or admins with incident update permission can click **Confirm unlink** in **View War Room**: this only removes the link between the incident and the original group, does **not** dissolve the chat, and is recorded on the timeline.
-| Section | Description |
-| :--- | :--- |
-| **Attributes** | Basic attributes such as channel, incident trigger time, and alert count |
-| **Images** | Displayed when alerts associated with the incident include image information reported via API. Click a thumbnail to preview, and hover to view the Alt description and source link |
-| **Key Timestamps** | A timeline view of key timestamps in the incident lifecycle, including **trigger time**, **first acknowledgment time**, **close time**, and reopen events, so you can quickly grasp incident progress |
-| **Responders** | Lists all responders (individuals or on-call personnel) assigned to the incident along with their acknowledgment status |
-| **Related Links** | Shortcut links preconfigured in the owning channel (such as dashboards, runbooks, knowledge bases). Parameters are dynamically rendered from the current incident's labels or fields, enabling one-click navigation to related systems. Link templates are maintained in channel settings |
-| **Custom Fields** | Displays and allows editing of the incident's custom field values; unset fields are shown as `-` |
-| **External Tickets** | If you have configured ticket integrations such as Jira, ServiceNow, or ServiceDesk Plus, external tickets created from this incident appear here and can be clicked to open in the external system |
+War room actions in the Flashduty App (mobile) match the console; see [War Room · Mobile App](/en/on-call/advanced/war-room#mobile-app).
## FAQ
diff --git a/en/on-call/incident/work-items.mdx b/en/on-call/incident/work-items.mdx
index 34e262dd..94e304b7 100644
--- a/en/on-call/incident/work-items.mdx
+++ b/en/on-call/incident/work-items.mdx
@@ -85,8 +85,8 @@ In addition, reading and writing action items are constrained by the incident's
Once an incident is closed, the Actions card becomes read-only while the Follow-ups card unlocks for editing:
-- **Actions**: You cannot create, edit, or delete action items, nor change their status (the UI hides the add button and action entries, and the backend also rejects creating action items for closed incidents). At the moment of closing, the system already converted unfinished action items into follow-ups, so this card normally keeps only items that were completed or marked as won't do
-- **Follow-ups**: You can add, edit, complete, or delete follow-ups directly under the incident without creating a post-mortem report first; if the incident already has one, the backend back-fills the post-mortem link on newly created follow-ups
+- **Actions**: You cannot create, edit, or delete action items, nor change their status (the UI hides the add button and action entries, and creating action items for closed incidents through the API is rejected as well). At the moment of closing, the system already converted unfinished action items into follow-ups, so this card normally keeps only items that were completed or marked as won't do
+- **Follow-ups**: You can add, edit, complete, or delete follow-ups directly under the incident without creating a post-mortem report first; if the incident already has one, the post-mortem link is filled in automatically on newly created follow-ups
- There is no need to clear unfinished action items before closing an incident; if you want a piece of work to stay an action item, mark it **Completed** or **Won't do** before closing, otherwise it will be converted into a follow-up on close
## Further Reading
diff --git a/en/on-call/integration/alert-integration/alert-pipelines.mdx b/en/on-call/integration/alert-integration/alert-pipelines.mdx
index ea7a849b..81b65530 100644
--- a/en/on-call/integration/alert-integration/alert-pipelines.mdx
+++ b/en/on-call/integration/alert-integration/alert-pipelines.mdx
@@ -50,7 +50,7 @@ Pipeline sits between **Label Enhancement** and **Route Distribution**. Its exec
## Configuration Entry
-Go to **Integration Center** => Select created integration => **Alert Processing** tab.
+Go to **Integration Center** → Select created integration → **Alert Processing** tab.
diff --git a/en/on-call/integration/alert-integration/alert-sources/aikido.mdx b/en/on-call/integration/alert-integration/alert-sources/aikido.mdx
index b40e3c4f..a3c57735 100644
--- a/en/on-call/integration/alert-integration/alert-sources/aikido.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/aikido.mdx
@@ -1,5 +1,6 @@
---
title: "Aikido Security alert integration"
+sidebarTitle: "Aikido Security"
description: "Send Aikido issue creation, severity change, and closure events to Flashduty On-call through a webhook."
keywords: ["alert integration", "Aikido", "Aikido Security", "webhook", "vulnerability", "issue_id"]
---
@@ -9,7 +10,6 @@ Use an Aikido Security webhook to send security issues to Flashduty On-call. Eac
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure in Aikido
----
@@ -65,12 +64,10 @@ Let Aikido raise a new issue and confirm the alert reaches Flashduty. Then close
## Alert Key
----
Flashduty uses `payload.issue_id` as the Alert Key. Aikido's documentation defines it as the ID of the issue, and every event for the same issue carries it. Changes to severity, status, or event type do not change the Alert Key. An issue event without `payload.issue_id` is rejected, because later updates and recovery could not be matched to the alert.
## Status and severity
----
| Aikido `event_type` | Flashduty handling |
| :--- | :--- |
@@ -94,7 +91,6 @@ Flashduty uses `payload.issue_id` as the Alert Key. Aikido's documentation defin
The Aikido payload has no title field, so the alert title looks like `Aikido open_source issue #123 (critical)`. The issue type (`open_source`, `leaked_secret`, `cloud`, `iac`, `sast`, `surface_monitoring`, `malware`), `severity_score`, and `workspace_id` are stored as alert labels.
## Troubleshooting
----
- **Aikido gets a non-200 response and retries**: Aikido retries 5 times on a non-200 response or a timeout. Confirm the push URL is complete and includes `integration_key`
- **Flashduty returns a parameter error**: confirm the body is valid JSON and issue events carry `payload.issue_id`
diff --git a/en/on-call/integration/alert-integration/alert-sources/airbrake.mdx b/en/on-call/integration/alert-integration/alert-sources/airbrake.mdx
index b8b1d117..62a9c335 100644
--- a/en/on-call/integration/alert-integration/alert-sources/airbrake.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/airbrake.mdx
@@ -1,5 +1,6 @@
---
title: "Airbrake alert integration"
+sidebarTitle: "Airbrake"
description: "Send error notifications from an Airbrake project to Flashduty On-call through a webhook."
keywords: ["alert integration", "Airbrake", "webhook", "error monitoring", "exception monitoring"]
---
@@ -9,7 +10,6 @@ Use the Webhook integration of an Airbrake project to send error notifications t
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Airbrake
----
@@ -60,17 +59,14 @@ Airbrake's documentation does not describe a test notification body, so Flashdut
## Alert Key
----
Flashduty computes the Alert Key from `error.id` (the Airbrake error ID) in the webhook body. Every notification for the same error uses the same Alert Key, and changes to the error message, occurrence count, environment, or last occurrence time do not change it. A notification without `error.id` is rejected.
## Severity
----
The Airbrake webhook carries no severity. Every notification is a Warning trigger.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -84,7 +80,6 @@ The Airbrake webhook carries no severity. Every notification is a Warning trigge
| `url` | Link to the error in Airbrake (`airbrake_error_url`) |
## Troubleshooting
----
- **Flashduty returns an invalid-parameter error**: confirm the URL is complete and includes `integration_key`
- **Alerts do not recover**: Airbrake sends no recovery notification; turn on the channel's auto-close or close alerts manually
diff --git a/en/on-call/integration/alert-integration/alert-sources/alertsite.mdx b/en/on-call/integration/alert-integration/alert-sources/alertsite.mdx
index 9e54feb3..041e0c43 100644
--- a/en/on-call/integration/alert-integration/alert-sources/alertsite.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/alertsite.mdx
@@ -1,5 +1,6 @@
---
title: "SmartBear AlertSite alert integration"
+sidebarTitle: "SmartBear AlertSite"
description: "Send SmartBear AlertSite availability and performance alerts to Flashduty On-call through JSON alerts."
keywords: ["alert integration", "AlertSite", "SmartBear", "synthetic monitoring", "uptime", "webhook"]
---
@@ -9,7 +10,6 @@ Use AlertSite JSON alerts (POST JSON request to web server) to send monitor avai
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure AlertSite
----
@@ -68,14 +67,12 @@ Use the default JSON alert template. This integration reads the field names of t
## Alert Key
----
Flashduty computes the Alert Key from the alert type (availability or performance) and `device_id`. The AlertSite docs note that monitor names can change and recommend `device_id` as the identifier. The error and clear alerts of a monitor carry the same `device_id`, so they land on the same alert.
Availability alerts (`error` / `clear`) and performance alerts (`perf_warning` / `perf_error` / `perf_clear`) are keyed separately: a performance clear does not close an availability alert that is still failing. Changes to the monitor name, failing location, failing step, status code, time, or response time do not change the Alert Key. Flashduty rejects a request without `device_id`, because the later recovery could not be matched.
## Status and severity
----
| AlertSite `notify_type` | Flashduty status | Flashduty severity |
| :--- | :--- | :--- |
@@ -89,14 +86,12 @@ Availability alerts (`error` / `clear`) and performance alerts (`perf_warning` /
An empty or other `notify_type` is rejected, so a request whose state cannot be determined never lands in the wrong alert lifecycle.
## Alert content
----
- **Title**: the monitor name `device_name`
- **Description**: status text, failing location, URL, HTTP status, failing step, check time; the status of each location for rotated locations (`rotated_locations`); the response time and threshold of each location for performance alerts (`locations`)
- **Labels**: `device_id`, `device_type`, `custid`, `notify_type`, `alert_type` (`availability` or `performance`), `status_code` (the AlertSite status code, `0` means OK), `status_text`, `location`, `location_num`, `http_status`, `check` (monitor name), `resource` (the monitored URL), and `source` (always `alertsite`)
## Troubleshooting
----
- **AlertSite delivery fails**: make sure **Recipient** holds the full push URL, including `https://` and `integration_key`
- **Flashduty returns a parameter error**: make sure the default template is used and the request has `notify_type` and `device_id`
diff --git a/en/on-call/integration/alert-integration/alert-sources/aliyun-arms.mdx b/en/on-call/integration/alert-integration/alert-sources/aliyun-arms.mdx
index fce1e1ed..93c5b7ec 100644
--- a/en/on-call/integration/alert-integration/alert-sources/aliyun-arms.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/aliyun-arms.mdx
@@ -1,5 +1,6 @@
---
title: "Alibaba Cloud ARMS Integration"
+sidebarTitle: "Alibaba Cloud ARMS"
description: "Sync Alibaba Cloud ARMS monitoring alerts to Flashduty via webhook for automated alert noise reduction"
---
@@ -8,42 +9,42 @@ Sync Alibaba Cloud ARMS monitoring alerts to Flashduty via webhook for automated
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this method when you don't need to route alerts to different channels. It's simpler and recommended.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a specific channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Alibaba Cloud ARMS** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this method when you need to route alerts to different channels based on the alert payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alerts** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alerts** to enter the integration selection page
2. Select **Alibaba Cloud ARMS** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
-## In Alibaba Cloud ARMS
----
+## In Alibaba Cloud ARMS
**Step 1: Configure Notification Target**
@@ -69,7 +70,6 @@ Choose this method when you need to route alerts to different channels based on
## Status Mapping
----
Alibaba Cloud ARMS monitoring to Flashduty alert severity mapping:
diff --git a/en/on-call/integration/alert-integration/alert-sources/aliyun-cm-event.mdx b/en/on-call/integration/alert-integration/alert-sources/aliyun-cm-event.mdx
index db160711..aac2eba0 100644
--- a/en/on-call/integration/alert-integration/alert-sources/aliyun-cm-event.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/aliyun-cm-event.mdx
@@ -1,5 +1,6 @@
---
title: "Alibaba Cloud Monitor CM Event Integration"
+sidebarTitle: "Alibaba Cloud Monitor CM Event"
description: "Sync Alibaba Cloud Monitor event center alerts to Flashduty via webhook for automated alert noise reduction"
---
@@ -8,48 +9,48 @@ Sync Alibaba Cloud Monitor event center alerts to Flashduty via webhook for auto
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this simpler method when you don't need to route alerts to different channels.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Alibaba Cloud CM Event** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this method when you need to route alerts to different channels based on the alert payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alerts** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alerts** to enter the integration selection page
2. Select **Alibaba Cloud CM Event** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In Alibaba Cloud Monitor CM Event
----
**Step 1: Add Push Channel**
1. Log in to your Alibaba Cloud Console and select Cloud Monitor
-2. Go to **Event Center -> Event Subscription** page, switch to the **Push Channels** tab, click Create Push Channel button to start editing
+2. Go to **Event Center → Event Subscription** page, switch to the **Push Channels** tab, click Create Push Channel button to start editing
3. As shown, select **POST** as the **Request Method**, and fill in the integration push URL in the **Address** field
4. Click Confirm button to submit the update
@@ -62,7 +63,7 @@ Choose this method when you need to route alerts to different channels based on
1. Log in to your Alibaba Cloud Console and select Cloud Monitor
-2. Go to **Event Center -> Event Subscription** page, switch to the **Subscription Policies** tab, click Create Subscription Policy button to start editing
+2. Go to **Event Center → Event Subscription** page, switch to the **Subscription Policies** tab, click Create Subscription Policy button to start editing
3. Fill in the subscription name, select event type and scope, and configure the push channel as the Flashduty channel created earlier at the bottom
4. Click Confirm button to submit the update
5. The image below shows subscription results for both threshold and system event types
@@ -72,7 +73,6 @@ Choose this method when you need to route alerts to different channels based on
## Status Mapping
----
Alibaba Cloud Monitor event alert to Flashduty severity level mapping:
diff --git a/en/on-call/integration/alert-integration/alert-sources/aliyun-cm-metrics.mdx b/en/on-call/integration/alert-integration/alert-sources/aliyun-cm-metrics.mdx
index 25c67ad9..3813abda 100644
--- a/en/on-call/integration/alert-integration/alert-sources/aliyun-cm-metrics.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/aliyun-cm-metrics.mdx
@@ -1,5 +1,6 @@
---
title: "Alibaba Cloud Monitor CM Metrics Integration"
+sidebarTitle: "Alibaba Cloud Monitor CM Metrics"
description: "Sync Alibaba Cloud Monitor alert events to Flashduty via webhook for automated alert noise reduction"
---
@@ -8,42 +9,42 @@ Sync Alibaba Cloud Monitor alert events to Flashduty via webhook for automated a
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this simpler option when you don't need to route alert events to different channels.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a specific channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Alibaba Cloud CM Metrics** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Alibaba Cloud CM Metrics** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In Alibaba Cloud Monitor
----
Choose one of the following two methods:
**Method 1: Rule-based Configuration**
@@ -51,11 +52,11 @@ Choose one of the following two methods:
1. Log in to your Alibaba Cloud Console and select Cloud Monitor
-2. Go to Alert Service -> Alert Rules page, select a rule, and click the Modify button to edit the rule content
+2. Go to Alert Service → Alert Rules page, select a rule, and click the Modify button to edit the rule content
3. As shown in the image, under Advanced Settings, enter the integration push URL as the callback address
4. Click Confirm to submit the update
-
+
5. Repeat these steps for all alert rules you want to sync
6. Return to the integration list; if the latest event time is displayed, the configuration is successful and events are being received
@@ -68,11 +69,11 @@ Choose one of the following two methods:
1. Log in to your Alibaba Cloud Console and select Cloud Monitor
-2. Go to Alert Service -> Alert Contacts page and select a contact to modify
+2. Go to Alert Service → Alert Contacts page and select a contact to modify
3. As shown in the image, enter the integration push URL under Webhook
4. Click Confirm to submit the update
-
+
5. Repeat these steps for all contacts you want to sync events for
6. Return to the integration list; if the latest event time is displayed, the configuration is successful and events are being received
@@ -81,7 +82,6 @@ Choose one of the following two methods:
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following two ways.
### Use an exclusive integration
@@ -16,7 +16,7 @@ You can obtain an integration push URL in either of the following two ways.
Choose this option when you do not need to route alert events to different collaboration spaces. It is simpler.
-
+
1. Go to the Flashduty console, select **Collaboration Spaces**, and open a space's detail page
2. Select the **Integrated Data** tab, click **Add an integration**, and open the add-integration page
@@ -32,9 +32,9 @@ Choose this option when you do not need to route alert events to different colla
Choose this option when you need to route alerts to different collaboration spaces based on the alert payload.
-
+
- 1. Go to the Flashduty console and select **Integration Center => Alert Events** to open the integration selection page
+ 1. Go to the Flashduty console and select **Integration Center → Alert Events** to open the integration selection page
2. Select the **Alibaba Cloud DataWorks Operation Center** integration:
- **Integration name**: define a name for this integration
3. Configure the default route and select the corresponding collaboration space (after creation, you can go to `Routing` to configure more routing rules)
@@ -46,7 +46,6 @@ Choose this option when you need to route alerts to different collaboration spac
## In Alibaba Cloud DataWorks
----
**Step 1: Create a custom webhook**
@@ -70,7 +69,6 @@ Choose this option when you need to route alerts to different collaboration spac
## Supported alert types
----
DataWorks Intelligent Monitoring wraps every custom webhook message in a `message` field, distinguished by `message.title`. This integration supports the following three alert families:
@@ -86,7 +84,6 @@ The connectivity test message (`message.content`) is used only to verify the pus
## Severity mapping
----
Mapping from custom alert `remind_type` to Flashduty severity:
@@ -122,7 +119,6 @@ Mapping from event alert `event_type`:
## Alert Key and alert merging
----
DataWorks Intelligent Monitoring webhooks are **one-shot events**: the official protocol defines alert notifications only, with **no recovery** or update semantics, and it provides no vendor-level deduplication ID or fingerprint field. Therefore this integration never automatically recovers (closes) any alert; every event is delivered in a triggered state.
@@ -132,7 +128,6 @@ Every webhook delivery receives a fresh random UUID as its Alert Key, so each pu
## Field label mapping
----
Key fields from the push message are preserved as labels on the alert event and can be used for routing, silencing, and template rendering:
@@ -156,7 +151,6 @@ Key fields from the push message are preserved as labels on the alert event and
## In Flashduty On-call
----
You can obtain an integration push URL through either of these two methods:
### Using private integration
@@ -15,7 +15,7 @@ You can obtain an integration push URL through either of these two methods:
Choose this method when you don't need to route alert events to different channels — it's simpler.
-
+
1. Go to the Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
@@ -30,9 +30,9 @@ Choose this method when you don't need to route alert events to different channe
Choose this method when you need to route alerts to different channels based on the alert event payload.
-
+
- 1. Go to the Flashduty console, select **Integration Center => Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Alibaba Cloud Monitor Prometheus** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after creation, go to `Route` to configure more routing rules)
@@ -43,7 +43,6 @@ Choose this method when you need to route alerts to different channels based on
## In Alibaba Cloud
----
@@ -74,7 +73,6 @@ Go back to the Flashduty console integration list page. If the latest event time
## Severity mapping
----
Alibaba Cloud Prometheus to Flashduty severity mapping:
diff --git a/en/on-call/integration/alert-integration/alert-sources/aliyun-sls.mdx b/en/on-call/integration/alert-integration/alert-sources/aliyun-sls.mdx
index d09acace..fd270cb8 100644
--- a/en/on-call/integration/alert-integration/alert-sources/aliyun-sls.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/aliyun-sls.mdx
@@ -1,5 +1,6 @@
---
title: "Alibaba Cloud SLS Integration"
+sidebarTitle: "Alibaba Cloud SLS"
description: "Sync Alibaba Cloud Log Service (SLS) monitoring alert events to Flashduty via webhook for automated alert noise reduction"
---
@@ -8,42 +9,42 @@ Sync Alibaba Cloud Log Service (SLS) monitoring alert events to Flashduty via we
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this simpler option when you don't need to route alerts to different channels.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a specific channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Alibaba Cloud SLS** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alerts** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alerts** to enter the integration selection page
2. Select **Alibaba Cloud SLS** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In Alibaba Cloud SLS
----
**Step 1: Configure Webhook**
@@ -51,11 +52,11 @@ Choose this option when you need to route alerts to different channels based on
1. Log in to your Alibaba Cloud Console, select Log Service (SLS), and choose a Project
2. Navigate to `Alert`->`Alert Management`->`Webhook Integration` page, click the `Create` button to start editing
-
+
3. As shown, select "Generic Webhook" for `Type`, choose POST for `Request Method`, and enter the integration push URL (obtained after saving) for `Request URL`
-
+
4. Click the `Confirm` button to save
@@ -68,11 +69,11 @@ Choose this option when you need to route alerts to different channels based on
1. Switch to the `Content Template` page and click the `Add` button to start editing
2. Enter the `Webhook-Custom` configuration, select "Send Individually" for `Send Method`, and copy the following content for `Send Content`:
-```
-{{ alert | to_json}}
-```
+ ```
+ {{ alert | to_json}}
+ ```
-
+
3. Click the `Confirm` button to save
@@ -86,7 +87,7 @@ Choose this option when you need to route alerts to different channels based on
2. Enter the `First Action List` configuration and click to add an `Action Group` node
3. Select "Generic Webhook" for `Channel`, use previously created objects for `Select Webhook` and `Content Template`, and choose "Any" for `Send Period`
-
+
4. Click `Finish` to complete the first action list creation
5. Click the `Confirm` button to save
@@ -101,7 +102,7 @@ Choose this option when you need to route alerts to different channels based on
2. Enter the `Alert Rule` editing page, `Alert Policy`
3. Select "Normal Mode" for `Alert Policy` and use the previously created object for `Action Policy`
-
+
4. Click the `Confirm` button to save
5. Repeat these steps for all other rules to push all alerts to Flashduty
@@ -109,7 +110,6 @@ Choose this option when you need to route alerts to different channels based on
ActionTrail's "event alert" feature is provided by Log Service (SLS), not a separate push channel: first create a trail that delivers events to a Logstore, then configure an SLS alert on that Logstore. The notification channel reuses the webhook integration steps above — no separate integration is needed for ActionTrail.
diff --git a/en/on-call/integration/alert-integration/alert-sources/amazon-inspector.mdx b/en/on-call/integration/alert-integration/alert-sources/amazon-inspector.mdx
index a81373fb..6d3dea28 100644
--- a/en/on-call/integration/alert-integration/alert-sources/amazon-inspector.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/amazon-inspector.mdx
@@ -1,5 +1,6 @@
---
title: "Amazon Inspector Alert Integration"
+sidebarTitle: "Amazon Inspector"
description: "Send Amazon Inspector vulnerability and network reachability findings to Flashduty's AWS EventBridge integration through an EventBridge rule; alerts recover when a finding is closed or suppressed."
keywords: ["alert integration", "Amazon Inspector", "Inspector2", "vulnerability scanning", "EventBridge", "AWS"]
---
@@ -9,7 +10,6 @@ Amazon Inspector sends an **Inspector2 Finding** event to Amazon EventBridge whe
## In Flashduty On-call
----
Get an integration push URL in either of the two ways below. **Choose the AWS EventBridge integration type** in both, not Amazon Inspector.
@@ -30,7 +30,6 @@ Get an integration push URL in either of the two ways below. **Choose the AWS Ev
## Configure in AWS
----
Inspector emits events to the default event bus of each Region where it is enabled, so create the rule in every such Region.
@@ -67,7 +66,6 @@ Do not add `"status": ["ACTIVE"]` to the pattern. The notification example in th
Other Inspector events (`Inspector2 Scan`, `Inspector2 Coverage`, `Inspector2 AutoEnable`) are not findings and should not be forwarded to Flashduty; the `detail-type` above already excludes them.
## Field mapping
----
The mapping below is how Flashduty processes these AWS EventBridge events:
@@ -83,7 +81,6 @@ The mapping below is how Flashduty processes these AWS EventBridge events:
| Event `source`, `region`, `account`, `detail-type`, `detail`, `resources` | Labels `source`, `region`, `account`, `check`, `detail`, `resources` |
## Recovery and deduplication
----
- Inspector sends another event for the same `findingArn` when a vulnerability is fixed or a finding changes state. When `status` is `CLOSED` (fixed) or `SUPPRESSED`, Flashduty closes the alert.
- If the account is an Inspector delegated administrator, findings of member accounts are also delivered to it; use the label `aws_account_id` to tell the source account.
@@ -91,7 +88,6 @@ The mapping below is how Flashduty processes these AWS EventBridge events:
- The `detail` of code vulnerability findings contains file paths and detector names, which end up in the alert through the `detail` label.
## Troubleshooting
----
- **The API destination call fails**: confirm the endpoint is the full push URL including `integration_key` and that `HTTP method` is `POST`
- **Alerts do not recover**: check whether the rule's event pattern filters on `status`, and whether the target has an Input transformer (the full event must be sent)
diff --git a/en/on-call/integration/alert-integration/alert-sources/apcupsd.mdx b/en/on-call/integration/alert-integration/alert-sources/apcupsd.mdx
index ae31e583..0850d314 100644
--- a/en/on-call/integration/alert-integration/alert-sources/apcupsd.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/apcupsd.mdx
@@ -1,5 +1,6 @@
---
title: "apcupsd Alert Integration"
+sidebarTitle: "apcupsd"
description: "Push APC UPS on-battery, battery-failure and communication-loss events to the Flashduty Standard Alert Event integration through apcupsd event scripts; recovery events close the alerts."
keywords: ["alert integration", "apcupsd", "APC UPS", "UPS", "power outage", "apccontrol", "standard alert event"]
---
@@ -9,7 +10,6 @@ When apcupsd detects a UPS state change it calls `apccontrol`, which runs the ex
## In Flashduty On-call
----
Get an integration push URL in either of the two ways below. **Choose the Standard Alert Event integration type** in both, not apcupsd.
@@ -30,7 +30,6 @@ Get an integration push URL in either of the two ways below. **Choose the Standa
## Configure in apcupsd
----
### Step 1: Create the push script
@@ -114,7 +113,6 @@ Run the event scripts by hand on the host, first a trigger and then a recovery:
In Flashduty you should first see the alert `UPS myups: on battery` and then see it recover. Running `onbattery` by hand also runs whatever else the event file already contains; to test only the push, run `/etc/apcupsd/flashduty-notify.sh onbattery myups` directly.
## Recovery and deduplication
----
- `onbattery`, the failure events (`failing`, `timeout`, `loadlimit`, `runlimit`), `offbattery` and `mainsback` share the Alert Key `apcupsd::power`: `onbattery` triggers the alert, a following failure event raises it to Critical, and it recovers when utility power returns
- `commfailure` and `commok`, and `battdetach` and `battattach`, are paired
@@ -122,7 +120,6 @@ In Flashduty you should first see the alert `UPS myups: on battery` and then see
- Alerts of several UPS units do not affect each other: the Alert Key contains the UPS name (the name configured in `apcupsd.conf`)
## Troubleshooting
----
- **No alert arrives**: confirm the file named after the event exists in `/etc/apcupsd` and is executable, and that `URL` in `flashduty-notify.sh` is correct; run the event file by hand and check the output
- **The alert does not recover**: confirm the recovery events (`offbattery`, `mainsback`, `commok`, `battattach`) are hooked too
diff --git a/en/on-call/integration/alert-integration/alert-sources/apimetrics.mdx b/en/on-call/integration/alert-integration/alert-sources/apimetrics.mdx
index 3c425cde..1ae3a79c 100644
--- a/en/on-call/integration/alert-integration/alert-sources/apimetrics.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/apimetrics.mdx
@@ -1,5 +1,6 @@
---
title: "APIContext (APImetrics) alert integration"
+sidebarTitle: "APIContext (APImetrics)"
description: "Send failed, warning, slow and recovered API call results from the APIContext (formerly APImetrics) Performance Results Webhook to Flashduty On-call."
keywords: ["alert integration", "APIContext", "APImetrics", "API monitoring", "webhook", "call_id", "result_class"]
---
@@ -9,7 +10,6 @@ Use the APIContext (formerly APImetrics) Performance Results Webhook to send API
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure APIContext
----
@@ -65,7 +64,6 @@ With **Pass** on, every successful call sends a request to Flashduty. A `PASS` w
## Payload
----
APIContext sends JSON with an HTTP POST, one request per call result; no template is needed. Flashduty uses these fields:
@@ -86,14 +84,12 @@ APIContext sends JSON with an HTTP POST, one request per call result; no templat
The alert title is "call name: result", for example `Orders API: HTTP_SERVER_ERROR`.
## Alert Key
----
The Alert Key is computed from `call_id`, so each API call has one alert. The APIContext documentation describes `call_id` as a static ID that is the same every time the call is made, so the failure and the recovery of one call land on the same alert, whichever probe location reports them. With the default schedule each run executes from one random location, so a `PASS` from any location closes the call's alert and the next failure reopens it. `location_id` is kept as a label and in the description.
Changing the call name, result detail, response time or HTTP status code does not change the Alert Key. When a request has no `call_id`, Flashduty returns a parameter error because it cannot reliably match a recovery to its alert. A request with no `call_id`, `result_id` and `result_class` (such as an empty object) is treated as a test request: it returns success and creates no alert.
## Status and severity
----
| `result_class` | Flashduty status or severity |
| :--- | :--- |
@@ -106,7 +102,6 @@ Changing the call name, result detail, response time or HTTP status code does no
`SLOW` means the call succeeded but responded slowly. Flashduty records it as Warning and does not close an existing failure alert. To change a severity, rewrite it with a rule under the channel's **Configuration**.
## FAQ
----
@@ -129,7 +124,6 @@ No. The Alert Key of a call does not change, so repeated failure results merge i
## Troubleshooting
----
- **APIContext does not receive a success response**: confirm the URL is the full push URL and includes `integration_key`
- **Flashduty returns a parameter error**: the request body has no `call_id`. Confirm that you use the Generic webhook rather than an OpenTelemetry or other export type
diff --git a/en/on-call/integration/alert-integration/alert-sources/appdynamics.mdx b/en/on-call/integration/alert-integration/alert-sources/appdynamics.mdx
index a0007de4..4a7ce047 100644
--- a/en/on-call/integration/alert-integration/alert-sources/appdynamics.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/appdynamics.mdx
@@ -1,5 +1,6 @@
---
title: "AppDynamics Alert Integration"
+sidebarTitle: "AppDynamics"
description: "Sync AppDynamics alerts to Flashduty via webhook for automated alert noise reduction"
---
@@ -8,58 +9,57 @@ Sync AppDynamics alerts to Flashduty via webhook for automated alert noise reduc
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this method when you don't need to route alerts to different channels. It's simpler.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration**, and enter the integration page
3. Choose **AppDynamics** integration and click **Save** to generate a card
4. Click the generated card to view the **Push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this method when you need to route alerts to different channels based on the alert payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alerts**, and enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alerts**, and enter the integration selection page
2. Select **AppDynamics** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In AppDynamics
----
-## I. AppDynamics Alert Push Configuration
### Step 1: Configure Flashduty Alert Channel
1. Log in to your AppDynamics console
2. Find `Alert Respond`, select `HTTP Request Templates`, and click `New` to create an alert channel
-
+
3. In the template configuration, enter **Flashduty** as the `Name`
4. In the `Request URL` section, select **POST** as the `Method`, and enter the integration push URL in `Raw URL` (enter the integration name on this page, and the URL will be generated after saving)
-
+
5. In the `Payload` section, select `application/json` as `MIME Type` and `UTF-8` as `Payload Encoding`
6. Paste the following content in the `Payload` text box:
@@ -118,7 +118,7 @@ If you need to configure `Custom Templating Variables`, you can refer to the fol
7. In the `Response Handling Criteria` section, set the `Failure Criteria` status code to 400 and the `Success Criteria` status code to 201
-
+
8. Click `Save` to complete
@@ -127,7 +127,7 @@ If you need to configure `Custom Templating Variables`, you can refer to the fol
1. Select `Actions` in the left navigation bar, choose the application type you want to create for, and click `Create`
2. In the `Create Action` popup, select `Make an HTTP Request` and click `OK`
-
+
3. In the `Create HTTP Action` popup, enter a Name, select **Flashduty** created in `Step 1` as the `HTTP Request Template`, and click `SAVE`
@@ -139,13 +139,13 @@ If you need to configure `Custom Templating Variables`, you can refer to the fol
2. Create or edit existing policies (configure alert rules as needed, alert rule configuration is omitted here)
3. In the `Actions` section of the policy configuration page, click add and select the Action created in `Step 2`
-
+
4. After completing other configurations, click `Save` to finish
-## II. Status Mapping
+## Status Mapping
diff --git a/en/on-call/integration/alert-integration/alert-sources/appsignal.mdx b/en/on-call/integration/alert-integration/alert-sources/appsignal.mdx
index 0be8db83..4bcb4b45 100644
--- a/en/on-call/integration/alert-integration/alert-sources/appsignal.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/appsignal.mdx
@@ -1,5 +1,6 @@
---
title: "AppSignal alert integration"
+sidebarTitle: "AppSignal"
description: "Send AppSignal exception incidents, performance incidents, and anomaly detection alerts to Flashduty On-call through a webhook notifier."
keywords: ["alert integration", "AppSignal", "webhook", "APM", "anomaly detection", "error monitoring"]
---
@@ -13,7 +14,6 @@ Use the AppSignal Webhook notifier to send exception incidents, performance inci
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -34,7 +34,6 @@ You can obtain an integration push URL in either of the following ways.
## In AppSignal
----
@@ -69,7 +68,6 @@ The AppSignal documentation does not describe a test button for the Webhook noti
## Events and recovery
----
| AppSignal payload | When it is sent | Effect in Flashduty |
| :--- | :--- | :--- |
@@ -82,7 +80,6 @@ The AppSignal documentation does not describe a test button for the Webhook noti
AppSignal notifies webhooks only on two anomaly detection transitions, opened and resolved. The warming up and cooldown phases send nothing.
## Alert Key
----
Flashduty builds the Alert Key from the object the event is about, so every delivery for one object shares one Alert Key:
@@ -94,17 +91,14 @@ Flashduty builds the Alert Key from the object the event is about, so every deli
Exception and performance incidents share one incident numbering. The Alert Key is computed from the object type and the fields above, so changes to the trigger name, current value, time, exception message, or revision do not change it. A delivery missing one of these fields is rejected, and the error names the field.
## Severity
----
AppSignal payloads carry no severity, so every alert is Warning in Flashduty, and a recovery moves it to recovered. To distinguish severity, use labels in the integration's routing or alert processing rules.
## Incidents do not recover
----
AppSignal sends no recovery for exception and performance incidents. In the channel that receives this integration, turn on the [auto-resolve timeout](/en/on-call/channel/create-edit). 24 hours is a reasonable start; adjust it to how quickly your team handles exceptions. A repeat occurrence of the same incident updates the same alert; once the alert is closed, the next occurrence creates a new one.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -123,7 +117,6 @@ AppSignal sends no recovery for exception and performance incidents. In the chan
| `url` | Link to the alert or incident in AppSignal |
## Troubleshooting
----
- **Flashduty returns an invalid parameter error**: confirm the URL is complete and includes `integration_key`
- **Nothing arrives**: confirm the Webhook notifier is selected on the trigger (alerts) or in the app's notification settings (incidents), and that the payload types are selected
diff --git a/en/on-call/integration/alert-integration/alert-sources/argocd.mdx b/en/on-call/integration/alert-integration/alert-sources/argocd.mdx
index 8412f226..29238203 100644
--- a/en/on-call/integration/alert-integration/alert-sources/argocd.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/argocd.mdx
@@ -1,5 +1,6 @@
---
title: "Argo CD alert integration"
+sidebarTitle: "Argo CD"
description: "Send Argo CD application sync failures and health degradation to Flashduty On-call through an Argo CD Notifications webhook service. Alerts close automatically when a sync succeeds or the application is healthy again."
keywords: ["alert integration", "Argo CD", "ArgoCD", "GitOps", "Notifications", "webhook", "Kubernetes"]
---
@@ -12,7 +13,6 @@ Argo CD pushes alerts through its built-in **Notifications** (`argocd-notificati
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -33,7 +33,6 @@ You can get the integration push URL in either of the following ways.
## Configure Argo CD
----
The steps below need Kubernetes permission to edit ConfigMaps in the Argo CD namespace (`argocd` by default) and to edit annotations on Applications or AppProjects. The Argo CD cluster must be able to reach the domain of the push URL.
@@ -160,7 +159,6 @@ Make a subscribed application fail to sync (for example, set a Deployment's imag
## Alert Key
----
Flashduty computes the Alert Key from `event_type` and the application's `app_uid` (`app.metadata.uid`). Kubernetes gives every object a UID that is unique over the whole lifetime of the cluster, so:
@@ -173,7 +171,6 @@ Changes to the application name, project, revision, sync status, or error messag
Flashduty rejects a request that lacks `event_type` or `app_uid`, a sync message without `phase`, or a health message without `health_status`.
## Alert lifecycle
----
| `event_type` | Status field | Value | Flashduty action |
| :--- | :--- | :--- | :--- |
@@ -189,7 +186,6 @@ Status values are case-insensitive. Any other value is rejected.
If an application is deleted while its alert is open, Argo CD sends no recovery message. Close the alert by hand, or turn on the channel's [auto-resolve timeout](/en/on-call/channel/create-edit) (24 hours suggested).
## Severity
----
| Alert | Severity |
| :--- | :--- |
@@ -199,7 +195,6 @@ If an application is deleted while its alert is open, Argo CD sends no recovery
To use one severity for every alert, append `&severity=Critical` (or `Warning`, `Info`) to the push URL. A recovery event keeps the severity of the original alert.
## Alert content
----
- **Title**: `Argo CD application sync ` or `Argo CD application health `
- **Description**: for a sync failure, the Argo CD sync result message (`operationState.message`); for health degraded, `Health status: Degraded`
@@ -208,7 +203,6 @@ To use one severity for every alert, append `&severity=Critical` (or `Warning`,
Empty fields are not written as labels.
## Troubleshooting
----
- **No alert arrives**: check the `argocd-notifications-controller` logs (`kubectl logs -n argocd deploy/argocd-notifications-controller`) and confirm that the application has the `notifications.argoproj.io/subscribe.on-flashduty.flashduty` annotation, or that `subscriptions` includes `on-flashduty`
- **The logs show `failed with error code 400`**: make sure the templates match this page and every value goes through `toJson`. The response body names the missing or unsupported field
diff --git a/en/on-call/integration/alert-integration/alert-sources/atatus.mdx b/en/on-call/integration/alert-integration/alert-sources/atatus.mdx
index 52bd94d6..81ba28e2 100644
--- a/en/on-call/integration/alert-integration/alert-sources/atatus.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/atatus.mdx
@@ -1,5 +1,6 @@
---
title: "Atatus Alert Integration"
+sidebarTitle: "Atatus"
description: "Sync Atatus incident open and close notifications to Flashduty On-call through a Webhook notification channel."
keywords: ["alert integration", "Atatus", "APM", "Webhook", "Notification Channel", "Alert Policy", "incident_id"]
---
@@ -9,7 +10,6 @@ Sync Atatus incidents to Flashduty On-call through an Atatus Webhook notificatio
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## In Atatus
----
@@ -57,7 +56,6 @@ Trigger an alert rule and confirm Flashduty receives an active alert. After the
## Payload
----
Atatus POSTs these fields as `application/json`. Flashduty parses them directly, with no template to configure:
@@ -77,14 +75,12 @@ Atatus POSTs these fields as `application/json`. Flashduty parses them directly,
Other fields, including `target_name`, `acknowledge_url`, `account_id`, `alert_url` and `timestamp`, are not stored.
## Alert Key
----
Flashduty uses `incident_id` as the Alert Key. The open and close notifications of one Atatus incident carry the same `incident_id`, so they land on the same alert. What counts as one incident is set by the policy's **Incident preference** (by policy, by rule, or by rule and target), and Flashduty follows it.
A request without `incident_id` is rejected with a parameter error, because its close notification could not be matched to the original alert.
## Status and severity
----
| Atatus field | Flashduty status or severity |
| :--- | :--- |
@@ -96,7 +92,6 @@ A request without `incident_id` is rejected with a parameter error, because its
A request whose `status` is empty or any other value is rejected, so a request of unknown state never lands in the wrong lifecycle.
## FAQ
----
@@ -113,7 +108,6 @@ The channel test only checks that the URL is reachable and opens a separate Info
## Troubleshooting
----
- **Atatus fails to deliver**: confirm the URL is the full push URL and includes `integration_key`
- **Flashduty returns a parameter error**: confirm the request has `incident_id` and that `status` is `Opened`, `Closed` or `Acknowledged`
diff --git a/en/on-call/integration/alert-integration/alert-sources/auth0.mdx b/en/on-call/integration/alert-integration/alert-sources/auth0.mdx
index e5eca44b..602accf4 100644
--- a/en/on-call/integration/alert-integration/alert-sources/auth0.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/auth0.mdx
@@ -1,5 +1,6 @@
---
title: "Auth0 alert integration"
+sidebarTitle: "Auth0"
description: "Send attack protection, leaked password and failed login tenant logs to Flashduty On-call through an Auth0 custom webhook log stream."
keywords: ["alert integration", "Auth0", "log stream", "identity", "security alerts", "leaked password"]
---
@@ -9,7 +10,6 @@ Auth0 log streams deliver tenant logs in near real time to a custom webhook. Set
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## In Auth0
----
@@ -39,12 +38,12 @@ You can get the integration push URL in either of the following ways.
2. Click **Create Log Stream**, select **Custom Webhook**, and enter a name
3. Fill in the following settings:
-| Setting | Value |
-| :--- | :--- |
-| Payload URL | The Flashduty push URL |
-| Content Type | `application/json` |
-| Content Format | JSON Lines, JSON Array, or JSON Object; all three are supported |
-| Authorization Token | Leave empty. Flashduty authenticates with the `integration_key` in the URL |
+ | Setting | Value |
+ | :--- | :--- |
+ | Payload URL | The Flashduty push URL |
+ | Content Type | `application/json` |
+ | Content Format | JSON Lines, JSON Array, or JSON Object; all three are supported |
+ | Authorization Token | Leave empty. Flashduty authenticates with the `integration_key` in the URL |
4. Under **Filter by Log Event Category**, select only the error and warning categories to reduce volume. Leaving it unfiltered also works, because Flashduty ignores success logs
5. Click **Save**
@@ -65,19 +64,16 @@ Auth0 log streams have no "send test notification" button.
## Events and recovery
----
Auth0 sends each tenant log once and never sends an update or a recovery. Each log has a unique `log_id`, which Flashduty uses as the Alert Key. A retried delivery of the same log does not create a duplicate alert, and different logs each create their own Flashduty alert. Alerts do not recover automatically.
Turn on the channel's [auto-resolve timeout](/en/on-call/channel/create-edit) (24 hours suggested), or close alerts by hand after handling them. When the same source IP triggers many logs, configure a noise-reduction rule on the channel to merge them into one incident.
## Alert Key
----
The Alert Key is computed from the log's `log_id`. An alertable log without `log_id` is rejected with an invalid-parameter error.
## Severity
----
Severity follows the log type code (`type`); logs with any other type code are ignored:
@@ -92,7 +88,6 @@ Severity follows the log type code (`type`); logs with any other type code are i
For the full list of type codes, see [Auth0 log event type codes](https://auth0.com/docs/deploy-monitor/logs/log-event-type-codes).
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -109,7 +104,6 @@ For the full list of type codes, see [Auth0 log event type codes](https://auth0.
The alert description comes from the log's `description` and `details.error.message`. Flashduty does not read the user's email, the User-Agent, or other fields.
## Troubleshooting
----
- **Flashduty returns an invalid-parameter error**: confirm Content Type is `application/json` and check the `integration_key` in the Payload URL
- **No alert arrives**: confirm the log type is in the table above, the Health tab shows Active, and the stream's event category filter does not exclude that type
diff --git a/en/on-call/integration/alert-integration/alert-sources/auvik.mdx b/en/on-call/integration/alert-integration/alert-sources/auvik.mdx
index c1e66b25..1a215e34 100644
--- a/en/on-call/integration/alert-integration/alert-sources/auvik.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/auvik.mdx
@@ -1,5 +1,6 @@
---
title: "Auvik alert integration"
+sidebarTitle: "Auvik"
description: "Send Auvik network monitoring alert triggered and cleared notifications to Flashduty On-call through a Webhook integration."
keywords: ["alert integration", "Auvik", "webhook", "network monitoring", "MSP"]
---
@@ -9,7 +10,6 @@ Use the Webhook integration of Auvik to send alerts on devices, interfaces, netw
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Auvik
----
Webhook integrations can be managed only from the MSP global view in Auvik, and you need the matching administrative permission. The webhook URL must use HTTPS, which the Flashduty push URL does.
@@ -70,12 +69,10 @@ Auvik requires standard English characters in organization names. Webhook alerts
## Alert Key
----
Flashduty uses `correlationId` from the notification as the Alert Key. Auvik documents it as the unique API identifier of the alert trigger. The triggered and cleared notifications of one alert carry the same `correlationId` but different `alertId` values, so Flashduty does not use `alertId`. Changes to the alert name, severity, description, or time do not change the Alert Key. A notification that has a status but no `correlationId` is rejected.
## Status and severity
----
Flashduty derives the status from `alertStatusString` (or `alertStatus` when the string is missing) and the severity from `alertSeverity` (or `alertSeverityString` when the number is missing):
@@ -94,7 +91,6 @@ Flashduty derives the status from `alertStatusString` (or `alertStatus` when the
A missing or unrecognized severity is treated as Warning.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -108,7 +104,6 @@ A missing or unrecognized severity is treated as Warning.
| `url` | Link to the alert in Auvik |
## Troubleshooting
----
- **Test Connection fails**: Confirm the webhook URL is complete, includes `integration_key`, and uses HTTPS
- **No alerts arrive**: Confirm the notification channel is associated with the alerts and uses this Webhook integration as its contact method
diff --git a/en/on-call/integration/alert-integration/alert-sources/aws-cloudwatch.mdx b/en/on-call/integration/alert-integration/alert-sources/aws-cloudwatch.mdx
index 34c2e4a0..f0c286b2 100644
--- a/en/on-call/integration/alert-integration/alert-sources/aws-cloudwatch.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/aws-cloudwatch.mdx
@@ -1,5 +1,6 @@
---
title: "AWS CloudWatch Integration"
+sidebarTitle: "AWS CloudWatch"
description: "Sync CloudWatch alarms, Cost Anomaly Detection, Amazon Managed Service for Prometheus and AWS Budgets notifications to Flashduty On-call through Amazon SNS"
---
@@ -8,42 +9,42 @@ This integration receives the HTTPS subscription of an Amazon SNS topic. The tri
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this method when you don't need to route alert events to different channels. It's simpler.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a specific channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **AWS CloudWatch** integration, click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this method when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **AWS CloudWatch** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## Configure in AWS
----
1. Log in to the AWS console and open `Simple Notification Service`
@@ -52,13 +53,13 @@ Choose this method when you need to route alerts to different channels based on
4. Select `Flashduty` for `Topic ARN`, `HTTPS` for `Protocol`, and enter the integration push URL as `Endpoint`
5. Click `Create subscription`
-
+
6. Return to the `Subscriptions` page. The status `Confirmed` means Flashduty has confirmed the subscription
7. Open the `CloudWatch` console, go to `All alarms`, and create or edit an alarm
8. In the `Notification` step, select the SNS topic `Flashduty` for all three states: `In alarm`, `OK` and `Insufficient data`. Without `OK`, the alert does not recover automatically
-
+
9. Return to the integration list. A latest event time means events are arriving
@@ -69,7 +70,6 @@ The subscription works with **Raw message delivery** on or off. With raw deliver
## Other AWS services that publish to SNS
----
Send the notifications of these services to the same `Flashduty` topic. No other setup is needed.
@@ -98,7 +98,6 @@ In the budget **Alert** settings, choose **Amazon SNS Alerts** and enter the ARN
Each unrecognized message (plain text or other JSON) creates one Warning alert. The Alert Key is the SNS `MessageId`, so an SNS retry of the same message does not create a second alert. The title is the SNS `Subject`, or the first line of the message when there is no subject. These alerts do not recover automatically.
## Alert Key
----
| Message | Alert Key | Recovers when |
| :--- | :--- | :--- |
@@ -110,7 +109,6 @@ Each unrecognized message (plain text or other JSON) creates one Warning alert.
`ALARM`, `INSUFFICIENT_DATA` and `OK` of a CloudWatch alarm share one Alert Key; changes to the alarm name, threshold, reason or description do not split the alert. A CloudWatch alarm message without `AlarmArn` is rejected.
## Status and severity
----
CloudWatch alarms have no severity. `ALARM` and `INSUFFICIENT_DATA` map to Warning by default, and `OK` recovers the alert.
@@ -124,7 +122,6 @@ Order service CPU too high flashduty_severity: critical
## Labels
----
- Single-metric alarms: `trigger_metric_name`, `trigger_namespace`, `trigger_dimensions_` and more. When the dimensions include `InstanceId`, it is written to `resource`
- Metric math and anomaly detection alarms: each query writes `trigger_expression_`, `trigger_metric_` (`namespace/metric name`) and `trigger_dimensions_`. `metric` and `check` come from the query that returns data
@@ -132,7 +129,6 @@ Order service CPU too high flashduty_severity: critical
- All alarms: `alarm_arn`, `aws_account_id`, `region`, `new_state_value`, `old_state_value`
## Troubleshooting
----
- **Subscription stays in `Pending confirmation`**: Make sure the endpoint is the full push URL including `integration_key`, then run **Request confirmation** on the subscription in the SNS console
- **Flashduty returns a SubscribeURL error**: Flashduty only visits subscription confirmation URLs on `sns..amazonaws.com`, `sns..amazonaws.com.cn` and `sns..amazonaws.eu`. Make sure the subscription request comes from Amazon SNS
diff --git a/en/on-call/integration/alert-integration/alert-sources/aws-eventbridge.mdx b/en/on-call/integration/alert-integration/alert-sources/aws-eventbridge.mdx
index eac543ad..3277d448 100644
--- a/en/on-call/integration/alert-integration/alert-sources/aws-eventbridge.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/aws-eventbridge.mdx
@@ -1,5 +1,6 @@
---
title: "AWS EventBridge Alert Events"
+sidebarTitle: "AWS EventBridge"
description: "Sync CloudWatch alarm, GuardDuty, Security Hub, AWS Health, Inspector, Config and DevOps Guru events to Flashduty On-call through EventBridge, with automatic merging and recovery"
---
@@ -8,42 +9,42 @@ This integration receives Amazon EventBridge events, either pushed directly by a
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this simpler option when you don't need to route alert events to different channels.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **AWS EventBridge** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert event payload.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **AWS EventBridge** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## Configure in AWS EventBridge
----
Use either of the following delivery methods.
@@ -56,7 +57,7 @@ Use either of the following delivery methods.
2. Select `Integration=>API destinations` from the left navigation bar
3. Click `Connections`, then click `Create connection`
-
+
4. In the `Connection details` section, enter `Flashduty` for `Connection name`
5. In the `Authorization` section, select `Other` for `Destination type`
@@ -70,7 +71,7 @@ Use either of the following delivery methods.
1. Return to the `API destinations` interface and click `Create API destination`
-
+
2. Fill in the information in the `API destination detail` editing interface, enter `Flashduty` for `Name`
3. Enter the integration push URL for `API destination endpoint`
@@ -101,7 +102,6 @@ Use either of the following delivery methods.
Flashduty only visits subscription confirmation URLs on `sns..amazonaws.com`, `sns..amazonaws.com.cn` and `sns..amazonaws.eu`.
## Event rule
----
Use an event pattern in the rule, for example:
@@ -131,7 +131,6 @@ Do not filter out recovery states in the rule, or alerts cannot recover automati
AWS Health sends events to the Region where they occur; events of global services arrive in `us-east-1`. Create the rule in every Region you care about.
## Alert Key and recovery
----
| Source | `detail-type` | Alert Key | Recovers when |
| :--- | :--- | :--- | :--- |
@@ -150,7 +149,6 @@ AWS Health sends events to the Region where they occur; events of global service
- GuardDuty sends no event when a finding is archived, so close the alert manually
## Severity
----
EventBridge events have no common severity field, so every event triggers as Warning, as it always has. The source's own severity is kept in a label, and an [alert pipeline](/en/on-call/integration/alert-integration/alert-pipelines) can rewrite the severity based on it:
@@ -166,7 +164,6 @@ EventBridge events have no common severity field, so every event triggers as War
For CloudWatch alarms, set the severity with `flashduty_severity: critical` (`critical`, `warning` or `info`) in the **Alarm description**, the same way as in the [AWS CloudWatch integration](/en/on-call/integration/alert-integration/alert-sources/aws-cloudwatch).
## Title and labels
----
- The alert title is `source::detail-type`, for example `aws.guardduty::GuardDuty Finding`
- Every event carries the labels `source`, `region`, `account`, `check` (`detail-type`), `detail` (the event `detail` as JSON) and `resources`
@@ -174,7 +171,6 @@ For CloudWatch alarms, set the severity with `flashduty_severity: critical` (`cr
- Sources with dedicated handling also add source fields such as `finding_id`, `finding_arn`, `event_arn`, `config_rule_name` and `insight_id`; `resource` is the affected resource (DevOps Guru insights have none)
## Troubleshooting
----
- **API destination invocations fail**: Make sure the endpoint is the full push URL including `integration_key` and `HTTP method` is `POST`
- **SNS subscription stays in `Pending confirmation`**: Make sure the subscription points to this integration's push URL, then run **Request confirmation** in the SNS console
diff --git a/en/on-call/integration/alert-integration/alert-sources/aws-health.mdx b/en/on-call/integration/alert-integration/alert-sources/aws-health.mdx
index 3f21c793..4bc1d864 100644
--- a/en/on-call/integration/alert-integration/alert-sources/aws-health.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/aws-health.mdx
@@ -1,5 +1,6 @@
---
title: "AWS Health Alert Integration"
+sidebarTitle: "AWS Health"
description: "Receive AWS Health events through an Amazon EventBridge rule using the Flashduty AWS EventBridge integration; alerts recover automatically when the event closes."
keywords: ["alert integration", "AWS Health", "AWS Health Dashboard", "EventBridge", "service health", "scheduled change"]
---
@@ -9,7 +10,6 @@ AWS Health sends the service events that affect your account (operational issues
## In Flashduty On-call
----
Get an integration push URL in either of the two ways below. **Choose the AWS EventBridge integration type** in both, not AWS Health.
@@ -30,31 +30,30 @@ Get an integration push URL in either of the two ways below. **Choose the AWS Ev
## Configure in AWS
----
AWS Health events are forwarded by an EventBridge rule whose target is an API destination that points to the Flashduty push URL (an SNS topic target also works). The steps for both target types are in the [AWS EventBridge integration](/en/on-call/integration/alert-integration/alert-sources/aws-eventbridge); for AWS Health you only need the event pattern below.
1. Create a rule in EventBridge with this event pattern:
-```json
-{
- "source": ["aws.health"],
- "detail-type": ["AWS Health Event"]
-}
-```
+ ```json
+ {
+ "source": ["aws.health"],
+ "detail-type": ["AWS Health Event"]
+ }
+ ```
2. To narrow the scope, add filters under `detail`. For example, only `issue` events for Amazon EC2:
-```json
-{
- "source": ["aws.health"],
- "detail-type": ["AWS Health Event"],
- "detail": {
- "eventTypeCategory": ["issue"],
- "service": ["EC2"]
- }
-}
-```
+ ```json
+ {
+ "source": ["aws.health"],
+ "detail-type": ["AWS Health Event"],
+ "detail": {
+ "eventTypeCategory": ["issue"],
+ "service": ["EC2"]
+ }
+ }
+ ```
3. Choose the API destination that points to the Flashduty push URL as the rule target and save the rule
4. While creating the rule, you can pick the AWS Health sample events in the **Test event pattern** panel of the EventBridge console to confirm the pattern matches
@@ -66,14 +65,12 @@ Do not filter out `statusCode` in the event pattern, for example by matching onl
## Regions and backup rules
----
- Create a rule in every Region you want to receive events from. Global events (for example IAM-related events) are delivered to US East (N. Virginia), `us-east-1`
- In the standard AWS partition, events are also sent to the backup Region US West (Oregon). If you create rules in both the primary and the backup Region, the same event arrives twice; both copies have the same `eventArn` and affected account, so Flashduty merges them into one alert through the same Alert Key
- To keep only the primary Region's events, add the filter `"backupEvent": ["false"]` (`detail.backupEvent`) to the backup Region rule
## Field mapping
----
| AWS Health field | Flashduty |
| :--- | :--- |
@@ -88,12 +85,10 @@ Do not filter out `statusCode` in the event pattern, for example by matching onl
| `region`, `account`, `resources`, `detail` | Labels `region`, `account`, `resources`, `detail` (`detail` holds the event detail as JSON) |
## Severity
----
EventBridge events carry no common severity field, so every AWS Health event triggers as Warning. To differentiate, rewrite the severity by the `event_type_category` label in [Alert processing](/en/on-call/integration/alert-integration/alert-pipelines), for example `issue` to Critical and `scheduledChange` kept at Warning or lowered to Info.
## Recovery and deduplication
----
- AWS Health sends an update with `statusCode` set to `closed` when the event ends, and Flashduty recovers the alert with the same Alert Key
- Scheduled changes (`scheduledChange`) are sent with status `upcoming` before they start, so Flashduty triggers alerts ahead of time. If you only care about ongoing incidents, restrict `eventTypeCategory` to `issue` in the event pattern
@@ -101,7 +96,6 @@ EventBridge events carry no common severity field, so every AWS Health event tri
- Events without `detail.eventArn` are rejected (HTTP 400)
## Troubleshooting
----
- **The rule does not fire**: check the event pattern; public events can take up to an hour after the rule is created; make sure rules exist in the event's Region and in `us-east-1` for global events
- **The alert does not recover**: confirm the event pattern does not filter out the `closed` status and that the target has no Input transformer (the full event must be sent)
diff --git a/en/on-call/integration/alert-integration/alert-sources/aws-security-hub.mdx b/en/on-call/integration/alert-integration/alert-sources/aws-security-hub.mdx
index 16848384..cd0b1887 100644
--- a/en/on-call/integration/alert-integration/alert-sources/aws-security-hub.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/aws-security-hub.mdx
@@ -1,5 +1,6 @@
---
title: "AWS Security Hub Alert Integration"
+sidebarTitle: "AWS Security Hub"
description: "Send AWS Security Hub findings to Flashduty's AWS EventBridge integration through an EventBridge rule; findings merge per finding and recover when their workflow status changes."
keywords: ["alert integration", "AWS Security Hub", "Security Hub", "ASFF", "EventBridge", "cloud security", "AWS"]
---
@@ -9,7 +10,6 @@ AWS Security Hub sends each finding to Amazon EventBridge as a **Security Hub Fi
## In Flashduty On-call
----
Get an integration push URL in either of the two ways below. **Choose the AWS EventBridge integration type** in both, not AWS Security Hub.
@@ -30,7 +30,6 @@ Get an integration push URL in either of the two ways below. **Choose the AWS Ev
## Configure in AWS
----
1. Follow "Option 1: API destination" in the [AWS EventBridge integration](/en/on-call/integration/alert-integration/alert-sources/aws-eventbridge) to create the Connection and API destination, using the Flashduty push URL as the endpoint. "Option 2: SNS topic" also works
2. In the EventBridge console, create a rule and choose **Rule with an event pattern** for **Rule type**
@@ -67,7 +66,6 @@ Do not filter on `Workflow.Status`, `RecordState`, `Compliance.Status` or `Sever
Create the rule in every Region where Security Hub is enabled. **Security Hub Findings - Custom Action** events, sent by custom actions, also carry findings and are handled the same way; add that `detail-type` to the rule if you use them.
## Field mapping
----
The `detail.findings` array of a **Security Hub Findings - Imported** event holds a single finding. The mapping below is how Flashduty processes these AWS EventBridge events:
@@ -82,14 +80,12 @@ The `detail.findings` array of a **Security Hub Findings - Imported** event hold
| Event `source`, `region`, `account`, `detail-type`, `detail` | Labels `source`, `region`, `account`, `check`, `detail` |
## Recovery and deduplication
----
- Changing a finding's workflow status to **Resolved** or **Suppressed** in Security Hub, or archiving the finding, produces a new **Security Hub Findings - Imported** event, and Flashduty closes the alert with the same Alert Key.
- When an event contains several findings, each finding becomes its own alert.
- If an event lacks `Id` or `ProductArn`, Flashduty returns HTTP 400.
## Troubleshooting
----
- **The API destination call fails**: confirm the endpoint is the full push URL including `integration_key` and that `HTTP method` is `POST`
- **Alerts do not recover**: check whether the rule's event pattern filters on `Workflow.Status` or `RecordState`, and whether the target has an Input transformer (the full event must be sent)
diff --git a/en/on-call/integration/alert-integration/alert-sources/axiom.mdx b/en/on-call/integration/alert-integration/alert-sources/axiom.mdx
index 76d68e13..6bc084d4 100644
--- a/en/on-call/integration/alert-integration/alert-sources/axiom.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/axiom.mdx
@@ -1,5 +1,6 @@
---
title: "Axiom alert integration"
+sidebarTitle: "Axiom"
description: "Use an Axiom custom webhook notifier to send monitor triggers and recoveries to Flashduty On-call."
keywords: ["alert integration", "Axiom", "Monitor", "Notifier", "Webhook"]
---
@@ -9,7 +10,6 @@ Use an Axiom custom webhook notifier to send monitor alerts to Flashduty On-call
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure Axiom
----
@@ -96,7 +95,6 @@ Make a threshold monitor's condition actually hold (for example, lower the thres
## Alert Key
----
Flashduty builds the Alert Key from `event.monitorID`. When the notification carries groups (`event.groupKeys` is not empty), the group names and values are part of the Alert Key too. Axiom's documentation defines `.MonitorID` as the unique identifier of the monitor the notification belongs to; with **Notify by group** on, each group triggers separately and the notification carries that group's values.
@@ -105,7 +103,6 @@ Flashduty builds the Alert Key from `event.monitorID`. When the notification car
- Changes to the monitor name, description, current value, or times do not change the Alert Key
## Status and severity
----
Axiom notifications carry no severity, so Flashduty sets every Axiom alert to Critical. To use another severity, adjust it by the `check` or `monitor_id` label with an [Alert Pipeline](/en/on-call/integration/alert-integration/alert-pipelines).
@@ -116,7 +113,6 @@ Axiom notifications carry no severity, so Flashduty sets every Axiom alert to Cr
| Empty or any other value | Rejects the request |
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -133,7 +129,6 @@ Axiom notifications carry no severity, so Flashduty sets every Axiom alert to Cr
The alert description is the notification's `event.body`: for a threshold monitor, the current value compared with the threshold; for a match monitor, the matched event.
## Troubleshooting
----
- **Flashduty returns a parameter error**: confirm the body is still the default template above and `monitorID` and `action` are not empty
- **The alert does not recover**: match monitors send no recovery, so turn on auto-close. A threshold monitor sends `Closed` only when a later run no longer crosses the threshold
diff --git a/en/on-call/integration/alert-integration/alert-sources/azure-monitor.mdx b/en/on-call/integration/alert-integration/alert-sources/azure-monitor.mdx
index e5f0d8f4..82b3ad2d 100644
--- a/en/on-call/integration/alert-integration/alert-sources/azure-monitor.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/azure-monitor.mdx
@@ -1,5 +1,6 @@
---
title: "Azure Monitor Integration"
+sidebarTitle: "Azure Monitor"
description: "Sync Azure Monitor alert events to Flashduty via webhook for automated alert noise reduction"
---
@@ -8,42 +9,42 @@ Sync Azure Monitor alert events to Flashduty via webhook for automated alert noi
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this method when you don't need to route alert events to different channels. It's simpler and recommended.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a specific channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Azure Monitor** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this method when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Azure Monitor** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In Azure Monitor
----
**Step 1: Configure webhook**
@@ -63,7 +64,7 @@ Flashduty also parses Azure's noncommon payloads when the common alert schema is
1. Go to `Alerts -> Alert rules` page, click Create or select an existing policy to edit;
2. As shown below, select the created Action group on the `Actions` page;
-
+
3. Save and wait for alerts to trigger.
@@ -72,7 +73,6 @@ Metric alerts, log search alerts, Prometheus alerts, Application Insights smart
## Service Health
----
1. In the Azure Portal, go to `Service Health -> Health alerts` and click `Create service health alert`;
@@ -86,7 +86,6 @@ The Service Health sample sent by `Test action group` is at the `Resolved` stage
## Resource Health
----
1. In the Azure Portal, go to `Service Health -> Resource health` and click `Add resource health alert`;
@@ -98,7 +97,6 @@ Each resource maps to one Flashduty alert, with the Alert Key derived from the r
## Defender for Cloud security alerts
----
Defender for Cloud writes its security alerts to the `Security` category of the activity log. In `Alerts -> Alert rules`, create an alert rule whose condition is an activity log signal with category `Security`, and select the Action group created above.
@@ -108,7 +106,6 @@ With the common alert schema, the alert title is "alert rule name on resource na
## Other activity log alerts
----
Administrative, Policy, Autoscale, and Recommendation activity log alerts are one-shot events: each notification creates one Flashduty alert that does not recover automatically. With the common alert schema, the alert title is "alert rule name on resource name" and the operation goes into the `operation_name` label. Without it, the payload has no rule name, so the title is "operation on resource", for example `Microsoft.Compute/virtualMachines/restart/action on test-VM`.
@@ -116,7 +113,6 @@ Administrative, Policy, Autoscale, and Recommendation activity log alerts are on
## Alert Key and recovery
----
| Alert type | Alert Key source | Recovers when |
@@ -133,7 +129,6 @@ Dimensions of metric and log alerts (for example `ApiName` or `Computer`), the m
## Status mapping
----
Azure Monitor to Flashduty alert severity mapping:
@@ -151,7 +146,6 @@ Noncommon metric alerts and Log Alerts V1 express severity as `0` to `4`, mapped
## FAQ
----
- **Azure reports a failed webhook call (400)**: check whether the log search alert uses a custom JSON payload. Enable the common alert schema and retry.
diff --git a/en/on-call/integration/alert-integration/alert-sources/azure-service-health.mdx b/en/on-call/integration/alert-integration/alert-sources/azure-service-health.mdx
index 3cea2f72..4646b741 100644
--- a/en/on-call/integration/alert-integration/alert-sources/azure-service-health.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/azure-service-health.mdx
@@ -1,5 +1,6 @@
---
title: "Azure Service Health Alert Integration"
+sidebarTitle: "Azure Service Health"
description: "Receive Azure service events through a Service Health alert rule and an action group webhook using the Flashduty Azure Monitor integration; alerts recover automatically when the event is resolved."
keywords: ["alert integration", "Azure Service Health", "action group", "webhook", "Azure Monitor"]
---
@@ -9,7 +10,6 @@ Azure writes service issues, planned maintenance, health advisories and security
## In Flashduty On-call
----
Get an integration push URL in either of the two ways below. **Choose the Azure Monitor integration type** in both, not Azure Service Health.
@@ -30,7 +30,6 @@ Get an integration push URL in either of the two ways below. **Choose the Azure
## Configure in Azure
----
### Step 1: Create an action group with a webhook
@@ -51,7 +50,6 @@ Azure requires that the action group used by a Service Health alert has its regi
5. Click **Advanced options**, select the action group from Step 1 on the **Actions** tab, and create the rule
## Field mapping
----
| Service Health field | Flashduty |
| :--- | :--- |
@@ -64,7 +62,6 @@ Azure requires that the action group used by a Service Health alert has its regi
| Subscription ID + `trackingId` | Label `service_health_url`, which links to the event's Service Health page |
## Title and description
----
| | Common alert schema on | Off (legacy `Microsoft.Insights/activityLogs`) |
| :--- | :--- | :--- |
@@ -75,14 +72,12 @@ Azure requires that the action group used by a Service Health alert has its regi
With the common schema, the event title and text stay in the JSON of the `alertContext` label. If you want the event title directly in notifications, use the legacy payload (leave the common alert schema off).
## Recovery and deduplication
----
- Azure sends several notifications for one Tracking ID as the event progresses, and Flashduty merges them through the Alert Key; the alert recovers when the event reaches a resolved stage
- Legacy notifications without `properties.trackingId` are rejected (HTTP 400); with the common schema, a notification without a Tracking ID becomes its own alert and does not recover automatically
- Planned maintenance recovers in the `Complete` or `Canceled` stage; until then, the alert stays triggered
## Troubleshooting
----
- **The action group does not fire**: confirm the action group's region is **Global** and that the alert rule's **Actions** tab has this action group selected
- **The alert does not recover**: confirm the alert rule is still enabled and wait for Azure to send the notification for the resolved stage
diff --git a/en/on-call/integration/alert-integration/alert-sources/baidu-bcm.mdx b/en/on-call/integration/alert-integration/alert-sources/baidu-bcm.mdx
index 6fc87a23..d511b324 100644
--- a/en/on-call/integration/alert-integration/alert-sources/baidu-bcm.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/baidu-bcm.mdx
@@ -1,5 +1,6 @@
---
title: "Baidu Cloud BCM Integration"
+sidebarTitle: "Baidu Cloud BCM"
description: "Sync Baidu Cloud BCM alerts to Flashduty via webhook for automated alert noise reduction"
---
@@ -8,42 +9,42 @@ Sync Baidu Cloud BCM alerts to Flashduty via webhook for automated alert noise r
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this simpler option when you don't need to route alerts to different channels.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a specific channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Baidu Cloud BCM** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alerts** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alerts** to enter the integration selection page
2. Select **Baidu Cloud BCM** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In Baidu Cloud BCM
----
1. Log in to your Baidu Cloud Console, search for the `Cloud Monitor` product, and enter its console
@@ -51,14 +52,13 @@ Choose this option when you need to route alerts to different channels based on
3. Go to the `Alert Management-Alert Policy` page, choose to edit an existing policy or create a new one
4. In the alert policy, fill in the integration push URL in the `Callback URL` field (enter the integration name on the current page, and the URL will be generated after saving)
-
+
5. Done
## Status Mapping
----
Severity level mapping from Baidu Cloud Monitor to Flashduty:
diff --git a/en/on-call/integration/alert-integration/alert-sources/bgpalerter.mdx b/en/on-call/integration/alert-integration/alert-sources/bgpalerter.mdx
index 9916f773..f89bce0c 100644
--- a/en/on-call/integration/alert-integration/alert-sources/bgpalerter.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/bgpalerter.mdx
@@ -1,5 +1,6 @@
---
title: "BGPalerter alert integration"
+sidebarTitle: "BGPalerter"
description: "Send BGP hijacks, prefix visibility loss, RPKI-invalid announcements, and other BGPalerter events to Flashduty On-call through the reportHTTP report module."
keywords: ["alert integration", "BGPalerter", "BGP", "BGP hijack", "RPKI", "prefix monitoring", "webhook"]
---
@@ -11,7 +12,6 @@ BGPalerter sends each event once and never sends a recovery notification. Close
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can get the integration push URL in either of the following ways.
## Configure BGPalerter
----
BGPalerter has no fixed webhook format: the request body comes from the `reportHTTP` template in `config.yml`. Flashduty parses only the JSON that the template below produces, so use it as is.
@@ -87,7 +86,6 @@ BGPalerter has no "send test notification" button. Running `bgpalerter -t` (in D
## Events and recovery
----
Each channel in `channels` is one kind of event:
@@ -106,7 +104,6 @@ Each channel in `channels` is one kind of event:
BGPalerter sends no recovery notification, so Flashduty never closes these alerts automatically. Turn on the channel's [auto-resolve timeout](/en/on-call/channel/create-edit) (24 hours suggested). Hijack events usually need a human check, so you can also close them by hand once handled.
## Alert Key
----
Flashduty computes the Alert Key from the routing facts of the event: the channel (`channel`), the monitored prefix (`prefix`), the monitored AS (`asn`), the new origin AS (`neworigin`), and the prefix actually announced (`newprefix`). BGPalerter itself groups hijack events by origin AS and prefix.
@@ -118,7 +115,6 @@ Flashduty computes the Alert Key from the routing facts of the event: the channe
A request without `channel`, or without any of prefix, AS, and summary, is rejected with an error.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -136,7 +132,6 @@ A request without `channel`, or without any of prefix, AS, and summary, is rejec
The alert title is BGPalerter's event summary, and the description is the prefix description.
## Troubleshooting
----
- **Flashduty receives no alerts**: check that `hooks.default` is the full HTTPS push URL with `integration_key`. BGPalerter only writes a failed post to its own log and does not retry
- **BGPalerter logs a JSON parse error**: check the prefix descriptions in `prefixes.yml` for double quotes or line breaks
diff --git a/en/on-call/integration/alert-integration/alert-sources/bigpanda.mdx b/en/on-call/integration/alert-integration/alert-sources/bigpanda.mdx
index 1638fb9c..92656323 100644
--- a/en/on-call/integration/alert-integration/alert-sources/bigpanda.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/bigpanda.mdx
@@ -1,5 +1,6 @@
---
title: "BigPanda alert integration"
+sidebarTitle: "BigPanda"
description: "Send the incidents BigPanda creates by correlating alerts to Flashduty On-call through BigPanda's Notifications Webhook v2 integration."
keywords: ["alert integration", "BigPanda", "AIOps", "Notifications Webhook v2", "AutoShare", "incident.id"]
---
@@ -11,7 +12,6 @@ Notifications Webhook v2 can currently only be created and updated through BigPa
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -20,7 +20,7 @@ You can obtain an integration push URL in either of the following ways.
Choose this method when you do not need to route alerts to different channels.
-
+
1. In the Flashduty console, select **Channel** and open a channel
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration**
@@ -35,7 +35,7 @@ Choose this method when you do not need to route alerts to different channels.
Choose this method when you need to route alerts to different channels based on the payload.
-
+
1. In the Flashduty console, select **Integration Center → Alert Events**
2. Select **BigPanda** and enter an integration name
@@ -48,14 +48,12 @@ Choose this method when you need to route alerts to different channels based on
## Prerequisites
----
- **Permissions**: calling the Notifications Webhook v2 API needs the **Integrations** permission; creating an AutoShare rule needs the **Notifications** permission (view, add, edit, and delete AutoShare rules).
- **Authentication**: the Notifications Webhook v2 API currently only accepts credentials from a **User Account** — a Service Account cannot call it.
- This integration does not parse a fixed BigPanda schema. It parses the JSON template you paste into the request body in step one below — keep the field names exactly as given.
## Configure BigPanda
----
@@ -120,14 +118,12 @@ Trigger a real alert in that environment (or wait for the next real one) and con
## Alert Key
----
Flashduty uses the request body's `incident_id` (from BigPanda's template variable `{{incident.id}}`) directly as the Alert Key. BigPanda's documentation defines `incident.id` as the incident's system-generated unique identifier; an incident's creation, updates, and closure all share the same `incident.id`.
Changes to `status`, `environment`, `host`, `check`, `description`, or `url` do not change the Alert Key.
## Status and severity
----
| BigPanda `incident.status` | Flashduty status | Flashduty severity |
| :--- | :--- | :--- |
@@ -139,7 +135,6 @@ Changes to `status`, `environment`, `host`, `check`, `description`, or `url` do
`incident.status` is the most severe status among the incident's correlated alerts. `unknown` means BigPanda could not determine health from the correlated alerts; the incident is still open, so it is treated as Warning. An empty or unrecognized `status` is rejected.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -153,7 +148,6 @@ Changes to `status`, `environment`, `host`, `check`, `description`, or `url` do
The alert title uses `check` first; when the template's `{{primaryAlert.tags.check}}` is empty, it falls back to `description`.
## FAQ
----
diff --git a/en/on-call/integration/alert-integration/alert-sources/bitdefender.mdx b/en/on-call/integration/alert-integration/alert-sources/bitdefender.mdx
index 857b6b25..f013a357 100644
--- a/en/on-call/integration/alert-integration/alert-sources/bitdefender.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/bitdefender.mdx
@@ -1,5 +1,6 @@
---
title: "Bitdefender GravityZone alert integration"
+sidebarTitle: "Bitdefender GravityZone"
description: "Send malware, ransomware, network attack and incident detections from Bitdefender GravityZone to Flashduty On-call through the Event Push Service."
keywords: ["alert integration", "Bitdefender", "GravityZone", "Event Push Service", "EDR", "security"]
---
@@ -9,7 +10,6 @@ The GravityZone Event Push Service posts detection events to a URL as JSON-RPC 2
## In Flashduty On-call
----
You can get the push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the push URL in either of the following ways.
## In GravityZone
----
The Event Push Service is configured only through the GravityZone public API; the console has no screen for it.
@@ -99,12 +98,10 @@ Flashduty opens a separate Info alert titled `Bitdefender GravityZone test notif
## Turn on auto-close
----
Detection events are one-shot, and GravityZone never pushes a recovery. In the channel that receives them, turn on [auto-close](/en/on-call/channel/create-edit) with a suggested duration of 24 hours, counted from **Incident trigger**. While an alert is open, a repeat detection of the same threat merges into it; a detection after it closes creates a new alert.
## Supported event types
----
Only the detection events in the table create alerts. Status and inventory events (such as `modules`, `sva`, `registration`, `task-status`, `install`, `uninstall`, `uc` and `adcloud`) are ignored: Flashduty returns success and does nothing, so do not subscribe to them.
@@ -126,19 +123,16 @@ Only the detection events in the table create alerts. Status and inventory event
GravityZone publishes no severity scale for detection events, so these levels are a mapping made from the event fields. To change them, configure routing or alert processing rules on labels in the channel.
## Alert Key
----
GravityZone detection events have no event ID, so Flashduty builds the Alert Key from the parts of an event that do not change: `module`, `companyId`, the endpoint ID (`computer_id`, or `endpointId` for Sandbox Analyzer), and the threat identity of that event type. Antimalware uses the malware type, name and file path; Antiphishing uses the phishing type and URL; Ransomware Mitigation uses the attack type and attack source. Changes to the action taken, counters, times, hashes, host name and IP do not change the Alert Key.
Incidents use `incident_id`. `new-incident` and `new-extended-incident` share one Alert Key, so version updates of one incident merge into one alert. Events without an endpoint ID or `incident_id` are rejected.
## Batches
----
One `addEvents` request can carry several events. Flashduty creates one alert per event and processes them sorted by Alert Key. It handles at most 100 events per request; the rest create no alerts and the response returns an error. If one event is malformed, the others are still created and the response names the malformed event's position and the reason.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -153,12 +147,10 @@ One `addEvents` request can carry several events. Flashduty creates one alert pe
User names, mail senders and recipients, mail subjects and incident nodes (`nodes`) are never written to labels or the description.
## About signatures
----
GravityZone sends `md5(api_key, md5(request body))` in the `Event-Push-Service-Md5` header, and you can set an `authorization` header in `serviceSettings`. Flashduty verifies neither. The `integration_key` in the push URL is the only credential, so keep it safe.
## Troubleshooting
----
- **`setPushEventSettings` returns an error**: confirm the API key has Event Push Service API selected and that `serviceType` is `jsonRPC`
- **Flashduty receives nothing**: confirm the push URL is a publicly reachable HTTPS address that supports TLS 1.2 or later; GravityZone treats anything other than a 2xx response as a failure
diff --git a/en/on-call/integration/alert-integration/alert-sources/bleemeo.mdx b/en/on-call/integration/alert-integration/alert-sources/bleemeo.mdx
index dad23b20..69ba59af 100644
--- a/en/on-call/integration/alert-integration/alert-sources/bleemeo.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/bleemeo.mdx
@@ -1,5 +1,6 @@
---
title: "Bleemeo alert integration"
+sidebarTitle: "Bleemeo"
description: "Send Bleemeo metric status changes, both alerts and recoveries, to Flashduty On-call through a webhook integration."
keywords: ["alert integration", "Bleemeo", "monitoring", "webhook", "status change"]
---
@@ -9,7 +10,6 @@ Use a Bleemeo webhook integration to send metric status changes to Flashduty On-
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure Bleemeo
----
@@ -56,7 +55,6 @@ Push a metric past its threshold (for example, temporarily lower a CPU usage thr
## Payload
----
Bleemeo POSTs a JSON notification. Flashduty parses it directly, with no template to configure:
@@ -70,14 +68,12 @@ Bleemeo POSTs a JSON notification. Flashduty parses it directly, with no templat
| `status_text` | Status text | Label `status_text` |
## Alert Key
----
Flashduty uses `metric` as the Alert Key. The alert and recovery notifications of one metric carry the same `metric`, so they land on the same alert, while different metrics produce different alerts. The top-level `id` is not part of the Alert Key, and changes to the title, value, or time do not change it.
If `metric` is missing, Flashduty returns a parameter error, because a recovery cannot be reliably matched to its alert.
## Status and severity
----
| Bleemeo `status` | Flashduty status or severity |
| :--- | :--- |
@@ -89,7 +85,6 @@ If `metric` is missing, Flashduty returns a parameter error, because a recovery
A request with an empty or any other `status` is rejected, so a request whose state is unclear never enters the wrong alert lifecycle.
## FAQ
----
@@ -112,7 +107,6 @@ No. `3` (Unknown) is handled as Warning, and only `0` (OK) closes the alert.
## Troubleshooting
----
- **The test notification opens an Info alert**: the test sent after saving a target has no metric and is recognised by its fixed body (status `10`, title `Test`); it opens its own Info alert that never recovers, so close it manually
diff --git a/en/on-call/integration/alert-integration/alert-sources/blueking.mdx b/en/on-call/integration/alert-integration/alert-sources/blueking.mdx
index dc3ce403..d6f7cd94 100644
--- a/en/on-call/integration/alert-integration/alert-sources/blueking.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/blueking.mdx
@@ -1,5 +1,6 @@
---
title: "Tencent BlueKing Integration"
+sidebarTitle: "Tencent BlueKing"
description: "Sync Tencent BlueKing monitoring events to Flashduty via webhook for automated alert noise reduction"
---
@@ -8,47 +9,47 @@ Sync Tencent BlueKing monitoring events to Flashduty via webhook for automated a
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this simpler option when you don't need to route alerts to different channels.
-
- Expand
+
+
1. Go to Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Tencent BlueKing** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're Done
-
+
+
### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert payload information.
-
- Expand
+
+
- 1. Go to Flashduty console, select **Integration Center=>Alerts** to enter the integration selection page
+ 1. Go to Flashduty console, select **Integration Center → Alerts** to enter the integration selection page
2. Select **Tencent BlueKing** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In Tencent BlueKing
----
The following content has been verified on `BlueKing V6/7 versions`. V5 and below versions are no longer officially supported, and upgrading is recommended.
BlueKing alert policies can trigger `Action Plans`, which can integrate with external systems for complex functionalities. First, create an Action Plan and configure the Flashduty callback URL, then edit the alert policy to associate actions with this plan, enabling automatic alert changes to be pushed to Flashduty. Here are the specific steps:
-#### Step 1: Create Action Plan
+### Step 1: Create Action Plan
@@ -56,25 +57,25 @@ BlueKing alert policies can trigger `Action Plans`, which can integrate with ext
2. Go to `Configuration-Action Plans` page, click the `Add Plan` button to start creating an action plan;
3. Enter the name as `Send To Flashduty`, select `HTTP Callback` as the plan type, choose `POST` as the push method, and fill in the integration push URL (obtained after saving the integration), as shown below:
-
+
4. Switch to `Body`, select `JSON` type, copy and paste the following information (when an actual alert occurs, BlueKing will render the variable content as the payload to push to the target callback URL):
-```
-{{alarm.callback_message}}
-```
+ ```
+ {{alarm.callback_message}}
+ ```
5. Save the plan to complete creation.
1. Go to `Configuration-Alert Policies` page, select an existing policy to edit or create a new one;
2. Scroll down to the `Alert Processing` section, select the `Send To Flashduty` action plan for all three scenarios, and disable `Defense Rules`, as shown below:
-
+
3. Submit and save to complete;
4. Repeat these steps for other alerts you want to push to Flashduty.
@@ -82,7 +83,6 @@ BlueKing alert policies can trigger `Action Plans`, which can integrate with ext
## Status Mapping
----
Alert severity mapping between BlueKing and Flashduty:
diff --git a/en/on-call/integration/alert-integration/alert-sources/blumira.mdx b/en/on-call/integration/alert-integration/alert-sources/blumira.mdx
index 342d6db9..72369d00 100644
--- a/en/on-call/integration/alert-integration/alert-sources/blumira.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/blumira.mdx
@@ -1,5 +1,6 @@
---
title: "Blumira alert integration"
+sidebarTitle: "Blumira"
description: "Send Blumira finding created and resolved events to Flashduty On-call through a Blumira webhook."
keywords: ["alert integration", "Blumira", "webhook", "security alerts", "finding", "SIEM"]
---
@@ -9,7 +10,6 @@ Use a Blumira webhook to send security findings to Flashduty On-call. Each Blumi
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## In Blumira
----
@@ -74,19 +73,16 @@ Wait for a real Blumira finding and confirm Flashduty receives the active alert.
## About signatures
----
Blumira signs each delivery in the `X-Blumira-Signature` header (format `t=,v1=`). Flashduty does not verify this signature and does not need the signing secret. The `integration_key` in the push URL is the only credential, so keep it private.
## Alert Key
----
Flashduty uses `data.finding_id` as the Alert Key. The `finding.created` and `finding.status.changed` examples in Blumira's documentation carry the same `finding_id`, so the trigger, status updates, and recovery land on one alert.
Changes to the title, priority, status, or time do not change the Alert Key. A request without `data.finding_id` is rejected with a parameter error.
## Status and severity
----
| Blumira event | Flashduty behavior |
| :--- | :--- |
@@ -108,7 +104,6 @@ Flashduty treats only `resolved` as recovery. Blumira's documentation shows no o
Alert labels include the finding ID, short ID, type, category, priority, source country, and link. Owner and actor names and emails are not written to the alert.
## Troubleshooting
----
- **Blumira reports failed deliveries or auto-disabled the webhook**: check that the push URL is complete and includes `integration_key`. Blumira disables a webhook after sustained failures; fix the cause and re-enable it under **Edit**
- **No alerts arrive**: confirm the webhook is enabled and the event filters include `finding.created`
diff --git a/en/on-call/integration/alert-integration/alert-sources/bugsnag.mdx b/en/on-call/integration/alert-integration/alert-sources/bugsnag.mdx
index 29720a90..1b5a35b3 100644
--- a/en/on-call/integration/alert-integration/alert-sources/bugsnag.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/bugsnag.mdx
@@ -1,5 +1,6 @@
---
title: "BugSnag alert integration"
+sidebarTitle: "BugSnag"
description: "Send error events from a BugSnag project to Flashduty On-call through the Webhook data forwarding integration."
keywords: ["alert integration", "BugSnag", "webhook", "error monitoring", "data forwarding"]
---
@@ -9,7 +10,6 @@ Use the Webhook (data forwarding) integration of a BugSnag project to send error
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure BugSnag
----
The Webhook integration is configured per project and requires administrative privileges on the project. Configure it once for each project you want to connect.
@@ -82,14 +81,12 @@ The filters below the triggers, such as release stage and handled state, reduce
## Alert Key
----
Flashduty uses the BugSnag error ID (`error.errorId`) as the Alert Key. BugSnag groups repeated occurrences of the same exception into one error, and every occurrence, frequency notification, reopen, and state change of that error carries the same `errorId`, so they merge into one alert, which the error's state change recovers.
The per-occurrence event ID (`error.id`), error message, release stage, and severity do not change the Alert Key. Error events without `errorId` are rejected.
## Status and severity
----
Flashduty sets the alert severity from the error's severity (`error.severity`):
@@ -109,7 +106,6 @@ The trigger type sets the status:
| `errorStateManualChange` with state `reopened`, `snoozeCancelled`, or `unignored` | Trigger |
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -128,7 +124,6 @@ The trigger type sets the status:
| `url` | Link to the error in BugSnag |
## Troubleshooting
----
- **Flashduty returns a parameter error**: Confirm that the URL is complete and includes `integration_key`
- **No alert after clicking Test**: This is expected. The test request does not create an alert; verify with a real error
diff --git a/en/on-call/integration/alert-integration/alert-sources/calibre.mdx b/en/on-call/integration/alert-integration/alert-sources/calibre.mdx
index 0fdc51e4..1ffbf056 100644
--- a/en/on-call/integration/alert-integration/alert-sources/calibre.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/calibre.mdx
@@ -1,5 +1,6 @@
---
title: "Calibre alert integration"
+sidebarTitle: "Calibre"
description: "Send Calibre performance budget at-risk, exceeded and met notifications to Flashduty On-call through a site webhook."
keywords: ["alert integration", "Calibre", "performance budget", "Budget", "webhook", "Core Web Vitals"]
---
@@ -9,7 +10,6 @@ Use a Calibre site webhook to send performance budget status changes to Flashdut
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure Calibre
----
@@ -60,7 +59,6 @@ Calibre webhooks have no test button. You can also set a shared secret under **S
## Payload
----
The main fields of a budget notification are parsed directly, with no template to configure:
@@ -77,14 +75,12 @@ The main fields of a budget notification are parsed directly, with no template t
| `budgets` | Status and measured value per test profile and page | Written to the alert description |
## Alert Key
----
Flashduty builds the Alert Key from the site identifier `site_id` and the budget ID `id`. At-risk, exceeded and met notifications for the same budget carry the same Alert Key and land on one alert; different budgets or sites produce different alerts. Changing the budget name, status or measured value does not change the Alert Key.
If `id` or `site_id` is missing, Flashduty returns a parameter error because a met notification could not be tied to its alert reliably.
## Status and severity
----
| Calibre `status` | Flashduty state or severity |
| :--- | :--- |
@@ -95,7 +91,6 @@ If `id` or `site_id` is missing, Flashduty returns a parameter error because a m
A budget notification with an empty or any other `status` is rejected, so a request whose state cannot be determined never enters the wrong alert lifecycle.
## FAQ
----
@@ -112,7 +107,6 @@ No. A snapshot notification only reports a completed test run. Flashduty returns
## Troubleshooting
----
- **Calibre fails to deliver**: confirm the payload URL is the full push URL and includes `integration_key`
- **Flashduty returns a parameter error**: confirm the request is a budget notification with non-empty `id`, `site_id` and `status`
diff --git a/en/on-call/integration/alert-integration/alert-sources/canarytokens.mdx b/en/on-call/integration/alert-integration/alert-sources/canarytokens.mdx
index 28bf9d11..d62a6fe0 100644
--- a/en/on-call/integration/alert-integration/alert-sources/canarytokens.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/canarytokens.mdx
@@ -1,5 +1,6 @@
---
title: "Canarytokens alert integration"
+sidebarTitle: "Canarytokens"
description: "Send alerts from Canarytokens (canarytokens.org or self-hosted) to Flashduty On-call through a webhook when a honeytoken is touched."
keywords: ["alert integration", "Canarytokens", "webhook", "honeytoken", "canary", "intrusion detection", "security"]
---
@@ -9,7 +10,6 @@ Canarytokens, by Thinkst, creates decoys such as web bugs, DNS names, Word, Exce
## In Flashduty On-call
----
You can get the push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the push URL in either of the following ways.
## In Canarytokens
----
@@ -60,7 +59,6 @@ Canarytokens alerts are one-shot and are never recovered. In the channel that re
## Event types
----
Canarytokens posts one JSON object per event and never posts a recovery.
@@ -71,17 +69,14 @@ Canarytokens posts one JSON object per event and never posts a recovery.
| The test request sent when the webhook is saved | Creates a separate Info alert that never recovers |
## Alert Key
----
Flashduty computes the Alert Key from `token`, the token's fixed identifier. A token touched from different source IPs or through different channels keeps one Alert Key, and changes to the memo, source IP or time do not change it. A request without `token` is rejected. An exposure notice uses `token` plus `key_id`, so it never merges into the token's hit alert.
## Status and severity
----
A honeytoken has no legitimate visitors, so any touch may be an intrusion and hit alerts are always Critical. Exposure notices are Warning and the test request is Info. To grade tokens differently, adjust severity with a channel route or alert processing rule on a label such as `token_type`.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -97,12 +92,10 @@ A honeytoken has no legitimate visitors, so any touch may be an intrusion and hi
The `manage_url` in the payload carries the auth parameter that controls the token. Flashduty neither reads nor stores it. Use the Canarytokens management page to see the token's details and hit history.
## About signatures
----
The Canarytokens webhook has no signature and sends no dedicated header, so Flashduty does not verify one. The `integration_key` in the push URL is the only credential; keep it private.
## Troubleshooting
----
- **Flashduty receives nothing**: make sure the webhook URL is publicly reachable and not a private address. Canarytokens times out after 2 seconds and does not retry
- **The token's webhook was disabled**: Canarytokens disables a webhook after 5 consecutive errors. Fix the push URL and save the webhook again, and confirm the push URL is complete and includes `integration_key`
diff --git a/en/on-call/integration/alert-integration/alert-sources/catchpoint.mdx b/en/on-call/integration/alert-integration/alert-sources/catchpoint.mdx
index f49f930f..f15218c0 100644
--- a/en/on-call/integration/alert-integration/alert-sources/catchpoint.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/catchpoint.mdx
@@ -1,5 +1,6 @@
---
title: "Catchpoint alert integration"
+sidebarTitle: "Catchpoint"
description: "Send Catchpoint test alert, escalation, and recovery events to Flashduty On-call through a custom Alert Webhook template."
keywords: ["alert integration", "Catchpoint", "Alert Webhook", "template", "TestId"]
---
@@ -11,14 +12,12 @@ Catchpoint's [default JSON Alert Webhook format](https://docs.catchpoint.com/doc
## In Flashduty On-call
----
Create either a dedicated or shared **Catchpoint** alert integration and copy its complete Push URL.
## Configure Catchpoint
----
@@ -82,7 +81,6 @@ Let a test actually trigger a Warning or Critical alert, and confirm Flashduty r
## Alert Key
----
Flashduty derives the Alert Key from `test_id`, `alert_group_item_id`, and `alert_initial_trigger_epoch` combined.
@@ -91,7 +89,6 @@ Catchpoint's own [PagerDuty Events API v2 integration template](https://docs.cat
Changes to the title, description, severity, number of triggered nodes, or threshold never change the Alert Key.
## Status and alert severity
----
Catchpoint's `notification_level_id` has 4 documented values:
@@ -105,7 +102,6 @@ Catchpoint's `notification_level_id` has 4 documented values:
A request with an empty or unsupported `notification_level_id` is rejected. The Improved notification does not say which level the alert recovered from, so Flashduty shows it at Critical severity; the actual state is the recovery (Ok) status.
## Troubleshooting
----
- **Flashduty returns a parameter error**: confirm **Format** is set to **Template** and the template is valid JSON; confirm `test_id`, `alert_group_item_id`, and `alert_initial_trigger_epoch` are still in the template and their macros were not removed or swapped for another macro
- **No alert is created**: confirm the endpoint is selected under **API Endpoints** in the **Alerts** settings of the Test/Folder/Product, or that **Apply to All Alerts** is enabled on the endpoint
diff --git a/en/on-call/integration/alert-integration/alert-sources/cato.mdx b/en/on-call/integration/alert-integration/alert-sources/cato.mdx
index 0042798a..c93569d6 100644
--- a/en/on-call/integration/alert-integration/alert-sources/cato.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/cato.mdx
@@ -1,5 +1,6 @@
---
title: "Cato Networks Alert Integration"
+sidebarTitle: "Cato Networks"
description: "Send Site Operations stories and other alerts from the Cato Management Application (CMA) to Flashduty On-call through a custom-body webhook."
keywords: ["alert integration", "Cato Networks", "Cato", "SASE", "webhook", "Site Operations"]
---
@@ -9,7 +10,6 @@ Cato Networks webhooks have no fixed request body; you write the body in CMA. Th
## In Flashduty On-call
----
Get the push URL in either of the following ways.
@@ -30,14 +30,13 @@ Get the push URL in either of the following ways.
## In Cato
----
You need permission to manage Subscriptions in CMA.
-1. In CMA, go to **Account > Subscriptions**, open the **Webhooks** tab, and click **New Webhook**
+1. In CMA, go to **Account → Subscriptions**, open the **Webhooks** tab, and click **New Webhook**
2. Enter a name and enable it
3. Choose **POST** (Create) as the request method and paste the full Flashduty push URL, which includes `integration_key`
4. No authentication is needed; `integration_key` is already in the URL
@@ -71,7 +70,7 @@ Field definitions: [Understanding the JSON Fields for Alert Integrations](https:
-1. Under **Account > Subscriptions**, add this webhook as a delivery target for the alert types you want (Site Operations stories and so on)
+1. Under **Account → Subscriptions**, add this webhook as a delivery target for the alert types you want (Site Operations stories and so on)
2. Click **Test** on the webhook page. The Cato documentation does not show the test request body, and Flashduty handles it as a normal alert: without `storyId` and `correlationId` it returns a parameter error, otherwise it opens a separate alert that you close manually after the check
3. Trigger a real event (for example, disconnect the Socket of a test site), confirm Flashduty receives an active alert, then confirm it recovers when the story resolves
@@ -83,12 +82,10 @@ Field definitions: [Understanding the JSON Fields for Alert Integrations](https:
## Alert Key
----
Flashduty uses `storyId` as the Alert Key, and `correlationId` when `storyId` is empty. Cato defines `storyId` as "Unique identifier for the Site Operations story" and `correlationId` as "Unique identifier used to correlate related events, messages, or operations". Changes to title, level or time never change the Alert Key. A request with neither field is rejected with the field name.
## Status and severity
----
An alert recovers when `storyStatus` is `RESOLVED` or `endDate` is not empty; other states such as `OPEN` and `IN_PROGRESS` trigger or update it. Severity comes from `level`:
@@ -101,7 +98,6 @@ An alert recovers when `storyStatus` is `RESOLVED` or `endDate` is not empty; ot
| Empty or other | Warning |
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -116,7 +112,6 @@ An alert recovers when `storyStatus` is `RESOLVED` or `endDate` is not empty; ot
| `isp` | `ISPName` |
## Troubleshooting
----
- **Cato test fails**: confirm the URL is complete, includes `integration_key`, and the method is POST
- **Flashduty returns a parameter error**: confirm the body is valid JSON and contains `storyId` or `correlationId`. If a title or subject contains double quotes, Cato's substitution may break the JSON; remove the `title` or `subject` field from the template
diff --git a/en/on-call/integration/alert-integration/alert-sources/censys.mdx b/en/on-call/integration/alert-integration/alert-sources/censys.mdx
index b4684953..487cf4a4 100644
--- a/en/on-call/integration/alert-integration/alert-sources/censys.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/censys.mdx
@@ -1,5 +1,6 @@
---
title: "Censys alert integration"
+sidebarTitle: "Censys"
description: "Send new risks found by Censys ASM to Flashduty On-call through a webhook."
keywords: ["alert integration", "Censys", "Censys ASM", "webhook", "attack surface management", "risk"]
---
@@ -9,7 +10,6 @@ Use the Webhook Connection of Censys Attack Surface Management (ASM) to send new
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## In Censys ASM
----
Webhook Connection is available only at the Advanced and Enterprise access levels of Censys ASM. If your firewall or gateway restricts source IPs, allow the Censys egress addresses `52.5.142.59`, `34.226.132.221`, and `52.54.43.157`.
@@ -67,14 +66,12 @@ The Censys webhook documentation describes no test button. When ASM finds a new
## Alert Key
----
Flashduty computes the Alert Key from `event.data.risk_id` (the risk type ID) and `event.data.impacted_asset` (the affected asset, such as `Host: 1.1.1.1`). Censys defines a risk instance as one risk type on one asset, but does not state that `risk_id` and `impacted_asset` stay unchanged across deliveries. The same risk type on the same asset gets the same Alert Key, so repeated deliveries merge into one alert; the same risk type on different assets, or different risk types on one asset, produce separate alerts.
Changes to the risk name, description, severity, first and last seen times, or the event ID do not change the Alert Key. An event without `risk_id` or `impacted_asset` is rejected. An event whose `event.type` is not `risk_instance_opened` creates no alert; Flashduty acknowledges it and returns success.
## Status and severity
----
Every event is a trigger. Flashduty sets the severity from `risk_severity`:
@@ -86,7 +83,6 @@ Every event is a trigger. Flashduty sets the severity from `risk_severity`:
| Empty or other | Warning |
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -103,7 +99,6 @@ Every event is a trigger. Flashduty sets the severity from `risk_severity`:
The alert title is the risk description (`risk_description`, or the risk name when empty) followed by the affected asset.
## Troubleshooting
----
- **Webhook Connection is missing**: check that the Censys ASM access level is Advanced or Enterprise
- **The integration does not work**: Censys requires the receiver to accept the top-level `event` field; the Flashduty push URL needs no extra handling
diff --git a/en/on-call/integration/alert-integration/alert-sources/centreon.mdx b/en/on-call/integration/alert-integration/alert-sources/centreon.mdx
index b19c2719..9521918b 100644
--- a/en/on-call/integration/alert-integration/alert-sources/centreon.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/centreon.mdx
@@ -1,5 +1,6 @@
---
title: "Centreon Alert Integration"
+sidebarTitle: "Centreon"
description: "Push Centreon host and service alerts to the Flashduty PagerDuty Compatible integration through Centreon's PagerDuty Events stream connector; recovery states close the alerts automatically."
keywords: ["alert integration", "Centreon", "stream connector", "PagerDuty", "Broker", "infrastructure monitoring"]
---
@@ -9,7 +10,6 @@ Centreon ships a PagerDuty Events stream connector (`pagerduty-events-apiv2.lua`
## In Flashduty On-call
----
Get an integration push URL in either of the two ways below. **Choose the PagerDuty Compatible integration type** in both, not Centreon.
@@ -30,7 +30,6 @@ Get an integration push URL in either of the two ways below. **Choose the PagerD
## Configure in Centreon
----
### Step 1: Install the stream connector
@@ -50,19 +49,19 @@ apt install centreon-stream-connector-pagerduty
2. On the **Output** tab, select **Generic - Stream connector** and click **Add** to add an output
3. Fill in the fields as follows:
-| Field | Value |
-| :--- | :--- |
-| Name | `Flashduty` |
-| Path | `/usr/share/centreon-broker/lua/pagerduty-events-apiv2.lua` |
-| Filter category | `Neb` |
+ | Field | Value |
+ | :--- | :--- |
+ | Name | `Flashduty` |
+ | Path | `/usr/share/centreon-broker/lua/pagerduty-events-apiv2.lua` |
+ | Filter category | `Neb` |
4. Click **+Add a new entry** below the **Filter category** table to add these parameters:
-| Type | Name | Value |
-| :--- | :--- | :--- |
-| string | `pdy_routing_key` | The `integration_key` value from the push URL above (mandatory parameter) |
-| string | `http_server_url` | The full push URL (including `integration_key`) |
-| string | `pdy_centreon_url` | The address of your Centreon server (optional, used for the link in the alert) |
+ | Type | Name | Value |
+ | :--- | :--- | :--- |
+ | string | `pdy_routing_key` | The `integration_key` value from the push URL above (mandatory parameter) |
+ | string | `http_server_url` | The full push URL (including `integration_key`) |
+ | string | `pdy_centreon_url` | The address of your Centreon server (optional, used for the link in the alert) |
5. Deploy the configuration and restart `centengine` on all pollers:
@@ -83,7 +82,6 @@ curl -X POST -H 'content-type: application/json' '' -d '{"dedup_key":"
Flashduty should return HTTP 202 and an alert should appear; send it again with `event_action` set to `resolve` and the alert recovers.
## Field mapping
----
How the fields sent by the Centreon connector (see the connector source) map to Flashduty:
@@ -107,14 +105,12 @@ Severity set by the connector for each Centreon state:
| Service UNKNOWN | `error` | Critical |
## Recovery and deduplication
----
- A host or service always uses the same Alert Key, so a change from WARNING to CRITICAL updates the same alert and a return to OK or UP recovers it
- With the connector library's default parameters only HARD states are sent, and objects that are acknowledged or in scheduled downtime are not sent; to change this, adjust `hard_only`, `acknowledged` and `in_downtime` in the connector parameters
- To push only some objects, use the connector's filter parameters such as `accepted_hostgroups`, `accepted_servicegroups` and `accepted_pollers`
## Troubleshooting
----
- **Flashduty receives no alert**: check `/var/log/centreon-broker/pagerduty-events.log` (the default log file; `log_level` goes up to 3); confirm `http_server_url` is the full push URL and `pdy_routing_key` is set
- **The connector log shows a failed POST**: the connector only treats HTTP 202 as success, and Flashduty answers PagerDuty Events API v2 requests with 202; for other status codes, check that `integration_key` is correct
diff --git a/en/on-call/integration/alert-integration/alert-sources/cert-spotter.mdx b/en/on-call/integration/alert-integration/alert-sources/cert-spotter.mdx
index 7ace2c11..769c4158 100644
--- a/en/on-call/integration/alert-integration/alert-sources/cert-spotter.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/cert-spotter.mdx
@@ -1,5 +1,6 @@
---
title: "Cert Spotter alert integration"
+sidebarTitle: "Cert Spotter"
description: "Sync unknown certificates detected by Cert Spotter to Flashduty On-call through a webhook."
keywords: ["alert integration", "Cert Spotter", "SSLMate", "Certificate Transparency", "unauthorized certificate", "webhook"]
---
@@ -9,7 +10,6 @@ Cert Spotter is SSLMate's certificate monitoring service. It continuously watche
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Cert Spotter
----
Webhook notifications are available on the Cert Spotter Startup plan and above. The Hobbyist plan only sends email.
@@ -59,7 +58,6 @@ Cert Spotter has no button that sends a test delivery. Issue a new certificate f
## Payload
----
| Cert Spotter event | Result in Flashduty |
| :--- | :--- |
@@ -69,19 +67,16 @@ Cert Spotter has no button that sends a test delivery. Issue a new certificate f
Cert Spotter sends expiration reminders and installation problems only by email and Slack, not by webhook, so they do not reach this integration.
## Alert Key
----
Flashduty uses the ID of the certificate issuance (`id` in the webhook) as the Alert Key. A network problem can deliver the same request more than once; the duplicate carries the same `id` and merges into the same alert. Different certificates create different alerts.
Deliveries without `id` are rejected.
## Severity
----
Cert Spotter sends no severity, so every unknown certificate triggers a **Warning** alert. Whether the certificate has been revoked is recorded in the `revoked` label and does not change the severity.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -99,7 +94,6 @@ Cert Spotter sends no severity, so every unknown certificate triggers a **Warnin
The alert title is `Unknown certificate for `, followed by `(+N more)` when the certificate covers several names.
## FAQ
----
diff --git a/en/on-call/integration/alert-integration/alert-sources/cfengine.mdx b/en/on-call/integration/alert-integration/alert-sources/cfengine.mdx
index a66ac260..48409462 100644
--- a/en/on-call/integration/alert-integration/alert-sources/cfengine.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/cfengine.mdx
@@ -1,5 +1,6 @@
---
title: "CFEngine alert integration"
+sidebarTitle: "CFEngine"
description: "Send CFEngine Enterprise alerts to Flashduty On-call through a Mission Portal custom action script. Alerts close automatically when the CFEngine alert clears."
keywords: ["alert integration", "CFEngine", "Mission Portal", "Custom action"]
---
@@ -11,7 +12,6 @@ The CFEngine Enterprise Mission Portal has no webhook notification method, but a
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can get the integration push URL in either of the following ways.
## Configure CFEngine
----
The steps below are based on CFEngine Enterprise 3.27. Uploading custom action scripts and associating them with alerts requires the admin role in Mission Portal. The script only needs `bash` and `curl` on the hub.
@@ -97,7 +96,6 @@ CFEngine has no "send test notification" button. To verify a real alert, make th
## Alert Key
----
Flashduty uses the CFEngine alert ID `ALERT_ID` as the Alert Key. The CFEngine documentation describes it as the alert's unique ID. The trigger, reminder, and clear deliveries of one alert carry the same `ALERT_ID`, so they land on the same Flashduty alert. Changes to the alert name, severity, failed host count, or timestamps do not change the Alert Key.
@@ -106,7 +104,6 @@ Flashduty uses the CFEngine alert ID `ALERT_ID` as the Alert Key. The CFEngine d
Flashduty rejects a request that has no `ALERT_ID`, or whose `ALERT_STATUS` is not `fail` or `success`.
## Alert lifecycle
----
One CFEngine alert covers all the hosts it is defined for. Flashduty creates one alert for it and records the failed host count in the description and labels.
@@ -117,7 +114,6 @@ One CFEngine alert covers all the hosts it is defined for. Flashduty creates one
| Alert cleared | `success` | Recover the alert |
## Alert severity
----
The severity comes from the severity selected when the alert was created, `ALERT_SEVERITY`:
@@ -131,7 +127,6 @@ The severity comes from the severity selected when the alert was created, `ALERT
A recovery event keeps the alert's severity.
## Alert content
----
- **Title**: the alert name `ALERT_NAME`
- **Description**: the condition description `ALERT_CONDITION_DESCRIPTION`, followed by `Triggered on of hosts.`
@@ -140,7 +135,6 @@ A recovery event keeps the alert's severity.
Timestamp parameters (`ALERT_LAST_CHECK`, `ALERT_LAST_EVENT_TIME`, `ALERT_LAST_STATUS_CHANGE`), `ALERT_STATUS`, and the condition description are not written to labels, and neither are empty parameters. Each alert holds at most 50 labels; if there are more, the ones beyond the limit in name order are dropped.
## Troubleshooting
----
- **The script reports HTTP 4xx**: confirm that `FLASHDUTY_URL` is the full push URL and includes `integration_key`
- **The script cannot be selected in Mission Portal**: confirm that the current user has the admin role and that the script is saved under **Custom notification scripts**
diff --git a/en/on-call/integration/alert-integration/alert-sources/check-point-smartevent.mdx b/en/on-call/integration/alert-integration/alert-sources/check-point-smartevent.mdx
index 477aa5b5..c30858bb 100644
--- a/en/on-call/integration/alert-integration/alert-sources/check-point-smartevent.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/check-point-smartevent.mdx
@@ -1,5 +1,6 @@
---
title: "Check Point SmartEvent Alert Integration"
+sidebarTitle: "Check Point SmartEvent"
description: "Check Point SmartEvent automatic reactions can send email. Use the Flashduty Email integration to bring SmartEvent events into Flashduty."
keywords: ["alert integration", "Check Point", "SmartEvent", "email", "security events"]
---
@@ -9,7 +10,6 @@ SmartEvent automatic reactions offer Mail, SNMP Trap, Block Source, Block Event
## In Flashduty On-call
----
You can get the integration email address in either of two ways. **Choose the Email integration type in both cases**, not Check Point.
@@ -29,12 +29,10 @@ You can get the integration email address in either of two ways. **Choose the Em
## Confirm the push mode in Flashduty
----
SmartEvent sends one mail per event and no recovery mail, and the subject carries the event number (see [Mail subject format](#mail-subject-format)), so every mail is an independent event. Set the Email integration's push mode to the one that always triggers a new alert (the create page may preselect a different mode, so check it): each mail creates a new alert whose title is the mail subject and whose description is the mail body. No trigger or close rules are needed.
## In Check Point SmartConsole
----
Paths follow the Check Point R81.10 administration guide.
@@ -47,12 +45,10 @@ Paths follow the Check Point R81.10 administration guide.
7. Save, reference the automatic reaction in the event definitions you want notifications for, and install the policy
## Mail subject format
----
The default **Subject** of the Mail reaction is `[EventNumber] - [Severity] - [Name]`: event number, severity and event name. Flashduty uses the mail subject as the alert title.
## Limitations
----
- **No recovery**: SmartEvent sends no recovery mail. Enable [auto-resolve timeout](/en/on-call/channel/create-edit) on the channel that receives this integration (24 hours suggested), or close alerts manually in Flashduty.
- **No deduplication**: the subject contains the event number, so each event creates its own alert.
diff --git a/en/on-call/integration/alert-integration/alert-sources/checkly.mdx b/en/on-call/integration/alert-integration/alert-sources/checkly.mdx
index bcbd931f..ee38a87d 100644
--- a/en/on-call/integration/alert-integration/alert-sources/checkly.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/checkly.mdx
@@ -1,5 +1,6 @@
---
title: "Checkly alert integration"
+sidebarTitle: "Checkly"
description: "Send Checkly failure, degradation, recovery, and SSL certificate alerts to Flashduty On-call through a Webhook Alert Channel."
keywords: ["alert integration", "Checkly", "webhook", "synthetic monitoring", "API monitoring"]
---
@@ -9,14 +10,12 @@ Use a Checkly Webhook Alert Channel to send check-state changes to Flashduty On-
## In Flashduty On-call
----
Create either a dedicated or shared **Checkly** alert integration and copy its complete Push URL.
## Configure Checkly
----
@@ -81,7 +80,6 @@ A Checkly test notification or webhook HTTP 200 proves connectivity only. Use re
## Alert Key
----
Normal check-state notifications use the trimmed `check_id` (Checkly variable `CHECK_ID`) as the Alert Key. Titles, errors, run locations, response times, result IDs, and alert-state changes do not affect it.
@@ -92,7 +90,6 @@ If `check_id` is missing or empty, Flashduty accepts the request and generates a
`ALERT_SSL` is an independent one-shot Warning event. It always receives a new random UUID, even when the payload includes `check_id`, and does not update or recover the Check's normal state alert.
## Status and severity
----
| Checkly `ALERT_TYPE` | Flashduty status | Flashduty severity |
| :--- | :--- | :--- |
@@ -106,7 +103,6 @@ If `check_id` is missing or empty, Flashduty accepts the request and generates a
An empty or unknown `alert_type` returns an invalid-parameter response. Recovery is determined only by `alert_type`, not by the title or error text.
## Labels and description
----
Flashduty creates these labels:
@@ -134,7 +130,6 @@ The request body, labels, and description all have hard limits, handled as follo
A label value that is empty after trimming is not written to the alert.
## Delivery and troubleshooting
----
Checkly retries a failed webhook delivery up to five times at approximately 20-second intervals. Use Checkly's Alert Notification Log to inspect the final delivery result.
diff --git a/en/on-call/integration/alert-integration/alert-sources/checkmk.mdx b/en/on-call/integration/alert-integration/alert-sources/checkmk.mdx
index 933451ec..e1fc9c5f 100644
--- a/en/on-call/integration/alert-integration/alert-sources/checkmk.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/checkmk.mdx
@@ -1,5 +1,6 @@
---
title: "Checkmk alert integration"
+sidebarTitle: "Checkmk"
description: "Send Checkmk host and service notifications to Flashduty On-call through a notification script. Alerts close automatically when the problem recovers."
keywords: ["alert integration", "Checkmk", "Check_MK", "notification script", "Nagios"]
---
@@ -9,7 +10,6 @@ Checkmk has no generic webhook notification method. This integration provides a
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure Checkmk
----
The steps below are based on Checkmk 2.5. Menu names may differ slightly in other 2.x versions. The script only needs the Python 3 that ships with Checkmk; nothing else has to be installed.
@@ -113,7 +112,6 @@ You can also send a test from **Test notifications** under **Setup → Events
## Alert Key
----
Flashduty computes the Alert Key from the host name `HOSTNAME` and the service name `SERVICEDESC`. Host notifications use an empty service name. Problem and recovery notifications for the same host or service carry the same host and service names, so they land on the same alert. When the state rises to a higher severity (for example a service going from WARN to CRIT), Flashduty opens a new alert at the higher severity and keeps the earlier alert open; the recovery notification closes both.
@@ -122,7 +120,6 @@ Changes to the state, plugin output, notification number, time, host address, si
Flashduty rejects a request that lacks `HOSTNAME`, `WHAT`, the current state, or `NOTIFICATIONTYPE`, and a service notification that lacks `SERVICEDESC`.
## Alert lifecycle
----
Checkmk sends a recovery notification only after it has sent a problem notification. Acknowledgement, downtime, flapping, and custom notifications are also sent when the problem notification was suppressed (for example while a service flaps). An alert opened from them would never get a recovery notification to close it. So only problem notifications open alerts, and Flashduty handles each notification type `NOTIFICATIONTYPE` as follows:
@@ -139,7 +136,6 @@ While a service flaps, Checkmk sends no state change notifications: a return to
Ignored notifications get a success response, so Checkmk does not retry them.
## Severity
----
Severity comes from the current state: `SERVICESTATE` for service notifications and `HOSTSTATE` for host notifications.
@@ -155,7 +151,6 @@ Severity comes from the current state: `SERVICESTATE` for service notifications
A recovery event takes the severity of the hard state before recovery (`PREVIOUSSERVICEHARDSTATE` or `PREVIOUSHOSTHARDSTATE`).
## Alert content
----
- **Title**: ` on ` for service notifications, `Host ` for host notifications
- **Description**: the plugin output `SERVICEOUTPUT` or `HOSTOUTPUT`, followed by the long output when present
@@ -164,7 +159,6 @@ A recovery event takes the severity of the hard state before recovery (`PREVIOUS
Each alert carries at most 50 labels. When there are more, labels beyond the limit are dropped in name order. Contact details such as contact names and email addresses are not written to labels.
## Troubleshooting
----
- **Flashduty is not listed as a method in Checkmk**: make sure the script is in the site's `local/share/check_mk/notifications/` directory, is named `flashduty`, is executable, and has `# Flashduty` on its second line
- **No notification is sent**: check the site's `var/log/notify.log` to confirm the rule matched the event and that the user under **Recipient** has not disabled notifications
diff --git a/en/on-call/integration/alert-integration/alert-sources/chronosphere.mdx b/en/on-call/integration/alert-integration/alert-sources/chronosphere.mdx
index 4cf9fd55..1909517a 100644
--- a/en/on-call/integration/alert-integration/alert-sources/chronosphere.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/chronosphere.mdx
@@ -1,5 +1,6 @@
---
title: "Chronosphere Alert Integration"
+sidebarTitle: "Chronosphere"
description: "Receive Chronosphere alerts through Chronosphere's webhook notifier using a Flashduty Prometheus integration; with resolved notifications on, alerts close automatically."
keywords: ["alert integration", "Chronosphere", "webhook", "Prometheus", "Alertmanager", "observability"]
---
@@ -9,7 +10,6 @@ Chronosphere's webhook notifier sends an HTTP POST to the URL you enter. The bod
## In Flashduty On-call
----
Get an integration push URL in either of the two ways below. **Choose the Prometheus integration type** in both, not Chronosphere.
@@ -30,7 +30,6 @@ Get an integration push URL in either of the two ways below. **Choose the Promet
## Configure in Chronosphere
----
@@ -59,7 +58,6 @@ Trigger an alert from a monitor and confirm Flashduty receives an active alert;
## Field mapping
----
| Chronosphere field | Flashduty |
| :--- | :--- |
@@ -75,7 +73,6 @@ Trigger an alert from a monitor and confirm Flashduty receives an active alert;
One notification can carry several alerts, and Flashduty handles each one separately (up to 100 per request).
## Recovery and deduplication
----
- When Chronosphere sends a notification with `status` set to `resolved`, Flashduty closes the alert with the same `fingerprint`.
- If the notifier does not send resolved notifications, Flashduty never receives a recovery request and the alert stays active. In that case enable [auto-resolve timeout](/en/on-call/channel/create-edit) on the channel.
@@ -83,7 +80,6 @@ One notification can carry several alerts, and Flashduty handles each one separa
- Chronosphere's documentation does not say whether the webhook notifier has a test send. After the first setup, verify with a real alert that both the trigger and the recovery show up in Flashduty.
## Troubleshooting
----
- **Flashduty returns `Invalid parameters`**: the push URL is incomplete and lacks `integration_key`, or the integration type is not Prometheus
- **Alerts do not recover**: confirm the notifier has **Notify when resolved** selected (`send_resolved` is `true` in Terraform, `skip_resolved` is `false` in Chronoctl) and that the resolved notification's `fingerprint` matches the trigger
diff --git a/en/on-call/integration/alert-integration/alert-sources/circonus.mdx b/en/on-call/integration/alert-integration/alert-sources/circonus.mdx
index b301dd48..db5a7905 100644
--- a/en/on-call/integration/alert-integration/alert-sources/circonus.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/circonus.mdx
@@ -1,5 +1,6 @@
---
title: "Circonus alert integration"
+sidebarTitle: "Circonus"
description: "Send alert and recovery notifications from Circonus rulesets to Flashduty On-call through a contact group webhook."
keywords: ["alert integration", "Circonus", "webhook", "contact group", "alert_id"]
---
@@ -9,7 +10,6 @@ Use the webhook contact method of a Circonus contact group to send alerts raised
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Circonus
----
@@ -63,14 +62,12 @@ Let a rule fire and confirm Flashduty shows an active alert, then let the metric
## Alert Key
----
Flashduty uses the `alert_id` of each alert as the Alert Key. The Circonus alert link has the form `...fault-detection?alert_id=`, and a recovery notification carries all fields of the original alert plus `clear_value` and `clear_time`, so the trigger and the recovery share one `alert_id`.
The `alerts` array of one request can hold several alerts; each becomes its own Flashduty event. Changes to the rule, metric, severity, value, or time never change the Alert Key. A request whose alert has no `alert_id` is rejected, because a later recovery could not be matched.
## Status and severity
----
Circonus severities run from 1 to 5, where 1 is the most severe.
@@ -84,7 +81,6 @@ Circonus severities run from 1 to 5, where 1 is the most severe.
A notification with `clear_time` or `clear_value` is treated as a recovery and keeps the original severity. A body with no `alerts`, or an empty `alerts` array, returns success and creates no alert.
## Troubleshooting
----
- **Flashduty returns an invalid-parameter error**: check that the URL ends with `&format=json` and that every alert has a non-empty `alert_id`
- **The alert does not recover**: check that the contact group is assigned to that severity of the rule and that Circonus has cleared the alert; the recovery must carry the same `alert_id` as the trigger
diff --git a/en/on-call/integration/alert-integration/alert-sources/cloudamqp.mdx b/en/on-call/integration/alert-integration/alert-sources/cloudamqp.mdx
index e4502985..18b2d1b1 100644
--- a/en/on-call/integration/alert-integration/alert-sources/cloudamqp.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/cloudamqp.mdx
@@ -1,5 +1,6 @@
---
title: "CloudAMQP alert integration"
+sidebarTitle: "CloudAMQP"
description: "Send CloudAMQP instance alarms (queue depth, consumers, CPU, memory, disk, connections, and more) to Flashduty On-call through a webhook recipient."
keywords: ["alert integration", "CloudAMQP", "webhook", "RabbitMQ", "LavinMQ", "message queue"]
---
@@ -9,7 +10,6 @@ Use a webhook recipient of CloudAMQP alarms to send instance alarms to Flashduty
## In Flashduty On-call
----
You can get the push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the push URL in either of the following ways.
## In CloudAMQP
----
@@ -59,7 +58,6 @@ To get repeated reminders, set a **Reminder interval** on the alarm (minimum 30
## Event types
----
CloudAMQP pushes one alarm subject per request, as JSON.
@@ -72,17 +70,14 @@ CloudAMQP pushes one alarm subject per request, as JSON.
CloudAMQP retries when the webhook returns a non-2xx status. Duplicate pushes carry the same Alert Key and merge into one alert.
## Alert Key
----
Flashduty computes the Alert Key from `dedup_key`. It combines the alarm type and its subject (for a queue alarm, `queue::/`), and the trigger, reminder, and resolve pushes of one subject carry the same value. Changes to the threshold, time threshold, current value, or subject text do not change the Alert Key. A request without `dedup_key` is rejected.
## Status and severity
----
CloudAMQP pushes carry no severity, so every alarm type is Warning in Flashduty, and `resolved: true` recovers the alert. To distinguish severity, use a label such as `alarm_type` in the channel's routing or alert processing rules.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -96,7 +91,6 @@ CloudAMQP pushes carry no severity, so every alarm type is Warning in Flashduty,
| `data_*` | Fields of the `data` object, such as `data_value`, `data_name`, `data_type` |
## Troubleshooting
----
- **Flashduty receives nothing**: confirm the webhook recipient is added to the alarm's Recipients, and check the recipient's status column in the alarms list for errors
- **Invalid parameter error**: confirm the URL is complete and includes `integration_key`
diff --git a/en/on-call/integration/alert-integration/alert-sources/cloudflare.mdx b/en/on-call/integration/alert-integration/alert-sources/cloudflare.mdx
index c88560e6..23bd3f3e 100644
--- a/en/on-call/integration/alert-integration/alert-sources/cloudflare.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/cloudflare.mdx
@@ -1,5 +1,6 @@
---
title: "Cloudflare Alert Events"
+sidebarTitle: "Cloudflare"
description: "Sync Cloudflaret alert events to Flashduty via webhook for automated alert noise reduction"
---
@@ -8,47 +9,47 @@ Sync Cloudflare alert events to Flashduty via webhook for automated alert noise
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this method when you don't need to route alert events to different channels - it's simpler.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Cloudflare** integration and click **Save** to generate a card
4. Click the generated card to view the **Push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this method when you need to route alerts to different channels based on the alert event payload.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Cloudflare** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In Cloudflare
----
-## 一、Create Notification Object
+### Create Notification Object
1. Log in to the `Cloudflare dashboard` and select your account.
2. Go to `Notifications` > `Destinations`.
3. In the `Webhooks` card, select Create.
@@ -59,7 +60,7 @@ After configuring the Webhook channel, you can use it in notification policies.
-## 二、Status Mapping
+## Status Mapping
diff --git a/en/on-call/integration/alert-integration/alert-sources/clustercontrol.mdx b/en/on-call/integration/alert-integration/alert-sources/clustercontrol.mdx
index 2acd4271..53638f23 100644
--- a/en/on-call/integration/alert-integration/alert-sources/clustercontrol.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/clustercontrol.mdx
@@ -1,5 +1,6 @@
---
title: "ClusterControl alert integration"
+sidebarTitle: "ClusterControl"
description: "Send Severalnines ClusterControl alarm and recovery notifications to Flashduty On-call through the Notification Services webhook."
keywords: ["alert integration", "ClusterControl", "Severalnines", "Notification Services", "webhook", "database operations", "cmon-events"]
---
@@ -9,7 +10,6 @@ Use **Notification Services → Webhook** in Severalnines ClusterControl to send
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## In ClusterControl
----
@@ -62,7 +61,6 @@ ClusterControl only notifies for alarms raised after the integration is created;
## Payload
----
ClusterControl POSTs the following JSON fields. Flashduty parses them directly, with no template to configure:
@@ -80,7 +78,6 @@ ClusterControl POSTs the following JSON fields. Flashduty parses them directly,
The alert title is `title`; when empty, it is `ClusterControl alarm `.
## Alert Key
----
Flashduty uses the alarm `id` as the Alert Key. The ClusterControl documentation states that when an alarm ends it sends another event with the same alarm ID and `status` set to `ENDED`, so the created, changed and ended notifications land on the same Flashduty alert, and different `id` values produce different alerts. Changing the title, host or severity does not change the Alert Key.
@@ -89,7 +86,6 @@ The documented payload has no cluster ID (ClusterControl 2.1.0 also sends `contr
When a request has no `id`, Flashduty returns a parameter error, because a recovery could not be matched to its alert reliably.
## Status and severity
----
| ClusterControl field | Flashduty status or severity |
| :--- | :--- |
@@ -101,7 +97,6 @@ When a request has no `id`, Flashduty returns a parameter error, because a recov
A request whose `status` is empty or any other value is rejected, so a request with an unknown state never enters the wrong alert lifecycle. ClusterControl forwards only `CREATED` and `ENDED` by default; `CHANGED` must be enabled with the `allowed_events` parameter of `cmon-events`.
## FAQ
----
@@ -124,7 +119,6 @@ In ClusterControl, a muted alarm type sends no notification until it is unmuted.
## Troubleshooting
----
- **Flashduty receives no alert**: confirm the URL is the complete push URL (including `integration_key`), that the `cmon-events` process is running, and that notifications are enabled for the cluster and events
- **Flashduty returns a parameter error**: confirm the body is ClusterControl's JSON and that `id` and `status` are not empty
diff --git a/en/on-call/integration/alert-integration/alert-sources/consul.mdx b/en/on-call/integration/alert-integration/alert-sources/consul.mdx
index 716e72b4..ea8c5a84 100644
--- a/en/on-call/integration/alert-integration/alert-sources/consul.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/consul.mdx
@@ -1,5 +1,6 @@
---
title: "HashiCorp Consul alert integration"
+sidebarTitle: "HashiCorp Consul"
description: "Send HashiCorp Consul health check failures and recoveries to Flashduty On-call through a checks watch with an HTTP handler on a Consul agent."
keywords: ["alert integration", "Consul", "HashiCorp Consul", "watch", "health check", "http_handler_config"]
---
@@ -11,7 +12,6 @@ This integration works with both Consul Community Edition and Consul Enterprise.
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -20,7 +20,7 @@ You can obtain an integration push URL in either of the following ways.
Choose this method when you do not need to route alerts to different channels.
-
+
1. In the Flashduty console, select **Channel** and open a channel
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration**
@@ -35,7 +35,7 @@ Choose this method when you do not need to route alerts to different channels.
Choose this method when you need to route alerts to different channels based on the payload.
-
+
1. In the Flashduty console, select **Integration Center → Alert Events**
2. Select **HashiCorp Consul** and enter an integration name
@@ -48,7 +48,6 @@ Choose this method when you need to route alerts to different channels based on
## How it works
----
Whenever any watched health check changes (its status or its output), a Consul watch of type `checks` POSTs the current state of **all** watched checks to the push URL as one JSON array. Flashduty turns each check in the array into one event:
@@ -59,14 +58,12 @@ Whenever any watched health check changes (its status or its output), a Consul w
The watch sends the current state once as soon as it is loaded, so checks that are already `warning` or `critical` raise alerts right away.
## Prerequisites
----
- **Network**: the Consul agent that runs the watch must be able to reach the Flashduty push URL (for example `https://api.flashcat.cloud`).
- **Permissions**: you need to be able to edit that agent's configuration directory (for example `/etc/consul.d`) and run `consul reload`.
- **ACL**: when ACLs are enabled, the token the watch uses needs read access to all nodes and services, as described below.
## In Consul
----
@@ -149,7 +146,6 @@ When ACLs are enabled, add `-H "X-Consul-Token: "` to each command.
## Alert Key
----
Flashduty builds the Alert Key from `Partition`, `Node`, and `CheckID`.
@@ -162,7 +158,6 @@ Changes to a check's status, name, output, or notes do not change its Alert Key.
A watch only returns the checks of its own datacenter, and the payload does not include the datacenter name. If several datacenters share one integration and have nodes with the same name, checks with the same ID on those nodes merge into one alert. We recommend one integration per datacenter.
## Status and severity
----
| Consul `Status` | Flashduty status | Flashduty severity |
| :--- | :--- | :--- |
@@ -173,7 +168,6 @@ A watch only returns the checks of its own datacenter, and the payload does not
When a check moves between `warning` and `critical`, Flashduty keeps one alert per severity: `warning` turning `critical` creates a new Critical alert, and `passing` recovers both.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -190,7 +184,6 @@ When a check moves between `warning` and `critical`, Flashduty keeps one alert p
The alert title is ` on `, and the alert description is the check's `Output` and `Notes`.
## FAQ
----
diff --git a/en/on-call/integration/alert-integration/alert-sources/contrast.mdx b/en/on-call/integration/alert-integration/alert-sources/contrast.mdx
index be5738ad..54de49c2 100644
--- a/en/on-call/integration/alert-integration/alert-sources/contrast.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/contrast.mdx
@@ -1,5 +1,6 @@
---
title: "Contrast Security Alert Integration"
+sidebarTitle: "Contrast Security"
description: "Sync Contrast Security new-vulnerability, vulnerability-closed, and server-offline events to Flashduty On-call through a generic webhook."
keywords: ["alert integration", "Contrast Security", "webhook", "vulnerability", "application security", "IAST"]
---
@@ -11,7 +12,6 @@ Contrast's generic webhook has no fixed payload; the body is the template you en
## In Flashduty On-call
----
Get the push URL in either of the following ways.
@@ -32,7 +32,6 @@ Get the push URL in either of the following ways.
## In Contrast Security
----
@@ -67,7 +66,6 @@ Click **Add**. Contrast disconnects a webhook after 5 consecutive attempts witho
## Events and Alert Key
----
| Contrast event | `event_type` | Effect in Flashduty | Alert Key field |
| :--- | :--- | :--- | :--- |
@@ -81,7 +79,6 @@ Changes to severity, status, title, or application do not change the Alert Key.
Server-offline alerts and the events in the last row have no recovery event. Configure **Auto-close after timeout** (for example 24 hours) on the integration or channel, or close them manually.
## Severity mapping
----
Mapped from `$Severity`:
@@ -95,7 +92,6 @@ Mapped from `$Severity`:
When a vulnerability is closed the alert recovers and keeps the severity carried by the closing event.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -110,7 +106,6 @@ When a vulnerability is closed the alert recovers and keeps the severity carried
| `organization` / `organization_id` | Organization name and ID |
## Troubleshooting
----
- **Contrast reports the webhook as disconnected**: Flashduty returned a non-2XX response. Check that the URL contains `integration_key` and that the Payload is the template above and valid JSON, then test and save again in Contrast
- **The alert does not recover**: confirm the vulnerability moved to a closed status in Contrast. Other status changes (such as Confirmed or Suspicious) send no event
diff --git a/en/on-call/integration/alert-integration/alert-sources/coralogix.mdx b/en/on-call/integration/alert-integration/alert-sources/coralogix.mdx
index 9c71c8f6..ee7a805f 100644
--- a/en/on-call/integration/alert-integration/alert-sources/coralogix.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/coralogix.mdx
@@ -1,5 +1,6 @@
---
title: "Coralogix alert integration"
+sidebarTitle: "Coralogix"
description: "Send Coralogix alert trigger and recovery notifications to Flashduty On-call through a Notification Center Generic HTTPS connector."
keywords: ["alert integration", "Coralogix", "Notification Center", "Generic HTTPS", "groupingKey"]
---
@@ -9,7 +10,6 @@ Use a Coralogix Notification Center Generic HTTPS connector to send alerts to Fl
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure Coralogix
----
These steps require Notification Center admin permissions (create connectors, presets, and routers, and edit alert definition labels).
@@ -101,7 +100,6 @@ Let the alert actually trigger and confirm that Flashduty receives an active ale
## Alert Key
----
Flashduty uses `alert.groupingKey` as the Alert Key. Coralogix defines `groupingKey` as the deduplication key in its alert notification schema, and its official Opsgenie and Jira Service Management setups use `groupingKey` to close the matching alert on `Resolved`.
@@ -110,7 +108,6 @@ With **Separate cases**, each Group by combination is notified separately with i
Changes to the title, description, priority, or group values do not change the Alert Key.
## Status and severity
----
Flashduty uses `status` to tell triggers from recoveries, and `priority` (`alert.highestPriority`, or the alert definition priority when empty) to set the severity.
@@ -126,7 +123,6 @@ Flashduty uses `status` to tell triggers from recoveries, and `priority` (`alert
When `status` is `Resolved`, Flashduty recovers the original alert and keeps its last severity. An empty or any other `status` is rejected.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -142,7 +138,6 @@ When `status` is `Resolved`, Flashduty recovers the original alert and keeps its
An alert can have at most 50 labels. Requests that exceed this limit are rejected.
## Troubleshooting
----
- **Coralogix reports a delivery failure**: Confirm that the connector URL is the complete push URL and includes `integration_key`
- **Flashduty returns a parameter error**: Confirm that the preset Body matches the template above, renders valid JSON, and that `grouping_key` and `status` are not empty
diff --git a/en/on-call/integration/alert-integration/alert-sources/coroot.mdx b/en/on-call/integration/alert-integration/alert-sources/coroot.mdx
index 76d472d3..ec4519dc 100644
--- a/en/on-call/integration/alert-integration/alert-sources/coroot.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/coroot.mdx
@@ -1,5 +1,6 @@
---
title: "Coroot Alert Integration"
+sidebarTitle: "Coroot"
description: "Sync Coroot alert and SLO incident open and resolve notifications to Flashduty On-call through a Webhook integration."
keywords: ["alert integration", "Coroot", "Webhook", "Incident", "Alert", "observability"]
---
@@ -9,7 +10,6 @@ Sync the alerts (alerting rules) and SLO incidents of a Coroot project to Flashd
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## In Coroot
----
@@ -76,7 +75,6 @@ Coroot only sends webhooks for categories that have notifications enabled.
## Alert Key
----
Flashduty uses the ID carried in the `url` field of the Coroot notification as the Alert Key:
@@ -88,7 +86,6 @@ Flashduty uses the ID carried in the `url` field of the Coroot notification as t
Coroot generates a unique ID when it creates an alert or incident, and the open and resolve notifications use the same one. If the same rule fires again on the same application, Coroot creates a new ID, so it is a new Flashduty alert. Changes to severity, rule name, summary or the domain in `url` never change the Alert Key.
## Status and severity
----
Coroot sends a notification only when an alert or incident opens or resolves; a severity change in between is not notified.
@@ -104,7 +101,6 @@ Coroot sends a notification only when an alert or incident opens or resolves; a
- An unrecognized `status` is treated as Warning, so that Coroot is not made to pause later notifications by an error response
## Labels
----
| Label | Meaning |
| :--- | :--- |
@@ -117,7 +113,6 @@ Coroot sends a notification only when an alert or incident opens or resolves; a
| Custom fields | Custom fields configured on the integration |
## Troubleshooting
----
diff --git a/en/on-call/integration/alert-integration/alert-sources/cronicle.mdx b/en/on-call/integration/alert-integration/alert-sources/cronicle.mdx
index 59a7479a..7eee15b2 100644
--- a/en/on-call/integration/alert-integration/alert-sources/cronicle.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/cronicle.mdx
@@ -1,5 +1,6 @@
---
title: "Cronicle alert integration"
+sidebarTitle: "Cronicle"
description: "Send Cronicle job failures and launch failures to Flashduty On-call through the event web hook, and recover automatically on the next successful run."
keywords: ["alert integration", "Cronicle", "job scheduler", "cron", "webhook"]
---
@@ -9,7 +10,6 @@ Use the Cronicle event web hook to send job failures and launch failures to Flas
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## In Cronicle
----
@@ -61,7 +60,6 @@ An alert closes only when the next job of the same event succeeds. Events that a
## Payload
----
Cronicle POSTs the following fields as JSON. Flashduty parses them directly, with no template to configure:
@@ -80,12 +78,10 @@ Cronicle POSTs the following fields as JSON. Flashduty parses them directly, wit
The body also contains the event parameters (`params`) and the web hook URL (`web_hook`). Flashduty neither reads nor stores these two fields.
## Alert Key
----
Flashduty uses `event` (the event ID) as the Alert Key. Every job of the same event carries the same `event`, and only the job ID `id` changes per run, so failures, launch failures, and the later success of one event land on the same alert. Changing the event title, the exit code, or the server that ran the job does not change the Alert Key.
## Status and severity
----
Cronicle notifications carry no severity, so a failed scheduled job is treated as Critical:
@@ -99,7 +95,6 @@ Cronicle notifications carry no severity, so a failed scheduled job is treated a
The Cronicle web hook has no test button. To check connectivity, run an event once.
## FAQ
----
@@ -122,7 +117,6 @@ The Web Hook URL can be set on a single event or on a category, so fill it in on
## Troubleshooting
----
- **Cronicle does not send anything**: confirm the Web Hook URL is the complete push URL including `integration_key`, and set `debug_level` to 9 to see `Web Hook Error` and `Web Hook Response` entries in the Cronicle log
- **Flashduty returns a parameter error**: confirm the body contains `action` and `event`, and that `job_complete` notifications contain `code`
diff --git a/en/on-call/integration/alert-integration/alert-sources/cronitor.mdx b/en/on-call/integration/alert-integration/alert-sources/cronitor.mdx
index c6542a09..1aa17114 100644
--- a/en/on-call/integration/alert-integration/alert-sources/cronitor.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/cronitor.mdx
@@ -1,5 +1,6 @@
---
title: "Cronitor alert integration"
+sidebarTitle: "Cronitor"
description: "Send Cronitor monitor alert and recovery notifications to Flashduty On-call through a webhook."
keywords: ["alert integration", "Cronitor", "cron", "heartbeat monitoring", "webhook"]
---
@@ -11,7 +12,6 @@ According to the Cronitor pricing page, webhook alerts are included in the free
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can get the integration push URL in either of the following ways.
## Configure Cronitor
----
@@ -70,7 +69,6 @@ Cronitor recommends testing alerts with a heartbeat monitor:
## Payload fields
----
Cronitor sends the following fields as JSON:
@@ -90,7 +88,6 @@ Cronitor sends the following fields as JSON:
The alert title is the issue name; when it is empty, the monitor name, then the monitor key. Every alert also carries the label `source=cronitor`.
## Alert Key
----
Flashduty builds the Alert Key from the monitor key (`id`) and the environment (`environment`):
@@ -103,7 +100,6 @@ The monitor key is the same for every outage. After an alert recovers, the next
Changing the monitor key, or deleting the monitor and creating it again, produces a new Alert Key that is no longer linked to the old alert.
## Status and severity
----
Cronitor webhooks carry no severity. Flashduty maps them as follows:
@@ -115,7 +111,6 @@ Cronitor webhooks carry no severity. Flashduty maps them as follows:
`type` is matched case-insensitively. Requests without `id`, or with an empty or any other `type`, are rejected.
## FAQ
----
@@ -134,7 +129,6 @@ Resolving an issue by hand in Cronitor sends no recovery notification. A failure
## Troubleshooting
----
- **Flashduty returns an invalid parameter error**: make sure the push URL is complete (including `integration_key`) and the body has the `id` and `type` fields
- **No notifications arrive**: make sure the webhook is selected in the monitor's notification list, and the list's environments include the alert's environment
diff --git a/en/on-call/integration/alert-integration/alert-sources/crowdsec.mdx b/en/on-call/integration/alert-integration/alert-sources/crowdsec.mdx
index 4b69fe9f..b062eafb 100644
--- a/en/on-call/integration/alert-integration/alert-sources/crowdsec.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/crowdsec.mdx
@@ -1,5 +1,6 @@
---
title: "CrowdSec alert integration"
+sidebarTitle: "CrowdSec"
description: "Sync attack sources detected by the CrowdSec Security Engine to Flashduty On-call through its HTTP notification plugin."
keywords: ["alert integration", "CrowdSec", "Security Engine", "intrusion prevention", "IPS", "HTTP notification plugin", "webhook"]
---
@@ -9,7 +10,6 @@ The CrowdSec Security Engine is an open-source, self-hosted intrusion detection
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure CrowdSec
----
Do the following on the machine that runs the CrowdSec Local API (LAPI). The HTTP notification plugin ships with CrowdSec, so nothing extra needs to be installed.
@@ -98,24 +97,20 @@ An Info alert titled `test alert` appears in Flashduty. It does not recover on i
## What is pushed
----
Each request carries a JSON array with one CrowdSec alert per element; with `group_wait` or `group_threshold`, CrowdSec holds alerts until the next flush, so delivery can lag the detection by up to `group_wait`, and a request may hold several alerts. Flashduty creates one alert per array element. The event details (`events`) and the raw logs in `meta` are not sent to Flashduty.
## Alert Key
----
Flashduty uses the `uuid` that CrowdSec generates for each alert as the Alert Key. A retried request carries the same `uuid` and merges into the same alert; when the same source IP triggers again later, the new alert has a new `uuid` and creates a new Flashduty alert.
For older releases that send no `uuid`, Flashduty derives the Alert Key from the scenario, source scope, source value and `start_at`. The request is rejected when those fields are missing.
## Severity
----
CrowdSec provides no severity, so every alert triggers at **Warning**, including alerts in simulation mode (`simulated`). The test alert from `cscli notifications test` is **Info** and uses its own Alert Key, so it never merges with a real alert.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -136,7 +131,6 @@ CrowdSec provides no severity, so every alert triggers at **Warning**, including
The alert title is ` from ` and the description is the CrowdSec `message`.
## FAQ
----
diff --git a/en/on-call/integration/alert-integration/alert-sources/crowdstrike-logscale.mdx b/en/on-call/integration/alert-integration/alert-sources/crowdstrike-logscale.mdx
index ca16240d..23f6ca4a 100644
--- a/en/on-call/integration/alert-integration/alert-sources/crowdstrike-logscale.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/crowdstrike-logscale.mdx
@@ -1,5 +1,6 @@
---
title: "CrowdStrike Falcon LogScale alert integration"
+sidebarTitle: "CrowdStrike Falcon LogScale"
description: "Send Trigger hits from Falcon LogScale (formerly Humio) to Flashduty On-call through the Trigger's Webhook Action."
keywords: ["alert integration", "CrowdStrike", "Falcon LogScale", "Humio", "Webhook Action", "Trigger"]
---
@@ -12,7 +13,6 @@ Falcon LogScale (formerly Humio) describes an always-running query as a **Trigge
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -33,7 +33,6 @@ You can get the integration push URL in either of the following ways.
## Configure Falcon LogScale
----
@@ -75,7 +74,6 @@ LogScale triggers only fire; they never send anything that means "resolved", so
## Payload
----
Flashduty parses the request body against LogScale's own default Message Body Template, sent as `application/json`:
@@ -115,7 +113,6 @@ Flashduty parses the request body against LogScale's own default Message Body Te
Don't rename or move the fields above in the default template. The template can carry more variables, but Flashduty only reads the fields in this table and ignores the rest.
## Alert Key
----
Flashduty uses `alert.id` (what the LogScale docs define as the Trigger ID) as the Alert Key directly:
@@ -124,12 +121,10 @@ Flashduty uses `alert.id` (what the LogScale docs define as the Trigger ID) as t
- A request without `alert.id` is rejected
## Status and severity
----
LogScale's default template carries no severity field, so every alert opens as Warning.
## FAQ
----
@@ -152,7 +147,6 @@ No. Flashduty identifies the integration by the `integration_key` in the push UR
## Troubleshooting
----
- **"Problem invoking test action" when clicking Test action**: usually means `{id}` and other template variables had no real value at test time, so Flashduty rejected the empty `alert.id`. Trigger a real match with your query to verify instead
- **No alert in Flashduty**: check that the action's URL is complete (including `integration_key`) and that the action is attached to a trigger
diff --git a/en/on-call/integration/alert-integration/alert-sources/crowdstrike.mdx b/en/on-call/integration/alert-integration/alert-sources/crowdstrike.mdx
index b8183da8..f1967efc 100644
--- a/en/on-call/integration/alert-integration/alert-sources/crowdstrike.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/crowdstrike.mdx
@@ -1,5 +1,6 @@
---
title: "CrowdStrike Falcon alert integration"
+sidebarTitle: "CrowdStrike Falcon"
description: "Send EPP and NG-SIEM detections to Flashduty On-call through the Cloud HTTP Request action of a CrowdStrike Falcon Fusion SOAR workflow."
keywords: ["alert integration", "CrowdStrike", "Falcon", "Fusion SOAR", "EDR", "NG-SIEM", "webhook"]
---
@@ -9,7 +10,6 @@ CrowdStrike Falcon has no built-in generic alert webhook: detection notification
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure CrowdStrike Falcon
----
The steps below need permission to create and release (publish) Fusion SOAR workflows in the Falcon console. The NG-SIEM Detection trigger needs the Next-Gen SIEM module; the EPP Detection trigger needs Falcon Insight/Prevent endpoint detection. The Falcon cloud must be able to reach the domain of the push URL.
@@ -85,7 +84,6 @@ To also ingest endpoint protection (EPP) detections, repeat the previous step fo
## Alert Key
----
Flashduty uses the `detection_id` field of the request body as the Alert Key. It maps to the Falcon Fusion trigger variable `${data['Trigger.Detection.DetectionID']}` — CrowdStrike's own Fusion workflow authoring reference calls this path "release-verified" (checked to exist at release time), and both the NG-SIEM and EPP detection triggers return it in the same composite-ID format for the same detection.
@@ -97,7 +95,6 @@ Flashduty rejects a request that is missing `detection_id`, or whose `severity`
Falcon Fusion has no "detection closed" trigger that carries the detection ID, so this integration is one-shot: Flashduty does not close an alert when the detection is closed in Falcon. **Turn on [auto-close](/en/on-call/channel/create-edit) for the channel (24 hours is a reasonable default for security detections).** A repeat of the same detection inside that window refreshes the same alert.
## Severity mapping
----
| CrowdStrike `severity` (SeverityDisplayName) | Flashduty level |
| :--- | :--- |
@@ -109,7 +106,6 @@ Falcon Fusion has no "detection closed" trigger that carries the detection ID, s
| (empty) | **Warning** |
## Alert content
----
- **Title**: `name` (the detection name), falling back to `CrowdStrike detection` when empty
- **Labels**: `detection_id`, `product` (`NGSIEM` or `EPP`), `severity_raw` (the raw `severity` value); the NG-SIEM template also sends `source_url`; the EPP template also sends `resource`/`host` (`hostname`), `process_sha256`, `ioc_value`, `ioc_type`
@@ -117,7 +113,6 @@ Falcon Fusion has no "detection closed" trigger that carries the detection ID, s
Empty fields are not written as labels.
## Troubleshooting
----
- **The workflow shows no error, but Flashduty never receives an alert**: confirm the workflow was **Released**, not just saved as a draft — a draft workflow never runs
- **The HTTP Action fails with a 400 in the logs**: check that the body field names match the templates above exactly; the response names the missing or unsupported field (for example `detection_id is required`)
diff --git a/en/on-call/integration/alert-integration/alert-sources/ctyun.mdx b/en/on-call/integration/alert-integration/alert-sources/ctyun.mdx
index 29fa7690..131a68fa 100644
--- a/en/on-call/integration/alert-integration/alert-sources/ctyun.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/ctyun.mdx
@@ -1,5 +1,6 @@
---
title: "StateCloud Alert Events"
+sidebarTitle: "StateCloud"
description: "Sync StateCloud alert events to Flashduty via webhook for automated alert noise reduction"
---
@@ -11,46 +12,45 @@ For resource monitoring events from StateCloud [secondary nodes](#secondary-node
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Dedicated Integration
Choose this simpler option when you don't need to route alert events to different channels.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Select **StateCloud** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **StateCloud** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In StateCloud
----
-## I. StateCloud Alert Push Configuration
1. Log in to your `StateCloud` console, search for the `Cloud Eye` product, and enter its console
2. In `Alarm Service`, select `Alarm Contact/Group` and create corresponding alert contact/group
@@ -62,7 +62,7 @@ Choose this option when you need to route alerts to different channels based on
-## II. Status Mapping
+## Status Mapping
@@ -72,7 +72,7 @@ Choose this option when you need to route alerts to different channels based on
| Warning | Warning | warning |
| Normal | Info | info |
-## III. StateCloud Secondary Node List
+## StateCloud Secondary Node List
| Region | Cities |
| ---------- | -------- |
diff --git a/en/on-call/integration/alert-integration/alert-sources/cubeapm.mdx b/en/on-call/integration/alert-integration/alert-sources/cubeapm.mdx
index 184ce35d..f35bd5b9 100644
--- a/en/on-call/integration/alert-integration/alert-sources/cubeapm.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/cubeapm.mdx
@@ -1,5 +1,6 @@
---
title: "CubeAPM Alert Integration"
+sidebarTitle: "CubeAPM"
description: "Receive CubeAPM alerts through CubeAPM's webhook receiver using a Flashduty Prometheus integration; alerts close automatically when they resolve."
keywords: ["alert integration", "CubeAPM", "webhook", "Prometheus", "Alertmanager", "observability"]
---
@@ -9,7 +10,6 @@ CubeAPM can send alert notifications by HTTP POST to any webhook URL. The defaul
## In Flashduty On-call
----
Get an integration push URL in either of the two ways below. **Choose the Prometheus integration type** in both, not CubeAPM.
@@ -30,7 +30,6 @@ Get an integration push URL in either of the two ways below. **Choose the Promet
## Configure in CubeAPM
----
@@ -49,7 +48,6 @@ Let a CubeAPM alert rule fire and confirm Flashduty receives an active alert; af
## Field mapping
----
| CubeAPM field | Flashduty |
| :--- | :--- |
@@ -65,13 +63,11 @@ Let a CubeAPM alert rule fire and confirm Flashduty receives an active alert; af
One notification can carry several alerts, and Flashduty handles each one separately (up to 100 per request).
## Recovery and deduplication
----
- When CubeAPM sends a notification whose `status` is not `firing` (for example `resolved`), Flashduty closes the alert with the same `fingerprint`. CubeAPM's own PagerDuty and Zenduty examples likewise map any non-`firing` status to a resolve.
- The CubeAPM documentation does not say whether the webhook has a test-send function. After the first setup, verify with a real alert that both trigger and recovery appear in Flashduty.
## Troubleshooting
----
- **Flashduty returns `Invalid parameters`**: the push URL is incomplete, `integration_key` is missing, or the integration type is not Prometheus
- **Alerts do not resolve**: confirm that every alert in a customized Payload has `status` and `fingerprint`, and that the recovery notification carries the same `fingerprint` as the trigger
diff --git a/en/on-call/integration/alert-integration/alert-sources/dash0.mdx b/en/on-call/integration/alert-integration/alert-sources/dash0.mdx
index 2605c5b5..646d1601 100644
--- a/en/on-call/integration/alert-integration/alert-sources/dash0.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/dash0.mdx
@@ -1,5 +1,6 @@
---
title: "Dash0 alert integration"
+sidebarTitle: "Dash0"
description: "Send Dash0 check rule alert and recovery events to Flashduty On-call through a webhook notification channel."
keywords: ["alert integration", "Dash0", "check rule", "webhook", "issueIdentifier"]
---
@@ -9,14 +10,12 @@ Use a Dash0 webhook notification channel to send check rule alerts to Flashduty
## In Flashduty On-call
----
Create either a dedicated or shared **Dash0** alert integration and copy its complete Push URL.
## Configure Dash0
----
@@ -42,14 +41,12 @@ Let a check rule cross its threshold and confirm Flashduty receives an active al
## Alert Key
----
Flashduty uses `data.issue.issueIdentifier` as the Alert Key. Dash0 documents it as the "identifier for the combination of CheckRule and Resource, should remain stable over different issue instances", so trigger and recovery carry the same value.
`data.issue.id` identifies a single issue instance and `data.issue.checkrules[].id` identifies the check rule. Both are kept as labels only and are not part of the Alert Key. Changes to the title, status, description, start time, or check rule version do not change the Alert Key. An alert-type request without `issueIdentifier` is rejected, because later recovery could not be matched.
## Event types and severity
----
| Dash0 `type` | Flashduty handling |
| :--- | :--- |
@@ -68,7 +65,6 @@ Flashduty uses `data.issue.issueIdentifier` as the Alert Key. Dash0 documents it
Dash0 does not publish the exact meaning of `alert.closed` and `alert.superseded`. Flashduty handles them conservatively: `closed` is treated as the issue having ended, and `superseded` is assumed to be followed by a new `alert.ongoing` for the same identifier, so it does not change alert state.
## Troubleshooting
----
- **Dash0 gets a non-2xx response**: confirm the Push URL is complete and includes `integration_key`
- **Flashduty returns an invalid-parameter error**: confirm the body is valid JSON and `data.issue.issueIdentifier` is not empty
diff --git a/en/on-call/integration/alert-integration/alert-sources/datadog.mdx b/en/on-call/integration/alert-integration/alert-sources/datadog.mdx
index 0bec748a..15039e18 100644
--- a/en/on-call/integration/alert-integration/alert-sources/datadog.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/datadog.mdx
@@ -1,5 +1,6 @@
---
title: "Datadog alert integration"
+sidebarTitle: "Datadog"
description: "Send Datadog Monitor alerts to Flashduty On-call through webhooks and correlate firing, update, and recovery events correctly."
keywords: ["alert integration", "Datadog", "webhook", "Monitor", "alert recovery"]
---
@@ -9,7 +10,6 @@ Use a Datadog webhook to send Monitor alerts to Flashduty On-call. Flashduty pri
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
### Use a dedicated integration
@@ -17,7 +17,7 @@ You can obtain an integration push URL in either of the following ways.
Choose this method when you do not need to route alerts to different channels.
-
+
1. In the Flashduty console, select **Channel** and open a channel
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration**
@@ -32,7 +32,7 @@ Choose this method when you do not need to route alerts to different channels.
Choose this method when you need to route alerts to different channels based on the payload.
-
+
1. In the Flashduty console, select **Integration Center → Alert Events**
2. Select **Datadog** and enter an integration name
@@ -45,7 +45,6 @@ Choose this method when you need to route alerts to different channels based on
## Configure a webhook in Datadog
----
@@ -123,7 +122,6 @@ A Datadog test notification can verify webhook connectivity, but only a real fir
## Add custom labels
----
The default payload includes common environment, service, team, and region labels. To send additional Datadog variables, add a `custom_labels` object at the top level of the payload:
@@ -152,7 +150,6 @@ Do not encode multiple custom labels in a comma-separated string. Label values c
## Alert Key
----
Flashduty primarily uses `$ALERT_CYCLE_KEY` as the Alert Key. Datadog defines this value as the ID that links events from the time an alert triggers until it resolves, so repeat notifications and recovery events update the same Flashduty alert.
@@ -161,7 +158,6 @@ If `alert_cycle_key` is missing or empty, Flashduty generates a random Alert Key
`$ID`, `$ALERT_ID`, `$AGGREG_KEY`, the title, severity, timestamps, and custom labels do not participate in Alert Key generation.
## Status and Severity
----
Recovery is determined only from `$ALERT_TRANSITION` and is independent of severity mapping.
@@ -177,7 +173,6 @@ Recovery is determined only from `$ALERT_TRANSITION` and is independent of sever
To change the severity, remap it with an [Alert Processing Pipeline](/en/on-call/integration/alert-integration/alert-pipelines).
## Troubleshooting
----
- **Datadog does not send a request**: Confirm that the Monitor notification message contains the correct `@webhook-` recipient
- **Flashduty returns an invalid parameter error**: Confirm that the payload is valid JSON and contains a non-empty `alert_transition` value
diff --git a/en/on-call/integration/alert-integration/alert-sources/datto-rmm.mdx b/en/on-call/integration/alert-integration/alert-sources/datto-rmm.mdx
index 2cd1f612..dea8e925 100644
--- a/en/on-call/integration/alert-integration/alert-sources/datto-rmm.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/datto-rmm.mdx
@@ -1,5 +1,6 @@
---
title: "Datto RMM alert integration"
+sidebarTitle: "Datto RMM"
description: "Send Datto RMM device alert and auto-resolve events to Flashduty On-call through a webhook."
keywords: ["alert integration", "Datto RMM", "webhook", "alert_uid", "RMM"]
---
@@ -11,14 +12,12 @@ Datto RMM sends a request body that you write yourself, so paste the JSON templa
## In Flashduty On-call
----
Create either a dedicated or shared **Datto RMM** alert integration and copy its complete Push URL.
## Configure Datto RMM
----
You can configure the webhook on a single monitor's response settings or globally. **Turning on Global Webhooks automatically disables the webhooks set on individual monitors**, so use one or the other.
@@ -93,12 +92,10 @@ Click **Test Webhook** (**Test Alert Webhook** for global webhooks) to confirm D
## Alert Key
----
Flashduty uses `alert_uid` (the Datto RMM variable `[alert_uid]`, documented as "The alert ID") as the Alert Key. The alert-raised and alert-resolved payloads use the same variable, so they refer to the same alert. Changes to device, site, alert type, message, or severity do not change the Alert Key.
## Status and severity
----
| `event` | Flashduty status |
| :--- | :--- |
@@ -113,12 +110,10 @@ Flashduty uses `alert_uid` (the Datto RMM variable `[alert_uid]`, documented as
| Empty or other | Warning |
## About recovery
----
Datto RMM sends the resolved payload only when an alert resolves **automatically**; resolving an alert manually in the console sends nothing. Turn on [auto-close after timeout](/en/on-call/channel/create-edit) in the channel that receives these alerts, with a suggested duration of 24 hours, so manually resolved alerts do not stay open.
## Troubleshooting
----
- **Flashduty returns an invalid-parameter error**: Check that the payload is valid JSON, `alert_uid` is not empty, and `event` is `triggered` or `resolved`
- **The alert does not recover**: Check that **When alert is resolved (optional)** is on and uses the `resolved` template; manually resolved alerts send no recovery
diff --git a/en/on-call/integration/alert-integration/alert-sources/db-pull.mdx b/en/on-call/integration/alert-integration/alert-sources/db-pull.mdx
index 8b4cf8e3..f8586f00 100644
--- a/en/on-call/integration/alert-integration/alert-sources/db-pull.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/db-pull.mdx
@@ -1,5 +1,6 @@
---
title: "Database Pull Alert Integration (DB Pull)"
+sidebarTitle: "Database Pull (DB Pull)"
description: "Flashduty periodically queries a MySQL, PostgreSQL, or ClickHouse database and converts matching rows into standard alert events. Use this when alert data is already written to a relational database and the system cannot push alerts outward."
keywords: ["Alert Integration", "DB Pull", "Database", "MySQL", "PostgreSQL", "ClickHouse", "Polling", "Data Ingestion"]
---
@@ -13,7 +14,6 @@ DB Pull is the right choice when **alert data is already stored in a relational
## Setup Steps
----
### In Flashduty
@@ -33,7 +33,7 @@ When you don't need to route alert events to different channels, this method is
When you need to route alert events to different channels based on the alert payload, choose this method.
-1. Enter the Flashduty console, select **Integration Center => Alert Events** to enter the integration selection page.
+1. Enter the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page.
2. Select the **DB Pull** integration and fill in the **Integration Name**.
3. Configure the **Default Route** and select the corresponding channel (after the integration is created, go to **Route** to add finer-grained routing rules).
4. Fill in the form as described in the "Configuration" section below and click **Save**.
@@ -42,7 +42,6 @@ When you need to route alert events to different channels based on the alert pay
## Configuration
----
### Database Driver
@@ -149,14 +148,12 @@ Example configuration:
```
## Default Route
----
-When creating a "Shared Integration" (under **Integration Center => Alert Events**), you must configure a default route — otherwise newly pulled events will be dropped. After creation, you can add finer-grained rules under **Route**.
+When creating a "Shared Integration" (under **Integration Center → Alert Events**), you must configure a default route — otherwise newly pulled events will be dropped. After creation, you can add finer-grained rules under **Route**.
A "Dedicated Integration" (created under **Configuration → Integrations → Private integration** in a specific channel) is automatically bound to that channel and does not require a separate default route.
## Notes
----
- **Database account permissions**: Create a dedicated read-only account for DB Pull with only `SELECT` privilege on the target table. Do not grant write access.
- **Network reachability**: The Flashduty service must be able to reach `host:port` over the public internet or a dedicated line. Private subnets (`10.x.x.x`, `192.168.x.x`, `172.16–31.x.x`) and loopback addresses are rejected by the system.
diff --git a/en/on-call/integration/alert-integration/alert-sources/dbmarlin.mdx b/en/on-call/integration/alert-integration/alert-sources/dbmarlin.mdx
index 07670ec1..d6245abf 100644
--- a/en/on-call/integration/alert-integration/alert-sources/dbmarlin.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/dbmarlin.mdx
@@ -1,5 +1,6 @@
---
title: "DBmarlin alert integration"
+sidebarTitle: "DBmarlin"
description: "Send DBmarlin instance and host alert start and end events to Flashduty On-call through its Webhook integration."
keywords: ["alert integration", "DBmarlin", "database monitoring", "webhook"]
---
@@ -11,14 +12,12 @@ DBmarlin's webhook has no fixed format: you write the request body in the **Cont
## In Flashduty On-call
----
Create either a dedicated or shared **DBmarlin** alert integration and copy its complete Push URL.
## Configure DBmarlin
----
The Webhook integration requires DBmarlin v5.11 or later, and the webhook you create is marked **Default** and enabled, which is what sends alerts.
@@ -95,7 +94,6 @@ Save and enable the integration. Under **Settings → Alert Rules**, create a ru
## Alert Key
----
Flashduty computes the Alert Key from the rule ID (`ruleid`) plus the instance name (`instance`) or host name (`node`); instance alerts and host alerts never share a key. The "started" and "ended" notifications of one rule on the same instance or host share one Alert Key; changes to `from`, `to`, values, and the rule name do not change it.
@@ -103,7 +101,6 @@ Flashduty computes the Alert Key from the rule ID (`ruleid`) plus the instance n
- When the same rule fires again, it uses the same Alert Key
## Status and severity
----
| DBmarlin `startedended` | Flashduty status or severity |
| :--- | :--- |
@@ -113,12 +110,10 @@ Flashduty computes the Alert Key from the rule ID (`ruleid`) plus the instance n
The webhook body carries no severity, so every alert is treated as Warning. DBmarlin sends `startedended` in upper case (`STARTED`, `ENDED`); Flashduty ignores the case, treats a value starting with `end` as the end and any other value as a start.
## Recovery and auto-close
----
DBmarlin sends an "ended" notification when an alert ends, and Flashduty uses it to recover the alert. To keep a lost notification from leaving an alert open, configure **auto-close after timeout** on the channel or integration, longer than your rules can stay active.
## Troubleshooting
----
- **DBmarlin logs `status code 400`**: confirm the template is valid JSON and contains `ruleid`, plus `instance` (instance alerts) or `node` (host alerts)
- **`404` or `401`**: confirm the Webhook URL is complete and contains `integration_key`
diff --git a/en/on-call/integration/alert-integration/alert-sources/dead-mans-snitch.mdx b/en/on-call/integration/alert-integration/alert-sources/dead-mans-snitch.mdx
index 98a8a0e7..07e91402 100644
--- a/en/on-call/integration/alert-integration/alert-sources/dead-mans-snitch.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/dead-mans-snitch.mdx
@@ -1,5 +1,6 @@
---
title: "Dead Man's Snitch alert integration"
+sidebarTitle: "Dead Man's Snitch"
description: "Send Dead Man's Snitch missing, errored, and recovery notifications to Flashduty On-call through a webhook."
keywords: ["alert integration", "Dead Man's Snitch", "cron", "heartbeat monitoring", "webhook"]
---
@@ -11,7 +12,6 @@ According to the Dead Man's Snitch pricing page, integrations are available from
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can get the integration push URL in either of the following ways.
## Configure Dead Man's Snitch
----
@@ -67,7 +66,6 @@ If your plan includes Error Notices, you can also report a non-zero exit status
## Payload fields
----
Dead Man's Snitch sends the following fields as JSON:
@@ -84,7 +82,6 @@ Dead Man's Snitch sends the following fields as JSON:
The alert title is the snitch name followed by its state, for example `Nightly Backup is missing`. When the name is empty, `Snitch` is used. Every alert also carries the label `source=dead-mans-snitch`.
## Alert Key
----
The token is the check-in credential of the snitch: anyone who holds it can check in to the snitch. Flashduty therefore never shows the token in alerts and uses the MD5 hash of the token as the Alert Key:
@@ -94,7 +91,6 @@ The token is the check-in credential of the snitch: anyone who holds it can chec
The token stays the same for the whole life of a snitch. After an alert recovers, the next time the same snitch goes missing a new alert is created; the recovered alert is not reopened. Deleting a snitch and creating it again produces a new token that is no longer linked to the old alert.
## Status and severity
----
Dead Man's Snitch webhooks carry no severity. Flashduty maps them as follows:
@@ -108,7 +104,6 @@ Dead Man's Snitch webhooks carry no severity. Flashduty maps them as follows:
`type` is case-insensitive. Requests without `data.snitch.token`, or with an empty or other `type`, are rejected.
## FAQ
----
@@ -131,7 +126,6 @@ The first check-in of a new snitch also sends `snitch.reporting`. There is no ac
## Troubleshooting
----
- **Flashduty returns a parameter error**: make sure the push URL is complete (it includes `integration_key`) and the request body contains `type` and `data.snitch.token`
- **No notifications arrive**: make sure your plan includes integrations. If the webhook has tag filters, make sure the snitch carries one of those tags
diff --git a/en/on-call/integration/alert-integration/alert-sources/dependency-track.mdx b/en/on-call/integration/alert-integration/alert-sources/dependency-track.mdx
index 4ba429ff..24761818 100644
--- a/en/on-call/integration/alert-integration/alert-sources/dependency-track.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/dependency-track.mdx
@@ -1,5 +1,6 @@
---
title: "Dependency-Track Alert Integration"
+sidebarTitle: "Dependency-Track"
description: "Sync new vulnerabilities, newly vulnerable dependencies and policy violations found by Dependency-Track to Flashduty On-call through an Outbound Webhook."
keywords: ["alert integration", "Dependency-Track", "Webhook", "SBOM", "vulnerability", "policy violation", "software supply chain"]
---
@@ -17,7 +18,6 @@ Dependency-Track notifies once when it finds a problem and sends nothing when th
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -38,7 +38,6 @@ You can get the integration push URL in either of the following ways.
## In Dependency-Track
----
@@ -76,7 +75,6 @@ Selecting other groups (for example BOM_CONSUMED or PROJECT_AUDIT_CHANGE) does n
## Alert Key
----
Flashduty builds the Alert Key from the `uuid` values in the notification, joined with an invisible separator and hashed with MD5:
@@ -93,7 +91,6 @@ Flashduty builds the Alert Key from the `uuid` values in the notification, joine
- When the `uuid` of the project, component, vulnerability or policy violation is missing, Flashduty returns 400 and names the missing field
## Status and severity
----
NEW_VULNERABILITY uses `subject.vulnerability.severity`; NEW_VULNERABLE_DEPENDENCY uses the most severe of its vulnerabilities:
@@ -112,21 +109,18 @@ POLICY_VIOLATION carries no vulnerability, so the policy's violation state decid
| `INFO` or any other value | Info |
## Alerts do not recover automatically
----
Dependency-Track notifies once per problem and has no "vulnerability fixed" or "violation cleared" notification, so every alert stays open until it is closed. In the channel that receives this integration, turn on [auto-close after timeout](/en/on-call/channel/create-edit) and set it to how quickly your team handles vulnerabilities, for example 7 days.
A repeated notification for the same problem (for example the same vulnerability found again after a re-analysis) merges into the alert that is still open; if that alert was closed, a new alert is created.
## Alert content
----
- **Title**: `Dependency-Track: in ()` for NEW_VULNERABILITY; `Dependency-Track: vulnerable dependency in ( vulnerabilities)` for NEW_VULNERABLE_DEPENDENCY; `Dependency-Track: policy violation on ()` for POLICY_VIOLATION
- **Description**: the notification content, the project and component, and each vulnerability's source, severity, CVSS scores, aliases and recommendation (at most 10 vulnerabilities for a vulnerable dependency, most severe first); for a policy violation, the policy, violation type and condition
- **Labels**: `source=dependency_track`, `group`, `project_uuid`, `project_name`, `project_version`, `component_uuid`, `component_group`, `component_name`, `component_version`, `component_purl`, `vuln_id`, `vuln_source`, `vuln_uuid`, `vuln_severity`, `vuln_count`, `vuln_ids`, `policy_name`, `violation_type`, `violation_state`, `violation_uuid`
## Troubleshooting
----
diff --git a/en/on-call/integration/alert-integration/alert-sources/dingtalk-alert.mdx b/en/on-call/integration/alert-integration/alert-sources/dingtalk-alert.mdx
index 242289a5..41939b35 100644
--- a/en/on-call/integration/alert-integration/alert-sources/dingtalk-alert.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/dingtalk-alert.mdx
@@ -1,5 +1,6 @@
---
title: "DingTalk Bot Compatible Integration"
+sidebarTitle: "DingTalk Bot Compatible"
description: "Flashduty generates a webhook address in the format of a DingTalk custom robot. Point a tool that already sends alerts to a DingTalk custom robot at this address to bring alert triggers and recoveries into Flashduty."
keywords: ["alert integration", "DingTalk Bot Compatible", "DingTalk custom robot", "webhook"]
---
@@ -9,7 +10,6 @@ Generate a unique Dingtalk robot address in Flashduty, and synchronize the occur
## Operation Steps
----
### Create DingTalk Bot Compatible Integration
@@ -19,24 +19,25 @@ You can obtain a DingTalk Bot Compatible integration address through either of t
Choose this method when you don't need to route alert events to different channels. It's simpler and recommended.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a specific channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **DingTalk Bot Compatible** integration and click **Save** to generate a card
4. Click the generated card to view the **DingTalk Bot Compatible Integration URL**, copy it for later use, and you're done
-
+
+
#### Using Shared Integration
Choose this method when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center => Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **DingTalk Bot Compatible** integration:
- **Integration Name**: Define a name for the current integration
- **Message Type**: Select Dingtalk alert message type, currently only Text and Markdown are supported
@@ -45,7 +46,8 @@ Choose this method when you need to route alerts to different channels based on
4. Configure the default route and select the corresponding channel (after integration creation, you can go to `Routes` to configure more routing rules)
5. Done
-
+
+
### Customize DingTalk Bot Compatible Integration
@@ -76,12 +78,10 @@ By default, the system always creates new alerts for each message, but you can s
- When Dingtalk message type is Text, Flashduty will generate a default alert title "Dingtalk Alert"
## Severity Mapping
----
Currently, all alerts pushed to Flashduty through the DingTalk Bot Compatible integration are set to Warning severity. However, you can customize the severity using the [alert pipeline](/en/on-call/integration/alert-integration/alert-pipelines).
## Alibaba Cloud Message Center
----
The "Robot Reception" feature in Alibaba Cloud's account Message Center can push account, product, and security notices to a custom webhook. Its data format can reuse the Dingtalk robot protocol, so it connects directly to the DingTalk Bot Compatible integration on this page.
diff --git a/en/on-call/integration/alert-integration/alert-sources/dkron.mdx b/en/on-call/integration/alert-integration/alert-sources/dkron.mdx
index 961edcdb..35a53a36 100644
--- a/en/on-call/integration/alert-integration/alert-sources/dkron.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/dkron.mdx
@@ -1,5 +1,6 @@
---
title: "Dkron alert integration"
+sidebarTitle: "Dkron"
description: "Send Dkron job failure and recovery events to Flashduty On-call through a webhook notification."
keywords: ["alert integration", "Dkron", "cron", "scheduled jobs", "webhook"]
---
@@ -9,7 +10,6 @@ Dkron can send a webhook notification after every job execution. Point it at a F
## In Flashduty On-call
----
You can get the Push URL in either of two ways.
@@ -30,7 +30,6 @@ You can get the Push URL in either of two ways.
## Configure Dkron
----
Dkron has no fixed webhook body. It renders the Go template you set in `webhook-payload` and posts the result. Flashduty parses only the fields the template below produces, so use it as is. The webhook is a server-wide Dkron setting that applies to every job. It is sent once per finished job execution (after retries are used up), by the leader node, for both successes and failures.
@@ -70,12 +69,10 @@ Create a job that fails, for example with the command `false`, and run it manual
## Alert Key
----
Flashduty uses the job name, `job_name` (Dkron's `JobName`), as the Alert Key. The job name identifies a job in Dkron, and every execution result of that job, success or failure, carries the same name, so a failure and the success after it land on the same alert. Changes to the node, the start and end times, or the outcome do not change the Alert Key.
## Status and severity
----
| Dkron execution result | Flashduty status or severity |
| :--- | :--- |
@@ -85,7 +82,6 @@ Flashduty uses the job name, `job_name` (Dkron's `JobName`), as the Alert Key. T
Dkron has no severity, so every failed job is Critical. A request whose `success` is empty or is neither `true` nor `false` is rejected, so a request with an unknown state never lands in the wrong alert lifecycle.
## Alert labels
----
| Label | Source |
| :--- | :--- |
@@ -95,7 +91,6 @@ Dkron has no severity, so every failed job is Critical. A request whose `success
| `started_at`, `finished_at` | Start and end time of the execution |
## Troubleshooting
----
- **Flashduty receives nothing**: Dkron only logs webhook send errors and does not retry. Confirm the server can reach `api.flashcat.cloud` and that the Push URL is complete and includes `integration_key`
- **Dkron logs `notifier: error parsing template`**: the `webhook-payload` template has a syntax error. Compare the quotes and braces with the template above
diff --git a/en/on-call/integration/alert-integration/alert-sources/dolphinscheduler.mdx b/en/on-call/integration/alert-integration/alert-sources/dolphinscheduler.mdx
index 87725bec..8b7934d5 100644
--- a/en/on-call/integration/alert-integration/alert-sources/dolphinscheduler.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/dolphinscheduler.mdx
@@ -1,5 +1,6 @@
---
title: "Apache DolphinScheduler Alert Integration"
+sidebarTitle: "Apache DolphinScheduler"
description: "Send workflow instance failure, success, and timeout notifications from DolphinScheduler's HTTP alert plugin to Flashduty On-call."
keywords: ["alert integration", "DolphinScheduler", "workflow", "Webhook", "job scheduling"]
---
@@ -11,7 +12,6 @@ This integration was verified against DolphinScheduler 3.4.3. You must fill in *
## In Flashduty On-call
----
You can get the integration push URL in either of two ways. Pick one.
@@ -32,7 +32,6 @@ You can get the integration push URL in either of two ways. Pick one.
## In DolphinScheduler
----
@@ -41,14 +40,14 @@ You can get the integration push URL in either of two ways. Pick one.
2. For **Select plugin** choose `Http`, and enter an **Alarm instance name**
3. Fill in the plugin parameters:
-| Parameter | Value |
-| :--- | :--- |
-| URL | The full Flashduty push URL, including `integration_key` |
-| Request Type | `POST` |
-| Headers | Leave empty |
-| Body | `{"content":"${msg}"}` |
-| Content Type | `application/json` |
-| Timeout(s) | Default 120 |
+ | Parameter | Value |
+ | :--- | :--- |
+ | URL | The full Flashduty push URL, including `integration_key` |
+ | Request Type | `POST` |
+ | Headers | Leave empty |
+ | Body | `{"content":"${msg}"}` |
+ | Content Type | `application/json` |
+ | Timeout(s) | Default 120 |
4. Save. The DolphinScheduler server must be able to reach Flashduty on the public internet.
@@ -82,7 +81,6 @@ In **Alarm Instance Manage**, open the alarm instance for editing, click **Test
## Recovery and auto-close
----
DolphinScheduler sends a notification according to the state the workflow instance ends in:
@@ -99,7 +97,6 @@ Workflow and task timeout alerts are sent once and never recover. If nobody re-r
Sub-workflow states are not notified on their own.
## Alert types
----
The `content` array of one request can hold several alert objects. Each object becomes one Flashduty alert.
@@ -111,7 +108,6 @@ The `content` array of one request can hold several alert objects. Each object b
If the alarm group also receives alerts that carry no workflow information (for example a service-down alert), Flashduty rejects them with an invalid-parameter error. To keep failed sends out of DolphinScheduler, create a separate alarm group for this integration.
## Alert Key
----
| Alert type | Alert Key |
| :--- | :--- |
@@ -122,7 +118,6 @@ If the alarm group also receives alerts that carry no workflow information (for
Changes to the workflow instance name, state, run count, or times do not change the Alert Key. A failure and the later success of the same instance share one Alert Key, so the success recovers the failure. An alert object without `projectCode` or `workflowInstanceId` makes the whole request be rejected.
## Status and severity
----
| Source | Status | Severity |
| :--- | :--- | :--- |
@@ -131,7 +126,6 @@ Changes to the workflow instance name, state, run count, or times do not change
| Timeout | Triggered | Warning |
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -149,7 +143,6 @@ Changes to the workflow instance name, state, run count, or times do not change
| `task_code` / `task_name` | Task code and name (task timeout) |
## Troubleshooting
----
- **Flashduty receives no events**: confirm the workflow was started with an alarm group and a notification strategy other than **None**, that the alarm group contains the alarm instance, and that the push URL is complete and includes `integration_key`. **Test Send** in the alarm instance's create or edit dialog checks the network path
- **Flashduty returns an invalid-parameter error**: usually **Body** is not `{"content":"${msg}"}`, or an alert without workflow information (for example service-down) was received
diff --git a/en/on-call/integration/alert-integration/alert-sources/domotz.mdx b/en/on-call/integration/alert-integration/alert-sources/domotz.mdx
index 559b2007..c5c45a34 100644
--- a/en/on-call/integration/alert-integration/alert-sources/domotz.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/domotz.mdx
@@ -1,5 +1,6 @@
---
title: "Domotz alert integration"
+sidebarTitle: "Domotz"
description: "Send Domotz Alert Rule notifications for device and collector status, TCP services, latency, and more to Flashduty On-call through a webhook contact channel."
keywords: ["alert integration", "Domotz", "webhook", "network monitoring", "MSP"]
---
@@ -11,7 +12,6 @@ Alert profiles bound through the Domotz Public API deliver named events instead
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure in Domotz
----
You need permission in the Domotz portal to create contact channels and Alert Rules.
@@ -71,12 +70,10 @@ Heartbeat lost, SNMP, IP change, configuration change, security issue, and WAN/L
## Alert Key
----
For an Alert Rule notification (`monitoring_profile_state_changed`), Flashduty builds the Alert Key from the event name and `alert_id`. The Problem and the Resolved notification of one occurrence carry the same `alert_id`, so the alert closes when the state becomes Resolved. The next occurrence gets a new `alert_id` and opens a new alert. A notification without `alert_id`, or with a state other than Problem or Resolved, is rejected.
## State and severity
----
| Alert Rule severity | Flashduty severity |
| :--- | :--- |
@@ -87,7 +84,6 @@ For an Alert Rule notification (`monitoring_profile_state_changed`), Flashduty b
`data.state.current` decides the state: `Problem` triggers the alert and `Resolved` recovers it.
## Events from Public API alert profiles
----
Alert profiles bound through the alert-profile endpoints of the Domotz Public API deliver the events below. Flashduty builds the Alert Key from the event name, `agent_id` (collector ID), and `device_id` (device ID), plus the port for TCP services. The fields are joined with a non-printing separator and hashed with MD5. These identifiers come from the webhook event schemas in the Domotz Public API definition. Changes to device name, state value, or time do not change the Alert Key.
@@ -110,7 +106,6 @@ Alert profiles bound through the alert-profile endpoints of the Domotz Public AP
One `device_tcp` notification can list several ports. Flashduty creates one event per port, in ascending port order, and processes at most 50. Device discovery, feature discovery, and MIB discovery are accepted but create no alert. A state value outside the table returns a parameter error.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -125,7 +120,6 @@ One `device_tcp` notification can list several ports. Flashduty creates one even
| `trigger_name` | SNMP trigger name |
## Troubleshooting
----
- **No alerts arrive**: confirm the Alert Rule is applied to a device or collector (**Applied To** is not `-`) and lists this webhook channel under **Notification Channels**
- **An alert does not recover**: only the events with a recovery condition in the table recover on their own; rely on auto-close for the rest
diff --git a/en/on-call/integration/alert-integration/alert-sources/dotcom-monitor.mdx b/en/on-call/integration/alert-integration/alert-sources/dotcom-monitor.mdx
index 42adcf29..3c3e9fe3 100644
--- a/en/on-call/integration/alert-integration/alert-sources/dotcom-monitor.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/dotcom-monitor.mdx
@@ -1,5 +1,6 @@
---
title: "Dotcom-Monitor alert integration"
+sidebarTitle: "Dotcom-Monitor"
description: "Send Dotcom-Monitor website, API and server monitoring alerts to Flashduty On-call through an HTTP Webhook and a JSON alert template. Alerts close automatically when the device recovers."
keywords: ["alert integration", "Dotcom-Monitor", "webhook", "website monitoring", "synthetic monitoring", "UserView", "WebView"]
---
@@ -9,7 +10,6 @@ Dotcom-Monitor is a cloud service for website, API and server monitoring. Its **
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure Dotcom-Monitor
----
@@ -76,7 +75,6 @@ Make a monitoring device fail (for example, point its target at a page that does
## Alert Key
----
Flashduty computes the Alert Key from the device name (`device_name`). Both the alert and the recovery notification of Dotcom-Monitor refer to the same monitoring device, so they land on the same Flashduty alert.
@@ -87,7 +85,6 @@ Flashduty computes the Alert Key from the device name (`device_name`). Both the
Requests without `device_name` are rejected.
## Alert lifecycle
----
Flashduty handles messages by the `notification_type` field, case-insensitively:
@@ -99,12 +96,10 @@ Flashduty handles messages by the `notification_type` field, case-insensitively:
Any other value, including `TEST`, is rejected with a parameter error. Dotcom-Monitor's variables reference lists a `TEST` type but does not say whether the test send uses it, so Flashduty has no separate handling for it; verify with a real device state change. Repeated notifications received while the device stays in error merge into the same alert.
## Severity
----
Dotcom-Monitor messages carry no severity field. A device error means the monitored target is unavailable, so it is fixed at **Critical**. A recovery event keeps the severity of the original alert.
## Alert content
----
- **Title**: the device name
- **Description**: error type, error code, error reason and the failing target URL
@@ -113,7 +108,6 @@ Dotcom-Monitor messages carry no severity field. A device error means the monito
Dotcom-Monitor HTML-encodes the text it substitutes into the template; Flashduty decodes it before use.
## Troubleshooting
----
- **A test notification returns a parameter error**: a request whose `notification_type` is `TEST` is not accepted and creates no alert. This does not mean the setup is wrong; verify with a real device state change
- **Request rejected with a missing `device_name` or an unsupported `notification_type`**: check that the field names in the alert template match the template above and that Data Type is Raw JSON
diff --git a/en/on-call/integration/alert-integration/alert-sources/duplicati.mdx b/en/on-call/integration/alert-integration/alert-sources/duplicati.mdx
index 6d3b0846..88530f2f 100644
--- a/en/on-call/integration/alert-integration/alert-sources/duplicati.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/duplicati.mdx
@@ -1,5 +1,6 @@
---
title: "Duplicati alert integration"
+sidebarTitle: "Duplicati"
description: "Send Duplicati backup failures, warnings, and recoveries to Flashduty On-call through its HTTP JSON notification."
keywords: ["alert integration", "Duplicati", "backup", "webhook", "send-http-json-urls"]
---
@@ -9,7 +10,6 @@ After every backup run, Duplicati can send a JSON report to a URL you choose. Se
## In Flashduty On-call
----
You can get the integration Push URL in either of the following two ways.
@@ -30,7 +30,6 @@ You can get the integration Push URL in either of the following two ways.
## Configure Duplicati
----
The `--send-http-json-urls` option is available in Duplicati 2.0.9.106 and later. This integration was verified with 2.4.0.0.
@@ -66,7 +65,6 @@ Duplicati has no "send test notification" button, so verification needs real bac
## Alert Key
----
Flashduty builds the Alert Key from `Extra.machine-id` and `Extra.backup-id` in the Duplicati report. The Duplicati documentation defines `%machine-id%` as the unique random identifier assigned to the machine and `%backup-id%` as the identifier assigned to the backup. We verified on a real Duplicati 2.4.0.0 that both fields stay the same when one backup job fails and then succeeds.
@@ -78,7 +76,6 @@ Flashduty builds the Alert Key from `Extra.machine-id` and `Extra.backup-id` in
If you delete a job and create it again, it gets a new `backup-id`; close any open alert of the old job manually.
## Status and severity
----
| Duplicati `Data.ParsedResult` | Flashduty status or severity |
| :--- | :--- |
@@ -90,7 +87,6 @@ If you delete a job and create it again, it gets a new `backup-id`; close any op
An empty or any other value, including `Unknown`, is rejected. Duplicati only sends a report when a backup runs: if a job is disabled or stops running, its open alert does not recover and must be closed manually.
## Troubleshooting
----
- **Flashduty receives no events**: confirm the option is `send-http-json-urls` and the Push URL is complete with `integration_key`
- **Flashduty returns a parameter error**: confirm you did not use `--send-http-url` or the form format; the report must be JSON and contain `Extra.backup-id`
diff --git a/en/on-call/integration/alert-integration/alert-sources/dynatrace.mdx b/en/on-call/integration/alert-integration/alert-sources/dynatrace.mdx
index 10a12b8f..7b7ef8b3 100644
--- a/en/on-call/integration/alert-integration/alert-sources/dynatrace.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/dynatrace.mdx
@@ -1,5 +1,6 @@
---
title: "Dynatrace Alert Events"
+sidebarTitle: "Dynatrace"
description: "Sync Dynatrace alert events to Flashduty via webhook to achieve automated alert noise reduction."
---
@@ -8,89 +9,87 @@ Sync Dynatrace alert events to Flashduty via webhook to achieve automated alert
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this simpler option when you don't need to route alert events to different channels.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a specific channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Select **Dynatrace** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Dynatrace** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In Dynatrace
----
-## I. Dynatrace Alert Push Configuration
1. Log in to your Dynatrace console
2. Select `Apps` in the left navigation bar and find `Settings` in the `Manage` area
-
+
3. Find `Integration` and select `Problem notifications`
-
+
4. Click `Add notification`
-
+
5. Under `Notification type`, select `Custom Integration`
6. Fill in `Display name` with `Flashduty`
7. In `Webhook URL`, enter the integration push URL (generated after saving the integration name on the current page)
8. Keep `Call webhook if problem is closed` enabled
-
+
9. Under `Custom payload`, enter the following content:
-```
-{
- "State":"{State}",
- "PID":"{PID}",
- "ProblemTitle":"{ProblemTitle}",
- "ProblemImpact":"{ProblemImpact}",
- "ProblemDetails":"{ProblemDetailsText}",
- "ProblemURL":"{ProblemURL}",
- "ProblemSeverity":"{ProblemSeverity}",
- "ImpactedEntityNames":"{ImpactedEntityNames}",
- "Tags":"{Tags}"
-}
-```
-
-
+ ```
+ {
+ "State":"{State}",
+ "PID":"{PID}",
+ "ProblemTitle":"{ProblemTitle}",
+ "ProblemImpact":"{ProblemImpact}",
+ "ProblemDetails":"{ProblemDetailsText}",
+ "ProblemURL":"{ProblemURL}",
+ "ProblemSeverity":"{ProblemSeverity}",
+ "ImpactedEntityNames":"{ImpactedEntityNames}",
+ "Tags":"{Tags}"
+ }
+ ```
+
+
10. Click `Save changes` to complete the setup
-## II. Status Mapping
-
+## Status Mapping
|Dynatrace|Flashduty|Status|
|---|---|---|
diff --git a/en/on-call/integration/alert-integration/alert-sources/ecloud-cm.mdx b/en/on-call/integration/alert-integration/alert-sources/ecloud-cm.mdx
index cd685fda..115c7cd6 100644
--- a/en/on-call/integration/alert-integration/alert-sources/ecloud-cm.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/ecloud-cm.mdx
@@ -1,5 +1,6 @@
---
title: "China Mobile Cloud (ecloud) Cloud Monitor integration"
+sidebarTitle: "China Mobile Cloud (ecloud) Cloud Monitor"
description: "Sync China Mobile Cloud Cloud Monitor alerts to Flashduty On-call through the custom webhook of an alarm contact. Alerts close automatically when they recover."
keywords: ["alert integration", "China Mobile Cloud", "ecloud", "Cloud Monitor", "移动云", "Webhook"]
---
@@ -9,7 +10,6 @@ Push China Mobile Cloud (ecloud) Cloud Monitor alerts to Flashduty On-call throu
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## In China Mobile Cloud
----
@@ -62,7 +61,6 @@ When an alarm rule in the policy triggers or recovers, China Mobile Cloud pushes
## Alert Key
----
Every push from China Mobile Cloud carries an alarm ID (`alarmId`). According to China Mobile Cloud, `alarmId` stays the same for alarms that the same rule keeps raising on the same resource. Flashduty computes the Alert Key from `alarmId`, so:
@@ -73,7 +71,6 @@ Every push from China Mobile Cloud carries an alarm ID (`alarmId`). According to
Requests without `alarmId` are rejected.
## Status and severity
----
The alert recovers when `recover` is `true`. Any other value is treated as a trigger. The severity comes from the alarm level (`alarmLevel`):
@@ -88,7 +85,6 @@ The alert recovers when `recover` is `true`. Any other value is treated as a tri
A recovered alert keeps the severity it had before recovery.
## Alert content and labels
----
The alert title combines the resource name (`resourceName`) and the metric name (`metricName`), for example `ECS-45273803 CPU利用率`. The alert description is the alarm content (`content`) pushed by China Mobile Cloud, which includes the trigger value and trigger time.
@@ -111,7 +107,6 @@ The alert title combines the resource name (`resourceName`) and the metric name
| `notify_time` | Time of this alarm notification (`notifyTime`) |
## Troubleshooting
----
- **Flashduty receives no alerts**: Confirm that the alarm policy notifies the alarm contact that has the webhook address, and that the address is complete and includes `integration_key`
- **Flashduty returns a parameter error**: Confirm that the pushed content includes `alarmId`
diff --git a/en/on-call/integration/alert-integration/alert-sources/edge-delta.mdx b/en/on-call/integration/alert-integration/alert-sources/edge-delta.mdx
index 19eecd38..22fdbb52 100644
--- a/en/on-call/integration/alert-integration/alert-sources/edge-delta.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/edge-delta.mdx
@@ -1,5 +1,6 @@
---
title: "Edge Delta alert integration"
+sidebarTitle: "Edge Delta"
description: "Send Edge Delta monitor alert, warning and recovery notifications to Flashduty On-call through an Edge Delta webhook integration."
keywords: ["alert integration", "Edge Delta", "observability", "webhook", "monitor"]
---
@@ -9,7 +10,6 @@ An Edge Delta webhook integration has no fixed request body: you write the paylo
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## In Edge Delta
----
@@ -90,7 +89,6 @@ Click **Test Notifications** in the monitor's notification section to send a tes
## Payload
----
| Field | Meaning | In Flashduty |
| :--- | :--- | :--- |
@@ -104,7 +102,6 @@ Click **Test Notifications** in the monitor's notification section to send a tes
| `time` | `$EVENT_DATE`, the event time | Added to the description |
## Alert Key
----
Flashduty builds the Alert Key from `monitor` and `group`. The alert, warning and recovery requests of one monitor (and one group) carry the same `monitor` and `group`, so they land on the same alert; different groups stay separate. A monitor without group by sends `*` as `group`, so the whole monitor maps to one alert; a monitor with group by sends `:` (for example `ed.tag:docker-logs`). `value`, `metric` and the time are not part of the Alert Key.
@@ -113,7 +110,6 @@ The Edge Delta documentation does not provide a stable ID for monitor events, so
## Status and severity
----
| `status` | Flashduty status or severity |
| :--- | :--- |
@@ -124,7 +120,6 @@ The Edge Delta documentation does not provide a stable ID for monitor events, so
If `monitor` or `status` is missing, or `status` is not one of the values above, Flashduty returns a parameter error.
## FAQ
----
@@ -141,7 +136,6 @@ If the monitor has a renotification period, Edge Delta sends the alert request a
## Troubleshooting
----
- **The monitor shows `Receiver webhook-flashduty-warning does not exist`**: every `@webhook-...` handle in the notification must match an existing integration; create it or remove its block
- **Edge Delta does not push**: confirm the monitor's Notifications reference `@webhook-` inside the matching `{{#is_alert}}` or similar block
diff --git a/en/on-call/integration/alert-integration/alert-sources/elastalert2.mdx b/en/on-call/integration/alert-integration/alert-sources/elastalert2.mdx
index f6022bbf..da9a4d42 100644
--- a/en/on-call/integration/alert-integration/alert-sources/elastalert2.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/elastalert2.mdx
@@ -1,5 +1,6 @@
---
title: "ElastAlert2 Alert Integration Guide"
+sidebarTitle: "ElastAlert2"
description: "Push alert events to Flashduty through ElastAlert2's Provider to achieve automated alert noise reduction."
---
@@ -8,43 +9,43 @@ Push ElastAlert2 alerts to Flashduty via webhook, to achieve automatic alert noi
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Dedicated Integration
Choose this method when you don't need to route alert events to different channels. It's simpler and recommended.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **ElastAlert 2** integration and click **Save** to generate a card
4. Click the generated card to view the **Integration Key**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this method when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **ElastAlert 2** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **Integration Key** for later use
5. Done
-
+
+
## In ElastAlert 2
----
### Configure ElastAlert 2 Alerts
Follow the [ElastAlert Flashduty](https://elastalert2.readthedocs.io/en/latest/alerts.html#flashduty) push configuration document
diff --git a/en/on-call/integration/alert-integration/alert-sources/elastic.mdx b/en/on-call/integration/alert-integration/alert-sources/elastic.mdx
index e3ab785b..00065002 100644
--- a/en/on-call/integration/alert-integration/alert-sources/elastic.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/elastic.mdx
@@ -1,5 +1,6 @@
---
title: "Elastic alert integration"
+sidebarTitle: "Elastic"
description: "Send Elastic (Kibana Alerting) rule alerts and recoveries to Flashduty On-call through the Kibana Webhook connector."
keywords: ["alert integration", "Elastic", "Kibana", "Kibana Alerting", "webhook", "Elastic Observability", "Elastic Security"]
---
@@ -11,7 +12,6 @@ This integration works with Elastic Cloud, Elastic Cloud Serverless, and self-ma
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -20,7 +20,7 @@ You can obtain an integration push URL in either of the following ways.
Choose this method when you do not need to route alerts to different channels.
-
+
1. In the Flashduty console, select **Channel** and open a channel
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration**
@@ -35,7 +35,7 @@ Choose this method when you do not need to route alerts to different channels.
Choose this method when you need to route alerts to different channels based on the payload.
-
+
1. In the Flashduty console, select **Integration Center → Alert Events**
2. Select **Elastic** and enter an integration name
@@ -48,14 +48,12 @@ Choose this method when you need to route alerts to different channels based on
## Prerequisites
----
- **Subscription**: the Kibana Webhook and PagerDuty connectors require an Elastic Gold subscription or higher (Basic does not include them); a 30-day trial license also works. See [Elastic subscriptions](https://www.elastic.co/subscriptions).
- **Network**: Kibana must be able to reach the Flashduty push URL. If your self-managed Kibana sets [`xpack.actions.allowedHosts`](https://www.elastic.co/docs/reference/kibana/configuration-reference/alerting-settings#action-settings) in `kibana.yml`, add the push URL's host name (for example `api.flashcat.cloud`) to that list, otherwise the connector refuses to send.
- **Permissions**: you need Kibana privileges to create connectors and edit rules. See [Alerting security](https://www.elastic.co/docs/explore-analyze/alerting/alerts/alerting-setup#alerting-security).
## In Kibana
----
@@ -99,7 +97,6 @@ Let the rule actually match its condition and confirm that Flashduty receives an
## Action template
----
Paste the following JSON into the **Body** of every action:
@@ -147,7 +144,6 @@ To turn fields from the rule context into Flashduty labels (for routing or noise
Custom and built-in labels together are limited to 50. Keys may contain only letters, digits, and underscores and must not start with a digit. A built-in label overrides a custom label with the same key.
## Alert Key
----
Flashduty builds the Alert Key from `rule_id` and `alert_id`.
@@ -160,7 +156,6 @@ Flashduty builds the Alert Key from `rule_id` and `alert_id`.
Changes to the rule name, tags, severity, description, or action group do not change the Alert Key. For example, when a Metric threshold rule's group moves from `Warning` to `Alert`, both notifications carry the same Alert Key.
## Status and severity
----
| Condition | Flashduty status or severity |
| :--- | :--- |
@@ -175,7 +170,6 @@ Changes to the rule name, tags, severity, description, or action group do not ch
Security detection rules do not send Recovered notifications. Each detection alert becomes a separate Flashduty alert that you close manually or through auto-close in Flashduty.
## Use the PagerDuty connector (optional)
----
If your rules already use the Kibana PagerDuty connector, you can point it at the Flashduty [PagerDuty Compatible integration](/en/on-call/integration/alert-integration/alert-sources/pagerduty) without rewriting the actions. Alerts sent this way arrive through Flashduty's PagerDuty Compatible integration, not the Elastic integration on this page.
@@ -185,7 +179,6 @@ If your rules already use the Kibana PagerDuty connector, you can point it at th
4. Keep the **DedupKey** that Kibana pre-fills, `{{rule.id}}:{{alert.id}}`, on both actions and do not clear it, so the resolve event closes the matching alert. With an empty DedupKey on the Trigger action, Kibana sends no `dedup_key`, Flashduty generates a random Alert Key for each trigger, and the resolve event cannot close it
## Troubleshooting
----
- **Kibana reports `target url "..." is not added to the Kibana config xpack.actions.allowedHosts`**: add the Flashduty push URL's host name to `xpack.actions.allowedHosts`
- **Flashduty returns an error starting with `alert_id is required`**: the action's **Action frequency** is Summary of alerts; change it to For each alert
diff --git a/en/on-call/integration/alert-integration/alert-sources/email.mdx b/en/on-call/integration/alert-integration/alert-sources/email.mdx
index d43d7090..0d6038c5 100644
--- a/en/on-call/integration/alert-integration/alert-sources/email.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/email.mdx
@@ -1,5 +1,6 @@
---
title: "Email Integration"
+sidebarTitle: "Email"
description: "Generate a unique email address in Flashduty to synchronize alert triggers and recoveries through email"
---
@@ -8,7 +9,6 @@ Generate a unique email address in Flashduty to synchronize alert triggers and r
## Steps
----
### Create Email Integration
@@ -18,24 +18,25 @@ You can obtain an email address through either of these two methods:
Choose this simpler option when you don't need to route alerts to different channels.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration**, and enter the integration page
3. Choose **Email** integration, click **Save** to generate a card
4. Click the generated card to view the **Email Address**, copy it for later use, and you're done
-
+
+
#### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alerts**, and enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alerts**, and enter the integration selection page
2. Select **Email** integration:
- **Integration Name**: Define a name for the current integration
- **Email Address**: Set an easy-to-remember prefix for the email, which must be unique within your account
@@ -44,7 +45,8 @@ Choose this option when you need to route alerts to different channels based on
4. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
5. Done
-
+
+
### Customize Email Integration
@@ -87,15 +89,15 @@ In the integration card (edit and preview), the **Silence Detection** (Heartbeat
1. The system will reject emails larger than 5MB
2. If the email text content exceeds 128KB, the system will truncate it and add a label in the incident details:
-```
-body_cut = true
-```
+ ```
+ body_cut = true
+ ```
3. If the email contains attachments, the system will discard them and add a label in the incident details:
-```
-attachment_stripped = true
-```
+ ```
+ attachment_stripped = true
+ ```
4. For new alerts triggered by email, **the title is the email subject, and the description is the email content**
@@ -104,6 +106,5 @@ attachment_stripped = true
## Severity Mapping
----
Currently, all alerts pushed to Flashduty through the email integration are set to Warning severity. However, you can customize the severity using the [alert pipeline](/en/on-call/integration/alert-integration/alert-pipelines).
diff --git a/en/on-call/integration/alert-integration/alert-sources/emqx.mdx b/en/on-call/integration/alert-integration/alert-sources/emqx.mdx
index da7c71ee..c7bfa8aa 100644
--- a/en/on-call/integration/alert-integration/alert-sources/emqx.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/emqx.mdx
@@ -1,5 +1,6 @@
---
title: "EMQX Alert Integration"
+sidebarTitle: "EMQX"
description: "Push EMQX alert events to Flashduty via Webhook for automated alert noise reduction"
keywords: ["alert integration", "EMQX", "MQTT", "monitoring alert", "data ingestion"]
---
@@ -7,7 +8,6 @@ keywords: ["alert integration", "EMQX", "MQTT", "monitoring alert", "data ingest
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
@@ -15,35 +15,36 @@ You can obtain an integration push URL through either of these two methods:
Choose this simpler option when you don't need to route alert events to different channels.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Select **EMQX** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **EMQX** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In EMQX
----
EMQX Cloud (hosted service) and self-hosted EMQX are integrated differently. Choose the steps that match your deployment.
@@ -130,7 +131,6 @@ Use the same request body template as Step 1, but set `event_status` to `Ok`, so
## Severity Mapping
----
@@ -147,7 +147,6 @@ Use the same request body template as Step 1, but set `event_status` to `Ok`, so
## FAQ
----
Why am I not receiving alerts in Flashduty?
diff --git a/en/on-call/integration/alert-integration/alert-sources/extrahop.mdx b/en/on-call/integration/alert-integration/alert-sources/extrahop.mdx
index 7f5ae28f..790b4f2d 100644
--- a/en/on-call/integration/alert-integration/alert-sources/extrahop.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/extrahop.mdx
@@ -1,5 +1,6 @@
---
title: "ExtraHop alert integration"
+sidebarTitle: "ExtraHop"
description: "Send ExtraHop Reveal(x) security and performance detections to Flashduty On-call through a detection notification rule's Custom Webhook."
keywords: ["alert integration", "ExtraHop", "Reveal(x)", "RevealX", "NDR", "NPM", "network detection", "webhook"]
---
@@ -11,7 +12,6 @@ ExtraHop's documentation does not describe a notification when a detection is cl
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can get the integration push URL in either of the following ways.
## Configure ExtraHop
----
You need NDR or NPM module access with full write privileges or higher. Webhooks are sent over TCP 443 (HTTPS), so ExtraHop must be able to reach the Flashduty push URL.
@@ -80,19 +79,16 @@ If you select **Send once per detection**, ExtraHop requires a custom payload. A
## Alert Key
----
Flashduty uses `id` (ExtraHop defines it as "The unique identifier for the detection") as the Alert Key. Every update of one detection carries the same `id` and merges into one alert. Changes to the title, description, risk score, and time do not change the Alert Key. Requests without `id` are rejected.
## Detections and recovery
----
ExtraHop detection notifications cover creation and updates only. The documentation does not describe a notification when a detection is closed or resolved. Every notification Flashduty receives is a trigger, and none recovers an alert automatically.
Turn on the channel's [auto-resolve timeout](/en/on-call/channel/create-edit), 24 hours recommended, or close the alert by hand once the detection is handled.
## Severity
----
Severity comes from `risk_score`, using the same bands as the ExtraHop console colors:
@@ -104,7 +100,6 @@ Severity comes from `risk_score`, using the same bands as the ExtraHop console c
| Missing, 0, or non-numeric (performance detections have no risk score) | Warning |
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -122,7 +117,6 @@ Severity comes from `risk_score`, using the same bands as the ExtraHop console c
The alert title is `title`, falling back to `type` and then `ExtraHop detection `. The description is the detection description followed by the link to the detection.
## Troubleshooting
----
- **Flashduty returns a parameter error**: check that the URL is complete and includes `integration_key`, and that the payload contains `id`
- **Alerts never close**: ExtraHop sends no recovery notification. Turn on the channel's auto-resolve timeout or close alerts by hand
diff --git a/en/on-call/integration/alert-integration/alert-sources/fail2ban.mdx b/en/on-call/integration/alert-integration/alert-sources/fail2ban.mdx
index f5509fe9..5e311ce2 100644
--- a/en/on-call/integration/alert-integration/alert-sources/fail2ban.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/fail2ban.mdx
@@ -1,5 +1,6 @@
---
title: "Fail2ban alert integration"
+sidebarTitle: "Fail2ban"
description: "Add a custom Fail2ban action that uses curl to push ban and unban events to Flashduty's standard alert event integration; unbanning closes the alert automatically."
keywords: ["alert integration", "Fail2ban", "intrusion prevention", "IP ban", "curl", "standard alert event"]
---
@@ -9,7 +10,6 @@ Fail2ban has no built-in webhook notification, but an action is just a shell com
## In Flashduty On-call
----
You can get the push URL in either of the two ways below. **In both cases choose Standard Alert Event as the integration type**, not Fail2ban.
@@ -30,7 +30,6 @@ You can get the push URL in either of the two ways below. **In both cases choose
## Configure in Fail2ban
----
Run these steps on the host where Fail2ban runs, as root.
@@ -91,7 +90,6 @@ fail2ban-client set sshd unbanip 192.0.2.10
## Field mapping
----
| Fail2ban | Flashduty |
| :--- | :--- |
@@ -103,7 +101,6 @@ fail2ban-client set sshd unbanip 192.0.2.10
| `labels` | Labels `jail`, `ip`, `failures`, `bantime` |
## Recovery and deduplication
----
- Fail2ban runs `actionunban` when the ban time expires, and Flashduty closes the alert with the same `alert_key`.
- With a permanent ban (`bantime = -1`) the IP is never unbanned, so the alert does not close by itself. Enable [auto-resolve timeout](/en/on-call/channel/create-edit) on the channel that receives this integration, or close the alert manually once handled.
@@ -111,7 +108,6 @@ fail2ban-client set sshd unbanip 192.0.2.10
- `norestored = 1` stops Fail2ban from notifying for bans restored from its database after a restart, which would otherwise produce a burst of duplicate alerts.
## Troubleshooting
----
- **Flashduty receives nothing**: confirm `fail2ban-client reload` was run; call the push URL with `curl` from the same host to check the response and that api.flashcat.cloud is reachable
- **`InvalidParameter` is returned**: the push URL is missing `integration_key`, or the JSON was broken by quoting; make sure there are no stray line breaks in `[Definition]`
diff --git a/en/on-call/integration/alert-integration/alert-sources/falco.mdx b/en/on-call/integration/alert-integration/alert-sources/falco.mdx
index 4f5fc676..0feae027 100644
--- a/en/on-call/integration/alert-integration/alert-sources/falco.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/falco.mdx
@@ -1,5 +1,6 @@
---
title: "Falco alert integration"
+sidebarTitle: "Falco"
description: "Send Falco runtime security detections to Flashduty On-call through the Falcosidekick webhook output or Falco's built-in http_output."
keywords: ["alert integration", "Falco", "Falcosidekick", "webhook", "runtime security"]
---
@@ -9,7 +10,6 @@ Use the Falcosidekick webhook output (or Falco's built-in `http_output`) to send
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure Falco
----
Pushing through Falcosidekick is recommended because `minimumpriority` filters low-priority events at the source. Without Falcosidekick, Falco can push directly.
@@ -78,7 +77,6 @@ The push URL contains `integration_key`. Paste it in full, including the paramet
## Verify
----
Send a request to the Falcosidekick `/test` endpoint (it listens on port 2801 by default):
@@ -91,7 +89,6 @@ Flashduty opens a new alert titled `Test rule` with Info severity. The test aler
Then trigger a real rule on a monitored host or container (for example, open an interactive shell in a container to fire `Terminal shell in container`) and confirm the alert appears in Flashduty.
## Alert Key
----
Each Falco event is an independent detection with no lifecycle, so each event becomes its own alert:
@@ -101,7 +98,6 @@ Each Falco event is an independent detection with no lifecycle, so each event be
A request without `rule` is rejected, because Flashduty cannot tell which rule fired.
## Severity
----
| Falco `priority` | Flashduty severity |
| :--- | :--- |
@@ -111,17 +107,14 @@ A request without `rule` is rejected, because Flashduty cannot tell which rule f
| Empty or unknown | Warning |
## Labels
----
The title is the rule name (`rule`) and the description is `output`. These fields become labels: `rule`, `priority`, `hostname` (also used as `resource`), `falco_source`, `falco_uuid`, and `tags` (comma-separated). Every field in `output_fields` also becomes a label, with `.` in the key replaced by `_`, for example `container.id` becomes `container_id` and `k8s.pod.name` becomes `k8s_pod_name`. At most 50 labels are kept.
## Recovery
----
Falco sends no recovery event, so alerts do not resolve on their own. Turn on the [auto-resolve timeout](/en/on-call/channel/create-edit) for the channel that receives Falco alerts (24 hours suggested; adjust it to how quickly you need to respond), or close alerts by hand after handling them.
## Troubleshooting
----
- **Falcosidekick logs a webhook error**: check that the address is complete, includes `integration_key`, and that `api.flashcat.cloud` is reachable from where Falcosidekick runs
- **Flashduty returns a parameter error**: make sure Falco has `json_output: true` and the body is valid JSON containing `rule`
diff --git a/en/on-call/integration/alert-integration/alert-sources/fastnetmon.mdx b/en/on-call/integration/alert-integration/alert-sources/fastnetmon.mdx
index d15df6d7..acef0019 100644
--- a/en/on-call/integration/alert-integration/alert-sources/fastnetmon.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/fastnetmon.mdx
@@ -1,5 +1,6 @@
---
title: "FastNetMon alert integration"
+sidebarTitle: "FastNetMon"
description: "Send FastNetMon Advanced DDoS ban and unban notifications to Flashduty On-call through a web callback."
keywords: ["alert integration", "FastNetMon", "DDoS", "web callback", "ban", "unban", "BGP blackhole", "Flow Spec"]
---
@@ -9,7 +10,6 @@ Use the FastNetMon Advanced web callback to send DDoS ban (`ban`, `partial_block
## In Flashduty On-call
----
You can get the push URL in either of two ways.
@@ -30,7 +30,6 @@ You can get the push URL in either of two ways.
## In FastNetMon
----
@@ -69,7 +68,6 @@ Trigger an attack detection (for example, send test traffic above the ban thresh
## Payload
----
| Field | Meaning | In Flashduty |
| :--- | :--- | :--- |
@@ -85,7 +83,6 @@ Trigger an attack detection (for example, send test traffic above the ban thresh
Packet samples (`packet_dump`) and Flow Spec rules in ban notifications are not stored on the alert.
## Alert Key
----
The Alert Key identifies the attacked object: `ip` for host scope, `hostgroup_name` for host group scope. The ban, status updates and unban for one IP land on the same alert; different IPs or host groups are different alerts. Changes to severity, traffic data or `attack_uuid` do not change the Alert Key.
@@ -96,7 +93,6 @@ If a blackhole ban and a Flow Spec partial block are active on the same IP, they
A request without `ip` (or without `hostgroup_name` in host group scope) is rejected with a parameter error, because the unban could not be matched to its alert reliably. A request with any other `action` or `alert_scope` is rejected too.
## Status and severity
----
| FastNetMon `attack_severity` | Flashduty severity |
| :--- | :--- |
@@ -108,7 +104,6 @@ A request without `ip` (or without `hostgroup_name` in host group scope) is reje
The official samples only show `middle`; the other values follow common naming. On unban the alert recovers and keeps the severity of the last attack notification.
## FAQ
----
@@ -131,7 +126,6 @@ This integration targets the JSON format that FastNetMon Advanced uses for web c
## Troubleshooting
----
- **No alerts arrive**: on the FastNetMon server, confirm `web_callback_enabled` is on, `fcli commit` was run, and the server can reach the Flashduty push URL
- **Flashduty returns a parameter error**: confirm the request is a FastNetMon JSON notification and that `ip` (host scope) or `hostgroup_name` (host group scope) is not empty
diff --git a/en/on-call/integration/alert-integration/alert-sources/firebase-crashlytics.mdx b/en/on-call/integration/alert-integration/alert-sources/firebase-crashlytics.mdx
index c8bd1b36..3d3e6ab6 100644
--- a/en/on-call/integration/alert-integration/alert-sources/firebase-crashlytics.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/firebase-crashlytics.mdx
@@ -1,5 +1,6 @@
---
title: "Firebase Crashlytics alert integration"
+sidebarTitle: "Firebase Crashlytics"
description: "Send new fatal, regression, and velocity alerts from Firebase Crashlytics to Flashduty On-call through a small Cloud Function."
keywords: ["alert integration", "Firebase", "Crashlytics", "Cloud Functions", "Eventarc", "crash", "mobile app"]
---
@@ -19,7 +20,6 @@ Firebase also sends a **stability digest** (`onStabilityDigestPublished`), a dai
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -40,7 +40,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Firebase
----
Crashlytics alert functions run on Cloud Functions (2nd gen). The Firebase project must be on the **Blaze (pay as you go)** plan to deploy them, even if actual usage stays inside the free tier — a billing account still has to be attached.
@@ -155,7 +154,6 @@ Crashlytics sends no "resolved" notification for any of these events, so alerts
## Alert Key
----
Flashduty computes the Alert Key from the event type `alert_type`, the app ID `app_id`, and Crashlytics' issue ID `issue_id` (the official `Issue.id`). One Cloud Function deployment (one push URL) can forward events for every app in the project (see "Scope to one app" above), and Firebase does not document `issue_id` as unique across apps, so `app_id` is folded in too — this keeps two apps from merging into one alert if they happen to get the same issue ID. As a result:
@@ -167,7 +165,6 @@ Flashduty computes the Alert Key from the event type `alert_type`, the app ID `a
If a request is missing `issue_id`, Flashduty rejects it.
## Severity
----
Crashlytics alert events carry no severity. Flashduty sets it by event type:
@@ -182,7 +179,6 @@ Crashlytics alert events carry no severity. Flashduty sets it by event type:
To override this with a fixed severity, append `&severity=Critical` (or `Warning`, `Info`) to the push URL.
## Alert content
----
The alert title is `Firebase Crashlytics : `, for example `Firebase Crashlytics new fatal issue: java.lang.NullPointerException`. The description includes the issue subtitle (the class and method where the crash happened) and the app version; a regression alert also includes the time the issue was previously marked resolved, and a velocity alert also includes the crash session count, crash percentage, and the version where the issue first appeared.
@@ -198,7 +194,6 @@ The alert title is `Firebase Crashlytics : `, for examp
| `crash_count` / `crash_percentage` / `first_version` | Velocity alerts only: crash session count, crash percentage, and the version where the issue first appeared |
## Troubleshooting
----
- **Function deployment fails or reports a permission error**: Make sure the Firebase project is on the Blaze plan and the account deploying it has permission to deploy Cloud Functions on that project
- **A crash happened but no alert arrives**: Crashlytics can take a few minutes to process a crash log and trigger the alert function; check `firebase functions:log` to see whether the function ran and whether `fetch` threw an error
diff --git a/en/on-call/integration/alert-integration/alert-sources/firefly.mdx b/en/on-call/integration/alert-integration/alert-sources/firefly.mdx
index 612a9dab..8194230f 100644
--- a/en/on-call/integration/alert-integration/alert-sources/firefly.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/firefly.mdx
@@ -1,5 +1,6 @@
---
title: "Firefly alert integration"
+sidebarTitle: "Firefly"
description: "Send configuration drift, unmanaged resource, ghost resource, and insight events detected by Firefly to Flashduty On-call through a webhook."
keywords: ["alert integration", "Firefly", "webhook", "configuration drift", "drift", "IaC", "unmanaged resource"]
---
@@ -9,7 +10,6 @@ Use Firefly's Webhook notification integration to send the events Firefly detect
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Firefly
----
@@ -77,7 +76,6 @@ Firefly does not document the content of the test notification. If it carries no
## Alert Key
----
Each resource (one entry in `samples`) produces one alert. The Alert Key is computed from the event type `notificationType` and the resource's `FRN`; when `FRN` is empty, the resource's `ARN` is used instead. As a result:
@@ -88,7 +86,6 @@ Each resource (one entry in `samples`) produces one alert. The Alert Key is comp
If a resource has neither `FRN` nor `ARN`, Flashduty rejects the whole delivery.
## Status and severity
----
Firefly's Webhook notifications carry no severity. Flashduty sets the severity by event type, and every event is a trigger:
@@ -98,7 +95,6 @@ Firefly's Webhook notifications carry no severity. Flashduty sets the severity b
| `UnmanagedResource` | Info |
## Title, description, and labels
----
The alert title is `Firefly : ()`, for example `Firefly drift detected: web-1 (aws_instance)`. The description of a `Drift` alert lists each drifted attribute on its own line with its IaC value and its live cloud value.
@@ -119,7 +115,6 @@ The alert title is `Firefly : ()`, fo
The actor information in Firefly's delivery (`ownerData.userIdentity`) is not written to labels.
## Troubleshooting
----
- **Firefly reports an invalid webhook URL when creating the integration**: Make sure the URL is complete, includes `integration_key`, and **Add custom credentials** is unchecked
- **Flashduty returns an invalid parameter error**: Make sure the `integration_key` in the push URL belongs to a Firefly integration
diff --git a/en/on-call/integration/alert-integration/alert-sources/fivetran.mdx b/en/on-call/integration/alert-integration/alert-sources/fivetran.mdx
index 59ff56c4..62867260 100644
--- a/en/on-call/integration/alert-integration/alert-sources/fivetran.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/fivetran.mdx
@@ -1,5 +1,6 @@
---
title: "Fivetran alert integration"
+sidebarTitle: "Fivetran"
description: "Send failed syncs, failed connection tests, and their recoveries from Fivetran to Flashduty On-call through a webhook."
keywords: ["alert integration", "Fivetran", "data pipeline", "sync failure", "webhook"]
---
@@ -9,7 +10,6 @@ Use Fivetran webhooks to send sync results and connection test results of a conn
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## In Fivetran
----
Fivetran webhooks are created through the [Webhook REST API](https://fivetran.com/docs/developer-resources/webhooks), authenticated with a Fivetran API key and secret using Basic authentication. A webhook is either account-level (covers every connection in the account) or group-level (covers the connections in one group).
@@ -82,14 +81,12 @@ Fivetran's **Test a Webhook** call (`POST /v1/webhooks/{webhookId}/test` with bo
## Alert Key
----
Flashduty uses the connection ID (`connector_id` in the webhook) plus the event family (sync or connection test) as the Alert Key. Fivetran documents `connector_id` as "the ID of the connection for which the webhooks are sent", and every sync and connection test of one connection carries the same value. Sync and connection test use separate Alert Keys, so a successful sync does not close a connection test alert that is still unresolved.
Changes in the per-sync `sync_id`, the failure reason, or the time do not change the Alert Key. A sync or connection test event without `connector_id` is rejected.
## Status and severity
----
| Event | `data.status` | Status | Flashduty severity |
| :--- | :--- | :--- | :--- |
@@ -107,7 +104,6 @@ For an ignored delivery, Flashduty returns success without creating an alert or
Each `sync_end` is an independent delivery with no progress updates: a triggered alert stays active until the next `SUCCESSFUL` sync of the same connection. If the connection is paused or deleted, the triggered alert does not recover on its own. Close it manually in Flashduty, or configure automatic closing after a timeout for the channel.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -125,7 +121,6 @@ Each `sync_end` is an independent delivery with no progress updates: a triggered
The alert description comes from the failure reason (`data.reason`) or the connection test message (`data.message`).
## Troubleshooting
----
- **Fivetran returns 400 when creating the webhook**: make sure the URL is HTTPS and reachable by Fivetran. Fivetran sends a test request on both creation and activation, and it must return 2xx. Flashduty answers that test request with 200 and opens a separate Info alert as described above
- **An alert does not recover**: make sure the webhook subscribes to `sync_end` and `connection_successful`. An expected reschedule and `CANCELED` do not produce a recovery
diff --git a/en/on-call/integration/alert-integration/alert-sources/flashcat.mdx b/en/on-call/integration/alert-integration/alert-sources/flashcat.mdx
index 152db1b5..a494ba60 100644
--- a/en/on-call/integration/alert-integration/alert-sources/flashcat.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/flashcat.mdx
@@ -1,5 +1,6 @@
---
title: "Nightingale/Flashcat Integration"
+sidebarTitle: "Nightingale/Flashcat"
description: "Push alert events from Nightingale (n9e) or Flashcat to Flashduty via webhook. When an alert is triggered, send a trigger event to Flashduty; when an alert recovers, send a recovery event to Flashduty"
---
@@ -12,20 +13,17 @@ In the Nightingale/Flashcat v8.0.0-beta.7+ version, you can configure the collab
## Prerequisites
----
### In Nightingale
-- You must have permission to modify **System Settings=>Global Notifications** or **Alert Management=>Alert Rules**.
+- You must have permission to modify **System Settings → Global Notifications** or **Alert Management → Alert Rules**.
- Your Nightingale server must be able to access the domain api.flashcat.cloud to push alerts to the external network.
## Supported Versions
----
This guide is compatible with **Nightingale V5 and V6** versions.
## Setup Steps
----
### In Flashduty
@@ -35,8 +33,8 @@ You can obtain an integration push URL through either of these two methods:
Choose this method when you don't need to route alert events to different channels - it's simpler.
-
- Expand
+
+
1. Enter the Flashduty console, select **Channels**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration**, and enter the add integration page
@@ -44,16 +42,17 @@ Choose this method when you don't need to route alert events to different channe
4. Click the generated card to view the **push URL**, copy it for later use
5. (Optional) Click the generated card, click the **Edit** button, select **Console URL**, enter the Nightingale console URL (domain part only), and Flashduty will generate a Nightingale details link for new alerts
-
+
+
#### Using Shared Integration
Choose this method when you need to route alert events to different channels based on the alert Payload information.
-
- Expand
+
+
- 1. Enter the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Enter the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Nightingale/Flashcat** integration:
- **Integration Name**: Define a name for the current integration
- **Console URL**: (Optional) Enter the Nightingale console URL (domain part only), and Flashduty will generate a Nightingale details link for new alerts
@@ -61,7 +60,8 @@ Choose this method when you need to route alert events to different channels bas
4. Click **Save** and copy the newly generated **push URL** for later use
5. Complete
-
+
+
## In Nightingale/Flashcat
@@ -72,7 +72,7 @@ In the new version, although you can configure the collaboration space directly
#### Step 1: Add Notification Media
-1. Log in to your n9e console, select Alerting > Media types and click **Add**
+1. Log in to your n9e console, select Alerting → Media types and click **Add**
2. Fill in the media name and identifier, select **Flashduty** type, and enter the integration push URL in the `URL` section
3. Click **Save** and complete
@@ -80,7 +80,7 @@ In the new version, although you can configure the collaboration space directly
#### Step 2: Configure Notification Rules
-1. Log in to your n9e console, select Alerting > Rules and click **Add** or edit the existing alert rules
+1. Log in to your n9e console, select Alerting → Rules and click **Add** or edit the existing alert rules
2. Configure the basic information as needed
3. Select the `Flashduty` notification media added in the previous step
4. Select the collaboration space (the collaboration space must be created in [Flashduty](https://console.flashcat.cloud/channel) in advance), and select other options as needed
@@ -90,7 +90,7 @@ In the new version, although you can configure the collaboration space directly
#### Step 3: Select Notification Rules in Alert Rules
-1. Log in to your n9e console, select Alerting > Alert Rules and click **Add** or edit the existing alert rules
+1. Log in to your n9e console, select Alerting → Alert Rules and click **Add** or edit the existing alert rules
2. Select the `Flashduty` notification rule added in the previous step, and select other options as needed
3. Click **Save** and complete
@@ -108,11 +108,11 @@ Choose one of the following two methods:
Select multiple alert rules and configure webhook in batch.
-1. Log in to your n9e console, select Alert Management > Alert Rules to enter the alert rules list page
+1. Log in to your n9e console, select Alert Management → Alert Rules to enter the alert rules list page
2. Select the alert rules you want to import in batch, choose batch update alert rules in the upper right corner
3. In the popup, select the "Callback URL" field and enter the integration push URL in the new input box, as shown below:
-
+
4. Return to the integration list, if the latest event time is displayed, the configuration is successful and events are being received
5. Complete
@@ -130,7 +130,7 @@ Nightingale supports configuring global webhook URLs in both the interface and c
2. Go to `System Settings-Notification Settings-Callback URL` page
3. As shown below, enable a new webhook, fill in the integration push URL in the `URL` section
-
+
4. Complete
@@ -161,8 +161,6 @@ Nightingale supports configuring global webhook URLs in both the interface and c
## Silence Detection
----
-
In the integration card (edit and preview), the **Silence Detection** (Heartbeat) setting is available below the alert push settings: if no valid event arrives within the configured interval, the system generates a Warning alert.
| Setting | Description |
@@ -172,7 +170,6 @@ In the integration card (edit and preview), the **Silence Detection** (Heartbeat
| **Auto-recover on new event** | Switch, on by default. When the next valid event arrives, the alert raised by silence detection is recovered automatically |
## Severity Mapping
----
Nightingale/Flashcat to Flashduty alert severity mapping:
@@ -183,7 +180,6 @@ Nightingale/Flashcat to Flashduty alert severity mapping:
| 3 | Info | Info |
## FAQ
----
Why am I not receiving alerts in Flashduty?
@@ -195,7 +191,7 @@ Nightingale/Flashcat to Flashduty alert severity mapping:
#### In Nightingale/Flashcat
- 1. First confirm if Nightingale has generated new alerts: Go to **Alert Management=>Alert History**, check if new alerts were generated after configuring the webhook, note that new alerts must be in **Triggered** status. If no new alerts were generated, please wait for new alerts to trigger and verify again.
+ 1. First confirm if Nightingale has generated new alerts: Go to **Alert Management → Alert History**, check if new alerts were generated after configuring the webhook, note that new alerts must be in **Triggered** status. If no new alerts were generated, please wait for new alerts to trigger and verify again.
2. After finding the alert, go to alert details and check the **Callback URL** section. Verify if the actual callback URL exactly matches the integration push URL. If they don't match, modify the **Alert Rules** and verify again.
3. If they match, you need to log into the Nightingale server and confirm it can access the external domain api.flashcat.cloud. If not, you first need to enable external network access for the server, or specifically enable access for Flashduty's domain.
4. If the network is fine, you need to continue investigating the server and look for related error logs.
diff --git a/en/on-call/integration/alert-integration/alert-sources/fleet.mdx b/en/on-call/integration/alert-integration/alert-sources/fleet.mdx
index 0f060161..14d45f7b 100644
--- a/en/on-call/integration/alert-integration/alert-sources/fleet.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/fleet.mdx
@@ -1,5 +1,6 @@
---
title: "Fleet alert integration"
+sidebarTitle: "Fleet"
description: "Send failing policy checks and newly detected vulnerabilities (CVEs) from Fleet automation webhooks to Flashduty On-call."
keywords: ["alert integration", "Fleet", "osquery", "endpoint management", "policy", "vulnerability", "webhook"]
---
@@ -14,7 +15,6 @@ Fleet sends these webhooks once, when the event happens, and never sends a recov
## In Flashduty On-call
----
Get the integration push URL in either of the following ways.
@@ -35,7 +35,6 @@ Get the integration push URL in either of the following ways.
## In Fleet
----
Enable the webhooks under **Manage automations** in the Fleet admin UI, or set them through GitOps or the configuration file, as shown below. Use the full Flashduty push URL, including `integration_key`, as `destination_url` for both webhooks.
@@ -87,7 +86,6 @@ Hosts run policies at the interval set by `FLEET_OSQUERY_POLICY_UPDATE_INTERVAL`
## Events and recovery
----
| Fleet delivery | Effect in Flashduty |
| :--- | :--- |
@@ -100,7 +98,6 @@ One delivery can carry many hosts. Flashduty handles them in host ID order and p
Fleet does not notify Flashduty when a host is fixed. Turn on [auto-close](/en/on-call/channel/create-edit) for the integration's channel, with a suggested window of 24 hours to 7 days depending on how long you take to handle failing policies. When the same policy fails again on the same host (for example after the policy is reset in Fleet), it merges into the same alert.
## Alert Key
----
- Failing policy: computed from the policy ID (`policy.id`) and the host ID (`hosts[].id`)
- Vulnerability: computed from the CVE ID and the host ID
@@ -108,7 +105,6 @@ Fleet does not notify Flashduty when a host is fixed. Turn on [auto-close](/en/o
Both IDs are Fleet database IDs and stay constant within one Fleet instance. Changes to the policy name, host name, or failing-host counts do not change the Alert Key. A delivery without the policy ID, CVE ID, or host ID is rejected, and the error names the missing field.
## Severity
----
| Source | Condition | Flashduty severity |
| :--- | :--- | :--- |
@@ -122,7 +118,6 @@ Both IDs are Fleet database IDs and stay constant within one Fleet instance. Cha
The policy `critical` option requires a Fleet Premium license; free Fleet rejects it with `option critical requires a premium license`. On free Fleet, every policy alert therefore arrives as Warning.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -136,7 +131,6 @@ The policy `critical` option requires a Fleet Premium license; free Fleet reject
The policy query, author details, and software installation paths in the payload are not stored as labels.
## Troubleshooting
----
- **Flashduty returns a parameter error**: the message names the missing field. If it says only failing policy and vulnerability webhooks are supported, check whether a host status or activity webhook points at this URL
- **No alert arrives**: the policy webhook fires only when a policy changes from passing to failing; a host that keeps failing is not sent again. Hosts run policies every `FLEET_OSQUERY_POLICY_UPDATE_INTERVAL` (default 1 hour), and Fleet posts only after a result changes
diff --git a/en/on-call/integration/alert-integration/alert-sources/flowmon-ads.mdx b/en/on-call/integration/alert-integration/alert-sources/flowmon-ads.mdx
index 2a43d704..6097f6d9 100644
--- a/en/on-call/integration/alert-integration/alert-sources/flowmon-ads.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/flowmon-ads.mdx
@@ -1,5 +1,6 @@
---
title: "Flowmon ADS alert integration"
+sidebarTitle: "Flowmon ADS"
description: "Flowmon ADS sends detected network anomaly events as email reports; use a Flashduty email integration to turn each event into an alert."
keywords: ["alert integration", "Flowmon ADS", "Flowmon", "Progress", "email", "network anomaly detection", "NDR"]
---
@@ -9,7 +10,6 @@ When Flowmon ADS (Anomaly Detection System) detects a network anomaly event, it
## In Flashduty On-call
----
Get the integration email address in either of the two ways below. **In both cases choose the Email integration type**, not Flowmon ADS.
@@ -30,7 +30,6 @@ Get the integration email address in either of the two ways below. **In both cas
## Configure Flowmon ADS
----
1. In Flowmon ADS, open **Email notifications** under **Event Response** and create an email report. Each email report is bound to exactly one perspective
2. Click **Add new email** and add the Flashduty email integration address as a recipient
@@ -55,12 +54,10 @@ The body of a per-event email contains these fields:
| `Ports involved` | Port numbers related to the event, may be empty |
## Push mode in Flashduty
----
Keep the email integration's default push mode, which creates a new alert for every email: the alert title is the email title and the description is the email body, which contains the fields above. Flowmon ADS sends one email per event and events don't need to be merged, so no rules are needed.
## Limitations
----
- **No recovery email**: Flowmon ADS events are one-time notifications and no recovery email is sent, so alerts do not close on their own. Turn on the [auto-resolve timeout](/en/on-call/channel/create-edit) in the channel that receives this integration; 24 hours is a reasonable start.
- **Severity**: in Flashduty these alerts show the Email integration type, and their severity is always Warning; the event priority is in the `Severity` field of the body. You can adjust it with [alert pipelines](/en/on-call/integration/alert-integration/alert-pipelines).
diff --git a/en/on-call/integration/alert-integration/alert-sources/flowtriq.mdx b/en/on-call/integration/alert-integration/alert-sources/flowtriq.mdx
index c0721768..05fc250f 100644
--- a/en/on-call/integration/alert-integration/alert-sources/flowtriq.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/flowtriq.mdx
@@ -1,5 +1,6 @@
---
title: "Flowtriq alert integration"
+sidebarTitle: "Flowtriq"
description: "Send DDoS attack events detected by Flowtriq to Flashduty On-call through a Webhook alert channel."
keywords: ["alert integration", "Flowtriq", "webhook", "DDoS", "DDoS detection", "attack alerts"]
---
@@ -9,7 +10,6 @@ Use a Flowtriq Webhook alert channel to send DDoS attack events to Flashduty On-
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Flowtriq
----
@@ -58,7 +57,6 @@ Trigger attack detection on a monitored node. Confirm that Flashduty receives an
Flowtriq retries a failed delivery up to 3 times (after 10 seconds, 60 seconds, and 5 minutes). Each request times out after 10 seconds, and a non-2xx status code counts as a failure.
## Events and recovery
----
Flowtriq posts to the webhook on every incident event. The event type is in `event_type`:
@@ -72,12 +70,10 @@ Flowtriq posts to the webhook on every incident event. The event type is in `eve
Other event types, including any Flowtriq adds later, create no alert; Flashduty returns success for them.
## Alert Key
----
Flashduty builds the Alert Key from the incident identity: `incident.uuid` when present, otherwise `incident.id`. Webhook deliveries currently carry the numeric `incident.id` and no `uuid`. The start and end events of one attack share one Alert Key, so the end event recovers the matching alert. An event with neither field is rejected. Changes to the title, severity, or peak traffic do not change the Alert Key.
## Severity mapping
----
| `incident.severity` | Flashduty severity |
| :--- | :--- |
@@ -89,7 +85,6 @@ Flashduty builds the Alert Key from the incident identity: `incident.uuid` when
A recovery event keeps the last severity from the attack.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -105,7 +100,6 @@ A recovery event keeps the last severity from the attack.
The alert description comes from Flowtriq's AI summary (`ai_summary`). The `attack_start` delivery carries no summary, so the description is empty at that point.
## Troubleshooting
----
- **Flowtriq shows a failed delivery**: confirm the URL is complete, includes `integration_key`, and uses HTTPS. Failed deliveries are listed in the notification log on the incident detail page in Flowtriq
- **The alert did not recover**: confirm the Flowtriq channel sent an `attack_end` event. Recovery relies on the start and end events carrying the same `incident.id`; if an alert stays open for a long time, close it manually in Flashduty
diff --git a/en/on-call/integration/alert-integration/alert-sources/fluxcd.mdx b/en/on-call/integration/alert-integration/alert-sources/fluxcd.mdx
index 7b43ee5e..ecf79e60 100644
--- a/en/on-call/integration/alert-integration/alert-sources/fluxcd.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/fluxcd.mdx
@@ -1,5 +1,6 @@
---
title: "Flux CD alert integration"
+sidebarTitle: "Flux CD"
description: "Send Flux object reconciliation failures to Flashduty On-call through a Flux notification-controller generic Provider, and close the alert automatically once reconciliation succeeds again."
keywords: ["alert integration", "Flux CD", "Flux", "GitOps", "notification-controller", "Kustomization", "HelmRelease", "Kubernetes"]
---
@@ -9,7 +10,6 @@ Flux's notification-controller pushes events out through two kinds of objects: a
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure Flux
----
You need `kubectl` permissions to create a Secret and the Flux `Provider` and `Alert` objects in the cluster. The examples use the `notification.toolkit.fluxcd.io/v1beta3` API and the `flux-system` namespace; the Provider, Alert, and Secret must be in the same namespace. The cluster must be able to reach the domain of the Flashduty push URL.
@@ -113,7 +112,6 @@ Flux has no button that sends a test message. Use a temporary Kustomization inst
## Alert Key
----
Flashduty uses `involvedObject.uid`, the Kubernetes UID of the Flux object, as the Alert Key. Flux's own `pagerduty` Provider uses the same UID as the deduplication key for both trigger and resolve. All failure events of one Flux object land on the same Flashduty alert; changes to the failure reason (`reason`), message, or revision do not change the Alert Key.
@@ -123,7 +121,6 @@ Flashduty uses `involvedObject.uid`, the Kubernetes UID of the Flux object, as t
Flashduty rejects a request without `involvedObject.uid`.
## Alert lifecycle
----
Flashduty handles each event by its `severity` and `reason` fields:
@@ -140,12 +137,10 @@ By default, Flux pushes an event for the same object with the same `message` and
**When only `error` events are forwarded**: if the Alert's `eventSeverity` is `error`, or its `exclusionList` filters out success events, Flashduty receives no recovery events and alerts never close on their own. In that case, turn on the channel's [auto-resolve timeout](/en/on-call/channel/create-edit) with **Incident trigger** as the timing start. A timeout of 12 hours is a reasonable default: if the object is still failing, the next failed reconciliation triggers the alert again.
## Severity
----
Flux failure events have a single level, `error`, so all alerts default to **Critical**. For a different severity, append `&severity=Warning` (or `Info`) to the push URL. A recovery event keeps the severity of the original alert.
## Alert content
----
- **Title**: `/: `, for example `Kustomization apps/webapp: ValidationFailed`
- **Description**: the event `message`
@@ -154,7 +149,6 @@ Flux failure events have a single level, `error`, so all alerts default to **Cri
In `metadata` key names, characters other than `a-z`, `A-Z`, `0-9`, and `_` are replaced with `_` (for example, `kustomize.toolkit.fluxcd.io/revision` sent by older Flux versions becomes `kustomize_toolkit_fluxcd_io_revision`). A key with the same name as a built-in label does not overwrite it. Empty values are not written as labels.
## Troubleshooting
----
- **No alerts arrive**: run `kubectl -n flux-system logs deploy/notification-controller` and look for errors such as `failed to dispatch notification`; run `kubectl -n flux-system get events --field-selector involvedObject.kind=Alert` to see warnings recorded on the Alert
- **Alerts arrive for only some objects**: check that the object's `kind` is listed in `eventSources`, and that the object is in the Alert's namespace or the entry sets `namespace`
diff --git a/en/on-call/integration/alert-integration/alert-sources/formant.mdx b/en/on-call/integration/alert-integration/alert-sources/formant.mdx
index ccec7d5e..f5490723 100644
--- a/en/on-call/integration/alert-integration/alert-sources/formant.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/formant.mdx
@@ -1,5 +1,6 @@
---
title: "Formant alert integration"
+sidebarTitle: "Formant"
description: "Send Formant robot and device events to Flashduty On-call through event webhook forwarding."
keywords: ["alert integration", "Formant", "robotics", "device monitoring", "webhook", "events"]
---
@@ -11,7 +12,6 @@ A Formant event is sent once and has no recovery notification, so the alert in F
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can get the integration push URL in either of the following ways.
## Configure Formant
----
@@ -61,19 +60,16 @@ Make a forwarded event trigger once (for example, take a device offline or push
## Recovery and auto-close
----
Formant events cannot be changed after they trigger, and the webhook is sent once per event. The request body has no field that marks an event as ended or recovered, so the alert in Flashduty does not recover on its own.
Each Formant event is a separate Flashduty alert. Close it by hand, or turn on [auto-close](/en/on-call/channel/create-edit) in the channel that receives this integration. We suggest 2 hours; adjust to how quickly your team handles device problems.
## Alert Key
----
The Alert Key is the Formant event ID (`payload.id`). A repeated delivery of the same event merges into the same alert; different events, even from the same event trigger and device, are different alerts. If a request has no event ID, Flashduty generates a random Alert Key, and that alert is not merged either.
## Status and severity
----
The alert status equals its severity; it does not recover.
@@ -86,7 +82,6 @@ The alert status equals its severity; it does not recover.
| Missing or any other value | Warning |
## Alert content
----
- **Title**: the event `message`; if missing, `Formant event on `; if that is missing too, `Formant event`
- **Description**: device ID, stream, datapoint value, event time and the event link in Formant
@@ -103,7 +98,6 @@ The alert status equals its severity; it does not recover.
| Device tags | Each key and value in the event `tags`; characters such as `.` and `-` in keys become `_`, and a tag never overrides the labels above |
## Troubleshooting
----
- **Flashduty receives nothing**: check that the event's **Actions** tab has the webhook selected under **Webhook forwarding**, and that the webhook URL is the full push URL including `integration_key`
- **Flashduty returns a parameter error**: the body is not JSON or has no `payload` object. Use Formant's built-in webhook forwarding and do not rewrite the body
diff --git a/en/on-call/integration/alert-integration/alert-sources/fortimonitor.mdx b/en/on-call/integration/alert-integration/alert-sources/fortimonitor.mdx
index edabced4..f26031ff 100644
--- a/en/on-call/integration/alert-integration/alert-sources/fortimonitor.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/fortimonitor.mdx
@@ -1,5 +1,6 @@
---
title: "FortiMonitor alert integration"
+sidebarTitle: "FortiMonitor"
description: "Send FortiMonitor incident and clear notifications to Flashduty On-call through a webhook."
keywords: ["alert integration", "FortiMonitor", "Panopta", "Fortinet", "webhook", "Alert Timeline", "outage_id"]
---
@@ -9,7 +10,6 @@ Use the FortiMonitor (formerly Panopta) webhook integration to send incident and
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure FortiMonitor
----
@@ -43,18 +42,18 @@ You can get the integration push URL in either of the following ways.
6. Set **Authentication Method** to **None**
7. Set **Payload Type** to **Form Variables** and add the variables below, one per row. Variable names are case-sensitive; the values are FortiMonitor macros:
-| Variable name | Value |
-| :--- | :--- |
-| `trigger` | `$trigger` |
-| `outage_id` | `$outage_id` |
-| `severity` | `$severity` |
-| `name` | `$name` |
-| `fqdn` | `$fqdn` |
-| `server_id` | `$server_id` |
-| `items` | `$items` |
-| `reasons` | `$reasons` |
-| `duration` | `$duration` |
-| `tags` | `$tags` |
+ | Variable name | Value |
+ | :--- | :--- |
+ | `trigger` | `$trigger` |
+ | `outage_id` | `$outage_id` |
+ | `severity` | `$severity` |
+ | `name` | `$name` |
+ | `fqdn` | `$fqdn` |
+ | `server_id` | `$server_id` |
+ | `items` | `$items` |
+ | `reasons` | `$reasons` |
+ | `duration` | `$duration` |
+ | `tags` | `$tags` |
8. Click **Save**
@@ -92,7 +91,6 @@ FortiMonitor sends webhook requests from fixed IP addresses: `104.197.35.194/32`
## Payload
----
FortiMonitor POSTs the following form fields, one request per incident and event:
@@ -112,14 +110,12 @@ FortiMonitor POSTs the following form fields, one request per incident and event
The alert title is `: `. If the instance name is empty, the FQDN is used; if both are empty, the title is `FortiMonitor incident `.
## Alert Key
----
Flashduty uses `outage_id` (the FortiMonitor incident ID) as the Alert Key. The incident, escalation, and clear notifications of one incident carry the same `outage_id`, so they land on the same alert. When the same metric on the same instance fails again after recovering, FortiMonitor opens a new incident ID and Flashduty opens a new alert. Changing the instance name, reason, or severity does not change the Alert Key.
If a request has no `outage_id`, or still contains the unexpanded `$outage_id`, Flashduty returns a parameter error, because the clear notification could not be linked to the original alert.
## Status and severity
----
| FortiMonitor `trigger` | Flashduty behavior |
| :--- | :--- |
@@ -136,7 +132,6 @@ If a request has no `outage_id`, or still contains the unexpanded `$outage_id`,
Requests with an empty or unknown `trigger` are rejected.
## FAQ
----
@@ -159,7 +154,6 @@ The Alert Timeline sends a notification only after the incident has lasted until
## Troubleshooting
----
- **Delivery fails**: make sure the Postback URL is the complete push URL and includes `integration_key`. If inbound traffic is restricted, allow the FortiMonitor webhook IP addresses
- **Flashduty returns a parameter error**: make sure Payload Type is Form Variables, the variable names match the table above, and `trigger` and `outage_id` are set to `$trigger` and `$outage_id`
diff --git a/en/on-call/integration/alert-integration/alert-sources/fortisiem.mdx b/en/on-call/integration/alert-integration/alert-sources/fortisiem.mdx
index 0eae561c..030ecea8 100644
--- a/en/on-call/integration/alert-integration/alert-sources/fortisiem.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/fortisiem.mdx
@@ -1,5 +1,6 @@
---
title: "FortiSIEM alert integration"
+sidebarTitle: "FortiSIEM"
description: "Send FortiSIEM incident trigger, update, and clear notifications to Flashduty On-call through Incident HTTP Notification."
keywords: ["alert integration", "FortiSIEM", "Fortinet", "SIEM", "Incident HTTP Notification", "incidentId"]
---
@@ -9,7 +10,6 @@ When a rule triggers an incident, FortiSIEM's Incident HTTP Notification POSTs a
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## In FortiSIEM
----
@@ -56,14 +55,12 @@ Let a rule trigger a real incident and confirm Flashduty receives an active aler
## Alert Key
----
Flashduty uses the `incidentId` attribute of the `incident` element as the Alert Key. The FortiSIEM documentation defines it as "Unique ID of the incident in FortiSIEM", and describes `status` as "New, Update or Clear"; one `incidentId` is expected across the notifications of one incident. The XML schema comes from the FortiSIEM 6.7.0 Integration API guide; check the first real delivery on your 7.x version against the field list below. Changes to the rule name, severity, repeat count, time, or incident details do not change the Alert Key.
Flashduty rejects a request without `incidentId` (HTTP 400), because later updates and recovery could not be matched reliably.
## Status and severity
----
The `status` attribute:
@@ -84,7 +81,6 @@ The `severity` attribute accepts `HIGH`, `MEDIUM`, `LOW`, or the matching 0-10 s
| Empty or unrecognized | Warning |
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -97,7 +93,6 @@ The `severity` attribute accepts `HIGH`, `MEDIUM`, `LOW`, or the matching 0-10 s
`deviceDetails`, which carries user names and emails, is not written to labels.
## Troubleshooting
----
- **FortiSIEM reports a failed push**: confirm **HTTP(S) Server URL** starts with `https://`, includes the full `integration_key`, and that the FortiSIEM network can reach `api.flashcat.cloud`
- **Flashduty returns an invalid-parameter error**: confirm the body is FortiSIEM incident XML (root element `incident`) with an `incidentId` attribute
diff --git a/en/on-call/integration/alert-integration/alert-sources/gatus.mdx b/en/on-call/integration/alert-integration/alert-sources/gatus.mdx
index 18283a95..afec8fbd 100644
--- a/en/on-call/integration/alert-integration/alert-sources/gatus.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/gatus.mdx
@@ -1,5 +1,6 @@
---
title: "Gatus alert integration"
+sidebarTitle: "Gatus"
description: "Send Gatus endpoint trigger and recovery events to Flashduty On-call through the custom alerting provider."
keywords: ["alert integration", "Gatus", "health check", "webhook", "custom provider"]
---
@@ -11,14 +12,12 @@ Gatus has no fixed webhook format: you write the request body in its configurati
## In Flashduty On-call
----
Create either a dedicated or shared **Gatus** alert integration and copy its complete Push URL.
## Configure Gatus
----
@@ -81,7 +80,6 @@ Restart or reload Gatus so the configuration takes effect. Make an endpoint cond
## Alert Key
----
Flashduty computes the Alert Key from the endpoint's `group` and `name`. Gatus identifies an endpoint by `_` and provides no separate ID per alert, so the trigger, reminders, and recovery of one endpoint share one Alert Key. An endpoint without a group uses `name` alone.
@@ -90,7 +88,6 @@ Flashduty computes the Alert Key from the endpoint's `group` and `name`. Gatus i
- Changes to `url`, `description`, or `errors` do not change the Alert Key
## Status and severity
----
| Gatus `[ALERT_TRIGGERED_OR_RESOLVED]` | Flashduty status or severity |
| :--- | :--- |
@@ -100,7 +97,6 @@ Flashduty computes the Alert Key from the endpoint's `group` and `name`. Gatus i
Gatus alerts have no severity field, so a failing endpoint health check is treated as Critical. Empty or other status values are rejected.
## Troubleshooting
----
- **Gatus logs `status code 400`**: confirm `method` is `POST`, the body is valid JSON, and `name` and `status` are not empty. Gatus escapes only double quotes in `[RESULT_ERRORS]`; a double quote, backslash, or line break in an endpoint name, group, or description breaks the JSON, so avoid those characters
- **Gatus logs `status code 404` or `401`**: confirm the Push URL is complete and contains `integration_key`
diff --git a/en/on-call/integration/alert-integration/alert-sources/gcp-personalized-service-health.mdx b/en/on-call/integration/alert-integration/alert-sources/gcp-personalized-service-health.mdx
index 3e9b4594..77411ce8 100644
--- a/en/on-call/integration/alert-integration/alert-sources/gcp-personalized-service-health.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/gcp-personalized-service-health.mdx
@@ -1,5 +1,6 @@
---
title: "Google Cloud Personalized Service Health Alert Integration"
+sidebarTitle: "Google Cloud Personalized Service Health"
description: "Receive Personalized Service Health events through a Cloud Monitoring log-based alerting policy and a webhook notification channel using the Flashduty Google Cloud Monitoring integration, with an auto-resolve timeout to close alerts."
keywords: ["alert integration", "Google Cloud", "Personalized Service Health", "Service Health", "Cloud Monitoring", "log-based alert", "webhook"]
---
@@ -9,7 +10,6 @@ Personalized Service Health writes the Google Cloud events that affect your proj
## In Flashduty On-call
----
Get an integration push URL in either of the two ways below. **Choose the Google Cloud Monitoring integration type** in both, not Personalized Service Health.
@@ -30,7 +30,6 @@ Get an integration push URL in either of the two ways below. **Choose the Google
## Configure in Google Cloud
----
### Step 1: Prepare
@@ -101,14 +100,12 @@ gcloud logging write --payload-type=json LOG_NAME '{ "category": "INCIDENT", "re
Use the Service Health log name for `LOG_NAME`; the Google documentation uses the format `projects/PROJECT_ID/logs/servicehealth.googleapis.com%2Factivity`.
## Enable the auto-resolve timeout
----
For log-based alerting policies, Cloud Monitoring only sends a notification when an incident opens, not when it closes (the API documents the notification prompt of log-based policies as always `OPENED`), so Flashduty receives no recovery notification. Enable the [auto-resolve timeout](/en/on-call/channel/create-edit) on the channel that receives these alerts, choose **Incident trigger** as the window timing start, and start with 24 hours, adjusted to the usual duration of the events you care about.
The `autoClose` setting in the alerting policy only decides when the incident closes in Cloud Monitoring (7 days by default for log-based alerts); it does not notify Flashduty.
## Field mapping
----
| Cloud Monitoring field | Flashduty |
| :--- | :--- |
@@ -123,7 +120,6 @@ The `autoClose` setting in the alerting policy only decides when the incident cl
| `incident.policy_user_labels` | Each key becomes a label |
## Troubleshooting
----
- **No alert arrives**: confirm in **Monitoring** → **Incidents** that the incident opened; check whether the log filter matches, and note that notifications are rate limited (the Google documentation gives 20 alerts per policy per day per project as an example)
- **The alert does not recover**: log-based alerts send no closure notification, so enable the channel's auto-resolve timeout
diff --git a/en/on-call/integration/alert-integration/alert-sources/ghost-inspector.mdx b/en/on-call/integration/alert-integration/alert-sources/ghost-inspector.mdx
index 0b3cf6ab..e6f801a9 100644
--- a/en/on-call/integration/alert-integration/alert-sources/ghost-inspector.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/ghost-inspector.mdx
@@ -1,5 +1,6 @@
---
title: "Ghost Inspector alert integration"
+sidebarTitle: "Ghost Inspector"
description: "Send Ghost Inspector test failures and recoveries to Flashduty On-call through a webhook."
keywords: ["alert integration", "Ghost Inspector", "webhook", "test automation", "end-to-end testing"]
---
@@ -9,7 +10,6 @@ Use a Ghost Inspector webhook to send test run results to Flashduty On-call. Eac
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Ghost Inspector
----
Ghost Inspector's notification settings have three levels — organization, suite, and test — and each level inherits from the one above by default, though you can override it at any level. Pick whichever level matches how broadly you want the webhook applied; setting it at the organization or suite level covers every test underneath at once.
@@ -55,12 +54,10 @@ Ghost Inspector has no separate "send test notification" button: every test run,
## Alert key
----
Flashduty keys the alert on the test's `test._id`, the `data.test._id` field in the webhook body. Ghost Inspector sends the same `test._id` on every run of that test — unlike `data._id`, the id of that individual run's result, which is different every time — so a failing run and the later passing run of the same test reliably map to one alert. Changes to the test name, browser, region, or start/end URL do not change the alert key.
## Status and severity
----
Ghost Inspector has no severity levels, only a pass/fail result:
@@ -72,7 +69,6 @@ Ghost Inspector has no severity levels, only a pass/fail result:
A request missing the `passing` field is rejected, so Flashduty never treats an indeterminate result as a failure.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -86,7 +82,6 @@ A request missing the `passing` field is rejected, so Flashduty never treats an
| `passing` | Whether this run passed |
## Troubleshooting
----
- **Flashduty returns a parameter error**: confirm the push URL includes `integration_key`, and the payload includes `data.test._id` and `data.passing`
- **The alert never recovers**: confirm the recovery came from the same test, and that the level you configured the webhook at (test, suite, or organization) actually covers it
diff --git a/en/on-call/integration/alert-integration/alert-sources/gitguardian.mdx b/en/on-call/integration/alert-integration/alert-sources/gitguardian.mdx
index fd6704ae..79651b0c 100644
--- a/en/on-call/integration/alert-integration/alert-sources/gitguardian.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/gitguardian.mdx
@@ -1,5 +1,6 @@
---
title: "GitGuardian alert integration"
+sidebarTitle: "GitGuardian"
description: "Send triggered, updated, and closed secret-leak incidents from GitGuardian to Flashduty On-call through a Custom webhook."
keywords: ["alert integration", "GitGuardian", "secret leak", "incident", "webhook", "secrets detection"]
---
@@ -9,7 +10,6 @@ Use the Custom webhook destination of GitGuardian to send secret-leak incidents
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure GitGuardian
----
You need permission to manage integrations in the GitGuardian workspace.
@@ -81,14 +80,12 @@ Trigger a new incident in the workspace and confirm that Flashduty receives an a
## Alert Key
----
Flashduty uses the incident `id` (`incident.id` in the webhook) as the Alert Key. In GitGuardian's published webhook examples, the New incident, New occurrence, Resolved, Ignored, and Reopened events of the same incident carry the same `incident.id`.
Changes to severity, validity, occurrence count, or detector name do not change the Alert Key. Incident events without `incident.id` are rejected.
## Status and severity
----
The alert status follows `action`: `incident_resolved` and `incident_ignored` recover the alert, and every other event in the table above triggers it. A validity, severity, or risk score change on an incident that is already resolved or ignored is ignored and does not re-open the alert. A reopened incident triggers a new alert with the same Alert Key.
@@ -104,7 +101,6 @@ The severity follows `incident.severity`:
`unknown` means GitGuardian has not rated the incident yet, so Flashduty treats it as Warning.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -121,7 +117,6 @@ The severity follows `incident.severity`:
| `repository` / `filepath` / `occurrence_url` | Repository, file path, and link of the new occurrence in `new_occurrence` events |
## Troubleshooting
----
- **No alert was created**: confirm the matching event is selected and that the webhook's filtering rules do not exclude the incident. GitGuardian states that webhook delivery is best effort and not guaranteed
- **The alert did not recover**: confirm **Resolved** and **Ignored** are selected under **Incident status change**
diff --git a/en/on-call/integration/alert-integration/alert-sources/github.mdx b/en/on-call/integration/alert-integration/alert-sources/github.mdx
index c4217b11..0639197c 100644
--- a/en/on-call/integration/alert-integration/alert-sources/github.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/github.mdx
@@ -1,5 +1,6 @@
---
title: "GitHub alert integration"
+sidebarTitle: "GitHub"
description: "Send GitHub Dependabot, code scanning, and secret scanning alerts and failed Actions workflows to Flashduty On-call through a repository or organization webhook, and recover them once fixed."
keywords: ["alert integration", "GitHub", "Dependabot", "code scanning", "secret scanning", "GitHub Actions", "webhook"]
---
@@ -14,7 +15,6 @@ Change events such as deployments and code pushes are not part of this integrati
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -35,7 +35,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure GitHub
----
A webhook can be created on a single repository or on an organization (covering every repository in it). A repository webhook requires admin access to the repository; an organization webhook requires the organization owner role.
@@ -83,7 +82,6 @@ GitHub does not retry failed deliveries automatically. Use **Redeliver** in **Re
## Events and alert status
----
GitHub puts the event type in the `X-GitHub-Event` request header and the action in the `action` field of the body. Flashduty handles them as follows:
@@ -97,7 +95,6 @@ GitHub puts the event type in the `X-GitHub-Event` request header and the action
`ping` and other event types (such as a `push` selected by mistake) also get a success response without creating an alert.
## Alert Key
----
- **Security alerts**: the Alert Key is built from the event type, the repository ID (`repository.id`), and the alert number (`alert.number`). The alert number is unique per repository and alert type, and GitHub uses it to address the alert in its API (for example, `/repos/{owner}/{repo}/dependabot/alerts/{alert_number}`). The Alert Key stays the same from creation through fix, dismissal, and reopening, and renaming the repository does not change it.
- **Actions failures**: the Alert Key is built from the repository ID, the workflow ID (`workflow_run.workflow_id`), the ID of the repository the run came from (`workflow_run.head_repository.id`), and the branch (`workflow_run.head_branch`). Later runs of the same workflow on the same branch, including **Re-run**, merge into this alert, and any successful run recovers it. Each branch and each workflow gets its own alert; a pull request from a fork never merges with a branch of the same name in your repository. A run without branch information gets its own alert keyed by the run ID (`workflow_run.id`), which recovers only when a **Re-run** of that run succeeds.
@@ -105,7 +102,6 @@ GitHub puts the event type in the `X-GitHub-Event` request header and the action
Events without `repository.id`, `alert.number`, `workflow_run.id`, or `workflow_run.workflow_id` are rejected.
## When alerts do not recover
----
In these cases no successful run follows, so the alert does not recover on its own:
@@ -116,7 +112,6 @@ In these cases no successful run follows, so the alert does not recover on its o
We recommend turning on the channel's [auto-resolve timeout](/en/on-call/channel/create-edit) with **Incident trigger** as the **Window timing start** and a **Timeout duration** of 24 hours. A failed workflow is normally fixed within a working day. Security alerts recover when they are fixed, dismissed, or closed in GitHub, so a channel that only receives security alerts can leave the timeout off.
## Severity
----
| Event | GitHub field | GitHub value | Flashduty severity |
| :--- | :--- | :--- | :--- |
@@ -134,7 +129,6 @@ We recommend turning on the channel's [auto-resolve timeout](/en/on-call/channel
A recovery event keeps the alert's existing severity.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -151,7 +145,6 @@ A recovery event keeps the alert's existing severity.
| `run_id` / `run_number` / `run_attempt` / `run_url` / `head_sha` | Workflow run ID, number, attempt, link, and commit |
## Troubleshooting
----
- **Recent Deliveries shows a failure**: open the delivery's **Response**. If it is not `200`, make sure the push URL is complete and includes `integration_key`. GitHub waits at most 10 seconds for a response
- **Ping succeeds but no alert arrives**: make sure the four events above are selected and the repository has the matching security features enabled. Cancelled or skipped workflow runs never create alerts, and a successful run only recovers an existing one
diff --git a/en/on-call/integration/alert-integration/alert-sources/gitlab.mdx b/en/on-call/integration/alert-integration/alert-sources/gitlab.mdx
index a191fdb5..b743d2c1 100644
--- a/en/on-call/integration/alert-integration/alert-sources/gitlab.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/gitlab.mdx
@@ -1,5 +1,6 @@
---
title: "GitLab alert integration"
+sidebarTitle: "GitLab"
description: "Sync failed GitLab pipelines, failed deployments and security vulnerabilities to Flashduty On-call through a webhook, and recover them once fixed."
keywords: ["alert integration", "GitLab", "webhook", "CI/CD", "pipeline", "deployment", "vulnerability"]
---
@@ -9,7 +10,6 @@ Use a GitLab project or group webhook to sync failed pipelines, failed deploymen
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure GitLab
----
GitLab.com, GitLab Self-Managed and GitLab Dedicated all support webhooks. Project webhooks are available on every tier and require the Maintainer or Owner role on the project. Group webhooks require Premium or Ultimate and the Owner role on the group, and send events from every project in the group and its subgroups.
@@ -71,7 +70,6 @@ For **Push events** (the default **Test** option) and other events unrelated to
## Alert Key
----
Flashduty builds the Alert Key from the business object, so the trigger and recovery events of one object share one Alert Key:
@@ -84,7 +82,6 @@ Flashduty builds the Alert Key from the business object, so the trigger and reco
The Alert Key combines the object type with the fields above, so a branch never merges with a tag or an environment of the same name. Renaming or moving the project does not change the Alert Key. A failed or successful event missing these fields is rejected.
## Status and severity
----
| Event | Status | Flashduty severity |
| :--- | :--- | :--- |
@@ -97,7 +94,6 @@ The Alert Key combines the object type with the fields above, so a branch never
| Pipeline `success`, deployment `success`, vulnerability `resolved` / `dismissed` | Recover | - |
## When alerts do not recover automatically
----
These objects never receive a later successful event, so their alerts do not recover automatically:
@@ -108,7 +104,6 @@ These objects never receive a later successful event, so their alerts do not rec
Turn on the channel's [auto-resolve timeout](/en/on-call/channel/create-edit), set **Window timing start** to **Incident trigger**, and set the timeout to 24 hours. Pipeline and deployment failures are usually fixed within a working day. Vulnerability alerts recover when the vulnerability is resolved or dismissed, so a channel that only receives vulnerability alerts can leave the timeout off.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -130,7 +125,6 @@ Turn on the channel's [auto-resolve timeout](/en/on-call/channel/create-edit), s
Pipeline variables (`variables`) and user emails never become labels.
## Troubleshooting
----
- **The webhook shows Temporarily disabled or Disabled**: GitLab temporarily disables a webhook after 4 consecutive failed deliveries and permanently disables it after 40. Check that the push URL is complete and includes `integration_key`, then click **Test** to send a test request and re-enable the webhook
- **A rejected deployment raised an alert**: when a deployment to a protected environment is rejected, GitLab sends `rejected` and then, after dropping the deployment job, `failed` for the same deployment. Flashduty treats it as a failed deployment; close the alert by hand or let the next successful deployment recover it
diff --git a/en/on-call/integration/alert-integration/alert-sources/google-cloud-monitoring.mdx b/en/on-call/integration/alert-integration/alert-sources/google-cloud-monitoring.mdx
index fa64c25c..7291b0ac 100644
--- a/en/on-call/integration/alert-integration/alert-sources/google-cloud-monitoring.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/google-cloud-monitoring.mdx
@@ -1,5 +1,6 @@
---
title: "Google Cloud Monitoring Alert Events"
+sidebarTitle: "Google Cloud Monitoring"
description: "Sync Google Cloud Monitoring, Error Reporting, Security Command Center, and Cloud Billing budget alerts to Flashduty through a webhook or a Pub/Sub push subscription"
---
@@ -8,42 +9,42 @@ Sync Google Cloud Monitoring, Error Reporting, Security Command Center, and Clou
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this simpler option when you don't need to route alert events to different channels.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Google Cloud Monitoring** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center => Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Google Cloud Monitoring** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In Google Cloud
----
@@ -58,13 +59,15 @@ The push URL of one **GCP Cloud Monitoring** integration accepts all of the foll
Below, **push URL** means the integration push URL you copied earlier, in the form `https://api.flashcat.cloud/event/push/alert/google-cm?integration_key=`.
-## I. Cloud Monitoring: webhook notification channel
+
+
+## Cloud Monitoring: webhook notification channel
### Step 1: Configure alert channel
1. Log in to the Google Cloud Console, search for the `Monitoring` product, and enter its console
2. Find `Alerting` in the left menu and click `EDIT NOTIFICATION CHANNELS` to create a channel
-
+
3. Find `Webhooks` on the Notification channels page and click `ADD NEW`
4. Enter the integration push URL in the `Endpoint URL` field (the URL will be generated after saving the integration name on the current page)
@@ -86,20 +89,20 @@ Below, **push URL** means the integration push URL you copied earlier, in the fo
Metric alerts, uptime checks, log-based alerts, and PromQL alerts (Managed Service for Prometheus) are all sent by alerting policies and are configured the same way.
-## II. Cloud Monitoring: Pub/Sub notification channel
+## Cloud Monitoring: Pub/Sub notification channel
If your organization requires alerts to go through Pub/Sub, use a Pub/Sub notification channel. The Alert Key is the same as for the webhook channel (`incident_id`), so the two channels are interchangeable.
-1. Create the topic and push subscription as described in **Section VI. Create a Pub/Sub push subscription**.
+1. Create the topic and push subscription as described in [Create a Pub/Sub push subscription](#pubsub-subscription).
2. In `Alerting` → `EDIT NOTIFICATION CHANNELS`, click `ADD NEW` in the `Pub/Sub` section and enter the topic name.
3. As prompted, grant `service-@gcp-sa-monitoring-notification.iam.gserviceaccount.com` the `Pub/Sub Publisher` role on the topic.
4. Select this Pub/Sub channel in the alerting policy's `Notification channels` and check `Notify on incident closure`.
-## III. Error Reporting
+## Error Reporting
Error Reporting sends notifications through Cloud Monitoring webhook notification channels (schema version 1.0). It supports webhooks only, not Pub/Sub.
-1. Create a webhook notification channel as in **Section I, Step 1** (you can reuse the same **Flashduty** channel).
+1. Create a webhook notification channel as in step 1 of [Cloud Monitoring: webhook notification channel](#webhook-channel) (you can reuse the same **Flashduty** channel).
2. Open the `Error Reporting` page and click `Configure notifications`.
3. Select the **Flashduty** channel under `Notification channels` and save.
@@ -109,11 +112,11 @@ Error Reporting sends a notification when an error cannot be grouped with existi
- Error Reporting sends no "resolved" notification, so the alert never recovers by itself. Close it in Flashduty.
- Alerts have Warning severity. To use another severity, append `&severity=Critical` (or `Info`) to the push URL.
-## IV. Security Command Center
+## Security Command Center
Security Command Center (SCC) can only continuously export findings to Pub/Sub. A push subscription forwards them to Flashduty.
-1. Create the topic and push subscription as described in **Section VI. Create a Pub/Sub push subscription**.
+1. Create the topic and push subscription as described in [Create a Pub/Sub push subscription](#pubsub-subscription).
2. Grant the SCC service account the `Pub/Sub Publisher` role on the topic, then create a continuous export (NotificationConfig), for example:
```bash
@@ -132,11 +135,11 @@ Do not add `state="ACTIVE"` to the filter. SCC only publishes finding updates th
- The alert recovers when the finding's `state` becomes `INACTIVE` (remediated, resource deleted, or set by hand) or its `mute` becomes `MUTED`. It triggers again when the finding becomes `ACTIVE` or `UNMUTED`.
- Threat findings (for example, from Event Threat Detection) never become INACTIVE automatically. Change their state or mute them in SCC.
-## V. Cloud Billing budgets
+## Cloud Billing budgets
Budget alerts are available only as programmatic notifications through Pub/Sub.
-1. Create the topic and push subscription as described in **Section VI. Create a Pub/Sub push subscription**.
+1. Create the topic and push subscription as described in [Create a Pub/Sub push subscription](#pubsub-subscription).
2. Go to `Billing` → `Budgets & alerts`, create or edit a budget, and set threshold rules (actual and/or forecasted cost).
3. Under `Manage notifications`, check `Connect a Pub/Sub topic to this budget`, select the topic above, and save.
@@ -147,7 +150,9 @@ Cloud Billing publishes the budget's current status to the topic several times a
- The Alert Key combines the billing account, budget, budget period, cost type, and the highest threshold exceeded. Repeated messages for the same threshold merge into one alert. Crossing a higher threshold creates a new alert.
- Budget alerts never recover automatically. When a new budget period starts, alerts are tracked for the new period. Close alerts from the previous period by hand.
-## VI. Create a Pub/Sub push subscription
+
+
+## Create a Pub/Sub push subscription
Sections II, IV, and V share these steps. One push subscription can carry several sources.
diff --git a/en/on-call/integration/alert-integration/alert-sources/google-scc.mdx b/en/on-call/integration/alert-integration/alert-sources/google-scc.mdx
index bf106e8d..2e610b23 100644
--- a/en/on-call/integration/alert-integration/alert-sources/google-scc.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/google-scc.mdx
@@ -1,5 +1,6 @@
---
title: "Google Security Command Center alert integration"
+sidebarTitle: "Google Security Command Center"
description: "Send Google Security Command Center finding notifications to Flashduty On-call through a Pub/Sub push subscription."
keywords: ["alert integration", "Google Security Command Center", "SCC", "Pub/Sub", "finding"]
---
@@ -9,14 +10,12 @@ Google Security Command Center (SCC) publishes new and updated findings to a Pub
## In Flashduty On-call
----
Create either a dedicated or shared **Google Security Command Center** alert integration and copy its complete Push URL.
## Configure Google Cloud
----
You need an organization with Security Command Center enabled and a project to hold the Pub/Sub topic. Creating a notification config requires Security Center Admin (`roles/securitycenter.admin`) on the organization and Project IAM Admin (`roles/resourcemanager.projectIamAdmin`) on the project that holds the topic.
@@ -74,14 +73,12 @@ Pub/Sub push subscriptions have no test button. Make SCC produce a finding that
## Alert Key
----
Flashduty uses `finding.name` as the Alert Key, in the form `organizations/{organization ID}/sources/{source ID}/findings/{finding ID}`. In the SCC Finding resource, `name` is the finding's relative resource name, and the notifications for a finding's creation, updates and change to `INACTIVE` all carry the same value.
Changes to the title, severity, state, category or event time do not change the Alert Key. A request without `finding.name` is rejected, because later updates and the recovery could not be matched to the alert.
## Status and severity
----
| SCC field | Flashduty status or severity |
| :--- | :--- |
@@ -98,7 +95,6 @@ The alert title is `category: resource display name` (for example `OPEN_FIREWALL
Flashduty also writes these labels: `category`, `resource_name`, `resource_type`, `project`, `location`, `service`, `finding_name`, `finding_state`, `finding_severity`, `finding_class`, `finding_source`, `notification_config_name`, `external_uri`. `securityMarks` is not read.
## Troubleshooting
----
- **Pub/Sub keeps redelivering the same message**: Flashduty returns a 4xx for requests it cannot parse, and Pub/Sub retries with backoff. Check that the push endpoint contains `integration_key` and that payload unwrapping is off. Configure a dead-letter topic on the subscription to avoid endless retries
- **Flashduty returns an invalid-parameter error**: the message names the missing field, for example `finding.name is required` means the notification has no finding
diff --git a/en/on-call/integration/alert-integration/alert-sources/grafana.mdx b/en/on-call/integration/alert-integration/alert-sources/grafana.mdx
index 08f977a3..2e9b9331 100644
--- a/en/on-call/integration/alert-integration/alert-sources/grafana.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/grafana.mdx
@@ -1,5 +1,6 @@
---
title: "Grafana Integration"
+sidebarTitle: "Grafana"
description: "Sync Grafana alert events to Flashduty via webhook to achieve automated alert noise reduction."
---
@@ -8,53 +9,53 @@ Sync Grafana alert events to Flashduty via webhook to achieve automated alert no
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this method when you don't need to route alert events to different channels. It's simpler.
-
- Expand
+
+
1. Go to Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Grafana** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this method when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Grafana** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
-## In Grafana
----
+## In Grafana
Grafana V4~V8 versions enable Legacy Alerting by default, while V9 and later versions enable Grafana Alerting by default. For feature distinctions and activation methods, please refer to the [official documentation](https://grafana.com/docs/grafana/v8.4/alerting/unified-alerting/opt-in/#opt-in-to-grafana-alerting). Follow these steps based on your deployed version.
### Legacy Alerting
-1. Open your Grafana console and navigate to Alerting > Notification channels
+1. Open your Grafana console and navigate to Alerting → Notification channels
2. Click Add Channel to open the channel configuration dialog
3. Configure the name, select webhook as Type, enter the integration push URL in the Url field, and select POST as Method, as shown below:
-
+
4. Save and return to the integration list. After an alert occurs, if the latest event time is displayed, the configuration is successful and events are being received
5. Complete
@@ -65,25 +66,24 @@ Grafana V4~V8 versions enable Legacy Alerting by default, while V9 and later ver
-1. Open your Grafana console and navigate to Alerting > Contact points
+1. Open your Grafana console and navigate to Alerting → Contact points
2. Click New contact point to open the configuration dialog
3. Configure the name, select webhook as Type, enter the integration push URL in the Url field, and select POST as Method, as shown below:
-
+
4. Open the Notification policies page, edit or add a policy as needed, and select the contact point created in the previous step as the delivery channel, as shown below:
-
+
5. Save and return to the integration list. After an alert occurs, if the latest event time is displayed, the configuration is successful and events are being received
6. The default alert severity is warning. To customize it, you can configure the severity label in the alert details page (refer to the status mapping below), as shown in the following image:
-
+
7. Complete
## Status Mapping
----
Legacy Alerting to Flashduty severity mapping:
diff --git a/en/on-call/integration/alert-integration/alert-sources/graylog.mdx b/en/on-call/integration/alert-integration/alert-sources/graylog.mdx
index a38673b0..afb5ec93 100644
--- a/en/on-call/integration/alert-integration/alert-sources/graylog.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/graylog.mdx
@@ -1,5 +1,6 @@
---
title: "Graylog Alert Events"
+sidebarTitle: "Graylog"
description: "Sync Graylog alert events to Flashduty via webhook for automated alert noise reduction"
---
@@ -8,45 +9,44 @@ Sync Graylog alert events to Flashduty via webhook for automated alert noise red
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this simpler option when you don't need to route alert events to different channels.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a specific channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Graylog** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Graylog** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In Graylog
----
-## I. Graylog Alert Push Configuration
### Step 1: Configure Alert Channel
1. Log in to the Graylog console
@@ -55,15 +55,15 @@ Choose this option when you need to route alerts to different channels based on
4. Enter Title and Description
5. Select **HTTP Notification** as Notification Type, as shown below
-
+
6. Enter the Flashduty URL you obtained (URL whitelist required for first-time use)
-
+
7. Click Save to whitelist the URL
-
+
8. After saving, submit Create
@@ -80,7 +80,7 @@ Choose this option when you need to route alerts to different channels based on
-## II. Status Mapping
+## Status Mapping
diff --git a/en/on-call/integration/alert-integration/alert-sources/guance.mdx b/en/on-call/integration/alert-integration/alert-sources/guance.mdx
index 989aab49..71066cb0 100644
--- a/en/on-call/integration/alert-integration/alert-sources/guance.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/guance.mdx
@@ -1,5 +1,6 @@
---
title: "Guance Alert Events"
+sidebarTitle: "Guance"
description: "Sync Guance alert events to Flashduty via webhook for automated alert noise reduction"
---
@@ -8,46 +9,45 @@ Sync Guance monitoring alert events to Flashduty via webhook for automated alert
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Dedicated Integration
Choose this simpler option when you don't need to route alert events to different channels.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a specific channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Select **Guance** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Guance** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In Guance
----
-## I. Alert Push Configuration
### Step 1: Create Notification Object
1. Log in to your `Guance` console, select `Notification Targets` under `Monitoring`
@@ -68,7 +68,7 @@ Choose this option when you need to route alerts to different channels based on
-## II. Status Mapping
+## Status Mapping
diff --git a/en/on-call/integration/alert-integration/alert-sources/hackerone.mdx b/en/on-call/integration/alert-integration/alert-sources/hackerone.mdx
index bb69951f..6a747c57 100644
--- a/en/on-call/integration/alert-integration/alert-sources/hackerone.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/hackerone.mdx
@@ -1,5 +1,6 @@
---
title: "HackerOne alert integration"
+sidebarTitle: "HackerOne"
description: "Send submitted, triaged, and closed vulnerability report events from a HackerOne program to Flashduty On-call through a webhook."
keywords: ["alert integration", "HackerOne", "vulnerability report", "webhook", "bug bounty"]
---
@@ -9,7 +10,6 @@ Use the webhook of a HackerOne program to send vulnerability reports to Flashdut
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure HackerOne
----
Webhooks are configured per program and inherit the permissions of the user who creates them: that user must be able to see the program's reports and change its settings.
@@ -79,14 +78,12 @@ When editing the webhook, you can click **Test request** to send an example requ
## Alert Key
----
Flashduty uses the report ID (`data.report.id` in the webhook) as the Alert Key. Every HackerOne delivery carries the full report, and the same report has the same `data.report.id` when it is submitted, triaged, closed, or reopened. It is also the number in the report URL `https://hackerone.com/reports/`.
Changes to the title, state, or severity do not change the Alert Key. Deliveries that contain a report without `data.report.id` are rejected.
## Status and severity
----
The report's current state (`data.report.attributes.state`), not the event name, sets the alert status:
@@ -111,7 +108,6 @@ The report severity (`data.report.relationships.severity.data.attributes.rating`
When triage changes a report's severity, the alert is updated with the new severity.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -126,7 +122,6 @@ When triage changes a report's severity, the alert is updated with the new sever
The alert description is the report's vulnerability information (`vulnerability_information`), truncated beyond 8 KB.
## Troubleshooting
----
- **HackerOne shows a failed delivery**: Open the failed request under **Recent deliveries** on the webhook edit page and check Flashduty's reply on the **Response** tab. Make sure the **Payload URL** is complete and includes `integration_key`
- **The alert does not recover**: Make sure `report_resolved` and all four `report_closed_as_*` events are checked. Close alerts manually in Flashduty for reports that were closed while those events were not selected
diff --git a/en/on-call/integration/alert-integration/alert-sources/harbor.mdx b/en/on-call/integration/alert-integration/alert-sources/harbor.mdx
index c7b8f0b3..80eb9704 100644
--- a/en/on-call/integration/alert-integration/alert-sources/harbor.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/harbor.mdx
@@ -1,5 +1,6 @@
---
title: "Harbor Alert Integration"
+sidebarTitle: "Harbor"
description: "Sync Harbor alert events to Flashduty via webhook for automated alert noise reduction"
keywords: ["Harbor", "alert integration", "webhook", "container registry"]
---
@@ -18,7 +19,7 @@ You can obtain an integration push URL through either of these two methods:
Choose this method when you don't need to route alert events to different channels - it's simpler.
-
+
1. Go to the Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Harbor** integration and click **Save** to generate a card
@@ -29,8 +30,8 @@ Choose this method when you don't need to route alert events to different channe
Choose this method when you need to route alerts to different channels based on the alert event payload.
-
-1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+
+1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Harbor** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
diff --git a/en/on-call/integration/alert-integration/alert-sources/harness.mdx b/en/on-call/integration/alert-integration/alert-sources/harness.mdx
index 7a7ab6f0..6f837092 100644
--- a/en/on-call/integration/alert-integration/alert-sources/harness.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/harness.mdx
@@ -1,5 +1,6 @@
---
title: "Harness alert integration"
+sidebarTitle: "Harness"
description: "Sync failed Harness pipelines, stages and triggers to Flashduty On-call through the Webhook method of a pipeline notification, and recover them on the next successful run."
keywords: ["alert integration", "Harness", "webhook", "CI/CD", "pipeline", "deployment"]
---
@@ -9,7 +10,6 @@ Use the Webhook method of a Harness pipeline notification rule to sync failed Ha
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Harness
----
Every Harness SaaS edition supports notification rules on a pipeline. You need the **Create/Edit** permission on the pipeline. The steps below configure one pipeline. If centralised notifications are enabled on your account, you can also configure many pipelines at once under **Account Settings → Notification Rules**; choose the events and the notification method the same way.
@@ -80,7 +79,6 @@ Run the pipeline so that it fails (for example, run `exit 1` in a Shell Script s
## Alert Key
----
Flashduty builds the Alert Key from the pipeline and stage, so the failure and success events of one object share one Alert Key:
@@ -95,7 +93,6 @@ Changes to the display names of pipelines, stages and triggers, to the execution
If both pipeline and stage events are selected, one failure raises two alerts: one for the pipeline and one for the failed stage. Select the events of one level only if you need just one.
## Status and severity
----
| Event | Status | Flashduty severity |
| :--- | :--- | :--- |
@@ -105,7 +102,6 @@ If both pipeline and stage events are selected, one failure raises two alerts: o
| `PipelineSuccess`, `StageSuccess` | Recover | - |
## When alerts do not recover automatically
----
In these cases no later success event arrives for the same object, so the alert does not recover automatically:
@@ -116,7 +112,6 @@ In these cases no later success event arrives for the same object, so the alert
Turn on the channel's [auto-resolve timeout](/en/on-call/channel/create-edit), set **Window timing start** to **Incident trigger**, and set the timeout to 12 hours. Pipeline failures are usually fixed on the same day, and alerts that never recover close when the timeout expires.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -134,7 +129,6 @@ Turn on the channel's [auto-resolve timeout](/en/on-call/channel/create-edit), s
User emails never become labels.
## Troubleshooting
----
- **No alerts arrive**: Check that the notification rule is enabled, that **Notification Method** is **Webhook**, and that the push URL is complete and includes `integration_key`. With delegate connectivity, check that the delegate can reach the Flashduty push URL
- **Alerts don't recover**: Check that **Pipeline Success** (or **Stage Success**) is selected and that the same pipeline has since run successfully
diff --git a/en/on-call/integration/alert-integration/alert-sources/healthchecks-io.mdx b/en/on-call/integration/alert-integration/alert-sources/healthchecks-io.mdx
index b0499fe4..57349ab2 100644
--- a/en/on-call/integration/alert-integration/alert-sources/healthchecks-io.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/healthchecks-io.mdx
@@ -1,5 +1,6 @@
---
title: "Healthchecks.io alert integration"
+sidebarTitle: "Healthchecks.io"
description: "Send Healthchecks.io check down and up notifications to Flashduty On-call through a webhook."
keywords: ["alert integration", "Healthchecks.io", "cron", "heartbeat monitoring", "webhook"]
---
@@ -11,7 +12,6 @@ Self-hosted Healthchecks needs v3.5 or later, because the template below uses th
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can get the integration push URL in either of the following ways.
## Configure Healthchecks.io
----
@@ -94,7 +93,6 @@ To verify the full flow, make a check go down (for example, call `https://hc-pin
## Payload fields
----
| Field | Placeholder | Description | Use in Flashduty |
| :--- | :--- | :--- | :--- |
@@ -110,14 +108,12 @@ To verify the full flow, make a check go down (for example, call `https://hc-pin
The alert title is the check name. When the name is empty, Flashduty uses the slug, then `Healthchecks.io check `. Every alert also carries the label `source=healthchecks-io`.
## Alert Key
----
Flashduty uses `$CODE` (`code`, the check UUID) as the Alert Key. The down and up notifications of a check carry the same UUID, so they land on the same alert. Different checks create different alerts even if they share a name. Renaming a check or changing its slug or tags does not change the Alert Key.
A check that is deleted and created again gets a new UUID and is no longer linked to the old alert.
## Status and severity
----
Healthchecks.io notifications have no severity. Flashduty maps them as follows:
@@ -129,7 +125,6 @@ Healthchecks.io notifications have no severity. Flashduty maps them as follows:
An empty or any other `status` is rejected.
## FAQ
----
@@ -152,7 +147,6 @@ Yes. Each Healthchecks.io request times out after 30 seconds. On a connection fa
## Troubleshooting
----
- **Flashduty returns an invalid parameter error**: Confirm the method is POST, the request body is the JSON above, and `code` and `status` are unchanged
- **JSON parsing fails**: Check whether a tag contains a double quote or backslash. `$TAGS` is inserted as is, and these characters make the body invalid JSON. Change the tag, or remove the `tags` line from the template
diff --git a/en/on-call/integration/alert-integration/alert-sources/hertzbeat.mdx b/en/on-call/integration/alert-integration/alert-sources/hertzbeat.mdx
index b043c5ee..c7ff597e 100644
--- a/en/on-call/integration/alert-integration/alert-sources/hertzbeat.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/hertzbeat.mdx
@@ -1,5 +1,6 @@
---
title: "Apache HertzBeat Alert Integration"
+sidebarTitle: "Apache HertzBeat"
description: "Send Apache HertzBeat alerts and recoveries to Flashduty On-call through a Webhook notice receiver."
keywords: ["alert integration", "Apache HertzBeat", "HertzBeat", "webhook", "notice receiver", "monitoring", "alert rules"]
---
@@ -9,7 +10,6 @@ Use the Webhook type of a notice receiver under **Alerting → Notification →
## In Flashduty On-call
----
Get the push URL in either of two ways.
@@ -30,7 +30,6 @@ Get the push URL in either of two ways.
## Configure HertzBeat
----
@@ -60,7 +59,6 @@ Flashduty parses only the default Webhook template that ships with HertzBeat. If
## Payload
----
HertzBeat POSTs the default template as JSON. One request can carry several alerts in `alerts`, and Flashduty handles each one:
@@ -78,14 +76,12 @@ HertzBeat POSTs the default template as JSON. One request can carry several aler
`commonLabels` and `commonAnnotations` are not read.
## Alert Key
----
The HertzBeat payload carries no alert ID. Flashduty builds the Alert Key from `alertname`, `instance` and `defineid` in `alerts[].labels`. In real HertzBeat 1.9.0 deliveries these three values were identical on trigger, repeated notification while firing, and recovery, so all three land on one Flashduty alert. Changing the severity, content or monitor name does not change the Alert Key.
A request without `labels.alertname` is rejected with a parameter error, because a recovery could not be tied to its alert. A missing `instance` or `defineid` counts as empty.
## Status and severity
----
| HertzBeat field | Flashduty status or severity |
| :--- | :--- |
@@ -98,7 +94,6 @@ A request without `labels.alertname` is rejected with a parameter error, because
A request with any other `status`, or an empty `alerts`, is rejected. In the default template `commonLabels.severity` is rewritten to decorated text (such as "Critical"), so it is not used for severity.
## FAQ
----
@@ -121,7 +116,6 @@ Flashduty recovers an alert only when HertzBeat sends `resolved`. On HertzBeat 1
## Troubleshooting
----
- **Flashduty receives no alerts**: confirm the URL is the full push URL (with `integration_key`), a notice policy exists, and the alert matches it
- **Flashduty returns a parameter error**: confirm the body is the default HertzBeat template JSON, `status` is `firing` or `resolved`, and every alert has `labels.alertname`
diff --git a/en/on-call/integration/alert-integration/alert-sources/hetrixtools.mdx b/en/on-call/integration/alert-integration/alert-sources/hetrixtools.mdx
index 1895490d..39031db1 100644
--- a/en/on-call/integration/alert-integration/alert-sources/hetrixtools.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/hetrixtools.mdx
@@ -1,5 +1,6 @@
---
title: "HetrixTools alert integration"
+sidebarTitle: "HetrixTools"
description: "Send HetrixTools uptime monitoring, server resource usage, and blacklist monitoring notifications to Flashduty On-call through a contact list webhook."
keywords: ["alert integration", "HetrixTools", "webhook", "uptime monitoring", "blacklist monitoring"]
---
@@ -13,7 +14,6 @@ Use the webhook of a HetrixTools contact list to send monitoring notifications t
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -34,7 +34,6 @@ You can get the integration push URL in either of the following ways.
## Configure HetrixTools
----
@@ -70,14 +69,12 @@ Blacklist Monitoring notifications are not sent in real time: HetrixTools batche
## Alert Key
----
**Uptime Monitoring**: Flashduty computes the Alert Key from `monitor_id`, the HetrixTools monitor ID. The `offline` and `online` notifications of a monitor carry the same `monitor_id`, so they land on the same alert. Repeat notifications while the monitor stays offline merge into that alert as well. Changes to the monitor name, target, category, timestamp, or failing locations do not change the Alert Key. A request without `monitor_id` is rejected, because its recovery could not be matched.
**Server Monitoring Resource Usage and Blacklist Monitoring**: HetrixTools sends no recovery message for these notifications, so Flashduty creates a separate alert for each notification (and for each IP or domain in a blacklist notification). Close these alerts manually once handled.
## Status and severity
----
Uptime Monitoring notifications are handled by `monitor_status`:
@@ -99,7 +96,6 @@ Resource usage severity comes from `resource_usage.resource_type`:
Blacklist severity comes from `blacklisted_now`: greater than 0 (still listed) is Warning, and 0 (removed from every blacklist) is Info.
## Alert content
----
**Uptime Monitoring**
@@ -120,7 +116,6 @@ Blacklist severity comes from `blacklisted_now`: greater than 0 (still listed) i
- **Labels**: `check` (monitor label), `resource` (IP or domain), `source`, `notification` (always `blacklist`), `blacklisted_before`, `blacklisted_now`, `blacklisted_on` (comma-separated), `report_link`
## Troubleshooting
----
- **HetrixTools reports a failed delivery**: make sure the webhook is the full push URL, including `integration_key`
- **Flashduty returns a parameter error**: uptime and resource usage notifications need `monitor_id`, and an uptime notification's `monitor_status` must be `offline` or `online`; every item of a blacklist notification needs `monitor`
diff --git a/en/on-call/integration/alert-integration/alert-sources/honeybadger.mdx b/en/on-call/integration/alert-integration/alert-sources/honeybadger.mdx
index 785a66c1..8ea15c29 100644
--- a/en/on-call/integration/alert-integration/alert-sources/honeybadger.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/honeybadger.mdx
@@ -1,5 +1,6 @@
---
title: "Honeybadger alert integration"
+sidebarTitle: "Honeybadger"
description: "Send error, uptime check, and check-in events from a Honeybadger project to Flashduty On-call through a webhook."
keywords: ["alert integration", "Honeybadger", "webhook", "error monitoring", "uptime monitoring", "check-in"]
---
@@ -9,7 +10,6 @@ Use the Webhook integration of a Honeybadger project to send error (fault), upti
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Honeybadger
----
The Webhook integration is configured per project and is available only on Honeybadger's Team, Business, and Enterprise plans. You need administrative privileges on the project.
@@ -78,7 +77,6 @@ The **Test this integration** button on the integration settings page sends an `
## Alert Key
----
Flashduty builds the Alert Key from the object the event is about, so the trigger and recovery events of the same object share one Alert Key:
@@ -93,7 +91,6 @@ Flashduty builds the Alert Key from the object the event is about, so the trigge
The Alert Key combines the object type with the ID in the table, so an `up` event for a site does not recover that site's certificate alert, and an error ID never merges with an equal project ID. Changes to the error message, environment, occurrence count, site name, and similar fields do not change the Alert Key. Events without the required ID are rejected.
## Status and severity
----
Honeybadger events carry no severity, so Flashduty sets the status and severity from the event name:
@@ -107,7 +104,6 @@ Honeybadger events carry no severity, so Flashduty sets the status and severity
`cert_will_expire` and `volume_spike` have no recovery event. Close these alerts manually in Flashduty after handling them.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -130,7 +126,6 @@ Honeybadger events carry no severity, so Flashduty sets the status and severity
| `url` | Link to the error, check, or check-in page in Honeybadger |
## Troubleshooting
----
- **Webhook is not in the integration list**: Confirm that the account is on the Team plan or higher and that you are a project administrator
- **Flashduty returns a parameter error**: Confirm that the URL is complete and includes `integration_key`
diff --git a/en/on-call/integration/alert-integration/alert-sources/honeycomb.mdx b/en/on-call/integration/alert-integration/alert-sources/honeycomb.mdx
index 7962b476..265a25d4 100644
--- a/en/on-call/integration/alert-integration/alert-sources/honeycomb.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/honeycomb.mdx
@@ -1,5 +1,6 @@
---
title: "Honeycomb alert integration"
+sidebarTitle: "Honeycomb"
description: "Send Honeycomb Trigger and SLO burn alert trigger and recovery notifications to Flashduty On-call through a webhook recipient with custom payload templates."
keywords: ["alert integration", "Honeycomb", "Trigger", "SLO", "Burn Alert", "Webhook"]
---
@@ -9,7 +10,6 @@ Use a Honeycomb webhook recipient to send Trigger alerts and SLO burn alerts to
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure Honeycomb
----
These steps require a Honeycomb account that can edit integrations in **Team Settings**. Triggers are available on every plan; SLOs and burn alerts require the Pro or Enterprise plan.
@@ -156,7 +155,6 @@ To verify the full flow, let the Trigger condition actually fire and confirm tha
## Alert Key
----
Flashduty uses `instance_id` (`.Alert.InstanceID`) as the Alert Key. Honeycomb's template variable reference defines it as the unique identifier of one Trigger or burn alert firing, useful for deduplicating and correlating alerts. Honeycomb's official incident.io template also uses it as the `deduplication_key` and resolves the matching alert on `OK`.
@@ -167,7 +165,6 @@ Flashduty uses `instance_id` (`.Alert.InstanceID`) as the Alert Key. Honeycomb's
With **Group resolution alerts**, Flashduty also merges notifications by `instance_id` and recovers the alert when a notification with `status` `OK` arrives. The alert description lists the groups currently over the threshold.
## Status and severity
----
Flashduty uses `status` to tell triggers from recoveries, and the `severity` variable to set the severity.
@@ -181,7 +178,6 @@ Flashduty uses `status` to tell triggers from recoveries, and the `severity` var
When `status` is `OK`, Flashduty recovers the original alert and keeps its last severity. An empty or any other `status` is rejected.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -199,7 +195,6 @@ When `status` is `OK`, Flashduty recovers the original alert and keeps its last
| `slo_id`, `slo_url` | ID and link of the related SLO (burn alerts only) |
## Troubleshooting
----
- **The Flashduty recipient is not selectable in Honeycomb**: Confirm that the matching alert type is enabled on the **Payload** tab and has a template
- **Flashduty returns a parameter error**: Confirm that the template matches the one above and that `instance_id` and `status` are not empty. Honeycomb does not retry 4xx responses
diff --git a/en/on-call/integration/alert-integration/alert-sources/hookdeck.mdx b/en/on-call/integration/alert-integration/alert-sources/hookdeck.mdx
index 41a4a17b..9dbe7bfa 100644
--- a/en/on-call/integration/alert-integration/alert-sources/hookdeck.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/hookdeck.mdx
@@ -1,5 +1,6 @@
---
title: "Hookdeck alert integration"
+sidebarTitle: "Hookdeck"
description: "Send Hookdeck issues (failed deliveries, rejected requests, transformation errors, queue backpressure) to Flashduty On-call through the project's webhook notifications. Alerts recover when the issue is resolved."
keywords: ["alert integration", "Hookdeck", "issue", "webhook notifications", "delivery failure"]
---
@@ -9,7 +10,6 @@ Hookdeck opens an issue when a delivery fails, a source rejects a request, a tra
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Hookdeck
----
Hookdeck sends webhook notifications to a source in your project, and a connection forwards them to a destination. So first create a connection that forwards notifications to Flashduty, then turn on webhook notifications in the project settings.
@@ -69,11 +68,11 @@ If you select only `issue.opened`, Flashduty never hears that an issue was resol
1. Create a test connection whose destination URL is `https://mock.hookdeck.com?status=500` (a Hookdeck mock endpoint that always returns HTTP 500), then send a request to the connection's source URL (shown when you open the source in Hookdeck):
-```bash
-curl -X POST '' \
- -H 'Content-Type: application/json' \
- -d '{"type":"flashduty.test"}'
-```
+ ```bash
+ curl -X POST '' \
+ -H 'Content-Type: application/json' \
+ -d '{"type":"flashduty.test"}'
+ ```
2. Once a new delivery issue appears on the Hookdeck **Issues** page, confirm that Flashduty receives a Critical alert
3. On the Issues page, change the issue's status to **Resolved** and confirm that the alert recovers
@@ -83,14 +82,12 @@ curl -X POST '' \
## Alert Key
----
Flashduty uses the Hookdeck issue ID (`issue.id`, such as `iss_...`) as the Alert Key. An issue keeps the same ID when it is opened, acknowledged, resolved, and reopened, so status update notifications apply to the alert created when the issue opened.
Changes to the issue's error code, response status, first and last seen times, or connection name do not change the Alert Key. Requests without `issue.id` are rejected.
## Status and severity
----
The severity comes from the issue type (`issue.type`):
@@ -114,7 +111,6 @@ The status comes from `issue.status`:
Other status values are rejected with a parameter error. Only the `issue.opened` and `issue.updated` topics create alerts; other topics (such as `event.successful`) are accepted and ignored.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -134,7 +130,6 @@ Other status values are rejected with a parameter error. Only the `issue.opened`
The failed request included in the notification (headers and body) is not written to labels.
## Troubleshooting
----
- **No alerts arrive**: Check that webhook notifications are on and point to the right source, and that the `flashduty` connection is not paused. In Hookdeck, open that connection's events and confirm that Flashduty returned 200
- **The alert does not recover**: Check that `issue.updated` is selected under Webhook topics, and mark the issue Resolved or Ignored in Hookdeck. Dismissing an issue does not change its status
diff --git a/en/on-call/integration/alert-integration/alert-sources/hosted-graphite.mdx b/en/on-call/integration/alert-integration/alert-sources/hosted-graphite.mdx
index 6cb8eed3..5ea5642f 100644
--- a/en/on-call/integration/alert-integration/alert-sources/hosted-graphite.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/hosted-graphite.mdx
@@ -1,5 +1,6 @@
---
title: "Hosted Graphite alert integration"
+sidebarTitle: "Hosted Graphite"
description: "Send threshold alert triggers and recoveries from Hosted Graphite to Flashduty On-call through the alert Webhook notification channel."
keywords: ["alert integration", "Hosted Graphite", "Graphite", "Webhook", "Notification Channel", "metric alerts"]
---
@@ -9,7 +10,6 @@ Use a Hosted Graphite Webhook notification channel to send metric alert triggers
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## In Hosted Graphite
----
@@ -57,7 +56,6 @@ Hosted Graphite notifications carry no alert ID, so Flashduty tells alerts apart
## Payload
----
Hosted Graphite POSTs these fields as `application/json`. Flashduty parses them directly; no template is needed.
@@ -73,14 +71,12 @@ Hosted Graphite POSTs these fields as `application/json`. Flashduty parses them
| `timestamp`, `backoff_minutes` | Send time, backoff setting | Not stored |
## Alert Key
----
Flashduty computes the Alert Key as the MD5 of the alert name and metric name joined by a delimiter. The trigger and recovery of one alert on one metric carry the same name and metric, so they land on the same Flashduty alert; alerts with a different name or metric stay separate. Changing the condition or the current value does not change the Alert Key.
Hosted Graphite provides no alert ID, so this combination is inferred: two alerts with the same name and metric merge. If `name` is missing, Flashduty returns a parameter error.
## Status and severity
----
Hosted Graphite notifications carry no severity, so Flashduty treats every alert as Warning.
@@ -92,7 +88,6 @@ Hosted Graphite notifications carry no severity, so Flashduty treats every alert
Requests with an empty or unknown `status` are rejected so they cannot corrupt an alert lifecycle.
## FAQ
----
@@ -109,7 +104,6 @@ No test button was observed for the Webhook channel. Verify by pushing a metric
## Troubleshooting
----
- **Hosted Graphite fails to deliver**: check that the URL is the full push URL including `integration_key`
- **Flashduty returns a parameter error**: check that the body is JSON, `name` is not empty, and `status` is `alerting` or `recovered`
diff --git a/en/on-call/integration/alert-integration/alert-sources/http-pull.mdx b/en/on-call/integration/alert-integration/alert-sources/http-pull.mdx
index 13ae2d64..916a600e 100644
--- a/en/on-call/integration/alert-integration/alert-sources/http-pull.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/http-pull.mdx
@@ -1,5 +1,6 @@
---
title: "HTTP Pull Alert Integration"
+sidebarTitle: "HTTP Pull"
description: "Flashduty periodically polls an external HTTP endpoint and ingests the returned alert events. Use this for systems that cannot push alerts, or when you prefer to decouple ingestion from the source."
keywords: ["Alert Integration", "HTTP Pull", "Polling", "Cursor Pagination", "Data Ingestion"]
---
@@ -13,7 +14,6 @@ HTTP Pull is the right choice when your source **cannot send webhooks**, **is qu
## Setup Steps
----
### In Flashduty
@@ -33,7 +33,7 @@ When you don't need to route alert events to different channels, this method is
When you need to route alert events to different channels based on the alert payload, choose this method.
-1. Enter the Flashduty console, select **Integration Center => Alert Events** to enter the integration selection page.
+1. Enter the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page.
2. Select the **HTTP Pull** integration and fill in the **Integration Name**.
3. Configure the **Default Route** and select the corresponding channel (after the integration is created, go to **Route** to add finer-grained routing rules).
4. Fill in the form as described in the "Configuration" section below and click **Save**.
@@ -42,7 +42,6 @@ When you need to route alert events to different channels based on the alert pay
## Configuration
----
### HTTP Request
@@ -95,14 +94,12 @@ When pagination is enabled, the response must additionally expose a field for th
```
## Default Route
----
-When creating a "Shared Integration" (under **Integration Center => Alert Events**), you must configure a default route — otherwise newly pulled events will be dropped. After creation, you can add finer-grained rules under **Route**.
+When creating a "Shared Integration" (under **Integration Center → Alert Events**), you must configure a default route — otherwise newly pulled events will be dropped. After creation, you can add finer-grained rules under **Route**.
A "Dedicated Integration" (created under **Configuration → Integrations → Private integration** in a specific channel) is automatically bound to that channel and does not need a separate default route.
## Template Variables
----
The URL and request body support Go template syntax. There is currently **one** built-in variable:
diff --git a/en/on-call/integration/alert-integration/alert-sources/huawei-aom.mdx b/en/on-call/integration/alert-integration/alert-sources/huawei-aom.mdx
index 80e58ae9..d74aba82 100644
--- a/en/on-call/integration/alert-integration/alert-sources/huawei-aom.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/huawei-aom.mdx
@@ -1,5 +1,6 @@
---
title: "Huawei Cloud AOM alert integration"
+sidebarTitle: "Huawei Cloud AOM"
description: "Send Huawei Cloud AOM alerts to Flashduty On-call through SMN notifications or AOM webhook data subscriptions"
keywords: ["alert integration", "Huawei Cloud AOM", "SMN", "webhook", "data ingestion"]
---
@@ -21,7 +22,7 @@ Use either of the following methods to obtain an integration push URL.
Use this method when you do not need to route alerts to different channels.
-
+
1. In the Flashduty console, select **Channels** and open the target channel.
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration**.
3. Select **Huawei Cloud AOM** and click **Save**.
@@ -34,8 +35,8 @@ Use this method when you do not need to route alerts to different channels.
Use this method when you need to route alerts to different channels based on their payload.
-
- 1. In the Flashduty console, select **Integration Center > Alert events**.
+
+ 1. In the Flashduty console, select **Integration Center → Alert events**.
2. Select **Huawei Cloud AOM** and enter an integration name.
3. Configure the default route and select a channel. You can add more routing rules under **Routes** after creating the integration.
4. Click **Save** and copy the generated **push URL**.
@@ -58,7 +59,7 @@ Use this method when you need to route alerts to different channels based on the
1. Sign in to the Huawei Cloud console and open **Simple Message Notification (SMN)**.
-2. Select **Topic Management > Topics** and click **Create Topic**.
+2. Select **Topic Management → Topics** and click **Create Topic**.
3. Set the topic name to **Flashduty** and save it.
@@ -81,7 +82,7 @@ Use this method when you need to route alerts to different channels based on the
### Configure an AOM message template
-In the AOM 2.0 console, go to **Alarm Center > Alarm Notifications > Message Templates**. In some console versions, the path is **Alarms > Alarm Action Rules > Message Templates**.
+In the AOM 2.0 console, go to **Alarm Center → Alarm Notifications → Message Templates**. In some console versions, the path is **Alarms → Alarm Action Rules → Message Templates**.
When creating the template, select **HTTP/HTTPS** as the notification method. Flashduty supports the following content formats:
@@ -151,7 +152,7 @@ When creating the template, select **HTTP/HTTPS** as the notification method. Fl
-1. In the AOM 2.0 console, go to **Alarm Center > Alarm Notifications**.
+1. In the AOM 2.0 console, go to **Alarm Center → Alarm Notifications**.
2. Under **Notification Rule Management**, create an alarm notification rule.
3. Select the **Flashduty** SMN topic and the AOM message template created earlier.
@@ -171,7 +172,7 @@ When creating the template, select **HTTP/HTTPS** as the notification method. Fl
AOM webhook data subscription is not generally available. If the webhook alarm subscription option is not available in your console, submit a Huawei Cloud service ticket or use SMN instead.
-If Huawei Cloud has enabled this feature for your account, go to **Settings > Global Settings > Data Subscription** in the AOM 2.0 console. Create a webhook alarm subscription and set its destination to the same Flashduty AOM integration push URL.
+If Huawei Cloud has enabled this feature for your account, go to **Settings → Global Settings → Data Subscription** in the AOM 2.0 console. Create a webhook alarm subscription and set its destination to the same Flashduty AOM integration push URL.
The webhook request must use the official AOM structured event format:
diff --git a/en/on-call/integration/alert-integration/alert-sources/huawei-apm.mdx b/en/on-call/integration/alert-integration/alert-sources/huawei-apm.mdx
index 03af18b1..f0b87aef 100644
--- a/en/on-call/integration/alert-integration/alert-sources/huawei-apm.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/huawei-apm.mdx
@@ -1,5 +1,6 @@
---
title: "Huawei Cloud APM Alerts"
+sidebarTitle: "Huawei Cloud APM"
description: "Sync Huawei Cloud APM alerts to Flashduty through webhook to achieve automatic alert noise reduction"
---
@@ -8,46 +9,45 @@ Sync Huawei Cloud APM alerts to Flashduty through webhook, to achieve automatic
## In Flashduty
----
You can get an integration push URL through the following 2 methods, choose one of them.
### Use dedicated integration
When you don't need to route alerts to different channels, choose this method, it's simpler.
-
- Expand
+
+
1. Go to Flashduty console, select **Channels**, enter the details page of a channel
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Select **Huawei Cloud APM** integration, click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use. Done.
-
+
+
### Use shared integration
When you need to route alerts to different channels based on alert payload information, this method is preferred.
-
- Expand
+
+
- 1. Go to Flashduty console, select **Integration Center=>Alerts** to enter the integration selection page
+ 1. Go to Flashduty console, select **Integration Center → Alerts** to enter the integration selection page
2. Select **Huawei Cloud APM** integration:
- **Integration Name**: Define a name for the current integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done.
-
+
+
## In Huawei Cloud
----
-## I. Huawei Cloud APM Alert Push Configuration
### Create Flashduty Alert Channel
@@ -55,15 +55,15 @@ When you need to route alerts to different channels based on alert payload infor
2. Select `Topic Management=>Topics` from the left navigation bar
3. Click `Create Topic`, enter `Flashduty` as the topic name in the edit page and confirm
-
+
4. Return to the topic list and click `Add Subscription` in the newly created Flashduty topic
-
+
5. In the edit page, select `HTTPS` as the protocol, enter the **push URL** as the subscription endpoint and confirm
-
+
6. After adding, check if the subscription status shows **Confirmed** in the subscription list
@@ -91,7 +91,7 @@ When you need to route alerts to different channels based on alert payload infor
**Note:** The current integration configuration only supports application monitoring alerts, and does not fully support front-end monitoring, link tracking, and App monitoring alerts.
-## II. Status Mapping
+## Status Mapping
diff --git a/en/on-call/integration/alert-integration/alert-sources/huawei-ces.mdx b/en/on-call/integration/alert-integration/alert-sources/huawei-ces.mdx
index 4419112b..ca955e35 100644
--- a/en/on-call/integration/alert-integration/alert-sources/huawei-ces.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/huawei-ces.mdx
@@ -1,5 +1,6 @@
---
title: "Huawei Cloud CES Integration"
+sidebarTitle: "Huawei Cloud CES"
description: "Sync Huawei Cloud CES alerts to Flashduty via webhook to achieve automated alert noise reduction"
---
@@ -8,42 +9,42 @@ Sync Huawei Cloud CES alerts to Flashduty via webhook to achieve automated alert
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this method when you don't need to route alerts to different channels. It's simpler.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Huawei Cloud CES** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this method when you need to route alerts to different channels based on the alert payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alerts** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alerts** to enter the integration selection page
2. Select **Huawei Cloud CES** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In Huawei Cloud CES
----
1. Log in to your Huawei Cloud console, search for `Cloud Eye Service` product, and enter its console
@@ -51,20 +52,20 @@ Choose this method when you need to route alerts to different channels based on
3. Select `HTTPS` as protocol, enter `flashduty` as name, and fill in the integration URL (enter integration name on current page, URL will be generated after saving)
4. Click `OK` button to complete notification object creation
-
+
5. Go to `Alarm-Alarm Notifications-Notification Groups` page, click `Create Notification Group` button
6. Enter `Flashduty` as group name, check the `flashduty` notification object created earlier
7. Click `OK` button to complete notification group creation
-
+
-Note: When creating a notification group, Huawei Cloud will send a request to Flashduty to verify the push URL. Check the notification group's object list - alerts will only be pushed normally when the notification object status is `Confirmed`
+ Note: When creating a notification group, Huawei Cloud will send a request to Flashduty to verify the push URL. Check the notification group's object list - alerts will only be pushed normally when the notification object status is `Confirmed`
8. Go to `Alarm-Alarm Rules` page, edit existing alarm rules or create new ones to open the `Alarm Rule Details` page
9. Select `Flashduty` as the notification group, check both `Alarm Triggered` and `Cleared` conditions. Click `OK` button to save changes
-
+
10. Return to Flashduty console's integration list page. If the latest event time is displayed, the configuration is successful and events are being received
11. Done
@@ -72,7 +73,6 @@ Note: When creating a notification group, Huawei Cloud will send a request to Fl
## Status Mapping
----
Huawei Cloud CES to Flashduty alert severity mapping:
diff --git a/en/on-call/integration/alert-integration/alert-sources/huawei-lts.mdx b/en/on-call/integration/alert-integration/alert-sources/huawei-lts.mdx
index ccf21cd4..d6f4fdae 100644
--- a/en/on-call/integration/alert-integration/alert-sources/huawei-lts.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/huawei-lts.mdx
@@ -1,5 +1,6 @@
---
title: "Huawei Cloud LTS Alert Events"
+sidebarTitle: "Huawei Cloud LTS"
description: "Sync Huawei Cloud Log Tank Service (LTS) alert events to Flashduty via webhook for automated alert noise reduction."
---
@@ -8,61 +9,60 @@ Sync Huawei Cloud Log Tank Service (LTS) alert events to Flashduty via webhook f
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this simpler option when you don't need to route alert events to different channels.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Huawei Cloud LTS** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're Done
-
+
+
### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Huawei Cloud LTS** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In Huawei Cloud
----
-## I. Huawei Cloud LTS Alert Push Configuration
### Step 1: Create Flashduty Alert Channel
1. Log in to your Huawei Cloud Console, search for `SMN` (Simple Message Notification) service and enter its console
2. Select `Topic Management=>Topics` from the left navigation bar
3. Click `Create Topic`, enter `Flashduty` as the topic name in the edit page and confirm
-
+
4. Return to the topic list and click `Add Subscription` in the newly created Flashduty topic
-
+
5. In the edit page, select `HTTPS` as the protocol, enter the **push URL** as the subscription endpoint and confirm
-
+
6. After adding, check if the subscription status shows **Confirmed** in the subscription list
@@ -73,13 +73,13 @@ Choose this option when you need to route alerts to different channels based on
1. Log in to your Huawei Cloud Console, search for `LTS` (Log Tank Service) and enter its console
2. Select `Log Alert=>Alert Action Rules=>Message Templates` from the left navigation bar and click `Create`
-
+
3. In the template edit page, enter **Flashduty** as the name, select `English` as the message header language
4. Select `HTTP/HTTPS` as notification type and `JSON` as data type
5. Click `Confirm` to save
-
+
6. Return to the `Alert Action Rules` list and click `Create`
7. Enter **Flashduty** as the rule name, select the previously created **Flashduty** topic and template
@@ -99,7 +99,7 @@ Choose this option when you need to route alerts to different channels based on
-## II. Status Mapping
+## Status Mapping
diff --git a/en/on-call/integration/alert-integration/alert-sources/hund.mdx b/en/on-call/integration/alert-integration/alert-sources/hund.mdx
index 288e2a73..31460dee 100644
--- a/en/on-call/integration/alert-integration/alert-sources/hund.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/hund.mdx
@@ -1,5 +1,6 @@
---
title: "Hund alert integration"
+sidebarTitle: "Hund"
description: "Use Hund status page webhooks to send status page issues and component availability changes to Flashduty On-call."
keywords: ["alert integration", "Hund", "status page", "webhook", "component status"]
---
@@ -12,7 +13,6 @@ Use Hund status page outgoing webhooks (version 2) to send changes on your statu
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -33,7 +33,6 @@ You can get the integration push URL in either of the following ways.
## In Hund
----
@@ -67,7 +66,6 @@ You can also verify with a real event: create an issue on the status page and an
## Payload
----
Hund sends JSON. `event.kind` is the notification type:
@@ -108,7 +106,6 @@ Fields used for component status (`degraded`, `restored`):
Every alert also carries the labels `source=hund` and `event` (the notification type).
## Alert Key
----
- Issues: the issue ID. Every notification from creation through updates to resolution lands on the same alert
- Components: the component ID. Hund creates a new status object on every state change (one ID for degraded, another for restored), so component alerts are keyed on the component itself, and `degraded` through `restored` for one component lands on the same alert
@@ -116,7 +113,6 @@ Every alert also carries the labels `source=hund` and `event` (the notification
Issue alerts and component alerts are independent. An issue can affect several components, which may each have their own alert; use the channel's [alert grouping](/en/on-call/channel/noise-reduction) to merge them into one incident. Changing an issue title or a component name does not change the Alert Key.
## Status and severity
----
| Hund notification | Flashduty status or severity |
| :--- | :--- |
@@ -132,7 +128,6 @@ Issue alerts and component alerts are independent. An issue can affect several c
An update that carries a `state_override` takes precedence; otherwise the issue's own value is used.
## FAQ
----
@@ -155,7 +150,6 @@ There is one issue alert, keyed by the issue ID. Each component's `degraded` and
## Troubleshooting
----
- **Flashduty returns an invalid-parameter error**: the payload has no `event.eventable.id` (issues) or `event.contexts.component.id` (component status)
- **An issue alert does not recover**: confirm the issue is marked resolved or ended in Hund and that the subscription includes the matching notification
diff --git a/en/on-call/integration/alert-integration/alert-sources/hyperdx.mdx b/en/on-call/integration/alert-integration/alert-sources/hyperdx.mdx
index 9b029e69..60e27d6c 100644
--- a/en/on-call/integration/alert-integration/alert-sources/hyperdx.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/hyperdx.mdx
@@ -1,5 +1,6 @@
---
title: "HyperDX alert integration"
+sidebarTitle: "HyperDX"
description: "Send HyperDX (ClickStack) search alert and chart alert trigger and recovery notifications to Flashduty On-call through a Generic webhook with a fixed body template."
keywords: ["alert integration", "HyperDX", "ClickStack", "ClickHouse", "Webhook"]
---
@@ -9,7 +10,6 @@ Use a Generic webhook in HyperDX (the UI layer of ClickStack) to send search ale
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure HyperDX
----
Both open-source HyperDX and managed ClickStack in ClickHouse Cloud support Generic webhooks. A self-hosted HyperDX must be able to reach the public domain of the Flashduty push URL.
@@ -43,18 +42,18 @@ Both open-source HyperDX and managed ClickStack in ClickHouse Cloud support Gene
4. Leave **Webhook Headers** empty. HyperDX sends `Content-Type: application/json` by default
5. Paste the following template into **Webhook Body**
-```json
-{
- "event_id": "{{eventId}}",
- "state": "{{state}}",
- "severity": "Warning",
- "title": "{{title}}",
- "body": "{{body}}",
- "link": "{{link}}",
- "alert_id": "{{alertId}}",
- "group": "{{groupKey}}"
-}
-```
+ ```json
+ {
+ "event_id": "{{eventId}}",
+ "state": "{{state}}",
+ "severity": "Warning",
+ "title": "{{title}}",
+ "body": "{{body}}",
+ "link": "{{link}}",
+ "alert_id": "{{alertId}}",
+ "group": "{{groupKey}}"
+ }
+ ```
6. Click **Test Webhook** to confirm the push URL is reachable, then click **Add Webhook** to save
@@ -94,7 +93,6 @@ To verify the full flow, make the alert condition actually match and confirm an
## Alert Key
----
Flashduty uses `event_id` (`{{eventId}}`) as the Alert Key directly. HyperDX's webhook template variable documentation states that `{{eventId}}` stays the same for one alert, group and webhook from trigger to recovery, and HyperDX's own incident.io template uses it as the deduplication key.
@@ -104,7 +102,6 @@ Flashduty uses `event_id` (`{{eventId}}`) as the Alert Key directly. HyperDX's w
- Changing the alert's **grouped by**, or deleting and recreating the webhook, produces a new `event_id`. Flashduty alerts triggered before the change receive no recovery and must be closed manually
## Status and severity
----
Flashduty uses `state` to decide between trigger and recovery, and `severity` to set the alert severity.
@@ -124,7 +121,6 @@ Flashduty uses `state` to decide between trigger and recovery, and `severity` to
`severity` is case-insensitive. HyperDX sends a recovery notification only when it previously sent a trigger notification for the alert. While an alert is silenced, HyperDX sends neither trigger nor recovery notifications.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -137,7 +133,6 @@ Flashduty uses `state` to decide between trigger and recovery, and `severity` to
The alert title comes from `{{title}}` with the 🚨 and ✅ prefixes added by HyperDX removed. The alert description comes from `{{body}}`.
## Troubleshooting
----
- **Flashduty returns a parameter error**: Make sure the webhook body matches the template above, `event_id` and `state` are not empty, and string variables keep their surrounding double quotes
- **Test Webhook succeeds but no alert appears**: This is expected. Test data does not create alerts
diff --git a/en/on-call/integration/alert-integration/alert-sources/hyperping.mdx b/en/on-call/integration/alert-integration/alert-sources/hyperping.mdx
index 925685b0..eafdbc9c 100644
--- a/en/on-call/integration/alert-integration/alert-sources/hyperping.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/hyperping.mdx
@@ -1,5 +1,6 @@
---
title: "Hyperping alert integration"
+sidebarTitle: "Hyperping"
description: "Send Hyperping monitor down and recovery notifications to Flashduty On-call through the Webhooks integration."
keywords: ["alert integration", "Hyperping", "Uptime", "webhook", "check.down", "check.up"]
---
@@ -9,7 +10,6 @@ Use Hyperping's Webhooks integration to send monitor down (`check.down`) and rec
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## In Hyperping
----
@@ -53,7 +52,6 @@ Hyperping recommends testing with a monitor that returns an error, such as a pag
The Webhook card on the Integrations page is marked Pro and needs the Pro plan or higher; during the free trial, clicking it redirects to the Billing page. If you cannot open the configuration, upgrade your plan first.
## Payload
----
Hyperping POSTs JSON. Flashduty parses it directly, with no template to configure:
@@ -69,14 +67,12 @@ Hyperping POSTs JSON. Flashduty parses it directly, with no template to configur
The alert title is the monitored URL; when the URL is empty it is `Hyperping monitor `.
## Alert Key
----
The Alert Key is `check.monitorUuid`. In the Hyperping documentation, the `check.down` and `check.up` samples carry the same `monitorUuid`, so a monitor's down and recovery notifications land on one alert, and different monitors produce different alerts. Changing the URL, status code, time, or check location does not change the Alert Key.
If a request has no `check.monitorUuid`, Flashduty returns a parameter error, because the recovery could not be tied to its alert reliably. A notification whose `event` is neither `check.down` nor `check.up` (for example an event type Hyperping adds later) is ignored and acknowledged, and creates no alert.
## Status and severity
----
Hyperping notifications carry no severity, so a down is treated as Critical.
@@ -88,7 +84,6 @@ Hyperping notifications carry no severity, so a down is treated as Critical.
A request whose `event` is empty or any other value is rejected, so that a request of unknown state never enters the wrong alert lifecycle.
## FAQ
----
@@ -105,7 +100,6 @@ No. Notifications for the same monitor carry the same `monitorUuid` and merge in
## Troubleshooting
----
- **Hyperping shows a failed delivery**: confirm the webhook URL is the full push URL and includes `integration_key`
- **Flashduty returns a parameter error**: confirm the request is a Hyperping JSON notification and that `event` and `check.monitorUuid` are not empty
diff --git a/en/on-call/integration/alert-integration/alert-sources/ibm-qradar.mdx b/en/on-call/integration/alert-integration/alert-sources/ibm-qradar.mdx
index 8c49fd87..02522216 100644
--- a/en/on-call/integration/alert-integration/alert-sources/ibm-qradar.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/ibm-qradar.mdx
@@ -1,5 +1,6 @@
---
title: "IBM QRadar alert integration"
+sidebarTitle: "IBM QRadar"
description: "IBM QRadar rule responses can send email. Use Flashduty's email integration to receive QRadar alerts by rules."
keywords: ["alert integration", "IBM QRadar", "QRadar", "SIEM", "email", "security alerts"]
---
@@ -9,7 +10,6 @@ An IBM QRadar rule can run an email response, and the subject and body of that e
## In Flashduty On-call
----
Get the integration email address in either of the two ways below. **In both cases choose the Email integration type**, not IBM QRadar.
@@ -30,7 +30,6 @@ Get the integration email address in either of the two ways below. **In both cas
## Configure in QRadar
----
A rule's email response uses the event or flow templates in `alert-config.xml`. QRadar's documentation describes how to edit them: [Configuring event and flow custom email notifications](https://www.ibm.com/docs/en/qsip/7.4.0?topic=notifications-configuring-event-flow-custom-email). Below is the minimal change that makes the email fit a Flashduty rule.
@@ -93,7 +92,6 @@ In the response of each QRadar rule that should notify, enable the email notific
## Configure the push rule in Flashduty
----
QRadar rule emails have no recovery email; one email corresponds to one rule firing. One trigger rule is therefore enough, and the Alert Key is extracted from the email title as "rule name + source IP".
@@ -111,7 +109,6 @@ Regex: /^\[QRadar\] (.+)$/
The default rule discards mail so that emails without the `[QRadar]` prefix (for example system notifications) do not create alerts.
## Recovery and deduplication
----
- A QRadar rule response does not send another email when the condition clears, so Flashduty never closes these alerts on its own. Enable the [auto-resolve timeout](/en/on-call/channel/create-edit) on the channel that receives this integration (24 hours suggested), or close alerts manually once handled.
- When the same rule fires again for the same source IP, the title and Alert Key are the same, so Flashduty updates the existing alert. To distinguish by destination IP or user, add the matching parameter (such as `${DestinationIP}` or `${UserName}`) to ``.
@@ -119,7 +116,6 @@ The default rule discards mail so that emails without the `[QRadar]` prefix (for
- An email body over 128 KB is truncated and attachments are dropped; see the [email integration](/en/on-call/integration/alert-integration/alert-sources/email).
## Troubleshooting
----
- **No alerts arrive**: confirm **Deploy Full Configuration** was run, the rule's email response uses the new template, and the QRadar mail server can deliver to the Flashduty email address
- **Every alert is discarded**: the email title does not start with `[QRadar] `, which means the rule is not using the new template; check the title of a received email
diff --git a/en/on-call/integration/alert-integration/alert-sources/icinga.mdx b/en/on-call/integration/alert-integration/alert-sources/icinga.mdx
index b4eeb109..bc4216e3 100644
--- a/en/on-call/integration/alert-integration/alert-sources/icinga.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/icinga.mdx
@@ -1,5 +1,6 @@
---
title: "Icinga 2 alert integration"
+sidebarTitle: "Icinga 2"
description: "Send Icinga 2 host and service notifications to Flashduty On-call through a notification command. Alerts close automatically when the problem recovers."
keywords: ["alert integration", "Icinga", "Icinga 2", "NotificationCommand", "notification command", "Nagios"]
---
@@ -9,7 +10,6 @@ Icinga 2 has no built-in webhook notification method. This integration provides
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure Icinga 2
----
The configuration below works with Icinga 2.11 and later. The notification command only needs `curl`, installed on the Icinga 2 node that runs notifications, and that node must be able to reach the Flashduty push URL.
@@ -131,7 +130,6 @@ You can also choose **Send custom notification** on the service page to check co
Icinga 2 runs the notification command once for each user of a notification. If `users` or `user_groups` contains several users, the same notification is pushed several times. These pushes land on the same alert but create duplicate events. So configure only the `flashduty` user for the Flashduty notifications.
## Alert Key
----
Flashduty computes the Alert Key from the host name `host_name` and the service name `service_name`. Host notifications use an empty service name. Icinga 2 names a service object `host name!service name`, and a service name is unique within its host, so problem and recovery notifications for the same host or service land on the same alert.
@@ -140,7 +138,6 @@ Changes to the state, plugin output, display names, host address, or groups do n
Flashduty rejects a request that lacks `host_name` or `notification_type`, a host notification that lacks `host_state`, and a service notification that lacks `service_state`.
## Alert lifecycle
----
Icinga 2 sends a recovery notification only after it has sent a problem notification. An alert opened from an acknowledgement, downtime, flapping, or custom notification might never get a recovery notification to close it. So only problem notifications open alerts, and Flashduty handles each notification type `notification_type` as follows:
@@ -157,7 +154,6 @@ While a problem lasts, Icinga 2 resends the `PROBLEM` notification every 30 minu
The `apply Notification` rules above set no `types` or `states`, so Icinga 2 sends every notification type. When a downtime is removed, Icinga 2 sends the type `DOWNTIMECANCELLED`. Ignored notifications get a success response.
## Severity
----
Severity comes from the current state: `service_state` for service notifications and `host_state` for host notifications.
@@ -173,14 +169,12 @@ Severity comes from the current state: `service_state` for service notifications
A recovery event takes its severity from the state before the recovery (`service_last_state` or `host_last_state`).
## Alert content
----
- **Title**: ` on ` for service notifications, `Host ` for host notifications. Object names are used when no display name is set
- **Description**: the plugin output `service_output` or `host_output`
- **Labels**: `host`, `resource` (host name), `service`, `check` (service name, service notifications only), `notification_type`, `state`, `host_display_name`, `host_address`, `host_groups`, `service_display_name` and `service_groups` (service notifications only). Multiple groups are joined with commas
## Troubleshooting
----
- **No notification is sent**: check the object's notification history in Icinga Web, confirm the `flashduty` notification objects exist (run `icinga2 daemon -C --dump-objects` to write the object cache, then `icinga2 object list --type Notification --name '*flashduty'`), and confirm notifications are not disabled on the host or service
- **The Icinga 2 log shows `exit code 22`**: `curl` got an HTTP 4xx/5xx response. Confirm that `vars.flashduty_push_url` is the full push URL and includes `integration_key`
diff --git a/en/on-call/integration/alert-integration/alert-sources/image-upload.mdx b/en/on-call/integration/alert-integration/alert-sources/image-upload.mdx
index f289d102..3deac634 100644
--- a/en/on-call/integration/alert-integration/alert-sources/image-upload.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/image-upload.mdx
@@ -4,7 +4,7 @@ description: "Upload an image via the image upload API to obtain an image_key, t
keywords: ["image upload", "image_key", "standard alert", "alert image", "integration_key", "Flashduty"]
---
-## 1. Overview
+## Overview
When reporting an alert, you can attach images via the `images` field of a [Standard Alert](/en/on-call/integration/alert-integration/alert-sources/standard-alert) to display alert-related screenshots in the frontend and in Feishu/DingTalk app notifications. The `src` of each image in `images` accepts two kinds of values:
@@ -21,7 +21,7 @@ When an image has no public URL, call the image upload API first to upload it an
Image upload and standard alert reporting share the same integration key (`integration_key`). Use the push key you obtained from a [Standard Alert](/en/on-call/integration/alert-integration/alert-sources/standard-alert) (or any other) integration — no separate provisioning is required.
-## 2. API Specification
+## API Specification
### Request Method
@@ -111,7 +111,7 @@ To keep the service stable, image upload is rate-limited per account:
Exceeding the limit returns `RequestTooFrequently` (HTTP 429).
-## 3. Example
+## Example
Request:
@@ -131,7 +131,7 @@ Success response:
}
```
-## 4. Referencing the Image in an Alert
+## Referencing the Image in an Alert
Once you have the `image_key`, put it into the `src` field of an image in the `images` array when reporting a [Standard Alert](/en/on-call/integration/alert-integration/alert-sources/standard-alert):
@@ -158,7 +158,7 @@ For the full field definitions of the `images` array and the `image` struct, see
- An uploaded image is stored temporarily at first and is promoted to long-term storage only after it is referenced by an alert. Use the `image_key` in an alert report promptly after uploading.
-## 5. FAQ
+## FAQ
1. **What happens if I upload the same image twice?**
diff --git a/en/on-call/integration/alert-integration/alert-sources/imperva.mdx b/en/on-call/integration/alert-integration/alert-sources/imperva.mdx
index 344afd8e..5ece534b 100644
--- a/en/on-call/integration/alert-integration/alert-sources/imperva.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/imperva.mdx
@@ -1,5 +1,6 @@
---
title: "Imperva alert integration"
+sidebarTitle: "Imperva"
description: "Send Imperva DDoS attack start and stop, BGP connection down and up, and connection performance events to Flashduty On-call through a Webhook Connection."
keywords: ["alert integration", "Imperva", "Thales", "DDoS", "BGP", "webhook", "network protection"]
---
@@ -9,7 +10,6 @@ The Imperva (Thales) Cloud Application and Network Security console has Webhook
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure Imperva
----
@@ -61,7 +60,6 @@ Click **Test Webhook** on the connection. Flashduty creates an Info alert titled
Imperva's webhook payload has a fixed format and cannot be templated. Imperva may deliver the same event more than once; Flashduty merges repeats under the same Alert Key, so no duplicate alerts appear.
## Events and recovery
----
| Notification subtype | Start event | End event | Flashduty severity |
| :--- | :--- | :--- | :--- |
@@ -80,7 +78,6 @@ Imperva's webhook payload has a fixed format and cannot be templated. Imperva ma
- Other notification types (account, site, billing, subscription, policy changes, range status changes) create no alert; Flashduty acknowledges them and returns success
## Alert Key
----
The Alert Key is computed from the event family, the Imperva account ID, and the object identity. Start and end events read the same fields:
@@ -95,7 +92,6 @@ The Alert Key is computed from the event family, the Imperva account ID, and the
The title, event time, account name in the payload, and the webhook ID do not take part. A request without `event_type`, or without the object identity of its family, is rejected with an error that names the missing field.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -111,7 +107,6 @@ The title, event time, account name in the payload, and the webhook ID do not ta
The alert title comes from `event_title` and the description from `event_details.event_body`.
## Troubleshooting
----
- **Test Webhook fails**: Imperva requires the receiver to answer 200 or 201. Check that the push URL is complete, the `integration_key` is valid, and the integration type is Imperva
- **No alerts arrive**: check that the notification policy's Recipients use this Webhook Connection and that the event type is in the table above. Event types outside the table create no alert
diff --git a/en/on-call/integration/alert-integration/alert-sources/infisical.mdx b/en/on-call/integration/alert-integration/alert-sources/infisical.mdx
index b30ca3ee..9b760931 100644
--- a/en/on-call/integration/alert-integration/alert-sources/infisical.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/infisical.mdx
@@ -1,5 +1,6 @@
---
title: "Infisical alert integration"
+sidebarTitle: "Infisical"
description: "Send Infisical secret rotation failures and honey token triggers to Flashduty On-call through a project webhook."
keywords: ["alert integration", "Infisical", "secrets management", "secret rotation", "honey token", "webhook"]
---
@@ -11,7 +12,6 @@ Secret modifications (`secrets.modified`), change requests, and access requests
## In Flashduty On-call
----
You can get the integration Push URL in either of the following two ways.
@@ -32,7 +32,6 @@ You can get the integration Push URL in either of the following two ways.
## Configure Infisical
----
@@ -61,7 +60,6 @@ In the channel that receives these alerts, turn on [auto-close timeout](/en/on-c
## Alert Key
----
The Infisical request body has no alert ID, so Flashduty uses the monitored object itself as the Alert Key:
@@ -71,7 +69,6 @@ The Infisical request body has no alert ID, so Flashduty uses the monitored obje
Repeated failures of one rotation (including manual runs and retries), or one honey token triggered several times from different IPs, merge into the same alert. A change in the error message, project name, source IP, or timestamp does not change the Alert Key. A request missing `project.projectId`, `project.environment`, `project.rotationName`, or `honeyToken.name` is rejected.
## Status and severity
----
| Infisical event | Flashduty severity | Notes |
| :--- | :--- | :--- |
@@ -83,7 +80,6 @@ Repeated failures of one rotation (including manual runs and retries), or one ho
Neither alert has a recovery event.
## Troubleshooting
----
- **Infisical reports a failed webhook**: check that the Push URL is complete and includes `integration_key`, and that the webhook **Type** is **General** (the Slack and Microsoft Teams types send their own message formats)
- **No alert after a rotation failure**: check that the webhook's **Environment** matches the rotation's environment, that **Secret Path** matches the rotation's folder (for example `/**`), and that **Secret Rotation Failed** is selected
diff --git a/en/on-call/integration/alert-integration/alert-sources/influxdata.mdx b/en/on-call/integration/alert-integration/alert-sources/influxdata.mdx
index 775914c9..9daf95f76 100644
--- a/en/on-call/integration/alert-integration/alert-sources/influxdata.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/influxdata.mdx
@@ -1,5 +1,6 @@
---
title: "InfluxData Alert Integration"
+sidebarTitle: "InfluxData"
description: "Integrate InfluxData alerts with Flashduty On-call through a webhook for automated routing, deduplication, and noise reduction."
keywords: ["alert integration", "InfluxData", "webhook", "alert routing", "noise reduction"]
---
@@ -9,48 +10,48 @@ Sync Influxdata alert events to Flashduty via webhook to achieve automated alert
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this simpler option when you don't need to route alert events to different channels.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Influxdata** integration, click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert event payload.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Influxdata** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In Influxdata
----
Supports Influxdata versions 1.x ~ 2.x, with different configurations for each version as detailed below.
- [Version 2.x](#v2)
- [Version 1.x](#v1)
-## I. Influxdata Configuration
+## Influxdata Configuration
@@ -69,7 +70,7 @@ Supports Influxdata versions 1.x ~ 2.x, with different configurations for each v
3. Configure `About` and `Conditions` as needed.
4. Select `Flashduty` created in Step 1 for `Message`.
-
+
5. Done.
@@ -82,7 +83,7 @@ Supports Influxdata versions 1.x ~ 2.x, with different configurations for each v
2. Click on the alert rule you want to synchronize events for, enter the `Alert Rule Builder` page to start editing the rule
3. In the `Alert Handlers` section, select `Add Another Handler`, choose `post` type, and enter the integration push URL in `HTTP endpoint` as shown below:
-
+
4. Click the `Save Rule` button to save. Wait for event triggering. If the latest event time is displayed in the integration list, the configuration is successful and events are being received
5. Done
@@ -93,7 +94,7 @@ Supports Influxdata versions 1.x ~ 2.x, with different configurations for each v
The `post` handler in Chronograf is Kapacitor's `post` event handler. When using Kapacitor directly, add `.post('')` to the `alert()` node of the TICKscript, or use a topic handler (`kind: post`, with the push URL in `options.url`). For the full steps, see [Kapacitor Alert Integration](/en/on-call/integration/alert-integration/alert-sources/kapacitor).
-## II. Status Mapping
+## Status Mapping
diff --git a/en/on-call/integration/alert-integration/alert-sources/insightidr.mdx b/en/on-call/integration/alert-integration/alert-sources/insightidr.mdx
index 78b5f0cd..bb6bb0da 100644
--- a/en/on-call/integration/alert-integration/alert-sources/insightidr.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/insightidr.mdx
@@ -1,5 +1,6 @@
---
title: "Rapid7 InsightIDR alert integration"
+sidebarTitle: "Rapid7 InsightIDR"
description: "Send investigations generated by Rapid7 InsightIDR to Flashduty On-call through a Universal Webhook data exporter."
keywords: ["alert integration", "Rapid7", "InsightIDR", "Universal Webhook", "SIEM", "security investigation"]
---
@@ -11,7 +12,6 @@ InsightIDR only sends "investigation created". It does not send updates or closu
## In Flashduty On-call
----
You can get the push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can get the push URL in either of the following ways.
## In Rapid7 InsightIDR
----
@@ -57,7 +56,6 @@ After that, every investigation InsightIDR generates is pushed as one alert.
## Event types
----
| `X-Rapid7-Event` | Effect in Flashduty |
| :--- | :--- |
@@ -66,17 +64,14 @@ After that, every investigation InsightIDR generates is pushed as one alert.
| Any other value | The request is rejected with a parameter error |
## Alert Key
----
Flashduty uses `investigationId`, the fixed ID InsightIDR assigns to each investigation, as the Alert Key. Changes to the title, description, or time do not change it. A request without `investigationId` is rejected.
## Status and severity
----
The InsightIDR payload carries no severity, so every investigation is treated as Warning. To separate levels, adjust them in the integration's **Alert processing** by title or label.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -89,12 +84,10 @@ The InsightIDR payload carries no severity, so every investigation is treated as
User emails and AD distinguished names (`distinguishedName`) are not written to labels.
## About signatures
----
InsightIDR signs the request body with the Secret (`X-Rapid7-Signature`). Flashduty does not verify it, so the `integration_key` in the push URL is the only credential; keep it private. You can also add custom headers on the exporter; Flashduty does not require them.
## Troubleshooting
----
- **Flashduty receives nothing**: the collector is hosted by you. Confirm it can reach the internet and that the URL is complete and includes `integration_key`
- **Parameter error**: a missing `investigationId` means the request is not an investigation; an unsupported event means `X-Rapid7-Event` is neither `idr_investigation_created` nor `test`
diff --git a/en/on-call/integration/alert-integration/alert-sources/instana.mdx b/en/on-call/integration/alert-integration/alert-sources/instana.mdx
index 8621dba7..66d6526c 100644
--- a/en/on-call/integration/alert-integration/alert-sources/instana.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/instana.mdx
@@ -1,5 +1,6 @@
---
title: "IBM Instana alert integration"
+sidebarTitle: "IBM Instana"
description: "Send IBM Instana issues, incidents, and changes to Flashduty On-call through a Generic webhook alert channel."
keywords: ["alert integration", "Instana", "IBM Instana", "webhook", "Generic webhook", "alert channel"]
---
@@ -9,7 +10,6 @@ Use an IBM Instana Generic webhook alert channel to send Instana issues, inciden
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Instana
----
You need permission to configure alert channels and alerts in Instana. First create an alert channel that points to Flashduty, then select that channel in your alert configurations.
@@ -52,15 +51,15 @@ You need permission to configure alert channels and alerts in Instana. First cre
1. Click **Settings** → **Alerts** → **New alert** and enter an alert name
2. In the **Events** drop-down, select **Alert on event type(s)**, then turn on the event types to send:
-| Instana event type | What is sent | Effect in Flashduty |
-| :--- | :--- | :--- |
-| Incidents | `type` is `incident`, with state `OPEN` / `CLOSED` | Triggers when opened, recovers when closed |
-| Critical issues / Warning issues | `type` is `issue`, with state `OPEN` / `CLOSED` | Triggers when opened, recovers when closed |
-| Monitoring issues | `type` is `monitoringIssue`, with state `OPEN` / `CLOSED` | Triggers when opened, recovers when closed |
-| Changes | `type` is `change`, no state | Each delivery creates an Info alert that does not recover automatically |
-| Online / Offline | `type` is `presence`, no state | Each delivery creates an Info alert that does not recover automatically |
+ | Instana event type | What is sent | Effect in Flashduty |
+ | :--- | :--- | :--- |
+ | Incidents | `type` is `incident`, with state `OPEN` / `CLOSED` | Triggers when opened, recovers when closed |
+ | Critical issues / Warning issues | `type` is `issue`, with state `OPEN` / `CLOSED` | Triggers when opened, recovers when closed |
+ | Monitoring issues | `type` is `monitoringIssue`, with state `OPEN` / `CLOSED` | Triggers when opened, recovers when closed |
+ | Changes | `type` is `change`, no state | Each delivery creates an Info alert that does not recover automatically |
+ | Online / Offline | `type` is `presence`, no state | Each delivery creates an Info alert that does not recover automatically |
-Changes and online/offline events are frequent and do not recover automatically. In most cases, turning on **Incidents**, **Critical issues**, and **Warning issues** is enough.
+ Changes and online/offline events are frequent and do not recover automatically. In most cases, turning on **Incidents**, **Critical issues**, and **Warning issues** is enough.
3. Under **Scope**, choose the required **Apply on** range: an application perspective, a Dynamic Focus query (Selected entities only), or All available entities
4. Under **Alerting**, click **Add alert channels** and select the channel you created in the previous step
@@ -75,11 +74,11 @@ Smart Alerts for applications, websites, and synthetic tests select their alert
1. Trigger an Instana issue and confirm that Flashduty receives an active alert. On a host running the Instana agent, you can send a critical event with a duration through the agent's Event SDK:
-```bash
-curl -X POST http://localhost:42699/com.instana.plugin.generic.event \
- -H 'Content-Type: application/json' \
- -d '{"title":"Flashduty test","text":"Flashduty test","severity":10,"duration":300000}'
-```
+ ```bash
+ curl -X POST http://localhost:42699/com.instana.plugin.generic.event \
+ -H 'Content-Type: application/json' \
+ -d '{"title":"Flashduty test","text":"Flashduty test","severity":10,"duration":300000}'
+ ```
2. Wait for the issue to close in Instana (after 5 minutes in this example) and confirm that the alert recovers
@@ -89,14 +88,12 @@ An issue raised right after you save the alert configuration may not be delivere
## Alert Key
----
Flashduty uses the Instana issue ID (`issue.id`) as the Alert Key. An issue or incident carries the same `issue.id` when it opens and when it closes, so the close notification recovers the alert created when it opened.
Changes to the issue title, severity, start time, or tags do not change the Alert Key. Requests without `issue.id` are rejected.
## Status and severity
----
Flashduty sets the alert severity from the issue's severity (`issue.severity`):
@@ -117,7 +114,6 @@ Flashduty sets the alert severity from the issue's severity (`issue.severity`):
Any other state value is rejected with a parameter error.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -138,7 +134,6 @@ Any other state value is rejected with a parameter error.
Instana fills fields that do not apply with `not available`. Those fields do not become labels.
## Troubleshooting
----
- **Test channel reports that the domain is not allowed**: Instana SaaS may restrict the domains alert channels can send to. Contact IBM Instana support to allow the domain of the Flashduty push URL
- **Flashduty returns a parameter error**: Make sure the URL is complete and includes `integration_key`
diff --git a/en/on-call/integration/alert-integration/alert-sources/instatus.mdx b/en/on-call/integration/alert-integration/alert-sources/instatus.mdx
index 85a5ac4f..3f47f6e2 100644
--- a/en/on-call/integration/alert-integration/alert-sources/instatus.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/instatus.mdx
@@ -1,5 +1,6 @@
---
title: "Instatus alert integration"
+sidebarTitle: "Instatus"
description: "Subscribe to an Instatus status page by webhook and send Instatus incidents and component outages to Flashduty On-call."
keywords: ["alert integration", "Instatus", "status page", "third-party service status", "webhook"]
---
@@ -9,7 +10,6 @@ Use an Instatus webhook subscriber to send changes on a status page to Flashduty
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Add a webhook subscriber in Instatus
----
@@ -67,7 +66,6 @@ If you publish an incident or update without notifying subscribers, Instatus sen
## Payload
----
Instatus sends one JSON payload each time an incident is added or updated, a component changes status, or a maintenance is added or updated. Flashduty handles the first two:
@@ -98,7 +96,6 @@ Instatus sends one JSON payload each time an incident is added or updated, a com
Component alert titles look like `Website: major outage`. Every alert also carries the label `source=instatus`, plus `page_url` and `page_status`. The unsubscribe link in the payload (`meta.unsubscribe`) contains a subscription credential, so Flashduty does not write it to the alert.
## Alert Key
----
Flashduty builds the Alert Key per payload kind:
@@ -110,7 +107,6 @@ Incident alerts and component alerts are independent. One outage usually produce
Renaming an incident or component, or changing the impact, does not change the Alert Key. When the severity rises (for example a component going from `PARTIALOUTAGE` to `MAJOROUTAGE`), Flashduty opens a new alert at the higher severity and keeps the earlier alert open; the recovery delivery closes both. After an alert recovers, a new outage of the same component opens a new alert.
## Status and severity
----
**Component status**
@@ -144,7 +140,6 @@ An incident with no affected component falls back to the same mapping applied to
Scheduled maintenance (`maintenance` payloads with the status `NOTSTARTEDYET`, `INPROGRESS`, or `COMPLETED`) is planned change. Flashduty returns success and creates no alert.
## FAQ
----
@@ -173,7 +168,6 @@ In Instatus, open the subscriber under **Subscribers → Webhook** and click **U
## Troubleshooting
----
- **No alerts in Flashduty**: check that subscribers were notified when the incident or update was published. Scheduled maintenance and `UNDERMAINTENANCE` never create alerts
- **Flashduty returns an invalid parameter error**: check that the push URL is complete (includes `integration_key`) and that the subscriber uses the default payload format. Payloads without `page.id`, an incident ID, or a component ID are rejected
diff --git a/en/on-call/integration/alert-integration/alert-sources/intersight.mdx b/en/on-call/integration/alert-integration/alert-sources/intersight.mdx
index 3f4b41f2..9834b5e9 100644
--- a/en/on-call/integration/alert-integration/alert-sources/intersight.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/intersight.mdx
@@ -1,5 +1,6 @@
---
title: "Cisco Intersight alert integration"
+sidebarTitle: "Cisco Intersight"
description: "Send alarms from Cisco Intersight servers, storage, and hyperconverged systems to Flashduty On-call through a webhook subscription."
keywords: ["alert integration", "Cisco Intersight", "Intersight", "webhook", "UCS", "HyperFlex", "infrastructure"]
---
@@ -9,7 +10,6 @@ Cisco Intersight is Cisco's cloud platform for managing UCS, HyperFlex, and othe
## In Flashduty On-call
----
You can get the push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the push URL in either of the following ways.
## In Cisco Intersight
----
@@ -58,7 +57,6 @@ Subscribe only to `cond.Alarm`. Flashduty rejects pushes for other object types,
## Event types
----
| Push | Effect in Flashduty |
| :--- | :--- |
@@ -67,12 +65,10 @@ Subscribe only to `cond.Alarm`. Flashduty rejects pushes for other object types,
| Request without an alarm (`Operation` `None`, `Event` null) | Creates a separate Info alert that never recovers |
## Alert Key
----
Flashduty uses the alarm's `Moid`, the fixed identifier Intersight assigns to each alarm, as the Alert Key. Creation, updates, and the clear of one alarm share the same Alert Key. Changes to the name, description, severity, or time do not change it, and a request without a `Moid` is rejected.
## Status and severity
----
| Intersight `Severity` | Flashduty severity |
| :--- | :--- |
@@ -82,7 +78,6 @@ Flashduty uses the alarm's `Moid`, the fixed identifier Intersight assigns to ea
| Cleared | Recovery (severity from `OrigSeverity`, Info if it has no valid value) |
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -96,12 +91,10 @@ Flashduty uses the alarm's `Moid`, the fixed identifier Intersight assigns to ea
| `create_time` / `last_transition` | Alarm creation time and time of the last severity change |
## About signatures
----
Intersight signs requests with HMAC using the Secret you set (`Authorization` and `Digest` headers). Flashduty does not verify signatures, so the `integration_key` in the push URL is the only credential. Keep it private.
## Troubleshooting
----
- **Flashduty receives nothing**: confirm the webhook URL is complete and includes `integration_key`, and that Intersight can reach the public internet
- **Parameter error returned**: an object type error means the subscription covers an object other than `cond.Alarm`; a missing `Moid` means the push is not an alarm object
diff --git a/en/on-call/integration/alert-integration/alert-sources/jdcloud.mdx b/en/on-call/integration/alert-integration/alert-sources/jdcloud.mdx
index 957dedd4..27d230f3 100644
--- a/en/on-call/integration/alert-integration/alert-sources/jdcloud.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/jdcloud.mdx
@@ -1,5 +1,6 @@
---
title: "JD Cloud monitoring integration"
+sidebarTitle: "JD Cloud monitoring"
description: "Sync JD Cloud monitoring alert events to Flashduty On-call via webhook for automated alert noise reduction"
keywords: ["alert integration", "JD Cloud monitoring integration", "monitoring alerts", "data ingestion"]
---
@@ -7,7 +8,6 @@ keywords: ["alert integration", "JD Cloud monitoring integration", "monitoring a
## In Flashduty On-call
----
You can obtain an integration push URL through either of these two methods:
### Using private integration
@@ -15,7 +15,7 @@ You can obtain an integration push URL through either of these two methods:
Choose this method when you don't need to route alert events to different channels — it's simpler.
-
+
1. Go to the Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
@@ -30,9 +30,9 @@ Choose this method when you don't need to route alert events to different channe
Choose this method when you need to route alerts to different channels based on the alert event payload.
-
+
- 1. Go to the Flashduty console, select **Integration Center => Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **JD Cloud Monitoring** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after creation, go to `Route` to configure more routing rules)
@@ -43,7 +43,6 @@ Choose this method when you need to route alerts to different channels based on
## In JD Cloud
----
@@ -53,29 +52,29 @@ Choose this method when you need to route alerts to different channels based on
3. Check **Alert Callback** and enter the integration push URL in the `URL` field
4. Enter the following template content in the `POST` input box:
-```json
-{
- "resource_id": "${resourceId}",
- "request_id": "${requestId}",
- "metric": "${metric}",
- "current_value": "${currentValue}",
- "times": "${times}",
- "tags": "${tags}",
- "alert_time": "${alertTime}",
- "region": "${region}",
- "threshold": "${threshold}",
- "service_code": "${serviceCode}",
- "as_group_id": "${asGroupId}",
- "unhealthy_instance": "${unhealthyInstance}",
- "rule_policy_id": "${rulePolicyId}",
- "service_code_en": "${serviceCodeEN}",
- "service_code_cn": "${serviceCodeCN}",
- "level": "${level}",
- "resource_name": "${resourceName}",
- "ip_address": "${ipAddress}",
- "status": "${status}"
-}
-```
+ ```json
+ {
+ "resource_id": "${resourceId}",
+ "request_id": "${requestId}",
+ "metric": "${metric}",
+ "current_value": "${currentValue}",
+ "times": "${times}",
+ "tags": "${tags}",
+ "alert_time": "${alertTime}",
+ "region": "${region}",
+ "threshold": "${threshold}",
+ "service_code": "${serviceCode}",
+ "as_group_id": "${asGroupId}",
+ "unhealthy_instance": "${unhealthyInstance}",
+ "rule_policy_id": "${rulePolicyId}",
+ "service_code_en": "${serviceCodeEN}",
+ "service_code_cn": "${serviceCodeCN}",
+ "level": "${level}",
+ "resource_name": "${resourceName}",
+ "ip_address": "${ipAddress}",
+ "status": "${status}"
+ }
+ ```
5. Configure other options as needed and click **Save**
@@ -97,7 +96,6 @@ Go back to the Flashduty console integration list page. If the latest event time
## Severity mapping
----
JD Cloud Monitoring to Flashduty severity mapping:
diff --git a/en/on-call/integration/alert-integration/alert-sources/jfrog-xray.mdx b/en/on-call/integration/alert-integration/alert-sources/jfrog-xray.mdx
index aff34b0c..c75d1651 100644
--- a/en/on-call/integration/alert-integration/alert-sources/jfrog-xray.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/jfrog-xray.mdx
@@ -1,5 +1,6 @@
---
title: "JFrog Xray alert integration"
+sidebarTitle: "JFrog Xray"
description: "Send the security, license and operational risk violations found by JFrog Xray watches to Flashduty On-call through an Xray webhook."
keywords: ["alert integration", "JFrog", "Xray", "webhook", "vulnerability", "license", "policy violation", "software supply chain"]
---
@@ -11,7 +12,6 @@ Xray sends a webhook only when a scan finds violations and sends nothing when an
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can get the integration push URL in either of the following ways.
## Configure JFrog Xray
----
@@ -67,14 +66,12 @@ The Xray webhook page has no test button. Upload a component with a known vulner
## Recovery and auto-close
----
The Xray violation webhook is sent only when a scan finds violations. The request body has no field that marks a violation as fixed or ignored, so the alert in Flashduty does not recover on its own.
Each delivery is a separate Flashduty alert. Close it by hand, or turn on [auto-close](/en/on-call/channel/create-edit) in the channel that receives this integration, set to how quickly your team handles vulnerabilities, for example 7 days.
## Alert Key
----
Xray creates an `alert_id` for each scan of a watch. When one scan matches several policy rules (for example a security policy and a license policy on the same watch), Xray sends one webhook per rule, all with the same `alert_id`. So Flashduty builds the Alert Key from `alert_id`, the watch name `watch_name`, the policy name `policy_name` and the rule name `policy_rule` (joined with an invisible separator, then MD5):
@@ -84,7 +81,6 @@ Xray creates an `alert_id` for each scan of a watch. When one scan matches sever
- If the body has no `watch_name`, Flashduty returns 400 and names the missing field
## Status and severity
----
The alert status equals its severity; it does not recover. The severity comes from the highest severity in the body, `top_severity`; if it is missing or not one of the values below, the most severe issue decides.
@@ -95,7 +91,6 @@ The alert status equals its severity; it does not recover. The severity comes fr
| `Low`, `Information`, `Unknown`, missing or any other value | Info |
## Alert content
----
One webhook holds every issue (`issues`) that the scan found under that rule.
@@ -114,7 +109,6 @@ One webhook holds every issue (`issues`) that the scan found under that rule.
| `artifacts` | Impacted components, most severe first, up to 20 |
## Troubleshooting
----
- **Flashduty receives nothing**: check that the policy rule's **Then** section has **Trigger webhook** selected with this webhook, that the policy is assigned to a watch, and that the watch is active. Xray sends a webhook only for newly found violations; saving a rule does not resend violations that already exist. **Apply on Existing Content** in the row actions of the watch does not resend them either. Upload a new vulnerable component to a watched repository to verify
- **Flashduty returns a parameter error**: the body is not JSON, or it has no `watch_name`. Send the Xray violation webhook directly, not through a relay that rewrites the body
diff --git a/en/on-call/integration/alert-integration/alert-sources/jiankongbao.mdx b/en/on-call/integration/alert-integration/alert-sources/jiankongbao.mdx
index f44e6716..67851dc8 100644
--- a/en/on-call/integration/alert-integration/alert-sources/jiankongbao.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/jiankongbao.mdx
@@ -1,5 +1,6 @@
---
title: "Jiankongbao Alert Events"
+sidebarTitle: "Jiankongbao"
description: "Sync Jiankongbao alert events to Flashduty via webhook for automated alert noise reduction"
---
@@ -8,64 +9,64 @@ Sync Jiankongbao alert events to Flashduty via webhook for automated alert noise
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this simpler option when you don't need to route alert events to different channels.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a specific channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Jiankongbao** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're Done
-
+
+
### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Jiankongbao** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In Jiankongbao
----
This integration also covers Cloudwise Jiankongbao (including Jiankongbao 6) URL callback notifications.
-## I. Jiankongbao Alert Push Configuration
+## Jiankongbao Alert Push Configuration
### Step 1: Configure Alert Channel
1. Log in to the Jiankongbao console
2. Click Personal Configuration in the upper right corner
-
+
3. Click Webhooks Settings in the left navigation bar, then click Add and select URL Callback
-
+
4. Enter Flashduty as the custom name, and input the copied integration push URL
5. Select **POST** as the callback method and **JSON** as the data format
6. Check **Enable URL Callback**, configure other options as needed, refer to the image below
-
+
7. Click Save
@@ -74,12 +75,12 @@ This integration also covers Cloudwise Jiankongbao (including Jiankongbao 6) URL
2. Other alert configurations are omitted here
3. Under Webhook notification, select the Flashduty channel
-
+
4. Save the monitoring task to complete
-## II. Status Mapping
+## Status Mapping
diff --git a/en/on-call/integration/alert-integration/alert-sources/jumpcloud.mdx b/en/on-call/integration/alert-integration/alert-sources/jumpcloud.mdx
index 7f7b26b8..69a44243 100644
--- a/en/on-call/integration/alert-integration/alert-sources/jumpcloud.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/jumpcloud.mdx
@@ -1,5 +1,6 @@
---
title: "JumpCloud Alert Integration"
+sidebarTitle: "JumpCloud"
description: "Send JumpCloud Insights alerts to Flashduty On-call through a webhook notification channel."
keywords: ["alert integration", "JumpCloud", "webhook", "Insights", "identity security", "MDM"]
---
@@ -9,7 +10,6 @@ Send alerts raised by JumpCloud Insights rules to Flashduty On-call through a Ju
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure JumpCloud
----
@@ -62,14 +61,12 @@ The channel page's **Test Webhook** button only shows a simulated request and re
## Alert Key
----
Flashduty builds the Alert Key from `alert_id`, the ID of the JumpCloud alert. JumpCloud sends the same `alert_id` on every status change of one alert (Open, Acknowledged, Resolved, Auto-Resolved), so the trigger and the recovery land on the same Flashduty alert. Changes to the title, priority, description or update time do not change the Alert Key. A request without `alert_id` is rejected.
JumpCloud documents that a new event after the threshold is reached updates the existing alert; those updates all fold into the same Flashduty alert.
## Status and severity
----
| JumpCloud `status` | Flashduty status |
| :--- | :--- |
@@ -86,7 +83,6 @@ JumpCloud documents that a new event after the threshold is reached updates the
A recovery keeps the severity of the last payload.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -103,7 +99,6 @@ A recovery keeps the severity of the last payload.
The alert title comes from `alert_title` and the description from `description`.
## Troubleshooting
----
- **Flashduty returns an invalid-parameter error**: check that the URL is complete and includes `integration_key`, and that the request body is JSON
- **An alert does not recover**: check that Alert Resolution is on in the rule and that the channel is enabled
diff --git a/en/on-call/integration/alert-integration/alert-sources/juniper-mist.mdx b/en/on-call/integration/alert-integration/alert-sources/juniper-mist.mdx
index 31095edb..0c78ebf2 100644
--- a/en/on-call/integration/alert-integration/alert-sources/juniper-mist.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/juniper-mist.mdx
@@ -1,5 +1,6 @@
---
title: "Juniper Mist alert integration"
+sidebarTitle: "Juniper Mist"
description: "Send Juniper Mist alarm triggers and recoveries to Flashduty On-call through a webhook."
keywords: ["alert integration", "Juniper Mist", "Mist", "Marvis", "wireless network", "webhook", "alarms"]
---
@@ -9,7 +10,6 @@ Use webhooks in Juniper Mist to send alarms from the `alarms` topic to Flashduty
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Juniper Mist
----
@@ -76,7 +75,6 @@ The webhook only sends alarm types that are enabled. Enable the types you need i
## Alert Key
----
One delivery can carry several alarm events (the `events` array). Flashduty handles each event on its own.
@@ -93,7 +91,6 @@ The paired types are: AP, switch, and WAN Edge offline and reconnect (`device_do
Several critical-port alarms on the same switch or gateway share one Alert Key, and so do the two nodes of an HA cluster.
## Status and severity
----
| Event | Status |
| :--- | :--- |
@@ -115,7 +112,6 @@ Severity comes from `severity`:
A recovery event keeps its own severity.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -132,7 +128,6 @@ A recovery event keeps its own severity.
The alert title is `type: device or hostname`, for example `device down: d420b02000fa`. The description comes from `reasons`, `text`, `suggestion`, and `count`.
## Troubleshooting
----
- **Flashduty returns an invalid-parameter error**: confirm the URL is complete and includes `integration_key`, and that the body is a Mist `alarms` topic payload
- **An alert does not recover**: confirm the matching recovery type is enabled in Mist too (for example, if AP offline is enabled, also enable AP reconnected). Check each type's default enablement in `alarm_defs`
diff --git a/en/on-call/integration/alert-integration/alert-sources/kapacitor.mdx b/en/on-call/integration/alert-integration/alert-sources/kapacitor.mdx
index 22218d09..1cd8a8d1 100644
--- a/en/on-call/integration/alert-integration/alert-sources/kapacitor.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/kapacitor.mdx
@@ -1,5 +1,6 @@
---
title: "Kapacitor Alert Integration"
+sidebarTitle: "Kapacitor"
description: "Receive Kapacitor alerts through Kapacitor's post event handler using a Flashduty InfluxData integration; alerts close automatically when they recover."
keywords: ["alert integration", "Kapacitor", "InfluxData", "TICKscript", "post event handler", "time series alerting"]
---
@@ -9,7 +10,6 @@ Kapacitor's [post event handler](https://docs.influxdata.com/kapacitor/v1/refere
## In Flashduty On-call
----
Get an integration push URL in either of the two ways below. **Choose the InfluxData integration type** in both.
@@ -30,7 +30,6 @@ Get an integration push URL in either of the two ways below. **Choose the Influx
## Configure in Kapacitor
----
Use any one of the three ways below. Always enter the full push URL, including `?integration_key=...`.
@@ -90,7 +89,6 @@ Then run `kapacitor define-topic-handler flashduty.yaml` and use `.topic('cpu-al
Adding a `post` handler in the Chronograf 1.x Alert Rule Builder uses this same Kapacitor handler; see the [InfluxData integration](/en/on-call/integration/alert-integration/alert-sources/influxdata) for those steps.
## Field mapping
----
| Kapacitor field | Flashduty |
| :--- | :--- |
@@ -105,14 +103,12 @@ Adding a `post` handler in the Chronograf 1.x Alert Rule Builder uses this same
For any other `level`, Flashduty rejects the event with `level ... is not supported`.
## Recovery and deduplication
----
- When the level returns to `OK`, Kapacitor sends an event with `level` `OK`, and Flashduty closes the alert with the same `id`. Do not use `.noRecoveries()` on `alert()`, or Kapacitor sends no recovery events.
- The default `id` is `{{ .Name }}:{{ .Group }}` (measurement name and group). If you set a custom `.id()`, make sure the trigger and the recovery of one object use the same value.
- To see Flashduty's error in the Kapacitor log, add `.captureResponse()` to `.post()` (`capture-response: true` for a topic handler); the response is logged when the status is not 2xx.
## Troubleshooting
----
- **Flashduty returns `Invalid parameters`**: the push URL is incomplete, `integration_key` is missing, or the integration type is not InfluxData
- **`level ... is not supported`**: the `level` in the body is not `CRITICAL`, `WARNING`, `INFO` or `OK`; make sure the original Kapacitor alert data is sent, not a forwarded or rewritten body
diff --git a/en/on-call/integration/alert-integration/alert-sources/keep.mdx b/en/on-call/integration/alert-integration/alert-sources/keep.mdx
index 4afc7abe..69330458 100644
--- a/en/on-call/integration/alert-integration/alert-sources/keep.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/keep.mdx
@@ -1,5 +1,6 @@
---
title: "Keep Alert Integration Guide"
+sidebarTitle: "Keep"
description: "Push alert events to Flashduty through Keep's Provider to achieve automated alert noise reduction."
---
@@ -11,40 +12,41 @@ Push alert events to Flashduty through Keep's Flashduty Provider to achieve auto
You can obtain an integration key through either of these 2 methods:
-#### Using Dedicated Integration
+### Using Dedicated Integration
Choose this method when you don't need to route alert events to different channels - it's simpler.
-
- Expand
+
+
1. Enter the Flashduty console, select **Channel**, and go to a specific channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Keep** integration, click **Save** to generate a card
4. Click the generated card to view the **Integration Key**, copy it for later use, and you're done
-
+
+
-#### Using Shared Integration
+### Using Shared Integration
Choose this method when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Enter the Flashduty console, select **Integration Center=>Alert Events** to access the integration selection page
+ 1. Enter the Flashduty console, select **Integration Center → Alert Events** to access the integration selection page
2. Select **Keep** integration:
- **Integration Name**: Define a name for this integration
3. Configure default routing and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **Integration Key** for later use
5. Done
-
+
+
## In Keep
----
### Field Definitions
@@ -54,7 +56,7 @@ Field|Required|Type|Definition
| event_status | Yes | string | Alert status. Enumerated values (`First letter capitalized`): *Critical*: Critical, *Warning*: Warning, *Info*: Info, *Ok*: Recovery. When set to Ok, it indicates automatic recovery of the alert
| alert_key | No | string | Alert identifier, used for updating or automatically recovering existing alerts. You can customize this value, but it cannot exceed `255` characters. You can also rely on system-generated values, which will be returned in the response. This value must exist if you're reporting a recovery event
| description | No | string | Alert description, maximum `2048` characters, will be truncated if exceeded
-| labels | No | map | Alert label collection, where key is the label name and value is the label value. 1. Both label key and value are case-sensitive strings. 2. Label keys should not exceed `128` characters and follow Prometheus label naming conventions. Values should not exceed `8192` bytes (8 KB) and are truncated if exceeded; the cut backs off to a UTF-8 character boundary. 3. Maximum `50` labels allowed. See [Standard Alert Best Practices](/en/on-call/integration/alert-integration/alert-sources/standard-alert#iv-best-practices). Example: "resource": "171.26.23.22", "check": "api latency > 500ms"
+| labels | No | map | Alert label collection, where key is the label name and value is the label value. 1. Both label key and value are case-sensitive strings. 2. Label keys should not exceed `128` characters and follow Prometheus label naming conventions. Values should not exceed `8192` bytes (8 KB) and are truncated if exceeded; the cut backs off to a UTF-8 character boundary. 3. Maximum `50` labels allowed. See [Standard Alert Best Practices](/en/on-call/integration/alert-integration/alert-sources/standard-alert#best-practices). Example: "resource": "171.26.23.22", "check": "api latency > 500ms"
diff --git a/en/on-call/integration/alert-integration/alert-sources/kener.mdx b/en/on-call/integration/alert-integration/alert-sources/kener.mdx
index e93294d9..9d529e19 100644
--- a/en/on-call/integration/alert-integration/alert-sources/kener.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/kener.mdx
@@ -1,5 +1,6 @@
---
title: "Kener alert integration"
+sidebarTitle: "Kener"
description: "Send Kener monitor alerts for downtime, latency, and uptime to Flashduty On-call through a webhook trigger."
keywords: ["alert integration", "Kener", "webhook", "status page", "monitoring", "self-hosted"]
---
@@ -11,7 +12,6 @@ Kener's webhook body is a template you write in the trigger. This page provides
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Kener
----
You need Kener 4.x and an account that can manage triggers and alert configurations in the admin console. The Kener server must be able to reach the Flashduty push URL.
@@ -44,22 +43,22 @@ You need Kener 4.x and an account that can manage triggers and alert configurati
3. Leave **Headers** empty. Flashduty authenticates with the `integration_key` in the URL
4. Replace **Webhook Body** with the following template:
-```json
-{
- "alert_id": {{alert_id}},
- "alert_name": "{{alert_name}}",
- "alert_for": "{{alert_for}}",
- "alert_value": "{{alert_value}}",
- "alert_status": "{{alert_status}}",
- "alert_severity": "{{alert_severity}}",
- "alert_cta_url": "{{alert_cta_url}}",
- "alert_incident_id": {{#alert_incident_id}}{{alert_incident_id}}{{/alert_incident_id}}{{^alert_incident_id}}null{{/alert_incident_id}},
- "alert_failure_threshold": {{alert_failure_threshold}},
- "alert_success_threshold": {{alert_success_threshold}},
- "is_resolved": {{is_resolved}},
- "is_triggered": {{is_triggered}}
-}
-```
+ ```json
+ {
+ "alert_id": {{alert_id}},
+ "alert_name": "{{alert_name}}",
+ "alert_for": "{{alert_for}}",
+ "alert_value": "{{alert_value}}",
+ "alert_status": "{{alert_status}}",
+ "alert_severity": "{{alert_severity}}",
+ "alert_cta_url": "{{alert_cta_url}}",
+ "alert_incident_id": {{#alert_incident_id}}{{alert_incident_id}}{{/alert_incident_id}}{{^alert_incident_id}}null{{/alert_incident_id}},
+ "alert_failure_threshold": {{alert_failure_threshold}},
+ "alert_success_threshold": {{alert_success_threshold}},
+ "is_resolved": {{is_resolved}},
+ "is_triggered": {{is_triggered}}
+ }
+ ```
5. Save the trigger
@@ -87,14 +86,12 @@ Kener renders the template without JSON escaping. The built-in default template
## Alert Key
----
Flashduty uses the Kener `alert_id` as the Alert Key. Kener creates an alert record when a monitor reaches the failure threshold and updates the same record when it recovers, so the trigger and the recovery carry the same `alert_id`. If the same monitor goes down again, Kener creates a new `alert_id`, which is a new alert in Flashduty.
Changes to the monitor name, severity, status, or value do not change the Alert Key. A request without `alert_id` is rejected. `alert_id` is unique only within one Kener instance, so connect only one Kener instance to each Flashduty integration.
## Status and severity
----
| `alert_status` | Flashduty status |
| :--- | :--- |
@@ -110,7 +107,6 @@ Changes to the monitor name, severity, status, or value do not change the Alert
The alert title combines the monitor identifier, the alert type, and the value, for example `my-api STATUS: DOWN`.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -124,7 +120,6 @@ The alert title combines the monitor identifier, the alert type, and the value,
| `alert_url` | Link to the monitor page in Kener |
## Troubleshooting
----
- **Flashduty returns an invalid-parameter error**: Confirm the URL is complete and includes `integration_key`, and that the trigger uses the template on this page. The response names the missing field
- **The Kener trigger test fails**: The test result shows the HTTP status code or network error. Confirm the Kener server can reach the Flashduty push URL
diff --git a/en/on-call/integration/alert-integration/alert-sources/kentik.mdx b/en/on-call/integration/alert-integration/alert-sources/kentik.mdx
index c6651faa..733a29d5 100644
--- a/en/on-call/integration/alert-integration/alert-sources/kentik.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/kentik.mdx
@@ -1,5 +1,6 @@
---
title: "Kentik alert integration"
+sidebarTitle: "Kentik"
description: "Send Kentik alert policy and Synthetics alerts to Flashduty On-call through a Custom Webhook notification channel, and recover them automatically when the alert clears."
keywords: ["alert integration", "Kentik", "Custom Webhook", "notification channel", "Synthetics"]
---
@@ -9,7 +10,6 @@ Use a Kentik Custom Webhook notification channel to send alerts to Flashduty On-
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Kentik
----
Creating a notification channel requires the Administrator role in Kentik; Members can only view channels.
@@ -41,39 +40,39 @@ Creating a notification channel requires the Administrator role in Kentik; Membe
2. Click **Add Notification Channel** and set **Type** to **Webhook** (listed as Custom Webhook). Do not choose the **JSON** type: Flashduty parses the output of the template below
3. Fill in the fields as follows:
-| Field | Value |
-| :--- | :--- |
-| **Name** | A recognizable name, such as `Flashduty` |
-| **Status** | On |
-| **URL** | The full Flashduty integration push URL, including `integration_key` |
-| **Custom Headers** | Leave empty |
-| **Custom Template** | Click **Go to Notification Template Setup** and paste the template below into **TEMPLATE** on the **Template & Preview** tab, without renaming any field |
-| **Uglify JSON** | Keep the default |
-
-```go-template
-{
- "CompanyID": "{{ .CompanyID }}",
- "Events": [
- {{- range $index, $event := .Events -}}
- {{- join $index }}
- {
- "Type": {{ .Type | toJSON }},
- "AlarmID": "{{ with .Details.GetValue "AlarmID" }}{{ . }}{{ end }}",
- "IsActive": {{ .IsActive | toJSON }},
- "Importance": {{ .Importance | toJSON }},
- "Description": {{ .Description | toJSON }},
- "CurrentState": {{ .CurrentState | toJSON }},
- "PreviousState": {{ .PreviousState | toJSON }},
- "StartTime": {{ .StartTime | toJSON }},
- "EndTime": {{ .EndTime | toJSON }},
- "Details": {{ .Details.General.ToMap | toJSON }},
- "Dimensions": {{ (.Details.WithTag "dimension").ToMap | toJSON }},
- "Links": {{ (.Details.WithTag "url").ToMap | toJSON }}
- }
- {{- end }}
- ]
-}
-```
+ | Field | Value |
+ | :--- | :--- |
+ | **Name** | A recognizable name, such as `Flashduty` |
+ | **Status** | On |
+ | **URL** | The full Flashduty integration push URL, including `integration_key` |
+ | **Custom Headers** | Leave empty |
+ | **Custom Template** | Click **Go to Notification Template Setup** and paste the template below into **TEMPLATE** on the **Template & Preview** tab, without renaming any field |
+ | **Uglify JSON** | Keep the default |
+
+ ```go-template
+ {
+ "CompanyID": "{{ .CompanyID }}",
+ "Events": [
+ {{- range $index, $event := .Events -}}
+ {{- join $index }}
+ {
+ "Type": {{ .Type | toJSON }},
+ "AlarmID": "{{ with .Details.GetValue "AlarmID" }}{{ . }}{{ end }}",
+ "IsActive": {{ .IsActive | toJSON }},
+ "Importance": {{ .Importance | toJSON }},
+ "Description": {{ .Description | toJSON }},
+ "CurrentState": {{ .CurrentState | toJSON }},
+ "PreviousState": {{ .PreviousState | toJSON }},
+ "StartTime": {{ .StartTime | toJSON }},
+ "EndTime": {{ .EndTime | toJSON }},
+ "Details": {{ .Details.General.ToMap | toJSON }},
+ "Dimensions": {{ (.Details.WithTag "dimension").ToMap | toJSON }},
+ "Links": {{ (.Details.WithTag "url").ToMap | toJSON }}
+ }
+ {{- end }}
+ ]
+ }
+ ```
4. Click **Save**
@@ -97,7 +96,6 @@ Do not use this channel for mitigation methods or Insights notifications: these
## Alert Key
----
Flashduty uses the Kentik alert ID (`AlarmID`, shown as **Alert ID** in Kentik) as the Alert Key. Every state-change notification of one Kentik alert, from Active to Cleared, carries the same alert ID, so they merge into one alert, and the clear notification closes it.
@@ -107,7 +105,6 @@ Flashduty uses the Kentik alert ID (`AlarmID`, shown as **Alert ID** in Kentik)
- When one notification carries several events, each event maps to its own alert. A notification with no events is accepted but creates no alert
## Status and severity
----
The status comes from `IsActive`:
@@ -129,7 +126,6 @@ The severity comes from the event importance (`Importance`, 0 to 7). For alert p
| Other or empty | - | Info |
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -145,7 +141,6 @@ The severity comes from the event importance (`Importance`, 0 to 7). For alert p
The alert title is the Kentik event description (`Description`), such as `Alarm for DDoS Protect Policy Active`.
## Troubleshooting
----
- **Flashduty returns a parameter error**: make sure the URL is complete and includes `integration_key`, the channel type is **Custom Webhook**, and the template matches the one above
- **`AlarmID is required`**: the channel is used for mitigation or Insights notifications, or the template was changed. Use the channel only for alert policies and Synthetics tests
diff --git a/en/on-call/integration/alert-integration/alert-sources/komodor.mdx b/en/on-call/integration/alert-integration/alert-sources/komodor.mdx
index e1cf5da1..72b2a278 100644
--- a/en/on-call/integration/alert-integration/alert-sources/komodor.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/komodor.mdx
@@ -1,5 +1,6 @@
---
title: "Komodor alert integration"
+sidebarTitle: "Komodor"
description: "Send Kubernetes workload, node, PVC, and Job issues and their recoveries from Komodor Realtime Health Monitors to Flashduty On-call through a webhook notification."
keywords: ["alert integration", "Komodor", "Kubernetes", "Realtime Health Monitors", "webhook"]
---
@@ -9,7 +10,6 @@ Use the webhook notification channel of Komodor Realtime Health Monitors to send
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -18,7 +18,7 @@ You can obtain an integration push URL in either of the following ways.
Choose this method when you do not need to route alerts to different channels.
-
+
1. In the Flashduty console, select **Channel** and open a channel
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration**
@@ -33,7 +33,7 @@ Choose this method when you do not need to route alerts to different channels.
Choose this method when you need to route alerts to different channels based on the payload.
-
+
1. In the Flashduty console, select **Integration Center → Alert Events**
2. Select **Komodor** and enter an integration name
@@ -46,13 +46,11 @@ Choose this method when you need to route alerts to different channels based on
## Prerequisites
----
- The Komodor Agent is installed in your Kubernetes cluster, and the cluster appears in the Komodor console.
- Your account can edit Komodor **Health Policies**.
## In Komodor
----
@@ -89,7 +87,6 @@ Deploy monitor notifications describe a rollout (successful or failed), not a he
## Alert Key
----
Flashduty builds the Alert Key from the `monitorType`, `cluster`, `namespace`, and `resourceName` fields. For one kind of issue on one resource, the `open` and `closed` messages carry the same four values, so they merge into one alert and the `closed` message recovers it.
@@ -98,7 +95,6 @@ Flashduty builds the Alert Key from the `monitorType`, `cluster`, `namespace`, a
- Node issues have no namespace; an empty `namespace` still produces a valid Alert Key.
## Status and severity
----
Komodor webhook notifications carry no severity field, so Flashduty uses Critical for every issue.
@@ -110,7 +106,6 @@ Komodor webhook notifications carry no severity field, so Flashduty uses Critica
If `status` has any other value, or `monitorType`, `cluster`, or `resourceName` is missing, Flashduty returns an error and Komodor records a failed delivery.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -126,7 +121,6 @@ If `status` has any other value, or `monitorType`, `cluster`, or `resourceName`
The alert title is ` issue on (/)`, and the description contains the issue details and the Komodor link.
## FAQ
----
diff --git a/en/on-call/integration/alert-integration/alert-sources/kscloud-monitor.mdx b/en/on-call/integration/alert-integration/alert-sources/kscloud-monitor.mdx
index 598cfba6..d01fe393 100644
--- a/en/on-call/integration/alert-integration/alert-sources/kscloud-monitor.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/kscloud-monitor.mdx
@@ -1,5 +1,6 @@
---
title: "Kingsoft Cloud monitoring integration"
+sidebarTitle: "Kingsoft Cloud monitoring"
description: "Sync Kingsoft Cloud monitoring alerts to Flashduty On-call via webhook for automated alert noise reduction"
keywords: ["alert integration", "Kingsoft Cloud monitoring", "monitoring alerts", "data ingestion"]
---
@@ -9,7 +10,6 @@ Sync metric and event alerts from Kingsoft Cloud Monitoring to Flashduty On-call
## In Flashduty On-call
----
You can obtain an integration push URL through either of the following methods.
### Use a dedicated integration
@@ -17,7 +17,7 @@ You can obtain an integration push URL through either of the following methods.
Choose this method when you do not need to route alerts to different channels.
-
+
1. In the Flashduty console, select **Channel** and open a channel
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration**
@@ -32,7 +32,7 @@ Choose this method when you do not need to route alerts to different channels.
Choose this method when you need to route alerts to different channels based on the event payload.
-
+
1. In the Flashduty console, select **Integration Center → Alert Events**
2. Select **Kingsoft Cloud Monitoring** and enter an integration name
@@ -44,7 +44,6 @@ Choose this method when you need to route alerts to different channels based on
## In Kingsoft Cloud
----
@@ -64,7 +63,6 @@ Return to the integration list in the Flashduty console. If the integration card
## Status and severity
----
Metric alerts support both firing and recovery notifications. Event alerts only send firing events and do not have corresponding recovery events.
diff --git a/en/on-call/integration/alert-integration/alert-sources/kuvasz.mdx b/en/on-call/integration/alert-integration/alert-sources/kuvasz.mdx
index fac22c76..13eebf81 100644
--- a/en/on-call/integration/alert-integration/alert-sources/kuvasz.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/kuvasz.mdx
@@ -1,5 +1,6 @@
---
title: "Kuvasz alert integration"
+sidebarTitle: "Kuvasz"
description: "Send Kuvasz website, port, DNS, container and SSL certificate monitoring alerts to Flashduty On-call through the Kuvasz webhook integration. Alerts close automatically when the monitor recovers."
keywords: ["alert integration", "Kuvasz", "webhook", "website monitoring", "SSL certificate monitoring", "open source monitoring"]
---
@@ -9,7 +10,6 @@ Kuvasz is an open-source, self-hosted uptime and SSL certificate monitor. Its **
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure Kuvasz
----
Kuvasz integrations are configured only in the YAML configuration file, and you must restart the Kuvasz container after changing it.
@@ -68,7 +67,6 @@ Make a monitor fail (for example, create an HTTP monitor that points to a URL re
## Alert Key
----
Flashduty uses the monitor type plus `monitorId` as the Alert Key. Each Kuvasz monitor has a fixed numeric ID, and the down (`*_DOWN`) and up (`*_UP`) messages of one monitor carry the same `monitorId`, so they land on the same Flashduty alert.
@@ -79,7 +77,6 @@ Flashduty uses the monitor type plus `monitorId` as the Alert Key. Each Kuvasz m
Flashduty rejects requests that have no `monitorId`.
## Alert lifecycle
----
Flashduty handles messages by the `type` field:
@@ -96,19 +93,16 @@ Flashduty handles messages by the `type` field:
Other types are ignored as well. `DNS_RECORDS_CHANGED` has no recovery message, so turn on [auto-close after timeout](/en/on-call/channel/create-edit) for the channel, start the timer from **Incident triggered**, and set about 24 hours.
## Severity
----
Kuvasz messages carry no severity. Down events and `SSL_INVALID` mean the service is unavailable and are fixed at **Critical**; `SSL_WILL_EXPIRE` and `DNS_RECORDS_CHANGED` are fixed at **Warning**. A recovery event keeps the original alert's severity.
## Alert content
----
- **Title**: the monitor name
- **Description**: the event text Kuvasz generates (`eventDetails`)
- **Labels**: `check` (monitor name), `monitor_id`, `monitor_type`, `monitor_name`, `monitor_urn`, `monitor_detail` (relative path of the monitor's details page), `event_type` (Kuvasz `type`), and `source` (always `kuvasz`)
## Troubleshooting
----
- **The test event created no alert**: this is expected; test events only verify connectivity
- **4xx or an invalid `integration_key` error**: check that `url` is the full push URL and the integration is not disabled
diff --git a/en/on-call/integration/alert-integration/alert-sources/label-mapping-api.mdx b/en/on-call/integration/alert-integration/alert-sources/label-mapping-api.mdx
index 301f062f..076d745c 100644
--- a/en/on-call/integration/alert-integration/alert-sources/label-mapping-api.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/label-mapping-api.mdx
@@ -4,7 +4,7 @@ description: "Configure Label Mapping API to automatically call your external AP
keywords: ["Label Mapping", "API", "Alert Enrichment", "CMDB", "Label Enhancement", "External Data Source"]
---
-## I. Overview
+## Overview
The Label Mapping API allows you to build custom external services to enrich alert labels. The workflow is as follows:
@@ -16,7 +16,7 @@ The Label Mapping API allows you to build custom external services to enrich ale
-## II. API Specification
+## API Specification
### Request Method
@@ -131,7 +131,7 @@ POST, Content-Type:"application/json"
-## III. Configure Mapping Service
+## Configure Mapping Service
When configuring label mapping in Flashduty, you need to first create a mapping service, then reference that service in your label enrichment rules.
@@ -161,7 +161,7 @@ When configuring label enrichment rules, you only need to focus on the following
-## IV. Header Security Constraints
+## Header Security Constraints
To prevent security bypasses, request smuggling, IP spoofing, and cache poisoning, the following Headers are **prohibited** when customizing API request headers. The system gateway will automatically filter or reject requests containing these Headers.
@@ -182,7 +182,7 @@ To prevent security bypasses, request smuggling, IP spoofing, and cache poisonin
2. **Length Limits**: The Key or Value length of a single Header should not exceed 1024 bytes
3. **Format Validation**: Header Values must not contain line breaks (`\r`, `\n`) to prevent Header injection attacks
-## V. Best Practices
+## Best Practices
1. **Performance First:** This API is on the critical path of alert processing and must ensure low latency. Queries to external data sources should be as fast as possible, and implementing caching is recommended.
@@ -192,7 +192,7 @@ To prevent security bypasses, request smuggling, IP spoofing, and cache poisonin
4. **Security:** The API must be protected through authentication and authorization mechanisms. Using custom Headers (e.g., `X-Custom-Auth`) for passing authentication information is recommended.
-## VI. FAQ
+## FAQ
1. **Is there a response timeout for the service?**
diff --git a/en/on-call/integration/alert-integration/alert-sources/lacework.mdx b/en/on-call/integration/alert-integration/alert-sources/lacework.mdx
index 42ea7ed5..b3fa70d7 100644
--- a/en/on-call/integration/alert-integration/alert-sources/lacework.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/lacework.mdx
@@ -1,5 +1,6 @@
---
title: "Lacework FortiCNAPP alert integration"
+sidebarTitle: "Lacework FortiCNAPP"
description: "Send cloud security alerts from FortiCNAPP (formerly Lacework) to Flashduty On-call through a custom webhook alert channel."
keywords: ["alert integration", "Lacework", "FortiCNAPP", "Fortinet", "webhook", "CNAPP", "cloud security alerts"]
---
@@ -9,7 +10,6 @@ Use a Lacework FortiCNAPP custom webhook alert channel to send compliance change
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,13 +30,12 @@ You can get the integration push URL in either of the following ways.
## In FortiCNAPP
----
1. Log in to the FortiCNAPP console as a user with administrative privileges
-2. Go to **Settings > Notifications > Channels** and click **+ Add new**
+2. Go to **Settings → Notifications → Channels** and click **+ Add new**
3. Select **Webhook** and click **Next**
4. Enter a channel name, for example `Flashduty`
5. In **Webhook URL**, paste the full Flashduty push URL (it must be `https`; keep `integration_key` in the query string)
@@ -48,7 +47,7 @@ FortiCNAPP sends an HTTP `POST` with a fixed JSON body, so no template is needed
-In **Settings > Notifications > Alert rules**, click **+ Add New**, select the channel from the previous step, and choose the alert severities, resource groups and alert categories you need. Only alerts that match an alert rule are sent to Flashduty.
+In **Settings → Notifications → Alert rules**, click **+ Add New**, select the channel from the previous step, and choose the alert severities, resource groups and alert categories you need. Only alerts that match an alert rule are sent to Flashduty.
@@ -66,14 +65,12 @@ Run **Test Integration** on the channel in the channel list (where available), o
## Alert Key
----
Flashduty builds the Alert Key from `lacework_account` and `event_id` in the request body. The FortiCNAPP documentation describes `event_id` as "The FortiCNAPP ID for the event". Repeated deliveries of one event (for example one notification per resource when the channel groups issues by resources) land on the same Flashduty alert, and each event opens its own alert.
Changes to the title, severity, description or time do not change the Alert Key. A request without `event_id` opens an alert of its own. A request with none of `event_id`, `event_title` and `event_description` is rejected with a parameter error.
## Status and severity
----
The FortiCNAPP webhook has no status field, so every request is a trigger event. `event_severity` ranges from 1 to 5, with 1 the highest.
@@ -87,7 +84,6 @@ The FortiCNAPP webhook has no status field, so every request is a trigger event.
The alert title is `event_title` and the description is `event_description`. Alert labels include the Lacework account (`lacework_account`), event source (`event_source`), event type (`event_type`), event ID, raw severity, recommendation ID (`rec_id`, compliance events only), event time and event link.
## Troubleshooting
----
- **No alert arrives**: check that an alert rule uses the channel and that its severities, resource groups and alert categories cover the alert; a disabled channel delivers nothing
- **The channel cannot be saved**: the webhook URL must be `https` and include the full `integration_key` query parameter
diff --git a/en/on-call/integration/alert-integration/alert-sources/langsmith.mdx b/en/on-call/integration/alert-integration/alert-sources/langsmith.mdx
index edef70dd..aaa2edc1 100644
--- a/en/on-call/integration/alert-integration/alert-sources/langsmith.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/langsmith.mdx
@@ -1,5 +1,6 @@
---
title: "LangSmith alert integration"
+sidebarTitle: "LangSmith"
description: "Send LangSmith threshold alerts on error count, latency, cost and feedback score to Flashduty On-call through an alert rule webhook."
keywords: ["alert integration", "LangSmith", "LangChain", "webhook", "alert_rule_id", "LLM observability"]
---
@@ -11,7 +12,6 @@ LangSmith's documentation describes no "resolved" notification: once the metric
## In Flashduty On-call
----
You can get the integration push URL in either of two ways.
@@ -32,7 +32,6 @@ You can get the integration push URL in either of two ways.
## Configure in LangSmith
----
@@ -60,7 +59,6 @@ A LangSmith webhook has no recovery notification: after the metric falls back, n
## Payload
----
LangSmith POSTs these fields as `application/json`, and Flashduty parses them directly:
@@ -82,19 +80,16 @@ LangSmith POSTs these fields as `application/json`, and Flashduty parses them di
The alert title is the rule name; if it is empty, `LangSmith alert ` is used.
## Alert Key
----
Flashduty uses `alert_rule_id` as the Alert Key. LangSmith documents it as the UUID identifying the alert, and every firing of one rule carries the same `alert_rule_id`, so repeated notifications while the metric stays above the threshold merge into one alert and different rules stay separate. Changing the rule name, threshold or metric value does not change the Alert Key.
A request without `alert_rule_id`, or with the all-zero UUID that LangSmith uses for test notifications, is treated as a test notification: Flashduty returns success and creates no alert.
## Status and severity
----
LangSmith notifications carry no severity, so Flashduty treats every one as Warning. A threshold breach does not mean the service is down, so the default is not Critical.
## FAQ
----
diff --git a/en/on-call/integration/alert-integration/alert-sources/lark-alert.mdx b/en/on-call/integration/alert-integration/alert-sources/lark-alert.mdx
index 3cd4c4fa..dbc0291a 100644
--- a/en/on-call/integration/alert-integration/alert-sources/lark-alert.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/lark-alert.mdx
@@ -1,5 +1,6 @@
---
title: "Lark Bot Compatible Integration"
+sidebarTitle: "Lark Bot Compatible"
description: "Flashduty generates a webhook address in the format of a Lark (Feishu) custom bot. Point a tool that already sends alerts to a Lark (Feishu) custom bot at this address to bring alert triggers and recoveries into Flashduty."
keywords: ["alert integration", "Lark Bot Compatible", "Lark custom robot", "webhook"]
---
@@ -9,7 +10,6 @@ Generate a unique Feishu robot address in Flashduty, and synchronize the occurre
## Operation Steps
----
### Create Lark Bot Compatible Integration
@@ -19,24 +19,25 @@ You can obtain a Lark Bot Compatible integration address through either of these
Choose this method when you don't need to route alert events to different channels. It's simpler and recommended.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a specific channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Lark Bot Compatible** integration and click **Save** to generate a card
4. Click the generated card to view the **Lark Bot Compatible Integration URL**, copy it for later use, and you're done
-
+
+
#### Using Shared Integration
Choose this method when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center => Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Lark Bot Compatible** integration:
- **Integration Name**: Define a name for the current integration
- **Message Type**: Select Feishu alert message type, currently only Text and Post (rich text) are supported
@@ -45,7 +46,8 @@ Choose this method when you need to route alerts to different channels based on
4. Configure the default route and select the corresponding channel (after integration creation, you can go to `Routes` to configure more routing rules)
5. Done
-
+
+
### Customize Lark Bot Compatible Integration
@@ -76,12 +78,10 @@ By default, the system always creates new alerts for each message, but you can s
- When Feishu message type is Text, Flashduty will generate a default alert title "Feishu Alert"
## Severity Mapping
----
Currently, all alerts pushed to Flashduty through the Feishu(lark) integration are set to Warning severity. However, you can customize the severity using the [alert pipeline](/en/on-call/integration/alert-integration/alert-pipelines).
## Alibaba Cloud Message Center
----
The "Robot Reception" feature in Alibaba Cloud's account Message Center can push account, product, and security notices to a custom webhook. Its data format can reuse the Feishu robot protocol, so it connects directly to the Lark Bot Compatible integration on this page.
diff --git a/en/on-call/integration/alert-integration/alert-sources/last9.mdx b/en/on-call/integration/alert-integration/alert-sources/last9.mdx
index 333b66ac..b27670d6 100644
--- a/en/on-call/integration/alert-integration/alert-sources/last9.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/last9.mdx
@@ -1,5 +1,6 @@
---
title: "Last9 Alert Integration"
+sidebarTitle: "Last9"
description: "Receive Last9 alerts through Last9's webhook notification channel using a Flashduty PagerDuty Compatible integration; resolve notifications close the alert automatically."
keywords: ["alert integration", "Last9", "webhook", "PagerDuty", "observability"]
---
@@ -9,7 +10,6 @@ Last9's webhook notification channel sends PagerDuty Events API v2 JSON to the U
## In Flashduty On-call
----
Get an integration push URL in either of the two ways below. **Choose the PagerDuty Compatible integration type** in both, not Last9.
@@ -30,7 +30,6 @@ Get an integration push URL in either of the two ways below. **Choose the PagerD
## Configure in Last9
----
1. In Last9, go to **Notification Channels** and click **Add Channel** → **Webhook**
2. Enter the full push URL copied above as the webhook URL, including `?integration_key=...`
@@ -39,7 +38,6 @@ Get an integration push URL in either of the two ways below. **Choose the PagerD
Last9 detects URLs for Microsoft Teams, Flock, Google Chat, Telegram, Jira and Zenduty and switches to their own formats. A Flashduty push URL is not one of them, so Last9 sends the generic format described here.
## Field mapping
----
| Last9 field | Flashduty |
| :--- | :--- |
@@ -53,7 +51,6 @@ Last9 detects URLs for Microsoft Teams, Flock, Google Chat, Telegram, Jira and Z
| `links`, `images` | Labels keyed by the link text (or `link_N`, `img_N`) |
## Recovery and deduplication
----
- When Last9 sends a notification with `event_action` set to `resolve`, Flashduty closes the alert with the same `dedup_key`.
- `severity` must be one of `critical`, `error`, `warning`, `info`; Flashduty rejects other values.
@@ -61,7 +58,6 @@ Last9 detects URLs for Microsoft Teams, Flock, Google Chat, Telegram, Jira and Z
- Last9's documentation does not describe test-button behavior. After the first setup, verify with a real alert that both the trigger and the recovery show up in Flashduty.
## Troubleshooting
----
- **Flashduty returns `Invalid parameters`**: the push URL is incomplete and lacks `integration_key`, or the integration type is not PagerDuty Compatible
- **Alerts do not recover**: confirm Last9 sent a `resolve` notification and that its `dedup_key` matches the trigger
diff --git a/en/on-call/integration/alert-integration/alert-sources/level.mdx b/en/on-call/integration/alert-integration/alert-sources/level.mdx
index 5c2b644a..28d9b049 100644
--- a/en/on-call/integration/alert-integration/alert-sources/level.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/level.mdx
@@ -1,5 +1,6 @@
---
title: "Level alert integration"
+sidebarTitle: "Level"
description: "Send Level device alert triggers and resolutions to Flashduty On-call through a webhook."
keywords: ["alert integration", "Level", "level.io", "RMM", "webhook", "device alerts"]
---
@@ -9,7 +10,6 @@ Use webhooks in Level (level.io) to send device alerts to Flashduty On-call. Lev
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Level
----
@@ -55,12 +54,10 @@ Level's documentation does not say whether the webhook has a test button or what
## Alert Key
----
Flashduty uses `data.id` (the Level alert ID) as the Alert Key, so `alert_active` and `alert_resolved` for the same alert share one Alert Key. Changes to the alert name, description, severity, or device hostname do not change it. Level's `event_id` identifies an event and stays the same across retries and manual re-runs; Flashduty does not use it as the Alert Key. Requests without `data.id` are rejected.
## Status and severity
----
| Event type | Status |
| :--- | :--- |
@@ -82,7 +79,6 @@ Severity comes from `data.severity`:
A recovery event keeps the alert's existing severity.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -98,7 +94,6 @@ A recovery event keeps the alert's existing severity.
The alert title is `hostname: alert name`, and the description comes from `data.description` and `data.payload`.
## Troubleshooting
----
- **Flashduty returns a parameter error**: check that the URL is complete and includes `integration_key`, and that the request body is in Level's webhook format
- **Alerts do not recover**: check that the webhook has `alert_resolved` selected
diff --git a/en/on-call/integration/alert-integration/alert-sources/librenms.mdx b/en/on-call/integration/alert-integration/alert-sources/librenms.mdx
index e49dafce..1f901da1 100644
--- a/en/on-call/integration/alert-integration/alert-sources/librenms.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/librenms.mdx
@@ -1,5 +1,6 @@
---
title: "LibreNMS alert integration"
+sidebarTitle: "LibreNMS"
description: "Send LibreNMS device alerts to Flashduty On-call through the LibreNMS API alert transport. Alerts close automatically when the alert rule recovers."
keywords: ["alert integration", "LibreNMS", "API transport", "network monitoring", "SNMP"]
---
@@ -9,7 +10,6 @@ LibreNMS pushes alerts through an alert transport of type **API**: every time an
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure LibreNMS
----
The steps below need LibreNMS 25.7.0 or later: the body template escapes text fields with the `json_encode` filter, which is available from 25.7.0.
@@ -106,7 +105,6 @@ Then make a rule really trigger (for example, make a monitored device unreachabl
## Alert Key
----
Flashduty uses `alert_id` as the Alert Key. `alert_id` is the row ID in the LibreNMS `alerts` table, which holds exactly one row per device and alert rule, and every trigger, change, and recovery notification carries the same value. The LibreNMS PagerDuty transport uses it as its dedup key too. So notifications for the same rule on the same device land on one alert, and a new trigger after recovery opens a new alert.
@@ -115,7 +113,6 @@ Changes to the severity, rule name, host name, or alert message do not change th
Flashduty rejects requests without `alert_id` or `state`.
## Alert lifecycle
----
Flashduty handles notifications by the `state` field:
@@ -133,7 +130,6 @@ Rules that use an Operation (LibreNMS 26.4.0 and later) send only trigger, ackno
When **Acknowledgement alerts** is on for a rule, LibreNMS sends a notification with `state` `2` when the alert is acknowledged. Acknowledgements neither open nor close a Flashduty alert, and ignored notifications get a success response.
## Severity
----
The severity comes from the **Severity** of the alert rule:
@@ -147,7 +143,6 @@ The severity comes from the **Severity** of the alert rule:
Recovery notifications carry the same rule severity, and the recovery event keeps it.
## Alert content
----
- **Title**: ` on `. When the rule name is empty, `LibreNMS rule ` is used instead
- **Description**: the alert message `msg` rendered from the LibreNMS alert template. The default template includes the title, severity, time, and faulty items
@@ -156,7 +151,6 @@ Recovery notifications carry the same rule severity, and the recovery event keep
Empty fields are not written as labels.
## Troubleshooting
----
- **The test fails with `Transport delivery failed with 401` and `integration_key is required`**: put `integration_key` in **Options**, not in the **API URL**
- **The test fails with `Transport delivery failed with 400`**: if the response shows `{{ $name|json_encode }}` unrendered, LibreNMS is older than 25.7.0 and does not know the `json_encode` filter; upgrade it. Otherwise make sure the fields with `|json_encode` have no extra quotes and that **Send as form** is unchecked
diff --git a/en/on-call/integration/alert-integration/alert-sources/limacharlie.mdx b/en/on-call/integration/alert-integration/alert-sources/limacharlie.mdx
index 5cfe092f..2625f3a8 100644
--- a/en/on-call/integration/alert-integration/alert-sources/limacharlie.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/limacharlie.mdx
@@ -1,5 +1,6 @@
---
title: "LimaCharlie alert integration"
+sidebarTitle: "LimaCharlie"
description: "Send detections from LimaCharlie Detection & Response (D&R) rules to Flashduty On-call through a webhook output."
keywords: ["alert integration", "LimaCharlie", "EDR", "D&R", "detection", "webhook", "detect_id"]
---
@@ -11,7 +12,6 @@ LimaCharlie sends a detection once, when the rule matches, and sends no recovery
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure LimaCharlie
----
@@ -63,14 +62,12 @@ For an end-to-end check, let a D&R rule match once and confirm the alert arrives
## Alert Key
----
Flashduty uses the detection's `detect_id` as the Alert Key. The LimaCharlie documentation defines it as the unique detection identifier. A resent detection keeps its `detect_id` and merges into the same alert, and different detections become separate alerts.
`cat` (the detection name), `priority`, and timestamps are not part of the Alert Key. A request that has `cat` but no `detect_id` is rejected with a parameter error.
## Severity
----
LimaCharlie provides only an optional integer `priority` (0 to 10) with no defined levels. The Flashduty mapping is:
@@ -82,7 +79,6 @@ LimaCharlie provides only an optional integer `priority` (0 to 10) with no defin
| 0, missing, or not a number | Warning |
## Field mapping
----
| Flashduty | LimaCharlie field |
| :--- | :--- |
@@ -93,12 +89,10 @@ LimaCharlie provides only an optional integer `priority` (0 to 10) with no defin
The matched event (`detect`) and the extracted IOCs (`detect_data`) are not copied into labels.
## Alerts do not recover
----
A detection is a one-shot event and LimaCharlie sends no recovery. In the channel that receives this integration, turn on the [auto-resolve timeout](/en/on-call/channel/create-edit). 24 hours is a reasonable start; adjust it to how quickly your team handles detections.
## Troubleshooting
----
diff --git a/en/on-call/integration/alert-integration/alert-sources/loadster.mdx b/en/on-call/integration/alert-integration/alert-sources/loadster.mdx
index 283c79be..0a8cc80f 100644
--- a/en/on-call/integration/alert-integration/alert-sources/loadster.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/loadster.mdx
@@ -1,5 +1,6 @@
---
title: "Loadster alert integration"
+sidebarTitle: "Loadster"
description: "Send Loadster monitor failure and recovery notifications to Flashduty On-call through the Loadster webhook integration."
keywords: ["alert integration", "Loadster", "synthetic monitoring", "uptime", "webhook"]
---
@@ -9,7 +10,6 @@ Use the Loadster webhook integration to send monitor failure (**Monitor Fails**)
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## In Loadster
----
@@ -60,7 +59,6 @@ Make a monitor fail (for example, point an HTTP Request Monitor at a URL that re
## Payload
----
Loadster POSTs the following fields as JSON. Flashduty parses them directly, so no template is needed:
@@ -76,12 +74,10 @@ Loadster POSTs the following fields as JSON. Flashduty parses them directly, so
When the monitor name is empty, the alert title is `Loadster monitor `.
## Alert Key
----
Flashduty uses `monitor.id` as the Alert Key. The failure and recovery notifications of one monitor carry the same `monitor.id`, so they land on the same alert. Renaming the monitor does not change the Alert Key. The top-level `id` of the request is a new UUID for every notification and is not part of the Alert Key.
## Status and severity
----
Loadster notifications carry no severity, so Flashduty maps them as follows:
@@ -93,7 +89,6 @@ Loadster notifications carry no severity, so Flashduty maps them as follows:
Notifications without `monitor.id` (for example, load test started and finished notifications) are acknowledged and ignored without creating an alert. The Loadster webhook has no test button.
## FAQ
----
@@ -110,7 +105,6 @@ The Loadster webhook applies to the whole account. To separate monitors, use rou
## Troubleshooting
----
- **Loadster does not push**: confirm webhooks are enabled and saved under **Account → Integrations → Webhooks**, and that both URLs are the complete push URL containing `integration_key`
- **Flashduty returns a parameter error**: confirm the request body contains `monitor.id` and `cycle.status`
diff --git a/en/on-call/integration/alert-integration/alert-sources/loggly.mdx b/en/on-call/integration/alert-integration/alert-sources/loggly.mdx
index 5ac70e74..acb136f5 100644
--- a/en/on-call/integration/alert-integration/alert-sources/loggly.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/loggly.mdx
@@ -1,5 +1,6 @@
---
title: "Loggly alert integration"
+sidebarTitle: "Loggly"
description: "Sync log alerts from Loggly (a SolarWinds product) to Flashduty On-call through HTTP Endpoints."
keywords: ["alert integration", "Loggly", "SolarWinds", "HTTP Endpoints", "log alert", "webhook"]
---
@@ -13,7 +14,6 @@ Loggly's alert feature is available only on paid plans (Standard, Pro); the free
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -34,7 +34,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Loggly
----
@@ -89,7 +88,6 @@ Loggly's HTTP Endpoints has no separate test-delivery button. Make the saved sea
## Alert Key
----
Flashduty keys the alert on the Loggly account subdomain (`owner_subdomain`) combined with the alert-definition ID. The alert-definition ID is parsed from `edit_alert_link` (the alert's edit-page URL) — the number after `/alerts/edit/`, for example `8188` in `.../alerts/edit/8188`.
@@ -98,12 +96,10 @@ A request is rejected if `edit_alert_link` is missing, or is not shaped like `/a
Repeated notifications from the same alert definition while its condition holds merge into one Flashduty alert instead of opening a new one each time; changes to the alert name, hit count, time window, or query do not affect the Alert Key.
## Severity
----
Loggly's HTTP Endpoints notification carries no severity field, so every alert triggers at **Warning**. A saved search crossing its hit-count threshold is not on its own an outage signal; raise the severity with an alert rule in Flashduty if a given saved search warrants it.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -118,7 +114,6 @@ Loggly's HTTP Endpoints notification carries no severity field, so every alert t
| `num_hits` | Number of log lines matched in this check window |
## FAQ
----
diff --git a/en/on-call/integration/alert-integration/alert-sources/logicmonitor.mdx b/en/on-call/integration/alert-integration/alert-sources/logicmonitor.mdx
index 5eae67e4..7c32b5ed 100644
--- a/en/on-call/integration/alert-integration/alert-sources/logicmonitor.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/logicmonitor.mdx
@@ -1,5 +1,6 @@
---
title: "LogicMonitor alert integration"
+sidebarTitle: "LogicMonitor"
description: "Send LogicMonitor alerts to Flashduty On-call through a LogicMonitor Custom HTTP Delivery integration. Alerts close automatically when they clear in LogicMonitor."
keywords: ["alert integration", "LogicMonitor", "Custom HTTP Delivery", "webhook", "infrastructure monitoring"]
---
@@ -9,7 +10,6 @@ LogicMonitor pushes alerts through a **Custom HTTP Delivery** integration: every
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure LogicMonitor
----
The steps below need a LogicMonitor user who can manage **Integrations**, **Escalation Chains**, and **Alert Rules**.
@@ -112,7 +111,6 @@ Make a datapoint cross its alert threshold (for example, temporarily lower the t
## Alert Key
----
Flashduty uses `alert_id` (`##ALERTID##`, for example `LMD12345`) as the Alert Key. The LogicMonitor docs state that all alerts on one resource (or website), LogicModule, instance, and datapoint combination share the same alert ID, so the raise, severity change, and clear notifications land on one Flashduty alert. A new alert after a clear opens a new Flashduty alert.
@@ -121,7 +119,6 @@ Changes to the severity, value, threshold, or alert message do not change the Al
Flashduty rejects requests without `alert_id` or `alert_status`, or where either field is still the unreplaced `##ALERTID##` or `##ALERTSTATUS##`.
## Alert lifecycle
----
Flashduty handles each notification by its `alert_status` field (`##ALERTSTATUS##`):
@@ -136,7 +133,6 @@ Flashduty handles each notification by its `alert_status` field (`##ALERTSTATUS#
If you select **Acknowledged** in the integration, LogicMonitor sends an `ack` notification when an alert is acknowledged. An acknowledgement neither opens nor closes a Flashduty alert, and ignored notifications return success.
## Severity
----
The severity comes from the `level` field (`##LEVEL##`), case-insensitive:
@@ -150,7 +146,6 @@ The severity comes from the `level` field (`##LEVEL##`), case-insensitive:
The clear notification carries the level of the alert that cleared, and the recovery event keeps that severity.
## Alert content
----
- **Title**: ` on `, where the resource is the host name, or the website name for website alerts. Without a DataSource and datapoint, the title is the resource name; with none of them, it is `LogicMonitor alert `
- **Description**: the alert message rendered by `##MESSAGE##`, as configured in the LogicModule
@@ -159,7 +154,6 @@ The clear notification carries the level of the alert that cleared, and the reco
Empty fields are not written as labels. When a field does not apply to the alert type (for example, website alerts have no datapoint), LogicMonitor may leave a placeholder such as `##DATAPOINT##` as-is; Flashduty treats it as empty.
## Troubleshooting
----
- **Test Alert Delivery fails**: make sure **URL** is the full push URL including the `integration_key` parameter, and that **HTTP Method** is `HTTP Post`
- **Flashduty says the body is not valid JSON**: make sure **Alert Data** uses **Raw** with the **JSON** format, and that every `##TOKEN##` in the template is inside double quotes
diff --git a/en/on-call/integration/alert-integration/alert-sources/logpoint.mdx b/en/on-call/integration/alert-integration/alert-sources/logpoint.mdx
index e0dbec1f..9496dff1 100644
--- a/en/on-call/integration/alert-integration/alert-sources/logpoint.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/logpoint.mdx
@@ -1,5 +1,6 @@
---
title: "Logpoint alert integration"
+sidebarTitle: "Logpoint"
description: "Send triggered Logpoint (Guardsix) alert rules to Flashduty On-call through the HTTP Notification."
keywords: ["alert integration", "Logpoint", "Guardsix", "SIEM", "HTTP Notification", "alertrule_id"]
---
@@ -11,14 +12,12 @@ Logpoint sends a notification only when the rule triggers and sends nothing when
## In Flashduty On-call
----
Create either a dedicated or shared **Logpoint** alert integration and copy its complete Push URL.
## Configure Logpoint
----
The Logpoint HTTP Notification has no fixed payload; the body comes from the Jinja template you enter. Flashduty parses only the template below.
@@ -69,12 +68,10 @@ Trigger the alert rule (or wait for it to match) and confirm Flashduty receives
## Alert Key
----
Flashduty uses `alertrule_id` (`{{alertrule_id}}`) as the Alert Key. The Logpoint documentation defines it as the ID of the alert. When the same rule triggers again it merges into the alert that is still open. `incident_id` changes on every trigger, so it is kept only as a label. Changes to the rule name, risk level or number of matching logs do not change the Alert Key.
## Status and severity
----
Flashduty maps severity from `risk_level` (`{{risk_level}}`):
@@ -88,12 +85,10 @@ Flashduty maps severity from `risk_level` (`{{risk_level}}`):
The Logpoint documentation does not list every `risk_level` value; its examples use `medium` and `high`, and `critical` and `low` are inferred from the risk options in the rule editor.
## Alerts do not recover
----
Logpoint sends no recovery notification. In the channel that receives this integration, turn on the [auto-resolve timeout](/en/on-call/channel/create-edit). 24 hours is a reasonable start; adjust it to how quickly your team handles alerts.
## Troubleshooting
----
- **Logpoint sends no request**: confirm Notification Trigger is **Automatic** and the rule is enabled and actually matching
- **Flashduty returns a parameter error**: confirm the Body is valid JSON and keeps `alertrule_id`; double quotes in a log source or rule name break the JSON
diff --git a/en/on-call/integration/alert-integration/alert-sources/logrocket.mdx b/en/on-call/integration/alert-integration/alert-sources/logrocket.mdx
index 7728f7d3..52e4c46a 100644
--- a/en/on-call/integration/alert-integration/alert-sources/logrocket.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/logrocket.mdx
@@ -1,5 +1,6 @@
---
title: "LogRocket alert integration"
+sidebarTitle: "LogRocket"
description: "Send LogRocket Timeseries chart alerts to Flashduty On-call through a webhook."
keywords: ["alert integration", "LogRocket", "webhook", "frontend monitoring", "Timeseries"]
---
@@ -9,7 +10,6 @@ Use the Webhook alert type of a LogRocket Timeseries chart to send metric alerts
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure LogRocket
----
@@ -54,12 +53,10 @@ Push the metric past the threshold and confirm Flashduty receives an active aler
The Issues Alerts webhook (new severe issues) uses a different message format and carries no alert ID, so it cannot be tied to a recovery. Flashduty acknowledges it and creates no alert.
## Alert Key
----
The Alert Key is the `alert_id` LogRocket sends. LogRocket documents that this ID stays the same across multiple triggerings and resolutions of the same alert, so the trigger and recovery events share one Alert Key. Editing the alert's threshold, interval, or chart location does not change it. Requests without `alert_id` are rejected.
## Status and severity
----
| LogRocket `status` | Flashduty status | Flashduty severity |
| :--- | :--- | :--- |
@@ -69,7 +66,6 @@ The Alert Key is the `alert_id` LogRocket sends. LogRocket documents that this I
The LogRocket webhook carries no severity, and a metric crossing a threshold is not the same as an outage, so every alert is Warning. Any other `status` value is rejected.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -86,7 +82,6 @@ The LogRocket webhook carries no severity, and a metric crossing a threshold is
The alert title and description come from `reason`, which LogRocket fills with the alert name you entered. Without `reason` the title is `LogRocket alert `.
## Troubleshooting
----
- **Flashduty returns an invalid parameter error**: check that the URL is complete and includes `integration_key`, and that the request comes from a Timeseries chart alert rather than Issues Alerts
- **The alert does not recover**: check that the resolved notification is sent to the same URL and that its `alert_id` matches the one sent on trigger
diff --git a/en/on-call/integration/alert-integration/alert-sources/logz-io.mdx b/en/on-call/integration/alert-integration/alert-sources/logz-io.mdx
index ff36504f..ec8bab92 100644
--- a/en/on-call/integration/alert-integration/alert-sources/logz-io.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/logz-io.mdx
@@ -1,5 +1,6 @@
---
title: "Logz.io alert integration"
+sidebarTitle: "Logz.io"
description: "Send Logz.io log alert triggers to Flashduty On-call through a Custom Endpoint."
keywords: ["alert integration", "Logz.io", "Custom Endpoint", "webhook", "alert_definition_id"]
---
@@ -11,7 +12,6 @@ A Logz.io Custom Endpoint only fires while the alert condition is met — there
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can get the integration push URL in either of the following ways.
## Configure Logz.io
----
@@ -87,7 +86,6 @@ A Logz.io Custom Endpoint has no recovery event: once the alert condition return
## Alert Key
----
Flashduty uses `alert_definition_id` as the Alert Key. Logz.io's own documentation describes it as the "Unique alert ID" (the alert definition's ID), as opposed to `alert_event_id`, the "Unique ID of the triggered alert instance" — which changes on every notification. So repeated firings of the same alert definition (including the repeat after the wait period ends, and escalation notifications across severity thresholds) land on the same Flashduty alert, while different alert definitions stay separate.
@@ -96,7 +94,6 @@ Logz.io's Custom Endpoint variables do not expose the value of a group-by field.
Changes to the title, description, severity, or timeframe never change the Alert Key. A request without `alert_definition_id` is rejected.
## Severity
----
| Logz.io `alert_severity` | Flashduty severity |
| :--- | :--- |
@@ -109,14 +106,12 @@ Changes to the title, description, severity, or timeframe never change the Alert
`alert_severity` corresponds to the severity threshold (`severityThresholdTiers`) configured on the Logz.io alert; the value is matched case-insensitively. An empty or unlisted value is rejected. Because the Custom Endpoint never sends a recovery event, the alert status always equals the severity above — there is no "recovered" state.
## Alert content
----
- **Title**: `alert_title`; falls back to `Logz.io alert` when empty
- **Description**: `alert_description`
- **Labels**: `check` (the title), `source` (fixed to `logz_io`), `alert_definition_id`, `alert_event_id`, `account_id`, `account_name`, `alert_tags`, `alert_timeframe_start`, `alert_timeframe_end`, `alert_app_url`, `vendor_severity` (the raw `alert_severity` value)
## Troubleshooting
----
- **Flashduty returns a parameter error**: make sure the message body is valid JSON, `alert_definition_id` and `alert_severity` are not empty, and the `Content-Type: application/json` header is set
- **A real alert never arrives (the test always shows failed, which is expected)**: make sure the alert's **Notification endpoints** include this Custom Endpoint, and that the alert condition actually triggered
diff --git a/en/on-call/integration/alert-integration/alert-sources/mackerel.mdx b/en/on-call/integration/alert-integration/alert-sources/mackerel.mdx
index 7066bdd2..10de3e2c 100644
--- a/en/on-call/integration/alert-integration/alert-sources/mackerel.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/mackerel.mdx
@@ -1,5 +1,6 @@
---
title: "Mackerel alert integration"
+sidebarTitle: "Mackerel"
description: "Send Mackerel alerts to Flashduty On-call through a Webhook notification channel; alerts recover automatically when they close."
keywords: ["alert integration", "Mackerel", "webhook", "server monitoring", "external monitoring"]
---
@@ -9,7 +10,6 @@ Use a Mackerel Webhook notification channel to send Mackerel alerts to Flashduty
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Mackerel
----
@@ -60,14 +59,12 @@ A new channel is added to the default notification group, which receives every n
## Alert Key
----
Flashduty uses the Mackerel alert's `alert.id` as the Alert Key. A Mackerel alert keeps the same ID from the moment it opens, through status changes, until it closes, so these notifications merge into one Flashduty alert.
When the same monitor fires again after its alert closed, Mackerel creates a new alert ID and Flashduty creates a new alert. Changes to the monitor name, message, metric value, or host status do not change the Alert Key. Alert notifications without `alert.id` are rejected.
## Status and severity
----
| Mackerel `alert.status` | `alert.isOpen` | Status | Flashduty severity |
| :--- | :--- | :--- | :--- |
@@ -80,7 +77,6 @@ When the same monitor fires again after its alert closed, Mackerel creates a new
Mackerel ranks Unknown at the same level as Critical, so Flashduty maps it to Critical. Closing an alert manually, deleting its monitor, retiring its host, or deleting its service all close the alert (`alert.isOpen` is `false`), and Flashduty recovers the alert.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -101,7 +97,6 @@ Mackerel ranks Unknown at the same level as Critical, so Flashduty maps it to Cr
The alert `message` and the monitor `memo` are written to the alert description.
## Troubleshooting
----
- **Flashduty returns a parameter error**: Make sure the URL is complete and includes `integration_key`
- **No alerts arrive**: Make sure the channel subscribes to the alert (`alert`) event, the channel's notification group includes the monitor, the host status is `working` (Mackerel does not send alert notifications for hosts in `standby`, `maintenance`, or `poweroff`), and the monitor's notifications are not muted
diff --git a/en/on-call/integration/alert-integration/alert-sources/meraki.mdx b/en/on-call/integration/alert-integration/alert-sources/meraki.mdx
index 1c34b67d..2da96b6b 100644
--- a/en/on-call/integration/alert-integration/alert-sources/meraki.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/meraki.mdx
@@ -1,5 +1,6 @@
---
title: "Meraki Alert Events"
+sidebarTitle: "Meraki"
description: "Sync Meraki alert events to Flashduty via webhook for automated alert noise reduction"
---
@@ -8,46 +9,45 @@ Sync Meraki alert events to Flashduty via webhook for automated alert noise redu
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this simpler option when you don't need to route alert events to different channels.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Meraki** integration, click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert event payload.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Meraki** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In Meraki
----
-## I. Meraki Alert Push Configuration
1. Log in to your `Meraki` console and select the device you want to configure alerts for
2. On the `Alerts` page, configure `Cellular gateway` and other sections as needed
@@ -59,7 +59,7 @@ Choose this option when you need to route alerts to different channels based on
-## II. Status Mapping
+## Status Mapping
| Meraki | Flashduty | Status |
| ---------- | -------- | ---- |
diff --git a/en/on-call/integration/alert-integration/alert-sources/metoro.mdx b/en/on-call/integration/alert-integration/alert-sources/metoro.mdx
index 00335079..3f677d2a 100644
--- a/en/on-call/integration/alert-integration/alert-sources/metoro.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/metoro.mdx
@@ -1,5 +1,6 @@
---
title: "Metoro alert integration"
+sidebarTitle: "Metoro"
description: "Send Metoro alert trigger and recovery events to Flashduty On-call through a webhook destination."
keywords: ["alert integration", "Metoro", "Kubernetes", "webhook", "observability"]
---
@@ -11,14 +12,12 @@ You write the Metoro webhook body yourself in **Body Template**, and Metoro subs
## In Flashduty On-call
----
Create either a dedicated or shared **Metoro** alert integration and copy its complete Push URL.
## Configure Metoro
----
@@ -65,7 +64,6 @@ Metoro has no separate test button. Let an alert that uses this webhook fire for
## Alert Key
----
Flashduty uses `alert_fire_uuid` (Metoro's `$alert_fire_uuid`, the UUID of one fire instance) as the Alert Key. Metoro's own Rootly integration guide pairs firing and resolved notifications on this same field (identifier `$.metoro_alert_fire_uuid`, state field `resolved`), and states that for alerts with a group by, each group value has its own `$alert_fire_uuid` while `$alert_uuid` is the same for all of them.
@@ -74,7 +72,6 @@ Flashduty uses `alert_fire_uuid` (Metoro's `$alert_fire_uuid`, the UUID of one f
- Changes to `description`, `value`, and similar fields don't change the Alert Key
## Status and severity
----
| Metoro `$alert_state` | Flashduty status or severity |
| :--- | :--- |
@@ -84,7 +81,6 @@ Flashduty uses `alert_fire_uuid` (Metoro's `$alert_fire_uuid`, the UUID of one f
Metoro alerts have no severity field, so every alert is treated as Warning. An empty or other state value is rejected. To distinguish severity, adjust it with rules in the Flashduty channel.
## Troubleshooting
----
- **Metoro reports a webhook failure (400)**: confirm the Body Template is valid JSON and that `alert_fire_uuid` and `state` are not empty. Metoro escapes variables automatically for JSON requests, so don't add escaping yourself
- **404 or 401**: confirm the Push URL is complete and includes `integration_key`
diff --git a/en/on-call/integration/alert-integration/alert-sources/mezmo.mdx b/en/on-call/integration/alert-integration/alert-sources/mezmo.mdx
index 7dc194f9..746f5a39 100644
--- a/en/on-call/integration/alert-integration/alert-sources/mezmo.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/mezmo.mdx
@@ -1,5 +1,6 @@
---
title: "Mezmo alert integration"
+sidebarTitle: "Mezmo"
description: "Sync matches from a Mezmo (formerly LogDNA) log view to Flashduty On-call through a Webhook Alert."
keywords: ["alert integration", "Mezmo", "LogDNA", "log alert", "webhook", "View", "Alert"]
---
@@ -13,7 +14,6 @@ Mezmo's own docs say `autoresolve` "only applies to PagerDuty" — the Webhook c
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -34,7 +34,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Mezmo
----
@@ -89,12 +88,10 @@ Click the **Test** link at the top of the Alert panel and confirm Flashduty retu
## Alert Key
----
Mezmo's Webhook Alert request body has no alert id, View id, or dedup key — none of the [12 documented body tokens](https://docs.mezmo.com/docs/webhook-alert-integration#body-tokens) (`name`, `matches`, `lines`, `level`, `url`, `query`, `app`, `host`, `tag`, `line`, `line_objects`, `first_line_object`) is an identifier. The View name and the query it runs are the check's identity across repeated matches — the docs define `query` as "the query of the View to which this alert is attached" — so Flashduty keys on `MD5(view_name, query)`: repeated matches of the same View and query merge into the same alert (the first matched line, match count, level, and other fields changing does not change this key); a different View, or the same View with an edited query, opens its own alert.
## Severity
----
Mezmo's own docs describe `{{ level }}` only as "Severity level (info, warn, error, etc)" — the first matched log line's level — without a full enumeration. Flashduty maps it using the table below; any value not listed, including an empty one (the log line had no parsed level), is treated as **Warning**:
@@ -106,7 +103,6 @@ Mezmo's own docs describe `{{ level }}` only as "Severity level (info, warn, err
| Empty or any other unrecognized value | Warning |
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -122,7 +118,6 @@ Mezmo's own docs describe `{{ level }}` only as "Severity level (info, warn, err
The alert title is the View name; the description leads with the raw text of the first matched log line (`{{ line }}`), followed by the query.
## FAQ
----
diff --git a/en/on-call/integration/alert-integration/alert-sources/microsoft-defender-for-cloud.mdx b/en/on-call/integration/alert-integration/alert-sources/microsoft-defender-for-cloud.mdx
index c8dccac6..06b9284d 100644
--- a/en/on-call/integration/alert-integration/alert-sources/microsoft-defender-for-cloud.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/microsoft-defender-for-cloud.mdx
@@ -1,5 +1,6 @@
---
title: "Microsoft Defender for Cloud Alert Integration"
+sidebarTitle: "Microsoft Defender for Cloud"
description: "Run a Logic App from Defender for Cloud workflow automation and use its HTTP action to push security alerts to Flashduty's standard alert event integration."
keywords: ["alert integration", "Microsoft Defender for Cloud", "Azure Security Center", "Logic App", "workflow automation", "cloud security", "standard alert event"]
---
@@ -11,7 +12,6 @@ If the same tenant already sends Defender for Cloud alerts to Microsoft Sentinel
## In Flashduty On-call
----
Get an integration push URL in either of the two ways below. **Choose the Standard Alert Event integration type** in both, not Microsoft Defender for Cloud.
@@ -32,7 +32,6 @@ Get an integration push URL in either of the two ways below. **Choose the Standa
## Configure in Microsoft Defender for Cloud
----
You need the **Security admin** role or **Owner** on the resource group; creating and editing Logic Apps needs **Logic App Contributor**.
@@ -54,7 +53,6 @@ You need the **Security admin** role or **Owner** on the resource group; creatin
You can also open a single security alert and click **Trigger logic app** to run the Logic App for that alert manually.
## HTTP action
----
Fields of the HTTP action:
@@ -107,7 +105,6 @@ In the designer, the same values map to these dynamic contents (outputs of the *
| Labels `product_name`, `vendor_name` | Product Name, Vendor Name | `ProductName`, `VendorName` |
## Field mapping
----
| Defender for Cloud field | Flashduty |
| :--- | :--- |
@@ -119,12 +116,10 @@ In the designer, the same values map to these dynamic contents (outputs of the *
| Alert Uri | Label `alert_url`, which opens the alert details in the Azure portal |
## Recovery and deduplication
----
Defender for Cloud workflow automation runs the Logic App only when an alert is created or triggered and sends nothing when the alert is dismissed, so alerts from this integration do not recover automatically. Enable [auto-resolve timeout](/en/on-call/channel/create-edit) on the channel that receives this integration, with a suggested window of 3 days or the time your team usually takes to handle alerts; you can also close alerts manually in Flashduty.
## Troubleshooting
----
- **Flashduty returns `InvalidParameter`**: check that `event_status` is one of the capitalized `Critical`, `Warning`, `Info`, and that `title_rule` is not empty
- **The Logic App is missing from the workflow automation list**: the list shows only Consumption Logic Apps that use a Defender for Cloud connector; click **Refresh** after creating it
diff --git a/en/on-call/integration/alert-integration/alert-sources/microsoft-sentinel.mdx b/en/on-call/integration/alert-integration/alert-sources/microsoft-sentinel.mdx
index 0cef2c21..44245921 100644
--- a/en/on-call/integration/alert-integration/alert-sources/microsoft-sentinel.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/microsoft-sentinel.mdx
@@ -1,5 +1,6 @@
---
title: "Microsoft Sentinel Alert Integration"
+sidebarTitle: "Microsoft Sentinel"
description: "Run a Logic App from a Microsoft Sentinel automation rule and use its HTTP action to push incidents to Flashduty's standard alert event integration; closing the incident recovers the alert."
keywords: ["alert integration", "Microsoft Sentinel", "Azure Sentinel", "Logic App", "SIEM", "automation rule", "standard alert event"]
---
@@ -11,7 +12,6 @@ Sentinel incidents also include alerts from Microsoft security products such as
## In Flashduty On-call
----
Get an integration push URL in either of the two ways below. **Choose the Standard Alert Event integration type** in both, not Microsoft Sentinel.
@@ -32,7 +32,6 @@ Get an integration push URL in either of the two ways below. **Choose the Standa
## Configure in Microsoft Sentinel
----
There are two parts: create a Logic App that starts with the **Microsoft Sentinel incident** trigger (called a playbook in Sentinel), then create automation rules that run it.
@@ -54,7 +53,6 @@ In Microsoft Sentinel, go to **Configuration** → **Automation** (in the Defend
If the playbook appears grayed out in the list, Sentinel has no permission on its resource group: click **Manage playbook permissions**, select the resource group and click **Apply** (this needs the **Owner** role on the resource group).
## HTTP action
----
Fields of the HTTP action:
@@ -105,7 +103,6 @@ In the designer, the same values map to these dynamic contents (outputs of the M
| Labels `workspace`, `resource_group` | Workspace Name, Resource Group Name | `workspaceInfo.WorkspaceName`, `workspaceInfo.ResourceGroupName` |
## Field mapping
----
| Sentinel field | Flashduty |
| :--- | :--- |
@@ -117,7 +114,6 @@ In the designer, the same values map to these dynamic contents (outputs of the M
| Incident URL and others | Labels of the same name; `incident_url` opens the incident from the alert details |
## Recovery and deduplication
----
- When the incident is closed (**Status** becomes `Closed`), the Logic App sends an event with `event_status` set to `Ok`, and Flashduty closes the alert with the same Alert Key.
- Sentinel also fires **When incident is updated** when alerts, comments or tags are added. The update rule above runs only on status or severity changes; if you remove those conditions, every update is pushed, and repeated events with the same Alert Key merge into the original alert.
@@ -125,7 +121,6 @@ In the designer, the same values map to these dynamic contents (outputs of the M
- An incident that groups several Sentinel alerts is pushed as one Flashduty alert; the title and description come from the incident itself.
## Troubleshooting
----
- **Flashduty returns `InvalidParameter`**: check that `event_status` is one of the four capitalized values and that `title_rule` is not empty
- **The HTTP action returns a 4xx about authentication or routing**: the push URL lacks `integration_key`, or it is not the push URL of a Standard Alert Event integration
diff --git a/en/on-call/integration/alert-integration/alert-sources/moesif.mdx b/en/on-call/integration/alert-integration/alert-sources/moesif.mdx
index 0c8493e1..640b0a3f 100644
--- a/en/on-call/integration/alert-integration/alert-sources/moesif.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/moesif.mdx
@@ -1,5 +1,6 @@
---
title: "Moesif alert integration"
+sidebarTitle: "Moesif"
description: "Send Moesif API monitoring alerts to Flashduty On-call through a Moesif webhook notification channel."
keywords: ["alert integration", "Moesif", "API monitoring", "API analytics", "webhook"]
---
@@ -11,7 +12,6 @@ Moesif notifies only when an alert triggers and has no recovery notification, so
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can get the integration push URL in either of the following ways.
## Configure Moesif
----
@@ -65,26 +64,22 @@ The **Notification Throttle** of a channel or rule and **Silencing alerts** stop
## Recovery and auto-close
----
Moesif notifies only when a rule triggers. The request body has no alert ID and no field that marks a recovery, so the alert in Flashduty does not recover on its own.
Each Moesif notification is a separate Flashduty alert. Close it by hand, or turn on [auto-close](/en/on-call/channel/create-edit) in the channel that receives this integration. We suggest twice the rule's evaluation period, for example 30 minutes for a 15-minute rule.
## Alert Key
----
The request has no field that identifies the same alert across notifications, so Flashduty generates a random Alert Key for each notification. Different notifications never merge into one alert.
## Status and severity
----
Moesif alerts carry no severity. The alert in Flashduty is always **Warning**; its status equals its severity and it does not recover.
A notification whose `type` is not `alert` (for example another kind of notification sent to the same channel) is ignored and creates no alert.
## Alert content
----
- **Title**: the alert rule name `name`. When the notification has a single group value, it is appended, for example `Latency per user: user-1`. Without a rule name the title is `Moesif alert`
- **Description**: the rule condition `metric`, then each group value with its current value and, for dynamic alerts, its direction; up to 20 are listed
@@ -100,7 +95,6 @@ A notification whose `type` is not `alert` (for example another kind of notifica
| `feature_count` | Number of group values, when the notification has more than one |
## Troubleshooting
----
- **Flashduty receives nothing**: check that the rule is on and selects the channel in **Send To**, and that the channel's Webhook URL is the full push URL including `integration_key`. In Moesif **Alert History**, check that the rule triggered and was not suppressed by a throttle or silencing
- **Flashduty returns a parameter error**: the body is not JSON, or has neither `name` nor `metric_values`. Use Moesif's built-in webhook channel and do not rewrite the body
diff --git a/en/on-call/integration/alert-integration/alert-sources/mongodb-atlas.mdx b/en/on-call/integration/alert-integration/alert-sources/mongodb-atlas.mdx
index 93c3cf46..5698c986 100644
--- a/en/on-call/integration/alert-integration/alert-sources/mongodb-atlas.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/mongodb-atlas.mdx
@@ -1,5 +1,6 @@
---
title: "MongoDB Atlas alert integration"
+sidebarTitle: "MongoDB Atlas"
description: "Send MongoDB Atlas project alerts to Flashduty On-call through a webhook. Alerts recover automatically when Atlas closes them."
keywords: ["alert integration", "MongoDB", "MongoDB Atlas", "Atlas", "webhook"]
---
@@ -9,7 +10,6 @@ Use the webhook integration of a MongoDB Atlas project to send Atlas alerts to F
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure MongoDB Atlas
----
Configuring the webhook integration requires the `Project Owner` role on the project or the `Organization Owner` role. Editing alert settings requires `Project Owner` or `Project Alerts Manager`.
@@ -74,14 +73,12 @@ Atlas requires the webhook URL to be reachable from the internet and to return 2
## Alert Key
----
Flashduty uses the alert `id` in the request body as the Alert Key. The Atlas documentation defines `id` as the unique identifier of the alert. The open, update, acknowledge, close, and cancel notifications of one alert carry the same `id`, so they land on the same Flashduty alert.
Changes to `status`, `currentValue`, `humanReadable`, or the timestamps do not change the Alert Key. Flashduty rejects a request without `id`, because it could not be matched to its recovery.
## Status and severity
----
Atlas sets the alert state in the `X-MMS-Event` request header:
@@ -112,7 +109,6 @@ Atlas evaluates host conditions on each node of a replica set, and each node's a
An informational alert is a point-in-time event. Each notification carries a new `id`, and Atlas never sends a close notification for it. These alerts do not recover automatically in Flashduty: close them by hand, or turn on the channel's [auto-resolve timeout](/en/on-call/channel/create-edit).
## Alert content
----
- **Title**: `metricName`, or `eventTypeName` when it is empty, followed by ` on ` when a resource is known, for example `CONNECTIONS on Cluster0`
- **Description**: `humanReadable`, which contains the project name, organization name, and alert details
@@ -121,7 +117,6 @@ An informational alert is a point-in-time event. Each notification carries a new
The acknowledging user `acknowledgingUsername` and the acknowledgement comment are not written to labels.
## Troubleshooting
----
- **The Atlas Activity Feed shows failed deliveries**: check that **Webhook URL** is the full push URL including `integration_key`
- **Flashduty returns a parameter error**: check that no **Webhook Body Template** is set and that the body contains `id`
diff --git a/en/on-call/integration/alert-integration/alert-sources/monit.mdx b/en/on-call/integration/alert-integration/alert-sources/monit.mdx
index 4f27a8ee..c0424061 100644
--- a/en/on-call/integration/alert-integration/alert-sources/monit.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/monit.mdx
@@ -1,5 +1,6 @@
---
title: "Monit Alert Integration"
+sidebarTitle: "Monit"
description: "Flashduty Monit alert integration, Monit service reports alerts through this integration"
---
@@ -13,6 +14,6 @@ You cannot modify or delete this integration. However, you can manage the label
Go to the `Monit` - `Alert Rules` - `Rule Details` page to configure monitoring metrics and threshold conditions, and enable alerts. You can choose to deliver alerts to multiple channels. Alert notification rules follow the escalation rules under the channel, and you can set responders for the team to assign to responders when alerts occur.
-
+
In some cases, you may want to route alerts generated by the same alert rule to different channels based on conditions. In this case, you can choose to deliver alerts directly to the integration rather than to the channels, and set routing rules under the current integration.
diff --git a/en/on-call/integration/alert-integration/alert-sources/monitive.mdx b/en/on-call/integration/alert-integration/alert-sources/monitive.mdx
index d5353d0c..5abac120 100644
--- a/en/on-call/integration/alert-integration/alert-sources/monitive.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/monitive.mdx
@@ -1,5 +1,6 @@
---
title: "Monitive alert integration"
+sidebarTitle: "Monitive"
description: "Send Monitive (uptimemonitoring.com) down, flapping, and recovery notifications to Flashduty On-call through a monitor webhook."
keywords: ["alert integration", "Monitive", "uptimemonitoring.com", "Uptime", "webhook", "monitor_id"]
---
@@ -9,7 +10,6 @@ Use a Monitive (uptimemonitoring.com) monitor webhook to send down (`monitor.dow
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## In Monitive
----
Monitive webhooks are set per monitor, and each monitor has one webhook slot. Set the webhook on every monitor you want to send to Flashduty.
@@ -65,7 +64,6 @@ Every Monitive delivery carries an `X-UptimeMonitoring-Signature` (HMAC-SHA256)
## Payload
----
Monitive POSTs the following fields as `application/json`. Flashduty parses them directly; no template is needed:
@@ -82,14 +80,12 @@ Monitive POSTs the following fields as `application/json`. Flashduty parses them
The alert title is the monitor name; if it is empty, the monitored URL is used, then `Monitive monitor `.
## Alert Key
----
Flashduty uses `monitor_id` as the Alert Key. Down, flapping, and recovery notifications of one monitor carry the same `monitor_id`, so they land on the same alert; different monitors produce different alerts even when their names and URLs match. Renaming the monitor or changing its URL or reason does not change the Alert Key. `delivery_id` differs for every state change, so it is not part of the Alert Key.
A request without `monitor_id` is rejected with a parameter error, because its recovery could not be matched to the original alert. A request whose `event` is none of the three values is acknowledged and ignored without creating an alert.
## Status and severity
----
Monitive notifications carry no severity. A down monitor is an outage signal and maps to Critical; flapping maps to Warning.
@@ -100,7 +96,6 @@ Monitive notifications carry no severity. A down monitor is an outage signal and
| `monitor.up` | Recovery, keeping the alert's last severity |
## FAQ
----
@@ -123,7 +118,6 @@ Webhooks are included in the free plan, with one webhook per monitor and up to 5
## Troubleshooting
----
- **Flashduty receives no alert**: query `GET /api/v1/webhook-deliveries?monitor_id=` in Monitive and check the delivery status and response code
- **Flashduty returns a parameter error**: confirm the body is Monitive's JSON and `monitor_id` is not empty
diff --git a/en/on-call/integration/alert-integration/alert-sources/monte-carlo.mdx b/en/on-call/integration/alert-integration/alert-sources/monte-carlo.mdx
index 9b2a3bf7..2b484107 100644
--- a/en/on-call/integration/alert-integration/alert-sources/monte-carlo.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/monte-carlo.mdx
@@ -1,5 +1,6 @@
---
title: "Monte Carlo alert integration"
+sidebarTitle: "Monte Carlo"
description: "Send anomaly events from the Monte Carlo data observability platform to Flashduty On-call through a webhook."
keywords: ["alert integration", "Monte Carlo", "data observability", "webhook", "incident_id"]
---
@@ -9,7 +10,6 @@ Use Monte Carlo's Webhook notification channel to send custom-rule breaches and
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Monte Carlo
----
@@ -61,12 +60,10 @@ Monte Carlo's official docs don't publish a webhook connectivity test button, an
## Alert Key
----
Flashduty uses `payload.incident_id` as the Alert Key. Both example payloads in Monte Carlo's official docs (custom rule breach, volume anomaly) carry this field, and `payload.url` in the same payload is always `https://getmontecarlo.com/incidents/` — the address Monte Carlo's own console uses to locate that incident — which is how the docs imply this field stays the same throughout the incident's lifecycle. A request missing `incident_id` is rejected.
## Status and severity
----
Alert status is decided by `payload.alert_feedback`: it recovers when the value is `fixed`, `expected`, `no_action_needed`, or `false_positive`, and stays active for every other value (`investigating`, `no_status`, `work_in_progress`, and so on).
@@ -81,7 +78,6 @@ Alert severity is decided by `payload.declared_alert_severity`, which only appea
| Empty or never declared (the default) | Warning |
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -100,7 +96,6 @@ Alert severity is decided by `payload.declared_alert_severity`, which only appea
Monte Carlo's official docs describe the audience owner field as an email address; Flashduty does not write email addresses into labels, for privacy.
## Troubleshooting
----
- **Monte Carlo reports the webhook call failed**: confirm the push URL is complete and includes `integration_key`
- **Flashduty returns a parameter error**: confirm the audience is configured as a Webhook channel, and that Monte Carlo isn't sending a custom payload — Flashduty only parses the official fixed format
diff --git a/en/on-call/integration/alert-integration/alert-sources/nagios.mdx b/en/on-call/integration/alert-integration/alert-sources/nagios.mdx
index c30da774..0f6f98c9 100644
--- a/en/on-call/integration/alert-integration/alert-sources/nagios.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/nagios.mdx
@@ -1,5 +1,6 @@
---
title: "Nagios Alert Events"
+sidebarTitle: "Nagios"
description: "Sync Nagios alert events to Flashduty via webhook for automated alert noise reduction"
keywords: ["alert integration", "Nagios alert events", "monitoring alerts", "data ingestion"]
---
@@ -7,42 +8,42 @@ keywords: ["alert integration", "Nagios alert events", "monitoring alerts", "dat
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this method when you don't need to route alert events to different channels - it's simpler.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Nagios** integration and click **Save** to generate a card
4. Click the generated card to view the **Push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this method when you need to route alerts to different channels based on the alert event payload.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Nagios** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
diff --git a/en/on-call/integration/alert-integration/alert-sources/netbeez.mdx b/en/on-call/integration/alert-integration/alert-sources/netbeez.mdx
index 1efa7119..9f3fc541 100644
--- a/en/on-call/integration/alert-integration/alert-sources/netbeez.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/netbeez.mdx
@@ -1,5 +1,6 @@
---
title: "NetBeez alert integration"
+sidebarTitle: "NetBeez"
description: "Send NetBeez network monitoring alert and incident notifications to Flashduty On-call through a webhook."
keywords: ["alert integration", "NetBeez", "network monitoring", "webhook", "alert_dedup_id", "incident_id"]
---
@@ -9,7 +10,6 @@ Use the NetBeez webhook integration to send network monitoring alerts and incide
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure NetBeez
----
@@ -60,7 +59,6 @@ Make a Target or Agent fail (for example, temporarily disable an Agent), confirm
## Payload fields
----
NetBeez POSTs `application/json` with a single `data` field: an object for a single notification, an array for an aggregate notification. Flashduty parses it directly, so no template is needed.
@@ -81,7 +79,6 @@ NetBeez POSTs `application/json` with a single `data` field: an object for a sin
The alert title is "object name: message". The object name is the first non-empty of `target`, `wifi_profile`, `agent` and `destination`.
## Alert Key
----
- Alert notifications use `alert_dedup_id`. NetBeez documents that the open and cleared notifications of one alert share it, so grouping by it is enough.
- Incident notifications use the object type, the object ID and `incident_ts`. `incident_ts` is always the incident start time and is the same in the open and cleared notifications. NetBeez also suggests correlating incidents by `incident_id`, but the cleared example in its documentation carries a different `incident_id` from the open one, so Flashduty does not depend on it and keeps `incident_id` only as a label.
@@ -90,7 +87,6 @@ The alert title is "object name: message". The object name is the first non-empt
If an alert notification has no `alert_dedup_id`, or an incident notification has no object ID or `incident_ts`, Flashduty returns a parameter error because the cleared notification could not be matched to its alert reliably.
## Status and severity
----
| NetBeez notification | Flashduty status or severity |
| :--- | :--- |
@@ -103,7 +99,6 @@ If an alert notification has no `alert_dedup_id`, or an incident notification ha
NetBeez documents only that open alerts have a `severity` of at most 5 with names such as `alert` and `critical`, and does not publish a full table, so only 1 and 2 map to Critical. To change a severity, rewrite it with a rule under the channel's **Configuration**.
## FAQ
----
@@ -126,7 +121,6 @@ No. NetBeez retries on non-2xx responses, the Alert Key of an event does not cha
## Troubleshooting
----
- **NetBeez fails to deliver**: confirm the webhook URL is the full push URL and includes `integration_key`
- **Flashduty returns a parameter error**: confirm the body has `data`, alerts carry `alert_dedup_id`, and incidents carry an object ID and `incident_ts`
diff --git a/en/on-call/integration/alert-integration/alert-sources/netdata.mdx b/en/on-call/integration/alert-integration/alert-sources/netdata.mdx
index 711e8eff..8fe7195a 100644
--- a/en/on-call/integration/alert-integration/alert-sources/netdata.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/netdata.mdx
@@ -1,5 +1,6 @@
---
title: "Netdata alert integration"
+sidebarTitle: "Netdata"
description: "Send Netdata alert raises, escalations, and recoveries to Flashduty On-call through the Netdata Agent custom notification (custom_sender)."
keywords: ["alert integration", "Netdata", "Netdata Agent", "health_alarm_notify.conf", "custom_sender", "webhook"]
---
@@ -11,7 +12,6 @@ This integration works with the open-source Netdata Agent, including Docker depl
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -20,7 +20,7 @@ You can obtain an integration push URL in either of the following ways.
Choose this method when you do not need to route alerts to different channels.
-
+
1. In the Flashduty console, select **Channel** and open a channel
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration**
@@ -35,7 +35,7 @@ Choose this method when you do not need to route alerts to different channels.
Choose this method when you need to route alerts to different channels based on the payload.
-
+
1. In the Flashduty console, select **Integration Center → Alert Events**
2. Select **Netdata** and enter an integration name
@@ -48,14 +48,12 @@ Choose this method when you need to route alerts to different channels based on
## Prerequisites
----
- **Network**: the host running the Netdata Agent must be able to reach the Flashduty push URL (for example `https://api.flashcat.cloud`).
- **curl**: the notification script sends requests with `curl`. The official Netdata packages and Docker image already include it.
- **Permissions**: you need to be able to edit files in the Netdata configuration directory (usually `/etc/netdata`).
## In Netdata
----
@@ -148,7 +146,6 @@ The test command sends WARNING, CRITICAL, and CLEAR notifications in turn. When
## Alert Key
----
Flashduty builds the Alert Key from the `host`, `chart`, and `alarm` fields.
@@ -161,7 +158,6 @@ Changes to the alert status, value, description, or duration do not change the A
The `alarm_id` in Netdata notifications is unique only within one Agent (the test command, for example, sends `alarm_id` `1` on every Agent), so Flashduty does not use it.
## Status and severity
----
Netdata sends notifications only for the WARNING, CRITICAL, and CLEAR states.
@@ -176,7 +172,6 @@ When an alert rises from WARNING to CRITICAL, Flashduty opens a new Critical ale
Netdata sends CLEAR only when an alert changes from WARNING or CRITICAL to CLEAR.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -193,7 +188,6 @@ Netdata sends CLEAR only when an alert changes from WARNING or CRITICAL to CLEAR
The alert title is `: `. Older Netdata versions that do not send `summary` use the alert name instead.
## FAQ
----
diff --git a/en/on-call/integration/alert-integration/alert-sources/new-relic.mdx b/en/on-call/integration/alert-integration/alert-sources/new-relic.mdx
index 2d5e8967..1302855b 100644
--- a/en/on-call/integration/alert-integration/alert-sources/new-relic.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/new-relic.mdx
@@ -1,5 +1,6 @@
---
title: "New Relic alert integration"
+sidebarTitle: "New Relic"
description: "Send New Relic Issues to Flashduty On-call through Workflow webhooks and correlate activation, update, and closure notifications."
keywords: ["alert integration", "New Relic", "Workflow", "webhook", "Issue"]
---
@@ -9,14 +10,12 @@ Use a New Relic Workflow webhook to send Issues to Flashduty On-call. One New Re
## In Flashduty On-call
----
Create either a dedicated or shared **New Relic** alert integration and copy its complete Push URL.
## Configure New Relic
----
@@ -68,14 +67,12 @@ Open a real Issue and confirm an active Flashduty alert. Change its priority or
## Alert Key and Issue merges
----
Flashduty uses `issue_id` (`issueId`) directly as the Alert Key. Titles, priorities, policies, conditions, entities, and `incident_ids` do not affect it. `incident_ids` is the list of Alert Events aggregated into the Issue and is stored only as context.
For `trigger_event=MERGE_REQUEST`, Flashduty updates the surviving Issue identified by the payload's `issue_id`. This version does not invoke Flashduty's internal alert merge operation or infer and close a source Issue.
## Status and severity
----
| New Relic value | Flashduty status or severity |
| :--- | :--- |
@@ -89,7 +86,6 @@ For `trigger_event=MERGE_REQUEST`, Flashduty updates the surviving Issue identif
New Relic warning thresholds create `HIGH` priority Alert Events, so `HIGH` maps to Flashduty Warning. Use an [Alert Processing Pipeline](/en/on-call/integration/alert-integration/alert-pipelines) for a different mapping.
## Add custom labels
----
Add a top-level `custom_labels` object to send more Workflow variables:
@@ -110,3 +106,11 @@ Add a top-level `custom_labels` object to send more Workflow variables:
`custom_labels` accepts at most 50 entries. Use snake_case keys. Strings, numbers, booleans, arrays, and objects are accepted; arrays and objects are stored as JSON strings. Empty values are discarded, built-in labels win collisions, and the final event may contain at most 50 labels. Never send secrets.
For the complete variable list, see [New Relic Workflow variables](https://docs.newrelic.com/docs/alerts/get-notified/custom-variables-alert-event-workflows/).
+
+## Troubleshooting
+
+- **Only test notifications arrive, real alerts don't**: make sure the Workflow is enabled and its filter matches real issues
+- **Flashduty returns a parameter error**: make sure the payload is valid JSON and contains a non-empty `issue_id` and a supported `state`
+- **Alerts don't recover**: make sure the Destination has **Closed** enabled and the close payload carries the same `issue_id` as the activation
+- **Severity or merge changes aren't updated**: enable **Priority changed** and **Other updates**
+- **Some lists are empty**: different conditions and issue types provide different context; Flashduty ignores empty labels
diff --git a/en/on-call/integration/alert-integration/alert-sources/nobl9.mdx b/en/on-call/integration/alert-integration/alert-sources/nobl9.mdx
index 678bf86c..56851714 100644
--- a/en/on-call/integration/alert-integration/alert-sources/nobl9.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/nobl9.mdx
@@ -1,5 +1,6 @@
---
title: "Nobl9 Alert Integration"
+sidebarTitle: "Nobl9"
description: "Sync alerts fired by Nobl9 SLO alert policies to Flashduty On-call through the Nobl9 Webhook alert method."
keywords: ["alert integration", "Nobl9", "SLO", "Alert Method", "Webhook", "alert_id"]
---
@@ -9,7 +10,6 @@ Use the Nobl9 Webhook alert method to sync alerts fired by SLO alert policies to
## In Flashduty On-call
----
Get the integration push URL in either of two ways.
@@ -30,7 +30,6 @@ Get the integration push URL in either of two ways.
## Configure in Nobl9
----
@@ -77,7 +76,6 @@ Use the template above. Nobl9's default fields do not include `alert_id`, and Fl
## Payload
----
| Field | Meaning | In Flashduty |
| :--- | :--- | :--- |
@@ -89,12 +87,10 @@ Use the template above. Nobl9's default fields do not include `alert_id`, and Fl
| `alert_policy_conditions_text`, `slo_details_link` | Trigger conditions, SLO details link | Description |
## Alert Key
----
Flashduty uses `alert_id` (Nobl9 docs: "Unique identifier of the alert") as the Alert Key. Repeated deliveries for the same Nobl9 alert merge into one Flashduty alert.
## Severity
----
| Nobl9 `severity` | Flashduty severity |
| :--- | :--- |
@@ -104,7 +100,6 @@ Flashduty uses `alert_id` (Nobl9 docs: "Unique identifier of the alert") as the
| Other or empty | Warning |
## FAQ
----
@@ -115,7 +110,6 @@ No. The Nobl9 Webhook documentation has no recovery notification. Enable auto-cl
## Troubleshooting
----
- **Nobl9 test fails**: a test request without `alert_id` is rejected, which is expected; otherwise confirm the URL is the full push URL starting with `https://` and includes `integration_key`
- **Flashduty returns a parameter error**: confirm the template contains `"alert_id": "$alert_id"`
diff --git a/en/on-call/integration/alert-integration/alert-sources/nodeping.mdx b/en/on-call/integration/alert-integration/alert-sources/nodeping.mdx
index a7043fd4..5aadeed0 100644
--- a/en/on-call/integration/alert-integration/alert-sources/nodeping.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/nodeping.mdx
@@ -1,5 +1,6 @@
---
title: "NodePing alert integration"
+sidebarTitle: "NodePing"
description: "Send NodePing check down and up notifications to Flashduty On-call through a webhook contact method."
keywords: ["alert integration", "NodePing", "Uptime", "webhook", "Contact", "uuid"]
---
@@ -9,7 +10,6 @@ Use a webhook contact method on a NodePing contact to send check down (`down`) a
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure NodePing
----
@@ -65,7 +64,6 @@ Keep the request method at **GET** and do not add custom Query Strings or a Body
## Payload
----
NodePing sends a GET request with the following fields appended to the push URL's query string. Flashduty parses them directly, with no template to configure:
@@ -86,14 +84,12 @@ NodePing sends a GET request with the following fields appended to the push URL'
The alert title is the check name. If the name is empty, Flashduty uses the check target, then `NodePing check `.
## Alert Key
----
Flashduty uses the check `uuid` as the Alert Key. Down and up notifications for the same check carry the same `uuid`, so they land on the same alert. Different checks produce different alerts even when their names and targets are the same. Changing the check name, target, or result code does not change the Alert Key.
`_id` identifies a single check result and changes on every notification, so it is not used to correlate alerts. A request without `uuid` is rejected with a parameter error, because its recovery could not be matched to the original alert reliably.
## Status and severity
----
NodePing notifications have no severity, so Flashduty treats them all as Critical.
@@ -106,7 +102,6 @@ NodePing notifications have no severity, so Flashduty treats them all as Critica
`first` means monitoring has started and this webhook is registered as a notification target. It does not describe an outage, so Flashduty only returns success. Requests whose `event` is empty or has any other value are rejected, so that a request with an unknown state never enters the wrong alert lifecycle.
## FAQ
----
@@ -129,7 +124,6 @@ Confirm that the check is enabled, the webhook contact method is not muted, and
## Troubleshooting
----
- **NodePing fails to deliver**: Confirm that the URL is the complete push URL including `integration_key`, and that the request method is GET
- **Flashduty returns a parameter error**: Confirm that no custom Query Strings or Body are set, and that `uuid` and `event` are present
diff --git a/en/on-call/integration/alert-integration/alert-sources/ns1.mdx b/en/on-call/integration/alert-integration/alert-sources/ns1.mdx
index fc1bf66a..7376e77c 100644
--- a/en/on-call/integration/alert-integration/alert-sources/ns1.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/ns1.mdx
@@ -1,5 +1,6 @@
---
title: "NS1 Connect alert integration"
+sidebarTitle: "NS1 Connect"
description: "Send IBM NS1 Connect monitoring job down and up events to Flashduty On-call through a webhook notifier."
keywords: ["alert integration", "NS1", "IBM NS1 Connect", "webhook", "notifier", "monitoring job"]
---
@@ -9,14 +10,12 @@ Use an NS1 Connect webhook notifier to send monitoring job `down` and `up` state
## In Flashduty On-call
----
Create either a dedicated or shared **NS1** alert integration and copy its complete Push URL.
## Configure NS1 Connect
----
@@ -49,7 +48,6 @@ Make the monitored endpoint genuinely unreachable and confirm Flashduty receives
## Alert Key
----
Flashduty uses the monitoring job ID, `job_document.id`, as the Alert Key. NS1's official example of the `down` body carries the full `job_document`, whose `id` is the job ID. The down, repeated, and up notifications of one job share it.
@@ -62,7 +60,6 @@ NS1's official documentation shows the full `down` body only; its `up` example i
## State and severity
----
NS1 sends no severity.
@@ -75,12 +72,10 @@ NS1 sends no severity.
`state` is case-insensitive.
## Labels
----
Flashduty keeps the labels `check` (job name), `resource` (`host`, `url`, or `domain` from `config`), `job_id`, `job_type`, `region`, `state`, and `notify_list` for troubleshooting and routing on the alert page.
## Troubleshooting
----
- **The alert does not recover**: confirm **Notify failback** is enabled on the monitoring job. If you cannot enable it, turn on [auto-close timeout](/en/on-call/channel/create-edit) for the channel with a duration of 1 hour and the timer starting at incident trigger
- **NS1 reports a webhook failure**: confirm the Push URL is complete and includes `integration_key`
diff --git a/en/on-call/integration/alert-integration/alert-sources/ntopng.mdx b/en/on-call/integration/alert-integration/alert-sources/ntopng.mdx
index 3d2f50ec..ffd20e38 100644
--- a/en/on-call/integration/alert-integration/alert-sources/ntopng.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/ntopng.mdx
@@ -1,5 +1,6 @@
---
title: "ntopng alert integration"
+sidebarTitle: "ntopng"
description: "Send ntopng host, interface, and flow alert engage and release events to Flashduty On-call through a webhook endpoint."
keywords: ["alert integration", "ntopng", "webhook", "endpoint", "recipient", "traffic monitoring"]
---
@@ -9,7 +10,6 @@ Use an ntopng Webhook endpoint to send ntopng alerts to Flashduty On-call. For h
## In Flashduty On-call
----
Create either a dedicated or shared **ntopng** alert integration and copy its complete Push URL.
@@ -30,7 +30,6 @@ Create either a dedicated or shared **ntopng** alert integration and copy its co
## In ntopng
----
@@ -61,7 +60,6 @@ Trigger a host alert (for example, let a host breach one of ntopng's threshold c
## Alert Key
----
The `engage` and `release` messages for one alert carry the same interface ID (`ifid`), entity type (`entity_id`), entity value (`entity_val`), alert type (`alert_id`), and subtype (`subtype`). Flashduty builds the Alert Key from these five fields. ntopng itself tells engaged alerts apart by entity value, alert type, and subtype. The score (`score`), timestamps, host name, and check period change between messages and are not part of the Alert Key.
@@ -70,7 +68,6 @@ A flow alert has `action` set to `store` and each one becomes its own alert. Whe
If an `engage` or `release` message lacks `alert_id`, `entity_id`, or `entity_val`, Flashduty returns a parameter error that names the field.
## Severity
----
ntopng derives severity from `score`; Flashduty maps it as follows. A missing or non-numeric `score` is treated as Info.
@@ -81,7 +78,6 @@ ntopng derives severity from `score`; Flashduty maps it as follows. A missing or
| Below 50 | None, Info, Notice | Info |
## Recovery and testing
----
- **`release`**: closes the alert with the same Alert Key and keeps the severity it had before the release.
- **`store` (flow alerts) and any alert without a release message**: does not recover on its own. Turn on [auto-close](/en/on-call/channel/create-edit) in the integration or channel, with a suggested duration of 24 hours.
@@ -90,7 +86,6 @@ ntopng derives severity from `score`; Flashduty maps it as follows. A missing or
A request carries at most 10 alerts (ntopng's per-request limit). Flashduty creates one event per alert and keeps the order of the request.
## Troubleshooting
----
- **ntopng reports a delivery failure**: confirm the webhook URL is complete, includes `integration_key`, and that the ntopng server can reach `api.flashcat.cloud`. ntopng retries a failed delivery 3 times
- **Flashduty returns a parameter error**: check that the body is JSON and that every `engage` and `release` alert has `alert_id`, `entity_id`, and `entity_val`
diff --git a/en/on-call/integration/alert-integration/alert-sources/nut.mdx b/en/on-call/integration/alert-integration/alert-sources/nut.mdx
index 70a17aac..5b3e6b47 100644
--- a/en/on-call/integration/alert-integration/alert-sources/nut.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/nut.mdx
@@ -1,5 +1,6 @@
---
title: "NUT (Network UPS Tools) Alert Integration"
+sidebarTitle: "NUT (Network UPS Tools)"
description: "Push UPS on-battery, low-battery and communication-loss events to the Flashduty Standard Alert Event integration through a upsmon NOTIFYCMD script; recovery events close the alerts."
keywords: ["alert integration", "NUT", "Network UPS Tools", "upsmon", "UPS", "power outage", "standard alert event"]
---
@@ -9,7 +10,6 @@ The NUT (Network UPS Tools) `upsmon` daemon can run the script set by `NOTIFYCMD
## In Flashduty On-call
----
Get an integration push URL in either of the two ways below. **Choose the Standard Alert Event integration type** in both, not NUT.
@@ -30,7 +30,6 @@ Get an integration push URL in either of the two ways below. **Choose the Standa
## Configure in NUT
----
### Step 1: Create the notification script
@@ -120,7 +119,6 @@ NOTIFYTYPE=ONLINE UPSNAME=ups@localhost /usr/local/bin/nut-flashduty.sh "UPS ups
In Flashduty you should first see the alert `UPS ups@localhost: on battery` and then see it recover.
## Recovery and deduplication
----
- `ONBATT`, `LOWBATT` and `ONLINE` share the Alert Key `nut::power`: `ONBATT` triggers the alert, a following `LOWBATT` raises it to Critical, and `ONLINE` recovers it
- `COMMBAD`, `NOCOMM` and `COMMOK` share `comm`; `ALARM` and `NOTALARM`, `OVER` and `NOTOVER`, and `BYPASS` and `NOTBYPASS` are also paired
@@ -128,7 +126,6 @@ In Flashduty you should first see the alert `UPS ups@localhost: on battery` and
- Alerts of several UPS units do not affect each other: the Alert Key contains `UPSNAME`
## Troubleshooting
----
- **No alert arrives**: confirm the `NOTIFYFLAG` of the event type in `upsmon.conf` includes `EXEC` and that `upsmon -c reload` was run
- **The script works by hand but no alert arrives when upsmon triggers it**: `NOTIFYCMD` must be the full path of the script and the user `upsmon` runs as must be able to execute it; `curl -fsS` prints failures to stderr, which `upsmon` may not record, so run the script by hand to see them
diff --git a/en/on-call/integration/alert-integration/alert-sources/obkio.mdx b/en/on-call/integration/alert-integration/alert-sources/obkio.mdx
index 4d0329f6..a740cdb1 100644
--- a/en/on-call/integration/alert-integration/alert-sources/obkio.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/obkio.mdx
@@ -1,5 +1,6 @@
---
title: "Obkio alert integration"
+sidebarTitle: "Obkio"
description: "Send network monitoring alerts from Obkio to Flashduty On-call through a webhook notification."
keywords: ["alert integration", "Obkio", "network monitoring", "webhook", "latency", "packet loss"]
---
@@ -9,7 +10,6 @@ Use the organization-level webhook notification of Obkio to send network monitor
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## In Obkio
----
The webhook is configured at the organization level and requires permission to change the organization's advanced parameters.
@@ -63,14 +62,12 @@ The Obkio documentation describes no test delivery. Flashduty only handles deliv
## Alert Key
----
Flashduty uses `data.alert_id` from the webhook as the Alert Key. Obkio's example lists `alert_id` (the alert) separately from `notification_id` (this notification); the notification ID differs on every delivery, so it is not part of the Alert Key. The Obkio documentation does not say whether `alert_id` stays the same across notifications for one alert. If it changes, each notification becomes its own alert and auto-close cleans them up.
Changes to the event type, severity, or description never change the Alert Key. A delivery without `data.alert_id` is rejected.
## Status and severity
----
Flashduty sets the severity from `data.severity` (the Obkio levels, see [Notifications](https://obkio.com/docs/notifications/)):
@@ -86,7 +83,6 @@ Flashduty sets the severity from `data.severity` (the Obkio levels, see [Notific
The Obkio documentation does not say whether the `ok` level is ever sent. If it is, the alert with that `alert_id` recovers.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -101,7 +97,6 @@ The Obkio documentation does not say whether the `ok` level is ever sent. If it
The title comes from `event_description`, such as `High latency: 118.32 ms`.
## Troubleshooting
----
- **Flashduty returns an invalid-parameter error**: the message names the missing field (`data.alert_id`). Check that Webhook Type is `Obkio`
- **Obkio keeps retrying**: confirm the URL is complete and includes `integration_key`; Obkio stops retrying once it gets a 2xx response
diff --git a/en/on-call/integration/alert-integration/alert-sources/observium.mdx b/en/on-call/integration/alert-integration/alert-sources/observium.mdx
index a1c49163..f47cfdc3 100644
--- a/en/on-call/integration/alert-integration/alert-sources/observium.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/observium.mdx
@@ -1,5 +1,6 @@
---
title: "Observium alert integration"
+sidebarTitle: "Observium"
description: "Send Observium alert checker and syslog alerts to Flashduty On-call through the Observium Webhook JSON transport. Alerts close automatically when the alert checker recovers."
keywords: ["alert integration", "Observium", "Webhook JSON", "network monitoring", "SNMP"]
---
@@ -9,7 +10,6 @@ Observium pushes alerts through a contact of type **Webhook JSON**: every time a
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure Observium
----
The **Webhook JSON** transport ships with the Observium Community Edition; no subscription is needed. Screen names below follow Observium CE 26.1.
@@ -125,7 +124,6 @@ Then make a checker fire for real (for example, make a monitored device unreacha
## Alert Key
----
Flashduty uses `ALERT_ID` as the Alert Key for alert checker alerts. `ALERT_ID` is the row ID in the Observium `alert_table` table, which holds exactly one row per alert checker and entity, and every alert, reminder, and recovery notification carries the same value. So notifications for the same checker on the same entity land on one alert, and a new failure after recovery opens a new alert.
@@ -136,7 +134,6 @@ For syslog alerts, `ALERT_ID` is the syslog rule ID and no recovery is ever sent
Flashduty rejects requests without `ALERT_STATE` or `ALERT_ID`, or whose `ALERT_STATE` is not a value in the table below.
## Alert lifecycle
----
Flashduty handles notifications by the `ALERT_STATE` field:
@@ -150,7 +147,6 @@ Flashduty handles notifications by the `ALERT_STATE` field:
`ALERT_STATE` carries Observium's fixed state names and is not affected by `$config['alerts']['status_name']`. Custom names appear in `ALERT_STATE_NAME`, which Flashduty does not read.
## Severity
----
The severity comes from `ALERT_SEVERITY`:
@@ -164,7 +160,6 @@ The severity comes from `ALERT_SEVERITY`:
For alert checkers the severity is the checker's **Severity** (`Critical` or `Warning`); for syslog alerts it is the syslog priority of the log line. Recovery notifications carry the same checker severity, and the recovery event keeps it.
## Alert content
----
- **Title**: ` on `. When the entity is not the device itself (for example a port or a sensor), `()` is appended. When the checker message is empty, `Observium alert ` is used instead
- **Description**: `CONDITIONS` (the failed conditions), `METRICS` (current metric values), and `DURATION`, one per line
@@ -173,7 +168,6 @@ For alert checkers the severity is the checker's **Severity** (`Critical` or `Wa
Empty fields and `%TAG%` placeholders left unreplaced by the template (such as `ENTITY_*` in syslog notifications) are not written to labels.
## Troubleshooting
----
- **Observium records notifications as failed and Flashduty receives duplicate events**: the contact's **Transport** is **Webhook**. Change it to **Webhook JSON**
- **Flashduty returns 400 with `ALERT_STATE is required` or `ALERT_ID is required`**: the contact's JSON template lacks that field. Restore the default template
diff --git a/en/on-call/integration/alert-integration/alert-sources/oceanbase.mdx b/en/on-call/integration/alert-integration/alert-sources/oceanbase.mdx
index dac8d8ae..a57dd762 100644
--- a/en/on-call/integration/alert-integration/alert-sources/oceanbase.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/oceanbase.mdx
@@ -1,5 +1,6 @@
---
title: "OceanBase Alert Events"
+sidebarTitle: "OceanBase"
description: "Synchronize OceanBase alert events to Flashduty via webhook for automated alert noise reduction"
---
@@ -8,46 +9,45 @@ Sync OceanBase alert events to Flashduty via webhook for automated alert noise r
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this method when you don't need to route alert events to different channels. It's simpler and recommended.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a specific channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **OceanBase** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this method when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **OceanBase** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In OceanBase
----
-## I. OceanBase Alert Push Configuration
### Step 1: Configure Alert Channel
1. Log in to your OceanBase console and select Alert Center
@@ -55,7 +55,7 @@ Choose this method when you need to route alerts to different channels based on
3. Select **Custom Script** as the channel type
4. Configure the basic settings as shown below:
-
+
5. Copy the following script content into the channel configuration, and **please add the integration_key value from your Flashduty push URL to the integration_key parameter in the script**
@@ -158,10 +158,10 @@ OCP Alert Notification - Single Alert
### Step 2: Configure Alert Push
-1. Create a new push configuration at: **Alert Center=>Alert Push=>New Push Configuration**
+1. Create a new push configuration at: **Alert Center → Alert Push → New Push Configuration**
2. Configure push type and specified objects as needed
-
+
3. Select **English** for push language
4. Select **Flashduty** for alert channel
@@ -171,7 +171,7 @@ OCP Alert Notification - Single Alert
-## II. Status Mapping
+## Status Mapping
diff --git a/en/on-call/integration/alert-integration/alert-sources/oci-monitoring.mdx b/en/on-call/integration/alert-integration/alert-sources/oci-monitoring.mdx
index 9065c322..2bf9fd88 100644
--- a/en/on-call/integration/alert-integration/alert-sources/oci-monitoring.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/oci-monitoring.mdx
@@ -1,5 +1,6 @@
---
title: "OCI Monitoring alert integration"
+sidebarTitle: "OCI Monitoring"
description: "Send Oracle Cloud Infrastructure Monitoring alarm triggers and recoveries to Flashduty On-call through an OCI Notifications HTTPS subscription."
keywords: ["alert integration", "Oracle Cloud", "OCI", "Monitoring", "Alarm", "Notifications", "dedupeKey"]
---
@@ -9,7 +10,6 @@ Use an HTTPS (Custom URL) subscription on an OCI Notifications topic to send Ora
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -34,7 +34,6 @@ OCI HTTPS subscription URLs cannot contain query parameters, so this integration
## Configure OCI
----
@@ -75,14 +74,12 @@ OCI HTTPS subscription URLs cannot contain query parameters, so this integration
## Alert Key
----
Flashduty uses the `dedupeKey` of the alarm message as the Alert Key. OCI defines `dedupeKey` as the unique identifier of the alarm (grouped message) or of the metric stream in the alarm (split message), and says to use it to group messages that belong to the same alarm. The `OK_TO_FIRING`, `REPEAT`, `FIRING_TO_OK`, and `RESET` messages of one alarm carry the same `dedupeKey`, so they update the same Flashduty alert.
Changes to the title, body, severity, time, or metric values do not change the Alert Key. An alarm message without a `dedupeKey` is rejected.
## Status and severity
----
| OCI `type` | Flashduty status |
| :--- | :--- |
@@ -101,7 +98,6 @@ Changes to the title, body, severity, time, or metric values do not change the A
A recovery keeps the alert's severity. An empty or unknown `severity` is treated as Warning; an unknown `type` is rejected.
## Alert labels
----
Flashduty writes the following fields to alert labels for routing and troubleshooting:
@@ -112,7 +108,6 @@ Flashduty writes the following fields to alert labels for routing and troublesho
The alarm `body` and `alarmSummary` go into the alert description.
## Troubleshooting
----
- **The subscription stays Pending**: Check that the URL is the complete push URL, with the integration key in the path and no query parameters. Then delete the subscription and create it again with the correct URL. A confirmation link is valid for 3 days; after it expires, recreate the subscription as well
- **Flashduty returns a ConfirmationURL error**: Flashduty only visits https confirmation links on Oracle Cloud domains such as `oraclecloud.com`. Make sure the request comes from OCI Notifications
diff --git a/en/on-call/integration/alert-integration/alert-sources/odown.mdx b/en/on-call/integration/alert-integration/alert-sources/odown.mdx
index 8c629846..e631bf2e 100644
--- a/en/on-call/integration/alert-integration/alert-sources/odown.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/odown.mdx
@@ -1,5 +1,6 @@
---
title: "Odown alert integration"
+sidebarTitle: "Odown"
description: "Send Odown check down, recovery, and SSL certificate expiry notifications to Flashduty On-call through a webhook channel."
keywords: ["alert integration", "Odown", "Uptime", "webhook", "SSL", "ALERT_FAILURE", "ALERT_RECOVERY"]
---
@@ -9,7 +10,6 @@ Use an Odown webhook channel to send check down (`ALERT_FAILURE`), recovery (`AL
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure Odown
----
@@ -57,7 +56,6 @@ Let a check actually fail (for example, point it at an unreachable address tempo
## Payload
----
Odown POSTs each event as JSON. Flashduty parses it directly, so no template is needed:
@@ -78,7 +76,6 @@ Odown POSTs each event as JSON. Flashduty parses it directly, so no template is
The alert title is the check name, or the monitored URL when the name is empty. SSL expiry alert titles start with `SSL certificate expiring:`.
## Alert Key
----
- Down and recovery: Flashduty uses `check.id` as the Alert Key. `ALERT_FAILURE` and `ALERT_RECOVERY` for the same check carry the same `check.id`, so they land on one alert, while different checks produce different alerts. Renaming a check or a change in status code or run location does not change the Alert Key.
- SSL expiry: the Alert Key is `check.id` plus `:ssl_expiry`. It is separate from the check's down alert, so a recovery does not close the certificate alert, and repeated expiry notices for one check merge into one alert.
@@ -86,7 +83,6 @@ The alert title is the check name, or the monitored URL when the name is empty.
A request without `check.id` is rejected with a parameter error, because a recovery could not be matched to its alert.
## Status and severity
----
Odown notifications carry no severity.
@@ -99,12 +95,10 @@ Odown notifications carry no severity.
A request with an empty or unknown `event` is rejected, so a request whose state is unclear never lands in the wrong alert lifecycle.
## Turn on the auto-resolve timeout for one-shot alerts
----
An SSL expiry notice has no matching close notification, so these alerts do not recover automatically in Flashduty. Turn on the channel's [auto-resolve timeout](/en/on-call/channel/create-edit) and set it to 7 days, or close the alert by hand after you renew the certificate.
## FAQ
----
@@ -121,7 +115,6 @@ No. Notifications for one check carry the same `check.id` and merge into one ale
## Troubleshooting
----
- **Odown reports a failed delivery**: check that the webhook URL is the complete push URL and includes `integration_key`
- **Flashduty returns a parameter error**: check that the request is an Odown JSON notification with non-empty `check.id` and `event`
diff --git a/en/on-call/integration/alert-integration/alert-sources/ofelia.mdx b/en/on-call/integration/alert-integration/alert-sources/ofelia.mdx
index 3fc31dca..f32869cc 100644
--- a/en/on-call/integration/alert-integration/alert-sources/ofelia.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/ofelia.mdx
@@ -1,5 +1,6 @@
---
title: "Ofelia alert integration"
+sidebarTitle: "Ofelia"
description: "Send failure and recovery events from Ofelia scheduled jobs to Flashduty On-call through a webhook."
keywords: ["alert integration", "Ofelia", "cron", "Docker", "webhook", "scheduled jobs"]
---
@@ -11,7 +12,6 @@ This page covers the webhook feature of [netresearch/ofelia](https://github.com/
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Ofelia
----
Ofelia talks to the Docker API even when it only runs `job-local` jobs, so the Ofelia container must mount `/var/run/docker.sock`; without it Ofelia exits at startup. With `docker run`, add `-v /var/run/docker.sock:/var/run/docker.sock:ro`.
@@ -101,7 +100,6 @@ Make a job fail once (for example, temporarily change its command to `false`) an
## Alert Key
----
Flashduty builds the Alert Key from `host.hostname` and `job.name`, joined by a separator that cannot appear in either, then hashed with MD5. In our verification, failed and successful runs of the same job carried the same hostname and job name. `execution.id` differs on every run, so it is not part of the Alert Key.
@@ -111,7 +109,6 @@ Flashduty builds the Alert Key from `host.hostname` and `job.name`, joined by a
- If `job.name` is missing, Flashduty returns 400 rather than writing a failure and its recovery to the wrong alert
## Status and severity
----
| Ofelia `execution.status` | Flashduty handling |
| :--- | :--- |
@@ -124,7 +121,6 @@ A job skipped by `no-overlap` means the previous run is still going, so the job'
Repeated failures update the same alert. If a job stops running altogether (deleted or disabled), its alert does not recover. Close it manually, or turn on [auto-close after timeout](/en/on-call/channel/create-edit) for the channel.
## Alert content
----
- **Title**: `Ofelia job "" failed`, or `Ofelia job "" succeeded` on recovery
- **Description**: `execution.error`, followed by `execution.stderr` on a new line
@@ -133,7 +129,6 @@ Repeated failures update the same alert. If a job stops running altogether (dele
The job command and stdout never reach labels or the description, because a command can carry credentials.
## Troubleshooting
----
- **Flashduty receives nothing**: confirm the job has `webhooks = flashduty` and look for `Webhook error` in the Ofelia log. Ofelia retries a failed webhook 3 times by default, 5 seconds apart
- **Failures arrive but never recover**: confirm the webhook has `trigger = always` and that the hostname did not change between runs
diff --git a/en/on-call/integration/alert-integration/alert-sources/ohdear.mdx b/en/on-call/integration/alert-integration/alert-sources/ohdear.mdx
index 26123e69..9d369a50 100644
--- a/en/on-call/integration/alert-integration/alert-sources/ohdear.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/ohdear.mdx
@@ -1,5 +1,6 @@
---
title: "Oh Dear alert integration"
+sidebarTitle: "Oh Dear"
description: "Send uptime, performance, certificate, DNS, and scheduled task events from Oh Dear to Flashduty On-call through the team webhook."
keywords: ["alert integration", "Oh Dear", "webhook", "uptime monitoring", "certificate monitoring", "scheduled task monitoring"]
---
@@ -9,7 +10,6 @@ Use the webhook in your Oh Dear team settings to send uptime, performance, broke
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Oh Dear
----
The Oh Dear webhook is configured per team, and events from every monitor in the team go to the same URL.
@@ -56,7 +55,6 @@ Oh Dear treats only HTTP 200 as delivered. Any other status, including a 301 or
## How events map to alerts
----
Oh Dear pushes every event, and you cannot filter event types on the Oh Dear side. Flashduty handles them as follows:
@@ -84,7 +82,6 @@ Monitor added (`monitorAddedNotification`) and any event type Oh Dear adds later
## Alert Key
----
- Checks with a recovery event: the Alert Key is computed from `run.check_id` (the ID of one kind of check under a monitor in Oh Dear). The trigger and recovery events of one check share an Alert Key, and different monitors, or different checks of the same monitor, never merge
- Events without a recovery event: the Alert Key is computed from the event's `uuid`. Oh Dear keeps the same `uuid` when it retries an event, so a retry does not create a duplicate alert, while each new event creates its own alert
@@ -92,7 +89,6 @@ Monitor added (`monitorAddedNotification`) and any event type Oh Dear adds later
Changes to the monitor name, URL, time, or run ID do not change the Alert Key. A push without `run.check_id` (checks with a recovery event) or without `uuid` (events without one) is rejected.
## Status and severity
----
Oh Dear events carry no severity, so Flashduty decides by event:
@@ -105,7 +101,6 @@ Oh Dear events carry no severity, so Flashduty decides by event:
An uptime `...UptimeCheckRecovered` event with `run.result` set to `warning` means partial connectivity (the primary checker failed, the secondary succeeded, and the site still counts as online). Flashduty treats it as a recovery too.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -118,7 +113,6 @@ An uptime `...UptimeCheckRecovered` event with `run.result` set to `warning` mea
| `url` | Link to the matching report in Oh Dear |
## Troubleshooting
----
- **No alerts arrive**: check that `integration_key` in the URL is correct, and look at the request's response status in Oh Dear's webhook log
- **An alert does not recover**: check that Oh Dear has sent the matching recovery event. Certificate expiry, DNS record changes, and scheduled task events have none and must be closed manually
diff --git a/en/on-call/integration/alert-integration/alert-sources/okta.mdx b/en/on-call/integration/alert-integration/alert-sources/okta.mdx
index 046a2a7e..c95998d6 100644
--- a/en/on-call/integration/alert-integration/alert-sources/okta.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/okta.mdx
@@ -1,5 +1,6 @@
---
title: "Okta alert integration"
+sidebarTitle: "Okta"
description: "Sync account lockouts, breached credentials, and user-reported suspicious activity from Okta Event Hooks to Flashduty On-call."
keywords: ["alert integration", "Okta", "Event Hooks", "account lockout", "identity security"]
---
@@ -14,7 +15,6 @@ Only super administrators can create and configure event hooks, and each Okta or
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -35,7 +35,6 @@ You can get the integration push URL in either of the following ways.
## Configure Okta
----
@@ -87,14 +86,12 @@ Preview sends real events from your org's System Log, and Flashduty cannot tell
## Configure auto-resolve timeout
----
Breached credential and suspicious activity alerts have no recovery notification and never close on their own. In the channel that receives these alerts, turn on the [auto-resolve timeout](/en/on-call/channel/create-edit), set **Window timing start** to **Incident trigger**, and set the timeout to 24 hours: responders get one working day to confirm and reset the credential, and unhandled incidents do not stay open indefinitely.
Account lockout alerts are closed by unlock events and do not depend on this setting.
## Payload fields
----
The `data.events` array in one delivery may carry several events. Flashduty processes them one by one in order of each event's `published` time. Each event is an Okta System Log record, and Flashduty uses the following fields:
@@ -112,7 +109,6 @@ The `data.events` array in one delivery may carry several events. Flashduty proc
The alert title has the form `: `, for example `Okta account locked: Jane Doe`. Every alert also carries the label `source=okta`.
## Alert Key
----
Flashduty builds the Alert Key from the event category and the user ID:
@@ -122,7 +118,6 @@ Flashduty builds the Alert Key from the event category and the user ID:
- A new breached credential or suspicious activity event for a user whose alert is still open merges into that alert
## Status and severity
----
The `severity` that Okta records does not reflect urgency (an account lockout is recorded as `DEBUG`, for example), so Flashduty maps severity by event type:
@@ -135,7 +130,6 @@ The `severity` that Okta records does not reflect urgency (an account lockout is
| Other event types | Ignored; no alert |
## FAQ
----
@@ -158,7 +152,6 @@ Okta times out after 3 seconds and retries at most once on a 5xx response or a t
## Troubleshooting
----
- **Verify fails**: make sure the URL is the full push URL, including `integration_key`
- **Flashduty returns an invalid parameter error**: an event that should create an alert has no user (neither `target` nor `actor` contains an object of type `User`). This usually happens with sample data in Preview
diff --git a/en/on-call/integration/alert-integration/alert-sources/open-falcon.mdx b/en/on-call/integration/alert-integration/alert-sources/open-falcon.mdx
index 8f785ba5..68732cef 100644
--- a/en/on-call/integration/alert-integration/alert-sources/open-falcon.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/open-falcon.mdx
@@ -1,5 +1,6 @@
---
title: "Open Falcon Integration"
+sidebarTitle: "Open Falcon"
description: "Sync Open-Falcon alert events to Flashduty via webhook to achieve automated alert noise reduction"
---
@@ -8,42 +9,42 @@ Sync Open-Falcon alert events to Flashduty via webhook to achieve automated aler
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this simpler option when you don't need to route alert events to different channels.
-
- Expand
+
+
1. Go to Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Falcon** integration, click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use. Done.
-
+
+
### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Falcon** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
-## In Falcon
----
+## In Falcon
Configure webhooks for each alert rule.
@@ -53,10 +54,10 @@ Configure webhooks for each alert rule.
3. Click the Save button to save the alert rule
4. Repeat steps 2 and 3 for all alert rule templates that need to send events
-
-
+
+
-Similarly, you can configure the same push URL for Expressions alert rules.
+ Similarly, you can configure the same push URL for Expressions alert rules.
5. Return to the integration list, if the latest event time is displayed, the configuration is successful and events are being received
6. Done
@@ -64,7 +65,6 @@ Similarly, you can configure the same push URL for Expressions alert rules.
## Status Mapping
----
Open-Falcon to Flashduty alert severity mapping:
diff --git a/en/on-call/integration/alert-integration/alert-sources/opennms.mdx b/en/on-call/integration/alert-integration/alert-sources/opennms.mdx
index d82f32e3..8ec4101c 100644
--- a/en/on-call/integration/alert-integration/alert-sources/opennms.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/opennms.mdx
@@ -1,5 +1,6 @@
---
title: "OpenNMS alert integration"
+sidebarTitle: "OpenNMS"
description: "Send OpenNMS Horizon node, interface, and service outage notices to Flashduty On-call through a webhook notification command. Alerts close automatically when the outage is resolved."
keywords: ["alert integration", "OpenNMS", "OpenNMS Horizon", "webhook", "notification command", "notificationCommands.xml", "network monitoring"]
---
@@ -9,7 +10,6 @@ OpenNMS Horizon uses notices to tell operators about events in the network. This
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure OpenNMS
----
This integration uses the OpenNMS webhook notification strategy `WebhookNotificationStrategy`, which requires **OpenNMS Horizon 36.0.3 or later**. Earlier versions do not have this strategy, so upgrade first. Below, `$OPENNMS_HOME` is the OpenNMS installation directory, `/opt/opennms` in the official container image. The OpenNMS server must be able to reach the Flashduty push URL.
@@ -149,7 +148,6 @@ OpenNMS has no button to test a notification command on its own.
## Alert Key
----
Flashduty uses the OpenNMS notice ID `notice_id` (`${noticeid}`) as the Alert Key. The notice ID stays the same when an escalation step resends the notice and when OpenNMS sends the resolution notice after a recovery event auto-acknowledges it, so all of these land on the same alert.
@@ -160,7 +158,6 @@ Notice IDs are unique only within one OpenNMS instance. Use a separate integrati
Flashduty rejects a request that lacks `notice_id`, and OpenNMS logs the failed push in `notifd.log`.
## Alert lifecycle
----
OpenNMS configures auto-acknowledgement (`auto-acknowledge`) for outage events in `notifd-configuration.xml`: when the recovery event arrives, OpenNMS acknowledges the matching outage notice and sends the original notice again to its original recipients, with `RESOLVED: ` in front of the subject and text. Flashduty checks whether the subject starts with `RESOLVED:`:
@@ -183,7 +180,6 @@ To push other notices that have no auto-acknowledgement (for example, threshold
When the event's alarm is cleared by its clearing event, OpenNMS acknowledges the notice and sends the resolution notice. After the change, reload Notifd as in the first step. For notices that still get no resolution notice, turn on the [auto-resolve timeout](/en/on-call/channel/create-edit) in the channel that receives this integration's alerts, set **Window timing start** to **Incident trigger**, and set the timeout to 24 hours.
## Severity
----
Severity comes from `severity` in the request, which is the OpenNMS event severity that `%severity%` resolves to in the optional step:
@@ -201,14 +197,12 @@ Severity comes from `severity` in the request, which is the OpenNMS event severi
In a resolution notice, `severity` is the numeric severity id OpenNMS stores (for example `5` for `Minor` and `6` for `Major`). Flashduty converts ids 1–7 back to severity names, so the recovery event keeps the severity the alert was triggered with.
## Alert content
----
- **Title**: the notice subject `subject` without the `RESOLVED: ` prefix; `OpenNMS notice #` when the subject is empty
- **Description**: the notice text `message` without the `RESOLVED: ` prefix
- **Labels**: `notice_id`, `event_id`, `event_uei`, `node_id`, `interface`, `service`, `severity` (the severity name; the numeric id in a resolution notice is converted to its name). Labels with empty values are not added
## Troubleshooting
----
The log messages below are in `$OPENNMS_HOME/logs/notifd.log`.
diff --git a/en/on-call/integration/alert-integration/alert-sources/openobserve.mdx b/en/on-call/integration/alert-integration/alert-sources/openobserve.mdx
index 8fe2570f..1bfc4bbb 100644
--- a/en/on-call/integration/alert-integration/alert-sources/openobserve.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/openobserve.mdx
@@ -1,5 +1,6 @@
---
title: "OpenObserve alert integration"
+sidebarTitle: "OpenObserve"
description: "Send OpenObserve alerts to Flashduty On-call through a webhook template on an alert destination."
keywords: ["alert integration", "OpenObserve", "webhook", "log alerts", "observability"]
---
@@ -9,7 +10,6 @@ An OpenObserve webhook destination has no fixed request body: the body is the te
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure OpenObserve
----
You need permission to manage alert templates and destinations.
@@ -84,14 +83,12 @@ The template must contain `org_name`, `stream_name`, and `alert_name`; Flashduty
## Alert Key
----
Flashduty computes the Alert Key from `org_name`, `stream_type`, `stream_name`, and `alert_name`, so the trigger, repeated triggers, and recovery of one OpenObserve alert share an Alert Key. Changes to the level, result count, threshold, trigger time, or `episode_id` do not change it; an empty `stream_type` counts as an empty value. A request without `org_name`, `stream_name`, or `alert_name` is rejected.
Renaming an OpenObserve alert, stream, or organization produces a new Alert Key.
## Status and severity
----
| `alert_level` | Flashduty severity |
| :--- | :--- |
@@ -101,12 +98,10 @@ Renaming an OpenObserve alert, stream, or organization produces a new Alert Key.
An `alert_status` of `resolved` recovers the alert; any other value triggers it. Before OpenObserve 1.1, `{alert_status}`, `{alert_level}`, and `{episode_id}` are not substituted and arrive as the literal template text. Flashduty treats them as empty, so the alert triggers as Warning.
## Recovery
----
Flashduty receives a recovery request, and closes the alert automatically, only with OpenObserve 1.1 or later and recovery notifications enabled on the alert. Otherwise every firing is an independent one-shot notification with no recovery request. For these alerts, set **auto-close after timeout** on the Flashduty integration or channel with a suitable duration, or the alert stays active.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -123,7 +118,6 @@ Flashduty receives a recovery request, and closes the alert automatically, only
The template does not contain `{rows}`, so Flashduty does not receive the log rows the query returned.
## Troubleshooting
----
- **Flashduty returns an invalid-parameter error**: Check that the URL is complete and includes `integration_key`, that the template contains `org_name`, `stream_name`, and `alert_name`, and that the template is valid JSON
- **The alert does not recover**: Check that OpenObserve is 1.1 or later and that the alert has recovery notifications enabled; otherwise configure auto-close after timeout
diff --git a/en/on-call/integration/alert-integration/alert-sources/opensearch.mdx b/en/on-call/integration/alert-integration/alert-sources/opensearch.mdx
index c5ec7cf7..603ec201 100644
--- a/en/on-call/integration/alert-integration/alert-sources/opensearch.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/opensearch.mdx
@@ -1,5 +1,6 @@
---
title: "OpenSearch alert integration"
+sidebarTitle: "OpenSearch"
description: "Send trigger notifications from OpenSearch monitors to Flashduty On-call through a custom webhook notification channel of the Alerting plugin."
keywords: ["alert integration", "OpenSearch", "Alerting", "Notifications", "webhook", "log monitoring"]
---
@@ -11,7 +12,6 @@ Each trigger of each monitor maps to one Flashduty alert: while the trigger cond
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure OpenSearch
----
The Alerting and Notifications plugins must be installed (OpenSearch ships with both), and you need permission to create notification channels and monitors.
@@ -57,19 +56,19 @@ If the cluster sets `opensearch.notifications.core.http.host_deny_list`, make su
3. Under the trigger, click **Add action** and select the channel you just created as the **Notification channel**
4. Paste the whole template below into **Message**, without changing the quotation marks or field names:
-```text
-{
- "monitor_id": "{{ctx.monitor._id}}",
- "monitor_name": "{{ctx.monitor.name}}",
- "trigger_id": "{{ctx.trigger.id}}",
- "trigger_name": "{{ctx.trigger.name}}",
- "severity": "{{ctx.trigger.severity}}",
- "period_start": "{{ctx.periodStart}}",
- "period_end": "{{ctx.periodEnd}}",
- "hit_count": "{{ctx.results.0.hits.total.value}}",
- "error": "{{ctx.error}}"
-}
-```
+ ```text
+ {
+ "monitor_id": "{{ctx.monitor._id}}",
+ "monitor_name": "{{ctx.monitor.name}}",
+ "trigger_id": "{{ctx.trigger.id}}",
+ "trigger_name": "{{ctx.trigger.name}}",
+ "severity": "{{ctx.trigger.severity}}",
+ "period_start": "{{ctx.periodStart}}",
+ "period_end": "{{ctx.periodEnd}}",
+ "hit_count": "{{ctx.results.0.hits.total.value}}",
+ "error": "{{ctx.error}}"
+ }
+ ```
5. Save the monitor
@@ -95,14 +94,12 @@ Triggers of per query and per cluster metrics monitors run their actions only wh
## Alert Key
----
Flashduty computes the Alert Key from the monitor ID and the trigger ID, which are `monitor_id` and `trigger_id` in the template. Every notification from the same trigger of the same monitor uses the same Alert Key and merges into one alert; different triggers and different monitors each get their own alert. Changes to the monitor name, trigger name, severity, hit count, or time period do not change the Alert Key. A notification with an empty `monitor_id` or `trigger_id` is rejected with an invalid-parameter error.
The template does not use `ctx.alert.id`: when a trigger runs its action for the first time, OpenSearch has not created the alert yet, so the variable is empty.
## Status and severity
----
The trigger's **Severity level** ranges from 1 (highest) to 5 (lowest). Flashduty maps it as follows:
@@ -116,7 +113,6 @@ The trigger's **Severity level** ranges from 1 (highest) to 5 (lowest). Flashdut
Every notification is a trigger. Flashduty never recovers an alert because of an OpenSearch notification; recovery comes from auto-close, or you can close the alert manually in Flashduty.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -129,7 +125,6 @@ Every notification is a trigger. Flashduty never recovers an alert because of an
| `error` | Error message when the trigger could not get results or evaluate its condition |
## Troubleshooting
----
- **Flashduty returns an invalid-parameter error**: make sure Message holds the complete template with values for both `monitor_id` and `trigger_id`, and that the URL is complete and includes `integration_key`
- **The notification fails in OpenSearch**: click **Send test message** on the channel in **Notifications → Channels** to see the error. Common causes are a cluster that cannot reach `api.flashcat.cloud` or a domain listed in `host_deny_list`
diff --git a/en/on-call/integration/alert-integration/alert-sources/openstatus.mdx b/en/on-call/integration/alert-integration/alert-sources/openstatus.mdx
index af0e063e..15af4e2b 100644
--- a/en/on-call/integration/alert-integration/alert-sources/openstatus.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/openstatus.mdx
@@ -1,5 +1,6 @@
---
title: "OpenStatus alert integration"
+sidebarTitle: "OpenStatus"
description: "Send OpenStatus monitor errors, degradations, and recoveries to Flashduty On-call through a Webhook notification channel."
keywords: ["alert integration", "OpenStatus", "webhook", "synthetic monitoring", "uptime monitoring"]
---
@@ -9,7 +10,6 @@ Use an OpenStatus Webhook notification channel to send monitor alerts to Flashdu
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure OpenStatus
----
@@ -65,7 +64,6 @@ OpenStatus sends an `error` notification only after at least half of the monitor
## Alert Key
----
Flashduty computes the Alert Key from `monitor.id` (the OpenStatus monitor ID). The `error`, `degraded`, and `recovered` notifications for a monitor carry the same `monitor.id`, so they land on the same alert: when the monitor goes from error to degraded, the alert is updated to Warning, and it closes when the monitor recovers.
@@ -76,7 +74,6 @@ Changes to the monitor name, URL, status code, latency, error message, or check
## Status and severity
----
| OpenStatus `status` | Flashduty handling | Severity |
| :--- | :--- | :--- |
@@ -88,14 +85,12 @@ Changes to the monitor name, URL, status code, latency, error message, or check
An empty or any other `status` is rejected so that a request whose state cannot be determined never lands in the wrong alert lifecycle.
## Alert content
----
- **Title**: the monitor name `monitor.name`, or `OpenStatus monitor ` when it is empty
- **Description**: `errorMessage`
- **Labels**: `check` (monitor name), `resource` (monitor URL `monitor.url`), `source` (always `openstatus`), `monitor_id`, `status`, `status_code`, `latency_ms`
## Troubleshooting
----
- **Send Test fails**: make sure **Webhook URL** is the full push URL and includes `integration_key`
- **Flashduty returns a parameter error**: make sure the request has `monitor.id` and `status`. This integration accepts only the JSON format of the OpenStatus Webhook channel
diff --git a/en/on-call/integration/alert-integration/alert-sources/opmanager.mdx b/en/on-call/integration/alert-integration/alert-sources/opmanager.mdx
index 077b4815..04852029 100644
--- a/en/on-call/integration/alert-integration/alert-sources/opmanager.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/opmanager.mdx
@@ -1,5 +1,6 @@
---
title: "OpManager Alert Events"
+sidebarTitle: "OpManager"
description: "Sync OpManager alert events to Flashduty via webhook for automated alert noise reduction"
---
@@ -8,50 +9,49 @@ Sync OpManager alert events to Flashduty via webhook for automated alert noise r
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this method when you don't need to route alerts to different channels - it's simpler.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a specific channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Select **OpManager** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this method when you need to route alerts to different channels based on the alert payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **OpManager** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In OpManager
----
-## I. OpManager Alert Push Configuration
1. Log in to your `OpManager` console, select `Settings => Notification Profiles` from the navigation menu
2. On the `Notifications` page, click `Add` and select `Invoke a Webhook` to add a configuration profile
-
+
3. Begin configuring specific content on the Webhook editing page
4. In `Hook URL`, select `POST` as the request method and fill in the **integration push URL** as the `URL`
@@ -106,11 +106,11 @@ Choose this method when you need to route alerts to different channels based on
7. Keep the `Request Headers` as default
8. Fill in any value between 1-300 for `Time Out` and click next
-
+
9. On the `Choose the criteria` configuration page, check `Notify when the alarm is cleared` and configure other options as needed
-
+
10. Select the devices you want to apply this configuration to, move them to the selected devices window using the right arrow, then click next
11. Configure Time Window/Delayed Trigger/Recurring Trigger as needed, then click next
@@ -118,7 +118,7 @@ Choose this method when you need to route alerts to different channels based on
-## II. Status Mapping
+## Status Mapping
diff --git a/en/on-call/integration/alert-integration/alert-sources/opnsense.mdx b/en/on-call/integration/alert-integration/alert-sources/opnsense.mdx
index b91d3a28..2b14e25c 100644
--- a/en/on-call/integration/alert-integration/alert-sources/opnsense.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/opnsense.mdx
@@ -1,5 +1,6 @@
---
title: "OPNsense alert integration"
+sidebarTitle: "OPNsense"
description: "OPNsense's Monit module sends service alerts by email; use a Flashduty email integration with rules to trigger and close OPNsense alerts."
keywords: ["alert integration", "OPNsense", "Monit", "firewall", "email"]
---
@@ -9,7 +10,6 @@ OPNsense monitors services with the **Monit** module (**Services → Monit**) an
## In Flashduty On-call
----
Get the integration email address in either of the two ways below. **In both cases choose the Email integration type**, not OPNsense.
@@ -30,20 +30,18 @@ Get the integration email address in either of the two ways below. **In both cas
## Configure OPNsense
----
1. **SMTP**: go to **Services → Monit → Settings**, enable Monit under **General Settings**, and enter the SMTP server address, port and credentials
2. **Recipient**: under **Alert Settings**, add an alert and set **Recipient** to the Flashduty email integration address
3. **Mail format**: in **Mail format** of that alert, enter the line below. The default subject has no host name and no fixed separator between service and event, so the rules could not extract a stable Alert Key from it; with this fixed format the rules can process every email
-```
-Subject: [$HOST] [$SERVICE] $EVENT
-```
+ ```
+ Subject: [$HOST] [$SERVICE] $EVENT
+ ```
4. **Recovery notifications**: Monit sends a recovery email in the same format when a service recovers. Leave **Not on** off so that every event, including recovery, is emailed
## Configure push rules in Flashduty
----
In the title `[$HOST] [$SERVICE] $EVENT`, `$HOST` and `$SERVICE` are the same in the failure email and the recovery email; only `$EVENT` differs. The rules use the first two parts as the Alert Key, so a recovery email closes the matching alert.
@@ -68,7 +66,6 @@ Regex: /^\[(.+?)\] \[(.+?)\] /
The close rule comes before the trigger rule. The Alert Key is the host name plus the service name, so repeated failures of the same service on the same host merge into one alert. The default rule discards mail that was not sent in the format above (for example from other alerts that have no **Mail format** set) so it does not create alerts that can never close on their own.
## Events in the email title
----
`$EVENT` is Monit's description of the event. Failures and recoveries come in pairs:
@@ -81,7 +78,6 @@ The close rule comes before the trigger rule. The Alert Key is the host name plu
| nonexist | `Does not exist` | `Exists` |
## Limitations
----
- **Type and severity**: in Flashduty these alerts show the Email integration type, and their severity is always Warning. You can adjust it with [alert pipelines](/en/on-call/integration/alert-integration/alert-pipelines) based on the title.
- **Other events**: Monit events not in the table above are handled as trigger alerts. If an event type has no matching recovery email, turn on the [auto-resolve timeout](/en/on-call/channel/create-edit) in the channel that receives this integration; 24 hours is a reasonable start.
diff --git a/en/on-call/integration/alert-integration/alert-sources/opsgenie.mdx b/en/on-call/integration/alert-integration/alert-sources/opsgenie.mdx
index 2b1cb913..4b688f5b 100644
--- a/en/on-call/integration/alert-integration/alert-sources/opsgenie.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/opsgenie.mdx
@@ -1,5 +1,6 @@
---
title: "Opsgenie Compatible Alert Integration"
+sidebarTitle: "Opsgenie Compatible"
description: "Push alerts to Flashduty On-call with the Opsgenie Alert API protocol. Tools that already send to Opsgenie only need a new API URL."
keywords: ["alert integration", "Opsgenie", "Alert API", "Alertmanager", "Grafana", "migration"]
---
@@ -9,7 +10,6 @@ Flashduty implements alert creation and closing from the Opsgenie Alert API, wit
## In Flashduty On-call
----
You can get the push URL in either of two ways.
@@ -30,7 +30,6 @@ You can get the push URL in either of two ways.
## Push URL
----
The push URL has this format, with `integration_key` as part of the path:
@@ -51,7 +50,6 @@ Supported endpoints:
A successful request returns HTTP 202 and `{"result": "Request will be processed", "took": 0, "requestId": "..."}`, the same as Opsgenie.
## Configure in Prometheus Alertmanager
----
Add `opsgenie_configs` to a receiver in `alertmanager.yml` and set `api_url` to the push URL:
@@ -75,7 +73,6 @@ receivers:
- The Update Message and Update Description requests sent with `update_alerts: true` are accepted and ignored; the title and description update with the next Create request
## Configure in Grafana
----
@@ -112,7 +109,6 @@ Grafana sends alert labels in `tags` as `key:value`, and Flashduty turns them ba
The contact point's **Test** button uses a new alias on every press, so each press opens a separate Warning alert in Flashduty that never recovers on its own. Close it by hand.
## Other tools
----
Any tool that lets you change the Opsgenie API URL and closes alerts by alias works with this integration: replace the API URL with the push URL (with or without `v2/alerts`, depending on how the tool appends paths), and send Close requests with `identifierType=alias`.
@@ -123,14 +119,12 @@ Not supported:
- **Aliases that contain `/`**: the alias is part of the URL path, so such requests match no endpoint
## Alert Key
----
The request's `alias` is the Alert Key. Opsgenie defines alias as the "client-defined identifier of the alert, that is also the key element of Alert De-Duplication" ([Alert API](https://docs.opsgenie.com/docs/alert-api#create-alert)). Create requests with the same alias merge into one alert, and a Close request recovers that alert by alias. Alertmanager and Grafana both use a hash of the alert group as the alias, which stays the same from trigger to recovery.
Without `alias`, every Create request opens a new alert that no Close request can recover.
## Field mapping
----
| Opsgenie field | In Flashduty |
| :--- | :--- |
@@ -146,7 +140,6 @@ Without `alias`, every Create request opens a new alert that no Close request ca
`responders`, `visibleTo`, `actions`, `user` and `note` are ignored; assignment and notifications follow the Flashduty channel's settings.
## Severity
----
| Opsgenie `priority` | Flashduty severity |
| :--- | :--- |
@@ -157,7 +150,6 @@ Without `alias`, every Create request opens a new alert that no Close request ca
Any other value returns 422. Recovery comes from the Close request, not from `priority`.
## Troubleshooting
----
- **404**: the Alertmanager `api_url` is missing the trailing `/`, or the Grafana Alert API URL is missing `/v2/alerts`
- **401**: the `integration_key` in the push URL is wrong, or the integration is disabled
diff --git a/en/on-call/integration/alert-integration/alert-sources/opsview.mdx b/en/on-call/integration/alert-integration/alert-sources/opsview.mdx
index bd067382..d3f5e5ba 100644
--- a/en/on-call/integration/alert-integration/alert-sources/opsview.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/opsview.mdx
@@ -1,5 +1,6 @@
---
title: "Opsview Alert Integration"
+sidebarTitle: "Opsview"
description: "Push Opsview host and service alerts to the Flashduty Standard Alert Event integration through a custom notification method script; recovery notifications close the alerts."
keywords: ["alert integration", "Opsview", "ITRS Opsview", "notification method", "custom notification", "standard alert event"]
---
@@ -9,7 +10,6 @@ Opsview supports custom notification methods: when it notifies, it runs the scri
## In Flashduty On-call
----
Get an integration push URL in either of the two ways below. **Choose the Standard Alert Event integration type** in both, not Opsview.
@@ -30,7 +30,6 @@ Get an integration push URL in either of the two ways below. **Choose the Standa
## Configure in Opsview
----
### Step 1: Create the notification script
@@ -136,14 +135,12 @@ Opsview notifications are driven by each user's Notification Profile, so every u
You can also create a shared profile under Shared Notification Profiles and assign it to several users.
## Recovery and deduplication
----
- A host or service always uses the same Alert Key, so repeated problem notifications (for example from Opsview's re-notification interval) only update the same alert, and the `RECOVERY` notification recovers it
- When a service goes from WARNING to CRITICAL, the severity is updated on the same alert
- Acknowledgement (`ACKNOWLEDGEMENT`), flapping (`FLAPPING*`) and downtime (`DOWNTIME*`) notifications are ignored by the script and produce no event in Flashduty
## Troubleshooting
----
- **No alert arrives**: confirm the Notification Profile selects `Flashduty` and **Apply Changes** was run; check in Opsview's **Notifications View** whether the notification was sent; test the script on its own with `test_notifications`
- **The test works but real alerts are not pushed**: in a real notification the script reads the environment variables Opsview passes; add `{ date; echo "Called with $@"; env; echo; } >> /tmp/env.txt` to the top of the script (the debugging method given in the Opsview documentation) to see what it actually receives
diff --git a/en/on-call/integration/alert-integration/alert-sources/ossec.mdx b/en/on-call/integration/alert-integration/alert-sources/ossec.mdx
index 9bcdd65a..4a19121c 100644
--- a/en/on-call/integration/alert-integration/alert-sources/ossec.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/ossec.mdx
@@ -1,5 +1,6 @@
---
title: "OSSEC Alert Integration"
+sidebarTitle: "OSSEC"
description: "OSSEC sends alert notifications by email. Use the Flashduty Email integration to bring OSSEC alerts into Flashduty On-call."
keywords: ["alert integration", "OSSEC", "OSSEC HIDS", "HIDS", "intrusion detection", "email", "security alerts"]
---
@@ -9,7 +10,6 @@ The OSSEC server (ossec-maild) can send alerts by email to the recipients you co
## In Flashduty On-call
----
You can get the integration email address in either of the two ways below. **Choose Email as the integration type** in both cases, not OSSEC.
@@ -30,7 +30,6 @@ You can get the integration email address in either of the two ways below. **Cho
## Configure the push mode in Flashduty
----
OSSEC sends one email when an alert is generated and never sends a recovery email, so no "close alert" rule is needed. Set **Push Mode** to **Trigger or Update Alert Based on Email Subject**: emails with the same title (same host, same log source, same level, same rule description) are merged into the one open alert, and emails with different titles each create a separate alert.
@@ -39,7 +38,6 @@ The title format is described in [Email subject format](#email-subject-format).
OSSEC does not send recovery notifications. Enable [auto-resolve timeout](/en/on-call/channel/create-edit) on the channel that receives this integration, with a suggested window of 24 hours, or close alerts manually once handled.
## Configure OSSEC
----
All configuration below is done in `/var/ossec/etc/ossec.conf` on the OSSEC server. Agents need no configuration because alerts are generated only on the server.
@@ -110,7 +108,6 @@ By default OSSEC batches alerts that arrive close together into a single email,
## Email subject format
----
OSSEC emails use the full subject by default (internal option `maild.full_subject=0`, the default value):
@@ -129,7 +126,6 @@ The location is "(agent name) agent IP", or the server name for alerts from the
The email body starts with `OSSEC HIDS Notification.`, followed by the alert time, `Received From` (the alert source), `Rule: fired (level ) -> ""`, the source IP / user when present, and the triggering log excerpt (`Portion of the log(s)`). In Flashduty, the alert title is the email subject and the description is the email body.
## Limitations
----
- **No recovery**: an OSSEC alert is a one-time event. Alerts in Flashduty do not resolve automatically; rely on [auto-resolve timeout](/en/on-call/channel/create-edit) or close them manually.
- **Severity**: the Email integration sets every alert to Warning. The subject carries the OSSEC level (`Level N`), so you can adjust severity by level with an [Alert Pipeline](/en/on-call/integration/alert-integration/alert-pipelines).
diff --git a/en/on-call/integration/alert-integration/alert-sources/pagerduty.mdx b/en/on-call/integration/alert-integration/alert-sources/pagerduty.mdx
index e454952d..4ae1ac36 100644
--- a/en/on-call/integration/alert-integration/alert-sources/pagerduty.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/pagerduty.mdx
@@ -1,5 +1,6 @@
---
title: "PagerDuty Compatible Integration"
+sidebarTitle: "PagerDuty Compatible"
description: "Flashduty implements the PagerDuty Events API v1/v2. Tools that already send to PagerDuty send alerts to Flashduty after you change the push URL."
keywords: ["alert integration", "PagerDuty", "PagerDuty Compatible", "Events API v2", "routing_key"]
---
@@ -11,42 +12,42 @@ Similarly, for alert systems that already support pushing events to PagerDuty (s
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this simpler option when you don't need to route alert events to different channels.
-
- Expand
+
+
1. Go to the Flashduty console, select **channel**, and enter a specific channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **PagerDuty Compatible** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **PagerDuty Compatible** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In your alerting system
----
### Request URL
```
@@ -97,17 +98,17 @@ Using [ElastAlert2](https://github.com/jertel/elastalert2) as an example:
1. Step 1: Obtain Push URL
-Enter integration name on the current page and save. Reopen integration details and copy the push URL, such as:
+ Enter integration name on the current page and save. Reopen integration details and copy the push URL, such as:
-```
-{api_host}/event/push/alert/pagerduty?integration_key=xxx
-```
+ ```
+ {api_host}/event/push/alert/pagerduty?integration_key=xxx
+ ```
2. Step 2: Modify Push URL
-Modify the corresponding source code of your deployed ElastAlert instance, [view diff](https://github.com/jertel/elastalert2/commit/e815a62a6b1eecef6e1fef13afd99d905b67fc34):
+ Modify the corresponding source code of your deployed ElastAlert instance, [view diff](https://github.com/jertel/elastalert2/commit/e815a62a6b1eecef6e1fef13afd99d905b67fc34):
-
+
3. Step 3: Report Alert Events
diff --git a/en/on-call/integration/alert-integration/alert-sources/pandora-fms.mdx b/en/on-call/integration/alert-integration/alert-sources/pandora-fms.mdx
index f262f6bb..a0d988c2 100644
--- a/en/on-call/integration/alert-integration/alert-sources/pandora-fms.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/pandora-fms.mdx
@@ -1,5 +1,6 @@
---
title: "Pandora FMS alert integration"
+sidebarTitle: "Pandora FMS"
description: "Send Pandora FMS module alert triggers and recoveries to Flashduty On-call through a custom alert command."
keywords: ["alert integration", "Pandora FMS", "Alert command", "Alert recovery", "_id_alert_", "curl"]
---
@@ -9,7 +10,6 @@ Use a custom Pandora FMS alert command to send module alert triggers and recover
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure Pandora FMS
----
Pandora FMS alert actions run a command on the Pandora FMS server. The steps below create an alert command that pushes with `curl`, create an action that uses the command, and then add the action to module alerts.
@@ -45,16 +44,16 @@ The Pandora FMS server that executes alerts needs `curl` installed and HTTPS acc
2. Set **Name** to `Flashduty`
3. Set **Command** to the command below. Keep it on one line and do not rename the fields:
-```text
-curl -sS -m 10 "_field1_" --data-urlencode "event=_field2_" --data-urlencode "id_alert=_id_alert_" --data-urlencode "alert_name=_alert_name_" --data-urlencode "alert_priority=_alert_priority_" --data-urlencode "alert_times_fired=_alert_times_fired_" --data-urlencode "agent=_agent_" --data-urlencode "id_agent=_id_agent_" --data-urlencode "address=_address_" --data-urlencode "agent_group=_agentgroup_" --data-urlencode "module=_module_" --data-urlencode "id_module=_id_module_" --data-urlencode "module_description=_moduledescription_" --data-urlencode "module_status=_modulestatus_" --data-urlencode "data=_data_" --data-urlencode "timestamp=_timestamp_"
-```
+ ```text
+ curl -sS -m 10 "_field1_" --data-urlencode "event=_field2_" --data-urlencode "id_alert=_id_alert_" --data-urlencode "alert_name=_alert_name_" --data-urlencode "alert_priority=_alert_priority_" --data-urlencode "alert_times_fired=_alert_times_fired_" --data-urlencode "agent=_agent_" --data-urlencode "id_agent=_id_agent_" --data-urlencode "address=_address_" --data-urlencode "agent_group=_agentgroup_" --data-urlencode "module=_module_" --data-urlencode "id_module=_id_module_" --data-urlencode "module_description=_moduledescription_" --data-urlencode "module_status=_modulestatus_" --data-urlencode "data=_data_" --data-urlencode "timestamp=_timestamp_"
+ ```
4. Fill in the field descriptions and values as follows:
-| Field | Description | Values |
-| :--- | :--- | :--- |
-| **Field 1** | `Flashduty push URL` | Leave empty |
-| **Field 2** | `Event` | `alert_fired,Alert fired;alert_recovered,Alert recovered` |
+ | Field | Description | Values |
+ | :--- | :--- | :--- |
+ | **Field 1** | `Flashduty push URL` | Leave empty |
+ | **Field 2** | `Event` | `alert_fired,Alert fired;alert_recovered,Alert recovered` |
5. Click **Create** to save
@@ -68,10 +67,10 @@ Every macro sits inside double quotes. Pandora FMS shell-quotes the value when i
2. Set **Name** to `Flashduty`, set **Group** to the groups that should use the action (**All** for every group), and set **Command** to the `Flashduty` command from the previous step
3. Fill in the fields as follows. Fill in both the **Triggering** and **Recovery** columns:
-| Field | Triggering | Recovery |
-| :--- | :--- | :--- |
-| **Field 1** (Flashduty push URL) | The full push URL of the Flashduty integration | The full push URL of the Flashduty integration |
-| **Field 2** (Event) | `Alert fired` (`alert_fired`) | `Alert recovered` (`alert_recovered`) |
+ | Field | Triggering | Recovery |
+ | :--- | :--- | :--- |
+ | **Field 1** (Flashduty push URL) | The full push URL of the Flashduty integration | The full push URL of the Flashduty integration |
+ | **Field 2** (Event) | `Alert fired` (`alert_fired`) | `Alert recovered` (`alert_recovered`) |
4. Click **Create** to save
@@ -105,7 +104,6 @@ The action's **Field 2** must be `alert_recovered` in the **Recovery** column. I
## Pushed content
----
The command POSTs the following fields as an `application/x-www-form-urlencoded` form:
@@ -130,7 +128,6 @@ The command POSTs the following fields as an `application/x-www-form-urlencoded`
The alert title is `: / `. When some fields are missing the rest are used, and when all are empty the title is `Pandora FMS alert `.
## Alert Key
----
Flashduty uses `id_alert` (the Pandora FMS macro `_id_alert_`) as the Alert Key. The Pandora FMS documentation describes this macro as "Alert identifier, useful for correlating the alert in third-party tools": it is the ID of the module alert created when a template is assigned to a module. The trigger, repeated firings, and recovery of one module alert carry the same ID, so they land on the same Flashduty alert. One template assigned to two modules makes two module alerts with different IDs, which produce different Flashduty alerts. Changing the template name, priority, agent alias, or data does not change the Alert Key.
@@ -139,7 +136,6 @@ Module alert IDs are unique only within one Pandora FMS installation. Use a sepa
Only module alerts carry `_id_alert_`. Event alerts, log alerts, and correlated alerts have no module alert ID and Flashduty rejects them as a parameter error, so do not add the `Flashduty` action to them.
## Status and severity
----
`event` decides whether the alert triggers or recovers, and `alert_priority` (the alert template's **Priority**) decides the severity:
@@ -155,7 +151,6 @@ Only module alerts carry `_id_alert_`. Event alerts, log alerts, and correlated
When `event` is `alert_recovered` the alert recovers, and its severity still comes from the template priority. Requests with an empty or any other `event` are rejected, so a request whose state cannot be determined never enters the wrong alert lifecycle.
## FAQ
----
@@ -184,7 +179,6 @@ Check, in order: the alert template has **Alert recovery** enabled; the action's
## Troubleshooting
----
- **Pandora FMS does not push**: run `curl -sS ` on the Pandora FMS server to confirm the network path, and make sure the action's **Group** covers the agent's group
- **Flashduty returns a parameter error**: make sure the command is pasted in full on one line, the action's **Field 2** is `alert_fired` and `alert_recovered` in the two columns, and the action is only added to module alerts
diff --git a/en/on-call/integration/alert-integration/alert-sources/panther.mdx b/en/on-call/integration/alert-integration/alert-sources/panther.mdx
index 5d6e18ac..aeb29fe3 100644
--- a/en/on-call/integration/alert-integration/alert-sources/panther.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/panther.mdx
@@ -1,5 +1,6 @@
---
title: "Panther alert integration"
+sidebarTitle: "Panther"
description: "Send Panther detection alerts to Flashduty On-call through a Panther Custom Webhook alert destination."
keywords: ["alert integration", "Panther", "webhook", "SIEM", "security alerts", "detection"]
---
@@ -9,7 +10,6 @@ Use a Panther Custom Webhook alert destination to send alerts from rules, polici
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## In Panther
----
@@ -69,14 +68,12 @@ Wait for a detection to match (or re-dispatch an alert from its details page in
## Alert Key
----
Flashduty uses the `alertId` field of the body as the Alert Key. Panther describes it as "Identifier of the alert in Panther Backend". Manually re-sending the same Panther alert from its details page lands on the same Flashduty alert.
Changes to the title, severity or description do not change the Alert Key. A request without `alertId` returns a parameter error.
## Status and severity
----
The Panther Custom Webhook has no status field, so every delivery is a trigger event.
@@ -90,7 +87,6 @@ The Panther Custom Webhook has no status field, so every delivery is a trigger e
Alert labels carry the detection name, detection ID (`id`), alert ID, alert type, raw severity, alert link and `tags`. `alertContext` is defined by the detection author and may hold raw log fields, so it is not copied into the alert; `runbook` is not copied either.
## Troubleshooting
----
- **Panther shows a delivery failure**: confirm the push URL is complete and includes `integration_key`; Panther retries up to 10 times when Flashduty returns a non-`2XX` response
- **No alert arrives**: confirm the destination's **Severity Levels**, **Default Alert Types** and **Log Types** cover the alert, and check the detection's destination routing
diff --git a/en/on-call/integration/alert-integration/alert-sources/papertrail.mdx b/en/on-call/integration/alert-integration/alert-sources/papertrail.mdx
index 17d1b4cb..d54b55db 100644
--- a/en/on-call/integration/alert-integration/alert-sources/papertrail.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/papertrail.mdx
@@ -1,5 +1,6 @@
---
title: "Papertrail alert integration"
+sidebarTitle: "Papertrail"
description: "Sync log lines matched by a Papertrail saved search to Flashduty On-call through a webhook."
keywords: ["alert integration", "Papertrail", "SolarWinds", "saved search", "webhook", "log alert"]
---
@@ -13,7 +14,6 @@ Papertrail (SolarWinds' log aggregation service) uses a **saved search** to desc
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -34,7 +34,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Papertrail
----
@@ -67,7 +66,6 @@ Papertrail's own documentation mentions no test-delivery button for webhooks. Le
## Payload
----
Flashduty parses the request in Papertrail's own fixed format: the body is `application/x-www-form-urlencoded` with a single form field `payload`, whose value is a JSON hash:
@@ -108,7 +106,6 @@ Flashduty parses the request in Papertrail's own fixed format: the body is `appl
| `counts[]` ("Send only counts" mode) | Per-source counts with no individual log lines or IDs | Not supported. Flashduty rejects the request; turn this setting off in Papertrail |
## Alert Key
----
Flashduty uses `saved_search.id` alone as the Alert Key. It is the saved search's stable identifier, unchanged across every delivery for that search, so repeated matches for the same saved search keep merging into the same alert, treated as the same problem still happening. Different saved searches produce different Alert Keys and open separate alerts.
@@ -117,12 +114,10 @@ Flashduty uses `saved_search.id` alone as the Alert Key. It is the saved search'
Deliveries missing `saved_search.id` are rejected.
## Severity
----
A Papertrail saved-search alert has no severity field, so every match triggers a **Warning** alert. The `severity` on each individual log line (such as `Info` or `Error`) is that line's own syslog level, and one delivery can mix several values; it does not represent the alert's urgency, and only shows up in the log lines quoted in the alert description.
## FAQ
----
diff --git a/en/on-call/integration/alert-integration/alert-sources/peekaping.mdx b/en/on-call/integration/alert-integration/alert-sources/peekaping.mdx
index 451849af..f5f6f2a9 100644
--- a/en/on-call/integration/alert-integration/alert-sources/peekaping.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/peekaping.mdx
@@ -1,5 +1,6 @@
---
title: "Peekaping Alert Integration"
+sidebarTitle: "Peekaping"
description: "Sync Peekaping monitor down and recovery events to Flashduty On-call through a Webhook notification channel."
keywords: ["alert integration", "Peekaping", "Webhook", "uptime monitoring", "monitoring", "self-hosted"]
---
@@ -9,7 +10,6 @@ Peekaping is an open-source, self-hosted monitoring system. With a Peekaping Web
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## In Peekaping
----
You need Peekaping 0.0.46 or later and an account that can manage notification channels and monitors. The Peekaping server must be able to reach the Flashduty push URL.
@@ -60,14 +59,12 @@ You need Peekaping 0.0.46 or later and an account that can manage notification c
## Alert Key
----
Flashduty uses `monitor.id` from the request as the Alert Key. A monitor sends the same `monitor.id` when it goes down and when it recovers, so the recovery closes the matching alert. `heartbeat.id` differs on every heartbeat and is not part of the Alert Key.
Changes to the monitor name, status message, or time do not change the Alert Key. A request without `monitor.id` is rejected. `monitor.id` is unique only within one Peekaping instance, so point one Flashduty integration at a single Peekaping instance.
## Status and severity
----
| `heartbeat.status` | Meaning | Flashduty handling |
| :--- | :--- | :--- |
@@ -79,7 +76,6 @@ Changes to the monitor name, status message, or time do not change the Alert Key
Peekaping has no severity of its own, so every down event maps to Critical. The alert title is the monitor name and the description is the heartbeat message (for example `TCP connection failed: ...`).
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -91,7 +87,6 @@ Peekaping has no severity of its own, so every down event maps to Critical. The
The monitor `config` (which holds hosts and credentials) and `push_token` never reach labels or the description.
## Troubleshooting
----
- **Flashduty returns an invalid-parameter error**: confirm the URL is complete and includes `integration_key`, and that the channel's **Request Body** is `application/json`; the response names the missing field
- **The Peekaping test fails**: confirm the Peekaping server can reach the Flashduty push URL, and check the Peekaping log for the HTTP status code
diff --git a/en/on-call/integration/alert-integration/alert-sources/pgdash.mdx b/en/on-call/integration/alert-integration/alert-sources/pgdash.mdx
index 776fcf04..cf5a66e7 100644
--- a/en/on-call/integration/alert-integration/alert-sources/pgdash.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/pgdash.mdx
@@ -1,5 +1,6 @@
---
title: "pgDash alert integration"
+sidebarTitle: "pgDash"
description: "Send pgDash PostgreSQL monitoring alerts to Flashduty On-call through webhooks."
keywords: ["alert integration", "pgDash", "PostgreSQL", "database monitoring", "webhook"]
---
@@ -9,7 +10,6 @@ Use pgDash webhook notifications to send PostgreSQL monitoring alerts to Flashdu
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure pgDash
----
The setup is the same for pgDash SaaS and self-hosted pgDash. Webhooks require pgDash 2.4.11 or later.
@@ -60,7 +59,6 @@ Enter this push URL only on the **Alerts** page. Notifications from the **Change
## Alert lifecycle
----
pgDash webhooks are edge-triggered: a notification is sent only when the alert status of a server changes, and each notification carries every current alert item of that server (the `alerts` array). When all alerts clear, pgDash sends one notification with an empty `alerts` array.
@@ -76,7 +74,6 @@ Renaming a server in pgDash produces a new Alert Key. Close alerts under the old
## Severity
----
| pgDash alert items | Flashduty severity |
| :--- | :--- |
@@ -85,14 +82,12 @@ Renaming a server in pgDash produces a new Alert Key. Close alerts under the old
| `alerts` is empty | Recovered |
## Alert content
----
- **Title**: `server name: rule description`, taken from the first `crit` item (or the first item if none is critical). `(+N more)` is appended when there are several items
- **Description**: the pgmetrics report time (UTC) and, for each alert item, its type, rule description, current value, object name, and link. Query-level alerts include the SQL text (truncated to 500 characters). Up to 50 items are listed
- **Labels**: `server`, `check` (rule description of the item used in the title), `resource` (that item's object name), `link` (that item's pgDash link), `alert_count` (number of current alert items), `source` (always `pgdash`)
## Troubleshooting
----
- **pgDash sends nothing**: pgDash notifies only when the alert status changes and does not repeat an unchanged state. Check that an alert rule has fired and that the webhook is set on the **Alerts** page, not the **Change Alerts** page
- **Delivery times out**: pgDash expects a response within 3 seconds and retries at most 3 times on timeout. For self-hosted pgDash, make sure the pgDash server can reach the push URL
diff --git a/en/on-call/integration/alert-integration/alert-sources/phare.mdx b/en/on-call/integration/alert-integration/alert-sources/phare.mdx
index 22809427..91731e30 100644
--- a/en/on-call/integration/alert-integration/alert-sources/phare.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/phare.mdx
@@ -1,5 +1,6 @@
---
title: "Phare Uptime alert integration"
+sidebarTitle: "Phare Uptime"
description: "Send Phare Uptime incident created and recovered events to Flashduty On-call through an outgoing webhook."
keywords: ["alert integration", "Phare", "Phare Uptime", "outgoing webhook", "incident", "uptime"]
---
@@ -9,14 +10,12 @@ Use a Phare outgoing webhook to send Uptime incidents to Flashduty On-call. Crea
## In Flashduty On-call
----
Create either a dedicated or shared **Phare** alert integration and copy its complete Push URL.
## Configure Phare
----
A Phare webhook body is written by you from placeholders, so the template below is the one to paste. Flashduty parses exactly this template.
@@ -87,12 +86,10 @@ Make a monitored target actually fail and confirm Flashduty receives an active a
## Alert Key
----
Flashduty uses `incident.id` as the Alert Key. Phare's created, propagated, partially recovered, and recovered events all expose the same incident entity, and `{{ incident.id }}` is that incident's number, so every notification for one incident gets the same Alert Key. Changes to the title, description, state, impact, or affected monitors do not change it.
## Status and severity
----
The event type comes from the `X-Phare-Request-Event` header:
@@ -115,7 +112,6 @@ Severity comes from `incident.impact`:
An incident is created when a monitor check fails, so an unknown impact is treated as Critical. A recovery event keeps the severity that `impact` maps to and sets the status to recovered.
## Troubleshooting
----
- **Flashduty returns an invalid-parameter error**: confirm the template is valid JSON, `incident.id` is not empty, and the request carries `X-Phare-Request-Event` or an `event` field
- **The alert does not recover**: confirm an **Incident recovered** rule exists and uses the same template
diff --git a/en/on-call/integration/alert-integration/alert-sources/pingdom.mdx b/en/on-call/integration/alert-integration/alert-sources/pingdom.mdx
index d0d9226c..ee962539 100644
--- a/en/on-call/integration/alert-integration/alert-sources/pingdom.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/pingdom.mdx
@@ -1,5 +1,6 @@
---
title: "Pingdom alert integration"
+sidebarTitle: "Pingdom"
description: "Send Pingdom uptime check and transaction check state changes to Flashduty On-call through a webhook."
keywords: ["alert integration", "Pingdom", "SolarWinds", "uptime", "transaction", "webhook"]
---
@@ -9,7 +10,6 @@ Use Pingdom state change webhooks to send uptime check and transaction check ale
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure Pingdom
----
@@ -68,14 +67,12 @@ When the SolarWinds APM Integrated Experience is enabled, Pingdom menus may be i
## Alert Key
----
Flashduty computes the Alert Key from the check family (uptime or transaction) and `check_id`. The failure and recovery webhooks of one check carry the same `check_id`, so they land on the same alert. Uptime checks and transaction checks are separate check lists in Pingdom; including the family keeps them apart even when their numeric IDs are equal.
Changes to the check name, `importance_level`, state, timestamps, error description, or probe locations do not change the Alert Key. A request without `check_id` is rejected, because its recovery could not be matched.
## Status and severity
----
| Pingdom `current_state` | Flashduty status |
| :--- | :--- |
@@ -97,7 +94,6 @@ Severity comes from the check's `importance_level`:
A recovery keeps the alert's original severity.
## Alert content
----
- **Title**: the check name, `check_name`
- **Description**: `long_description`, or `description` when it is empty
@@ -106,7 +102,6 @@ A recovery keeps the alert's original severity.
Request headers and authentication settings in `check_params` are not stored as labels.
## Troubleshooting
----
- **Pingdom receives a non-2xx response**: verify that the URL is the full Push URL and includes `integration_key`
- **Flashduty reports an invalid parameter**: verify that the request has `check_id` and `current_state`
diff --git a/en/on-call/integration/alert-integration/alert-sources/postman.mdx b/en/on-call/integration/alert-integration/alert-sources/postman.mdx
index a128cce6..ff580236 100644
--- a/en/on-call/integration/alert-integration/alert-sources/postman.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/postman.mdx
@@ -1,5 +1,6 @@
---
title: "Postman Alert Integration"
+sidebarTitle: "Postman"
description: "Send Postman Monitor run results to Flashduty On-call through a Postman custom webhook."
keywords: ["alert integration", "Postman", "Monitor", "webhook", "API monitoring", "API testing"]
---
@@ -9,7 +10,6 @@ Use the Postman webhook integration "Post monitoring results" to send the result
## In Flashduty On-call
----
Get the push URL in either of the following ways.
@@ -30,7 +30,6 @@ Get the push URL in either of the following ways.
## In Postman
----
@@ -43,7 +42,7 @@ Get the push URL in either of the following ways.
- **Notify for all completed monitor runs** (choose this one): every run is sent. A failing run triggers the alert and a passing run recovers it
- **Notify for 3 failures and then first success**: Postman describes this only by the option name and does not say which runs are sent, so a passing run may not be delivered when you need it, the alert may never recover, and it triggers later
-The Postman payload has no status field and Flashduty recovers an alert from a passing run, so recovery works reliably only with **Notify for all completed monitor runs**.
+ The Postman payload has no status field and Flashduty recovers an alert from a passing run, so recovery works reliably only with **Notify for all completed monitor runs**.
6. Click **Add Integration**
Add one webhook integration per Monitor.
@@ -62,12 +61,10 @@ The Postman documentation does not describe a test delivery for this webhook.
## Alert Key
----
Flashduty uses `monitor_uid` (the Monitor's unique ID) as the Alert Key, so failure and recovery deliveries for the same Monitor share one key. Changing the Monitor name, test counts or latency does not change it. A request without `monitor_uid` is rejected.
## Status and severity
----
The Postman payload has no status field, so Flashduty reads the run result from the counts in `metrics`:
@@ -80,7 +77,6 @@ The Postman payload has no status field, so Flashduty reads the run result from
A request without the `metrics` object, or with `errorCount` or `failedTestCount` missing or not a non-negative integer, is rejected and is never treated as a passing run. A passing run for a Monitor with no active alert creates no new alert.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -96,7 +92,6 @@ A request without the `metrics` object, or with `errorCount` or `failedTestCount
The user who triggered the run (`user_id`, `user_name`) is not written to labels.
## Troubleshooting
----
- **Flashduty returns an invalid parameter error**: check that the URL is complete and includes `integration_key`
- **The alert does not recover**: confirm that the Monitor later has a run with every test passing and no request errors. make sure the notification mode is **Notify for all completed monitor runs**
diff --git a/en/on-call/integration/alert-integration/alert-sources/powerjob.mdx b/en/on-call/integration/alert-integration/alert-sources/powerjob.mdx
index 7538d237..9f2a6e94 100644
--- a/en/on-call/integration/alert-integration/alert-sources/powerjob.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/powerjob.mdx
@@ -1,5 +1,6 @@
---
title: "PowerJob alert integration"
+sidebarTitle: "PowerJob"
description: "Send failed job instances and failed workflow instances from PowerJob to Flashduty On-call through a user WebHook alarm."
keywords: ["alert integration", "PowerJob", "scheduled jobs", "workflow", "webhook", "job scheduling"]
---
@@ -11,7 +12,6 @@ PowerJob alarms only on failure and sends nothing when a run succeeds, so the al
## In Flashduty On-call
----
You can get the push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can get the push URL in either of the following ways.
## In PowerJob
----
PowerJob sends alarms to users: first set a WebHook address on a user, then select that user on the job or workflow. This integration is verified against PowerJob 5.1.7.
@@ -63,14 +62,12 @@ PowerJob has no test button. Make a job fail, for example with the built-in `Sta
## Alerts do not recover
----
PowerJob sends no recovery notification, and it does not alarm when a job later succeeds. In the channel that receives this integration, turn on [auto-close](/en/on-call/channel/create-edit). We suggest 12 hours; adjust to how quickly your team handles failed jobs.
Each failed run is a separate alert. A job that is scheduled often (for example every minute) and keeps failing creates many alerts; use Flashduty alert grouping to reduce the noise.
## Job failures and workflow failures
----
The integration tells the two alarms apart by their content:
@@ -82,7 +79,6 @@ If a job inside a workflow fails and that job also has notified users, PowerJob
The alert description contains the execution `result` reported by PowerJob (cut at 1000 bytes). Job parameters, instance parameters, and the processor info (for example the body of a shell script) may hold secrets, so Flashduty does not read those fields.
## Alert Key
----
| Alarm type | Alert Key |
| :--- | :--- |
@@ -94,12 +90,10 @@ Every run has a new instance ID, so each failure is a new alert and the same run
Instance IDs are long integers above 2^53; Flashduty keeps every digit of the original text.
## Status and severity
----
PowerJob alarms carry no severity field and are sent only on failure, so every alert is in the triggered state with Critical severity.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -114,7 +108,6 @@ PowerJob alarms carry no severity field and are sent only on failure, so every a
| `task_tracker_address` | Address of the TaskTracker that ran the job (job failure) |
## Troubleshooting
----
- **Flashduty receives no event**: confirm the failed job or workflow has notified users selected and that user has a WebHook; confirm the PowerJob server can reach Flashduty and that the push URL is complete with `integration_key`. When delivery fails, PowerJob only logs `[WebHookAlarmService] invoke webhook ... failed` on the server and does not retry
- **Flashduty returns an invalid-parameter error**: the request lacks the fields listed under Alert Key, or it is not a PowerJob JSON alarm
diff --git a/en/on-call/integration/alert-integration/alert-sources/projectdiscovery.mdx b/en/on-call/integration/alert-integration/alert-sources/projectdiscovery.mdx
index 54b46b50..fb2c18e9 100644
--- a/en/on-call/integration/alert-integration/alert-sources/projectdiscovery.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/projectdiscovery.mdx
@@ -1,5 +1,6 @@
---
title: "ProjectDiscovery Cloud alert integration"
+sidebarTitle: "ProjectDiscovery Cloud"
description: "Send new vulnerabilities found by rescans, and failed scans and asset discoveries, from ProjectDiscovery Cloud webhook alerting to Flashduty On-call."
keywords: ["alert integration", "ProjectDiscovery", "Nuclei", "vulnerability scanning", "asset discovery", "webhook", "scan_id"]
---
@@ -11,7 +12,6 @@ ProjectDiscovery sends no "fixed" or "resolved" notification, so these alerts do
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can get the integration push URL in either of the following ways.
## In ProjectDiscovery Cloud
----
@@ -62,7 +61,6 @@ Clicking **Verify** when you create the webhook sends `{"type":"verify","message
## Payload
----
ProjectDiscovery POSTs notifications as `application/json`, and Flashduty parses them directly with no template. Scan notifications carry `scan_name` and `scan_id`; asset discovery notifications carry `enumeration_name` and `enumeration_id`.
@@ -81,14 +79,12 @@ ProjectDiscovery POSTs notifications as `application/json`, and Flashduty parses
Alert title: `: new vulnerabilities` for new vulnerabilities, ` failed` for failures.
## Alert Key
----
Flashduty uses `scan_id` (`enumeration_id` for asset discovery) as the Alert Key. ProjectDiscovery documents it as the unique identifier of the execution. Notifications with the same ID merge into one alert, and different scans or discoveries create different alerts. Changing the name, counts or time does not change the Alert Key.
If a new-vulnerability or failure notification has no matching ID, Flashduty returns a parameter error naming the missing field.
## Status and severity
----
| ProjectDiscovery event | Flashduty severity |
| :--- | :--- |
@@ -101,17 +97,14 @@ If a new-vulnerability or failure notification has no matching ID, Flashduty ret
For `new_vuln`, the highest severity in `rescan_vulns_list` decides; when the list is empty, the highest bucket of `severity_breakdown` with a count above 0 is used. A failed scan is a coverage gap rather than an outage, so it is a Warning.
## Auto-close
----
ProjectDiscovery sends no recovery notification, so these alerts stay active. Turn on [auto-close](/en/on-call/channel/create-edit) in the channel that receives them, with a suggested duration of 24 hours; adjust it to your scan frequency.
## About signatures
----
The ProjectDiscovery webhook supports an optional custom authentication header. Flashduty does not verify it and relies on the `integration_key` in the push URL, so keep the push URL secret.
## FAQ
----
@@ -134,7 +127,6 @@ ProjectDiscovery sends `new_vuln` only for rescans, so the results of a first sc
## Troubleshooting
----
- **ProjectDiscovery reports a failed delivery**: check that the Webhook URL is the full HTTPS push URL including `integration_key`
- **Flashduty returns a parameter error**: check that the body is a ProjectDiscovery JSON notification and that `new_vuln` and `failed_stopped` carry `scan_id` or `enumeration_id`
diff --git a/en/on-call/integration/alert-integration/alert-sources/prometheus.mdx b/en/on-call/integration/alert-integration/alert-sources/prometheus.mdx
index 7f0b6b28..aa48d1da 100644
--- a/en/on-call/integration/alert-integration/alert-sources/prometheus.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/prometheus.mdx
@@ -1,5 +1,6 @@
---
title: "Prometheus Integration Guide"
+sidebarTitle: "Prometheus"
description: "Push Prometheus alert events to Flashduty through AlertManager using webhooks. When an alert is triggered, it sends a trigger event to Flashduty, and when the alert recovers, it sends a recovery event."
---
@@ -8,7 +9,6 @@ Push Prometheus alert events to Flashduty through AlertManager using webhooks. W
## Requirements
----
### In AlertManager
@@ -16,12 +16,10 @@ Push Prometheus alert events to Flashduty through AlertManager using webhooks. W
- Your AlertManager server must be able to access api.flashcat.cloud domain to push alerts to the internet.
## Supported Versions
----
This guide is compatible with **Alertmanager 0.16.0 and above**.
## Setup Steps
----
### In Flashduty
@@ -31,31 +29,33 @@ You can obtain an integration push URL through either of these two methods:
Choose this method when you don't need to route alert events to different channels. It's simpler.
-
- Expand
+
+
1. Go to the Flashduty console, select **channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration**, and enter the integration page
3. Select **Prometheus** integration, click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
#### Using Shared Integration
Choose this method when you need to route alert events to different channels based on the alert payload.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Prometheus** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
### In AlertManager
@@ -159,7 +159,6 @@ VMP's `alertname` label is the alert rule's UUID, so the default alert title is
## Severity Mapping
----
The system extracts `severity`, `priority`, and `level` from alert event labels in that order. The corresponding value will be used as Prometheus's own alert severity. If none are found, it reads VMP's `internal_label_alert_level` label: `P0` maps to Critical, `P1` to Warning, and `P2` to Info. If that is also missing, the system sets the Prometheus alert severity to `Warning`.
@@ -177,7 +176,6 @@ Prometheus to Flashduty severity mapping:
| ok | Ok | Ok |
## FAQ
----
Why am I not receiving alerts in Flashduty?
diff --git a/en/on-call/integration/alert-integration/alert-sources/prtg.mdx b/en/on-call/integration/alert-integration/alert-sources/prtg.mdx
index 40ebadc2..c6829fcc 100644
--- a/en/on-call/integration/alert-integration/alert-sources/prtg.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/prtg.mdx
@@ -1,5 +1,6 @@
---
title: "PRTG alert integration"
+sidebarTitle: "PRTG"
description: "Send PRTG Network Monitor sensor alerts and recoveries to Flashduty On-call through Execute HTTP Action notification templates."
keywords: ["alert integration", "PRTG", "Paessler", "PRTG Network Monitor", "PRTG Hosted Monitor", "Execute HTTP Action", "notification template", "sensorid"]
---
@@ -9,7 +10,6 @@ Use the **Execute HTTP Action** of PRTG notification templates to send sensor st
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure PRTG
----
PRTG needs two notification templates: one sent when a sensor enters an alert state (`event=trigger`) and one sent when it leaves that state (`event=resolve`). Both templates use the same push URL and the same fields; only the leading `event` differs.
@@ -41,19 +40,19 @@ PRTG needs two notification templates: one sent when a sensor enters an alert st
2. Enter `Flashduty alert` as the **Template Name**
3. Select **Execute HTTP Action** and fill it in as follows:
-| Setting | Value |
-| :--- | :--- |
-| **URL** | The complete Flashduty push URL |
-| **SNI Handling** | **Send SNI** |
-| **SNI Name** | The host name in the push URL, for example `api.flashcat.cloud` |
-| **HTTP Method** | **POST** |
-| **Payload** | The alert template below, kept on one line |
+ | Setting | Value |
+ | :--- | :--- |
+ | **URL** | The complete Flashduty push URL |
+ | **SNI Handling** | **Send SNI** |
+ | **SNI Name** | The host name in the push URL, for example `api.flashcat.cloud` |
+ | **HTTP Method** | **POST** |
+ | **Payload** | The alert template below, kept on one line |
-Alert template:
+ Alert template:
-```text
-event=trigger&sensorid=%sensorid&laststatus=%laststatus&sensor=%sensor&device=%device&deviceid=%deviceid&group=%group&probe=%probe&host=%host&priority=%priority&linksensor=%linksensor&tags=%tags&sitename=%sitename&lastvalue=%lastvalue&message=%message
-```
+ ```text
+ event=trigger&sensorid=%sensorid&laststatus=%laststatus&sensor=%sensor&device=%device&deviceid=%deviceid&group=%group&probe=%probe&host=%host&priority=%priority&linksensor=%linksensor&tags=%tags&sitename=%sitename&lastvalue=%lastvalue&message=%message
+ ```
4. Click **Create**
@@ -76,11 +75,11 @@ You can send a test notification for a template from the **Notification Template
1. Open the object to connect (the Root group, a group, a device, or a sensor), go to the **Notification Triggers** tab, and select **Add State Trigger**
2. Fill it in as follows:
-| Setting | Value |
-| :--- | :--- |
-| **When sensor status is** | **Down**, **for at least** `60` **seconds** |
-| **perform** | `Flashduty alert` |
-| **When sensor status is no longer Down, perform** | `Flashduty recovery` |
+ | Setting | Value |
+ | :--- | :--- |
+ | **When sensor status is** | **Down**, **for at least** `60` **seconds** |
+ | **perform** | `Flashduty alert` |
+ | **When sensor status is no longer Down, perform** | `Flashduty recovery` |
3. Save the trigger. Child groups, devices, and sensors inherit it
@@ -100,7 +99,6 @@ Put a sensor into the Down state for real (for example, briefly cut the network
## Payload fields
----
PRTG posts the template fields as an `application/x-www-form-urlencoded` form. Each field is named after the PRTG placeholder that fills it:
@@ -125,14 +123,12 @@ PRTG posts the template fields as an `application/x-www-form-urlencoded` form. E
The alert title is `: `. If the device name is empty, Flashduty uses the sensor name alone; if both are empty, it uses `PRTG sensor `.
## Alert Key
----
Flashduty uses `sensorid` as the Alert Key. Alert, escalation, and recovery notifications for the same sensor carry the same sensor ID, so they land on the same alert. Two sensors with the same name on one device have different IDs and produce different alerts. Changing the sensor name, device name, status, or message does not change the Alert Key.
Sensor IDs are unique only within one PRTG server. Use a separate Flashduty integration for each PRTG server, so that sensors with the same ID on different servers do not merge into one alert.
## Status and severity
----
`event` decides whether the alert triggers or recovers, and `laststatus` decides the severity:
@@ -147,7 +143,6 @@ Sensor IDs are unique only within one PRTG server. Use a separate Flashduty inte
Requests with an empty or any other `event` are rejected, so a request whose state cannot be determined never enters the wrong alert lifecycle.
## FAQ
----
@@ -182,7 +177,6 @@ PRTG sends placeholders it does not know as literal text. `%laststatus` needs PR
## Troubleshooting
----
- **PRTG fails to send**: check that the URL is the complete push URL including `integration_key`, and that HTTP Method is POST
- **Flashduty returns a parameter error**: check that the Payload contains the whole template on one line, including `event` and `sensorid`
diff --git a/en/on-call/integration/alert-integration/alert-sources/pulsetic.mdx b/en/on-call/integration/alert-integration/alert-sources/pulsetic.mdx
index e5078fdd..32bda10d 100644
--- a/en/on-call/integration/alert-integration/alert-sources/pulsetic.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/pulsetic.mdx
@@ -1,5 +1,6 @@
---
title: "Pulsetic alert integration"
+sidebarTitle: "Pulsetic"
description: "Send Pulsetic website down, recovery and SSL certificate expiry alerts to Flashduty On-call through a monitor webhook."
keywords: ["alert integration", "Pulsetic", "Uptime", "website monitoring", "webhook", "monitor_offline", "monitor_online"]
---
@@ -9,7 +10,6 @@ Use the webhook notification of a Pulsetic monitor to send down (`monitor_offlin
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## In Pulsetic
----
@@ -61,7 +60,6 @@ Let a monitor go down for real (for example, point it to a URL that returns 5xx)
## Payload
----
Pulsetic POSTs the following fields as JSON. Flashduty parses them directly, with no template to configure:
@@ -80,7 +78,6 @@ Pulsetic POSTs the following fields as JSON. Flashduty parses them directly, wit
The alert title is the monitor name. When the name is empty, the monitored URL is used.
## Alert Key
----
Flashduty uses `monitor.id` as the Alert Key for down and recovery alerts. The down, repeated down and recovery notifications of one monitor carry the same `monitor.id`, so they land on the same alert. Renaming the monitor or changing its URL or tags does not change the Alert Key.
@@ -89,7 +86,6 @@ SSL certificate expiry notifications get their own Alert Key built from `alert_t
When `monitor.id` is missing, Flashduty returns a parameter error because the recovery cannot be matched to the original alert.
## Status and severity
----
Pulsetic notifications carry no severity. Flashduty maps them as follows:
@@ -102,7 +98,6 @@ Pulsetic notifications carry no severity. Flashduty maps them as follows:
Any other `alert_type` (for example, a type Pulsetic adds later) is acknowledged and ignored without creating an alert.
## FAQ
----
@@ -125,7 +120,6 @@ Pulsetic probes at the check interval set on the monitor, and you can set how lo
## Troubleshooting
----
- **Pulsetic does not push**: confirm the monitor's Alerts → Webhook is saved and the Webhook URL is the complete push URL including `integration_key`
- **Flashduty returns a parameter error**: confirm the request body contains `alert_type` and `monitor.id`
diff --git a/en/on-call/integration/alert-integration/alert-sources/pulseway.mdx b/en/on-call/integration/alert-integration/alert-sources/pulseway.mdx
index 4ae71247..06572f5c 100644
--- a/en/on-call/integration/alert-integration/alert-sources/pulseway.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/pulseway.mdx
@@ -1,5 +1,6 @@
---
title: "Pulseway alert integration"
+sidebarTitle: "Pulseway"
description: "Sync Pulseway RMM device notifications to Flashduty On-call through Pulseway notification webhooks."
keywords: ["alert integration", "Pulseway", "RMM", "remote monitoring", "notification webhook", "webhook"]
---
@@ -9,7 +10,6 @@ Pulseway is a remote monitoring and management (RMM) platform for IT teams and M
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Pulseway
----
Pulseway notification webhooks are created through the REST API. One webhook covers every device in the selected organizations, and nothing is installed on the devices.
@@ -85,12 +84,10 @@ On a monitored test device, trigger a notification at one of the selected priori
## Alert Key
----
Flashduty uses the notification `Id` as the Alert Key, so each notification opens its own alert. While a problem persists, Pulseway notifies again with a new `Id`, which opens a new alert; the channel can group these alerts into one incident by rule. A device coming back online is a separate notification in Pulseway and does not close the earlier alert.
## Alert severity
----
| Pulseway `Priority` | Flashduty severity |
| :--- | :--- |
@@ -103,7 +100,6 @@ Flashduty uses the notification `Id` as the Alert Key, so each notification open
Priority matching is case-insensitive.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -117,7 +113,6 @@ Priority matching is case-insensitive.
The alert title is the notification `Title` and the description is the notification `Message`.
## FAQ
----
diff --git a/en/on-call/integration/alert-integration/alert-sources/raritan-px.mdx b/en/on-call/integration/alert-integration/alert-sources/raritan-px.mdx
index 73110a87..d3950ec1 100644
--- a/en/on-call/integration/alert-integration/alert-sources/raritan-px.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/raritan-px.mdx
@@ -1,5 +1,6 @@
---
title: "Raritan PX PDU alert integration"
+sidebarTitle: "Raritan PX PDU"
description: "Raritan PX-Series PDUs send email notifications through event rules; use a Flashduty email integration with rules to trigger and close PDU alerts."
keywords: ["alert integration", "Raritan", "Raritan PX", "PX3", "PDU", "email", "environment monitoring"]
---
@@ -9,7 +10,6 @@ Raritan PX-Series PDUs send email through the **Send email** action of an event
## In Flashduty On-call
----
Get the integration email address in either of the two ways below. **In both cases choose the Email integration type**, not Raritan.
@@ -30,7 +30,6 @@ Get the integration email address in either of the two ways below. **In both cas
## Configure push rules in Flashduty
----
The subject format below puts the device name, the event rule name and an assertion flag in the title. The flag `1` means the event condition became true and `0` means it cleared. The rules extract the device name and event rule name as the Alert Key. Trigger and resolve emails yield the same key, so a resolve email closes the matching alert.
@@ -55,7 +54,6 @@ Regex: /^Raritan PX \| (.+) \| (.+) \| 1$/
The close rule comes before the trigger rule. The default rule discards emails that do not follow the subject format, such as default emails sent by other event rules, so they don't create alerts that can never close on their own.
## Configure Raritan PX
----
The paths below come from the Raritan PX-Series PDU user guide (firmware 4.3.11) and are used in the PDU web interface.
@@ -63,21 +61,20 @@ The paths below come from the Raritan PX-Series PDU user guide (firmware 4.3.11)
2. **Create the action**: go to **Device Settings** → **Event Rules**, create an action, choose **Send email** in **Action**, and enter the Flashduty email integration address in **Recipient email addresses**
3. **Email subject**: select **Custom subject** and enter:
-```
-Raritan PX | [DEVICENAME] | [EVENTRULENAME] | [ISASSERTED]
-```
+ ```
+ Raritan PX | [DEVICENAME] | [EVENTRULENAME] | [ISASSERTED]
+ ```
-`[DEVICENAME]` (the device the event occurred on), `[EVENTRULENAME]` (the name of the matching event rule) and `[ISASSERTED]` (1 when the event condition became true, 0 when it became false) are placeholders listed in the user guide; they are replaced with actual values when the email is sent. A rendered subject looks like:
+ `[DEVICENAME]` (the device the event occurred on), `[EVENTRULENAME]` (the name of the matching event rule) and `[ISASSERTED]` (1 when the event condition became true, 0 when it became false) are placeholders listed in the user guide; they are replaced with actual values when the email is sent. A rendered subject looks like:
-```
-Raritan PX | PX3-rack12 | Rack12 temperature high | 1
-```
+ ```
+ Raritan PX | PX3-rack12 | Rack12 temperature high | 1
+ ```
4. **Create the event rule**: go to **Device Settings** → **Event Rules**, create a rule, select the event to watch (for example **Above upper critical threshold** of a temperature sensor), set **Trigger condition** to **Both** so the action runs when the event occurs and when it clears, and select the Send email action from step 2 in **Available actions**
5. **Email body**: the rules read only the email title; the default or a custom message both work
## Limitations
----
- **Unique event rule names**: the Alert Key is built from the device name and the event rule name, so events that share one rule name merge into one alert. Create a separate event rule with its own name for each event you want to monitor.
- **Trigger condition**: with **Asserted** only, the PDU sends trigger emails but no resolve emails, and alerts do not close automatically.
diff --git a/en/on-call/integration/alert-integration/alert-sources/raygun.mdx b/en/on-call/integration/alert-integration/alert-sources/raygun.mdx
index 344b9dea..2b6d7974 100644
--- a/en/on-call/integration/alert-integration/alert-sources/raygun.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/raygun.mdx
@@ -1,5 +1,6 @@
---
title: "Raygun alert integration"
+sidebarTitle: "Raygun"
description: "Send error notifications and status changes from a Raygun Crash Reporting application to Flashduty On-call through a webhook."
keywords: ["alert integration", "Raygun", "webhook", "error monitoring", "Crash Reporting"]
---
@@ -9,7 +10,6 @@ Use the Webhook integration of a Raygun Crash Reporting application to send erro
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Raygun
----
The Webhook integration is configured per application and is available only on Raygun's Team plan or higher. Configure each application separately; several applications can use the same push URL.
@@ -75,14 +74,12 @@ Use the application-level **Integrations → Webhooks**. The plan-level webhooks
## Alert Key
----
Flashduty groups alerts by Raygun error group: the new, reoccurred, follow-up, and resolved notifications of the same error group land on the same alert.
The Alert Key is built from `error.url` in the event, the link to the error group page in Raygun. Only the path of the link is used; the scheme, host, trailing slash, and query string are ignored. Changes to the error message, occurrence count, affected user count, and tags do not change the Alert Key. Events without `error.url` are rejected.
## Status and severity
----
Raygun errors carry no severity, so Flashduty uses Warning for all of them:
@@ -92,7 +89,6 @@ Raygun errors carry no severity, so Flashduty uses Warning for all of them:
| `StatusChanged` with `status` `resolved` or `archived` (case-insensitive) | Recover | - |
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -108,7 +104,6 @@ Raygun errors carry no severity, so Flashduty uses Warning for all of them:
Affected user identifiers, custom data (`customData`), and the name of the person who made a change are not written to labels.
## Troubleshooting
----
- **Webhooks is missing from the integration list**: Make sure the account is on the Team plan or higher, or on a trial
- **Flashduty returns a parameter error**: Make sure the URL is complete and includes `integration_key`, and that you configured the application-level webhook rather than a webhook in Alerting
diff --git a/en/on-call/integration/alert-integration/alert-sources/rbltracker.mdx b/en/on-call/integration/alert-integration/alert-sources/rbltracker.mdx
index 00d5b38b..6bbd06e7 100644
--- a/en/on-call/integration/alert-integration/alert-sources/rbltracker.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/rbltracker.mdx
@@ -1,5 +1,6 @@
---
title: "RBLTracker alert integration"
+sidebarTitle: "RBLTracker"
description: "Send RBLTracker (Generator Labs) blocklist listings, certificate expiry and errors, and monitoring agent timeouts to Flashduty On-call through a webhook."
keywords: ["alert integration", "RBLTracker", "Generator Labs", "blocklist", "RBL", "certificate monitoring", "webhook"]
---
@@ -15,7 +16,6 @@ Events that come in trigger and resolve pairs map to one Flashduty alert: the tr
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -36,7 +36,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure RBLTracker
----
@@ -80,7 +79,6 @@ To verify the full lifecycle, add a test host that you know is listed, confirm t
## Alert Key
----
Flashduty uses the SID of the object in the RBLTracker event as the Alert Key, with a prefix per event category:
@@ -98,7 +96,6 @@ In the official RBLTracker API reference, `rbl.host.listed` and `rbl.host.delist
Changes to the host name, the number of blocklists, the check SID (`check_sid`), or the event SID (`event_sid`) never change the Alert Key. An event without the matching SID is rejected.
## Status and severity
----
The event type sets the alert status; the table above shows which events recover. RBLTracker does not send a severity, so Flashduty sets it by event type:
@@ -113,12 +110,10 @@ The event type sets the alert status; the table above shows which events recover
| `agent.timeout` | Warning | The agent stopped checking in, so monitoring has a blind spot |
## Auto-close for one-shot events
----
`cert.changed` is a single notification, and RBLTracker never sends a matching resolve event. Each certificate replacement on a monitor creates its own alert, and these alerts do not recover on their own. Turn on the [auto-close timeout](/en/on-call/channel/create-edit) for the channel and set it to **24 hours**.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -140,14 +135,12 @@ The event type sets the alert status; the table above shows which events recover
| `instances` | Identifiers of the agent instances that timed out |
## Delivery and retries
----
RBLTracker sends `application/json` POST requests, and a 2xx response from Flashduty counts as delivered. A failed delivery (non-2xx, timeout, or connection error) is retried after 30 seconds and again after 2 minutes with the same event SID, so retries do not create duplicate alerts. After 10, 20, and 30 consecutive failures RBLTracker pauses the webhook for 1 hour, 6 hours, and 1 day; after 40 it disables the webhook and you must re-enable it under **Development → Webhooks**.
Every delivery carries an `X-Webhook-Signature` header. Flashduty authenticates requests with the `integration_key` in the push URL and does not verify that header.
## Troubleshooting
----
- **RBLTracker shows a failed delivery**: confirm the URL is complete and includes `integration_key`, and check the response code in the **Send Test** result
- **Flashduty returns an invalid parameter error**: the body must be an RBLTracker JSON delivery; events without `host.sid`, `monitor.sid`, or `agent.sid` are rejected
diff --git a/en/on-call/integration/alert-integration/alert-sources/red-hat-openshift.mdx b/en/on-call/integration/alert-integration/alert-sources/red-hat-openshift.mdx
index 3a9c4876..d47c0b52 100644
--- a/en/on-call/integration/alert-integration/alert-sources/red-hat-openshift.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/red-hat-openshift.mdx
@@ -1,5 +1,6 @@
---
title: "Red Hat OpenShift Alert Integration"
+sidebarTitle: "Red Hat OpenShift"
description: "Receive OpenShift cluster alerts through the webhook receiver of OpenShift monitoring's built-in Alertmanager using a Flashduty Prometheus integration; alerts close automatically when they resolve."
keywords: ["alert integration", "Red Hat OpenShift", "OpenShift", "Alertmanager", "webhook", "Prometheus", "Kubernetes"]
---
@@ -9,7 +10,6 @@ The OpenShift Container Platform monitoring stack ships its own Alertmanager (`a
## In Flashduty On-call
----
Get an integration push URL in either of the two ways below. **Choose the Prometheus integration type** in both, not Red Hat OpenShift.
@@ -30,7 +30,6 @@ Get an integration push URL in either of the two ways below. **Choose the Promet
## Configure in OpenShift
----
The OpenShift documentation offers two ways to configure a receiver; use either one. Both require the `cluster-admin` role.
@@ -57,24 +56,24 @@ The OpenShift documentation offers two ways to configure a receiver; use either
2. Add a receiver and a route to `alertmanager.yaml`. The example adds a `flashduty` receiver to the default configuration and routes alerts whose `severity` is `critical` or `warning` to it. `send_resolved` defaults to `true` in the Alertmanager webhook configuration; it is written out to make sure resolved notifications stay on:
-```yaml
-receivers:
-- name: default
-- name: watchdog
-- name: flashduty
- webhook_configs:
- - url: https://api.flashcat.cloud/event/push/alert/prometheus?integration_key=
- send_resolved: true
-route:
- routes:
- - matchers:
- - "alertname=Watchdog"
- repeat_interval: 2m
- receiver: watchdog
- - matchers:
- - "severity=~critical|warning"
- receiver: flashduty
-```
+ ```yaml
+ receivers:
+ - name: default
+ - name: watchdog
+ - name: flashduty
+ webhook_configs:
+ - url: https://api.flashcat.cloud/event/push/alert/prometheus?integration_key=
+ send_resolved: true
+ route:
+ routes:
+ - matchers:
+ - "alertname=Watchdog"
+ repeat_interval: 2m
+ receiver: watchdog
+ - matchers:
+ - "severity=~critical|warning"
+ receiver: flashduty
+ ```
Replace `` with your Flashduty integration key. Keep the new route after the `Watchdog` route: Watchdog is an alert that fires continuously, and the OpenShift documentation describes it as a check on the notification path, not a fault alert to forward to Flashduty.
@@ -94,7 +93,6 @@ Trigger a cluster alert (the OpenShift documentation points to the Red Hat Custo
## Field mapping
----
| OpenShift Alertmanager field | Flashduty |
| :--- | :--- |
@@ -109,14 +107,12 @@ Trigger a cluster alert (the OpenShift documentation points to the Red Hat Custo
One notification can carry several alerts, and Flashduty handles each one separately (up to 100 per request).
## Recovery and deduplication
----
- `send_resolved` defaults to `true` for the Alertmanager webhook receiver. On recovery it sends a notification with `status` set to `resolved`, and Flashduty closes the alert with the same `fingerprint`.
- If you turn resolved notifications off under **Show advanced configuration** (or set `send_resolved: false` in YAML), Flashduty receives no recovery requests; enable [auto-resolve timeout](/en/on-call/channel/create-edit) on the channel.
- Alertmanager repeats notifications for alerts that are still firing, per `repeat_interval`; Flashduty deduplicates by `fingerprint`, so no duplicate alerts are created.
## Troubleshooting
----
- **Flashduty returns `Invalid parameters`**: the push URL is incomplete, `integration_key` is missing, or the integration type is not Prometheus
- **Alerts do not resolve**: confirm the receiver does not set `send_resolved: false`
diff --git a/en/on-call/integration/alert-integration/alert-sources/redash.mdx b/en/on-call/integration/alert-integration/alert-sources/redash.mdx
index 6ae00323..8186b319 100644
--- a/en/on-call/integration/alert-integration/alert-sources/redash.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/redash.mdx
@@ -1,5 +1,6 @@
---
title: "Redash alert integration"
+sidebarTitle: "Redash"
description: "Send alert state changes from Redash to Flashduty On-call through the Webhook alert destination."
keywords: ["alert integration", "Redash", "webhook", "query alerts", "data analytics"]
---
@@ -9,7 +10,6 @@ Use the Webhook alert destination of Redash to send query alert state changes to
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Redash
----
You need Redash administrator privileges to create an alert destination, and the Redash server must be able to reach the Flashduty push URL.
@@ -66,14 +65,12 @@ The Redash Webhook destination has no test button.
## Alert Key
----
Flashduty uses the Redash alert ID (`alert.id`) as the Alert Key. The trigger, repeated notifications, and recovery of one Redash alert share one Alert Key. Changes to the alert name, condition, threshold, or state do not change it. A request without `alert.id` is rejected.
Connect only one Redash instance to each Flashduty integration: alert IDs repeat across instances, so create a separate integration for each.
## State and severity
----
Redash notifications carry no severity, so Flashduty acts on the alert state:
@@ -86,7 +83,6 @@ Redash notifications carry no severity, so Flashduty acts on the alert state:
`unknown` means the query has no data to evaluate. Redash notifies only when the state changes, or when a triggered alert passes its repeat interval; an alert whose first evaluation is `OK` sends no notification.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -98,7 +94,6 @@ Redash notifications carry no severity, so Flashduty acts on the alert state:
| `alert_url` / `query_url` | Links to the alert and the query in Redash |
## Troubleshooting
----
- **Flashduty receives no alert**: confirm the alert has the Webhook destination, is not muted, and its query is published and runs on a refresh schedule (on a self-hosted Redash the worker must consume the `periodic` and `scheduled_queries` queues, which the default configuration does). Redash times the request out after 5 seconds and does not retry; failures appear only in the Redash log
- **Flashduty returns an invalid-parameter error**: confirm the URL is complete and includes `integration_key`
diff --git a/en/on-call/integration/alert-integration/alert-sources/redgate-sql-monitor.mdx b/en/on-call/integration/alert-integration/alert-sources/redgate-sql-monitor.mdx
index 39d82017..744f4880 100644
--- a/en/on-call/integration/alert-integration/alert-sources/redgate-sql-monitor.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/redgate-sql-monitor.mdx
@@ -1,5 +1,6 @@
---
title: "Redgate SQL Monitor alert integration"
+sidebarTitle: "Redgate SQL Monitor"
description: "Send Redgate Monitor (formerly SQL Monitor) alerts to Flashduty On-call through a webhook, with automatic recovery when an alert ends."
keywords: ["alert integration", "Redgate", "SQL Monitor", "Redgate Monitor", "SQL Server", "webhook"]
---
@@ -9,7 +10,6 @@ Use the webhook notifications of Redgate Monitor (formerly Redgate SQL Monitor)
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Redgate Monitor
----
Webhook notifications are configured in the Redgate Monitor web console, apply to every alert raised by that Base Monitor, and require administrator permissions. The machine that runs the Base Monitor service must be able to reach the Flashduty push URL.
@@ -65,12 +64,10 @@ If the Base Monitor reaches the internet through a proxy, configure the proxy on
## Alert Key
----
A Redgate Monitor alert ID (`id`) is unique only within a single Base Monitor, so Flashduty computes the Alert Key from both the Base Monitor identifier (`baseMonitorGuid`) and the alert ID (`id`). The Raised, Escalated, DeEscalated, and Ended messages of one alert share the same Alert Key, and alerts from several Base Monitors that push to the same integration never merge. Changes to the alert name, severity, description, or timestamps do not change the Alert Key. Messages without `id` or `baseMonitorGuid` are rejected.
## Status and severity
----
| `statusChange` | Meaning | Flashduty status |
| :--- | :--- | :--- |
@@ -88,7 +85,6 @@ A Redgate Monitor alert ID (`id`) is unique only within a single Base Monitor, s
An `Ended` message carries `severity` `None`, so Flashduty uses `previousSeverity` (the severity before the alert ended) as the severity of the recovery event. An empty or unrecognized severity is treated as Warning. Messages whose `messageType` is not `AlertNotification` do not create alerts; Flashduty returns success for them.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -109,7 +105,6 @@ An `Ended` message carries `severity` `None`, so Flashduty uses `previousSeverit
The alert description is Redgate Monitor's description of the alert type. For a custom metric with a secondary query, it also includes the detail text that query returns (`alertDetailText`).
## Troubleshooting
----
- **The test message fails**: Confirm that the Base Monitor machine can reach the Flashduty push URL, and configure the proxy as described above if one is required
- **Flashduty returns a parameter error**: Confirm that the URL is complete and includes `integration_key`, and that the default message format is selected
diff --git a/en/on-call/integration/alert-integration/alert-sources/rizhiyi.mdx b/en/on-call/integration/alert-integration/alert-sources/rizhiyi.mdx
index 019c39c1..52550fd6 100644
--- a/en/on-call/integration/alert-integration/alert-sources/rizhiyi.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/rizhiyi.mdx
@@ -1,5 +1,6 @@
---
title: "Logease Alert Integration"
+sidebarTitle: "Logease"
description: "Push Logease (rizhiyi) alert events to Flashduty through a custom alarm plugin for automated alert noise reduction"
keywords: ["alert integration", "Logease", "rizhiyi", "log monitoring", "data ingestion"]
---
@@ -7,7 +8,6 @@ keywords: ["alert integration", "Logease", "rizhiyi", "log monitoring", "data in
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
@@ -15,35 +15,36 @@ You can obtain an integration push URL through either of these two methods:
Choose this simpler option when you don't need to route alert events to different channels.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Select **Logease** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Logease** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In Logease
----
Logease alerts can be delivered via email, syslog, alert forwarding, or custom alarm plugins. The JSON structure pushed by **alert forwarding** is a fixed Logease format that does not match the event format required by Flashduty. Therefore, use a **custom alarm plugin** (a Python script) to convert alerts into the standard format before pushing them to Flashduty.
@@ -134,7 +135,6 @@ The events pushed by the plugin must follow the Flashduty standard alert event f
## Severity Mapping
----
@@ -152,7 +152,6 @@ The mapping from Logease alert levels to Flashduty severities is defined by `LEV
## FAQ
----
Why am I not receiving alerts in Flashduty?
diff --git a/en/on-call/integration/alert-integration/alert-sources/robotalp.mdx b/en/on-call/integration/alert-integration/alert-sources/robotalp.mdx
index 144280a9..3bec6a65 100644
--- a/en/on-call/integration/alert-integration/alert-sources/robotalp.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/robotalp.mdx
@@ -1,5 +1,6 @@
---
title: "Robotalp alert integration"
+sidebarTitle: "Robotalp"
description: "Send Robotalp monitor downtimes and recoveries to Flashduty On-call through its Custom Webhook."
keywords: ["alert integration", "Robotalp", "uptime monitoring", "webhook"]
---
@@ -9,7 +10,6 @@ Robotalp is an uptime monitoring service. When a monitor goes down or recovers,
## In Flashduty On-call
----
You can get the integration Push URL in either of the following two ways.
@@ -30,7 +30,6 @@ You can get the integration Push URL in either of the following two ways.
## Configure Robotalp
----
@@ -67,7 +66,6 @@ The check interval is set on the monitor; with a 1-minute interval, the down and
## Alert Key
----
Flashduty uses `incident_id` from the request body as the Alert Key. Robotalp sends the same `incident_id` on the down notification and the recovery notification of one downtime. We verified this on a real Robotalp account: a monitor went down and then recovered, and both deliveries carried the same `incident_id`.
@@ -76,7 +74,6 @@ Flashduty uses `incident_id` from the request body as the Alert Key. Robotalp se
- Requests without `incident_id` are rejected, because their recovery could not be matched reliably
## Status and severity
----
The Robotalp request body has no severity field, only `status`.
@@ -88,7 +85,6 @@ The Robotalp request body has no severity field, only `status`.
Any other value is rejected. A recovery carries `resolved_at` and `downtime_seconds`; Flashduty stores them as labels together with the failure reason `result_message`.
## Troubleshooting
----
- **Flashduty receives nothing**: confirm the webhook is enabled under the monitor's **Notification Preferences** and that the Push URL is complete, including `integration_key`
- **The alert does not recover**: confirm **Custom payload** does not override `incident_id` or `status`. If the monitor is paused or deleted, Robotalp sends no recovery, so close the alert by hand; you can also turn on auto-close in the channel as a fallback
diff --git a/en/on-call/integration/alert-integration/alert-sources/robusta.mdx b/en/on-call/integration/alert-integration/alert-sources/robusta.mdx
index c8a8dd3d..0b23dcf2 100644
--- a/en/on-call/integration/alert-integration/alert-sources/robusta.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/robusta.mdx
@@ -1,5 +1,6 @@
---
title: "Robusta alert integration"
+sidebarTitle: "Robusta"
description: "Send Robusta alerts from your Kubernetes clusters to Flashduty On-call through the Robusta webhook sink."
keywords: ["alert integration", "Robusta", "Kubernetes", "K8s", "Prometheus", "webhook"]
---
@@ -9,7 +10,6 @@ Use the Robusta webhook sink (`webhook_sink`) to send Robusta findings to Flashd
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure Robusta
----
@@ -74,7 +73,6 @@ If your Prometheus alerts do not go through Robusta, Alertmanager can also push
## Alert Key
----
Flashduty computes the Alert Key from `cluster_name` and `fingerprint`.
@@ -84,7 +82,6 @@ Flashduty computes the Alert Key from `cluster_name` and `fingerprint`.
Changes to the title, description, severity, timestamps, or finding ID do not change the Alert Key. Flashduty rejects a request without `fingerprint`, because later notifications could not be matched to it.
## Status and severity
----
Flashduty marks the alert as recovered when the request has a non-empty `ends_at` or the title starts with `[RESOLVED] `. Robusta sends such notifications only for Prometheus alerts that Alertmanager has resolved, so make sure the Robusta receiver in Alertmanager has `send_resolved: true` (the Prometheus bundled with Robusta has it on by default).
@@ -98,14 +95,12 @@ Flashduty marks the alert as recovered when the request has a non-empty `ends_at
When Robusta forwards a Prometheus alert, it converts the alert's `severity` label: `critical`, `high`, `medium`, and `error` become `HIGH`; `warning` and `low` become `LOW`; `info` and any other value become `INFO`; `debug` becomes `DEBUG`. A resolution keeps the last severity.
## Alert content
----
- **Title**: `title`, with the `[RESOLVED] ` prefix removed from resolutions
- **Description**: `description`, the links in `links` (such as the Prometheus graph), and the resolution time `ends_at`
- **Labels**: `cluster`, `fingerprint`, `aggregation_key` (alert name or problem type), `finding_source` (such as `PROMETHEUS` or `KUBERNETES_API_SERVER`), `finding_type`, `severity` (the original Robusta severity), `resource` (`kind/namespace/name`), `kind`, `namespace`, `node`, `container`, `source` (always `robusta`), plus the resource labels and Prometheus alert labels from `subject.labels` (such as `alertname` and `pod`)
## Troubleshooting
----
- **Flashduty returns request body is not Robusta JSON**: the `webhook_sink` does not set `format: json`
- **Flashduty returns fingerprint is required**: make sure `slack_webhook` is off and `size_limit` is not set too small
diff --git a/en/on-call/integration/alert-integration/alert-sources/rollbar.mdx b/en/on-call/integration/alert-integration/alert-sources/rollbar.mdx
index 967af46c..39ec6ff2 100644
--- a/en/on-call/integration/alert-integration/alert-sources/rollbar.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/rollbar.mdx
@@ -1,5 +1,6 @@
---
title: "Rollbar alert integration"
+sidebarTitle: "Rollbar"
description: "Send new, reactivated, and resolved item events from a Rollbar project to Flashduty On-call through a webhook."
keywords: ["alert integration", "Rollbar", "item", "webhook", "error monitoring"]
---
@@ -9,7 +10,6 @@ Use the Webhook notification channel of a Rollbar project to send error items to
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Rollbar
----
Webhooks are configured per project. You need permission to change the project's notification settings in Rollbar.
@@ -76,14 +75,12 @@ Raise a new error in an application that uses a Rollbar SDK and confirm that Fla
## Alert Key
----
Flashduty uses the item `id` (`data.item.id` in the webhook) as the Alert Key. In Rollbar's official webhook examples, the `new_item`, `item_velocity`, `exp_repeat_item`, and `resolved_item` events for the same item carry the same `id`. It is also the ID that the Rollbar API uses to look up an item.
The number in an item URL (such as `.../items/40`) is the project-level `counter` and is kept only as a label. Changes to the title, level, environment, or occurrence count do not change the Alert Key. Item events without `data.item.id` are rejected.
## Status and severity
----
The event name sets the alert status: `resolved_item` recovers the alert, and every other item event triggers it. The item level (`data.item.level`) sets the severity:
@@ -99,7 +96,6 @@ The event name sets the alert status: `resolved_item` recovers the alert, and ev
New Rollbar items default to `error`. To be notified at Critical for a class of errors, change the item level to `critical` in Rollbar or set the level in your SDK.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -117,7 +113,6 @@ New Rollbar items default to `error`. To be notified at Critical for a class of
| `window` / `threshold` | Time window and threshold of `item_velocity` |
## Troubleshooting
----
- **Rollbar shows failed deliveries**: Confirm that the URL is complete and includes `integration_key`, and check each attempt under the rule's **History**. Rollbar retries failed deliveries and automatically disables rules that keep failing; re-enable the rule on the Webhook settings page after fixing the cause
- **Flashduty returns a parameter error**: Confirm that the rule's payload format is JSON
diff --git a/en/on-call/integration/alert-integration/alert-sources/rum-alert.mdx b/en/on-call/integration/alert-integration/alert-sources/rum-alert.mdx
index 08f192f9..9c6d250b 100644
--- a/en/on-call/integration/alert-integration/alert-sources/rum-alert.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/rum-alert.mdx
@@ -1,5 +1,6 @@
---
title: "RUM Alert Integration"
+sidebarTitle: "RUM"
description: "Flashduty RUM alert integration, RUM service reports alerts through this integration"
---
@@ -13,6 +14,6 @@ You cannot modify or delete this integration. However, you can manage the label
Go to the `RUM` - `Application Details` - `Alert Settings` page to enable alerts. You can choose to deliver alerts to multiple channels. Alert notification rules follow the escalation rules under the channel, and you can set responders for the team to assign to responders when alerts occur.
-
+
-For more information, please refer to [RUM Issue Alerting](https://docs.flashduty.com/en/flashduty/rum/issue-alerting?nav=01JCQ7A4N4WRWNXW8EWEHXCMF5).
+For more information, please refer to [RUM Issue Alerting](/en/rum/error-tracking/issue-alerts).
diff --git a/en/on-call/integration/alert-integration/alert-sources/searchstax.mdx b/en/on-call/integration/alert-integration/alert-sources/searchstax.mdx
index 9210fabd..dbab6210 100644
--- a/en/on-call/integration/alert-integration/alert-sources/searchstax.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/searchstax.mdx
@@ -1,5 +1,6 @@
---
title: "SearchStax alert integration"
+sidebarTitle: "SearchStax"
description: "Send SearchStax Managed Search metric alerts to Flashduty On-call through a webhook. Flashduty alerts close automatically when the SearchStax alert closes."
keywords: ["alert integration", "SearchStax", "Managed Search", "Solr", "webhook", "search service"]
---
@@ -9,7 +10,6 @@ SearchStax Managed Search lets you define the webhook body: the webhook's **Payl
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure SearchStax
----
Managing webhooks and alerts requires the Account Owner, Admin, or Technical Contact role in SearchStax.
@@ -84,7 +83,6 @@ Push a metric over its threshold (for example, give a test alert a very low thre
## Alert Key
----
Flashduty uses `alert_id` (`$ALERT_ID`) as the Alert Key. SearchStax describes it as the internal alert number. Trigger and resolve use the same webhook template, so `OPEN` and `CLOSED` messages land on the same Flashduty alert.
@@ -93,7 +91,6 @@ A SearchStax alert is a deployment-level rule: a rule whose `host` is `*` watche
Changes to the alert title, metric value, or time do not change the Alert Key. Flashduty rejects a request that lacks `alert_id` or `alert_status`, or whose value is still an unrendered `$...` variable.
## Alert lifecycle
----
Flashduty handles a message by its `alert_status` field (`$ALERT_STATUS`, case-insensitive):
@@ -105,12 +102,10 @@ Flashduty handles a message by its `alert_status` field (`$ALERT_STATUS`, case-i
Any other value is rejected.
## Severity
----
SearchStax alerts carry no severity, so every alert defaults to **Warning**. To use another level, append `&severity=Critical` (or `Info`) to the push URL. A recovery keeps the severity of the original alert.
## Alert content
----
- **Title**: the alert name (`$ALERT_TITLE`); `SearchStax alert ` when missing
- **Description**: `metric current-value operator threshold`, for example `os.SystemCpuLoad 0.01 > 10.0`
@@ -119,7 +114,6 @@ SearchStax alerts carry no severity, so every alert defaults to **Warning**. To
Fields with an empty value are not written as labels.
## Troubleshooting
----
- **Flashduty says the body is not valid JSON**: check that the Payload matches the template and that form encoding is off
- **No alert arrives**: check that the alert's webhook droplist selects this webhook and that the webhook is not **Paused**. Tick **Ignore SSL Validation** only if the target uses a self-signed certificate
diff --git a/en/on-call/integration/alert-integration/alert-sources/securityscorecard.mdx b/en/on-call/integration/alert-integration/alert-sources/securityscorecard.mdx
index f1ddb386..3a014fcd 100644
--- a/en/on-call/integration/alert-integration/alert-sources/securityscorecard.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/securityscorecard.mdx
@@ -1,5 +1,6 @@
---
title: "SecurityScorecard alert integration"
+sidebarTitle: "SecurityScorecard"
description: "Send SecurityScorecard score changes, new issues and breach events to Flashduty On-call with the Rule Builder Send a web request action."
keywords: ["alert integration", "SecurityScorecard", "security rating", "Rule Builder", "webhook", "execution_id"]
---
@@ -11,7 +12,6 @@ SecurityScorecard sends an event once, when it happens, and sends no recovery no
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure SecurityScorecard
----
Rule Builder requires a paid SecurityScorecard plan, and each user can create up to 25 rules.
@@ -65,14 +64,12 @@ Rule Builder has no button that sends a test request. SecurityScorecard evaluate
## Alert Key
----
Flashduty computes the Alert Key from `execution_id`, `scorecard_id` and `trigger.type`. The SecurityScorecard article [Rule Builder: Webhooks](https://support.securityscorecard.com/hc/en-us/articles/360058429271-Rule-Builder-Webhooks) defines `execution_id` as the unique identifier of one rule execution, and it stays the same when a failed request is retried. A retry of the same execution therefore merges into the same alert, and every other rule execution becomes its own alert.
When a request has no `execution_id`, Flashduty generates a random Alert Key and every request becomes a new alert. A request without `trigger.type` returns a parameter error.
## Severity
----
| Event (`trigger.type`) | Condition | Flashduty severity |
| :--- | :--- | :--- |
@@ -83,7 +80,6 @@ When a request has no `execution_id`, Flashduty generates a random Alert Key and
| Score change (`grade_drop`) and any other event type | | Warning |
## Field mapping
----
| Flashduty | SecurityScorecard field |
| :--- | :--- |
@@ -94,12 +90,10 @@ When a request has no `execution_id`, Flashduty generates a random Alert Key and
The `retries` and `webhooks` (responses of earlier webhooks in the rule) fields are not copied to the alert. SecurityScorecard marks this request body as beta; if the structure of the issue or breach details changes, Flashduty ignores the parts it cannot parse and still creates the alert.
## Alerts do not recover
----
Score changes, new issues and breaches are one-shot events, and SecurityScorecard sends no recovery notification. Turn on [auto-resolve timeout](/en/on-call/channel/create-edit) in the channel that receives this integration. 24 hours is a reasonable start; adjust it to how long your team takes to handle security rating events.
## Troubleshooting
----
diff --git a/en/on-call/integration/alert-integration/alert-sources/sematext.mdx b/en/on-call/integration/alert-integration/alert-sources/sematext.mdx
index fc3fae09..504426bc 100644
--- a/en/on-call/integration/alert-integration/alert-sources/sematext.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/sematext.mdx
@@ -1,5 +1,6 @@
---
title: "Sematext alert integration"
+sidebarTitle: "Sematext"
description: "Send metric, log, Heartbeat, Experience and Synthetics alerts from Sematext Cloud to Flashduty On-call through a Custom notification hook."
keywords: ["alert integration", "Sematext", "webhook", "Notification Hook", "monitoring"]
---
@@ -9,7 +10,6 @@ Use a Custom notification hook in Sematext Cloud to send alert rule notification
## In Flashduty On-call
----
You can obtain an integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can obtain an integration push URL in either of the following ways.
## Configure Sematext
----
@@ -42,29 +41,29 @@ You can obtain an integration push URL in either of the following ways.
5. Set **Send data as** to **Json** and **HTTP method** to **Post**
6. Click **Add parameter** and add each parameter in the table below. The left column is the parameter name and the right column is its value; Sematext replaces the `$` variables when it sends the notification
-| Parameter name | Value |
-| :--- | :--- |
-| `backToNormal` | `$backToNormal` |
-| `priority` | `$priority` |
-| `ruleType` | `$ruleType` |
-| `description` | `$description` |
-| `applicationId` | `$applicationId` |
-| `createTimestamp` | `$createTimestamp` |
-| `troubleshootUrl` | `$troubleshootUrl` |
-
-When you are done, the request body in **Preview** should be:
-
-```json
-{
- "backToNormal": "$backToNormal",
- "priority": "$priority",
- "ruleType": "$ruleType",
- "description": "$description",
- "applicationId": "$applicationId",
- "createTimestamp": "$createTimestamp",
- "troubleshootUrl": "$troubleshootUrl"
-}
-```
+ | Parameter name | Value |
+ | :--- | :--- |
+ | `backToNormal` | `$backToNormal` |
+ | `priority` | `$priority` |
+ | `ruleType` | `$ruleType` |
+ | `description` | `$description` |
+ | `applicationId` | `$applicationId` |
+ | `createTimestamp` | `$createTimestamp` |
+ | `troubleshootUrl` | `$troubleshootUrl` |
+
+ When you are done, the request body in **Preview** should be:
+
+ ```json
+ {
+ "backToNormal": "$backToNormal",
+ "priority": "$priority",
+ "ruleType": "$ruleType",
+ "description": "$description",
+ "applicationId": "$applicationId",
+ "createTimestamp": "$createTimestamp",
+ "troubleshootUrl": "$troubleshootUrl"
+ }
+ ```
7. Click **Send Test Notification** and confirm that the request succeeds, then click **Save Notification Hook**
@@ -101,7 +100,6 @@ The request sent by **Send Test Notification** does not belong to any alert rule
## Alert Key
----
Sematext adds the alert rule ID (`ruleId`) and rule name (`alertName`) to every alert notification. When the rule uses Group by, it also adds the group tag values that fired the alert (`filters`, for example `{os.host=web-01}`). You do not need to configure these fields in the hook.
@@ -114,7 +112,6 @@ The Alert Key is computed from `ruleId` and all group tags in `filters`; the ord
Requests that carry `alertName` but no `ruleId` are rejected.
## Status and severity
----
The alert recovers when `backToNormal` is `true`; any other value is treated as a trigger. The severity comes from the alert rule priority (`$priority`):
@@ -129,7 +126,6 @@ The alert recovers when `backToNormal` is `true`; any other value is treated as
Matching ignores case.
## Labels
----
| Label | Source |
| :--- | :--- |
@@ -144,7 +140,6 @@ Matching ignores case.
| `create_timestamp` | Creation time of the alert notification, as a Unix timestamp in milliseconds |
## Troubleshooting
----
- **Flashduty returns a parameter error**: Make sure the URL is complete and includes `integration_key`, and that **Send data as** is set to **Json**
- **The alert does not recover**: Make sure **Alert me when the value goes back to non-alert level** is on in the rule's **Notifications** tab, that the hook has the `backToNormal` parameter with the value `$backToNormal`, and that the group is still sending data
diff --git a/en/on-call/integration/alert-integration/alert-sources/semgrep.mdx b/en/on-call/integration/alert-integration/alert-sources/semgrep.mdx
index b17b8219..fb176566 100644
--- a/en/on-call/integration/alert-integration/alert-sources/semgrep.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/semgrep.mdx
@@ -1,5 +1,6 @@
---
title: "Semgrep alert integration"
+sidebarTitle: "Semgrep"
description: "Send new Semgrep AppSec Platform findings and supply chain incidents to Flashduty On-call through a webhook."
keywords: ["alert integration", "Semgrep", "webhook", "SAST", "SCA", "code security", "supply chain security"]
---
@@ -9,7 +10,6 @@ Use the Semgrep AppSec Platform webhook integration to send newly detected code
## In Flashduty On-call
----
You can get the integration push URL in either of two ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of two ways.
## In Semgrep
----
You need admin access to Semgrep AppSec Platform.
@@ -62,7 +61,6 @@ To receive supply chain incidents, turn on the **Early notification for Supply C
## Payloads and recovery
----
Semgrep sends three kinds of objects, and one request can carry several:
@@ -75,7 +73,6 @@ Semgrep sends three kinds of objects, and one request can carry several:
Semgrep sends a finding only the first time it is detected and never sends update or fixed notifications, so Flashduty alerts do not recover automatically. Turn on the channel's [auto-resolve timeout](/en/on-call/channel/create-edit) (7 days suggested), or close alerts by hand after the issue is fixed.
## Alert Key
----
| Object | Field used |
| :--- | :--- |
@@ -85,7 +82,6 @@ Semgrep sends a finding only the first time it is detected and never sends updat
The Alert Key is computed from the object type and the ID above, so a repeated delivery of the same finding merges, and a finding ID never merges with an incident ID that has the same number. Changes to the rule name or severity do not change the Alert Key. An object without its ID causes the whole request to be rejected.
## Severity
----
A finding's `severity` is a number derived from the rule severity:
@@ -101,7 +97,6 @@ A finding's `severity` is a number derived from the rule severity:
Supply chain incidents that affect your projects are always Critical.
## Labels
----
Findings:
@@ -128,7 +123,6 @@ Supply chain incidents:
Every alert carries `source=semgrep` and `event_type` (`finding` or `supply_chain_incident`). The alert description is the rule's `message`; code snippets are not sent.
## Troubleshooting
----
- **Flashduty returns an invalid-parameter error**: check that the webhook URL is complete and includes `integration_key`; the error is also returned when a finding lacks `numeric_id` or an incident lacks `incident_id`
- **No alerts arrive**: check that the policy has a **Call a webhook** action; Semgrep notifies only the first time a finding is detected, so existing findings are not re-sent
diff --git a/en/on-call/integration/alert-integration/alert-sources/sensu.mdx b/en/on-call/integration/alert-integration/alert-sources/sensu.mdx
index 770d4364..26c020e9 100644
--- a/en/on-call/integration/alert-integration/alert-sources/sensu.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/sensu.mdx
@@ -1,5 +1,6 @@
---
title: "Sensu Go alert integration"
+sidebarTitle: "Sensu Go"
description: "Send Sensu Go check events to Flashduty On-call through a pipe handler. Alerts close automatically when the check recovers."
keywords: ["alert integration", "Sensu", "Sensu Go", "pipe handler", "handler", "pipeline"]
---
@@ -9,7 +10,6 @@ Sensu Go has no built-in HTTP handler. This integration uses a pipe handler: the
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure Sensu Go
----
The steps below are based on Sensu Go 6.x and use `sensuctl`. You need permission to create handlers and pipelines and to edit checks in the target namespace.
@@ -144,7 +143,6 @@ You can also create events by hand for a proxy entity through the Sensu events A
## Alert Key
----
Flashduty computes the Alert Key from the entity's namespace `entity.metadata.namespace`, the entity name `entity.metadata.name`, and the check name `check.metadata.name`. Trigger, repeat, and resolution events for the same check on the same entity carry the same three fields, so they land on the same alert. Events from proxy checks (`proxy_entity_name`) use the proxy entity as their entity, so each proxy entity gets its own alert.
@@ -153,7 +151,6 @@ Changes to the status, check output, `occurrences`, time, event ID, or silenced
Flashduty rejects a request that lacks `entity` or `check` (for example a metrics-only event), or lacks the namespace, entity name, check name, or `check.status`. `curl` then exits with a non-zero code, and the Sensu backend log records the handler failure.
## Alert lifecycle
----
| Sensu event | Flashduty action |
| :--- | :--- |
@@ -164,7 +161,6 @@ Flashduty rejects a request that lacks `entity` or `check` (for example a metric
With the `is_incident` filter, every execution of a check that stays non-zero is posted once, and these events merge into the same alert.
## Severity
----
| `check.status` | Sensu meaning | Flashduty severity |
| :--- | :--- | :--- |
@@ -176,7 +172,6 @@ With the `is_incident` filter, every execution of a check that stays non-zero is
A resolution event takes the severity of the most recent non-zero status in `check.history`.
## Alert content
----
- **Title**: `: `
- **Description**: the check output `check.output`, followed by the namespace, status code, `check.state`, and `occurrences`
@@ -185,7 +180,6 @@ A resolution event takes the severity of the most recent non-zero status in `che
The check command, secrets, and the entity's `redact` field are not written to labels.
## Troubleshooting
----
- **Flashduty receives no alert**: search the backend log for runs of the `flashduty` handler (`journalctl -u sensu-backend`), make sure the check's `pipelines` include `flashduty`, and make sure the event status is non-zero
- **The handler reports `curl: not found`**: `curl` is not installed on the backend machine or container
diff --git a/en/on-call/integration/alert-integration/alert-sources/sentry.mdx b/en/on-call/integration/alert-integration/alert-sources/sentry.mdx
index af5811ea..0f5e3ab2 100644
--- a/en/on-call/integration/alert-integration/alert-sources/sentry.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/sentry.mdx
@@ -1,5 +1,6 @@
---
title: "Sentry Alert Events"
+sidebarTitle: "Sentry"
description: "Sync Sentry alert events to Flashduty via webhook for automated alert noise reduction"
---
@@ -8,60 +9,60 @@ Sync Sentry alert events to Flashduty via webhook for automated alert noise redu
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this simpler option when you don't need to route alert events to different channels.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a specific channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Select **Sentry** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this option when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Sentry** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In Sentry
----
-## I. Prerequisites
+### Prerequisites
Sentry provides two types of alert mechanisms: Issue Alerts and Metric Alerts. While Issue Alerts support notifications through WebHooks in Integrations, Metric Alerts are limited to using Internal Integration for alert notifications. Notably, Internal Integration works with both Metric Alerts and Issue Alerts. Given the versatility of Internal Integration, we've chosen to standardize on this approach rather than relying on WebHooks separately, thus simplifying alert notification configuration.
-## II. Sentry Alert Push Configuration
+### Sentry Alert Push Configuration
-### Step 1: Add Flashduty Custom Integrations
+#### Step 1: Add Flashduty Custom Integrations
1. Log in to the Sentry management console
-2. In the left navigation bar, locate **Settings => Custom Integrations**
+2. In the left navigation bar, locate **Settings → Custom Integrations**
3. Click Create New Integration and select **Internal Integration**
4. On the editing page, **enter Flashduty for Name and paste the integration push URL into WebhookURL**
5. Enable **Alert Rule Action**, configure as shown below:
-
+
-5. In PERMISSIONS configuration, set **Read permission for Issue & Event**
+ 5. In PERMISSIONS configuration, set **Read permission for Issue & Event**
6. In WEBHOOKS configuration, check **issue**, **do not check error and comment**
7. After configuration, click Save Changes to complete the setup
@@ -72,27 +73,27 @@ Sentry provides two types of alert mechanisms: Issue Alerts and Metric Alerts. W
2. Other issue events such as create, assigned, archived, and unresolved are not supported
3. If error and comment are also checked, Flashduty will not receive or process these types of events
-### Step 2: Use Flashduty Integration in Alerts
-1. In the left navigation bar, locate **Alerts => Create Alert**
+#### Step 2: Use Flashduty Integration in Alerts
+1. In the left navigation bar, locate **Alerts → Create Alert**
2. Select the type of Alert to create, such as Issue
-
+
3. Configure trigger conditions as needed
4. Under **THEN perform these actions**, **Add action** and select **Send a notification via**
-
+
5. Select **Flashduty** added above as the notification channel
-
+
6. Configure other options as needed and click **Save Rule** to complete
-## III. Status Mapping
+## Status Mapping
diff --git a/en/on-call/integration/alert-integration/alert-sources/sevone.mdx b/en/on-call/integration/alert-integration/alert-sources/sevone.mdx
index 9e731c33..4014ecdc 100644
--- a/en/on-call/integration/alert-integration/alert-sources/sevone.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/sevone.mdx
@@ -1,5 +1,6 @@
---
title: "IBM SevOne NPM alert integration"
+sidebarTitle: "IBM SevOne NPM"
description: "Send IBM SevOne NPM policy alert triggers and clears to Flashduty On-call through a Webhook Definition."
keywords: ["alert integration", "IBM SevOne", "SevOne NPM", "Webhook Definition", "Policy", "alertId"]
---
@@ -9,7 +10,6 @@ Use IBM SevOne NPM 8.x Webhook Definition Manager to send policy alert triggers
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure SevOne NPM
----
Create two Webhook Definitions: one sent when an alert triggers, one sent when it clears.
@@ -43,9 +42,9 @@ Create two Webhook Definitions: one sent when an alert triggers, one sent when i
4. Set **Request Method** to **POST** and **Content Type** to **application/json**
5. Paste this template into **Body**:
-```json
-{"event":"trigger","alert_id":"$alertId","severity":"$alertState","message":"$alertMessage","alert_type":"$alertType","occurrences":"$occurrences","device_id":"$deviceId","device_name":"$deviceName","device_ip":"$deviceIp","device_group":"$groupName","policy_id":"$policyId","policy_name":"$policyName","threshold_name":"$thresholdName","object_name":"$objectName","plugin":"$pluginName","cluster":"$clusterName"}
-```
+ ```json
+ {"event":"trigger","alert_id":"$alertId","severity":"$alertState","message":"$alertMessage","alert_type":"$alertType","occurrences":"$occurrences","device_id":"$deviceId","device_name":"$deviceName","device_ip":"$deviceIp","device_group":"$groupName","policy_id":"$policyId","policy_name":"$policyName","threshold_name":"$thresholdName","object_name":"$objectName","plugin":"$pluginName","cluster":"$clusterName"}
+ ```
6. Click **Test Definition** to check that the request can be sent, then click **Save**
@@ -83,7 +82,6 @@ Let a policy trigger and confirm Flashduty shows an active alert. Then let it cl
## Payload
----
Each field is the substitution of one SevOne variable (see IBM's [Webhook Definition Manager](https://www.ibm.com/docs/en/SSUWLY_8.0/nms/Webhook_Definition_Manager.html)):
@@ -105,14 +103,12 @@ Each field is the substitution of one SevOne variable (see IBM's [Webhook Defini
SevOne outputs `n/a` for a variable a policy type does not support (for example `$pluginName` on flow policies). Flashduty ignores `n/a`.
## Alert Key
----
Flashduty uses `alert_id` (`$alertId`, described by IBM as "The id of the triggered alert") as the Alert Key. Repeated triggers and the clear of one SevOne alert carry the same `alert_id`, so they land on one Flashduty alert. Changing the policy name, severity or message does not change the Alert Key.
If `alert_id` is empty, `n/a`, or still the unsubstituted `$alertId`, Flashduty returns a parameter error.
## Status and severity
----
`$alertState` is the policy severity. A clear event keeps the alert's severity and sets the status to recovered.
@@ -124,7 +120,6 @@ If `alert_id` is empty, `n/a`, or still the unsubstituted `$alertId`, Flashduty
| Empty or other | Warning |
## FAQ
----
@@ -153,7 +148,6 @@ The templates on this page are for the Policy type. Trap definitions use a diffe
## Troubleshooting
----
- **SevOne cannot deliver**: check that Destination URL is the complete push URL; for a self-signed TLS certificate, check **Allow insecure webhook connection**, and use a certificate with a SAN rather than only a Common Name
- **Flashduty returns a parameter error**: check that Content Type is application/json, `event` is `trigger` or `clear`, and `alert_id` has a value
diff --git a/en/on-call/integration/alert-integration/alert-sources/signoz.mdx b/en/on-call/integration/alert-integration/alert-sources/signoz.mdx
index 6f07f504..04be8181 100644
--- a/en/on-call/integration/alert-integration/alert-sources/signoz.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/signoz.mdx
@@ -1,5 +1,6 @@
---
title: "SigNoz Alert Integration"
+sidebarTitle: "SigNoz"
description: "Receive SigNoz alerts through SigNoz's webhook notification channel using a Flashduty Prometheus integration; resolve notifications close the alert automatically."
keywords: ["alert integration", "SigNoz", "webhook", "Prometheus", "Alertmanager", "observability"]
---
@@ -9,7 +10,6 @@ SigNoz's webhook notification channel sends Prometheus Alertmanager JSON (`statu
## In Flashduty On-call
----
Get an integration push URL in either of the two ways below. **Choose the Prometheus integration type** in both, not SigNoz.
@@ -30,7 +30,6 @@ Get an integration push URL in either of the two ways below. **Choose the Promet
## Configure in SigNoz
----
1. In SigNoz, go to **Settings** → **Notification Channels** (also reachable from the **Notification Channels** tab on the **Alerts** page) and click **New Channel**
2. Enter a channel name, select **Webhook** as the type, and enter the full push URL copied above as the endpoint URL, including `?integration_key=...`
@@ -38,7 +37,6 @@ Get an integration push URL in either of the two ways below. **Choose the Promet
4. Save, then select the channel in the threshold row (**send to**) of your SigNoz alert rules
## Field mapping
----
| SigNoz field | Flashduty |
| :--- | :--- |
@@ -53,7 +51,6 @@ Get an integration push URL in either of the two ways below. **Choose the Promet
SigNoz groups notifications by rule (`ruleId`); one notification can carry several alerts, and Flashduty handles each one separately (up to 100 per request). A firing rule normally arrives within a minute.
## Recovery and deduplication
----
- When SigNoz sends a notification with `status` set to `resolved`, Flashduty closes the alert with the same `fingerprint`.
- In current SigNoz rules the `severity` label is taken from the threshold row name (for example a threshold named `critical` or `warning`), which is also written to the `threshold.name` label. If you use a value that is not built in, such as `error`, configure a custom severity mapping on the Prometheus integration; otherwise it is treated as Warning.
@@ -61,7 +58,6 @@ SigNoz groups notifications by rule (`ruleId`); one notification can carry sever
- The channel's **Test** button sends a `firing` test alert titled `Test Alert ()` with `severity` `critical`. It opens a Critical alert in Flashduty and is never followed by a resolved notification, so close that alert manually.
## Troubleshooting
----
- **Flashduty returns `Invalid parameters`**: the push URL is incomplete and lacks `integration_key`, or the integration type is not Prometheus
- **Alerts do not recover**: confirm **Send resolved alerts** is on for the SigNoz channel and that the resolved notification's `fingerprint` matches the trigger
diff --git a/en/on-call/integration/alert-integration/alert-sources/simple-observability.mdx b/en/on-call/integration/alert-integration/alert-sources/simple-observability.mdx
index ce732109..6584fb9b 100644
--- a/en/on-call/integration/alert-integration/alert-sources/simple-observability.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/simple-observability.mdx
@@ -1,5 +1,6 @@
---
title: "Simple Observability alert integration"
+sidebarTitle: "Simple Observability"
description: "Send Simple Observability rule, server, job, and endpoint alerts and their recoveries to Flashduty On-call through a webhook channel."
keywords: ["alert integration", "Simple Observability", "webhook", "server monitoring", "endpoint monitoring", "cron job monitoring"]
---
@@ -9,7 +10,6 @@ Use a Simple Observability webhook channel to send alerts and recoveries for ale
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## In Simple Observability
----
@@ -61,7 +60,6 @@ Simple Observability requires your endpoint to return a 2xx status code; otherwi
## Payload
----
The webhook POSTs JSON, which Flashduty parses directly without a template. `event_type` decides which kind of object the alert is about:
@@ -88,7 +86,6 @@ How the other fields appear in Flashduty:
| Job `server`, `schedule` | Labels `job_server`, `job_schedule` |
## Alert Key
----
Flashduty uses the object type plus the object ID as the Alert Key, for example `endpoint:`. The trigger and recovery notifications for one rule, server, endpoint, or job land on the same alert. Different objects produce different alerts, and objects of different types never affect each other even if their IDs match. Changing the name, severity, description, or time does not change the Alert Key.
@@ -99,7 +96,6 @@ The Simple Observability documentation shows only the trigger example for each t
## Status and severity
----
| Simple Observability `severity` | Flashduty severity |
| :--- | :--- |
@@ -111,7 +107,6 @@ The Simple Observability documentation shows only the trigger example for each t
Rule and job alerts carry a null `severity`, so they are treated as Warning. A recovery notification (`RESOLVED`, `SERVER_UP`, `ENDPOINT_UP`, `SUCCESS`) closes the alert with the same Alert Key.
## FAQ
----
@@ -134,7 +129,6 @@ A rule alert produces one Flashduty alert per rule ID. The matching hosts and va
## Troubleshooting
----
- **Simple Observability reports an error**: confirm the webhook URL is the full push URL and includes `integration_key`
- **Flashduty returns a parameter error**: the message names the missing object ID or the unsupported `event_type` or `status`
diff --git a/en/on-call/integration/alert-integration/alert-sources/site24x7.mdx b/en/on-call/integration/alert-integration/alert-sources/site24x7.mdx
index 25c1f09b..37ae5a51 100644
--- a/en/on-call/integration/alert-integration/alert-sources/site24x7.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/site24x7.mdx
@@ -1,5 +1,6 @@
---
title: "Site24x7 alert integration"
+sidebarTitle: "Site24x7"
description: "Send Site24x7 monitor status changes to Flashduty On-call through a webhook. Alerts recover automatically when the monitor returns to Up."
keywords: ["alert integration", "Site24x7", "webhook", "Incident Parameters", "MONITOR_ID"]
---
@@ -9,7 +10,6 @@ Use the Site24x7 Webhooks third-party integration to send monitor status changes
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -30,7 +30,6 @@ You can get the integration push URL in either of the following ways.
## Configure Site24x7
----
@@ -76,14 +75,12 @@ The test alert is a `DOWN` notification for a fixed sample monitor (`MONITOR_ID`
## Alert Key
----
Flashduty uses the Site24x7 monitor ID as the Alert Key. It takes `MONITOR_ID` first and, when that is missing, extracts the ID from `MONITOR_DASHBOARD_LINK` (for example `.../home/monitors//Summary`). The Down, Trouble, Critical, and Up notifications of one monitor all carry the same monitor ID, so they are grouped into the same alert and the Up notification recovers it.
Changes to `STATUS`, the monitor name, the incident reason, the failed locations, or the time do not change the Alert Key.
## Status and severity mapping
----
| Site24x7 `STATUS` | Flashduty status or severity |
| :--- | :--- |
@@ -96,7 +93,6 @@ Changes to `STATUS`, the monitor name, the incident reason, the failed locations
Requests with an empty `STATUS` are rejected.
## Alert labels
----
Flashduty writes the following incident parameters to alert labels for filtering and troubleshooting:
@@ -118,7 +114,6 @@ Flashduty writes the following incident parameters to alert labels for filtering
The alert title comes from `MONITORNAME` and the alert description from `INCIDENT_REASON`.
## Troubleshooting
----
- **Site24x7 reports an integration failure**: Make sure the Hook URL is complete, includes `integration_key`, and uses POST
- **Flashduty returns a parameter error**: Make sure **Post as JSON** and **Send Incident Parameters** are both selected and the request body contains `MONITOR_ID` and `STATUS`
diff --git a/en/on-call/integration/alert-integration/alert-sources/skywalking.mdx b/en/on-call/integration/alert-integration/alert-sources/skywalking.mdx
index b95b504c..c352d9fb 100644
--- a/en/on-call/integration/alert-integration/alert-sources/skywalking.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/skywalking.mdx
@@ -1,5 +1,6 @@
---
title: "Skywalking Alert Events"
+sidebarTitle: "Skywalking"
description: "Sync Skywalking alert events to Flashduty via webhook for automated alert noise reduction"
---
@@ -8,45 +9,45 @@ Sync Skywalking alert events to Flashduty via webhook for automated alert noise
## In Flashduty
----
You can obtain an integration push URL through either of these two methods:
### Using Private Integration
Choose this method when you don't need to route alert events to different channels. It's simpler and recommended.
-
- Expand
+
+
1. Go to the Flashduty console, select **Channel**, and enter a specific channel's details page
2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration** to enter the integration page
3. Choose **Skywalking** integration and click **Save** to generate a card
4. Click the generated card to view the **push URL**, copy it for later use, and you're done
-
+
+
### Using Shared Integration
Choose this method when you need to route alerts to different channels based on the alert event's payload information.
-
- Expand
+
+
- 1. Go to the Flashduty console, select **Integration Center=>Alert Events** to enter the integration selection page
+ 1. Go to the Flashduty console, select **Integration Center → Alert Events** to enter the integration selection page
2. Select **Skywalking** integration:
- **Integration Name**: Define a name for this integration
3. Configure the default route and select the corresponding channel (after the integration is created, you can go to `Route` to configure more routing rules)
4. Click **Save** and copy the newly generated **push URL** for later use
5. Done
-
+
+
## In Skywalking
----
-## I. Modify Skywalking Service Configuration File
+### Modify Skywalking Service Configuration File
1. Log in to the Skywalking server
2. Locate the Skywalking configuration file ./config/alarm-settings.yml
@@ -85,7 +86,7 @@ hooks:
-## II. Status Mapping
+## Status Mapping
diff --git a/en/on-call/integration/alert-integration/alert-sources/snyk.mdx b/en/on-call/integration/alert-integration/alert-sources/snyk.mdx
index e2243cba..b60c399c 100644
--- a/en/on-call/integration/alert-integration/alert-sources/snyk.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/snyk.mdx
@@ -1,5 +1,6 @@
---
title: "Snyk alert integration"
+sidebarTitle: "Snyk"
description: "Send Snyk open source and container issues, new and removed, to Flashduty On-call through a Snyk webhook."
keywords: ["alert integration", "Snyk", "webhook", "vulnerability", "security alerts", "SCA"]
---
@@ -11,7 +12,6 @@ Snyk webhooks currently cover Open Source and Container scans. The Webhooks API
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can get the integration push URL in either of the following ways.
## In Snyk
----
Snyk webhooks can only be created through the API; the Snyk web console has no entry for them.
@@ -81,19 +80,16 @@ Wait for (or trigger) a project retest and confirm that a new issue opens an ale
## About the signature
----
Snyk signs each request in the `X-Hub-Signature` header (`sha256=`, keyed with the `secret` you set when creating the webhook). Flashduty does not verify it, so `secret` can be any random string. The `integration_key` in the push URL is the only credential; keep it private.
## Alert Key
----
Flashduty builds the Alert Key from the **project ID (`project.id`) plus the issue ID (`id`)**: one alert per issue per project. Issues in `newIssues` and `removedIssues` share the same shape and `id`, so an issue appearing and disappearing land on the same alert.
Changes to the project name, branch, or severity do not change the Alert Key. An issue that repeats for several dependency paths of one project produces a single alert. The same issue in two projects is two alerts.
## Status and severity
----
| Source | Flashduty behavior |
| :--- | :--- |
@@ -117,7 +113,6 @@ One request processes at most the first 100 issues of `newIssues` and of `remove
Alert labels include the project ID and name, project type, branch, organization, issue ID, package name and versions, CVE, CWE, CVSS score, and the fixed-in version. The importing user's name and email are not written to the alert.
## Troubleshooting
----
- **The create call returns an error**: check that `url` is HTTPS, the token has access to the organization, the organization is in a region where Snyk webhooks are available, and the plan includes API access (the Free plan returns `not entitled for api access`)
- **No alerts arrive**: Snyk sends an event only when a project is retested and it is not sent when a project is first imported. Make sure the project's scan type is Open Source or Container
diff --git a/en/on-call/integration/alert-integration/alert-sources/solarwinds-orion.mdx b/en/on-call/integration/alert-integration/alert-sources/solarwinds-orion.mdx
index 76c4230c..4280b9c1 100644
--- a/en/on-call/integration/alert-integration/alert-sources/solarwinds-orion.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/solarwinds-orion.mdx
@@ -1,5 +1,6 @@
---
title: "SolarWinds Platform (Orion) alert integration"
+sidebarTitle: "SolarWinds Platform (Orion)"
description: "Send SolarWinds Platform (Orion) alerts to Flashduty On-call through the alert's HTTP request actions. Alerts close automatically when they reset in SolarWinds."
keywords: ["alert integration", "SolarWinds", "Orion", "SolarWinds Platform", "NPM", "SAM", "network monitoring"]
---
@@ -11,7 +12,6 @@ SolarWinds Platform (formerly Orion Platform, self-hosted, including products su
## In Flashduty On-call
----
You can get the integration push URL in either of the following ways.
@@ -32,7 +32,6 @@ You can get the integration push URL in either of the following ways.
## Configure SolarWinds Platform
----
The steps below need a SolarWinds Platform account with **Allow Alert Management Rights**. The SolarWinds server must be able to reach the domain of the Flashduty push URL over HTTPS (port 443).
@@ -118,7 +117,6 @@ You can also let the alert trigger for real (for example by lowering a threshold
## Alert Key
----
Flashduty uses `alert_object_id` (`${N=Alerting;M=AlertObjectID}`) as the Alert Key. SolarWinds assigns one fixed AlertObjectID to each alert definition and triggered object pair (for example "Node is down" on one switch). The trigger, repeated notifications, and the reset on that object all carry the same ID, so they land on one Flashduty alert; if the alert triggers again after a reset, a new Flashduty alert opens. When the same alert definition triggers on different objects, each object has its own AlertObjectID and gets its own alert.
@@ -127,7 +125,6 @@ Changes to the alert name, severity, object name, or alert message do not change
Flashduty rejects a request that is missing `action` or `alert_object_id`, or whose `alert_object_id` is still the unrendered `${N=Alerting;M=AlertObjectID}`.
## Alert lifecycle
----
Flashduty handles each notification by its `action` field (case-insensitive):
@@ -139,7 +136,6 @@ Flashduty handles each notification by its `action` field (case-insensitive):
Acknowledging an alert in SolarWinds does not run any action, so the Flashduty alert does not change.
## Severity
----
The severity comes from the alert definition's **Severity of Alert** (`${N=Alerting;M=Severity}`), case-insensitive:
@@ -155,7 +151,6 @@ The severity comes from the alert definition's **Severity of Alert** (`${N=Alert
The reset notification carries the alert definition's severity, and the recovery event keeps it.
## Alert content
----
- **Title**: ` on