Minor Changes
-
cd0e9ed: feat: add optional
titleEmojiwebhook option;falseremoves the emoji prefix from notification titles sent through that webhook -
5b0d074: feat: self-instrument with
@clickhouse/clickstack-nodeand
@clickhouse/clickstack-browserinstead of@hyperdx/node-opentelemetryand
@hyperdx/browserHyperDX's own telemetry changes shape. HTTP spans use the stable semantic
convention keys (http.request.method,http.response.status_code,
url.full). pino records come from the@opentelemetry/instrumentation-pino
scope with real severity numbers instead of thenode-loggerscope with
severity number 0. Console capture covers everyconsolecall in the API, and
browser console output is recorded as log records instead of spans. Uncaught
exceptions are recorded as FATAL log records, and API errors as an exception
event on the Express span instead of a separate error span.Browser telemetry records the user as
user.id,user.emailanduser.name
instead ofuserEmailanduserName, keeps the team name asteamName, and no
longer records auser navigatedaction. Browser fetch and XHR spans no longer
record request and response headers or bodies. Browser sessions restart once
after the upgrade. The per-signal browser endpoints and
NEXT_PUBLIC_OTEL_RESOURCE_ATTRIBUTESwork as before. Browser traces and logs
are now sent gzip-compressed every 5 seconds. If the browser sends to a
collector other than ClickStack's, its CORSallowed_headersmust be"*"or
includecontent-typeandcontent-encoding(andauthorization), and a proxy
in front of it must forwardContent-Encodingunchanged.The Next.js server now sends its own telemetry in production builds too, not
only undernext dev, whenHYPERDX_API_KEYorOTEL_EXPORTER_OTLP_HEADERSis
set.HDX_EXPORTER_ENABLED=falseturns it off along with browser telemetry. It
reports under its own service name, the configured one plus-next
(hdx-oss-app-nextin the docker-composeappservice and when no name is
set), so its spans stay apart from the API's and the browser's. The HyperDX
images now defaultOTEL_SERVICE_NAMEtohdx-oss-app. Each/apirequest
adds Next.js server spans for the proxy hop. Requests for build andpublic/
assets, such as/_next/static/*,/__ENV.jsand/pyodide/*, are not traced.HYPERDX_API_KEYstill enables self-instrumentation. Without
OTEL_EXPORTER_OTLP_ENDPOINT, server-side self-telemetry now goes to
http://localhost:4318instead ofhttps://in-otel.hyperdx.io, so set the
endpoint explicitly.HDX_NODE_*variables are no longer read. For request
headers and bodies setOTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_*and
CLICKSTACK_CAPTURE_HTTP_BODY. -
349fc21: feat(mcp): add
clickstack_describe_tableto list the tables in a database and describe a table that is not a registered source (columns, keys, engine, skipping indices, approximate size, optional row sample) -
0eec5e1: feat: Describe PromQL sources in MCP and hide them when PromQL is disabled
clickstack_describe_sourcenow returns the label names and metric names of a PromQL source, from either a ClickHouse TimeSeries table or a Prometheus-compatible endpoint, instead of a column schema.clickstack_list_sourcesandclickstack_describe_sourceshow which backend a PromQL source uses, and for TimeSeries tables explain how to read them withclickstack_sql. Prometheus endpoint sources no longer show their placeholder table. WhenENABLE_PROMQLis off, MCP hides PromQL sources from listing, describing and deleting, andclickstack_save_sourceno longer acceptskind: "promql". -
95fa364: feat(mcp): support setting a dashboard's
savedFilterValuesvia the MCP dashboard tools -
0b7926d: feat: Team members can create team-owned API keys with a description and expiry that keep working after their creator leaves.
-
c792850: feat: filter the v2 list alerts endpoint by tag, search, source and state
Patch Changes
-
30b1494: feat: add an internal extension point for alert detection strategies; threshold alerts are evaluated as before, and the
alerts.evaluatemetric now carries analert_evaluatorattribute -
0453aa1: fix: A grouped alert whose group vanishes from the data now resolves with the group's values in
{{attributes.*}}(alert title and message) and{{var.*}}(webhook body) -
5b0d074: fix: let browsers cache the collector's CORS preflights for 10 minutes
The OTLP receiver now answers preflights with
Access-Control-Max-Age: 600.
Without it, browsers cached a preflight for only 5 seconds, which is how often
the browser SDK exports, so about half of its requests were preflights. -
769c0de: fix: ignore
teamandcreatedByin dashboard and saved search PATCH bodies so they can't be moved to another team or have their owner rewritten -
9269f77: fix: "Denoise results" now removes noise on typical data. A pattern now counts as noisy above 5% of sampled events instead of 10%, which often matched nothing. Patterns that include error or warning lines are never hidden. The MCP
denoiseoption uses the same 5% threshold. Denoise also mines the source's body column instead of the last table column, removes ANSI-colored rows that match a noisy pattern, says when results can't be denoised, and shows hidden patterns as a short summary with a shortened, expandable list. -
48c8379: docs: Document
minAutoGranularityon metric and PromQL sources in the external
APIGET,POSTandPUT /api/v2/sourcesalready accepted and returned
minAutoGranularity, but the OpenAPI spec omitted it, so clients generated from
the spec dropped or rejected the field. -
6425332: perf: PromQL label lookups with
match[]read only the matched metrics' tags
rows when every selector names its metric -
6310023: fix: give
clickstack_save_source'shighlightedRowAttributeExpressionsparameter a real type in the MCP tool schema (it rendered as an untyped$ref), and setannotations.titleon every MCP tool -
5584f84: fix: make clickstack_event_patterns drill-down snippets executable
Each pattern's
whereSnippetis now a SQL predicate (whereLanguage: "sql") that keeps the template's token order and variable positions and includes the caller's filter and the source table filter, so passing it toclickstack_searchreturns the pattern's events. Before, a template likeSending <*> rowsproducedBody:"Sending rows", which matched nothing, and map fields produced Lucene that failed to parse.bodyExpressionnow also acceptsJSONExtractString(<column>, '<key>', ...)to mine a field inside JSON bodies, and the tool reports sample coverage and the actual trend bucket interval and boundaries.clickstack_event_patterns,clickstack_emerging_signalsand dashboard event-pattern tiles now apply the log source'stableFilterExpression, so their counts can drop for sources that set one.minePatternsnow reports each cluster's own template; before, it could report the template of a different same-length cluster that some members did not fit. -
253a690: docs: MCP tool descriptions and the query guide now recommend the quoted Lucene
formfield:"value"for exact matches, and bare terms or phrases for log body
text, so agents keep the primary key and the text index -
66e3941: feat: MCP
query_tileandquery_tilesrun PromQL tiles against Prometheus endpoints and ClickHouse TimeSeries tables -
7e85229: feat: MCP
clickstack_promqltool runs PromQL against a PromQL source, and the MCP prompts and instructions cover PromQL sources, tiles and label filters while PromQL is enabled -
9093282: fix: Refuse Prometheus endpoint responses over 8 MB in MCP PromQL label lookups and queries, instead of buffering them whole
-
53bf540: fix: MCP
query_tilereturns PromQL table and histogram heatmap tiles in the rows the dashboard draws -
917c9ca: feat: MCP dashboard tools read and write PromQL tiles and PROMETHEUS_LABEL filters when PromQL is enabled, and hide but keep them when it is disabled
-
d08b2fa: feat(mcp):
clickstack_sqlaccepts aqueriesarray to run up to 10
independent queries in parallel under a shared 60s deadline. Each query reports
its ownok/error/timeoutstatus, so one failing query does not fail the
others. Single-query calls withsqlbehave as before. -
a13c80e: feat(mcp):
clickstack_tabletakes optionallimitandhaving, and orders grouped results by the first select item, descending, when noorderByis given -
0262822: fix: MCP tool responses that are over the size budget now shorten long strings with a
…(+N chars)suffix instead of replacing them, say what was trimmed intrimNotes, andclickstack_event_patterns/clickstack_emerging_signalsdrop samples and shorten long patterns before cutting whole patterns, so the requestedtopNsurvives when it can -
442d6df: fix: refresh cached table columns after 5 minutes
The shared metadata cache kept each table's
DESCRIBEresult for the life of
the process, so the API did not see columns added withALTER TABLE, such as
new MATERIALIZED columns, until it restarted. Cached columns now expire after 5
minutes. Other cached metadata is unchanged. -
eb2439e: fix: leave metric points with no recorded value out of charts and alerts
When a scraped series goes away or a scrape fails, the collector's
prometheus
receiver sends a point flagged "no recorded value" (a Prometheus staleness
marker), and the ClickHouse exporter stores it as zeros. Metric charts and
alerts read it as a real value: a gauge'sminandavgdropped andcount
included the series that went away, and a counter or histogram that came back
after the marker counted its whole total again. Metric queries now skip points
with this flag. -
0eec5e1: fix: Authenticate to Prometheus connections whose host includes credentials
A Prometheus connection host such as
http://user:pass@prometheus:9090made every PromQL query fail with "Failed to reach Prometheus", becausefetchrejects URLs that carry credentials. The credentials are now sent as a Basic auth header. -
0a5237e: fix: reject alerts on dashboard tiles the alert checker never evaluates (PromQL
tiles, and builder tiles with unsupported display types), and drop them when a
dashboard is saved -
b7b4d95: fix: update systeminformation to 5.33.19
The root
resolutionspin let the lockfile keep systeminformation 5.30.7, which
has known command injection advisories, including two high-severity ones in
networkInterfaces()on Linux (GHSA-5xpp-75jx-m839, GHSA-hvx9-hwr7-wjj9). The
API installs it through@opentelemetry/instrumentation-host-metrics, which
asks for^5.31.6, but the old pin held it at 5.30.7. The pin now starts at
5.33.19, the newest 5.x release, which fixes all of them. -
b1d4e60: fix: PromQL label lookups (dashboard variables, label autocomplete) now work on TimeSeries tables of schema version 8, the default from ClickHouse 26.10. These keep each series' time range in a separate time ranges table instead of the tags table's min_time/max_time, so match[] failed with "requires store_min_time_and_max_time = 1" and time-bounded lookups read the whole tags table.
-
ef56bd7: fix: usage stats job no longer fails ClickHouse auth on password-protected
connections -
90302c7: fix: Block generic and incident.io webhooks whose hostname resolves to a private or reserved address. The check runs on the address actually dialed, so it also covers DNS rebinding. Self-hosted setups that send webhooks to internal hostnames must add them to
WEBHOOK_HOSTNAME_ALLOWLIST. -
Updated dependencies [142c9cc]
-
Updated dependencies [cd0e9ed]
-
Updated dependencies [9269f77]
-
Updated dependencies [e2754d2]
-
Updated dependencies [22f824c]
-
Updated dependencies [6425332]
-
Updated dependencies [d0dd06f]
-
Updated dependencies [5584f84]
-
Updated dependencies [41b2b74]
-
Updated dependencies [442d6df]
-
Updated dependencies [eb2439e]
-
Updated dependencies [0b7926d]
-
Updated dependencies [0a5237e]
-
Updated dependencies [78143c8]
-
Updated dependencies [b1d4e60]
- @hyperdx/common-utils@0.34.0