* feat(dashboard-v2): variable model, adapters, validation & cycle detection
* feat(dashboard-v2): variable editor building-block components
* feat(dashboard-v2): variable form with type tabs & per-type fields
* feat(dashboard-v2): variables list with drag reorder & inline delete
* refactor(dashboard-v2): migrate variables bar to the overhauled model
* feat(dashboards-v2): panel query hook with pagination and time window
* refactor(dashboards-v2): trim comment noise and use JSDoc for function docs
Reduce over-commenting flagged in review across the V2 dashboard code:
remove comments that restate the code, shrink verbose blocks to a line, and
keep only the non-obvious "why". Function/helper docs are written as JSDoc;
inline implementation notes stay as line comments.
* fix(dashboards-v2): harden list pagination against bad inputs
Clamp the page size and offset to finite, positive values before deriving
pageIndex/canNext so the pager can never produce NaN/Infinity/negative state,
and ignore a non-positive setPageSize so the size state stays valid. canNext
now uses `rowCount >= pageSize` to also cover an over-fetch.
Add edge-case tests: empty/non-raw response, full vs partial page, nextCursor,
goNext advancing the page, and a rejected zero page size.
* feat(dashboards-v2): config pane shell with reusable form controls
* feat(dashboards-v2): chart panel section editors
* feat(dashboards-v2): thresholds section editor with per-variant rows
* refactor(dashboards-v2): address config-pane review feedback
- Drop unnecessary optional chaining on the always-present panel spec
(display / plugin / data); type the formatting cast via PanelFormattingSlice.
- Rename the section-lens read/write to get/update (+ slice helpers).
- Derive the histogram NumericBound from the buckets DTO.
- Use userEvent (via tests/test-utils) in the Axes/Buckets/Thresholds tests.
- Use the SigNoz Button for the legend-color Reset action.
* feat(dashboards-v2): table panel (#11771)
* feat(dashboards-v2): table panel renderer with record-table prep
* feat(dashboards-v2): resizable, persisted table columns
* fix(dashboards-v2): keep clickhouse table columns distinct
A scalar/table panel backed by a clickhouse_sql query collapsed every value
column onto the query name: getColName/getColId had no clickhouse handling,
so all value columns resolved to the query name ("A") and the row builder
overwrote each cell with the last column's value.
clickhouse_sql queries carry no aggregation metadata but the response column
holds the user's real SQL alias in col.name. Thread the request's
clickhouse_sql query names through, and name/key those columns by col.name so
each stays distinct. Ports the V2 half of the merged V1 fix (#11794).
* feat(dashboard-v2) - list panel (#11766)
* feat(dashboards-v2): prepare V5 raw tables for the list panel
* feat(dashboards-v2): list panel kind (logs/traces) with row detail
* feat(dashboards-v2): list columns editor with datasource column switch
* feat(dashboards-v2): move list columns editor below the query builder
Replace the config-pane Columns section with a dnd-kit reorderable editor
rendered beneath the query builder (V1 parity); sanitize selectFields to the
field-key DTO so saved columns drop non-contract keys (isIndexed).
* style(dashboards-v2): format list panel header with oxfmt
* refactor(dashboards-v2): address list-panel PR review feedback
- type the telemetry signal as TelemetrytypesSignalDTO (enum) and drop the
raw-string comparisons across the list panel renderer, columns, row
interaction, prep util, and the columns-switch hook
- make prepareRawTable's selectFields a required array; make the log
drawer's selectedTab always defined (defaults to OVERVIEW)
- read/write the list spec via spec.plugin.spec (plugin is non-optional)
- move isPlainObject (lodash) / coerceToString / toFiniteNumber out of
rawRowToILog into shared utils
- replace the columns editor's hand-built popover + native buttons with
@signozhq/ui Button and a searchable Combobox
- switch ListColumnsEditor tests to userEvent; trim verbose comments
* refactor(dashboards-v2): de-duplicate panel cell + column-unit helpers
- collapse the per-panel stringifyCell copies onto the shared coerceToString
util (list + table column builders)
- extract the column-unit resolver to Panels/utils/getColumnUnit; the table
renderer and the editor's column options now share one implementation,
aligning the editor onto the renderer's "empty entry = no unit" semantics
- export a single TableRowData type from tableColumns (with the antd key)
instead of two divergent local copies
* refactor(dashboards-v2): clean up comments across ListPanel components
* fix(dashboards-v2): drop duplicated list-pagination test block
The `describe('list pagination')` block in usePanelQuery.test.tsx was
duplicated byte-for-byte, tripping oxlint sonarjs(no-identical-functions)
on the repeated rawResponse/withResponse helpers and failing lint CI.
* feat(dashboards-v2): pure-V5 perses query adapter and request builder
* feat(dashboards-v2): panel query hook with pagination and time window
* refactor(dashboards-v2): per-kind panel definitions and registry
* feat(dashboards-v2): role and kind-gated panel actions with header chrome
* feat(dashboards-v2): panel editor route with live preview and query builder
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(dashboards-v2): make the editor dirty-check immune to query re-serialization
* fix(dashboards-v2): persist raw/list panels as a bare BuilderQuery
* feat(dashboards-v2): optional footer slot below the query builder
* refactor(dashboards-v2): render the editor preview through the shared panel body
The editor preview duplicated PanelBody's loading/error/renderer state
machine. Delegate to PanelBody so the preview is the production render
path, differing only by panelMode (DASHBOARD_EDIT) and the forwarded
server pager. PanelBody's panelMode and dashboardPreference become
optional (the preview has no dashboard-wide preferences), and its error
state now surfaces the backend message via panelStatusFromError instead
of the raw axios "status code 4xx".
* feat(dashboards-v2): richer panel status popover for errors and warnings
Replace the plain status tooltip with a card: variant-coloured icon, the
error/warning code and message, an optional Open Docs link, a MESSAGES
count pill, and the per-item message list. Hosted in @signozhq/ui
TooltipSimple with its padding/width cap stripped so the card owns its
own layout. Bump the header actions gap so the status icon sits clear of
its neighbours.
* refactor(dashboards-v2): address panel-editor foundation PR review
- fix failing lint: drop the unused Typography import in PanelStatusContent
- drop redundant optional chaining on the required spec/plugin (usePanelQuery,
PanelEditor index, HistogramPanel sections)
- move ComparisonThresholdShape into types/threshold
- derive PanelActionId from keyof PanelActionCapabilities
- fold the per-kind header search flag into actions (drop PanelHeaderControls)
- default PanelHeader searchTerm to ''
- drive the editor's discard prompt through useConfirmableAction
- trim over-verbose comments; PanelHeader test uses userEvent
* refactor(dashboards-v2): trim comment noise and use JSDoc for function docs
Reduce over-commenting flagged in review across the V2 dashboard code:
remove comments that restate the code, shrink verbose blocks to a line, and
keep only the non-obvious "why". Function/helper docs are written as JSDoc;
inline implementation notes stay as line comments.
* fix(dashboards-v2): harden list pagination against bad inputs
Clamp the page size and offset to finite, positive values before deriving
pageIndex/canNext so the pager can never produce NaN/Infinity/negative state,
and ignore a non-positive setPageSize so the size state stays valid. canNext
now uses `rowCount >= pageSize` to also cover an over-fetch.
Add edge-case tests: empty/non-raw response, full vs partial page, nextCursor,
goNext advancing the page, and a rejected zero page size.
* refactor(dashboards-v2): localize the perses adapter's envelope casts
The adapter bridges the generated query-envelope DTO (enum type, undiscriminated
spec) and the hand-written QueryEnvelope (typed spec) the V1 mappers consume —
nominally distinct types for the same wire shape, so a structural cast is
unavoidable. Confine those casts to two named `*Envelopes` converters and a
builder-query predicate, keep an explicit typed checkpoint for the composite
spec, and correct the stale "Orval erases spec to unknown" comments.
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(user): accept custom roles in user invite
* feat(user): use binding package
* feat(user): more domain restrictions
* feat(user): use suggestions
* feat(user): use suggestions
* feat(user): use pointer postable role
* feat(dashboard-v2): add persisted views store, types, and filter-query helpers
* feat(dashboard-v2): add filter state hook and filter zone
* feat(dashboard-v2): add views rail with save and dirty-state flow
* feat(dashboard-v2): add list status bar with rail collapse
* feat(dashboard-v2): add favorites and recently-viewed to dashboard rows
* feat(dashboard-v2): add persisted visible-columns store
* feat(dashboard-v2): add tabbed new-dashboard modal (blank / template / import)
* feat(dashboard-v2): full-width skeleton loading state
* feat(dashboard-v2): compose views, filters, and inline metadata into the list page
* chore(dashboard-v2): remove superseded create dropdown and standalone modals
* feat(dashboard-v2): add duplicate (clone) action to dashboard rows
* refactor(dashboards-v2): move toPostableTags to utils next to its inverse
* refactor(dashboards-v2): use signoz Button for view rows & delete action
* refactor(dashboards-v2): rename filterStatesEqual to areFilterStatesEqual
* fix(dashboard): clickhouse table panel collapses value columns onto query name
A table/scalar panel backed by a ClickHouse SQL query rendered every
aggregation column with the header "A" (the query name) and the same value in
each, while only the group columns (e.g. service.name) showed correctly.
Root cause: the scalar-response column-naming utils derive a value column's
display name and row-data key from request-side aggregation metadata, which
only exists for builder_query envelopes. A clickhouse_sql query has none, so
getColName/getColId fell through to the query name for every value column.
Sharing one id ("A") collapsed all value columns onto a single row key, so the
last column written (total_requests) overwrote the rest.
The backend already returns correct data: readAsScalar names each ClickHouse
SELECT column with its real SQL alias and a unique aggregationIndex. This is a
frontend-only consumption fix.
Fix: when a column belongs to a clickhouse_sql query (determined from the
request's query type, not a name heuristic), name and key it by the response
column's real SQL alias. Builder queries are unchanged; formulas/promql keep
the legend || queryName fallback. Applied to both the V1 converter
(convertV5Response.ts, the live table-panel path) and the V2 path
(prepareScalarTables.ts).
* chore: minor type fix
* feat(authz): add unified role APIs
* feat(authz): update openapi spec
* feat(authz): restructure the chunked write to the openfga server
* feat(authz): fix the order for minimal gitdiff
* feat(authz): update openapi spec
* feat(authz): fix the create API
* feat(authz): better error messages
* refactor(sidenav): add support for routes with ?key=value
* refactor(channels): move to be under alerts
* test(private): add test to cover redirects of channels
* chore(codeowners): move channels to pulse frontend
* chore(sidenav): add todo to remove the menu from sidebar
* test(jest): add transform ignore due to import of react-markdown
* test(ai-assistant): fix redirect link of notification channels
* chore: send warning instead of error for unseen metrics and missing (metric, key)
* chore: update integration test
* chore: fix integration test
* chore: fix test
* chore: add unit test for missing key
* chore: deployments -> add default namespace group by
* chore: added integration tests for statefulsets
* chore: namespace group by for jobs
* chore: namespace group by for daemonsets
* chore: added group by clustername for all workloads and integration tests for the same
* chore: fix py fmt for integration tests
* chore: added group by namespace, cluster for pvcs
* chore: added cluster name default group by for namespaces monitoring
* feat(dashboard-v2): redesign public dashboard publish drawer
Rework the Publish tab to the status-strip design (Claude Design handoff):
- a status strip with a lock/globe medallion, plain-language line and a
Private/Public badge
- a public-link field shown in both states — a dashed placeholder while
private, the live URL with copy / open actions once published
- an "Enable time range" switch + default-range select, and a quiet inline
variables caveat
- actions grouped in a footer (Publish / Unpublish + Update)
Split each piece into its own folder with a co-located *.module.scss, drop the
dead time-range constants in favour of the shared RelativeDurationOptions, and
render the range dropdown without a portal (z-index + trigger width) so it shows
correctly inside the settings drawer.
* feat(dashboard-v2): fetch public dashboard meta once, globally
Move the public-sharing GET out of the publish drawer: a shared
usePublicDashboardMeta hook (keyed by dashboard id, license-gated, kept warm via
staleTime) owns the request, the toolbar mounts it with the dashboard to drive the
public-access badge, and the drawer's usePublicDashboard reads the same cache
instead of issuing its own call. Mutations invalidate the key so all consumers
refresh together.
Also rename the variables Callout to Hint, and drop redundant font-family: Inter /
font-weight: 400 from the publish-drawer styles (Inter is the inherited default).
* chore: remove flamegraph v2 since we've moved to v4 now
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: remove orphaned helpers after v2 waterfall and flamegraph removal
Drop GetSpansForTrace, cacheForTraceDetail, fluxIntervalForTraceDetail from
clickhouseReader — all were only used by the deleted v2 handlers. Also remove
the orphaned model.Span and model.Event types, and clean up the
cacheForTraceDetail initialization from server.go.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: update ee/query-service NewReader call after v2 cleanup
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: format whitespacing
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(dashboards-v2): panel type system & shared chart utilities
* feat(dashboards-v2): usePanelQuery data-fetching hook
* feat(dashboards-v2): TimeSeriesPanel renderer
* feat(dashboards-v2): BarChartPanel renderer
* feat(dashboards-v2): HistogramPanel renderer
* feat(dashboards-v2): PieChartPanel renderer
* feat(dashboards-v2): panel plugin registry
* feat(dashboards-v2): panel status popover (error/warning surfacing)
* feat(dashboards-v2): panel chrome - header, body, interactions & grid wiring
* chore(dashboards-v2): dashboards-list-v2 query-param sort/order adjustments
* feat(dashboards-v2): number panel kind + registry entry
* fix(dashboards-v2): cap bottom legend height at 30% of the panel
The bottom-legend reservation was capped only at min(2 rows, 80px) with
no relation to the container height, despite the helper's doc promising a
%-of-container cap. On short grid panels the legend kept its full slice
and the chart — the pie donut especially — collapsed to a sliver.
- calculateChartDimensions now also caps the bottom legend at 30% of the
container height (mirroring the RIGHT-legend width cap).
- Drop the legend grid row-gap so the capped height isn't overrun.
- Add the previously-missing tests for calculateChartDimensions,
including the short-container cap.
echo "--- commit 1 done ---" && git log --oneline -1
echo "--- remaining ---" && git status --short
* fix(dashboards-v2): prevent pie donut and labels from clipping
The donut used a flat radius = 0.35 * min(w,h) with leader labels anchored
at 1.3 * radius, leaving only ~0.045 * size between the label anchor and
the SVG edge — so on small panels the top/bottom labels (and a stray
container padding under border-box) clipped.
- getDonutGeometry now solves the radius back from the box half-extent
minus a fixed label allowance, so the label anchor always lands a
constant 22px inside the edge regardless of panel size — extracted as a
pure, tested helper with a shared label-ratio constant (no drift with
getArcGeometry) and a DonutGeometry type.
- Align the pie legend wrapper padding with ChartLayout's.
- Tests for getDonutGeometry (anchor stays in-box, derived radii, smaller
axis wins, no negative radius).
echo "--- commit 2 done ---" && git log --oneline -3
echo "--- remaining ---" && git status --short
* refactor(dashboards-v2): address PR review feedback
Tightening + structure changes from review of #11639:
- types: make rendererProps `panel`/`data` required and `syncMode`
non-optional (None is the off-state); `Panel.panel` required with
orphan layout items guarded in SectionGrid; key the panel interaction
map by PanelKind; require `requestPayload` in useGetQueryRangeV5.
- panel chrome: split the unknown-kind path into UnsupportedPanelBody so
PanelBody only runs with a resolved renderer; rename chartBody ->
chartContainer; move PanelHeader/PanelBody into their own folders with
dedicated scss (Panel.module.scss trimmed to .panel).
- panel status: normalize query failures via convertToApiError (the
generated client rejects with a raw AxiosError, so the old isAPIError
guard never matched and dropped the backend code/message); drop an
unnecessary useMemo; docs link -> Typography.Link.
- registry: PascalCase aliases; Panels/index.ts -> registry.ts.
- utils: extract selectionPreferences out of baseConfigBuilder; split
chartAppearanceMappings into chartAppearance/{enumMaps,resolvers};
move each kind's buildConfig under utils/.
- renderers: render NoData on an empty result set.
- dashboards-list: drop redundant sort/order casts.
echo "=== result ==="; git log --oneline -3; echo "--- working tree ---"; git status --short
* refactor(dashboards-v2): use @signozhq/ui tooltip for panel status
Replace the antd Popover in the panel header status indicator with
@signozhq/ui TooltipSimple. Relies on the global TooltipProvider mounted
in AppLayout; the PanelHeader test wraps renders in TooltipProvider since
the radix tooltip needs that ancestor in isolation.
* refactor(dashboards-v2): derive PanelKind from generated contract
Type panel kinds off DashboardtypesPanelPluginKindDTO instead of a
hand-written union, keeping the generated API contract as the single
source of truth. getPanelDefinition and PANEL_KIND_TO_PANEL_TYPE now take
PanelKind directly, dropping the `as PanelKind` casts at their call sites.
Renderers drop the defensive optional chaining / `?? {}` fallbacks the
render boundary already guarantees, and panelDef is renamed to
panelDefinition for clarity.
* chore: pr reviews fixes
* feat: functional unique index in sql schema
* fix: only ascii in regex
* fix: use sync tags method in update
* fix: use sync tags method in update
* fix: correct the method name being called
* chore: rename create method to createOrGet
* chore: use tagtypestest package for mock store
* chore: combine functional unique index with unique index
* chore: move tag resolution to module
* test: add unit tests for new idx type
* feat: delete dashboard v2 API
* chore: comment out tags unique index for now
* chore: add a todo comment
* chore: comment out unique index test
* feat: add created at to tag relations
* chore: comment out unique index test
* chore: bump migration number
* chore: remove uploaded grafana flag from metadata
* Merge branch 'main' into nv/v2-dashboard-create
* chore: revert idx generation to resolve conflicts
* fix: use store.RunInTx instead of taking in sqlstore
* fix: use binding package to get request
* chore: move NewDashboardV2 to NewDashboardV2WithoutTags
* chore: rename module to m
* fix: add ctx needed in sqlstore
* fix: remove sqlstore passage in ee pkg
* chore: change dashboardData to dashboardSpec
* feat: follow the metadata+spec key structure
* feat: follow the metadata+spec key structure in open api spec
* feat: v2 dashboard GET API (#11136)
* feat: v2 dashboard GET API
* Merge branch 'nv/v2-dashboard-create' into nv/v2-dashboard-get
* chore: update api specs
* fix: remove soft delete references
* chore: embed StorableDashboard into joinedRow in store method
* fix: fix build error
* chore: revert all frontend changes
* fix: remove public dashboard from get v2 call
* chore: revert all frontend changes
* fix: fix build errors post merge conflict resolution
* feat: lock, unlock, create public, update public v2 dashboard APIs (#11167)
* feat: lock, unlock, create public, update public v2 dashboard APIs
* chore: update api specs
* fix: use new pattern of checking for admin permission
* fix: remove soft delete reference
* chore: revert all frontend changes
* fix: fix build errors and remove v2 create/update public apis
* chore: use v1 methods wherever possible
* fix: use update v2 store method
* chore: update frontend schema
* chore: update frontend schema
* chore: generate api specs
* chore: generate api specs
* feat: patch dashboard api (#11182)
* feat: lock, unlock, create public, update public v2 dashboard APIs
* feat: delete dashboard v2 API and hard delete cron job
* feat: patch dashboard api
* chore: update api specs
* chore: update api specs
* chore: update api specs
* chore: remove delete related work
* fix: add examples of structs for value param in param description
* test: unit test fixes
* fix: use new pattern of checking for admin permission
* fix: remove soft delete reference
* test: key value tags in test
* fix: build error in patch module method
* fix: build error in Apply method
* fix: use sync tags method in update
* fix: fix build errors
* fix: fix all patch application tests
* chore: add more mapper methods
* fix: fix build errors
* chore: generate api specs
* fix: update migration numbering
* fix: add missing request struct in list api
* fix: remove hasMore from list response
* chore: bump migration number
* fix: send total count in response + bug fixes
* fix: add source for v2 dashboards
* chore: incorporate source
* chore: incorporate source in api spec
* chore: incorporate source
* fix: remove system dashboards from list v2 response
* fix: add some required fields
* feat: add immutable name in dashboard v2
* feat: add immutable name in dashboard v2
* feat: add immutable name in dashboard v2 api specs
* fix: remove unused param in constructor
* fix: improve api descriptions
* fix: remove unneeded comment
* chore: increase MaxTagsPerDashboard to 10
* fix: set display name in unmarshal json
* chore: remove integration test for now (will add along with list api)
* feat: add validation on dashboard name
* test: fix build errors and tests based on name related changes
* chore: bump migration number
* chore: generate api specs
* fix: fix tests based on name related changes
* fix: dont include full data in list response
* fix: add quotes around tag relation kind
* chore: bump migration number
* fix: fix post merge build and spec errors
* fix: correct convertor method name
* test: add unit tests for type conversions
* chore: remove enum def of threshold comparison operator
* feat: add flag to generate unique name in backend
* chore: generate api specs
* chore: make tags required in postable
* fix: build error fix
* chore: bump migration number
* feat: introduce dashboard views for list dashboards page
* fix: fix build error in test after merge conflict
* fix: remove unused store method
* fix: remove unused module methods
* fix: use v1 store update method
* fix: change data to spec in api param description
* chore: add back accidentally removed tests
* chore: update api spec
* chore: bump migration number
* feat: delete dashboard v2 API (#11299)
* feat: delete dashboard v2 API
* fix: fix post merge build and spec errors
* fix: address review comments
* chore: generate frontend api spec
* fix: add missing name fetch in listv2 store method
* fix: change title to name in api description
* fix: add all error codes for new apis
* test: change data to spec in unit tests
* fix: remove join to public dashboard table in list call
* fix: use valuer string for list order and sort
* test: integration test and fixes found through it
* chore: use same jsonpatch package as done in zeus
* chore: remove JSONPatchDocument and use patchable everywhere
* fix: make remove idempotent in patch
* chore: separate file for patch types
* chore: better error passage
* fix: remove extra decodePatch calls
* fix: fix post merge build and schema errors
* fix: remove omitempty
* chore: bump migration number
* fix: remove user auditable
* chore: dont pass email to create and update methods
* chore: dont pass email to create and update methods
* chore: regenerate api specs
* chore: rearrange
* fix: return better err
* chore: add all err codes in api spec
* chore: rearrange
* fix: use must new org id
* fix: proper error passage
* chore: rename updateable to updatable
* fix: use must new org id
* fix: use must new org id
* feat: include list of all dashboard tags in list api response
* fix: remove wrong api description msg
* fix: use must method for user id as well
* chore: add nolint comment
* fix: add missing image field in list response
* chore: regenerate api specs
* chore: regenerate api specs
* fix: make GettableTag a defined type instead of an alias
* fix: dont allow system dashboards to be deleted
* fix: remove public filter from visitor
* chore: use go sqlbuilder
* fix: use ESCAPE literal in contains and like operators
* fix: use correct perses package in list v2 file
* feat: change pinned dashboard table to user dashboard preference table
* fix: delete preferences on dashboard delete
* test: add integration test for pinning
* fix: wrap naked errors
* fix: integration dashboards should not be deletable either
* fix: remove org column in preferences and add foreign key to users table
* chore: add fk from prefs to dashbaord table
* chore: remove outer parenthesis removal function
* test: add unit test to ensure that all reserved keys have handlers
* fix: proper url for pin apis
* fix: delete preferences on user deletion
* test: address integration test comments
* test: change limit
* fix: revert the check in can delete
* fix: remove unit test from ee package
* fix: move list filter to impl to avoid db impl logic in types
* chore: code movement
* feat: add a pin free list dashboards api
* fix: update api specs
* fix: use request query in api defs for list apis
* chore: explicitly mark request as nil in list apis
* fix: remove extra noop assignment
* chore: remove separate gettable view typedef
* chore: rearrange structs
* fix: cover errors, fix column type, add tests
* test: add unit tests for dashboard view validations
* fix: move view create/edit/delete to edit access
* fix: move view create/edit/delete to edit access
* fix: change url and fix api descriptions
* chore: add query max length check for views
* fix: wrong spelling for UpdatableDashboardView
* fix: extract common validation logic between list api and saved views
* test: add integration tests for dashboard views
* test: add similar tests for dashboards as well
* fix: dont trim name in views
* fix: add integration test for trailing whitespace rejection
* fix: return name required err for name with only spaces
* test: fix python formatting
* fix: generate api specs
---------
Co-authored-by: Srikanth Chekuri <srikanth.chekuri92@gmail.com>
* perf: reuse label maps and index series by variable in formulas
* perf: switch to simple worker pool
* perf: use a pointer free backing array for result values
---------
Co-authored-by: Srikanth Chekuri <srikanth.chekuri92@gmail.com>
* feat: add clone dashboard API for perses dashboards
* fix: allow integration dashboards to be cloned
* test: add integration test for cloning of integration dashboards
* test: fix lint in test
* test: revert the integration dashboard test
* feat: use empty suggestions api for empty ui state of ai assistant
* feat: add useResolvePageType hook
* feat: update resolver to use all from DTO
* feat: update getAutoContexts and resolvePageType to omit auto-context for homepage and infra
* fix: wire open view and open channel flows
* feat: show current alert name in context in alert details page
* feat: links should open in new tab
* fix: show Noz in dashboard edit panel view
* fix: reduce size of fixed footer when assistant side panel is open
* feat: streamline error handling with resolveAssistantErrorMessage utility
* feat: hide suggestions and share in edit dashboard panel
* chore: deployments -> add default namespace group by
* chore: added integration tests for statefulsets
* chore: namespace group by for jobs
* chore: namespace group by for daemonsets
* chore: added group by clustername for all workloads and integration tests for the same
* chore: fix py fmt for integration tests
* feat: adding support for Azure SQL DB
* refactor: adding missing metrics in data collected and panels in dash
* feat: adding support for Azure SQL DB Managed Instances
* feat: generating openapi spec
* feat: adding nosql and cache services in azure integration
* chore(css-modules): add good practices for writing css module files
* fix(guide): add more guidelines based on notion doc
* fix(pr): address pr comments
ServeOpenAPI's nil-response branch still passed WithContentType, so any route
with Response == nil but a ResponseContentType set (notably 204 No Content)
emitted a content block in the generated spec. Clients then try to decode an
empty body and fail — e.g. "unexpected end of JSON input" on
DELETE /api/v1/service_accounts/{id}.
Omit the content type when Response is nil. Regenerate docs/api/openapi.yml (18
bodyless responses drop their content block) and the frontend orval client.
Signed-off-by: grandwizard28 <vibhupandey28@gmail.com>
* feat: extend error responses with new error struct
* fix: enriched error for dashboard api
* fix: merge issues
* fix: reverted dashboards changes and add for cloud integrations
* fix: delete file
* fix: add back file
* fix: added a helper
* fix: removed invlaid referencess
* fix: generate openapi
* fix: keeping additional along with suggestion
* Revert "fix: keeping additional along with suggestion"
This reverts commit be30e2ffd2.
* fix: added suggestions per additonal error
* fix: generate openapi
* fix: remove valid references
* fix: removeg valid references for select and group by and only did you mean is kept
* fix: unit test
* fix: use binding for deconding for both ee and community
* fix: trim down suggestions methods
* fix: added renamed methods and moved stuff around
* fix: typo
* fix: removed json decoder
* fix: added empty check
* fix: retain addtional
* fix: reverted re-structing of file
* feat(statsreporter): expose collected stats via GET /api/v1/stats
Extract per-org stats collection out of the analytics reporter into an
always-on Aggregator (collector fan-out + telemetry-store counts) shared
by the reporter and a new HTTP handler. The GET /api/v1/stats endpoint
returns the caller's org stats regardless of whether scheduled reporting
is enabled.
* refactor(statsreporter): collect telemetry stats via the querier
Move the trace/log/metric row-count and last-observed queries out of the
stats aggregator and into the querier, which now implements
statsreporter.StatsCollector. The aggregator becomes a pure collector
fan-out and no longer depends on telemetrystore; the querier is wired in
as one of the stats collectors.
* chore: regenerate openapi spec and frontend client
Backend docs/api/openapi.yml gains the GET /api/v1/stats (GetStats)
operation; the Orval client gains a useGetStats hook and GetStats200
type.
* chore: remove comment from querier Collect
* fix(statsreporter): use MustNewUUID for org from claims
Claims come from validated auth context, so the org UUID is guaranteed
valid; drop the dead NewUUID error branch.
* fix(flagger): use MustNewUUID for org from claims
Claims come from validated auth context, so the org UUID is guaranteed
valid; drop the dead NewUUID error branch.
* docs(contributing): note MustNewUUID for IDs from claims
* perf(querier): combine count and last-observed into one query per signal
Each signal's COUNT(*) and max(timestamp) scan the same table, so fetch
both in a single query — 3 queries instead of 6. Same emitted keys and
empty-table guard.
* feat(dashboard-v2): add public dashboard settings section
Add a self-contained Public Dashboard settings section for the V2 dashboard
drawer, reusing the existing /dashboards/{id}/public endpoint via the generated
client (useGetPublicDashboard / useCreatePublicDashboard /
useUpdatePublicDashboard / useDeletePublicDashboard).
Broken into small components: a usePublicDashboard hook owning the query, the
create/update/delete mutations and the time-range form state; plus presentational
status, settings-form, URL, callout and actions pieces. Publishing a dashboard
exposes a shareable URL and lets the viewer default time range be configured.
* feat(dashboard-v2): wire public dashboard tab in settings drawer
Render the Public Dashboard section in the Publish tab in place of the
placeholder, and drop the now-unused SettingsTabPlaceholder util (the Publish tab
was its last consumer).
* fix: format failure
* chore: updated logic and use centralized function in the module
* chore: filter metric groups
* chore: filter metric groups
* chore: formula correction
* chore: added step flooring note
* chore: comment correction
* chore: comment correction
* chore: removed function
* chore: renamed variables
* chore: added happy test
* chore: added test 2 for accuracy and test 3 for missing metrics check
* chore: added filter test 4
* chore: added 5th test for filterByStatus
* chore: added group by tests
* chore: pagination test added
* chore: added validation tests
* chore: added auth test
* chore: added all tests
* chore: fix for surfacing meta for pods custom group by
* chore: added nodes integration test suite
* chore: namespaces integration tests
* ci: register inframonitoring suite + ruff format 01_hosts
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* chore: added integration tests for clusters
* chore: formatting changed
* chore: formatting changed
* chore: formatting changed
* chore: added volumes integration tests
* chore: added deployments
* chore: added tests
* chore: added integration tests for jobs api
* chore: added integration tests for v2 daemonsets api
* chore: added order by host.name test
* refactor(infra-monitoring): address review comments on hosts integration tests
- inline _post helper at call sites
- combine filter operator tests into parametrized test_hosts_filter
- combine bad attr/grammar tests into parametrized test_hosts_filter_invalid
- convert orderby total-invariant nested loop to stacked parametrize
- drop redundant test_hosts_auth (auth covered globally)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): align pods integration tests with review feedback
- inline _post helper at call sites
- combine filter operator tests into parametrized test_pods_filter
- combine bad attr/grammar tests into parametrized test_pods_filter_invalid
- convert orderby total-invariant nested loop to stacked parametrize
- drop redundant test_pods_auth (auth covered globally)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): align nodes integration tests with review feedback
- inline _post helper at call sites
- combine filter operator tests into parametrized test_nodes_filter
- combine bad attr/grammar tests into parametrized test_nodes_filter_invalid
- convert orderby total-invariant nested loop to stacked parametrize
- drop redundant test_nodes_auth (auth covered globally)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): align namespaces integration tests with review feedback
- inline _post helper at call sites
- combine filter operator tests into parametrized test_namespaces_filter
- combine bad attr/grammar tests into parametrized test_namespaces_filter_invalid
- convert orderby total-invariant nested loop to stacked parametrize
- drop redundant test_namespaces_auth (auth covered globally)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): align clusters integration tests with review feedback
- inline _post helper at call sites
- combine filter operator tests into parametrized test_clusters_filter
- combine bad attr/grammar tests into parametrized test_clusters_filter_invalid
- convert orderby total-invariant nested loop to stacked parametrize
- drop redundant test_clusters_auth (auth covered globally)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): align volumes integration tests with review feedback
- inline _post helper at call sites
- combine filter operator tests into parametrized test_volumes_filter
- combine bad attr/grammar tests into parametrized test_volumes_filter_invalid
- convert orderby total-invariant nested loop to stacked parametrize
- drop redundant test_volumes_auth (auth covered globally)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): align deployments integration tests with review feedback
- inline _post helper at call sites
- combine filter operator tests into parametrized test_deployments_filter
- combine bad attr/grammar tests into parametrized test_deployments_filter_invalid
- convert orderby total-invariant nested loop to stacked parametrize
- drop redundant test_deployments_auth (auth covered globally)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): align statefulsets integration tests with review feedback
- inline _post helper at call sites
- combine filter operator tests into parametrized test_statefulsets_filter
- combine bad attr/grammar tests into parametrized test_statefulsets_filter_invalid
- convert orderby total-invariant nested loop to stacked parametrize
- drop redundant test_statefulsets_auth (auth covered globally)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): align jobs integration tests with review feedback
- inline _post helper at call sites
- combine filter operator tests into parametrized test_jobs_filter
- combine bad attr/grammar tests into parametrized test_jobs_filter_invalid
- convert orderby total-invariant nested loop to stacked parametrize
- drop redundant test_jobs_auth (auth covered globally)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): align daemonsets integration tests with review feedback
- inline _post helper at call sites
- combine filter operator tests into parametrized test_daemonsets_filter
- combine bad attr/grammar tests into parametrized test_daemonsets_filter_invalid
- convert orderby total-invariant nested loop to stacked parametrize
- drop redundant test_daemonsets_auth (auth covered globally)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): combine hosts groupby tests into parametrized test
- merge test_hosts_groupby_hostname + test_hosts_groupby_os_type into
test_hosts_groupby parametrized on (dataset, group key, expected counts/values)
- preserves all assertions incl hostName populated-vs-empty branch coverage
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): combine hosts orderby tests into parametrized test
- merge total_invariant_across_orderby + orderby_correctness + orderby_by_host_name
into test_hosts_orderby parametrized on (column, record_field) x direction
- each case asserts both the total/len invariant and sortedness; sortedness now
covered for all metric columns, not just cpu
- single dataset (hosts_orderby.jsonl) + CONTAINS 'order-' guard on all cases
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): combine hosts pagination tests
- fold offset-beyond-total case into the test_hosts_pagination page walk
(offset K+5 expects 0 records via max(0, min(limit, K-offset)); total
invariant covers the beyond-total page's total == K)
- single seed instead of two
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): merge hosts happy_path into test_hosts_accuracy
- happy_path and value_accuracy datasets were structurally identical
(same 4 metrics, same sample counts, 2 hosts); one test now asserts
shape/contract + exact metric values in a single seed/request
- drop unused hosts_happy_path.jsonl
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): combine pods integration tests logically
- merge happy_path into test_pods_accuracy (datasets structurally identical);
drop unused pods_happy_path.jsonl
- merge groupby namespace/deployment into parametrized test_pods_groupby
- merge orderby invariant + correctness + by-pod-name into test_pods_orderby
((column, record_field) x direction; sortedness now covered for all columns)
- fold offset-beyond-total into test_pods_pagination page walk
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): combine nodes integration tests logically
- merge happy_path into test_nodes_accuracy; drop unused nodes_happy_path.jsonl
- merge orderby invariant + correctness + by-node-name into test_nodes_orderby
((column, record_field) x direction; sortedness now covered for all columns)
- fold offset-beyond-total into test_nodes_pagination page walk
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): combine namespaces integration tests logically
- merge happy_path into test_namespaces_accuracy; drop unused namespaces_happy_path.jsonl
- merge orderby invariant + correctness + by-namespace-name into test_namespaces_orderby
- fold offset-beyond-total into test_namespaces_pagination page walk
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): combine clusters integration tests logically
- merge happy_path into test_clusters_accuracy; drop unused clusters_happy_path.jsonl
- merge orderby invariant + correctness + by-cluster-name into test_clusters_orderby
- fold offset-beyond-total into test_clusters_pagination page walk
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): combine volumes integration tests logically
- merge happy_path into test_volumes_accuracy; drop unused volumes_happy_path.jsonl
- merge orderby invariant + correctness + by-pvc-name into test_volumes_orderby
- fold offset-beyond-total into test_volumes_pagination page walk
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): combine deployments integration tests logically
- merge happy_path into test_deployments_accuracy; drop unused deployments_happy_path.jsonl
- merge orderby invariant + correctness + by-deployment-name into test_deployments_orderby
- fold offset-beyond-total into test_deployments_pagination page walk
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): combine statefulsets integration tests logically
- merge happy_path into test_statefulsets_accuracy; drop unused statefulsets_happy_path.jsonl
- merge orderby invariant + correctness + by-statefulset-name into test_statefulsets_orderby
- fold offset-beyond-total into test_statefulsets_pagination page walk
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): combine jobs integration tests logically
- merge happy_path into test_jobs_accuracy; drop unused jobs_happy_path.jsonl
- merge orderby invariant + correctness + by-job-name into test_jobs_orderby
- fold offset-beyond-total into test_jobs_pagination page walk
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): combine daemonsets integration tests logically
- merge happy_path into test_daemonsets_accuracy; drop unused daemonsets_happy_path.jsonl
- merge orderby invariant + correctness + by-daemonset-name into test_daemonsets_orderby
- fold offset-beyond-total into test_daemonsets_pagination page walk
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(infra-monitoring): assert metric value accuracy in hosts filter tests
- regenerate hosts_filter_dataset.jsonl so every host mirrors the acc-h1
sample pattern from hosts_value_accuracy.jsonl (CI-proven expected values)
- test_hosts_filter now asserts cpu/memory/wait/load15/diskUsage per filtered
record against FILTER_DATASET_EXPECTED (1e-9), proving filters don't
distort aggregation
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): scope filter expected values inside test_hosts_filter
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(infra-monitoring): assert metric value accuracy in pods filter tests
- regenerate pods_filter_dataset.jsonl so every pod mirrors the acc-p1
sample pattern from pods_value_accuracy.jsonl (CI-proven expected values)
- test_pods_filter now asserts the 6 CPU/memory fields per filtered record
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(infra-monitoring): assert metric value accuracy in nodes filter tests
- regenerate nodes_filter_dataset.jsonl so every node mirrors the acc-n1
sample pattern from nodes_value_accuracy.jsonl (CI-proven expected values)
- test_nodes_filter now asserts the 4 CPU/memory fields per filtered record
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(infra-monitoring): assert metric value accuracy in namespaces filter tests
- regenerate namespaces_filter_dataset.jsonl so every namespace mirrors the
acc-ns-1 sample pattern (2 pods) from namespaces_value_accuracy.jsonl
- test_namespaces_filter now asserts namespaceCPU/namespaceMemory per record
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(infra-monitoring): assert metric value accuracy in clusters filter tests
- regenerate clusters_filter_dataset.jsonl so every cluster mirrors the
acc-cluster-1 sample pattern (2 nodes) from clusters_value_accuracy.jsonl
- test_clusters_filter now asserts the 4 CPU/memory fields per filtered record
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(infra-monitoring): assert metric value accuracy in volumes filter tests
- regenerate volumes_filter_dataset.jsonl so every PVC mirrors the acc-pvc-1
sample pattern from volumes_value_accuracy.jsonl (CI-proven expected values)
- test_volumes_filter now asserts all 6 volume fields per filtered record
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(infra-monitoring): assert metric value accuracy in deployments filter tests
- regenerate deployments_filter_dataset.jsonl so every deployment mirrors the
acc-dep-1 sample pattern (2 pods) from deployments_value_accuracy.jsonl
- test_deployments_filter now asserts the 6 CPU/memory fields per filtered record
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(infra-monitoring): assert metric value accuracy in statefulsets filter tests
- regenerate statefulsets_filter_dataset.jsonl so every statefulset mirrors
the acc-ss-1 sample pattern (2 pods) from statefulsets_value_accuracy.jsonl
- test_statefulsets_filter now asserts the 6 CPU/memory fields per filtered record
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(infra-monitoring): assert metric value accuracy in jobs filter tests
- regenerate jobs_filter_dataset.jsonl so every job mirrors the acc-job-1
sample pattern (2 pods) from jobs_value_accuracy.jsonl
- test_jobs_filter now asserts the 6 CPU/memory fields per filtered record
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(infra-monitoring): assert metric value accuracy in daemonsets filter tests
- regenerate daemonsets_filter_dataset.jsonl so every daemonset mirrors the
acc-ds-1 sample pattern (2 pods) from daemonsets_value_accuracy.jsonl
- test_daemonsets_filter now asserts the 6 CPU/memory fields per filtered record
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): align nodes groupby + pod-phase tests with structure
- merge pod_phase_counts_list_mode + _no_pods_on_node into parametrized
test_nodes_pod_phase_counts ((dataset, node, filter, expected) cases)
- rename groupby_cluster -> test_nodes_groupby, parametrize over
k8s.node.name + k8s.cluster.name; adds the node-name-in-groupBy branch
(nodeName populated, condition derived) that hosts/pods both cover
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): align namespaces groupby with structure
- rename groupby_cluster -> test_namespaces_groupby, parametrize over
k8s.namespace.name + k8s.cluster.name; adds the namespace-name-in-groupBy
branch (namespaceName populated) that hosts/pods/nodes all cover
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): align clusters groupby with structure
- rename groupby_cloud_provider -> test_clusters_groupby, parametrize over
k8s.cluster.name + cloud.provider; adds the cluster-name-in-groupBy branch
(clusterName populated) that hosts/pods/nodes/namespaces all cover
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): align volumes groupby with structure
- rename groupby_namespace -> test_volumes_groupby, parametrize over
k8s.persistentvolumeclaim.name + k8s.namespace.name; adds the
pvc-name-in-groupBy branch (persistentVolumeClaimName populated) that the
other endpoints all cover
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): align deployments groupby with structure
- rename groupby_namespace -> test_deployments_groupby, parametrize over
k8s.deployment.name + k8s.namespace.name; adds the deployment-name-in-groupBy
branch (deploymentName populated) that the other endpoints all cover
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): align statefulsets groupby with structure
- rename groupby_namespace -> test_statefulsets_groupby, parametrize over
k8s.statefulset.name + k8s.namespace.name; adds the statefulset-name-in-groupBy
branch (statefulSetName populated) that the other endpoints all cover
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): align jobs groupby with structure
- rename groupby_namespace -> test_jobs_groupby, parametrize over
k8s.job.name + k8s.namespace.name; adds the job-name-in-groupBy branch
(jobName populated) that the other endpoints all cover
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(infra-monitoring): align daemonsets groupby with structure
- rename groupby_namespace -> test_daemonsets_groupby, parametrize over
k8s.daemonset.name + k8s.namespace.name; adds the daemonset-name-in-groupBy
branch (daemonSetName populated) that the other endpoints all cover
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>