Minor Changes
-
ff1e77c: Backfill alert
displayNameandtagsfrom the referenced saved search or dashboard on API startup. Alerts that already have a display name or tags are skipped. -
e31e5d8: Offer dashboard tile alerts for Terraform import.
clickhouse_clickstack_alert
gainedsource = "tile"withdashboard_id/tile_idin provider 3.28.0, so
the bulk export and the per-alert menu now include tile alerts instead of
skipping every alert that is not a saved-search one. A file carrying a tile
alert asks for>= 3.28.0and explains the hand edit its generated config
needs; an export without one still installs on 3.25.x. A tile alert is withheld
when its tile has a blank or duplicated name — the provider'stile_idsmap is
keyed by tile name and omits those, so the alert could only be pinned to a
literal id the next dashboard apply can re-mint — or when its dashboard is
provisioned, since ProvisionDashboardsTask rewrites those tiles wholesale. Both
decisions are made server-side, on the import manifest and on the alerts
listing, because neither response carries a dashboard's sibling tile names. -
f007c37: Add a context-aware getting-started checklist to the sidebar for recently-created teams. After the setup steps (connect ClickHouse, add data) complete, a second phase tracks product-usage milestones persisted per user on
user.onboardingData: exploring data, building a dashboard, setting up an alert, and using the MCP server. Completion is recorded server-side so it counts from the UI, the external REST API v2, or an MCP tool; the card can be dismissed and reappears if a new task is added to the registry. -
b217430: feat: run PromQL against ClickHouse through its Prometheus HTTP API
ClickHouse-backed
/queryand/query_rangenow proxy to the connection's/prometheus/api/v1/*endpoint (theprometheus_api_v1HTTP handler, ClickHouse 26.8+) instead of calling theprometheusQuery/prometheusQueryRangetable functions. Thedatabaseandtablequery parameters are forwarded so one handler serves any TimeSeries table. ClickHouse holds the Prometheus API forward-compatible while the TimeSeries engine is in preview; the table functions and inner-table schema are not. Bundled ClickHouse images move to 26.8. -
972634d: Report the whole alert condition in the
{{sourceQuery}}webhook template
variable. It read only a chart's top-levelwhere, so an alert defined by a
per-seriesaggCondition— a common shape — still rendered empty. The variable
now reports every part of the condition the alert query actually applies: a
chart'swhereplus theaggConditionof the series the alert reads, and a
saved search'swhereplus its pinned filters. A chart's pinned filters are
deliberately excluded, since a tile or inline alert does not apply them. The
value is truncated at 2000 characters.Editing an alert off a
betweenoroutsidecomparator now clears the stored
thresholdMaxinstead of leaving the old bound on the document, where it was
also served by the alerts APIs and would advertise a range that no longer
fires. Webhook templates already guarded against this on read.The webhook form's variable list and the API's fallback body template both
derive from one list in common-utils, whichbuildWebhookTemplateVariablesis
typed against, so a variable cannot be added without appearing in both places.
The "Send test" payload carries a sample value for every variable, so a body
template can be checked before an alert fires.The documented guard for an optional number is now
{{#unless (eq thresholdMax undefined)}}rather than{{#if thresholdMax}},
which treats a legitimate bound of0as absent.
Patch Changes
-
4d18cb0: fix: fetch a grouped alert's example log lines once per window
A saved-search alert puts a handful of example log lines into the notification it sends, and fetching them takes a second query. That query was being made while building each message, so an alert grouped by service asked ClickHouse for the same lines once per breaching service — ten services meant ten identical queries over the same data, because the query only filters by the saved search and the time window, never by the group. It now runs once and every notification for that window shares the answer. An alert catching up on skipped ticks still fetches lines for each window it backfills, since those genuinely differ. Ungrouped alerts are unaffected; they only ever asked once.
-
c8cc8e5: feat: Include alert tags in the tags API response
-
482d2cb: feat: Paginate the alerts page
-
5311d63: fix: give incident.io webhooks a body incident.io accepts
An incident.io webhook saved without a body was sent the generic
{"text": ...}payload, which has neither of the two fields incident.io requires, so every delivery was rejected and no alert was ever raised. It now gets an incident.io payload carrying a deduplication key that is stable across a firing and its resolve, so incident.io closes the alert it opened, plus the alert id, status, condition and evaluation window inmetadatafor routing. The webhook body editor and its list of template variables are also available when incident.io is the selected service, not only for Generic, so the payload can be tailored to an alert source's configured fields. -
6b39171: Accept metric selects without a value expression on the external dashboards API. A tile that aggregates a metric names its value with
metricNameand has no expression to give, so/api/v2/dashboards/validatewas rejecting dashboards the editor itself writes, and Terraform could not import them. -
84c67f4: fix: show only the delivery time in an alert's notification duration
The notification duration on an alert's evaluation list was timing everything an alert does once it decides to fire: building the message title and links, querying the log lines that go in the body, rendering the template, and then delivering it. That made the column read in seconds while the webhook underneath it answered in milliseconds — the column and its own per-target breakdown disagreed, and the figure was dominated by work that has nothing to do with how fast the notification target responded. It now times the delivery alone. Evaluations already recorded keep their old figure and will read high.
-
cfacdbe: feat: relative date ranges for dashboards can now be saved
-
806d242: feat: page and filter GET /alerts server-side
-
b19fa12: refactor(api): backport alertConfigHasGroupBy helper
-
78a33ba: feat: Allow configuring dashboard filters as required
-
edb693a: Apply saved-search pinned filters to alert notification sample queries so sample
log lines come from the same row set the alert counted. -
0a37198: fix: Keep
/api/sourcesresponses stable for sources whose storedmetadataMaterializedViewshas no nested_id -
bef61fb: feat: Scope tags endpoint by resource type
-
6c85ca0: feat: add a pluggable token encryption service for stored third-party tokens. Set
TOKEN_ENCRYPTION_KEYto a 32-byte key (base64 or hex) to encrypt them with AES-256-GCM; without it they are stored unencrypted. -
Updated dependencies [482d2cb]
-
Updated dependencies [e31e5d8]
-
Updated dependencies [5311d63]
-
Updated dependencies [96ac6b1]
-
Updated dependencies [84c67f4]
-
Updated dependencies [f007c37]
-
Updated dependencies [cfacdbe]
-
Updated dependencies [806d242]
-
Updated dependencies [f7ae72c]
-
Updated dependencies [b1e48b9]
-
Updated dependencies [78a33ba]
-
Updated dependencies [3876d6b]
-
Updated dependencies [bef61fb]
-
Updated dependencies [b484057]
-
Updated dependencies [972634d]
- @hyperdx/common-utils@0.29.0