Skip to content

[pull] main from SigNoz:main - #866

Merged
pull[bot] merged 4 commits into
code:mainfrom
SigNoz:main
Jul 27, 2026
Merged

[pull] main from SigNoz:main#866
pull[bot] merged 4 commits into
code:mainfrom
SigNoz:main

Conversation

@pull

@pull pull Bot commented Jul 27, 2026

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

srikanthccv and others added 4 commits July 27, 2026 06:38
…ory APIs (#12211)

* feat(rulestatehistory): populate related logs/traces links in v2 history APIs

The v2 rule history timeline dropped the relatedLogsLink/relatedTracesLink
that v1 (getRuleStateHistory) returned per entry, which the alert history
page uses to jump from a state change to the explorer with the rule's
filter and the entry's labels. Load the rule from the rule store in the
module and build the links with contextlinks, scoped to the entry's
evaluation window like v1.

Extract the builder-query filter/group-by selection that the v1 handler
and threshold rule notifications each inlined into
contextlinks.BuilderQueryForSignal and reuse it from both the module and
ThresholdRule.

Also populate the links for top contributors, which both v1 (since #10760)
and v2 returned as always-empty fields even though the UI renders them;
contributor links span the queried range since the counts aggregate it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* chore(contextlinks): remove unused v3 link helpers

PrepareLinksToTraces, PrepareLinksToLogs and PrepareFilters lost their
last callers when the deprecated v3/v4 rule support was removed in #10760;
the v5 equivalents (PrepareParamsFor*V5 and PrepareFilterExpression) are
what all remaining callers use.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* chore: end doc comments with a period to satisfy godot

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(alerts): cover v2 rule history related links for logs and traces

Each test fires a rule with a filter and a service.name group-by, then
asserts the recorded firing entry and top contributor carry a related
explorer link for the rule's signal only, with the label-rewritten filter
expression, the evaluation window on timeline entries and the queried
range on contributors.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(contextlinks): shrink explorer links to the minimal payload

The explorer pages read only the data source and filter expression from a
shared link and fill in the rest of the query shape with defaults, so stop
shipping the v3 builder-query ceremony (queryName, aggregateOperator,
aggregateAttribute, stepInterval, paging fields) and the timeRange and
options params nothing reads. Links shrink from ~1.2k to ~450 chars and
contextlinks no longer depends on the v3 model.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(rulestatehistory): derive link windows from the evaluation envelope

Rules created through the current UI store the window in the v2alpha1
evaluation envelope with no top-level evalWindow, so the previous 5m
fallback produced wrong link windows for any non-default rolling window
and could not represent cumulative windows at all. Use the envelope's
NextWindowFor like the rule engine does, keeping the top-level
evalWindow (default 5m) as the fallback for rules without an envelope.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* chore(contextlinks): simplify double-encoding comment

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(alerts): use literal matchType/op in fixtures and drop link unit tests

Replace the numeric matchType/op codes in all alert scenario fixtures
with their literal forms (at_least_once, above, ...) which the API
normalizes to the same canonical values, and remove the rule history
link unit tests since the integration tests cover the behavior
end-to-end.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(alerts): move rule history helpers into the shared alerts fixtures

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
… & list pagination (#12262)

* fix(dashboard-v2): align config-pane control borders and switch radius

Give the ConfigSelect and FormattingSection ant-select selectors the
standard --l2-border color so they match the other full-width controls,
and drop the ConfigSwitch container radius from 6px to 2px for parity.

* fix(dashboard-v2): apply legend format template to pie slice labels

When a single value column has a legend format, run it through
getLabelName so {{key}} placeholders resolve to the group-by values
instead of showing the raw template string.

* fix(dashboard-v2): treat a full page as has-more for non-timestamp sorts

The backend only emits nextCursor on the timestamp-ordered window path;
a non-timestamp sort falls back to plain offset paging with no cursor.
Fall back to a full-page heuristic for canNext so list/raw panels can
page past the first page under those sorts, matching the logs/traces
explorers.

* fix(dashboard-v2): restyle config pane (accent marker, dividers, scrollbar)

- Rename header to 'Panel Details' with an accent marker; move the
  Display eyebrow to 'DISPLAY OPTIONS'.
- Switch dividers/section separators to var(--l1-border) and keep the
  divider from collapsing on overflow.
- Adopt the shared custom-scrollbar mixin in the config pane and the
  legend colors list.
- Align the threshold select border with the l2-border control style.

* feat(dashboard-v2): add header quick-add "+" to config sections

- SettingsSection gains a generic headerAction slot and controllable
  open state; the header splits into a toggle button plus action + chevron.
- SectionSlot maps a per-kind header action and wires registerHeaderAction,
  with a pending-action hop so a collapsed section expands then runs the add.
- Thresholds and Context Links register their add handlers; open by default
  only when already populated.

* chore: updated icons

* chore: pr review fixes
… dirty-on-load) (#12288)

* fix(query-builder): drop empty having from V5 query payload

An empty having (`{ expression: "" }`) — seeded by the query builder for
"no having filter" and produced when an empty having array round-trips
through the URL — was serialized into the V5 query payload instead of being
omitted. A saved panel never carries one, so the V2 panel editor's
live-vs-saved envelope comparison never matched and an untouched panel read
as dirty the instant the editor opened. View mode was unaffected as it
never runs that comparison.

`normalizeHaving` now treats a blank/array/nullish having as absent at both
serializer emission sites (createBaseSpec + createTraceOperatorBaseSpec),
closing the gap in the existing intent that already dropped empty-array
having. An empty having is a no-op filter, so query results, alert
evaluation, and export contents are unchanged; the export payload now omits
it consistently with the already-cleared groupBy.

Tests:
- serializer unit coverage: array / blank / whitespace / nullish having
  serialize to undefined; a real having expression is preserved
- panel-editor query-sync integration test: an untouched no-having panel is
  not dirty on mount (fails without the fix)
- DownloadOptionsMenu assertion updated to the corrected (dropped) shape

* fix(dashboards-v2): scroll panel empty-state instead of clipping actions

When a panel is too small to fit the empty-state icon + text + action
buttons (no query / no data / error), the centred column clipped the
buttons at the panel edge and they became unreachable.

Let the message column scroll (`overflow: auto`) with the shared panel
scrollbar, and use `justify-content: safe center` so the top stays
reachable once content overflows. Cap the actions row at `max-width: 100%`
so it never forces horizontal overflow.
…tooltips, and Noz in the panel editor (#12286)

* chore(e2e): skip the dashboards specs until they are ported to V2

The V1 -> V2 dashboard migration changes the behaviour those specs assert
against, so they fail as written. Ignore the directory rather than leaving
the suite red, and drop the ignore once the specs are updated.

* feat(ui): add TooltipScrollArea for capped, scrollable hover reveals

A tooltip listing an unbounded number of items (tag chips, variable values)
either grows off-screen or has to truncate. This caps the body at 480px and
scrolls past it, with a thin scrollbar kept visible: a tooltip is transient, so
an auto-hiding one would leave no hint that there is more below.

* feat(NewSelect): reveal a tag's full value on hover

A multi-select tag is cut to maxTagTextLength (and again by CSS in a narrow
control), leaving no way to read what is selected without opening the dropdown.
rc-select sets a `title` on its own tags, but not once a custom `tagRender` is
in play — which this component always supplies.

Wrap each tag in a tooltip carrying the option's untruncated text (the label
handed to tagRender is already cut, so it reads the option instead, falling
back to the raw value for freeform tags). The select provides its own
TooltipProvider so it keeps working wherever it is rendered, rather than
requiring every consumer to sit under an app-level one.

The `+N` overflow is deliberately left alone: several callers already wrap
their own placeholder in a tooltip, and a second one would stack on top.

* fix(dashboard): keep a variable's options across a refetch cycle

A dynamic variable fell back to the "Select value" placeholder whenever a
sibling dynamic's selection changed. The sibling change bumps the variable's
`cycleId`, which is part of its react-query key, so the new key has no data
and the option list blinks empty mid-fetch — and a DYNAMIC ALL selection is
rendered from the options themselves (its value stays null, since ALL travels
as the `__all__` sentinel), so it had nothing to render from.

Keep the previous data across the cycle bump on both fetched-variable queries.
V1 got the same stickiness by holding its options in local state.

* feat(dashboard): make the collapsed variables tooltip readable

The collapsed bar's `+N` tooltip listed each hidden variable as
`name: value`, which runs together — nothing separates the variable from what
it is set to, and a multi-value selection reads as one comma string.

Give each variable two lines instead: `$name` muted above its value, with one
bullet per value when it holds several. Every hidden variable is listed and the
body scrolls, so nothing is truncated out of reach. The tooltip body moves into
its own component, taking the formatting helper out of VariablesBar with it.

* fix(dashboard): reveal the values behind a variable pill's +N on hover

The pill is 180px wide, so only the first selected value gets a tag and the
rest hide behind `+N` — with nothing on hover to say what they are.

Render the overflow as a tooltip listing every hidden value, one bullet each,
scrolling rather than truncating. Each caller owns its own `+N` placeholder,
so this lives here rather than in the shared select.

* feat(dashboard): list the hidden dashboard tags as chips on hover

Hovering the tag cluster's `+N` badge showed the remaining tags comma-joined,
which neither reads as a list nor looks like the tags beside it.

Show them as the same chip used inline, one per line so a long list stays
scannable, scrolling once the list outgrows the tooltip.

* fix(dashboard): offer Noz in the V2 panel editor header

The V2 panel editor is registered as a chromeless full-page route, so AppLayout
drops the side nav — and with it the Noz entry point every other page has. The
assistant panel itself is mounted regardless of full-screen, so only the way in
was missing.

Re-offer it from the editor header, the way V1's own panel editor does.

* fix(ui): sit the hover reveal's scrollbar flush with the tooltip edge

The tooltip body pads 8px all round, so a scroll area inside it left the
scrollbar floating inset from the right edge with dead space beside it.

Give the right padding up on the hosting tooltip and put it back inside the
scroll area, between the content and the bar — the scrollbar now runs along the
tooltip's edge, and a short list keeps the same spacing it had before.

* feat(dashboard): resolve a dashboard icon from a PNG as well as an SVG

The `image` field references an asset by name without an extension, but the
Icons glob only matched SVG, so a PNG dropped in that folder silently fell back
to the default icon. Logos already matched both.

Match `{svg,png}` there too, so either format resolves from the same
extension-less path. No backend change needed — `validateImage` only checks the
`/assets/Icons/` prefix, never the file type.
@pull pull Bot locked and limited conversation to collaborators Jul 27, 2026
@pull pull Bot added the ⤵️ pull label Jul 27, 2026
@pull
pull Bot merged commit 5d41c5c into code:main Jul 27, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants