@hyperdx/api@2.38.0
Minor Changes
-
74c28e7: feat: Alerts now persist their own
displayNameandtags -
9c4f94f: Add enriched template variables to Generic and incident.io webhook bodies:
{{alertId}},{{status}},{{alertType}},{{comparator}},{{threshold}},
{{value}},{{groupKey}},{{sourceQuery}},{{teamId}},{{note}}, and
ISO-8601{{startTimeISO}}/{{endTimeISO}}alongside the existing Unix-ms
{{startTime}}/{{endTime}}.Receivers can now route, filter and dedupe on an alert's identity and condition
without parsing the rendered message body. Existing templates are unaffected —
every new variable is additive and renders empty when an alert doesn't carry it. -
f0d1cef: Support inline chart alerts (source
inline+chartConfig) in the external
API v2 and the MCPclickstack_save_alert/clickstack_get_alerttools.
Inline alerts can now be created, updated, listed, and deleted through
/api/v2/alertsusing the same tile-config dialect as v2 dashboards, with the
same validation rules as the internal API: display-type allowlist, metric
formula validation, the formula source-kind gate, raw SQL template validation,
and team-scoped source/connection ownership. Passing achartConfigto a
tileorsaved_searchalert is now rejected instead of silently dropped,
and reading an inline alert whose config carries internal-only fields omits
chartConfigrather than returning a lossy approximation.Also fixes three pre-existing issues on the external v2 dashboards path: a
gauge tile saved throughclickstack_save_dashboardwithisDelta: truewas
persisted as a non-delta (the flag was dropped converting MCP tiles to the
internal shape); a tile config carrying an unrecognizedconfigType(e.g.
promql) was silently stored as a builder config and skipped the formula and
number-select rules, and is now rejected; and validation errors on alert
bodies no longer collapse toInvalid input— the schema reports the failing
branch's own message. -
d9c5c45: fix: preserve a Connection host path prefix when proxying PromQL.
proxyToPrometheusjoined absolute Prometheus paths (/api/v1/query_range,
/api/v1/query,/api/v1/query_exemplars,/api/v1/label/.../values) with
new URL(path, host), which replaces the host pathname instead of appending to
it. VictoriaMetrics clustervmselectURLs such as
http://vmselect:8481/select/0/prometheuswere rewritten to
/api/v1/query_rangeand rejected. The join now keeps the existing pathname.This is a behavior change for Connections whose host already included a path
that was never meant as a Prometheus API prefix — for example
http://prom:9090/graphcopied from the Prometheus UI. That previously happened
to work because the absolute API path replaced/graph; requests now go to
/graph/api/v1/query_rangeand will 404. Trim stray paths from existing
Connection hosts before upgrading. Root-mounted hosts (http://prom:9090or
http://prom:9090/) are unchanged.Query parameters on the Connection host are now only a fallback for a fixed set
of real Prometheus API params (query,time,start,end,step,
match/match[],limit,timeout,stats): a request value for one of
these (including repeatable ones such asmatch[]) always wins and replaces a
same-named host value outright, rather than being dropped. Any other host query
key the request never mentions -- for example?extra_label=namespace%3Dprod
pinning a VictoriaMetrics tenant scope -- is left as-is and is never overridable
by the request, since a param name outside that fixed set is not forwarded at
all regardless of what the host carries. This also means a host copied with a
stray query string (not just a stray path) now forwards its non-Prometheus keys
upstream as a fallback on every request -- trim those too if they weren't
intended as Prometheus API params.This is also a behavior change for a direct API caller (e.g. curl or Terraform)
that previously relied on sending an arbitrary, non-Prometheus query param
through this endpoint: that param is now silently dropped rather than forwarded,
regardless of whether the Connection host carries anything under the same name.
Patch Changes
-
25a3b01: Fix
{{sourceQuery}}returning empty for inline-query and dashboard-tile
alerts. It read only the saved search's filter, so alerts backed by a chart
config — where the query lives on the alert or the tile — advertised a variable
that never rendered. It now resolves the query from whichever config backs the
alert: the builderwhereor the rawsqlTemplate.Add
{{thresholdMax}}, the upper bound of abetween/outsidecondition.
Receivers previously saw only the lower bound and could not reconstruct the
range that fired. It renders empty for every other comparator.Test Webhook now sends a sample value for every template variable. It carried
only the original seven, so a body using an enriched variable rendered it empty
— and becausethreshold,thresholdMaxandvalueare emitted unquoted, a
body like{"value": {{value}}}was sent as{"value": }and rejected,
failing the test for a template that works on a real firing. -
808b345: Accept
Bearer-prefixed Authorization header values on the OTel ingest endpoint in OpAMP-managed mode. The collector's bearer-token authenticator matches the full header value exactly and was configured with only the bare API key, so RFC 6750 clients that sendAuthorization: Bearer <token>were rejected. The generated collector config now also acceptsBearer,bearer, andBEARERprefixed forms of each ingestion API key. -
bf4443d: feat: Support autocomplete for PromQL label filters
-
55db91f: feat: Support static filters in MCP
-
89a897e: Fixed single-series histogram charts failing with "Unknown expression or function identifier" when sorted by a group-by column or expression. The histogram translation packs group values into a single
groupArray, so the table default ORDER BY (the raw group-by text) referenced source columns that no longer exist in scope; matched sort items now address the packed array positionally. -
f1062a7: Fixed multi-series metric charts failing with "Unknown expression or function identifier" when sorted by an expression group-by (e.g.
ResourceAttributes['service.name']). Table tiles default their ORDER BY to the group-by text, so any multi-series metric table grouped by a resource/attribute-derived expression failed to render. Such sort expressions are now evaluated inside each per-series branch through internal companion columns instead of being re-evaluated in the composed outer query, where the source columns no longer exist. -
4184a89: feat: Support dashboard filters based on Prometheus label values
-
2736003: feat: Support series filter (matcher) in PromQL label dashboard filters
-
7ed8dc8: feat: Evaluate Prometheus
match[]series selectors on the labels and label values endpoints for ClickHouse TimeSeries connections -
bcf0257: feat: Accept optional time bounds on Prometheus label values endpoint
-
cff6388: feat: Add static filters to schemas and APIs
-
Updated dependencies [74c28e7]
-
Updated dependencies [b917308]
-
Updated dependencies [55db91f]
-
Updated dependencies [89a897e]
-
Updated dependencies [f1062a7]
-
Updated dependencies [4184a89]
-
Updated dependencies [2736003]
-
Updated dependencies [c796592]
-
Updated dependencies [cff6388]
- @hyperdx/common-utils@0.28.1