[pull] main from SigNoz:main - #866
Merged
Merged
Conversation
…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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 : )