Integrate Spike with Dash0
Send Dash0 check rule notifications to Spike so a failing check pages your on-call rotation by phone, SMS, Slack or Teams, and resolves when the check recovers.
Dash0 is an OpenTelemetry-native observability platform. Its check rules watch your traces, metrics and logs, and raise an issue when a rule starts failing. Point a Dash0 Webhook notification channel at Spike and that issue becomes an incident: it escalates through your policy like every other integration, and Dash0 resolves it for you when the check recovers.
What Spike does with each notification
Every Dash0 webhook body carries a type that says where the issue is in its lifecycle. Spike acts on it:
type
What happens in Spike
alert.ongoing
Opens an incident for that issue, or adds an event to the one already open
alert.resolved
Auto-resolves the open incident. Dropped when nothing is open
alert.closed
Auto-resolves the open incident. Dropped when nothing is open
alert.superseded
Adds an event to the open incident and leaves it open. Never opens an incident on its own
alert.superseded is what Dash0 sends when the issue instance is replaced, which in practice means you edited the check rule while it was failing. The check can still be failing at that moment, so Spike treats it as an update and not as a recovery: the notification joins the open incident, and the alert.ongoing that follows against the new version of the rule joins it too. Editing a rule mid-incident neither resolves the incident nor pages anyone a second time.
There is one incident per data.issue.issueIdentifier. That identifier is stable for a given check rule and resource across issue instances, so a check that flaps, a reminder notification, and a degraded that turns into a critical all land on the incident already open instead of paging the team again.
Auto-resolution needs nothing switched on. As long as the channel is attached to the check rule, Dash0 sends alert.resolved when the check recovers, or alert.closed when the issue is closed in Dash0, and Spike resolves the incident.
Incident titles
Titles read Check failing: {check rule name} on {service}, so an incident says what broke and where without anyone having to open it:
Check failing: Payments API error rate above 5% on payments-apiThe Check failing: prefix is there because check rule names usually describe the healthy state. Without it, Checkout page loads arriving at three in the morning reads like good news.
The service comes from the issue's labels, falling back to the check rule's own labels, and Spike takes the first of these that is set:
dash0.resource.name, service.name, service_name, service, k8s.deployment.name, k8s.statefulset.name, k8s.daemonset.name, k8s.cronjob.name, k8s.job.name, k8s.pod.name, k8s.namespace.name, k8s.cluster.name, host.name, host, container.name, faas.name, cloud.resource_id, instance, job
That order is fixed rather than the order the labels happen to arrive in, so one check rule always names its resource the same way. When none of them is set — a synthetic check with no resource behind it, for instance — the title is simply Check failing: {check rule name}.
Two fallbacks cover a body that names no rule at all:
A check rule id but no name
Dash0 check chk_7e1d0a failing
Nothing usable
Dash0 alert with no details
A recovery is the same title with [RESOLVED] in front of it.
A title over 200 characters is shortened at a word boundary with ..., keeping on {service} whole, because the service is the part you need to hear.
Use the Title Remapper if you want a different shape — there is an example further down this page.
Severity
Dash0 check rules fail in two degrees, degraded and critical, and the one that applies is in data.issue.status. Spike does not read it today, so a Dash0 incident arrives without a severity whichever degree failed.
Set it with an alert routing rule instead. Add an Incident details condition on the key data.issue.status, and give each degree the action you want:
data.issue.status equals critical
Mark severity as SEV1, and load a wider escalation policy if you have one
data.issue.status equals degraded
Mark severity as SEV2, or Ignore incident to keep those out of Spike entirely
Prerequisites
A Dash0 organization with permission to manage notification channels in Settings
At least one check rule to attach the channel to
A Dash0 integration in Spike and its webhook URL
Step 1 — Create the integration in Spike
In Spike, go to Integrations → Add integration → Dash0, attach it to a service and an escalation policy, and copy the webhook URL. It looks like https://hooks.spike.sh/<your-token>/push-events.
Step 2 — Add a Webhook notification channel in Dash0
In Dash0, go to Settings → Notification channels → Add and pick Webhook. Fill in:
Name — something you will recognise in the check rule editor, for example
Spike - payments on-call.URL — the webhook URL you copied in Step 1.
Additional HTTP headers — leave empty. The token in the URL is what authenticates the request to Spike, so there is nothing else to send.
Rate limit — optional. It throttles how often this channel repeats a notification for the same issue. Spike groups repeats onto the open incident and does not page again, so you can leave it at the Dash0 default; lowering it only makes the incident timeline quieter.
Save the channel. A channel can be disabled without deleting it, which is the easiest way to mute Spike during a planned migration.
Step 3 — Attach the channel to your check rules
Dash0 gives you two ways to route issues to the channel, and they can be combined:
Open a check rule, go to its Notifications section, and select the Spike channel. Repeat for every rule that should page on-call.
This is the explicit route. Use it when only a handful of rules deserve a page.
On the channel, set up label-based routing so any check rule whose labels match is delivered to Spike. Filters are written as label key, operator and value, for example team.name is sre and deployment.environment.name is production. Conditions inside one group are ANDed, and each group is ORed with the others.
This is the route to use when rules are created by teams or by code and you do not want to remember to tick a box each time.
Only page on critical
A check rule can fail as degraded before it fails as critical. If you only want Spike involved for the second, add the trigger dash0.failed_check.max_status=critical where the channel is attached. Dash0 then holds back the degraded notifications and Spike never sees them.
Leave the filter off if you would rather have every failure in Spike and sort it out there — a degraded issue opens an incident like any other, and the alert routing rule above can downgrade or drop those without anyone touching Dash0.
Step 4 — Send a test notification
Back in Settings → Notification channels, find the channel and choose Send test notification. A test incident appears in Spike within a few seconds. Resolve it by hand — a test notification is a one-off, so nothing arrives afterwards to resolve it for you.
An incident on the right service, with the right escalation policy attached, means Dash0 can reach Spike and the wiring is done.
Managing the channel as code
Dash0's Kubernetes operator creates notification channels from a Dash0NotificationChannel custom resource, so the channel can live next to the check rules it serves:
The operator syncs the channel to Dash0 and reports back on the custom resource. frequency is the reminder interval for an issue that stays failing; set it to 0s to send one notification and nothing more. routing is the label-based attachment from Step 3, and can be left out if you attach the channel to check rules individually.
The webhook URL is a credential — anyone holding it can open incidents on your service. Keep the custom resource out of a public repository, or template the URL in from a secret at deploy time.
Terraform users can hand the same YAML to the Dash0 provider:
Payload reference
Dash0 posts a fixed JSON body. These are the fields Dash0 documents, and the ones Spike's behaviour depends on:
type
Where the issue is in its lifecycle: alert.ongoing, alert.resolved, alert.superseded or alert.closed
data.issue.id
Unique ID for this specific issue
data.issue.issueIdentifier
Identifier for the combination of check rule and resource. Stable across issue instances, which is what Spike groups on
data.issue.checkrule.id
Unique ID of the check rule that raised the issue
data.issue.checkrule.version
Version of that check rule. This is what changes when an issue is superseded
The body carries more than this — the check rule name, a summary, the failing status, a link back to the issue in Dash0 and the issue's labels are all in there. Spike reads the rule name and the labels for the incident title and keeps the rest on the incident page. The full body as Dash0 sent it is stored on the incident, so the first notification you receive shows you exactly what your Dash0 organization sends.
Label values
Labels arrive in OpenTelemetry's AnyValue shape: the value is an object that names its own type rather than a bare value.
Spike reads stringValue, intValue, doubleValue and boolValue, and also accepts a plain string, which is the shape a check rule's own labels use.
Note the underscore in service_name. A label that comes out of a query keeps the name the query gave it, so the same concept reaches Spike as service_name from one rule and as the OpenTelemetry service.name from another. Both are in the list under Incident titles, so either one names the service.
Rewriting the title
Point a Title Remapper at the Dash0 integration to build your own title out of that body. A remapper replaces the whole title, so the Check failing: prefix and the on {service} suffix go with it. This one prefers the issue summary and falls back to the check rule id, which is always there:
Open the remapper against a real incident first — the preview shows the payload your check rules actually produce, which is the quickest way to find the field you want.
A summary moves as an issue develops, so remapping onto one gives an incident a title that changes under it. Prefer fields that are fixed for the life of the issue, which is why the built-in title uses the rule name and the service.
Things worth knowing
One incident per check rule and resource. Two resources failing the same check rule are two issues in Dash0, so they are two incidents in Spike. That is usually what you want when they page different people through alert rules.
Editing a failing check rule does not close its incident. Dash0 supersedes the issue instance, Spike keeps the one incident open, and the notifications from the new version of the rule join it. Nobody is paged twice for one rule edit.
A resolution with nothing open is dropped. If you resolved the incident in Spike before the check recovered, the
alert.resolvedthat follows is ignored rather than reopening anything.Reminders do not page twice. Dash0's
frequencyre-notifies while an issue is failing. Those land as events on the open incident.The test notification does not auto-resolve. It is a single synthetic notification with no recovery behind it.
Troubleshooting
Last updated
Was this helpful?