mirror of
https://github.com/SigNoz/signoz.git
synced 2026-08-24 21:50:32 +01:00
Compare commits
base: SigNoz:v0.21.0
SigNoz:main
SigNoz:feat/storybook-initial-support
SigNoz:issue_5955
SigNoz:feat/trace-view-tanstack
SigNoz:fix/controls-pagination-loader
SigNoz:nv/notif-channel-create-v2
SigNoz:tvats-consume-column-plan
SigNoz:feat/qb-changes-for-ai-explorer
SigNoz:feat/incident_io_alert_channel_integration_frontend
SigNoz:feat/incident_io_alert_channel_integration
SigNoz:feat/jira_alert_channel_integration_frontend
SigNoz:feat/jira_alert_channel_integration_backend
SigNoz:ns/scope-metadata-first
SigNoz:feat/initial-wrapper-for-ai-explorer
SigNoz:ns/harness
SigNoz:nv/exp-hist-fix
SigNoz:nv/area-chart
SigNoz:demo/qb-builder-ai-query
SigNoz:feat/useBarChart-instead-of-graph
SigNoz:ns/scope-3
SigNoz:chore/dashboard-drop-v2-suffix
SigNoz:chore/dashboard-split-widget-types
SigNoz:chore/dashboard-rehome-widget-card
SigNoz:chore/dashboard-hoist-chart-layer
SigNoz:ns/scope
SigNoz:chore/dashboard-v1-retire-store
SigNoz:chore/dashboard-v1-public-legacy-notice
SigNoz:fix/dashboard-v2-overlay-navigation-lag
SigNoz:chore/dashboard-v1-retire-widget-editor
SigNoz:feat/infra-monitoring-k8s-containers
SigNoz:chore/dashboard-v1-cleanup-delete-dead
SigNoz:feat/google_chat_alert_integration_tests
SigNoz:feat/noz-error-handling
SigNoz:issue_4501
SigNoz:refactor/v2-panel-query-capabilities
SigNoz:feat/alert-e2e
SigNoz:feat/heatmap-chart-layer
SigNoz:chore/scaffold-skill
SigNoz:ns/scope-2
SigNoz:feat/migrate-quick-filter-to-use-keys-call
SigNoz:feat/semconv-phase2-signals
SigNoz:test/semconv-phase1-e2e
SigNoz:tvats-improve-body-query-pattern
SigNoz:tvats-attribute-index-predicates
SigNoz:tvats-search-literal-match
SigNoz:tvats-drop-needle-term
SigNoz:tvats-legacy-has-functions
SigNoz:platform-pod/issues/2651-fga
SigNoz:platform-pod/issues/2651-apis
SigNoz:fix/panel-types-json-parse
SigNoz:tvats-json-column-scan
SigNoz:issue_5602
SigNoz:feat/user-routes-fga
SigNoz:ns/githooks
SigNoz:refactor/clickhouse-quoting
SigNoz:feat/ai-o11y-feedback
SigNoz:feat/ai-o11-feedback
SigNoz:fix/recent-searches-test-flake
SigNoz:chore/dashboard-v1-cleanup-phase-4
SigNoz:chore/dashboard-v1-cleanup-phase-2
SigNoz:chore/dashboard-v1-cleanup-phase-1
SigNoz:test/migrate-remaining-user-role-cleanups
SigNoz:tvats-pipelines-collector-logs
SigNoz:issue-4293
SigNoz:fix/uplot-time-scale-trim
SigNoz:feat/expose-uplot-x-range-prop
SigNoz:tvats-body-v2-index
SigNoz:feat/update-datepicker-intrection
SigNoz:fga/dashboards
SigNoz:fix/root-user-422-status
SigNoz:feat/semconv-phase4-rollout
SigNoz:feat/semconv-phase3-migration-ux
SigNoz:feat/infra-monitoring-e2e
SigNoz:issue_5601_spanlist
SigNoz:ab/dashboards-fga-frontend
SigNoz:ab/dashboards-fga-list
SigNoz:ab/dashboards-fga-foundations
SigNoz:test/e2e-dashboards-sections
SigNoz:test/e2e-dashboards-foundation
SigNoz:test/e2e-dashboards-list
SigNoz:test/e2e-dashboards-variable-settings
SigNoz:test/e2e-dashboards-v1-deprecation
SigNoz:test/e2e-dashboards-variables
SigNoz:test/dashboard-v2-e2e-editor-core
SigNoz:test/dashboard-v2-e2e-editor-sections
SigNoz:test/dashboard-v2-e2e-panels
SigNoz:test/dashboard-v2-e2e-harness
SigNoz:feat/add-base-for-ai-o11y
SigNoz:claude/trace-details-history-vyuyt6
SigNoz:cursor/poc-trace-view-columns-453c
SigNoz:emdash/short-urls
SigNoz:cursor/poc-ai-query-builder-suggestions-453c
SigNoz:cursor/poc-ai-quick-filters-453c
SigNoz:dependabot/uv/tests/cryptography-50.0.0
SigNoz:infraM/meta_maps_strong_typing
SigNoz:claude/signoz-mcp-server-updates-s1qoh2
SigNoz:claude/component-library-research-91501a
SigNoz:claude/signoz-frontend-review-wv7afy
SigNoz:claude/integration-test-optimization-ib43lo
SigNoz:refactor/fix-qb-serialization
SigNoz:fix/11747-drop-v1-alert-history-endpoints
SigNoz:feat/alert-channels-google-chat-full-stack
SigNoz:monotonic
SigNoz:nv/str-equal-issubset
SigNoz:test/gcp-integration
SigNoz:feat/logs-linked-row-highlight
SigNoz:ns/saved-views
SigNoz:infraM/move_attributes_to_api_spec
SigNoz:feat/counter-reset-epochs
SigNoz:feat/add-gcp-integration
SigNoz:feat/rules-v2alpha1-openapi-contract
SigNoz:feat/forever-downtimes
SigNoz:issue-5121-5636
SigNoz:feat/llm-o11y-dashboard-poc-1
SigNoz:issue-10008
SigNoz:feat/llm-o11y-demo
SigNoz:feat/dashboard-v2-cross-section-panel-dnd
SigNoz:feat/llm-o11y-dashboard-poc
SigNoz:revert-12014-feat/quick-filters-resizable-update-all
SigNoz:traycer/feat-add-tests-for-recent-searches
SigNoz:dependabot/go_modules/github.com/openfga/openfga-1.18.0
SigNoz:feat/infra-monitoring-api-v2
SigNoz:ci/better-styles
SigNoz:platform-pod/issues/2606
SigNoz:chore/llm-o11y-uat
SigNoz:issue_5123_2
SigNoz:infraM/local_full_setup
SigNoz:e2e/dashboard-create-flow
SigNoz:feat/new-authz-components
SigNoz:fix/meter-explorer-use-stacked-chart-v1
SigNoz:feat/llm-attr-mapping-tabbed-foundation
SigNoz:feat/code-ownner-update
SigNoz:tvats-bound-groupy-clause
SigNoz:feat/invite-members-v2
SigNoz:ns/ch-25-12
SigNoz:docs-sync/export-raw-data-offset-batch_20260624_120429
SigNoz:feat/revamp-roles-creation-v2
SigNoz:ns/json-trace-promoted
SigNoz:emdash/trace-json-ve9mb
SigNoz:feat/llm-pricing-drawer-5
SigNoz:feat/llm-attr-mapping-tests-5
SigNoz:feat/panel-editor-v2-clean
SigNoz:feat/test_endpoint_attributemapping
SigNoz:feat/llm-pricing-e2e-4
SigNoz:feat/llm-observability-model-pricing
SigNoz:emdash/trace-download-ijm6t
SigNoz:feat/composite-query-url-serializer
SigNoz:fix/ai-assistant-explorer-panel-type
SigNoz:reduce-motion-fix
SigNoz:feat/llm-olly-attribute-mapping
SigNoz:settings-e2e
SigNoz:feat/llm-observabilitiy-attribute-mapping
SigNoz:fts-logs
SigNoz:feat/llm-observability
SigNoz:feat/llm-olly-model-pricing
SigNoz:chore/patch-audit-advisories-via-bump
SigNoz:downtime-ux
SigNoz:feat/qb-dual-mode
SigNoz:dashboard-test/temp1
SigNoz:sentry-fixes
SigNoz:billing-page-layout-issue
SigNoz:nv/10890
SigNoz:issue_5326
SigNoz:issue_5324
SigNoz:revert-11609-ns/waterfall-v3-cleanup
SigNoz:feat/auth-config-openapi-spec
SigNoz:feature/dashboard-panel-v2
SigNoz:feat/traces-table-migration
SigNoz:refactor/alerts-modules-scss
SigNoz:feat/test-qb
SigNoz:pagination-migration
SigNoz:feat/dashboard-panel-editor-v2
SigNoz:squeeze-baby-squeeze
SigNoz:chore/add-adr
SigNoz:promooted-evolution
SigNoz:issue_5131_3
SigNoz:chore/update-deps
SigNoz:fix/frontend-changes-for-issue-4616
SigNoz:revert/input-migration-11401
SigNoz:fix/checkbox-issue
SigNoz:fts-3
SigNoz:fts-logs-2
SigNoz:refactor/cloud-integration-fe-changes
SigNoz:ns/flamegraph-memory-2-rebased
SigNoz:inline-logs
SigNoz:feat/add-ripple-effect
SigNoz:feat/react-search-query
SigNoz:feature/dashboard-details-temp-v2
SigNoz:chore/playwright-chromium-cache
SigNoz:e2e/table-list-value-panel
SigNoz:tushar-signoz-patch-1
SigNoz:refactor/cloudintegration-service-details-frontend
SigNoz:feat/overview-page
SigNoz:dependabot/npm_and_yarn/frontend/dompurify-3.4.3
SigNoz:tvats-improve-key-suggestions
SigNoz:mute-rules
SigNoz:feat/select-migration
SigNoz:ns/pie-chart
SigNoz:config-alt
SigNoz:ns/waterfall-v3-memory-4
SigNoz:feature/dashboard-details-temp
SigNoz:fix/ext-api-stepinterval
SigNoz:feature/dashboards-list-v2-total
SigNoz:chore/migrate-dropdown
SigNoz:fix/alert-management-rule-redirect
SigNoz:chore/migrate-inputNumber
SigNoz:ankitnayan-patch-1
SigNoz:chore/dashboard-menu-fixes
SigNoz:chore/button-migration
SigNoz:no-auth-mode-tests
SigNoz:chore/query-run-experience
SigNoz:traceop
SigNoz:tvats-dont-froce-multiif
SigNoz:e2e/histogram-pie-panel
SigNoz:e2e/timeseries-bar-panel
SigNoz:ns/fg-select-fields-optimize
SigNoz:ns/flamegraph-memory
SigNoz:role-sa-fga-followup
SigNoz:platform-pod/issues/706
SigNoz:dependabot/npm_and_yarn/frontend/uuid-14.0.0
SigNoz:ns/scope-unnormalised
SigNoz:chore/pin-all-dependencies
SigNoz:tvats-limit-filter-size
SigNoz:issue_4863
SigNoz:platform-pod/issues/1938
SigNoz:test/flaky-test-fight
SigNoz:test/split-test-files
SigNoz:feat/add-signoz-icons
SigNoz:chore/replace-antd-icons-with-signoz-icons
SigNoz:dependabot/npm_and_yarn/frontend/follow-redirects-1.16.0
SigNoz:feat/service-map
SigNoz:ns/alert-disable
SigNoz:feat/dropdown-items
SigNoz:fix/multi-tooltip-pinning
SigNoz:test/golangci-action
SigNoz:feat/billing
SigNoz:tvats-scalar-cache
SigNoz:tvats-fix-timeshift
SigNoz:fix/rule-v2alpha1-evaluation-symmetry
SigNoz:feat/overview-defaults
SigNoz:feat/vitest-migration-design
SigNoz:release/v0.121.2
SigNoz:test/body-json-field
SigNoz:issue_4361_final
SigNoz:feat/azure-integration-ui-2
SigNoz:feat/yarn-v4
SigNoz:ee-auditor/fileauditor
SigNoz:platform-pod/issues/1938-v2-users
SigNoz:platform-pod/issues/2036-authz-registry
SigNoz:fixes/drilldown-ui
SigNoz:chore/auto-update-lint
SigNoz:platform-pod/issues/2037-check
SigNoz:chore/refactor-coretypes
SigNoz:base-path-config-1
SigNoz:base-path-phase-4
SigNoz:tvats-validate-clickhouse-query
SigNoz:base-path-phase-3
SigNoz:base-path-phase-2
SigNoz:chore/user-dashboard-pref
SigNoz:ns/td-cache-remove
SigNoz:platform-pod/issues/2095-rule
SigNoz:refactor/migrate-logs-to-v5
SigNoz:ns/waterfall-v3-2-cache-removal
SigNoz:fix/metrics-run-query-16-cleanup-fetching-state
SigNoz:fix/metrics-run-query-15-auto-refresh-errors
SigNoz:fix/metrics-run-query-14-auto-refresh-dashboard
SigNoz:fix/metrics-run-query-13-auto-refresh-alerts
SigNoz:fix/metrics-run-query-12-auto-refresh-explorers
SigNoz:feat/filter-search
SigNoz:base-path-config
SigNoz:public-dir-cleanup
SigNoz:ns/td-cache
SigNoz:base-path-serving
SigNoz:dep/openfga
SigNoz:upgrade/collector@v0.144.3-rc.2
SigNoz:chore/am_e2e
SigNoz:feat/azure-integration-ui
SigNoz:feat/span-details
SigNoz:feat/test-trace-v3
SigNoz:asset-migration
SigNoz:feat/table-escape-char-support
SigNoz:feat/trace-v3-waterfall
SigNoz:feat/trace-v3-flamegraph
SigNoz:feat/trace-v3-api-layer
SigNoz:feat/trace-v3-shared-components
SigNoz:debug-wal
SigNoz:infraM/base_dependencies
SigNoz:fix/metrics-run-query
SigNoz:chore/notification_channel_migrations
SigNoz:nv/4310
SigNoz:nv/4310-2
SigNoz:tvats-4538
SigNoz:tvats-add-make-py-fmt-in-pre-commit-hook
SigNoz:tvats-alias-select-columns
SigNoz:fix/hosts-metrics
SigNoz:feat/migrate-nodes-to-single-component
SigNoz:dependabot/npm_and_yarn/frontend/lodash-es-4.18.1
SigNoz:members-nuqs-upgrade
SigNoz:user-roles-updates
SigNoz:ab/4172
SigNoz:dependabot/npm_and_yarn/frontend/handlebars-4.7.9
SigNoz:fix/hosts-list
SigNoz:cursor/kong-dashboard-issues-4f0e
SigNoz:fix/error-response-handler-null-4284-4286
SigNoz:fix/alert-filter
SigNoz:chore/refactor-eval
SigNoz:feat/v2-user-apis-tests
SigNoz:tvats-hide-trace-download-button
SigNoz:cursor/duplicate-react-keys-35b8
SigNoz:fix/select-label-tolowercase-4122
SigNoz:fix/promql-undefined-4285
SigNoz:fix/row-collapse-widgets-undefined-4283
SigNoz:fix/groupby-undefined-4282
SigNoz:fix/queryformulas-undefined-4280
SigNoz:fix/query-labels-not-iterable-4124
SigNoz:fix/logs-orderby-undefined-4123
SigNoz:bugfix/update-dashboard-time-on-made-public
SigNoz:feat/v2-user-apis
SigNoz:nv/6204
SigNoz:fix/query-builder-skip-when-nil
SigNoz:fix/issue-10674-query-expression-variables
SigNoz:refactor/cloud-integration-impl-store
SigNoz:feat/cloudintegration-module
SigNoz:fix/filter_suggestions
SigNoz:update-members-api
SigNoz:feat/trace-details-ux-1
SigNoz:poc-mock-telemetry-store
SigNoz:feat/trace-flamegraph-2
SigNoz:feat/fix-user-domain-models
SigNoz:feat/fix-user-types-structure
SigNoz:keep-message-contained-fix
SigNoz:feat/user-x-role
SigNoz:feat/trace-waterfall
SigNoz:chore/test-slack-notification-merge-queue-failure-2
SigNoz:fix/issue-4208/panel-type-change-plus-pie
SigNoz:debug_timepicker
SigNoz:json-qb-integration
SigNoz:chore/issue-3955-move-dashboard-provider
SigNoz:cursor/cloud-integration-nil-checks-b8be
SigNoz:platform-pod/issues/1830-claims
SigNoz:platform-pod/issues/1696-integrate
SigNoz:platform-pod/issues/1830
SigNoz:cursor/query-builder-condition-logic-6e00
SigNoz:cursor/span-label-text-colors-3035
SigNoz:feat/trace-flamegraph
SigNoz:feat/trace-details-v3
SigNoz:SIG_3554
SigNoz:cursor/query-builder-logic-and-tests-13c4
SigNoz:cursor/inconsistent-map-indentation-1a51
SigNoz:feat/infra_disk_usage
SigNoz:another-field
SigNoz:ns/poc-waterfall
SigNoz:cursor/timeline-and-flamegraph-issues-f686
SigNoz:SIG_8931_revert
SigNoz:issue/10108
SigNoz:like-op
SigNoz:SIG_3522
SigNoz:SIG_8931_fix
SigNoz:lp-filter-v5
SigNoz:feat/infraM_revamp_backend_p2
SigNoz:feat/authz-on-dashboards
SigNoz:feat/infraM_list_apis_request_time_check
SigNoz:testing-feature
SigNoz:ns/claude-setup
SigNoz:feat/infraM_revamp_backend_p1base
SigNoz:platform-pod/issues/1696-1
SigNoz:feat/disable_side_drawer_missing_identifiers
SigNoz:feat/improve_infra_monitoring_list_apis
SigNoz:feat/cloud-integrations-apis
SigNoz:nv/7069
SigNoz:chore/claude-service-setup
SigNoz:nitya/cloud-ref
SigNoz:feat/poc-flamegraph
SigNoz:ns/waterfall-zoom-on-wf
SigNoz:pipelinesv2
SigNoz:ns/waterfall-zoom
SigNoz:ns/unfurl-fe
SigNoz:fix/remove_decoding_url
SigNoz:claude/laughing-driscoll-large-trace
SigNoz:nv/10282
SigNoz:chore/build-optimizationss
SigNoz:fts-body
SigNoz:chore/cmd-click
SigNoz:platform-pod/issues/1725
SigNoz:feat/azure-integration-ref
SigNoz:platform-pod/issues/528
SigNoz:fix/root-user-integration-tests
SigNoz:feat/cross-panel-sync
SigNoz:test-generics
SigNoz:dependabot/npm_and_yarn/frontend/lodash-es-4.17.23
SigNoz:feat/root-user
SigNoz:feat/sso-attributes-mapping-frontend
SigNoz:tavts-enable-seraching-events
SigNoz:show-ip-88664
SigNoz:tvats-hot-fix-2
SigNoz:temp/local_clickhouse_setup
SigNoz:chore/issue-3778-variable-store-isolation
SigNoz:chore/add-shortcuts-container
SigNoz:merge-json-columns
SigNoz:feat/cmd-click
SigNoz:platform-pod/issues/1278
SigNoz:ns/ext-api-query
SigNoz:ns/devenv
SigNoz:temp/collector_version_upgrade_signoz_repo_changes
SigNoz:tvats-improve-alias-handling
SigNoz:fix/trace-details-span-popover
SigNoz:feat/services_use_span_metrics
SigNoz:feat/self-reset-password-frontend
SigNoz:dependabot/npm_and_yarn/frontend/node-forge-1.3.3
SigNoz:chore/postable_rule_more_validation
SigNoz:feat/rule_condition_validation
SigNoz:feat/gateway-apis-integration-2
SigNoz:SIG-3733
SigNoz:feat/gateway-apis-integration
SigNoz:chore/ignore-context-canceled-logs
SigNoz:chore/push-launch.json
SigNoz:refactor/composite_query_validation
SigNoz:fix/validate_alert_payload_before_saving
SigNoz:chore/issue-9924-2
SigNoz:chore/remove_eval_delay_from_safe_rules
SigNoz:feat/warnings_for_empty_data
SigNoz:fix/metadata_map_metric_check
SigNoz:SIG-3098
SigNoz:cache-tests-on-cumulative-counter
SigNoz:refactor/update-cloud-integration-version
SigNoz:fix/duplicate-column-options
SigNoz:fix/trace-funnels-escape-user-controlled-values
SigNoz:chore/sentry-event-qb
SigNoz:feat/log-detail-add-remove-columns
SigNoz:fix/no_common_type_error_metrics_filter
SigNoz:issue/8880
SigNoz:SIG-9860
SigNoz:fix/show-loading-while-trace-only-logs-request-is-in-progress
SigNoz:chore/remove_rule_source_and_id_from_channel_title
SigNoz:pr-9785
SigNoz:perf/log-view
SigNoz:SIG-9743
SigNoz:refactor/query-builder-delete-logic
SigNoz:platform-pod/issues/1401
SigNoz:perf/panel-rerender
SigNoz:dependabot/npm_and_yarn/frontend/express-4.22.1
SigNoz:dependabot/npm_and_yarn/frontend/js-yaml-3.14.2
SigNoz:feat/handle-duplicate-attributes
SigNoz:dependabot/npm_and_yarn/frontend/min-document-2.19.2
SigNoz:cursor/copy-local-storage-to-url-queries-gpt-5.1-codex-2624
SigNoz:platform-pod/issues/1386
SigNoz:SIG-9263
SigNoz:tvats-improve-error-msg
SigNoz:feat/export_and_pagination_for_query_table
SigNoz:enh/conver-query-rewrite
SigNoz:enh/dashboard-creation-flow
SigNoz:feat/queryfilterextractor_complex
SigNoz:tvats-handle-duplicate-columns
SigNoz:platform-pod/issues/1136/1
SigNoz:fix/pass_time_in_scope_builder_using_structs
SigNoz:SIG-5270
SigNoz:fix/metric_metadata_le_bucket
SigNoz:chore/filter-rules
SigNoz:snyk-fix-1089b0dc310672567c7b8654e5f0f797
SigNoz:fix/span-logs-trace-only-incorrect-empty-state
SigNoz:fix/external-apis-bugfixes-and-improvments
SigNoz:enhancement/cmd-click-stack
SigNoz:snyk-fix-36c4a2e58f5f8c5430abd8f06f9586fd
SigNoz:feat/deployment-markers
SigNoz:feat/add-actionables-to-span-fields
SigNoz:chore/vite-migration
SigNoz:feat/cmd-click-impl-updated-history
SigNoz:fix/traces-overall-improvements
SigNoz:release-0.97.1
SigNoz:feat/enable_exp_hist
SigNoz:tvats-custom-ttl-for-attributes
SigNoz:routing-policies-e2e
SigNoz:snyk-fix-0e66a6592422ccd0d016dfcad7c720df
SigNoz:snyk-fix-e189cf2c41ee3f2f0637cf05e9fabca1
SigNoz:playwright-setup
SigNoz:issue_3019
SigNoz:snyk-fix-9542d99ece647d414f60b012a4da2366
SigNoz:fix/fix-the-attributes-actionables-styles
SigNoz:chore/y-axis-dashboards-alerts
SigNoz:temp/check_@_symbol_as_parametervalue_start
SigNoz:issue-5676
SigNoz:chore/normal-index
SigNoz:thirdpartylistapifix
SigNoz:temp/study_queries
SigNoz:indirectDescOperatorImprovement
SigNoz:enhancement/cmd-click-across-routes
SigNoz:feat/span-list-tab-in-trace-details-v2
SigNoz:revert-9026-SIG-8115
SigNoz:dependabot/npm_and_yarn/frontend/axios-1.12.0
SigNoz:fix/traces-list-trace-view-next-prev-time-issue
SigNoz:SIG-2881
SigNoz:evaluation-window-popover
SigNoz:upgrade/clickhouse-go
SigNoz:snyk-fix-dfda954b712a03d550caa0f896c4b84d
SigNoz:SIG-2879
SigNoz:feat/cron-alert
SigNoz:feat/interactive-dashbaord-v2
SigNoz:feat/interactive-dashbaord-v3
SigNoz:feat/cross-filtering-2
SigNoz:demo/trace-operators
SigNoz:feat/cross-filtering-test
SigNoz:feat/cross-filtering
SigNoz:feat/static-sidebar-to-side-drawer-in-trace-details-v2
SigNoz:fix/clickhouse_version_upgrade_local
SigNoz:feat/session-recording
SigNoz:improveTraceQuery
SigNoz:fix/alerts-qbv5
SigNoz:feat/custom-destinations
SigNoz:fix/non_zero_step_promql
SigNoz:demo-trace-operators
SigNoz:demo/trace_operators_backend
SigNoz:dyn-var-url-revert
SigNoz:SIG-5603-2
SigNoz:SIG-2023-var-1
SigNoz:var-url-format
SigNoz:variables-features
SigNoz:SIG-8704
SigNoz:imp/remove_nplus1_query_testing
SigNoz:imp/remove_nplus1_query
SigNoz:fix/extract-query-params
SigNoz:snyk-fix-05ae02136e944e496d83eedf877f6b45
SigNoz:chore/custom_dispatcher
SigNoz:fix/otel-collector-clickhouse-common-dev-network
SigNoz:feat/alert-multi-threshold
SigNoz:chore/requests-upgrade
SigNoz:feat/metering-ui
SigNoz:feat/drilldowns
SigNoz:feat/timestamp_aware_spans
SigNoz:feature/show-event-count-in-span-drawer
SigNoz:feat/drilldown-tables-v2
SigNoz:feat/ingestion-settings-e2e-tests
SigNoz:migration/react-router-dom
SigNoz:remove-stylus
SigNoz:dummy-test
SigNoz:chore/trace-funnels-tests
SigNoz:snyk-fix-d3e4693dcb50c2c0479fad12609c783a
SigNoz:snyk-fix-8f56167ea8ad689ec8351a1e4355b2ef
SigNoz:feat/drilldown-tables-v2-main
SigNoz:fix/quick-filters-query
SigNoz:snyk-fix-e37da51f00be42813460b6ea72743eca
SigNoz:snyk-fix-41273533b92c56f458ab759648a77cd0
SigNoz:fix/parenthesis-context
SigNoz:fix/query-context-with-spaces
SigNoz:fix/tracing-funnel-creation
SigNoz:feature/table-consumption-phase-1
SigNoz:chore/prometheus-v0.304.1
SigNoz:snyk-fix-030382efc240f2c1690bd90340fd81e9
SigNoz:SIG-5761
SigNoz:chore/tf/testing
SigNoz:fix/pagination-tests-fix
SigNoz:SIG-6421
SigNoz:feat/fixes-sprint5
SigNoz:fix/pat-role
SigNoz:variable-url-format
SigNoz:SIG-5603-1
SigNoz:SIG-2023-1
SigNoz:feat/qf-5
SigNoz:chore/timestamptz-non-null
SigNoz:feat/7294-services
SigNoz:tfbtest
SigNoz:tfbackend
SigNoz:fix/infra-monitoring/custom-time-range
SigNoz:feat/qf-2
SigNoz:fix-id-dashboards
SigNoz:react-router-update
SigNoz:remove-dead-code
SigNoz:feat/7274
SigNoz:feat/resource-filter-attr-v2
SigNoz:issue_7376
SigNoz:licensing
SigNoz:fix/prevent-the-layout-shift-in-query-builder
SigNoz:add-sapn-filter
SigNoz:kubecon-demo-2
SigNoz:kubecon-demo
SigNoz:feat/ha
SigNoz:signoz-tailwind-setup
SigNoz:snyk-fix-2c0716192269975cfac4296b058ca613
SigNoz:multiselect-component
SigNoz:feat/multi-tenancy
SigNoz:fix/opamp
SigNoz:onboarding-march-03
SigNoz:chore/ignore-license-error
SigNoz:release/0.76.0
SigNoz:fix-7233
SigNoz:alertmanager
SigNoz:snyk-fix-98a2b4eb555f6f78e7c1018ce58678b9
SigNoz:fix/handle-all-null-autocomplete-aggregateValues
SigNoz:SIG-6986
SigNoz:fix/install-no-sudo
SigNoz:6175
SigNoz:fix/range-picker-default-time
SigNoz:issue_406
SigNoz:chore/sentry-fixes
SigNoz:injection
SigNoz:config
SigNoz:pkg/config
SigNoz:feat/1196
SigNoz:snyk-fix-de6ff2437fe907956a0ab593cf6cb252
SigNoz:snyk-fix-563bd9c08e7da2ef4cdde74dd1ecc769
SigNoz:develop
SigNoz:release/v0.63.x
SigNoz:deprecate-v2-license
SigNoz:release/v0.62.x
SigNoz:snyk-fix-d189e25666bafbf4dbf075eb90f9ac07
SigNoz:release-sync/v0.61.x
SigNoz:release/v0.61.x
SigNoz:release/v0.60.x
SigNoz:release/v0.59.x
SigNoz:176/coalesce
SigNoz:release/v0.58.x
SigNoz:host-lists-improvement
SigNoz:anomaly-detection-target-default
SigNoz:sync/post-release-v0.57
SigNoz:issue_6307
SigNoz:snyk-fix-f9bd9b07e11673e8e8dbe74704f613fa
SigNoz:release/signoz-0.57.0
SigNoz:snyk-fix-475cb16aa1169412e86a28f40bb94889
SigNoz:release/v0.56.x
SigNoz:release/v0.55.x
SigNoz:release/v0.55.1
SigNoz:release/v0.54.x
SigNoz:release/v0.53.x
SigNoz:release/v0.52.x
SigNoz:release/v0.51.x
SigNoz:snyk-fix-1b34d8ba4ba6f717cec2c190535c57ce
SigNoz:snyk-fix-3c40ef7370e61bd5c87af93fc6b59d17
SigNoz:snyk-fix-e433c0c1dea4bb6bdec912a874dccac4
SigNoz:snyk-fix-811751f2b4e168eb58e10057181ba572
SigNoz:release/v0.50.x
SigNoz:release/v0.49.x
SigNoz:release/v0.48.x
SigNoz:release/v0.47.x
SigNoz:release/v0.46.x
SigNoz:release/v0.44
SigNoz:release/v0.43.x
SigNoz:release/v0.42.0
SigNoz:release/v0.41.1
SigNoz:release/v0.41.0
SigNoz:release/v0.40.0
SigNoz:release/v0.39.1
SigNoz:release/v0.39.0
SigNoz:release/v0.38.2
SigNoz:release/v0.38.0
SigNoz:fix/precheck-login
SigNoz:v0.138.0
SigNoz:v0.137.1
SigNoz:v0.137.0
SigNoz:v0.136.1
SigNoz:v0.136.0
SigNoz:v0.135.1
SigNoz:v0.135.0
SigNoz:v0.135.0-cloud.5
SigNoz:v0.135.0-cloud.4
SigNoz:v0.135.0-cloud.3
SigNoz:v0.135.0-cloud.2
SigNoz:v0.135.0-cloud.1
SigNoz:v0.134.0
SigNoz:v0.134.0-cloud.2
SigNoz:v0.134.0-cloud.1
SigNoz:v0.133.0
SigNoz:v0.132.2
SigNoz:v0.132.1
SigNoz:v0.132.0
SigNoz:v0.131.1
SigNoz:v0.132.0-rc.2
SigNoz:v0.132.0-rc.1
SigNoz:v0.131.0
SigNoz:v0.130.1
SigNoz:v0.130.0
SigNoz:v0.129.0
SigNoz:v0.128.0
SigNoz:v0.127.1
SigNoz:v0.127.0
SigNoz:v0.126.3-rc.1
SigNoz:v0.126.1
SigNoz:v0.126.0
SigNoz:v0.125.1
SigNoz:v0.125.0
SigNoz:v0.124.0
SigNoz:v0.123.0
SigNoz:v0.122.0
SigNoz:v0.121.1
SigNoz:v0.121.0
SigNoz:v0.120.0
SigNoz:v0.119.0
SigNoz:v0.118.0
SigNoz:v0.117.1
SigNoz:v0.117.0
SigNoz:v0.116.1
SigNoz:v0.116.0
SigNoz:v0.115.0
SigNoz:v0.114.1
SigNoz:v0.114.0
SigNoz:v0.113.0
SigNoz:v0.112.1
SigNoz:v0.113.0-rc.1
SigNoz:v0.112.0
SigNoz:v0.111.0
SigNoz:v0.110.2
SigNoz:v0.110.1
SigNoz:v0.110.0
SigNoz:v0.109.3
SigNoz:v0.109.2
SigNoz:v0.109.1
SigNoz:v0.109.0
SigNoz:v0.108.0
SigNoz:v0.108.0-rc.1
SigNoz:v0.107.0
SigNoz:v0.106.0
SigNoz:v0.105.1
SigNoz:v0.105.0
SigNoz:v0.104.0
SigNoz:v0.104.0-cloud.1
SigNoz:v0.103.1
SigNoz:v0.103.0
SigNoz:v0.102.1
SigNoz:v0.102.0
SigNoz:v0.101.0
SigNoz:v0.101.0-rc.1
SigNoz:v0.100.1
SigNoz:v0.100.0
SigNoz:v0.99.0
SigNoz:v0.98.0
SigNoz:v0.98.0-rc.1
SigNoz:v0.98.0-rc.0
SigNoz:v0.97.1
SigNoz:v0.97.0-515a1bda0
SigNoz:v0.97.0
SigNoz:v0.97.0-rc.3
SigNoz:v0.97.0-rc.2
SigNoz:v0.97.0-rc.1
SigNoz:v0.96.1
SigNoz:v0.96.0
SigNoz:v0.95.1-cloud.1
SigNoz:v0.95.1
SigNoz:v0.95.0
SigNoz:v0.94.1-cloud.1
SigNoz:v0.94.1
SigNoz:v0.94.0
SigNoz:v0.93.0-cloud.3
SigNoz:v0.93.0-cloud.2
SigNoz:v0.93.0-cloud.1
SigNoz:v0.93.0
SigNoz:v0.93.0-rc.3
SigNoz:v0.93.0-rc.2
SigNoz:v0.93.0-rc.1
SigNoz:v0.92.2
SigNoz:v0.92.1
SigNoz:v0.92.0
SigNoz:v0.91.1
SigNoz:v0.92.0-rc.5
SigNoz:v0.92.0-rc.4
SigNoz:v0.92.0-rc.3
SigNoz:v0.92.0-rc.2-gk1
SigNoz:v0.92.0-rc.2
SigNoz:v0.92.0-rc.1
SigNoz:v0.91.0-252658c
SigNoz:v0.91.0-dc4d515
SigNoz:v0.91.0-a8b6295
SigNoz:v0.92.0-cloud.1
SigNoz:v0.91.0-f1ab138
SigNoz:v0.91.0-f2c3a67
SigNoz:v0.91.0
SigNoz:v0.90.1-e0d6411
SigNoz:v0.90.1-e97c7d6
SigNoz:v0.90.1-3ef1e88
SigNoz:v0.90.1
SigNoz:v0.90.0
SigNoz:v0.89.0-9a406b8
SigNoz:v0.89.0
SigNoz:v0.88.1
SigNoz:v0.88.0
SigNoz:v0.88.0-rc.1
SigNoz:v0.89.0-cloud.1
SigNoz:v0.87.0-bb17b9d6c
SigNoz:v0.87.0-4ecc066
SigNoz:v0.87.0-54607d8
SigNoz:v0.87.0-41c3ceb10
SigNoz:v0.87.0-cffeff0
SigNoz:v0.87.0-af2534bbf
SigNoz:v0.88.0-cloud.3
SigNoz:v0.88.0-cloud.2
SigNoz:v0.87.0-e7f2408
SigNoz:v0.87.0-8d03e35d8
SigNoz:v0.88.0-cloud.1
SigNoz:v0.87.0-f267ed8ad
SigNoz:v0.87.0-b5a8309
SigNoz:v0.87.0-patch
SigNoz:v0.87.0-bda231637
SigNoz:v0.87.0
SigNoz:v0.87.0-rc.1
SigNoz:v0.86.2-6404e73
SigNoz:v0.86.2
SigNoz:v0.86.1
SigNoz:v0.86.0
SigNoz:v0.85.3
SigNoz:v0.85.2
SigNoz:v0.85.1
SigNoz:v0.85.0
SigNoz:v0.84.1
SigNoz:v0.84.0
SigNoz:v0.83.0
SigNoz:v0.83.0-cloud.1
SigNoz:v0.82.1
SigNoz:v0.82.0
SigNoz:v0.81.0-b9cd7ded
SigNoz:v0.81.0-cbedaa6e
SigNoz:v0.82.0-cloud.1
SigNoz:v0.81.0
SigNoz:v0.80.0-749532a0
SigNoz:v0.80.0-7b530d88
SigNoz:v0.80.0-4814a92
SigNoz:v0.80.0-523db11d
SigNoz:v0.80.0-53b98b0b
SigNoz:v0.80.0
SigNoz:v0.79.1
SigNoz:v0.80.0-cloud.1
SigNoz:v0.79.0
SigNoz:v0.78.2-json-parser-fix
SigNoz:v0.77.2-integrations-1
SigNoz:v0.77.2-integrations
SigNoz:v0.78.1
SigNoz:v0.79.0-431d46d0a
SigNoz:v0.79.0-963e35b55
SigNoz:v0.79.0-18b89242c
SigNoz:v0.79.0-32ece079f
SigNoz:v0.79.0-c396d2496
SigNoz:v0.78.0
SigNoz:v0.78.0-86f4f0d1d
SigNoz:v0.78.0-9759fceab
SigNoz:v0.78.0-c3d455b93
SigNoz:v0.78.0-3142b6cc6
SigNoz:v0.78.0-rc.9
SigNoz:v0.78.0-rc.8
SigNoz:v0.78.0-rc.7
SigNoz:v0.78.0-rc.6
SigNoz:v0.78.0-cloud.1
SigNoz:v0.78.0-4610afa99
SigNoz:v0.78.0-rc.5
SigNoz:v0.78.0-rc.4
SigNoz:v0.78.0-fe0f164e1
SigNoz:v0.78.0-rc.3
SigNoz:v0.76.2-e46c8bb1
SigNoz:v0.76.2-314d2560
SigNoz:v0.78.0-rc.2
SigNoz:v0.76.2-8049fa11
SigNoz:v0.78.0-rc.1
SigNoz:v0.77.0-5183d61c9
SigNoz:v0.77.0
SigNoz:v0.76.2-5cf417f4
SigNoz:v0.76.2-3c9e40a8
SigNoz:v0.77.0-6147f6e68
SigNoz:v0.76.2-b2b89885
SigNoz:v0.76.2-be44d660
SigNoz:v0.76.2-bf7a3181
SigNoz:v0.77.0-cloud.2
SigNoz:v0.76.2-ac7ecac2
SigNoz:v0.77.0-0fc12ddae
SigNoz:v0.77.0-740a290dc
SigNoz:v0.77.0-ecbe0b82d
SigNoz:v0.77.0-51ecd97b7
SigNoz:v0.76.2-24adfec5
SigNoz:v0.76.3-msk-integration-5
SigNoz:v0.76.3-msk-integration-4
SigNoz:v0.77.0-6a246332a
SigNoz:v0.77.0-cd0b9abd8
SigNoz:v0.77.0-e63d1b83b
SigNoz:v0.77.0-b2a7e7191
SigNoz:v0.77.0-7d89156af
SigNoz:v0.77.0-c86203e6b
SigNoz:v0.76.3-msk-integration-3
SigNoz:v0.77.0-820316d87
SigNoz:v0.76.3-msk-integration-2
SigNoz:v0.76.2
SigNoz:v0.76.3-msk-integration
SigNoz:v0.76.1
SigNoz:v0.76.0-f9b74b86
SigNoz:v0.76.0-cb04900a
SigNoz:tpapi-demo-internal-testing
SigNoz:v0.76.0-a13d1c89
SigNoz:0.76.0-a13d1c89
SigNoz:v0.77.0-5896e7c2d
SigNoz:v0.77.0-cloud.1
SigNoz:v0.76.0
SigNoz:v0.76.0-rc.5
SigNoz:v0.76.0-rc.3
SigNoz:v0.76.0-rc.1
SigNoz:v0.76.0-0e721dee1
SigNoz:feat/inproduct-homepage-v1
SigNoz:v0.76.0-8ca1f99d8
SigNoz:v0.76.0-cloud.4
SigNoz:v0.76.0-cloud.3
SigNoz:v0.76.0-cloud.2
SigNoz:v0.75.0-e1be10cd4
SigNoz:v0.75.0-47c4483f5
SigNoz:v0.75.0-2a4891fb8
SigNoz:v0.75.0-25657732b
SigNoz:v0.75.0-74edc942d
SigNoz:v0.75.0-6965f42f1
SigNoz:v0.75.0-35fe60dbb
SigNoz:v0.75.0-23b60b672
SigNoz:v0.76.0-cloud.1
SigNoz:v0.75.0-7d07d7a0b
SigNoz:v0.75.0-7082ea572
SigNoz:v0.75.0-730832cd4
SigNoz:v0.75.0-ed165f060
SigNoz:v0.75.0-42246eb89
SigNoz:v0.75.0-6ca7fa82b
SigNoz:v0.75.0-99ced1177
SigNoz:v0.75.0-9766ed21c
SigNoz:v0.75.0-763b4fffe
SigNoz:v0.75.0-c6e543416
SigNoz:v0.76.0-cache
SigNoz:v0.75.0-a64309701
SigNoz:v0.75.0-aws-integration-12eb23d4
SigNoz:v0.75.0-98eee6f7f
SigNoz:v0.75.0-bd3e0eeb6
SigNoz:v0.75.0-9d6e09d3f
SigNoz:v0.75.0-cccc25e2e
SigNoz:v0.75.0-9580da047
SigNoz:v0.75.0-8534b798c
SigNoz:v0.75.0-3bedd10ef
SigNoz:v0.75.0-b6f2ff052
SigNoz:v0.75.0-d02dc8687
SigNoz:v0.75.0-04835d14e
SigNoz:v0.75.0-aws-integration-107ba4a0
SigNoz:v0.75.0-aws-integration-c2cf1152
SigNoz:v0.75.0
SigNoz:v0.75.0-cloud.1
SigNoz:v0.75.0-pagination-be
SigNoz:v0.74.0
SigNoz:v0.74.0-aws-integration-4cc717d05
SigNoz:v0.74.0-cloud.1
SigNoz:v0.75.0-pagination
SigNoz:v0.74.0-2b4340a3e
SigNoz:v0.74.0-309ac976c
SigNoz:v0.73.0-407654e6
SigNoz:v0.73.0
SigNoz:v0.73.0-cloud.3
SigNoz:v0.73.0-cloud.2
SigNoz:v0.73.0-cloud.1
SigNoz:v0.72.0-aws-integration-a893b39
SigNoz:v0.72.0
SigNoz:v0.72.0-cloud.4
SigNoz:v0.72.0-onboarding-v3
SigNoz:v0.72.0-cloud.3
SigNoz:v0.72.0-cloud.2
SigNoz:v0.72.0-aws-integration-addafb9c3
SigNoz:v0.72.0-aws-integration-06b18e806
SigNoz:v0.72.0-cloud.1
SigNoz:v0.72.0-aws-integration-831514b83
SigNoz:v0.72.0-aws-integration-c3164912e
SigNoz:v0.72.0-onboarding-part-3-20fecc707
SigNoz:v0.71.0
SigNoz:v0.71.0-cloud.2
SigNoz:v0.71.0-42fe92cc8
SigNoz:v0.70.1
SigNoz:v0.71.0-cloud.1
SigNoz:v0.70.0
SigNoz:v0.71.0-pagination
SigNoz:v0.70.0-trace-detail-84268e049
SigNoz:v0.70.0-trace-detail-c1981969f
SigNoz:histogram-quantile/v0.0.1
SigNoz:v0.69.0-d3a8cf9ad
SigNoz:v0.70.0-trace-detail-5e26c6617
SigNoz:v0.70.0-trace-detail-7b5d663d6
SigNoz:v0.70.0-trace-detail-cc49c3958
SigNoz:v0.69.0
SigNoz:v0.69.0-cloud.2
SigNoz:v0.69.0-cloud.1
SigNoz:v0.68.0
SigNoz:v0.67.1
SigNoz:v0.67.0-6586-vars
SigNoz:v0.67.0-eb16d4bd6
SigNoz:v0.67.0
SigNoz:v0.67.0-custom-domain-15f85a645
SigNoz:v0.66.0-ea9bcc590
SigNoz:v0.66.0
SigNoz:v0.65.1
SigNoz:v0.66.0-trace-details-5370b8012
SigNoz:v0.66.0-trace-details-a45104493
SigNoz:v0.65.0
SigNoz:v0.65.0-cloud.7
SigNoz:v0.65.0-qf-005822ec4
SigNoz:v0.65.0-qf-0fca38a70
SigNoz:v0.65.0-qf-ea6694b44
SigNoz:v0.65.0-cloud.6
SigNoz:v0.65.0-cloud.5
SigNoz:v0.65.0-cloud.4
SigNoz:v0.65.0-cloud.3
SigNoz:v0.64.0-cbc83a0
SigNoz:v0.65.0-cloud.2
SigNoz:v0.64.0-7405bfbb
SigNoz:v0.65.0-cloud.1
SigNoz:v0.63.0-develop2
SigNoz:v0.64.0
SigNoz:v0.63.0-develop
SigNoz:v0.63.0
SigNoz:v0.63.0-frontend-arch-1c16916a1
SigNoz:v0.63.0-cloud.1
SigNoz:v0.63.0-frontend-arch-08c4bd0ff
SigNoz:v0.62.0
SigNoz:v0.62.0-cloud.3
SigNoz:v0.62.0-frontend-arch-6eeab69cc
SigNoz:v0.62.0-cloud.2
SigNoz:v0.61.0-214005e99
SigNoz:v0.62.0-cloud.1
SigNoz:v0.61.0
SigNoz:v0.61.0-debug-39566bfbe
SigNoz:v0.61.0-debug-1a7ea098a
SigNoz:v0.60.0-1934f74
SigNoz:v0.61.0-cloud.4
SigNoz:v0.61.0-cloud.3
SigNoz:v0.61.0-cloud.2
SigNoz:v0.61.0-cloud.1
SigNoz:v0.60.0
SigNoz:v0.60.0-cloud.5
SigNoz:v0.60.0-cloud.4
SigNoz:v0.60.0-cloud.3
SigNoz:v0.60.0-cloud.2
SigNoz:v0.60.0-cloud.1
SigNoz:v0.59.0-trace
SigNoz:v0.59.0
SigNoz:v0.59.2-licenses-57c232690
SigNoz:v0.59.1-licenses-a73a5931f
SigNoz:v0.58.2
SigNoz:v0.57.0-trace
SigNoz:v0.56.0-43e1fe686-trace
SigNoz:v0.58.1
SigNoz:v0.59.1-onboarding-part-3
SigNoz:v0.59.0-cloud.1
SigNoz:v0.58.0-licenses-e6cacced7
SigNoz:v0.58.0-git.946f30b08
SigNoz:v0.60.3-onboarding-part-3
SigNoz:v0.58.0
SigNoz:v0.56.0-trace-1
SigNoz:v0.58.0-licenses-bde7b85d1
SigNoz:v0.60.1-onboarding-part-3
SigNoz:v0.60.2-onboarding-part-3
SigNoz:v0.58.0-licenses-8b3d1f617
SigNoz:v0.58.0-cloud.2
SigNoz:v0.58.0-kafka-v2
SigNoz:v0.60.0-onboarding-part-3
SigNoz:v0.58.0-cloud.1
SigNoz:v0.57.0-cloud.5-d44d8c4ac
SigNoz:v0.59.0-onboarding-v2
SigNoz:v0.57.0-cloud.5-ff25ebf32
SigNoz:v0.58.2-onboarding-develop
SigNoz:v0.57.0-cloud.5-7759e67ee
SigNoz:v0.58.2-onboarding-23a57b0
SigNoz:v0.58.1-onboarding-10acef
SigNoz:v0.57.0
SigNoz:v0.58.0-onboarding-068f2097c
SigNoz:v0.57.0-cloud.5
SigNoz:v0.57.0-cloud.4
SigNoz:v0.57.0-cloud.3
SigNoz:v0.56.0-trace-2
SigNoz:v0.56.0-trace
SigNoz:v0.57.0-cloud.1.5b3839dca
SigNoz:v0.57.0-cloud.2
SigNoz:v0.57.0-cloud.1
SigNoz:v0.56.0
SigNoz:v0.56.0-cloud.3
SigNoz:v0.56.0-cloud.2
SigNoz:v0.56.0-cloud.1
SigNoz:v0.55.0
SigNoz:v0.55.0-cloud.10
SigNoz:v0.55.0-cloud.9
SigNoz:v0.55.0-cloud.8
SigNoz:v0.52.0-cloud.1.5d6ff4781
SigNoz:v0.55.0-cloud.7
SigNoz:v0.55.0-cloud.6
SigNoz:v0.55.0-cloud.5
SigNoz:v0.55.0-cloud.4
SigNoz:v0.55.0-cloud.3
SigNoz:v0.55.0-cloud.2
SigNoz:v0.55.0-cloud.1
SigNoz:v0.54.0
SigNoz:v0.54.0-cloud.5
SigNoz:v0.54.0-cloud.4
SigNoz:v0.54.0-cloud.3
SigNoz:v0.54.0-cloud.2
SigNoz:v0.54.0-cloud.1
SigNoz:v0.53.0
SigNoz:v0.53.0-cloud.4
SigNoz:v0.53.0-c2c8c716c
SigNoz:v0.53.0-alpha.2
SigNoz:v0.53.0-alpha.1
SigNoz:v0.53.0-cloud.3
SigNoz:v0.53.0-cloud.2
SigNoz:v0.50.0-logs-schema-t2-fe
SigNoz:v0.50.0-logs-schema-t2
SigNoz:v0.53.0-cloud.1
SigNoz:v0.53.0-cloud.0
SigNoz:v0.52.0-cloud.1.521b7c6
SigNoz:v0.52.0-cloud.8
SigNoz:v0.52.0-cloud.7
SigNoz:v0.52.0-cloud.6
SigNoz:v0.52.0
SigNoz:v0.52.0-cloud.5
SigNoz:v0.51.0-agg-tables
SigNoz:v0.52.0-cloud.4
SigNoz:v0.52.0-cloud.3
SigNoz:v0.50.0-logs-schema-t1-fe
SigNoz:v0.50.0-logs-schema-t1
SigNoz:v0.50.0-logs-schema
SigNoz:v0.52.0-cloud.2-5a9267d69
SigNoz:v0.52.0-cloud.2
SigNoz:v0.52.0-cloud.1
SigNoz:v0.51.0
SigNoz:v0.51.0-cloud.3
SigNoz:v0.51.0-cloud.2
SigNoz:v0.51.0-cloud.1
SigNoz:v0.50.0
SigNoz:v0.50.0-cloud.2
SigNoz:v0.50.0-cloud.1
SigNoz:v0.49.1
SigNoz:v0.49.0
SigNoz:v0.49.0-cloud.4
SigNoz:v0.49.0-cloud.3
SigNoz:v0.48.1
SigNoz:v0.49.0-cloud.2
SigNoz:v0.49.0-cloud.1
SigNoz:v0.48.0
SigNoz:v0.48.0-cloud.3
SigNoz:v0.48.0-cloud.2
SigNoz:v0.48.0-cloud.1
SigNoz:v0.48.0-beta.2
SigNoz:v0.48.0-beta.1
SigNoz:v0.47.0
SigNoz:v0.47.0-beta.5
SigNoz:v0.47.0-beta.4
SigNoz:v0.47.0-beta.3
SigNoz:v0.46.0-389f22cf6
SigNoz:v0.47.0-beta.2
SigNoz:v0.47.0-beta.1
SigNoz:v0.45.0-dashboard-revamp
SigNoz:v0.46.0-353881533
SigNoz:v0.46.0-1d86e5eb5
SigNoz:v0.46.0-1369fe191
SigNoz:v0.46.0-76b1e40cb
SigNoz:v0.46.0-a0c340f21
SigNoz:v0.46.0-0d043bf38
SigNoz:v0.46.0
SigNoz:v0.45.0-04a68ad4-debug
SigNoz:v0.45.0-a891dd4b
SigNoz:v0.45.0-12be6ce0
SigNoz:v0.45.0-9ff0e340
SigNoz:v0.45.0-c42f06b9-alerts-v4
SigNoz:v0.45.0-alert-v4-migrate
SigNoz:v0.45.0-7e31b4ca
SigNoz:v0.46.0-cloud.1
SigNoz:v0.45.0
SigNoz:v0.45.0-beta.3
SigNoz:v0.44.0-disable_enrichment
SigNoz:v0.45.0-beta.2
SigNoz:v0.45.0-beta.1
SigNoz:v0.44.0-7d81bc34
SigNoz:v0.43.0-debug
SigNoz:v0.45.0-alpha.1
SigNoz:v0.44.0
SigNoz:v0.43.0-0760c216
SigNoz:v0.44.0-alpha.2
SigNoz:v0.43.0-gor
SigNoz:v0.43.1
SigNoz:v0.44.0-alpha.1
SigNoz:v0.43.0
SigNoz:v0.42.0-query-limits
SigNoz:v0.42.0-32e71b92
SigNoz:v0.42.0-d6cd15598
SigNoz:v0.42.0-19d4c3414
SigNoz:v0.42.0-31e71b92
SigNoz:v0.42.0-af353b934
SigNoz:v0.42.0-96e750592
SigNoz:v0.42.0-a7b0ef55
SigNoz:v0.42.0-30e71b92
SigNoz:v0.42.0-8c02f8e
SigNoz:v0.42.0-20e71b92
SigNoz:v0.42.3-debug
SigNoz:v0.42.2-debug
SigNoz:v0.42.1-debug
SigNoz:v0.42.0
SigNoz:v0.41.1-31b1d58a
SigNoz:v0.41.1-63f0ae1c7
SigNoz:v0.41.1-5e034ec9
SigNoz:v0.41.1
SigNoz:v0.41.0
SigNoz:v0.40.0-a4217659
SigNoz:v0.40.0-666916fae
SigNoz:v0.40.0-6618b471
SigNoz:v0.40.0-b3b75222
SigNoz:v0.40.0-3fece44ae
SigNoz:v0.40.0
SigNoz:v0.39.1-f9eddc9b1
SigNoz:v0.39.1
SigNoz:v0.38.2-88a8bc3ee
SigNoz:v0.39.0-548c53195
SigNoz:v0.39.0
SigNoz:v0.38.2-02f83e4b4
SigNoz:v0.38.2-ace1021a0
SigNoz:v0.38.2
SigNoz:v0.38.1
SigNoz:v0.38.0
SigNoz:v0.37.2
SigNoz:v0.37.1
SigNoz:v0.37.0
SigNoz:v0.36.2
SigNoz:v0.36.1
SigNoz:v0.36.0-263ac9fa5
SigNoz:v0.36.0
SigNoz:v0.36.0-rc.1
SigNoz:v0.35.1-75268888
SigNoz:v0.35.1-8e653f95
SigNoz:v0.35.1-a16fca63
SigNoz:v0.35.1
SigNoz:v0.35.0
SigNoz:v0.34.4-112783d6
SigNoz:v0.34.4-0b991331
SigNoz:v0.34.4
SigNoz:v0.34.3-d1acad8e
SigNoz:v0.34.3
SigNoz:v0.34.2
SigNoz:v0.34.1-d42bf50d
SigNoz:v0.34.1
SigNoz:v0.34.0-dc23368f
SigNoz:v0.34.0
SigNoz:v0.33.1-6b2f857a
SigNoz:v0.33.1-6-g050b8661
SigNoz:v0.33.1
SigNoz:v0.33.0
SigNoz:v0.32.1-3-gfc49833c
SigNoz:v0.32.1-5-gf427bac9
SigNoz:v0.32.1
SigNoz:v0.32.0
SigNoz:v0.31.1-8-gf7fe64a8
SigNoz:v0.31.1
SigNoz:v0.31.0
SigNoz:v0.30.0
SigNoz:v0.29.1-37-g91bcadf6
SigNoz:v0.29.3
SigNoz:v0.29.2
SigNoz:v0.29.1
SigNoz:v0.29.0
SigNoz:v0.28.0
SigNoz:v0.27.0
SigNoz:v0.26.1-896836b5
SigNoz:v0.26.1
SigNoz:v0.26.0
SigNoz:v0.25.5
SigNoz:v0.25.4
SigNoz:v0.25.3-ae3d4fec
SigNoz:v0.25.3
SigNoz:v0.25.2
SigNoz:v0.25.1
SigNoz:v0.25.0
SigNoz:v0.24.0
SigNoz:v0.23.1
SigNoz:v0.23.0
SigNoz:v0.23.0-rc.1
SigNoz:v0.22.0
SigNoz:v0.21.0-f90bf0263b
SigNoz:v0.21.0-b3da06d2
SigNoz:v0.21.0-cc07d654d
SigNoz:v0.21.0-a4c4d4
SigNoz:v0.21.0
SigNoz:v0.20.2-1f7e096b
SigNoz:v0.20.2
SigNoz:v0.20.1
SigNoz:v0.20.0
SigNoz:v0.19.0
SigNoz:v0.19.0-rc.3
SigNoz:v0.19.0-rc.2
SigNoz:v0.19.0-rc.1
SigNoz:v0.18.3
SigNoz:v0.18.2
SigNoz:v0.18.1
SigNoz:v0.18.0
SigNoz:v0.17.0
SigNoz:v0.16.2
SigNoz:v0.16.1
SigNoz:v0.16.0
SigNoz:v0.15.0
SigNoz:v0.15.0-rc.1
SigNoz:v0.14
SigNoz:v0.14.0
SigNoz:v0.13.0
SigNoz:v0.13.1
SigNoz:v0.13
SigNoz:v0.13.0-rc.2
SigNoz:v0.13.0-rc.1
SigNoz:v0.12.0
SigNoz:v0.12.0-rc.3
SigNoz:v0.11.4-istiotest
SigNoz:v0.12.0-rc.2
SigNoz:v0.12.0-rc.1
SigNoz:v0.11.4
SigNoz:v0.11
SigNoz:v0.11.4-rc.3
SigNoz:v0.11.4-rc.2
SigNoz:v0.11.4-rc.1
SigNoz:v0.11.3
SigNoz:v0.11.3-rc.1
SigNoz:v0.11.2
SigNoz:v0.11.2-rc.3
SigNoz:v0.11.2-rc.2
SigNoz:v0.11.2-rc.1
SigNoz:v0.11.1
SigNoz:v0.11.1-rc.1
SigNoz:v0.11.0
SigNoz:v0.11.0-rc.1
SigNoz:v0.10.2
SigNoz:v0.10
SigNoz:v0.10.1
SigNoz:v0.10.1-rc.1
SigNoz:v0.10.0
SigNoz:v0.10.0-rc2
SigNoz:v0.10.0-rc1
SigNoz:v0.9.2
SigNoz:v0.9.2-rc1
SigNoz:v0.9
SigNoz:v0.9.1
SigNoz:v0.9.0
SigNoz:v0.9.0-rc2
SigNoz:v0.9.0-rc1
SigNoz:v0.8
SigNoz:v0.8.2
SigNoz:v0.8.1
SigNoz:v0.8.1-rc5
SigNoz:v0.8.1-rc4
SigNoz:v0.8.1-rc3
SigNoz:v0.8.1-rc2
SigNoz:v0.8.1-rc1
SigNoz:v0.8.0
SigNoz:v0.8.0-rc6
SigNoz:v0.8.0-rc5
SigNoz:v0.8.0-rc4
SigNoz:v0.8.0-rc3
SigNoz:v0.8.0-rc2
SigNoz:v0.8.0-rc1
SigNoz:v0.7
SigNoz:v0.7.5-rc2
SigNoz:v0.7.5
SigNoz:v0.7.5-rc1
SigNoz:v0.7.4
SigNoz:v0.7.4-rc2
SigNoz:v0.7.4-rc1
SigNoz:v0.7.3
SigNoz:v0.7.2
SigNoz:v0.7.2-rc1
SigNoz:v0.7.1
SigNoz:v0.7.0
SigNoz:v0.6.2
SigNoz:v0.6.1
SigNoz:v0.6
SigNoz:v0.6.0
SigNoz:v0.5.4
SigNoz:v0.5.3
SigNoz:v0.5.2
SigNoz:v0.5.1
SigNoz:v0.5.0
SigNoz:v0.4.5
SigNoz:v0.4.4
SigNoz:v0.4.3
SigNoz:v0.4.2
SigNoz:v0.4.1
SigNoz:v0.4.0
SigNoz:v0.3.6
SigNoz:v0.3.5
SigNoz:0.3.5
SigNoz:v0.3.4
SigNoz:v0.3.3
SigNoz:v0.3.2
SigNoz:v0.3.1
SigNoz:0.2.2
SigNoz:v0.2.2
SigNoz:0.2.0
SigNoz:0.1.0
...
compare: SigNoz:feat/trace-view-tanstack
SigNoz:feat/storybook-initial-support
SigNoz:issue_5955
SigNoz:feat/trace-view-tanstack
SigNoz:main
SigNoz:fix/controls-pagination-loader
SigNoz:nv/notif-channel-create-v2
SigNoz:tvats-consume-column-plan
SigNoz:feat/qb-changes-for-ai-explorer
SigNoz:feat/incident_io_alert_channel_integration_frontend
SigNoz:feat/incident_io_alert_channel_integration
SigNoz:feat/jira_alert_channel_integration_frontend
SigNoz:feat/jira_alert_channel_integration_backend
SigNoz:ns/scope-metadata-first
SigNoz:feat/initial-wrapper-for-ai-explorer
SigNoz:ns/harness
SigNoz:nv/exp-hist-fix
SigNoz:nv/area-chart
SigNoz:demo/qb-builder-ai-query
SigNoz:feat/useBarChart-instead-of-graph
SigNoz:ns/scope-3
SigNoz:chore/dashboard-drop-v2-suffix
SigNoz:chore/dashboard-split-widget-types
SigNoz:chore/dashboard-rehome-widget-card
SigNoz:chore/dashboard-hoist-chart-layer
SigNoz:ns/scope
SigNoz:chore/dashboard-v1-retire-store
SigNoz:chore/dashboard-v1-public-legacy-notice
SigNoz:fix/dashboard-v2-overlay-navigation-lag
SigNoz:chore/dashboard-v1-retire-widget-editor
SigNoz:feat/infra-monitoring-k8s-containers
SigNoz:chore/dashboard-v1-cleanup-delete-dead
SigNoz:feat/google_chat_alert_integration_tests
SigNoz:feat/noz-error-handling
SigNoz:issue_4501
SigNoz:refactor/v2-panel-query-capabilities
SigNoz:feat/alert-e2e
SigNoz:feat/heatmap-chart-layer
SigNoz:chore/scaffold-skill
SigNoz:ns/scope-2
SigNoz:feat/migrate-quick-filter-to-use-keys-call
SigNoz:feat/semconv-phase2-signals
SigNoz:test/semconv-phase1-e2e
SigNoz:tvats-improve-body-query-pattern
SigNoz:tvats-attribute-index-predicates
SigNoz:tvats-search-literal-match
SigNoz:tvats-drop-needle-term
SigNoz:tvats-legacy-has-functions
SigNoz:platform-pod/issues/2651-fga
SigNoz:platform-pod/issues/2651-apis
SigNoz:fix/panel-types-json-parse
SigNoz:tvats-json-column-scan
SigNoz:issue_5602
SigNoz:feat/user-routes-fga
SigNoz:ns/githooks
SigNoz:refactor/clickhouse-quoting
SigNoz:feat/ai-o11y-feedback
SigNoz:feat/ai-o11-feedback
SigNoz:fix/recent-searches-test-flake
SigNoz:chore/dashboard-v1-cleanup-phase-4
SigNoz:chore/dashboard-v1-cleanup-phase-2
SigNoz:chore/dashboard-v1-cleanup-phase-1
SigNoz:test/migrate-remaining-user-role-cleanups
SigNoz:tvats-pipelines-collector-logs
SigNoz:issue-4293
SigNoz:fix/uplot-time-scale-trim
SigNoz:feat/expose-uplot-x-range-prop
SigNoz:tvats-body-v2-index
SigNoz:feat/update-datepicker-intrection
SigNoz:fga/dashboards
SigNoz:fix/root-user-422-status
SigNoz:feat/semconv-phase4-rollout
SigNoz:feat/semconv-phase3-migration-ux
SigNoz:feat/infra-monitoring-e2e
SigNoz:issue_5601_spanlist
SigNoz:ab/dashboards-fga-frontend
SigNoz:ab/dashboards-fga-list
SigNoz:ab/dashboards-fga-foundations
SigNoz:test/e2e-dashboards-sections
SigNoz:test/e2e-dashboards-foundation
SigNoz:test/e2e-dashboards-list
SigNoz:test/e2e-dashboards-variable-settings
SigNoz:test/e2e-dashboards-v1-deprecation
SigNoz:test/e2e-dashboards-variables
SigNoz:test/dashboard-v2-e2e-editor-core
SigNoz:test/dashboard-v2-e2e-editor-sections
SigNoz:test/dashboard-v2-e2e-panels
SigNoz:test/dashboard-v2-e2e-harness
SigNoz:feat/add-base-for-ai-o11y
SigNoz:claude/trace-details-history-vyuyt6
SigNoz:cursor/poc-trace-view-columns-453c
SigNoz:emdash/short-urls
SigNoz:cursor/poc-ai-query-builder-suggestions-453c
SigNoz:cursor/poc-ai-quick-filters-453c
SigNoz:dependabot/uv/tests/cryptography-50.0.0
SigNoz:infraM/meta_maps_strong_typing
SigNoz:claude/signoz-mcp-server-updates-s1qoh2
SigNoz:claude/component-library-research-91501a
SigNoz:claude/signoz-frontend-review-wv7afy
SigNoz:claude/integration-test-optimization-ib43lo
SigNoz:refactor/fix-qb-serialization
SigNoz:fix/11747-drop-v1-alert-history-endpoints
SigNoz:feat/alert-channels-google-chat-full-stack
SigNoz:monotonic
SigNoz:nv/str-equal-issubset
SigNoz:test/gcp-integration
SigNoz:feat/logs-linked-row-highlight
SigNoz:ns/saved-views
SigNoz:infraM/move_attributes_to_api_spec
SigNoz:feat/counter-reset-epochs
SigNoz:feat/add-gcp-integration
SigNoz:feat/rules-v2alpha1-openapi-contract
SigNoz:feat/forever-downtimes
SigNoz:issue-5121-5636
SigNoz:feat/llm-o11y-dashboard-poc-1
SigNoz:issue-10008
SigNoz:feat/llm-o11y-demo
SigNoz:feat/dashboard-v2-cross-section-panel-dnd
SigNoz:feat/llm-o11y-dashboard-poc
SigNoz:revert-12014-feat/quick-filters-resizable-update-all
SigNoz:traycer/feat-add-tests-for-recent-searches
SigNoz:dependabot/go_modules/github.com/openfga/openfga-1.18.0
SigNoz:feat/infra-monitoring-api-v2
SigNoz:ci/better-styles
SigNoz:platform-pod/issues/2606
SigNoz:chore/llm-o11y-uat
SigNoz:issue_5123_2
SigNoz:infraM/local_full_setup
SigNoz:e2e/dashboard-create-flow
SigNoz:feat/new-authz-components
SigNoz:fix/meter-explorer-use-stacked-chart-v1
SigNoz:feat/llm-attr-mapping-tabbed-foundation
SigNoz:feat/code-ownner-update
SigNoz:tvats-bound-groupy-clause
SigNoz:feat/invite-members-v2
SigNoz:ns/ch-25-12
SigNoz:docs-sync/export-raw-data-offset-batch_20260624_120429
SigNoz:feat/revamp-roles-creation-v2
SigNoz:ns/json-trace-promoted
SigNoz:emdash/trace-json-ve9mb
SigNoz:feat/llm-pricing-drawer-5
SigNoz:feat/llm-attr-mapping-tests-5
SigNoz:feat/panel-editor-v2-clean
SigNoz:feat/test_endpoint_attributemapping
SigNoz:feat/llm-pricing-e2e-4
SigNoz:feat/llm-observability-model-pricing
SigNoz:emdash/trace-download-ijm6t
SigNoz:feat/composite-query-url-serializer
SigNoz:fix/ai-assistant-explorer-panel-type
SigNoz:reduce-motion-fix
SigNoz:feat/llm-olly-attribute-mapping
SigNoz:settings-e2e
SigNoz:feat/llm-observabilitiy-attribute-mapping
SigNoz:fts-logs
SigNoz:feat/llm-observability
SigNoz:feat/llm-olly-model-pricing
SigNoz:chore/patch-audit-advisories-via-bump
SigNoz:downtime-ux
SigNoz:feat/qb-dual-mode
SigNoz:dashboard-test/temp1
SigNoz:sentry-fixes
SigNoz:billing-page-layout-issue
SigNoz:nv/10890
SigNoz:issue_5326
SigNoz:issue_5324
SigNoz:revert-11609-ns/waterfall-v3-cleanup
SigNoz:feat/auth-config-openapi-spec
SigNoz:feature/dashboard-panel-v2
SigNoz:feat/traces-table-migration
SigNoz:refactor/alerts-modules-scss
SigNoz:feat/test-qb
SigNoz:pagination-migration
SigNoz:feat/dashboard-panel-editor-v2
SigNoz:squeeze-baby-squeeze
SigNoz:chore/add-adr
SigNoz:promooted-evolution
SigNoz:issue_5131_3
SigNoz:chore/update-deps
SigNoz:fix/frontend-changes-for-issue-4616
SigNoz:revert/input-migration-11401
SigNoz:fix/checkbox-issue
SigNoz:fts-3
SigNoz:fts-logs-2
SigNoz:refactor/cloud-integration-fe-changes
SigNoz:ns/flamegraph-memory-2-rebased
SigNoz:inline-logs
SigNoz:feat/add-ripple-effect
SigNoz:feat/react-search-query
SigNoz:feature/dashboard-details-temp-v2
SigNoz:chore/playwright-chromium-cache
SigNoz:e2e/table-list-value-panel
SigNoz:tushar-signoz-patch-1
SigNoz:refactor/cloudintegration-service-details-frontend
SigNoz:feat/overview-page
SigNoz:dependabot/npm_and_yarn/frontend/dompurify-3.4.3
SigNoz:tvats-improve-key-suggestions
SigNoz:mute-rules
SigNoz:feat/select-migration
SigNoz:ns/pie-chart
SigNoz:config-alt
SigNoz:ns/waterfall-v3-memory-4
SigNoz:feature/dashboard-details-temp
SigNoz:fix/ext-api-stepinterval
SigNoz:feature/dashboards-list-v2-total
SigNoz:chore/migrate-dropdown
SigNoz:fix/alert-management-rule-redirect
SigNoz:chore/migrate-inputNumber
SigNoz:ankitnayan-patch-1
SigNoz:chore/dashboard-menu-fixes
SigNoz:chore/button-migration
SigNoz:no-auth-mode-tests
SigNoz:chore/query-run-experience
SigNoz:traceop
SigNoz:tvats-dont-froce-multiif
SigNoz:e2e/histogram-pie-panel
SigNoz:e2e/timeseries-bar-panel
SigNoz:ns/fg-select-fields-optimize
SigNoz:ns/flamegraph-memory
SigNoz:role-sa-fga-followup
SigNoz:platform-pod/issues/706
SigNoz:dependabot/npm_and_yarn/frontend/uuid-14.0.0
SigNoz:ns/scope-unnormalised
SigNoz:chore/pin-all-dependencies
SigNoz:tvats-limit-filter-size
SigNoz:issue_4863
SigNoz:platform-pod/issues/1938
SigNoz:test/flaky-test-fight
SigNoz:test/split-test-files
SigNoz:feat/add-signoz-icons
SigNoz:chore/replace-antd-icons-with-signoz-icons
SigNoz:dependabot/npm_and_yarn/frontend/follow-redirects-1.16.0
SigNoz:feat/service-map
SigNoz:ns/alert-disable
SigNoz:feat/dropdown-items
SigNoz:fix/multi-tooltip-pinning
SigNoz:test/golangci-action
SigNoz:feat/billing
SigNoz:tvats-scalar-cache
SigNoz:tvats-fix-timeshift
SigNoz:fix/rule-v2alpha1-evaluation-symmetry
SigNoz:feat/overview-defaults
SigNoz:feat/vitest-migration-design
SigNoz:release/v0.121.2
SigNoz:test/body-json-field
SigNoz:issue_4361_final
SigNoz:feat/azure-integration-ui-2
SigNoz:feat/yarn-v4
SigNoz:ee-auditor/fileauditor
SigNoz:platform-pod/issues/1938-v2-users
SigNoz:platform-pod/issues/2036-authz-registry
SigNoz:fixes/drilldown-ui
SigNoz:chore/auto-update-lint
SigNoz:platform-pod/issues/2037-check
SigNoz:chore/refactor-coretypes
SigNoz:base-path-config-1
SigNoz:base-path-phase-4
SigNoz:tvats-validate-clickhouse-query
SigNoz:base-path-phase-3
SigNoz:base-path-phase-2
SigNoz:chore/user-dashboard-pref
SigNoz:ns/td-cache-remove
SigNoz:platform-pod/issues/2095-rule
SigNoz:refactor/migrate-logs-to-v5
SigNoz:ns/waterfall-v3-2-cache-removal
SigNoz:fix/metrics-run-query-16-cleanup-fetching-state
SigNoz:fix/metrics-run-query-15-auto-refresh-errors
SigNoz:fix/metrics-run-query-14-auto-refresh-dashboard
SigNoz:fix/metrics-run-query-13-auto-refresh-alerts
SigNoz:fix/metrics-run-query-12-auto-refresh-explorers
SigNoz:feat/filter-search
SigNoz:base-path-config
SigNoz:public-dir-cleanup
SigNoz:ns/td-cache
SigNoz:base-path-serving
SigNoz:dep/openfga
SigNoz:upgrade/collector@v0.144.3-rc.2
SigNoz:chore/am_e2e
SigNoz:feat/azure-integration-ui
SigNoz:feat/span-details
SigNoz:feat/test-trace-v3
SigNoz:asset-migration
SigNoz:feat/table-escape-char-support
SigNoz:feat/trace-v3-waterfall
SigNoz:feat/trace-v3-flamegraph
SigNoz:feat/trace-v3-api-layer
SigNoz:feat/trace-v3-shared-components
SigNoz:debug-wal
SigNoz:infraM/base_dependencies
SigNoz:fix/metrics-run-query
SigNoz:chore/notification_channel_migrations
SigNoz:nv/4310
SigNoz:nv/4310-2
SigNoz:tvats-4538
SigNoz:tvats-add-make-py-fmt-in-pre-commit-hook
SigNoz:tvats-alias-select-columns
SigNoz:fix/hosts-metrics
SigNoz:feat/migrate-nodes-to-single-component
SigNoz:dependabot/npm_and_yarn/frontend/lodash-es-4.18.1
SigNoz:members-nuqs-upgrade
SigNoz:user-roles-updates
SigNoz:ab/4172
SigNoz:dependabot/npm_and_yarn/frontend/handlebars-4.7.9
SigNoz:fix/hosts-list
SigNoz:cursor/kong-dashboard-issues-4f0e
SigNoz:fix/error-response-handler-null-4284-4286
SigNoz:fix/alert-filter
SigNoz:chore/refactor-eval
SigNoz:feat/v2-user-apis-tests
SigNoz:tvats-hide-trace-download-button
SigNoz:cursor/duplicate-react-keys-35b8
SigNoz:fix/select-label-tolowercase-4122
SigNoz:fix/promql-undefined-4285
SigNoz:fix/row-collapse-widgets-undefined-4283
SigNoz:fix/groupby-undefined-4282
SigNoz:fix/queryformulas-undefined-4280
SigNoz:fix/query-labels-not-iterable-4124
SigNoz:fix/logs-orderby-undefined-4123
SigNoz:bugfix/update-dashboard-time-on-made-public
SigNoz:feat/v2-user-apis
SigNoz:nv/6204
SigNoz:fix/query-builder-skip-when-nil
SigNoz:fix/issue-10674-query-expression-variables
SigNoz:refactor/cloud-integration-impl-store
SigNoz:feat/cloudintegration-module
SigNoz:fix/filter_suggestions
SigNoz:update-members-api
SigNoz:feat/trace-details-ux-1
SigNoz:poc-mock-telemetry-store
SigNoz:feat/trace-flamegraph-2
SigNoz:feat/fix-user-domain-models
SigNoz:feat/fix-user-types-structure
SigNoz:keep-message-contained-fix
SigNoz:feat/user-x-role
SigNoz:feat/trace-waterfall
SigNoz:chore/test-slack-notification-merge-queue-failure-2
SigNoz:fix/issue-4208/panel-type-change-plus-pie
SigNoz:debug_timepicker
SigNoz:json-qb-integration
SigNoz:chore/issue-3955-move-dashboard-provider
SigNoz:cursor/cloud-integration-nil-checks-b8be
SigNoz:platform-pod/issues/1830-claims
SigNoz:platform-pod/issues/1696-integrate
SigNoz:platform-pod/issues/1830
SigNoz:cursor/query-builder-condition-logic-6e00
SigNoz:cursor/span-label-text-colors-3035
SigNoz:feat/trace-flamegraph
SigNoz:feat/trace-details-v3
SigNoz:SIG_3554
SigNoz:cursor/query-builder-logic-and-tests-13c4
SigNoz:cursor/inconsistent-map-indentation-1a51
SigNoz:feat/infra_disk_usage
SigNoz:another-field
SigNoz:ns/poc-waterfall
SigNoz:cursor/timeline-and-flamegraph-issues-f686
SigNoz:SIG_8931_revert
SigNoz:issue/10108
SigNoz:like-op
SigNoz:SIG_3522
SigNoz:SIG_8931_fix
SigNoz:lp-filter-v5
SigNoz:feat/infraM_revamp_backend_p2
SigNoz:feat/authz-on-dashboards
SigNoz:feat/infraM_list_apis_request_time_check
SigNoz:testing-feature
SigNoz:ns/claude-setup
SigNoz:feat/infraM_revamp_backend_p1base
SigNoz:platform-pod/issues/1696-1
SigNoz:feat/disable_side_drawer_missing_identifiers
SigNoz:feat/improve_infra_monitoring_list_apis
SigNoz:feat/cloud-integrations-apis
SigNoz:nv/7069
SigNoz:chore/claude-service-setup
SigNoz:nitya/cloud-ref
SigNoz:feat/poc-flamegraph
SigNoz:ns/waterfall-zoom-on-wf
SigNoz:pipelinesv2
SigNoz:ns/waterfall-zoom
SigNoz:ns/unfurl-fe
SigNoz:fix/remove_decoding_url
SigNoz:claude/laughing-driscoll-large-trace
SigNoz:nv/10282
SigNoz:chore/build-optimizationss
SigNoz:fts-body
SigNoz:chore/cmd-click
SigNoz:platform-pod/issues/1725
SigNoz:feat/azure-integration-ref
SigNoz:platform-pod/issues/528
SigNoz:fix/root-user-integration-tests
SigNoz:feat/cross-panel-sync
SigNoz:test-generics
SigNoz:dependabot/npm_and_yarn/frontend/lodash-es-4.17.23
SigNoz:feat/root-user
SigNoz:feat/sso-attributes-mapping-frontend
SigNoz:tavts-enable-seraching-events
SigNoz:show-ip-88664
SigNoz:tvats-hot-fix-2
SigNoz:temp/local_clickhouse_setup
SigNoz:chore/issue-3778-variable-store-isolation
SigNoz:chore/add-shortcuts-container
SigNoz:merge-json-columns
SigNoz:feat/cmd-click
SigNoz:platform-pod/issues/1278
SigNoz:ns/ext-api-query
SigNoz:ns/devenv
SigNoz:temp/collector_version_upgrade_signoz_repo_changes
SigNoz:tvats-improve-alias-handling
SigNoz:fix/trace-details-span-popover
SigNoz:feat/services_use_span_metrics
SigNoz:feat/self-reset-password-frontend
SigNoz:dependabot/npm_and_yarn/frontend/node-forge-1.3.3
SigNoz:chore/postable_rule_more_validation
SigNoz:feat/rule_condition_validation
SigNoz:feat/gateway-apis-integration-2
SigNoz:SIG-3733
SigNoz:feat/gateway-apis-integration
SigNoz:chore/ignore-context-canceled-logs
SigNoz:chore/push-launch.json
SigNoz:refactor/composite_query_validation
SigNoz:fix/validate_alert_payload_before_saving
SigNoz:chore/issue-9924-2
SigNoz:chore/remove_eval_delay_from_safe_rules
SigNoz:feat/warnings_for_empty_data
SigNoz:fix/metadata_map_metric_check
SigNoz:SIG-3098
SigNoz:cache-tests-on-cumulative-counter
SigNoz:refactor/update-cloud-integration-version
SigNoz:fix/duplicate-column-options
SigNoz:fix/trace-funnels-escape-user-controlled-values
SigNoz:chore/sentry-event-qb
SigNoz:feat/log-detail-add-remove-columns
SigNoz:fix/no_common_type_error_metrics_filter
SigNoz:issue/8880
SigNoz:SIG-9860
SigNoz:fix/show-loading-while-trace-only-logs-request-is-in-progress
SigNoz:chore/remove_rule_source_and_id_from_channel_title
SigNoz:pr-9785
SigNoz:perf/log-view
SigNoz:SIG-9743
SigNoz:refactor/query-builder-delete-logic
SigNoz:platform-pod/issues/1401
SigNoz:perf/panel-rerender
SigNoz:dependabot/npm_and_yarn/frontend/express-4.22.1
SigNoz:dependabot/npm_and_yarn/frontend/js-yaml-3.14.2
SigNoz:feat/handle-duplicate-attributes
SigNoz:dependabot/npm_and_yarn/frontend/min-document-2.19.2
SigNoz:cursor/copy-local-storage-to-url-queries-gpt-5.1-codex-2624
SigNoz:platform-pod/issues/1386
SigNoz:SIG-9263
SigNoz:tvats-improve-error-msg
SigNoz:feat/export_and_pagination_for_query_table
SigNoz:enh/conver-query-rewrite
SigNoz:enh/dashboard-creation-flow
SigNoz:feat/queryfilterextractor_complex
SigNoz:tvats-handle-duplicate-columns
SigNoz:platform-pod/issues/1136/1
SigNoz:fix/pass_time_in_scope_builder_using_structs
SigNoz:SIG-5270
SigNoz:fix/metric_metadata_le_bucket
SigNoz:chore/filter-rules
SigNoz:snyk-fix-1089b0dc310672567c7b8654e5f0f797
SigNoz:fix/span-logs-trace-only-incorrect-empty-state
SigNoz:fix/external-apis-bugfixes-and-improvments
SigNoz:enhancement/cmd-click-stack
SigNoz:snyk-fix-36c4a2e58f5f8c5430abd8f06f9586fd
SigNoz:feat/deployment-markers
SigNoz:feat/add-actionables-to-span-fields
SigNoz:chore/vite-migration
SigNoz:feat/cmd-click-impl-updated-history
SigNoz:fix/traces-overall-improvements
SigNoz:release-0.97.1
SigNoz:feat/enable_exp_hist
SigNoz:tvats-custom-ttl-for-attributes
SigNoz:routing-policies-e2e
SigNoz:snyk-fix-0e66a6592422ccd0d016dfcad7c720df
SigNoz:snyk-fix-e189cf2c41ee3f2f0637cf05e9fabca1
SigNoz:playwright-setup
SigNoz:issue_3019
SigNoz:snyk-fix-9542d99ece647d414f60b012a4da2366
SigNoz:fix/fix-the-attributes-actionables-styles
SigNoz:chore/y-axis-dashboards-alerts
SigNoz:temp/check_@_symbol_as_parametervalue_start
SigNoz:issue-5676
SigNoz:chore/normal-index
SigNoz:thirdpartylistapifix
SigNoz:temp/study_queries
SigNoz:indirectDescOperatorImprovement
SigNoz:enhancement/cmd-click-across-routes
SigNoz:feat/span-list-tab-in-trace-details-v2
SigNoz:revert-9026-SIG-8115
SigNoz:dependabot/npm_and_yarn/frontend/axios-1.12.0
SigNoz:fix/traces-list-trace-view-next-prev-time-issue
SigNoz:SIG-2881
SigNoz:evaluation-window-popover
SigNoz:upgrade/clickhouse-go
SigNoz:snyk-fix-dfda954b712a03d550caa0f896c4b84d
SigNoz:SIG-2879
SigNoz:feat/cron-alert
SigNoz:feat/interactive-dashbaord-v2
SigNoz:feat/interactive-dashbaord-v3
SigNoz:feat/cross-filtering-2
SigNoz:demo/trace-operators
SigNoz:feat/cross-filtering-test
SigNoz:feat/cross-filtering
SigNoz:feat/static-sidebar-to-side-drawer-in-trace-details-v2
SigNoz:fix/clickhouse_version_upgrade_local
SigNoz:feat/session-recording
SigNoz:improveTraceQuery
SigNoz:fix/alerts-qbv5
SigNoz:feat/custom-destinations
SigNoz:fix/non_zero_step_promql
SigNoz:demo-trace-operators
SigNoz:demo/trace_operators_backend
SigNoz:dyn-var-url-revert
SigNoz:SIG-5603-2
SigNoz:SIG-2023-var-1
SigNoz:var-url-format
SigNoz:variables-features
SigNoz:SIG-8704
SigNoz:imp/remove_nplus1_query_testing
SigNoz:imp/remove_nplus1_query
SigNoz:fix/extract-query-params
SigNoz:snyk-fix-05ae02136e944e496d83eedf877f6b45
SigNoz:chore/custom_dispatcher
SigNoz:fix/otel-collector-clickhouse-common-dev-network
SigNoz:feat/alert-multi-threshold
SigNoz:chore/requests-upgrade
SigNoz:feat/metering-ui
SigNoz:feat/drilldowns
SigNoz:feat/timestamp_aware_spans
SigNoz:feature/show-event-count-in-span-drawer
SigNoz:feat/drilldown-tables-v2
SigNoz:feat/ingestion-settings-e2e-tests
SigNoz:migration/react-router-dom
SigNoz:remove-stylus
SigNoz:dummy-test
SigNoz:chore/trace-funnels-tests
SigNoz:snyk-fix-d3e4693dcb50c2c0479fad12609c783a
SigNoz:snyk-fix-8f56167ea8ad689ec8351a1e4355b2ef
SigNoz:feat/drilldown-tables-v2-main
SigNoz:fix/quick-filters-query
SigNoz:snyk-fix-e37da51f00be42813460b6ea72743eca
SigNoz:snyk-fix-41273533b92c56f458ab759648a77cd0
SigNoz:fix/parenthesis-context
SigNoz:fix/query-context-with-spaces
SigNoz:fix/tracing-funnel-creation
SigNoz:feature/table-consumption-phase-1
SigNoz:chore/prometheus-v0.304.1
SigNoz:snyk-fix-030382efc240f2c1690bd90340fd81e9
SigNoz:SIG-5761
SigNoz:chore/tf/testing
SigNoz:fix/pagination-tests-fix
SigNoz:SIG-6421
SigNoz:feat/fixes-sprint5
SigNoz:fix/pat-role
SigNoz:variable-url-format
SigNoz:SIG-5603-1
SigNoz:SIG-2023-1
SigNoz:feat/qf-5
SigNoz:chore/timestamptz-non-null
SigNoz:feat/7294-services
SigNoz:tfbtest
SigNoz:tfbackend
SigNoz:fix/infra-monitoring/custom-time-range
SigNoz:feat/qf-2
SigNoz:fix-id-dashboards
SigNoz:react-router-update
SigNoz:remove-dead-code
SigNoz:feat/7274
SigNoz:feat/resource-filter-attr-v2
SigNoz:issue_7376
SigNoz:licensing
SigNoz:fix/prevent-the-layout-shift-in-query-builder
SigNoz:add-sapn-filter
SigNoz:kubecon-demo-2
SigNoz:kubecon-demo
SigNoz:feat/ha
SigNoz:signoz-tailwind-setup
SigNoz:snyk-fix-2c0716192269975cfac4296b058ca613
SigNoz:multiselect-component
SigNoz:feat/multi-tenancy
SigNoz:fix/opamp
SigNoz:onboarding-march-03
SigNoz:chore/ignore-license-error
SigNoz:release/0.76.0
SigNoz:fix-7233
SigNoz:alertmanager
SigNoz:snyk-fix-98a2b4eb555f6f78e7c1018ce58678b9
SigNoz:fix/handle-all-null-autocomplete-aggregateValues
SigNoz:SIG-6986
SigNoz:fix/install-no-sudo
SigNoz:6175
SigNoz:fix/range-picker-default-time
SigNoz:issue_406
SigNoz:chore/sentry-fixes
SigNoz:injection
SigNoz:config
SigNoz:pkg/config
SigNoz:feat/1196
SigNoz:snyk-fix-de6ff2437fe907956a0ab593cf6cb252
SigNoz:snyk-fix-563bd9c08e7da2ef4cdde74dd1ecc769
SigNoz:develop
SigNoz:release/v0.63.x
SigNoz:deprecate-v2-license
SigNoz:release/v0.62.x
SigNoz:snyk-fix-d189e25666bafbf4dbf075eb90f9ac07
SigNoz:release-sync/v0.61.x
SigNoz:release/v0.61.x
SigNoz:release/v0.60.x
SigNoz:release/v0.59.x
SigNoz:176/coalesce
SigNoz:release/v0.58.x
SigNoz:host-lists-improvement
SigNoz:anomaly-detection-target-default
SigNoz:sync/post-release-v0.57
SigNoz:issue_6307
SigNoz:snyk-fix-f9bd9b07e11673e8e8dbe74704f613fa
SigNoz:release/signoz-0.57.0
SigNoz:snyk-fix-475cb16aa1169412e86a28f40bb94889
SigNoz:release/v0.56.x
SigNoz:release/v0.55.x
SigNoz:release/v0.55.1
SigNoz:release/v0.54.x
SigNoz:release/v0.53.x
SigNoz:release/v0.52.x
SigNoz:release/v0.51.x
SigNoz:snyk-fix-1b34d8ba4ba6f717cec2c190535c57ce
SigNoz:snyk-fix-3c40ef7370e61bd5c87af93fc6b59d17
SigNoz:snyk-fix-e433c0c1dea4bb6bdec912a874dccac4
SigNoz:snyk-fix-811751f2b4e168eb58e10057181ba572
SigNoz:release/v0.50.x
SigNoz:release/v0.49.x
SigNoz:release/v0.48.x
SigNoz:release/v0.47.x
SigNoz:release/v0.46.x
SigNoz:release/v0.44
SigNoz:release/v0.43.x
SigNoz:release/v0.42.0
SigNoz:release/v0.41.1
SigNoz:release/v0.41.0
SigNoz:release/v0.40.0
SigNoz:release/v0.39.1
SigNoz:release/v0.39.0
SigNoz:release/v0.38.2
SigNoz:release/v0.38.0
SigNoz:fix/precheck-login
SigNoz:v0.138.0
SigNoz:v0.137.1
SigNoz:v0.137.0
SigNoz:v0.136.1
SigNoz:v0.136.0
SigNoz:v0.135.1
SigNoz:v0.135.0
SigNoz:v0.135.0-cloud.5
SigNoz:v0.135.0-cloud.4
SigNoz:v0.135.0-cloud.3
SigNoz:v0.135.0-cloud.2
SigNoz:v0.135.0-cloud.1
SigNoz:v0.134.0
SigNoz:v0.134.0-cloud.2
SigNoz:v0.134.0-cloud.1
SigNoz:v0.133.0
SigNoz:v0.132.2
SigNoz:v0.132.1
SigNoz:v0.132.0
SigNoz:v0.131.1
SigNoz:v0.132.0-rc.2
SigNoz:v0.132.0-rc.1
SigNoz:v0.131.0
SigNoz:v0.130.1
SigNoz:v0.130.0
SigNoz:v0.129.0
SigNoz:v0.128.0
SigNoz:v0.127.1
SigNoz:v0.127.0
SigNoz:v0.126.3-rc.1
SigNoz:v0.126.1
SigNoz:v0.126.0
SigNoz:v0.125.1
SigNoz:v0.125.0
SigNoz:v0.124.0
SigNoz:v0.123.0
SigNoz:v0.122.0
SigNoz:v0.121.1
SigNoz:v0.121.0
SigNoz:v0.120.0
SigNoz:v0.119.0
SigNoz:v0.118.0
SigNoz:v0.117.1
SigNoz:v0.117.0
SigNoz:v0.116.1
SigNoz:v0.116.0
SigNoz:v0.115.0
SigNoz:v0.114.1
SigNoz:v0.114.0
SigNoz:v0.113.0
SigNoz:v0.112.1
SigNoz:v0.113.0-rc.1
SigNoz:v0.112.0
SigNoz:v0.111.0
SigNoz:v0.110.2
SigNoz:v0.110.1
SigNoz:v0.110.0
SigNoz:v0.109.3
SigNoz:v0.109.2
SigNoz:v0.109.1
SigNoz:v0.109.0
SigNoz:v0.108.0
SigNoz:v0.108.0-rc.1
SigNoz:v0.107.0
SigNoz:v0.106.0
SigNoz:v0.105.1
SigNoz:v0.105.0
SigNoz:v0.104.0
SigNoz:v0.104.0-cloud.1
SigNoz:v0.103.1
SigNoz:v0.103.0
SigNoz:v0.102.1
SigNoz:v0.102.0
SigNoz:v0.101.0
SigNoz:v0.101.0-rc.1
SigNoz:v0.100.1
SigNoz:v0.100.0
SigNoz:v0.99.0
SigNoz:v0.98.0
SigNoz:v0.98.0-rc.1
SigNoz:v0.98.0-rc.0
SigNoz:v0.97.1
SigNoz:v0.97.0-515a1bda0
SigNoz:v0.97.0
SigNoz:v0.97.0-rc.3
SigNoz:v0.97.0-rc.2
SigNoz:v0.97.0-rc.1
SigNoz:v0.96.1
SigNoz:v0.96.0
SigNoz:v0.95.1-cloud.1
SigNoz:v0.95.1
SigNoz:v0.95.0
SigNoz:v0.94.1-cloud.1
SigNoz:v0.94.1
SigNoz:v0.94.0
SigNoz:v0.93.0-cloud.3
SigNoz:v0.93.0-cloud.2
SigNoz:v0.93.0-cloud.1
SigNoz:v0.93.0
SigNoz:v0.93.0-rc.3
SigNoz:v0.93.0-rc.2
SigNoz:v0.93.0-rc.1
SigNoz:v0.92.2
SigNoz:v0.92.1
SigNoz:v0.92.0
SigNoz:v0.91.1
SigNoz:v0.92.0-rc.5
SigNoz:v0.92.0-rc.4
SigNoz:v0.92.0-rc.3
SigNoz:v0.92.0-rc.2-gk1
SigNoz:v0.92.0-rc.2
SigNoz:v0.92.0-rc.1
SigNoz:v0.91.0-252658c
SigNoz:v0.91.0-dc4d515
SigNoz:v0.91.0-a8b6295
SigNoz:v0.92.0-cloud.1
SigNoz:v0.91.0-f1ab138
SigNoz:v0.91.0-f2c3a67
SigNoz:v0.91.0
SigNoz:v0.90.1-e0d6411
SigNoz:v0.90.1-e97c7d6
SigNoz:v0.90.1-3ef1e88
SigNoz:v0.90.1
SigNoz:v0.90.0
SigNoz:v0.89.0-9a406b8
SigNoz:v0.89.0
SigNoz:v0.88.1
SigNoz:v0.88.0
SigNoz:v0.88.0-rc.1
SigNoz:v0.89.0-cloud.1
SigNoz:v0.87.0-bb17b9d6c
SigNoz:v0.87.0-4ecc066
SigNoz:v0.87.0-54607d8
SigNoz:v0.87.0-41c3ceb10
SigNoz:v0.87.0-cffeff0
SigNoz:v0.87.0-af2534bbf
SigNoz:v0.88.0-cloud.3
SigNoz:v0.88.0-cloud.2
SigNoz:v0.87.0-e7f2408
SigNoz:v0.87.0-8d03e35d8
SigNoz:v0.88.0-cloud.1
SigNoz:v0.87.0-f267ed8ad
SigNoz:v0.87.0-b5a8309
SigNoz:v0.87.0-patch
SigNoz:v0.87.0-bda231637
SigNoz:v0.87.0
SigNoz:v0.87.0-rc.1
SigNoz:v0.86.2-6404e73
SigNoz:v0.86.2
SigNoz:v0.86.1
SigNoz:v0.86.0
SigNoz:v0.85.3
SigNoz:v0.85.2
SigNoz:v0.85.1
SigNoz:v0.85.0
SigNoz:v0.84.1
SigNoz:v0.84.0
SigNoz:v0.83.0
SigNoz:v0.83.0-cloud.1
SigNoz:v0.82.1
SigNoz:v0.82.0
SigNoz:v0.81.0-b9cd7ded
SigNoz:v0.81.0-cbedaa6e
SigNoz:v0.82.0-cloud.1
SigNoz:v0.81.0
SigNoz:v0.80.0-749532a0
SigNoz:v0.80.0-7b530d88
SigNoz:v0.80.0-4814a92
SigNoz:v0.80.0-523db11d
SigNoz:v0.80.0-53b98b0b
SigNoz:v0.80.0
SigNoz:v0.79.1
SigNoz:v0.80.0-cloud.1
SigNoz:v0.79.0
SigNoz:v0.78.2-json-parser-fix
SigNoz:v0.77.2-integrations-1
SigNoz:v0.77.2-integrations
SigNoz:v0.78.1
SigNoz:v0.79.0-431d46d0a
SigNoz:v0.79.0-963e35b55
SigNoz:v0.79.0-18b89242c
SigNoz:v0.79.0-32ece079f
SigNoz:v0.79.0-c396d2496
SigNoz:v0.78.0
SigNoz:v0.78.0-86f4f0d1d
SigNoz:v0.78.0-9759fceab
SigNoz:v0.78.0-c3d455b93
SigNoz:v0.78.0-3142b6cc6
SigNoz:v0.78.0-rc.9
SigNoz:v0.78.0-rc.8
SigNoz:v0.78.0-rc.7
SigNoz:v0.78.0-rc.6
SigNoz:v0.78.0-cloud.1
SigNoz:v0.78.0-4610afa99
SigNoz:v0.78.0-rc.5
SigNoz:v0.78.0-rc.4
SigNoz:v0.78.0-fe0f164e1
SigNoz:v0.78.0-rc.3
SigNoz:v0.76.2-e46c8bb1
SigNoz:v0.76.2-314d2560
SigNoz:v0.78.0-rc.2
SigNoz:v0.76.2-8049fa11
SigNoz:v0.78.0-rc.1
SigNoz:v0.77.0-5183d61c9
SigNoz:v0.77.0
SigNoz:v0.76.2-5cf417f4
SigNoz:v0.76.2-3c9e40a8
SigNoz:v0.77.0-6147f6e68
SigNoz:v0.76.2-b2b89885
SigNoz:v0.76.2-be44d660
SigNoz:v0.76.2-bf7a3181
SigNoz:v0.77.0-cloud.2
SigNoz:v0.76.2-ac7ecac2
SigNoz:v0.77.0-0fc12ddae
SigNoz:v0.77.0-740a290dc
SigNoz:v0.77.0-ecbe0b82d
SigNoz:v0.77.0-51ecd97b7
SigNoz:v0.76.2-24adfec5
SigNoz:v0.76.3-msk-integration-5
SigNoz:v0.76.3-msk-integration-4
SigNoz:v0.77.0-6a246332a
SigNoz:v0.77.0-cd0b9abd8
SigNoz:v0.77.0-e63d1b83b
SigNoz:v0.77.0-b2a7e7191
SigNoz:v0.77.0-7d89156af
SigNoz:v0.77.0-c86203e6b
SigNoz:v0.76.3-msk-integration-3
SigNoz:v0.77.0-820316d87
SigNoz:v0.76.3-msk-integration-2
SigNoz:v0.76.2
SigNoz:v0.76.3-msk-integration
SigNoz:v0.76.1
SigNoz:v0.76.0-f9b74b86
SigNoz:v0.76.0-cb04900a
SigNoz:tpapi-demo-internal-testing
SigNoz:v0.76.0-a13d1c89
SigNoz:0.76.0-a13d1c89
SigNoz:v0.77.0-5896e7c2d
SigNoz:v0.77.0-cloud.1
SigNoz:v0.76.0
SigNoz:v0.76.0-rc.5
SigNoz:v0.76.0-rc.3
SigNoz:v0.76.0-rc.1
SigNoz:v0.76.0-0e721dee1
SigNoz:feat/inproduct-homepage-v1
SigNoz:v0.76.0-8ca1f99d8
SigNoz:v0.76.0-cloud.4
SigNoz:v0.76.0-cloud.3
SigNoz:v0.76.0-cloud.2
SigNoz:v0.75.0-e1be10cd4
SigNoz:v0.75.0-47c4483f5
SigNoz:v0.75.0-2a4891fb8
SigNoz:v0.75.0-25657732b
SigNoz:v0.75.0-74edc942d
SigNoz:v0.75.0-6965f42f1
SigNoz:v0.75.0-35fe60dbb
SigNoz:v0.75.0-23b60b672
SigNoz:v0.76.0-cloud.1
SigNoz:v0.75.0-7d07d7a0b
SigNoz:v0.75.0-7082ea572
SigNoz:v0.75.0-730832cd4
SigNoz:v0.75.0-ed165f060
SigNoz:v0.75.0-42246eb89
SigNoz:v0.75.0-6ca7fa82b
SigNoz:v0.75.0-99ced1177
SigNoz:v0.75.0-9766ed21c
SigNoz:v0.75.0-763b4fffe
SigNoz:v0.75.0-c6e543416
SigNoz:v0.76.0-cache
SigNoz:v0.75.0-a64309701
SigNoz:v0.75.0-aws-integration-12eb23d4
SigNoz:v0.75.0-98eee6f7f
SigNoz:v0.75.0-bd3e0eeb6
SigNoz:v0.75.0-9d6e09d3f
SigNoz:v0.75.0-cccc25e2e
SigNoz:v0.75.0-9580da047
SigNoz:v0.75.0-8534b798c
SigNoz:v0.75.0-3bedd10ef
SigNoz:v0.75.0-b6f2ff052
SigNoz:v0.75.0-d02dc8687
SigNoz:v0.75.0-04835d14e
SigNoz:v0.75.0-aws-integration-107ba4a0
SigNoz:v0.75.0-aws-integration-c2cf1152
SigNoz:v0.75.0
SigNoz:v0.75.0-cloud.1
SigNoz:v0.75.0-pagination-be
SigNoz:v0.74.0
SigNoz:v0.74.0-aws-integration-4cc717d05
SigNoz:v0.74.0-cloud.1
SigNoz:v0.75.0-pagination
SigNoz:v0.74.0-2b4340a3e
SigNoz:v0.74.0-309ac976c
SigNoz:v0.73.0-407654e6
SigNoz:v0.73.0
SigNoz:v0.73.0-cloud.3
SigNoz:v0.73.0-cloud.2
SigNoz:v0.73.0-cloud.1
SigNoz:v0.72.0-aws-integration-a893b39
SigNoz:v0.72.0
SigNoz:v0.72.0-cloud.4
SigNoz:v0.72.0-onboarding-v3
SigNoz:v0.72.0-cloud.3
SigNoz:v0.72.0-cloud.2
SigNoz:v0.72.0-aws-integration-addafb9c3
SigNoz:v0.72.0-aws-integration-06b18e806
SigNoz:v0.72.0-cloud.1
SigNoz:v0.72.0-aws-integration-831514b83
SigNoz:v0.72.0-aws-integration-c3164912e
SigNoz:v0.72.0-onboarding-part-3-20fecc707
SigNoz:v0.71.0
SigNoz:v0.71.0-cloud.2
SigNoz:v0.71.0-42fe92cc8
SigNoz:v0.70.1
SigNoz:v0.71.0-cloud.1
SigNoz:v0.70.0
SigNoz:v0.71.0-pagination
SigNoz:v0.70.0-trace-detail-84268e049
SigNoz:v0.70.0-trace-detail-c1981969f
SigNoz:histogram-quantile/v0.0.1
SigNoz:v0.69.0-d3a8cf9ad
SigNoz:v0.70.0-trace-detail-5e26c6617
SigNoz:v0.70.0-trace-detail-7b5d663d6
SigNoz:v0.70.0-trace-detail-cc49c3958
SigNoz:v0.69.0
SigNoz:v0.69.0-cloud.2
SigNoz:v0.69.0-cloud.1
SigNoz:v0.68.0
SigNoz:v0.67.1
SigNoz:v0.67.0-6586-vars
SigNoz:v0.67.0-eb16d4bd6
SigNoz:v0.67.0
SigNoz:v0.67.0-custom-domain-15f85a645
SigNoz:v0.66.0-ea9bcc590
SigNoz:v0.66.0
SigNoz:v0.65.1
SigNoz:v0.66.0-trace-details-5370b8012
SigNoz:v0.66.0-trace-details-a45104493
SigNoz:v0.65.0
SigNoz:v0.65.0-cloud.7
SigNoz:v0.65.0-qf-005822ec4
SigNoz:v0.65.0-qf-0fca38a70
SigNoz:v0.65.0-qf-ea6694b44
SigNoz:v0.65.0-cloud.6
SigNoz:v0.65.0-cloud.5
SigNoz:v0.65.0-cloud.4
SigNoz:v0.65.0-cloud.3
SigNoz:v0.64.0-cbc83a0
SigNoz:v0.65.0-cloud.2
SigNoz:v0.64.0-7405bfbb
SigNoz:v0.65.0-cloud.1
SigNoz:v0.63.0-develop2
SigNoz:v0.64.0
SigNoz:v0.63.0-develop
SigNoz:v0.63.0
SigNoz:v0.63.0-frontend-arch-1c16916a1
SigNoz:v0.63.0-cloud.1
SigNoz:v0.63.0-frontend-arch-08c4bd0ff
SigNoz:v0.62.0
SigNoz:v0.62.0-cloud.3
SigNoz:v0.62.0-frontend-arch-6eeab69cc
SigNoz:v0.62.0-cloud.2
SigNoz:v0.61.0-214005e99
SigNoz:v0.62.0-cloud.1
SigNoz:v0.61.0
SigNoz:v0.61.0-debug-39566bfbe
SigNoz:v0.61.0-debug-1a7ea098a
SigNoz:v0.60.0-1934f74
SigNoz:v0.61.0-cloud.4
SigNoz:v0.61.0-cloud.3
SigNoz:v0.61.0-cloud.2
SigNoz:v0.61.0-cloud.1
SigNoz:v0.60.0
SigNoz:v0.60.0-cloud.5
SigNoz:v0.60.0-cloud.4
SigNoz:v0.60.0-cloud.3
SigNoz:v0.60.0-cloud.2
SigNoz:v0.60.0-cloud.1
SigNoz:v0.59.0-trace
SigNoz:v0.59.0
SigNoz:v0.59.2-licenses-57c232690
SigNoz:v0.59.1-licenses-a73a5931f
SigNoz:v0.58.2
SigNoz:v0.57.0-trace
SigNoz:v0.56.0-43e1fe686-trace
SigNoz:v0.58.1
SigNoz:v0.59.1-onboarding-part-3
SigNoz:v0.59.0-cloud.1
SigNoz:v0.58.0-licenses-e6cacced7
SigNoz:v0.58.0-git.946f30b08
SigNoz:v0.60.3-onboarding-part-3
SigNoz:v0.58.0
SigNoz:v0.56.0-trace-1
SigNoz:v0.58.0-licenses-bde7b85d1
SigNoz:v0.60.1-onboarding-part-3
SigNoz:v0.60.2-onboarding-part-3
SigNoz:v0.58.0-licenses-8b3d1f617
SigNoz:v0.58.0-cloud.2
SigNoz:v0.58.0-kafka-v2
SigNoz:v0.60.0-onboarding-part-3
SigNoz:v0.58.0-cloud.1
SigNoz:v0.57.0-cloud.5-d44d8c4ac
SigNoz:v0.59.0-onboarding-v2
SigNoz:v0.57.0-cloud.5-ff25ebf32
SigNoz:v0.58.2-onboarding-develop
SigNoz:v0.57.0-cloud.5-7759e67ee
SigNoz:v0.58.2-onboarding-23a57b0
SigNoz:v0.58.1-onboarding-10acef
SigNoz:v0.57.0
SigNoz:v0.58.0-onboarding-068f2097c
SigNoz:v0.57.0-cloud.5
SigNoz:v0.57.0-cloud.4
SigNoz:v0.57.0-cloud.3
SigNoz:v0.56.0-trace-2
SigNoz:v0.56.0-trace
SigNoz:v0.57.0-cloud.1.5b3839dca
SigNoz:v0.57.0-cloud.2
SigNoz:v0.57.0-cloud.1
SigNoz:v0.56.0
SigNoz:v0.56.0-cloud.3
SigNoz:v0.56.0-cloud.2
SigNoz:v0.56.0-cloud.1
SigNoz:v0.55.0
SigNoz:v0.55.0-cloud.10
SigNoz:v0.55.0-cloud.9
SigNoz:v0.55.0-cloud.8
SigNoz:v0.52.0-cloud.1.5d6ff4781
SigNoz:v0.55.0-cloud.7
SigNoz:v0.55.0-cloud.6
SigNoz:v0.55.0-cloud.5
SigNoz:v0.55.0-cloud.4
SigNoz:v0.55.0-cloud.3
SigNoz:v0.55.0-cloud.2
SigNoz:v0.55.0-cloud.1
SigNoz:v0.54.0
SigNoz:v0.54.0-cloud.5
SigNoz:v0.54.0-cloud.4
SigNoz:v0.54.0-cloud.3
SigNoz:v0.54.0-cloud.2
SigNoz:v0.54.0-cloud.1
SigNoz:v0.53.0
SigNoz:v0.53.0-cloud.4
SigNoz:v0.53.0-c2c8c716c
SigNoz:v0.53.0-alpha.2
SigNoz:v0.53.0-alpha.1
SigNoz:v0.53.0-cloud.3
SigNoz:v0.53.0-cloud.2
SigNoz:v0.50.0-logs-schema-t2-fe
SigNoz:v0.50.0-logs-schema-t2
SigNoz:v0.53.0-cloud.1
SigNoz:v0.53.0-cloud.0
SigNoz:v0.52.0-cloud.1.521b7c6
SigNoz:v0.52.0-cloud.8
SigNoz:v0.52.0-cloud.7
SigNoz:v0.52.0-cloud.6
SigNoz:v0.52.0
SigNoz:v0.52.0-cloud.5
SigNoz:v0.51.0-agg-tables
SigNoz:v0.52.0-cloud.4
SigNoz:v0.52.0-cloud.3
SigNoz:v0.50.0-logs-schema-t1-fe
SigNoz:v0.50.0-logs-schema-t1
SigNoz:v0.50.0-logs-schema
SigNoz:v0.52.0-cloud.2-5a9267d69
SigNoz:v0.52.0-cloud.2
SigNoz:v0.52.0-cloud.1
SigNoz:v0.51.0
SigNoz:v0.51.0-cloud.3
SigNoz:v0.51.0-cloud.2
SigNoz:v0.51.0-cloud.1
SigNoz:v0.50.0
SigNoz:v0.50.0-cloud.2
SigNoz:v0.50.0-cloud.1
SigNoz:v0.49.1
SigNoz:v0.49.0
SigNoz:v0.49.0-cloud.4
SigNoz:v0.49.0-cloud.3
SigNoz:v0.48.1
SigNoz:v0.49.0-cloud.2
SigNoz:v0.49.0-cloud.1
SigNoz:v0.48.0
SigNoz:v0.48.0-cloud.3
SigNoz:v0.48.0-cloud.2
SigNoz:v0.48.0-cloud.1
SigNoz:v0.48.0-beta.2
SigNoz:v0.48.0-beta.1
SigNoz:v0.47.0
SigNoz:v0.47.0-beta.5
SigNoz:v0.47.0-beta.4
SigNoz:v0.47.0-beta.3
SigNoz:v0.46.0-389f22cf6
SigNoz:v0.47.0-beta.2
SigNoz:v0.47.0-beta.1
SigNoz:v0.45.0-dashboard-revamp
SigNoz:v0.46.0-353881533
SigNoz:v0.46.0-1d86e5eb5
SigNoz:v0.46.0-1369fe191
SigNoz:v0.46.0-76b1e40cb
SigNoz:v0.46.0-a0c340f21
SigNoz:v0.46.0-0d043bf38
SigNoz:v0.46.0
SigNoz:v0.45.0-04a68ad4-debug
SigNoz:v0.45.0-a891dd4b
SigNoz:v0.45.0-12be6ce0
SigNoz:v0.45.0-9ff0e340
SigNoz:v0.45.0-c42f06b9-alerts-v4
SigNoz:v0.45.0-alert-v4-migrate
SigNoz:v0.45.0-7e31b4ca
SigNoz:v0.46.0-cloud.1
SigNoz:v0.45.0
SigNoz:v0.45.0-beta.3
SigNoz:v0.44.0-disable_enrichment
SigNoz:v0.45.0-beta.2
SigNoz:v0.45.0-beta.1
SigNoz:v0.44.0-7d81bc34
SigNoz:v0.43.0-debug
SigNoz:v0.45.0-alpha.1
SigNoz:v0.44.0
SigNoz:v0.43.0-0760c216
SigNoz:v0.44.0-alpha.2
SigNoz:v0.43.0-gor
SigNoz:v0.43.1
SigNoz:v0.44.0-alpha.1
SigNoz:v0.43.0
SigNoz:v0.42.0-query-limits
SigNoz:v0.42.0-32e71b92
SigNoz:v0.42.0-d6cd15598
SigNoz:v0.42.0-19d4c3414
SigNoz:v0.42.0-31e71b92
SigNoz:v0.42.0-af353b934
SigNoz:v0.42.0-96e750592
SigNoz:v0.42.0-a7b0ef55
SigNoz:v0.42.0-30e71b92
SigNoz:v0.42.0-8c02f8e
SigNoz:v0.42.0-20e71b92
SigNoz:v0.42.3-debug
SigNoz:v0.42.2-debug
SigNoz:v0.42.1-debug
SigNoz:v0.42.0
SigNoz:v0.41.1-31b1d58a
SigNoz:v0.41.1-63f0ae1c7
SigNoz:v0.41.1-5e034ec9
SigNoz:v0.41.1
SigNoz:v0.41.0
SigNoz:v0.40.0-a4217659
SigNoz:v0.40.0-666916fae
SigNoz:v0.40.0-6618b471
SigNoz:v0.40.0-b3b75222
SigNoz:v0.40.0-3fece44ae
SigNoz:v0.40.0
SigNoz:v0.39.1-f9eddc9b1
SigNoz:v0.39.1
SigNoz:v0.38.2-88a8bc3ee
SigNoz:v0.39.0-548c53195
SigNoz:v0.39.0
SigNoz:v0.38.2-02f83e4b4
SigNoz:v0.38.2-ace1021a0
SigNoz:v0.38.2
SigNoz:v0.38.1
SigNoz:v0.38.0
SigNoz:v0.37.2
SigNoz:v0.37.1
SigNoz:v0.37.0
SigNoz:v0.36.2
SigNoz:v0.36.1
SigNoz:v0.36.0-263ac9fa5
SigNoz:v0.36.0
SigNoz:v0.36.0-rc.1
SigNoz:v0.35.1-75268888
SigNoz:v0.35.1-8e653f95
SigNoz:v0.35.1-a16fca63
SigNoz:v0.35.1
SigNoz:v0.35.0
SigNoz:v0.34.4-112783d6
SigNoz:v0.34.4-0b991331
SigNoz:v0.34.4
SigNoz:v0.34.3-d1acad8e
SigNoz:v0.34.3
SigNoz:v0.34.2
SigNoz:v0.34.1-d42bf50d
SigNoz:v0.34.1
SigNoz:v0.34.0-dc23368f
SigNoz:v0.34.0
SigNoz:v0.33.1-6b2f857a
SigNoz:v0.33.1-6-g050b8661
SigNoz:v0.33.1
SigNoz:v0.33.0
SigNoz:v0.32.1-3-gfc49833c
SigNoz:v0.32.1-5-gf427bac9
SigNoz:v0.32.1
SigNoz:v0.32.0
SigNoz:v0.31.1-8-gf7fe64a8
SigNoz:v0.31.1
SigNoz:v0.31.0
SigNoz:v0.30.0
SigNoz:v0.29.1-37-g91bcadf6
SigNoz:v0.29.3
SigNoz:v0.29.2
SigNoz:v0.29.1
SigNoz:v0.29.0
SigNoz:v0.28.0
SigNoz:v0.27.0
SigNoz:v0.26.1-896836b5
SigNoz:v0.26.1
SigNoz:v0.26.0
SigNoz:v0.25.5
SigNoz:v0.25.4
SigNoz:v0.25.3-ae3d4fec
SigNoz:v0.25.3
SigNoz:v0.25.2
SigNoz:v0.25.1
SigNoz:v0.25.0
SigNoz:v0.24.0
SigNoz:v0.23.1
SigNoz:v0.23.0
SigNoz:v0.23.0-rc.1
SigNoz:v0.22.0
SigNoz:v0.21.0-f90bf0263b
SigNoz:v0.21.0-b3da06d2
SigNoz:v0.21.0-cc07d654d
SigNoz:v0.21.0-a4c4d4
SigNoz:v0.21.0
SigNoz:v0.20.2-1f7e096b
SigNoz:v0.20.2
SigNoz:v0.20.1
SigNoz:v0.20.0
SigNoz:v0.19.0
SigNoz:v0.19.0-rc.3
SigNoz:v0.19.0-rc.2
SigNoz:v0.19.0-rc.1
SigNoz:v0.18.3
SigNoz:v0.18.2
SigNoz:v0.18.1
SigNoz:v0.18.0
SigNoz:v0.17.0
SigNoz:v0.16.2
SigNoz:v0.16.1
SigNoz:v0.16.0
SigNoz:v0.15.0
SigNoz:v0.15.0-rc.1
SigNoz:v0.14
SigNoz:v0.14.0
SigNoz:v0.13.0
SigNoz:v0.13.1
SigNoz:v0.13
SigNoz:v0.13.0-rc.2
SigNoz:v0.13.0-rc.1
SigNoz:v0.12.0
SigNoz:v0.12.0-rc.3
SigNoz:v0.11.4-istiotest
SigNoz:v0.12.0-rc.2
SigNoz:v0.12.0-rc.1
SigNoz:v0.11.4
SigNoz:v0.11
SigNoz:v0.11.4-rc.3
SigNoz:v0.11.4-rc.2
SigNoz:v0.11.4-rc.1
SigNoz:v0.11.3
SigNoz:v0.11.3-rc.1
SigNoz:v0.11.2
SigNoz:v0.11.2-rc.3
SigNoz:v0.11.2-rc.2
SigNoz:v0.11.2-rc.1
SigNoz:v0.11.1
SigNoz:v0.11.1-rc.1
SigNoz:v0.11.0
SigNoz:v0.11.0-rc.1
SigNoz:v0.10.2
SigNoz:v0.10
SigNoz:v0.10.1
SigNoz:v0.10.1-rc.1
SigNoz:v0.10.0
SigNoz:v0.10.0-rc2
SigNoz:v0.10.0-rc1
SigNoz:v0.9.2
SigNoz:v0.9.2-rc1
SigNoz:v0.9
SigNoz:v0.9.1
SigNoz:v0.9.0
SigNoz:v0.9.0-rc2
SigNoz:v0.9.0-rc1
SigNoz:v0.8
SigNoz:v0.8.2
SigNoz:v0.8.1
SigNoz:v0.8.1-rc5
SigNoz:v0.8.1-rc4
SigNoz:v0.8.1-rc3
SigNoz:v0.8.1-rc2
SigNoz:v0.8.1-rc1
SigNoz:v0.8.0
SigNoz:v0.8.0-rc6
SigNoz:v0.8.0-rc5
SigNoz:v0.8.0-rc4
SigNoz:v0.8.0-rc3
SigNoz:v0.8.0-rc2
SigNoz:v0.8.0-rc1
SigNoz:v0.7
SigNoz:v0.7.5-rc2
SigNoz:v0.7.5
SigNoz:v0.7.5-rc1
SigNoz:v0.7.4
SigNoz:v0.7.4-rc2
SigNoz:v0.7.4-rc1
SigNoz:v0.7.3
SigNoz:v0.7.2
SigNoz:v0.7.2-rc1
SigNoz:v0.7.1
SigNoz:v0.7.0
SigNoz:v0.6.2
SigNoz:v0.6.1
SigNoz:v0.6
SigNoz:v0.6.0
SigNoz:v0.5.4
SigNoz:v0.5.3
SigNoz:v0.5.2
SigNoz:v0.5.1
SigNoz:v0.5.0
SigNoz:v0.4.5
SigNoz:v0.4.4
SigNoz:v0.4.3
SigNoz:v0.4.2
SigNoz:v0.4.1
SigNoz:v0.4.0
SigNoz:v0.3.6
SigNoz:v0.3.5
SigNoz:0.3.5
SigNoz:v0.3.4
SigNoz:v0.3.3
SigNoz:v0.3.2
SigNoz:v0.3.1
SigNoz:0.2.2
SigNoz:v0.2.2
SigNoz:0.2.0
SigNoz:0.1.0
4788 Commits
v0.21.0
...
feat/trace
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
8bdc8ad742 | test(traces): add MSW data-render tests for grouped and list views | ||
|
|
4f0193c87b |
feat(traces): migrate grouped view to the shared TanStack table
Swaps ResizeTable for the shared TracesTable, so the grouped view gets resizable and reorderable columns persisted per-device via TRACES_VIEW_COLUMNS. Keeps prev/next pagination; the toolbar now always renders so pagination doesn't disappear on an empty result. |
||
|
|
afadfc6a12 | feat(traces): render trace_id as a link and badge dotted status fields in the shared cell | ||
|
|
fe68b8e8b7 |
feat(traces): table migration to tanstack for list view in traces explorer (#12667)
Some checks are pending
build-staging / prepare (push) Waiting to run
build-staging / js-build (push) Blocked by required conditions
build-staging / go-build (push) Blocked by required conditions
build-staging / staging (push) Blocked by required conditions
cacheci / tests (push) Waiting to run
Release Drafter / update_release_draft (push) Waiting to run
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description - moved list view from antd `ResizeTable` to Tanstack table. functionalities kept same. - pulled out a reusable trace table. new shared table + per field column builder. This is added to keep the table renderer common for both ListView and Trace View because they do not need to be different. Trace view will integrate this component in following stacked PR. - two new override vars on `TanStackTableView` (header height, first column header padding) <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Issues closed by this PR Part of https://github.com/SigNoz/engineering-pod/issues/5052 <!--If applicable, include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. --> #### Screenshots / Screen Recordings https://github.com/user-attachments/assets/d3a75b38-7cf5-4ab0-a7b4-fce404a03e63 <!--Anything reviewers should keep in mind while reviewing --> #### Additional Information - Touches the shared `TanStackTableView` component.. two new override vars, defaults unchanged for other tables. cc. @H4ad <!--Please delete paragraphs that you did not use before submitting.--> |
||
|
|
77fbf74092 |
feat(logs): allow adding free-typed columns in logs explorer (#12602)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description - Lets users add a free-typed column in the logs explorer "Edit columns" panel, even if the key is not in the fields suggestions (e.g. nested body json paths). Logs only. - Shows the typed value as an addable option when it is not already a suggestion or added. Exact, case-insensitive name match. - Value shows via the existing body-first lookup. Nothing new is sent to the backend for logs. - Changed the column key separator from `.` to `:` so a typed dotted name cannot clash with a context key (e.g. `resource.severity_text`). Old saved keys self-heal, no migration. <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Issues closed by this PR Closes https://github.com/SigNoz/engineering-pod/issues/5877 <!--If applicable, include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. --> #### Screenshots / Screen Recordings https://github.com/user-attachments/assets/0e91bb00-4be5-4dc7-ad3e-0e005ee6eb6b <!--Anything reviewers should keep in mind while reviewing --> #### Additional Information Value needs `use_json_body` on for nested body paths, else the cell is empty. Array paths and a leading `body.` dont resolve on the frontend for now. <!--Please delete paragraphs that you did not use before submitting.--> |
||
|
|
9997c3da9c |
chore(packages): bump @signozhq/ui to 0.1.0 (#12634)
Some checks failed
build-staging / prepare (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
cacheci / tests (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description This bumps the version from 0.2.3 to 0.1.0 (which also requires the bump in the design-token to latest version), the changes can be found at https://github.com/SigNoz/components/releases/tag/v0.1.0 <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Issues closed by this PR Closes https://github.com/SigNoz/engineering-pod/issues/5926 <!--If applicable, include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. --> #### Screenshots / Screen Recordings The main diffs is the breaking changes in the vars names, other than that, we mainly added new features for the components instead of changing their look/usage, so we can expect no breaking-change in the behavior or UI. About Triggered Alerts (with new rewrite version of combobox simple). https://github.com/user-attachments/assets/18cb117b-9a24-428e-8f6b-7dbf5012f7ea The combobox also now emits `undefined` in case you have `allowClear` enabled, this does not affect existing usages: https://github.com/user-attachments/assets/70ca146f-0145-46d7-bf51-57f93b973ce4 |
||
|
|
485aed0e1a |
feat(charts): support none/normal/percent stacking on TimeSeries and Bar (#12632)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
#### Description - Charts take a `stack` prop (`none` | `normal` | `percent`) and hand it to their config, which derives the fill bands, and for `percent` the percentage y-axis and a 0–100 soft range. Callers stop computing bands or transforming data — V1/V2 bar panels, Meter Explorer and Billing each drop their `setBands` call and declare `stack` instead. - Stacking is no longer bar-specific, so TimeSeries stacks too. The upcoming area chart is built on TimeSeries and needs this. - `percent` rescales each x-slice to its column total. Mixed-sign columns divide by the signed total, so shares can fall outside 0–100 and still sum to it; a column summing to zero yields zero. The percent range is soft rather than hard so those out-of-band shares stay visible. - Tooltips now report the pre-stack value, identically in every mode. They used to recover it by subtracting the series below, which only works while stacking is cumulative — `percent` discards the column total, so the raw value cannot be derived from the plot's data at all. - `stack` lives on the two chart prop types rather than the shared config builder props, so the ~10 other consumers of that builder (histogram, alert previews, infra metrics, …) never expose an option they cannot honour. No spec or API change: both bar panels still read the existing `stackedBarChart` boolean and map it to `normal`/`none`. `percent` is reachable from the chart layer but nothing selects it yet — that arrives with the panel spec change. #### Additional Information - Behaviour outside dashboards should be unchanged, with one exception: Meter Explorer and the V1 bar panel previously passed `seriesCount + 1` when computing bands, emitting a trailing band pointing at a series that does not exist (Billing passed the correct count). Deriving bands centrally normalises all three. - Thresholds still draw under `percent`, but no longer widen the scale — they carry source-unit values, so one at 500ms would stretch a percentage axis to 0–500. - percent also swaps the unit to a percent formatter and sets *soft* 0–1 limits (they normalise to 0–1, we use 0–100). It applies those limits only when the user set none; we always apply them, because our soft limits come from `spec.axes` in the source unit and are meaningless once values are normalised. - Commits are split so each one builds and is reviewable on its own: the stacking algorithm, the config derivation, the tooltip change, then the chart/consumer migration. |
||
|
|
4d69e3f9e5 |
chore: remove last min trim logic in uplotScaleBuilder (#12627)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description - `UPlotScaleBuilder` was overriding the x-axis max with `endTime - 1 minute`, rounded down to the minute — behaviour carried over from the legacy `getXAxisScale`. - On short time windows the trimmed max lands at or before the min, so the scale range is empty/inverted and the chart draws no data. - Removes the trim so the requested `min`/`max` pass through as-is and the scale always matches the selected time range. - Updates the scale builder tests, including a case for a sub-minute window. <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Issues closed by this PR Closes - https://github.com/orgs/SigNoz/projects/39/views/20?pane=issue&itemId=231774376&issue=SigNoz%7Cengineering-pod%7C5902 <!--If applicable, include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. --> #### Screenshots / Screen Recordings Before - https://github.com/user-attachments/assets/11ca2fa4-9a07-42eb-9d8d-3a42daf4cfe1 Now - https://github.com/user-attachments/assets/0114fccd-a6ef-4717-8d1c-aa3faf820da7 #### Additional Information - Only the uPlotV2 path changes --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
dca6aa497d |
chore(serviceaccount): remove deprecated nested role endpoints (#12591)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
#### Description
- Removes the deprecated `POST /api/v1/service_accounts/{id}/roles` and
`DELETE /api/v1/service_accounts/{id}/roles/{rid}` routes, their HTTP
handlers, and the `DeprecatedPostableServiceAccountRole` type, now that
all consumers use `/api/v1/service_account_roles`.
- Keeps the `GET /api/v1/service_accounts/{id}/roles` listing endpoint.
- Regenerates `docs/api/openapi.yml` and the frontend client.
#### Issues closed by this PR
Closes SigNoz/platform-pod#2919
#### Additional Information
- Final step of the migration; the frontend (#12589) and
integration-test (#12590) consumer moves are already merged.
|
||
|
|
bb47550c01 |
feat(authz): enable FGA for auth domains (#12588)
#### Description - Auth domain routes (`/api/v2/auth_domains`) now use `CheckResources` + `ResourceDef` instead of the coarse `AdminAccess` gate — per-resource FGA checks on enterprise, admin role gate on community. - Create and update also check `attach` on the roles the request's `roleMapping` will grant at SSO login (mapped roles + default role, `signoz-viewer` when unset, `role:*` when `useRoleAttribute` is on); update additionally checks `detach` on the roles the stored mapping was granting, since a `PUT` replaces the mapping. - Migration `117_add_auth_domain_tuples` backfills the admin `auth-domain` tuples for existing organizations and re-syncs the stored managed-role transaction groups; new organizations get both from the registry at bootstrap. - Regenerated OpenAPI spec: the auth-domain operations advertise `auth-domain:*` and `role:attach`/`role:detach` scopes instead of `ADMIN`. - Added `callbackauthn/05_authz.py` covering managed-role gating, custom-role wildcard/instance grants, and the role-mapping attach/detach checks. #### Issues closed by this PR Closes SigNoz/platform-pod#2649 |
||
|
|
ecf510ed67 |
refactor(query-builder): drop ClientSideQBSearch & QueryBuilderSearch (#12427)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
## Pull Request --- ### 📄 Summary > Why does this change exist? > What problem does it solve, and why is this the right approach? These are pending code that was supposed to be deleted after Infrastructure Monitoring & Alert History adopt the QBv5. #### Issues closed by this PR > Reference issues using `Closes #issue-number` to enable automatic closure on merge. Closes https://github.com/SigNoz/engineering-pod/issues/5117 Closes https://github.com/SigNoz/engineering-pod/issues/5116 --- ### ✅ Change Type _Select all that apply_ - [ ] ✨ Feature - [ ] 🐛 Bug fix - [x] ♻️ Refactor - [ ] 🛠️ Infra / Tooling - [ ] 🧪 Test-only --- ### 🧪 Testing Strategy > How was this change validated? - Tests added/updated: Yes - Manual verification: - - Edge cases covered: - --- ### ⚠️ Risk & Impact Assessment > What could break? How do we recover? - Blast radius: Query Builder - Potential regressions: Deleting more code than needed - Rollback plan: Revert the deletion. --- ### 📝 Changelog > Fill only if this affects users, APIs, UI, or documented behavior > Use **N/A** for internal or non-user-facing changes | Field | Value | |------|-------| | Deployment Type | Cloud / OSS / Enterprise | | Change Type | Maintenance | | Description | N/A | --- ### 📋 Checklist - [x] Tests added or explicitly not required - [x] Manually tested - [ ] Breaking changes documented - [ ] Backward compatibility considered |
||
|
|
5b94d79e46 |
fix(infrastructure-monitoring): page reset on switch category & page outside total (#12453)
## Pull Request --- ### 📄 Summary > Why does this change exist? > What problem does it solve, and why is this the right approach? This PR fixes the following issues: - page not resetting to 1 when switch - bug was only detected/present when coming from deep link - page not resetting to 1 when page produces a offset higher than total - you had to switch to hosts to be able to see data again #### Screenshots / Screen Recordings (if applicable) > Include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. This helps reviewers quickly understand the impact and verify the update. Before: Issue with page not reseting to 1 when changing category (after refresh): https://github.com/user-attachments/assets/00872b38-1263-43c1-8322-64d31ee1ee6a Issue with page outside the offset: https://github.com/user-attachments/assets/5194fb2e-5af3-491b-baf7-b4aa3a330c83 --- After: Issue with page not reseting to 1 when changing category (after refresh): https://github.com/user-attachments/assets/545e5914-c26f-4189-b15a-dc399bdee28b Issue with page outside the offset: https://github.com/user-attachments/assets/1b93d162-22a3-41c8-802e-aa2aa6012db9 #### Issues closed by this PR > Reference issues using `Closes #issue-number` to enable automatic closure on merge. Closes https://github.com/SigNoz/pulse-pod/issues/208 --- ### ✅ Change Type _Select all that apply_ - [ ] ✨ Feature - [x] 🐛 Bug fix - [ ] ♻️ Refactor - [ ] 🛠️ Infra / Tooling - [ ] 🧪 Test-only --- ### 🐛 Bug Context > Required if this PR fixes a bug Both issues are caused after the refactor to the new table component and after joining the categories into single component (without unmount/mount when switching categories). #### Root Cause > What caused the issue? > Regression, faulty assumption, edge case, refactor, etc. Lack of reset the page to 1, and no proper way to detect and reset page to 1 when outside the boundaries. #### Fix Strategy > How does this PR address the root cause? Reset to page 1 after switch category and also include hook on tanstack to ensure we reset page to last when outside the params. --- ### 🧪 Testing Strategy > How was this change validated? - Tests added/updated: Yes - Manual verification: Yes - Edge cases covered: - --- ### ⚠️ Risk & Impact Assessment > What could break? How do we recover? - Blast radius: Infrastructure Monitoring - Potential regressions: - - Rollback plan: Open a new PR to fix the issue --- ### 📝 Changelog > Fill only if this affects users, APIs, UI, or documented behavior > Use **N/A** for internal or non-user-facing changes | Field | Value | |------|-------| | Deployment Type | Cloud / OSS / Enterprise | | Change Type | Bug Fix | | Description | We fixed two issues around pagination inside Infrastructure Monitoring causing the page not resetting to 1 after switch category or when offset is higher than total amount of items. | --- ### 📋 Checklist - [x] Tests added or explicitly not required - [x] Manually tested - [ ] Breaking changes documented - [ ] Backward compatibility considered |
||
|
|
60a6a5b38c |
feat(onboarding): add Grok Build, GitHub Copilot, Serilog, GCP Integration datasources (#12595)
#### Description - Adds Grok Build, GitHub Copilot, Serilog, and GCP Integration to the onboarding data source picker. - Adds a runtime step under AWS Lambda → Traces, so the new Go SDK guide is reachable alongside the auto-instrumentation layers. - New `github-copilot.svg`; the other three reuse existing logos (`grok`, `dotnet`, `gcp`). #### Issues closed by this PR Closes SigNoz/signoz.io#3999 Closes SigNoz/signoz.io#3982 Closes SigNoz/signoz.io#3972 Closes SigNoz/signoz.io#3947 Closes SigNoz/signoz.io#3806 |
||
|
|
b47245d46a |
feat: support semconv evolution in services (#12443)
#### Description - The v2 services module (`/api/v2/services`) needs no change here: it renders a QBv5 filter expression and runs through the querier, so the merged #12442 resolution covers it when the `resolve_semconv_families` flag is on. - This layer covers the services read paths that do not go through QBv5, behind the same flag (default: disabled). Part of #6143. - The v1 services endpoints (services list, top operations) build the legacy resource sub-query: it merges family members with current-wins precedence, keeps the trailing `''` so keyless rows stay in negative filters, widens positive index hints to any member, and drops negated hints for correctness. - The dependency graph accepts every family spelling as a filter key; each spelling targets the historical `deployment_environment` column. - The reader evaluates the flag per request from the org in the request claims. The legacy logs and traces v4 explorer paths stay literal. With the flag off, every generated query is the same as main; tests pin this. #### Additional Information - Stack: #12441 (merged) → #12442 (merged) → **#12443** → #12444 → … This layer bases on main. - The quick-filter default change and the stored-row migration from the earlier version of this layer are deferred to the rollout phase: persisted rows cannot be gated by a flag. |
||
|
|
52ec7bf128 |
fix(logs): correct log details timestamp; enable new drawer view (#12624)
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description - Fixes the wrong timestamp shown in the log details drawer on the dashboard list panel. - Enables the new log details drawer on dashboards. <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Issues closed by this PR Closes https://github.com/SigNoz/engineering-pod/issues/5939 <!--If applicable, include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. --> #### Screenshots / Screen Recordings Before <img width="1631" height="865" alt="dashboard before" src="https://github.com/user-attachments/assets/ebfcab65-9d5e-4a71-bf50-b67cdfceba9a" /> After <img width="1608" height="813" alt="dashboard after" src="https://github.com/user-attachments/assets/80d3e7ad-ffe2-4b5d-9d42-647b06f2c44d" /> |
||
|
|
afe62d77b0 |
fix(logs-infra): body filtering on infra monitoring; enable new drawer view (#12623)
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description - Enables the new log details drawer on infra monitoring. - Fixes filtering from the drawer on infra. Filters, including body and nested-field filters that were not working. [RCA](https://github.com/SigNoz/engineering-pod/issues/5937#issuecomment-5339825308) This is now fixed since body and other keys are all rendered from the same place which uses the same passed addQuery util from EntityLogs - Group by only show on logs explorer page. <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Issues closed by this PR Closes https://github.com/SigNoz/engineering-pod/issues/5937 <!--If applicable, include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. --> #### Screenshots / Screen Recordings Before https://github.com/user-attachments/assets/da6cd2bf-4409-4362-af6b-f4871bf49005 After https://github.com/user-attachments/assets/4967af5a-d3c9-4198-86a4-3b865983b7c2 |
||
|
|
1aa6346a4c |
fix(logs): render log details v2 only on the logs explorer route (#12616)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description Render Log details on log explorer only. disabled on other places for now. <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Issues closed by this PR <!--If applicable, include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. --> #### Screenshots / Screen Recordings <!--Anything reviewers should keep in mind while reviewing --> #### Additional Information <!--Please delete paragraphs that you did not use before submitting.--> |
||
|
|
0f3b3dfb07 |
refactor: adding FunctionName variable in Lambda dashboard (#12599)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description AWS Cloud Integration's Lambda dashboard was missing FunctionName variable, this PR adds that variable for better UX. <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Issues closed by this PR Closes https://github.com/SigNoz/platform-pod/issues/2988 <!--If applicable, include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. --> #### Screenshots / Screen Recordings <img width="1503" height="815" alt="image" src="https://github.com/user-attachments/assets/56203f8d-1f06-4c39-b3c1-c1dabf028045" /> --------- Co-authored-by: Vikrant Gupta <vikrant@signoz.io> |
||
|
|
7e2cd441f2 |
fix(alertmanager): remove threading from google chat notifier (#12609)
#### Description - Remove `threadKey` + `messageReplyOption` query params from the Google Chat notifier; every notification now posts as a standalone message instead of a threaded reply. - Post to the user-configured webhook URL verbatim (no parse/re-encode of its query string). - Replace `TestGoogleChatThreading` with `TestGoogleChatWebhookURLVerbatim`, asserting the webhook's own params (`key`, `token`) pass through untouched and nothing is appended. #### Issues closed by this PR Closes SigNoz/pulse-pod#285 #### Additional Information - Context: threading behavior wasn't planned holistically (SigNoz/pulse-pod#281); it will return later as a consistent, opt-in feature across all chat integrations (Slack, MS Teams, Google Chat, etc.). - No config/migration impact: `threadKey` was never user-facing config. Existing channels simply start receiving new messages (no threaded replies on refire) from the next evaluation cycle after deploy. - `notify.ExtractGroupKey` is intentionally kept — still used for the debug log, consistent with other notifiers. |
||
|
|
098448330d |
fix(apm): stop the service drilldown crashing on an empty operations list (#12578)
<!--A few plain bullets saying what changed and why, for a reviewer
skimming it - not a wall of text, not a restatement of the diff, not
generated boilerplate.-->
#### Description
Fixes an unhandled promise rejection on the APM service detail page —
opening a chart's drilldown menu could throw `syntax errors in
expression: [line 1:48 missing {BOOL, NUMBER, QUOTED_TEXT, KEY} at
']']`.
The chain:
- The overview's top-level-operations query keys on `minTime`/`maxTime`
with no `keepPreviousData`, so every time-range change blanks the list.
The widgets below are then rebuilt with `service.name in ['<service>']
AND operation in []`.
- `valueList` in the filter grammar needs at least one value, so `in []`
is a hard parse error. The panel itself is guarded (`isQueryEnabled`
requires a non-empty list); the drilldown is not.
- The drilldown menu resolves the widget query through
`/substitute_vars` on every click — on this page there are no dashboard
variables at all, so it is pure overhead — and the 400 landed on a
floating promise with no rejection handler.
What changed:
- `useBaseAggregateOptions` catches the failure, falls back to the
unresolved query (already its initial state) and shows the same "Unable
to resolve variables" toast `useNavigateToExplorer` uses. `oxlint` was
already flagging this line under `no-floating-promises`; that warning is
gone.
- `useResolveQuery` short-circuits when there are no variables to
substitute, so APM / Celery / API monitoring drilldowns stop making the
call at all.
- The overview keeps its previous operations list across a time-range
change, so the widget queries are never built with an empty list — which
also stopped the bad filter riding into the explorer URL the drilldown
opens.
#### Issues Closed
Closes https://github.com/SigNoz/pulse-pod/issues/278
<!--Anything reviewers should keep in mind while reviewing -->
#### Additional Information
- Skipping the round-trip doesn't lose the filter: both consumers of the
resolved query rebuild `filter.expression` from `filters.items`
themselves (`getViewQuery`, `useGetCompositeQueryParam`), and the APM
query factory never sets `filter.expression` to begin with.
- `keepPreviousData` is safe across service navigation —
`topLevelOperations[servicename]` already returns `[]` for a mismatched
service, and `isQueryEnabled` still guards that case.
- Deliberately left out: dropping empty `IN []` items globally in
`convertFiltersToExpression`. It would silence a wider class of 400s but
flips the semantics — `IN []` means "match nothing", dropping the clause
means "match everything" — and there is an existing test asserting
today's behaviour. Happy to do it separately as a match-nothing rewrite
if reviewers want the broader guard.
- Sentry: SIGNOZ-UI-5JV.
|
||
|
|
eb01617c15 |
fix(metrics): type-match filter values against the labels JSON read (#12519)
#### Description - Every label lives in the `labels` JSON and reads back as `String` whatever data type the metadata claims, so `success = true` compared `String` with `Bool` and failed the whole query with ClickHouse error 386. The read is now cast with `accurateCastOrNull(..., 'Bool')`, which also matches the `1`/`True` spellings exporters write. - `IN`/`NOT IN` expand into `=`/`!=` chains like the logs and traces condition builders already do. The driver binds `IN (?)` as a single array literal, which needs one common supertype across the set, so a set mixing text with numbers or bools failed the same way. Each value is now type-matched on its own. - Intrinsic columns keep their own type and are compared as they are, which also stops `toFloat64OrNull()` being applied to `unix_milli`/`fingerprint` (error 43). #### Additional Information - A label value that isn't boolean text casts to NULL and so matches neither side of the comparison — `tests/integration/tests/queriermetrics/13_bool_label_filter.py` asserts that, alongside the statement-builder unit tests. - `BETWEEN` takes its cast from the lower bound: the where-clause visitor already rejects mixed-type operands (and bool ones outright), so both bounds are the same number-or-string type by the time the condition builder sees them. |
||
|
|
7bcfaab35e |
feat: add override can edit dashboard (#12580)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
#### Description
- `DashboardContainer` now takes an optional `overrideCanEditDashboard`
prop that forces a dashboard into read-only mode, independent of the
viewer's role o
- It is typed as `false` on purpose: the prop can only take edit rights
away, never grant them, so it can't be used to slip past the existing
permission checks. When it isn't passed, behaviour is unchanged
(`overrideCanEditDashboard ?? canEditDashboard`), so no other dashboard
is affected.
- LLM Observability's Overview passes `overrideCanEditDashboard={false}`
so its built-in dashboard stays view-only, and the dashboard JSON's
`locked` flag goes back to `false` since the lock is no longer what
makes it read-only.
- `DashboardActions` also gates the Lock / Unlock menu item behind
`canEditDashboard`, so a read-only dashboard no longer offers an action
that would let the viewer flip its lock state.
- The prop is marked `@deprecated` with a TODO
#### Issues closed by this PR
Covers the read-only dashboard requirement discussed in
SigNoz/engineering-pod#5920.
#### Screenshots / Screen Recordings
https://github.com/user-attachments/assets/e49bf5f7-ca36-4353-be47-f6ca80a2f0d2
#### Additional Information
---------
Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com>
|
||
|
|
5b62b31d34 |
fix(infrastructure-monitoring): preserving staled params after navigation (#12585)
<!--A few plain bullets saying what changed and why, for a reviewer
skimming it - not a wall of text, not a restatement of the diff, not
generated boilerplate.-->
#### Description
Similar to bug fixed at
|
||
|
|
f6a9b4b1f6 |
feat(changelog): make links open in new tab (#12557)
#### Description Currently, any external links such as link to the SigNoz docs open in the same tab when linked in the changelog, taking the user away from the changelog and the in-app context. Opening the links in new tabs allows users to check out external sources without losing the current context. #### Issues closed by this PR Closes https://github.com/SigNoz/growth-pod/issues/1267 #### Screenshots / Screen Recordings https://github.com/user-attachments/assets/3f3b19b2-c914-450e-b5a2-ae30ed78cb30 #### Additional Information I checked if changing how we create changelog entries only can work, but failed, markdown method to open in new tab didn't work https://stackoverflow.com/questions/75633163/how-can-i-use-target-blank-in-an-external-link-on-mdx |
||
|
|
b46f099966 |
fix(log-details): prevent scrollbar click closing log details drawer (#12603)
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description Prevent log details drawer closing on clicking on scrollbar <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Issues closed by this PR Closes https://github.com/SigNoz/engineering-pod/issues/5934 <!--If applicable, include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. --> #### Screenshots / Screen Recordings Before https://github.com/user-attachments/assets/b59e2a64-951e-49eb-9b05-ae39f00991ae After https://github.com/user-attachments/assets/5eb89c95-fb76-49b7-9928-1bd13df16002 |
||
|
|
fcfc1923c3 |
feat(log-details): support json view for nested attributes + enable new log details (#12597)
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description This PR adds functionality on top of the new log details drawer changes. - Show JSON view for nested attributes instead of stringified json. These dont support filter/group-by right now - Change `resources.*` to `resource.*` to match traces and otel convention - remove groupBy for fields nested or not matching the following names: 'trace_id' and 'body' - enables new log details experience for all users <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Issues closed by this PR Closes https://github.com/SigNoz/engineering-pod/issues/5921 <!--If applicable, include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. --> #### Screenshots / Screen Recordings https://github.com/user-attachments/assets/876fb331-015d-42bb-83c7-5ff543ddadec |
||
|
|
dc836bb67c |
chore: update dependencies resolution for e2e (#12594)
#### Description - `tests/e2e` is a standalone pnpm project with no overrides of its own, so `eslint-plugin-playwright > eslint > minimatch` resolved a vulnerable `brace-expansion@5.0.5` (4 advisories, incl. CVE-2026-13149). - Adds `tests/e2e/pnpm-workspace.yaml` flooring it to `>=5.0.9 <6`, which stays inside `minimatch@10.2.5`'s `^5.0.5` range — no breaking bump, and bumping minimatch instead wouldn't help (10.2.6 only widens to `^5.0.8`). - `pnpm audit` in `tests/e2e` now reports no known vulnerabilities. - This also resolves the vulnerabilities reported by vanta #### Issues closed by this PR https://github.com/orgs/SigNoz/projects/39/views/20?pane=issue&itemId=230120135&issue=SigNoz%7Cengineering-pod%7C5925 #### Screenshots / Screen Recordings #### Additional Information Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
b86e536432 |
fix: support for query type in cache fingerprint (#12598)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
#### Description We have added a new query type "builder_ai_query" , now previously the cache fingerprint didn't consider type because of which ai query cache and builder query cache might result in same fingerprint leading to cache issue. #### Issues closed by this PR Part of https://github.com/SigNoz/engineering-pod/issues/5602 and https://github.com/SigNoz/engineering-pod/issues/5603 |
||
|
|
a76a7ede70 |
fix(logs pipelines): default parse_from to body.message under JSON bodies (#12556)
#### Description - The processor form pre-fills `parse_from` with `body` for the grok, regex and json parsers (`initialValue: 'body'` in `AddNewProcessor/config.ts`). - With `use_json_body` the collector prepends a `normalize` pipeline, so by the time user operators run the body is a map. A parser pointed at `body` gets a map it cannot parse and silently extracts nothing — the pipeline is broken by default, without the user ever touching the field. - Resolve the default to `body.message` when the flag is on. Keying off `initialValue === 'body'` rather than a hardcoded processor list keeps `time_parser` (`attributes.timestamp`) and `severity_parser` (`attributes.logLevel`) untouched, and covers any future processor that defaults to the body. #### Additional Information - Saved processors are unaffected — edit mode calls `form.setFieldsValue(savedData)`, which overrides `initialValue`. This only changes what a newly added processor starts with, and only while the flag is on. - The helper returns new objects rather than mutating the shared config; there is a test asserting `processorFields.grok_parser` still reads `body`. - This does not help pipelines already saved with a bare `body`. Preview shows them making no change at all, with nothing explaining why — surfacing that is a follow-up. - Filters have the same problem and are not addressed here: `body contains "x"` cannot match a map, and unlike a failing operator a skipped filter produces no collector log. `queryBuilderToExpr` already special-cases `body.<key>` for EXISTS; extending that to value comparisons is the separate fix. |
||
|
|
cfc7a04bc8 |
feat: resolve semantic convention names in trace queries (#12442)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
#### Description - A referenced name in a trace query now resolves to a `LogicalField` (#12499): one field, addressed by the requested spelling, backed by its physical member keys. A semantic-convention family (`deployment.environment.name` / `deployment.environment`) merges into one expression with current-wins precedence; the response keeps the requested spelling. - `FieldMapper` gets one new method, `ExistsFor` (the per-key presence primitive). `LogicalValueExpr` and `LogicalExistsExpr` build all family SQL in one place from `FieldFor` and `ExistsFor`; no signal implements family logic. - Statement builders prefetch sibling spellings; the metadata store stays family-blind and autocomplete stays literal. Traces and the resource filter compile per logical field; logs, metrics, and the other signals keep their SQL unchanged. - The `resolve_semconv_families` feature flag (default: disabled) gates all family behavior. With the flag off, the generated SQL is the same as main; tests pin this. Part of #6143. #### Additional Information - Stack: #12441 (merged) → **#12442** → #12443 → #12444 → #12445 → #12446 → #12447. This layer bases on main. - Rollback: turn the flag off; stored telemetry is untouched. |
||
|
|
014cab564e |
feat(serviceaccount): assign roles through the service_account_roles API (#12589)
#### Description
- Moves the service account role drawer off the deprecated nested
`/api/v1/service_accounts/{id}/roles` endpoints onto
`/api/v1/service_account_roles`, mirroring the earlier member →
`user_roles` migration.
- `useServiceAccountRoleManager` now reads role assignments from the
service account detail (`serviceAccountRoles` join rows), creates with
`{serviceAccountId, roleId}`, and deletes by the join-row id; the manual
query invalidation is dropped since the drawer already refetches the
same query.
#### Screenshots / Screen Recordings
https://github.com/user-attachments/assets/dd60e1d1-5d78-4f17-80f7-bb1a53730736
|
||
|
|
9cf2ffe000 |
test(serviceaccount): move role provisioning to the service_account_roles API (#12590)
#### Description
- Moves the `serviceaccount` integration fixtures and suites off the
deprecated nested `/api/v1/service_accounts/{id}/roles` endpoints onto
`/api/v1/service_account_roles`.
- Roles are assigned via `POST /api/v1/service_account_roles` (201) and
revoked via `DELETE /api/v1/service_account_roles/{id}` (204), reading
join-row ids from the service account detail.
#### Additional Information
- Part of SigNoz/platform-pod#2919 — the integration-test half of the
consumer migration. The frontend migration and the deprecated-endpoint
removal are separate PRs.
|
||
|
|
81d1716c7e |
fix(user): clear role assignments when a user is deleted (#12554)
#### Description - Soft-deleting a user revoked the FGA grant but left the `user_role` rows behind. The role-delete guard (`OnBeforeRoleDelete` → `GetUsersByOrgIDAndRoleID`) still counted the deleted user, so the role could never be deleted — and detaching the assignment was also blocked because the user is deleted. That left the role permanently undeletable. - `SoftDeleteUser` now deletes the user's `user_role` rows in the same transaction that already clears its password, tokens, and preferences, so the SQL side matches the FGA revoke. - Migration `delete_orphan_user_roles` clears the orphan `user_role` rows left by users deleted before this change. #### Additional Information - Regression test in `role/02_crud.py`: assign a custom role to a user, delete the user, then delete the role → now `204` (was the deadlock). |
||
|
|
a7935ca668 |
test(qb): de-flake the recent searches dropdown (#12586)
#### Description `RecentSearches.test.tsx` was failing intermittently on CI. Two separate timing races, both in the test itself: - Clicking a recent used `userEvent.click`, whose `pointerdown` blurs the editor and closes the dropdown ~10ms later — before CodeMirror applies the completion on `mousedown`. On a slow runner the dropdown was already gone. Now uses `fireEvent.mouseDown`, which is what a browser actually does here. - `filters recents by substring as the user types` waited on a dropdown that typing can close, with nothing to reopen it. All waits now re-request completions if it closed. No production code changed. #### Issues closed by this PR #### Screenshots / Screen Recordings #### Additional Information Ran the file 5x, the whole `QueryBuilderV2` directory 3x (211 tests), and 3x under CPU load to mimic a slow runner — all green. Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
30823c520d |
refactor(infrastructure-monitoring): always represent IO as binBps instead of bytes for hosts (#12428)
## Pull Request --- ### 📄 Summary > Why does this change exist? > What problem does it solve, and why is this the right approach? The other charts related to network uses binBps instead of `bytes`, and similar to System Disk IO, we can use binBps since we are representing throghutput #### Screenshots / Screen Recordings (if applicable) > Include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. This helps reviewers quickly understand the impact and verify the update. > The changes are on `Network Usage` and `System Disk Chart`, pay attention to the Y unit. Before: <img width="1726" height="1090" alt="image" src="https://github.com/user-attachments/assets/6a71f9fd-ae19-4ed8-bba1-3851ecf815f4" /> After: <img width="1726" height="1091" alt="image" src="https://github.com/user-attachments/assets/b3fc41dc-af20-4784-afe2-c3c1936ceba8" /> #### Issues closed by this PR > Reference issues using `Closes #issue-number` to enable automatic closure on merge. Closes https://github.com/SigNoz/pulse-pod/issues/211 --- ### ✅ Change Type _Select all that apply_ - [ ] ✨ Feature - [ ] 🐛 Bug fix - [x] ♻️ Refactor - [ ] 🛠️ Infra / Tooling - [ ] 🧪 Test-only --- ### 🧪 Testing Strategy > How was this change validated? - Tests added/updated: No - Manual verification: Yes - Edge cases covered: - --- ### ⚠️ Risk & Impact Assessment > What could break? How do we recover? - Blast radius: Infrastructure Monitoring - Hosts - Potential regressions: None - Rollback plan: Revert this commit --- ### 📝 Changelog > Fill only if this affects users, APIs, UI, or documented behavior > Use **N/A** for internal or non-user-facing changes | Field | Value | |------|-------| | Deployment Type | Cloud / OSS / Enterprise | | Change Type | Feature | | Description | We updated the charts of Network IO and System disk IO to use unit of bytes per second instead of bytes. | --- ### 📋 Checklist - [x] Tests added or explicitly not required - [x] Manually tested - [ ] Breaking changes documented - [ ] Backward compatibility considered |
||
|
|
8e4aedcecd |
chore: dependencies update resolutions (#12583)
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description - Clears all 19 high-severity advisories reported by `pnpm audit` (24 findings → 4, none high). - Most of this is security floors in `pnpm-workspace.yaml`, following the file's existing capped-override convention — each entry records the vulnerable path and what would let us drop it again. - `brace-expansion` needs three separate entries because three majors coexist in the tree: minimatch@3 (via `test-exclude`), minimatch@9 (via jest's `glob@10`), and minimatch@10 (via `eslint-plugin-sonarjs`). - `image-size` has no patched release at all, so the only fix is dropping the dependency — `less@4.5.0` removed it, and that lands inside `typescript-plugin-css-modules`' `^4.2.0` range. - `postcss` 8.5.14 → 8.5.26 is the one direct bump; it's a direct devDep, so a floor override would only hide a stale version in `package.json`. <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Issues closed by this PR Closes - https://github.com/orgs/SigNoz/projects/39/views/20?pane=issue&itemId=230120135&issue=SigNoz%7Cengineering-pod%7C5925 <!--Anything reviewers should keep in mind while reviewing --> #### Additional Information - Deliberately scoped to highs. The 4 remaining moderates (`dompurify`, `@remix-run/router`, and two `react-router` advisories) are left for a follow-up. <!--Please delete paragraphs that you did not use before submitting.--> --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
1c7fd32f91 |
fix(infrastructure-monitoring): do not overflow outside table for large error message (#12450)
## Pull Request --- ### 📄 Summary > Why does this change exist? > What problem does it solve, and why is this the right approach? Prevent the error message to overflow outside the table. #### Screenshots / Screen Recordings (if applicable) > Include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. This helps reviewers quickly understand the impact and verify the update. Before: https://github.com/user-attachments/assets/d53845ed-7db9-4451-a2ca-31bc6127ec31 After: https://github.com/user-attachments/assets/78e1e2d4-a5e1-46d7-9f66-117d1868e9f5 #### Issues closed by this PR > Reference issues using `Closes #issue-number` to enable automatic closure on merge. Closes https://github.com/SigNoz/pulse-pod/issues/222 --- ### ✅ Change Type _Select all that apply_ - [ ] ✨ Feature - [x] 🐛 Bug fix - [ ] ♻️ Refactor - [ ] 🛠️ Infra / Tooling - [ ] 🧪 Test-only --- ### 🧪 Testing Strategy > How was this change validated? - Tests added/updated: No - Manual verification: Yes - Edge cases covered: - --- ### ⚠️ Risk & Impact Assessment > What could break? How do we recover? - Blast radius: Infrastructure Monitoring - Potential regressions: - - Rollback plan: Revert this commit --- ### 📝 Changelog > Fill only if this affects users, APIs, UI, or documented behavior > Use **N/A** for internal or non-user-facing changes | Field | Value | |------|-------| | Deployment Type | Cloud / OSS / Enterprise | | Change Type | Bug Fix | | Description | We updated the error layout to ensure it won't overflow the table in case the APIs fail with a large message. | --- ### 📋 Checklist - [x] Tests added or explicitly not required - [x] Manually tested - [ ] Breaking changes documented - [ ] Backward compatibility considered |
||
|
|
fb106b3253 |
feat(logs): render DataViewer with filter/group-by actions in log details overview (#12426)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
## Pull Request --- ### 📄 Summary > Why does this change exist? > What problem does it solve, and why is this the right approach? Renders the new `DataViewer` (Pretty tree + JSON) inside the V2 log-details Overview tab Wires up filter / group-by on each attribute similar to pretty view in trace details **Change points** **Rendering the View** - Data Viewer renders using `aggregateAttributesResourcesToObject` which is not written fresh, just extracted from an existing logic `aggregateAttributesResourcesToString`. - jsonData is separately sent to the DataViewer as rendering logic for pretty and json view is different in this case. unlike trace details where both views had same source data. **Group by / FIlter and other logic** - All the related logic resides in 2 major files: `useLogAttributeActions.tsx` and `logAttributeActions.utils.ts`. - we build the fieldKey ourselves (`buildLogFilterTarget`) as this is now different from old representation. - filter / group by / replace build the query locally now...we do not make the `getAggregateKeys` call at all. we fabricate the telemetry field key ourselves with just the name and dataType filled and rest kept empty. so no prefetch, no resolver, no loader. - the query building is extracted into 3 utils: `getFilterQueryData`, `getGroupByQueryData`, `getReplaceFilterQueryData`. the hook just calls these over `updateQueriesData`. - restricted fields apply for body as well: `timestamp` / `id` / `date` inside body no longer show filter / group by. reuses `RESTRICTED_SELECTED_FIELDS`. **Pretty View** - renderLeafValue: introduce to render custom leaf value. we are using this here for body. This is extensible for other usecases as well...like showing md format leaf for LLMs in the future. - fixed leaf vs nested row indentation so keys line up at every depth. **Other changes** - Filter value keeps its data type: dataType is threaded through so a numeric/bool filter value stays unquoted. - Removed the redundant outer JSON tab in V2. #### Screenshots / Screen Recordings (if applicable) https://github.com/user-attachments/assets/ec1f0842-0a3b-407b-807c-0c3b0f9ed86a #### Issues closed by this PR > Reference issues using `Closes #issue-number` to enable automatic closure on merge. Closes: https://github.com/SigNoz/engineering-pod/issues/4618 Closes: https://github.com/SigNoz/engineering-pod/issues/4630 Closes: https://github.com/SigNoz/engineering-pod/issues/5781 --- ### ✅ Change Type _Select all that apply_ - [x] ✨ Feature - [ ] 🐛 Bug fix - [ ] ♻️ Refactor - [ ] 🛠️ Infra / Tooling - [ ] 🧪 Test-only --- |
||
|
|
edb63ae7be |
feat[ai-011y]: fields API for ai query builder (#12140)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
## Pull Request --- ### 📄 Summary - Add a `type` param to `/api/v1/fields/keys`; for type=builder_ai_query (flag-gated) the metadata store returns the per-trace aggregate columns (llm_call_count, input_tokens, …) as trace-context keys — they're computed at query time, never ingested, so the attribute scan can't serve them. - Split `TraceColumn.Orderable` into `Orderable + Filterable`: ORDER BY uses orderable, the trace-level filter validates against filterable, and the API only returns keys that are both. `last_activity_time` is order-only and now rejected in filters with a targeted error.** - UI note: last_activity_time should be added to client-side list (it's the default sort). #### Issues closed by this PR Part of https://github.com/SigNoz/engineering-pod/issues/5714 --- ### ✅ Change Type _Select all that apply_ - [x] ✨ Feature - [ ] 🐛 Bug fix - [ ] ♻️ Refactor - [ ] 🛠️ Infra / Tooling - [ ] 🧪 Test-only --- ### 🧪 Testing Strategy > How was this change validated? - Tests added/updated: ✅ - Manual verification: ✅ - Edge cases covered: ✅ --- ### ⚠️ Risk & Impact Assessment > What could break? How do we recover? - Blast radius: None - Potential regressions: - Rollback plan: |
||
|
|
e7dc01de45 |
fix: add history replace in trace detail (#12404)
## Pull Request We have issues in TraceDetailsV3: - When you open TraceDetailsV3 and click on spans, if you keep clicking on these spans, it will change the URL. When you click on Go Back, it will just navigate you through the history of URLs you have clicked, which is not the right experience. - The same thing happens if you have opened span details, The drawerless modal on the right-hand side: if you close it and click on the Back button, it will just open that drawer once again. ### 📄 Summary #### Screenshots / Screen Recordings (if applicable) https://github.com/user-attachments/assets/a60f544c-83ea-4f06-9233-8fc722428a04 #### Issues closed by this PR Closes - Before - https://github.com/orgs/SigNoz/projects/39/views/11?filterQuery=assignee%3Atewarig&pane=issue&itemId=223289782&issue=SigNoz%7Cengineering-pod%7C5851 Now - https://github.com/user-attachments/assets/ec28925b-c61a-43f1-b01e-510fab7c5a62 --- ### ✅ Change Type _Select all that apply_ - [ ] ✨ Feature - [x] 🐛 Bug fix - [ ] ♻️ Refactor - [ ] 🛠️ Infra / Tooling - [ ] 🧪 Test-only --- ### 🐛 Bug Context #### Root Cause We are pushing span click as well as when the span detail modal closes and opens to the history. Ideally, we should just replace it. #### Fix Strategy Pass `{ replace: true }` to `safeNavigate` at both call sites. Every route that mutates `spanId` in trace details now replaces rather than pushes: | Site | Trigger | Before | After | |---|---|---|---| | `Success.tsx:693` | waterfall span click | push | **replace** | | `index.tsx:83` | close span details panel | push | **replace** | `useCopySpanLink` also builds a `spanId` URL but only writes it to the clipboard — it never navigates, so it is correctly untouched. --- ### 🧪 Testing Strategy - **Tests added/updated:** `UnifiedSpanClick.test.tsx` I have tested manually. --- ### ⚠️ Risk & Impact Assessment - **Blast radius:** Small and contained. Two one-line changes, both inside `pages/TraceDetailsV3`. No API, schema, or shared-utility changes. Nothing outside trace details reads or writes the `spanId` param. - **Rollback plan:** Revert the commit. There is no state, migration, or persisted data involved, so a revert fully restores the prior behaviour with no cleanup. --- ### 📝 Changelog | Field | Value | |------|-------| | Deployment Type | Cloud / OSS / Enterprise | | Change Type | Bug Fix | | Description | The browser Back button on the trace detail page now returns you to the page you came from, instead of stepping back through each span you had clicked within the trace. | --- ### 📋 Checklist - [x] Tests added or explicitly not required - [ ] Manually tested - [x] Breaking changes documented - [x] Backward compatibility considered --- ## 👀 Notes for Reviewers Two smaller notes: Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
c40ebb027b |
Revert "fix(querier): use collector-stamped insert time for last_observed stats" (#12560)
Some checks failed
Release Drafter / update_release_draft (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
cacheci / tests (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Reverts SigNoz/signoz#12455 since the new column the PR was querying on is not indexed and leading to latency across deployments. Part of https://github.com/SigNoz/engineering-pod/issues/5916 |
||
|
|
789a4626fc |
fix(saved-views): recover legacy-shaped selectedFields entries (#12549)
Some checks failed
build-staging / staging (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
### Description Old saved views still store `selectedFields` as `key`/`dataType`/`type`. That shape unmarshals cleanly into a zero-valued `TelemetryFieldKey`, so migration 111 saw no error and skipped those rows — they now read back with an empty `name`, which breaks the explorer UI. - Migration 113 remaps `key` → `name`, `type` → `fieldContext`, `dataType` → `fieldDataType`, including the old spellings with no current alias (`spanSearchScope`, `array(string)` and friends). Entries with neither `name` nor `key` are dropped; valid entries are left untouched. - `SavedViewSpec.Validate` now requires `selectedFields[].name`, so this can't be written again. Closes https://github.com/SigNoz/engineering-pod/issues/5909 |
||
|
|
2dcd4d9a66 |
feat(alert-channel-integrations): improve the existing go tests (#12526)
#### Description - Splits testify usage in the existing alert channel tests (email, slack, pagerduty, opsgenie, msteamsv2, webhook) per the convention established in #12314: `require` for error checks and guards before indexing/dereferencing, `assert` for the independent value checks so one failure doesn't mask the rest. - Fixes illegal `require`/`t.Fatal` calls inside `httptest` handlers (pagerduty, slack), which run on the server's goroutine where `FailNow` must not be called; these now use `assert`. - Adds missing guards before unchecked indexing and pointer dereferences (opsgenie request slice, msteamsv2 blocks, slack field pointer, email HTML/Text pointers). - Normalizes leftover raw `t.Fatal`/`t.Errorf` and redundant `if err != nil { require.NoError }` patterns to plain testify calls. #### Issues closed by this PR Closes SigNoz/pulse-pod#164 |
||
|
|
abf60c0af3 |
feat: move out of using monaco cdn to using monaco from node modules (#12515)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description This PR prevents `@monaco-editor/react` from loading the core monaco-editor package from a third party CDN. This fixes an issue where the CDN is blocked for certain users/tenants, preventing monaco-editor from loading. <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Issues closed by this PR closes https://github.com/SigNoz/engineering-pod/issues/5871 <!--If applicable, include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. --> #### Screenshots / Screen Recordings <!--Anything reviewers should keep in mind while reviewing --> #### Additional Information Pager: https://signoz-1.pagerduty.com/incidents/Q108N2EUVQAJN2 Sentry: https://signoz-io.sentry.io/issues/7583880805/ <!--Please delete paragraphs that you did not use before submitting.--> |
||
|
|
ebc8d86a8d |
feat(dashboard-v2): format panel values with thousand separators (#12327)
## Pull Request --- ### 📄 Summary Large numbers in dashboard panels rendered as an undelimited digit run — `1234567` instead of `1,234,567` — which is hard to read at a glance and hard to compare between panels. Unitless values were the visible gap. They format through the `'none'` unit, which routes to `formatDecimalWithLeadingZeros`, whose `Intl.NumberFormat` is constructed with `useGrouping: false`. Units that scale their own value (`bytes` → `1.18 MiB`, `short` → `1.23 Mil`) never reach four integer digits, so they never showed the problem. The grouping is applied inside `formatPanelValue` — the single seam through which V2 panels reach `getYAxisFormattedValue` — rather than at one call site. That is deliberate: readability of a large scalar is not specific to one panel kind, so the Number panel, Table value cells and the threshold-row previews all pick it up from one place instead of each opting in. `groupThousands` itself is conservative. It touches only the first numeric token's integer digits, so fractions, unit labels and formatter-scaled values pass through untouched, and exponent notation is skipped (grouping a mantissa reads as noise). #### Screenshots / Screen Recordings (if applicable) No capture attached. The visible delta is purely the separators: | Panel | Unit | Before | After | |---|---|---|---| | Number | — | `1234567` | `1,234,567` | | Number | `percent` | `1234567%` | `1,234,567%` | | Number | `bytes` | `1.18 MiB` | `1.18 MiB` (unchanged) | | Table cell | — | `1234567` | `1,234,567` | #### Issues closed by this PR Closes #7669 --- ### ✅ Change Type _Select all that apply_ - [x] ✨ Feature - [ ] 🐛 Bug fix - [ ] ♻️ Refactor - [ ] 🛠️ Infra / Tooling - [ ] 🧪 Test-only --- ### 🐛 Bug Context **N/A** — this is an enhancement, not a regression. Grouping was never implemented; `useGrouping: false` in `formatDecimalWithLeadingZeros` is longstanding and intentional for the axis-tick path it was written for. --- ### 🧪 Testing Strategy - **Tests added/updated:** - `groupThousands.test.ts` (new) — the transform in isolation. - `parseFormattedValue.test.ts` (new) — this util had no suite; covers the unit split, including grouped input. - `formatPanelValue.test.ts` — asserts grouping at the seam, and that unit-scaled values stay ungrouped. - `NumberPanel/__tests__/Renderer.test.tsx` — grouped value, grouped value + separate unit, and unit-scaled value left alone. - `TablePanel/__tests__/Renderer.test.tsx` — pins the grouping that Table cells inherit. Worth noting for reviewers: `tableColumns.test.ts` and `tableCsv.test.ts` both stub `formatPanelValue`, so they are blind to this change by construction — the renderer test is what actually covers the Table path. - **Manual verification:** not a click-through of a live dashboard. Instead: the full frontend jest suite (7,312 passing; the 3 failures are in unrelated suites — `QuerySearch`, `AuthDomain` — and were confirmed flaky/pre-existing by re-running them alone and against a stashed pristine tree), plus `tsgo --noEmit`, `oxlint`, `oxfmt --check` and `vite build` all clean. The real `getYAxisFormattedValue` output was probed directly for 11 value/unit combinations before writing the transform, and `papaparse.unparse` was run directly to confirm exactly how a grouped cell serializes. - **Edge cases covered:** negative values (sign stays outside the first group), fractions (never grouped), exponent notation (skipped), `∞` / `-∞` / `NaN` (untouched), prefix and suffix unit decoration (`$ 1,234,567`, `1,234,567%`, `1,234,567 ms`), formatter-scaled units, values below 1000, zero, and idempotency on already-grouped input. --- ### ⚠️ Risk & Impact Assessment - **Blast radius:** every `formatPanelValue` consumer — the Number panel, Table panel value cells, the three threshold-row previews in the config pane, and the Table CSV export. Display-only in all cases; no spec/DTO or API change, nothing persisted. - **Potential regressions:** - **The CSV export is the one behavior change worth a reviewer's attention.** `formatTableCellText` is shared by the Table renderer and the export, so a unitless numeric column now serializes as `"1,234,567"` (papaparse quotes any field containing the delimiter) instead of `1234567` — spreadsheet `SUM`/`AVG` and downstream `parseFloat` would read it as text. Columns with a unit were *already* display-text in the export (`295.43 ms`, `1.18 MiB`) by design ("reusing the on-screen cell formatting", V1 parity), so only unitless numeric columns change in kind. Called out explicitly because it is an accepted trade-off, not an oversight — if we would rather keep the export numeric, the contained fix is a flag threaded through `formatTableCellText` from `tableCsv.ts` only, leaving the render path grouped. - Table **sorting and threshold evaluation are unaffected** — both read `toCellNumber(raw)`, never the formatted string. - `parseFormattedValue` had to learn to accept `,`, otherwise a grouped value would fall through to the whole-string fallback and lose its unit split. Covered by its new suite. - **Rollback plan:** revert the PR. Display-only with no migration or persisted state, so a revert is immediate and total. --- ### 📝 Changelog | Field | Value | |------|-------| | Deployment Type | Cloud / OSS / Enterprise | | Change Type | Feature | | Description | Large numbers in dashboard panels are now formatted with thousand separators (`1,234,567`), in the Number panel, Table panel value cells and threshold labels. | --- ### 📋 Checklist - [x] Tests added or explicitly not required - [ ] Manually tested - [x] Breaking changes documented - [x] Backward compatibility considered --- ## 👀 Notes for Reviewers Two things I would want a second pair of eyes on: 1. **"Manually tested" is deliberately unchecked.** This was validated through tests and direct probes of the real formatter, not by clicking through a running dashboard. A quick look at a Number panel and a Table panel — plus a screenshot for this PR — is worth doing before merge. 2. **The CSV trade-off** under Risk & Impact. Grouping at the seam is what makes the change one line instead of four call sites, but the export rides the same path. The narrower alternative is described there if you would rather not accept it. The three commits are independently reviewable: the transform, the parser tolerance it requires, then the seam that turns it on. |
||
|
|
0cf3988867 |
fix(logs pipelines): preview logs with the body the collector sees (#12520)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
#### Description - The collector gets a `normalize` pipeline prepended ahead of user pipelines when `use_json_body` is on — injected in `RecommendAgentConfig` and delivered over opamp — which parses the log body into JSON. Preview simulated only the user's pipelines, so a pipeline authored against `body.<field>` behaved differently in preview than in production, and one written against `body` looked fine in preview while doing nothing on real logs. - Preview now evaluates the flag for the caller's org and prepends the same pipeline, so what it shows is what the collector does. #### Issues closed by this PR Fixes https://github.com/SigNoz/engineering-pod/issues/5897 #### Additional Information Verified end to end against a local stack — devenv ClickHouse, a collector with `body_json_enabled` connected over opamp, `use_json_body` on — by driving the two calls the preview screen makes: sample logs, then preview with those logs. `parse_from: body.message` extracts attributes; `parse_from: body` extracts nothing, matching what the collector does with a normalized body. Log bodies render as stored rather than unwrapped, so what you see is what the pipeline operates on. Needs SigNoz/signoz#12534 to pick sample logs by body — without it the v3 query behind the sample-log list errors for these orgs. SigNoz/signoz#12535 stacks on this to surface the collector's own explanation when an operator cannot parse a log. |
||
|
|
abff2aefd8 |
fix(metrics): warn when a filtered label is missing from metadata (#12487)
A filter on a metrics label that isn't in metadata ran silently: the query fell back to reading the label directly, but nothing told the user the key was unknown. Removes the `TODO(srikanthccv)` in the metrics statement builder. ### What The detection was already written, and already in the right place. `conditionBuilder.ConditionFor` spots a filter key with no metadata match, warns, and synthesizes an attribute-context key so the query still runs — and it only ever sees terms in **key position**, so it cannot mistake a value or a dashboard variable for a key. That is exactly what the TODO was waiting for. Two things hid it: - `Build` pre-seeded the field-key map with a synthesized entry for every lexer-derived selector, so `MatchingFieldKeys` always matched and the missing-key branch was dead code. - The metrics builder never read `PrepareWhereClause`'s warnings — the visitor collects them and `unionStatements` merges them, but nothing ever set them. So: drop the pre-seeding, and carry the warnings out of `buildTimeSeriesCTE` onto the statement. ### Notes - **Generated SQL is unchanged.** The key the condition builder synthesizes (attribute context, name as written) is what the pre-seeding was injecting, so `test_missing_key_falls_back_to_labels` still expects byte-identical SQL and only gains the warning. - A full-text term routes through `labels`, which is a real column, so it takes the `isColumn` branch and stays silent — bare-word searches don't start warning. - The reduced statement prepares the same filter over the same keys, so only the main path's warnings go into the union; carrying both would show each warning twice. ### Testing - `test_missing_key_falls_back_to_labels` gains the expected warning, same SQL. - `queriermetrics/10_key_resolution.py::test_metrics_filter_unknown_label_matches_nothing` now asserts the warning instead of asserting silence. - `queriermetrics/02_warnings.py` already covered the TODO's own example (`my_tag = $tag`). It passed before only because every warning was suppressed; it is now a real guard that a value-position variable is not flagged. - `queriermetrics` integration suite: 118 passed. `go test ./pkg/statementbuilder/... ./pkg/telemetryschema/...` green. `make go-lint` and `make py-lint` clean. |
||
|
|
5b3b2865d1 |
fix(authtypes): restructure auth domain payload into a kind/spec envelope (#12472)
#### Description
- Moves the endpoints to `/api/v2/auth_domains` and removes the
`/api/v1/domains` routes — the request/response shapes changed, so they
live behind new paths instead of breaking v1 in place.
- Restructures the auth domain payload: `config` is now a `{kind, spec}`
discriminated envelope (same pattern as `RuleThresholdData` /
`EvaluationEnvelope`), replacing the old `ssoType` discriminator with
`samlConfig` / `googleAuthConfig` / `oidcConfig` sibling fields;
`ssoEnabled` and `roleMapping` move to the root as `enabled` and
`roleMapping`.
- Renames the provider kind `google_auth` → `google`, and the SAML keys
to metadata-consistent ones: `samlEntity` → `entityId`, `samlIdp` →
`location`, `samlCert` → `certificate`.
- Migrates the persisted documents too: a new sqlmigration rewrites
`auth_domain.data` into `{enabled, config: {kind, spec}, roleMapping}`,
so all legacy-shape code (storable twins, `google_auth` translation,
per-kind conversion switches) is deleted; the remaining per-kind wiring
lives in a single variant registry that `UnmarshalJSON`,
`JSONSchemaOneOf` and the discriminator mapping derive from.
- `AuthDomain` exposes the domain shape (`Enabled()`, `Kind()`,
`Config()`, `RoleMapping()`, typed spec accessors) instead of the
persisted document; `config` presence is enforced explicitly on
Postable/Updatable (the old PUT path never enforced it and could poison
a row).
- Secret fields (`clientSecret`, `serviceAccountJson`) are `format:
password` in the schema, and `GoogleConfig` loses the unused
`redirectURI` (the migration strips it from persisted documents).
- Frontend: regenerated client is a clean discriminated union; both
directions of the envelope↔form translation live in
`CreateEdit.utils.ts` with an explicit kind→provider mapping (no
cross-enum casts).
- The generated OpenAPI spec carries a real `discriminator`; the
kind/spec envelope pattern itself is documented generically in #12494,
and this PR only keeps the auth domain worked example in `types.md` in
step with the refactored types.
- Updates the google authn integration tests (#12486) to the new API,
and adds parametrized POST→GET roundtrip cases pinning the response
contract per kind (server-side defaulting, role-name normalization, null
maps) plus enforcement-toggle update coverage.
#### Issues closed by this PR
Closes SigNoz/platform-pod#2268
#### Additional Information
- Breaking change: `/api/v1/domains` is gone; the resource is now
`/api/v2/auth_domains` with the new shape. Login and SSO callback flows
are behaviorally unchanged, and existing rows are migrated in place at
startup.
- The `AuthNProvider` rename also surfaces in `/api/v2/sessions/context`
responses (`provider: "google"`) — the login page only consumes the
callback `url` — and in the reported stats key, which changes from
`authdomain.google_auth.count` to `authdomain.google.count`.
- Verified: `make go-test`, Go lint, frontend jest suites for
AuthDomain, `pnpm build`, `pnpm tsgo --noEmit`, and the full
`callbackauthn` domain suites (17 tests: roundtrip pins, the enforcement
toggle, and the google E2E flows) against a container rebuilt from this
branch — including a live run of the data migration over legacy-format
rows.
|
||
|
|
a7fd14eac9 |
refactor(metrics): alias group-by columns positionally like logs and traces (#12464)
A metric label may be named after a column the generated query builds for itself, and the metrics and meter builders selected group-by columns under the label's own name — so `group by ts` or `group by value` produced SQL with two columns of that name, which ClickHouse rejects. ### What - Metrics and meter now alias group-by columns `__GROUP_BY_KEY_<i>_<name>`, the scheme the logs and traces statement builders already use. - `pkg/querier/consume.go` already strips that prefix on all three read paths (time-series, scalar, raw), so API responses are unchanged. - Metrics' `ColumnExpressionFor` now returns the bare expression like the logs and traces mappers. It was the only one returning an aliased expression (`expr AS <name>`), which `agg_rewrite.go` splices inside a function argument — giving `sum(expr AS <name>)` if metrics ever grows expression aggregations. Callers alias and escape, as logs does. - The histogram pipeline derives its CTE-side query once — `le` appended last, plus the existing rate/sum rewrite — instead of mutating the query and restoring it around the whole pipeline. The final select takes the original minus `le`, so the remaining keys hold the positions their CTE aliases were built from. With a label named `ts`, before: ```sql SELECT ts, `ts`, multiIf(…) … GROUP BY fingerprint, ts, `ts` ``` and after: ```sql SELECT ts, `__GROUP_BY_KEY_0_ts`, multiIf(…) … ``` A label named `value` was the quieter case — the spatial CTE selected it next to the aggregate of the same name: ```sql SELECT ts, `value`, sum(per_series_value) AS value … ``` ### Notes - Meter comes along because it holds a `*metricsstatementbuilder.StatementBuilder` and calls the shared `BuildFinalSelect`; aliasing metrics alone would leave meter ordering by an alias its own select never produced. `GroupByColumnAlias` / `GroupByAliases` are exported for it, alongside the `GetKeySelectors` / `RateTmpl` already shared across that boundary. - Meter had the identical collision, so this fixes it there too. ### Testing - `TestGroupByAliasAvoidsColumnCollision` covers `ts`, `value`, `fingerprint` and an ordinary label, in both the metrics and meter builders; all three collision cases fail without the change. - `reduced_test.go` gains `histogram_p99_group_by` and `gauge_avg_avg_group_by` — the reduced path had no group-by coverage at all, so neither the aliases in its four CTE builders nor the union's `ORDER BY` were exercised. The histogram case pins that both `UNION ALL` branches emit the same columns. - `test_histogram_count_no_param` pins the `SELECT *` branch, where `le` stays unaliased so `ORDER BY toFloat64(le)` resolves. - Both new behaviours were mutation-checked: appending `le` first instead of last, and returning the bare name from `GroupByColumnAlias`, each turn the relevant tests red. - Twelve expected-SQL blobs regenerated across the metrics and meter statement builder tests — alias-only diffs. - `go test ./...` green, `make go-lint` clean. Fixes https://github.com/SigNoz/engineering-pod/issues/5868 |
||
|
|
faaed20dbd |
fix(user): revoke sessions on password reset (#12531)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
#### Description - Resetting a password via a reset token left existing sessions valid. Changing a password voluntarily already revoked them; the reset path now does the same. #### Issues closed by this PR closes: SigNoz/platform-pod#2667 |
||
|
|
b5851ce388 |
feat(infrastructure-monitoring-details): add chart description (#12430)
## Pull Request --- ### 📄 Summary > Why does this change exist? > What problem does it solve, and why is this the right approach? Instead of generic phrase, we created a single line summary for each chart title #### Screenshots / Screen Recordings (if applicable) > Include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. This helps reviewers quickly understand the impact and verify the update. Before: <img width="1755" height="1269" alt="image" src="https://github.com/user-attachments/assets/5d68bdde-1dd8-4405-ba68-90c89e685d50" /> After: <img width="1756" height="1269" alt="image" src="https://github.com/user-attachments/assets/003e2740-e25c-4cd0-8b3c-4e28959e194a" /> #### Issues closed by this PR > Reference issues using `Closes #issue-number` to enable automatic closure on merge. Closes https://github.com/SigNoz/pulse-pod/issues/196 --- ### ✅ Change Type _Select all that apply_ - [x] ✨ Feature - [ ] 🐛 Bug fix - [ ] ♻️ Refactor - [ ] 🛠️ Infra / Tooling - [ ] 🧪 Test-only --- ### 🧪 Testing Strategy > How was this change validated? - Tests added/updated: No - Manual verification: Yes - Edge cases covered: - --- ### ⚠️ Risk & Impact Assessment > What could break? How do we recover? - Blast radius: Infrastructure Monitoring - Details - Potential regressions: None - Rollback plan: Revert this commit --- ### 📝 Changelog > Fill only if this affects users, APIs, UI, or documented behavior > Use **N/A** for internal or non-user-facing changes | Field | Value | |------|-------| | Deployment Type | Cloud / OSS / Enterprise | | Change Type | Feature | | Description | We updated the documentation for each chart title to include a single line summary to give you a brief explanation about each chart. | --- ### 📋 Checklist - [x] Tests added or explicitly not required - [x] Manually tested - [ ] Breaking changes documented - [ ] Backward compatibility considered |
||
|
|
35d1869314 |
feat: add e2e for llm o11y (#12235)
## Pull Request --- ### 📄 Summary This is PR ads basic happy flow E2E for our LLM observability flow. Since most of the cases are covered by the integration test itself, we have added happy path here. We have also added test for Test tab here. So we have added an integration test for a test endpoint here. #### Issues closed by this PR Closes - https://github.com/SigNoz/engineering-pod/issues/5764 --- ### ✅ Change Type _Select all that apply_ - [x] 🧪 Test-only — E2E + integration coverage for LLM Observability - [x] 🛠️ Infra / Tooling — E2E helpers + e2e-scoped feature-flag conftest --- ### 🧪 Testing Strategy - **Tests added:** - **E2E (Playwright):** `tests/e2e/tests/llm-o11y/attribute-mapping.spec.ts`, `tests/e2e/tests/llm-o11y/llm-pricing.spec.ts` + `tests/e2e/helpers/{attribute-mapping,llm-pricing}.ts`. Both specs are `test.describe.configure({ mode: 'serial' })` and tear down what they create via the API. - **Integration (Jest/RTL/MSW):** `TestTab/__tests__/TestTab.test.tsx` — 4 cases: | Case | Time | |---|---| | runs the sample span through the mappers and renders the populated result | 447 ms | | surfaces a backend error and renders no results | 122 ms | | persists an edited span to local storage and restores it on remount | 657 ms | | resets to the sample span and clears the persisted input | 70 ms | - **Manual verification:** full LLM Observability Jest suite is green locally — **7 suites / 70 tests passed in 24.3 s** (`npx jest --verbose src/container/LLMObservability`), including the 4 new Test-tab cases. - **Edge cases covered:** Test-tab backend 500 → error surfaced and no results rendered; span input persisted across remount and cleared on reset; E2E fixture cleanup is failure-tolerant (`.catch()` on list/delete so a broken run doesn't mask the real assertion failure). - **Not yet captured:** a fully-green E2E run in CI — the e2e workflow only fires on PRs carrying the `safe-to-e2e` label (see Notes). --- ### ⚠️ Risk & Impact Assessment - **Blast radius:** none in product code. No `frontend/src` runtime file, no Go package, and no shared pytest fixture is modified — the only non-test-file change is the new `tests/e2e/conftest.py`, scoped to the `e2e` package. - **Potential regressions:** limited to CI surface. `tests/e2e/conftest.py` overrides the package-scoped `signoz` fixture with a distinct `cache_key`, so it brings up **one additional container set** for the e2e package rather than mutating the shared one — integration suites keep the stock feature set. - **Rollback plan:** revert the PR. No schema/migration changes, no runtime behaviour to unwind. --- ### 📝 Changelog | Field | Value | |------|-------| | Deployment Type | N/A | | Change Type | Maintenance | | Description | N/A — test-only, no user-facing change. | --- ### 📋 Checklist - [x] Tests added or explicitly not required - [x] Manually tested (LLM Observability Jest suite green: 7 suites / 70 tests; E2E specs exercised against a local flag-enabled stack) - [x] Breaking changes documented (none) - [x] Backward compatibility considered --- ## Notes for Reviewers --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
fe2200e887 |
feat(infra-monitoring): remove v1 infra-monitoring endpoints and any dangling code (#12538)
#### Description
- Remove all 34 v1 infra-monitoring routes:
`/api/v1/{hosts,processes,pods,nodes,namespaces,clusters,deployments,daemonsets,statefulsets,jobs,pvcs}/{list,attribute_keys,attribute_values}`
and `/api/v1/infra_onboarding/k8s/status`. The frontend is fully on
`/api/v2/infra_monitoring/*` (checks supersedes the onboarding-status
endpoint).
- Delete the now-dead implementation: `pkg/query-service/app/infra.go`,
the whole `pkg/query-service/app/inframetrics` package, and
`pkg/query-service/model/infra.go` (~8.2k lines).
- Drop `Reader` methods only used by the removed code:
`GetCountOfThings`, `GetActiveHostsFromMetricMetadata`,
`GetMetricsExistenceAndEarliestTime`.
- Delete the last dead frontend caller
`src/api/infraMonitoring/getHostLists.ts` (missed by #12415).
#### Issues closed by this PR
Part of SigNoz/pulse-pod#246
#### Additional Information
- `/api/v1/processes/list` is removed without a v2 equivalent — it was
never shipped in the UI.
- The per-entity `attribute_keys`/`attribute_values` endpoints are
superseded by the generic fields/autocomplete APIs, which the infra
pages already use.
- Verified locally: full build, and the `inframonitoring` integration
suite passes 580/580.
|
||
|
|
52a9a893c2 |
chore(user): remove deprecated user endpoints (#12530)
#### Description
- Removes the deprecated user endpoints that now have v2 replacements:
- `POST /api/v1/invite`, `GET /api/v1/user`, `GET
/api/v1/getResetPasswordToken/{id}`, `POST /api/v1/resetPassword`
- `POST /api/v2/users/{id}/roles` and `DELETE
/api/v2/users/{id}/roles/{roleId}`, superseded by `/api/v2/user_roles`
- `GET /api/v1/user/me` stays registered but returns 501 pointing at
`GET /api/v2/users/me`, following the v1 dashboard endpoints.
- Drops the handlers, module methods and types that only existed to
serve them (`DeprecatedUser`, the `user_invite` types, `PostableRole`).
- Moves the four remaining `*_cleanup` teardown tests off `DELETE
/api/v2/users/{id}/roles/{roleId}` onto `DELETE
/api/v2/user_roles/{id}`. Removal is keyed by the `user_role` entry id,
so they read it from `GET /api/v2/users/{id}` — that endpoint is not
deprecated and its other uses are untouched.
- Regenerates `docs/api/openapi.yml` and the frontend client. No
hand-written frontend code referenced the removed operations.
#### Issues closed by this PR
Closes: https://github.com/SigNoz/platform-pod/issues/2667
#### Additional Information
- `/api/v1/user/me` is a stub rather than a deletion because an
unregistered `/api/*` path falls through to the SPA catch-all and
answers 200 with `index.html`, which older mcp reads as a successful
response — a 501 fails loudly instead.
|
||
|
|
013e631c68 |
fix(translate): do not crash on use google translate (#12466)
<!--A few plain bullets saying what changed and why, for a reviewer
skimming it - not a wall of text, not a restatement of the diff, not
generated boilerplate.-->
#### Description
This PR aims to fix the issues we have with translation, today when we
enable the translation, some parts of the app crash due to how the react
works and how the translation works.
In simple works, if you have: `<button>{(var ? 'text' : 'other text')}
{icon}` it will crash because the React will represent the `text` and
`other text` as `TextNode`, and when translate is performed, it changes
the parent of this element to `font` and causes the react to be "blind",
and when trying to delete the element, it cannot find.
> Read
https://martijnhols.nl/blog/everything-about-google-translate-crashing-react
to understand more
There's many fixes that includes ignore the errors and let the app with
invalid data, or actually go ahead and find the places with this pattern
and avoid them.
I kinda mixed two approaches, I introduced a new plugin based on
https://github.com/getcouped/eslint-plugin-react-google-translate/ but
adapted a little bit for our necessity and for our codebase (with oxc).
If we only use this plugin to find and fix the places, we will find most
of the issues crashing the app, but not all of them.
Why not all? Because even our component library is not safe enough for
google translate, eg: https://github.com/SigNoz/components/issues/351
So, I also included https://npmx.dev/package/translation-resilience,
this lib has another approach to fix the issue with the TextNode:
```
Instead of swallowing errors, this shim puts the original text nodes **back** the moment the renderer touches them:
1. A document-wide `MutationObserver` recognizes translation's displacement pattern (merge, wrap, remove — a pattern renderer commits never produce) and tracks each replaced text run as a *displacement group*: the ordered renderer-owned originals with their pre-translation values, plus the wrapper nodes currently standing in for them.
2. Patched `Node.prototype.removeChild` / `insertBefore` / `appendChild` and the `nodeValue` / `data` setters detect operations on displaced text nodes and first **restore the group** — originals go back into the wrappers' position, wrappers are removed — then let the native operation proceed on a consistent tree.
3. The translator's own observer notices the restored (now updated) text and re-translates it, so the user sees fresh, translated content. The loop is self-healing: update → restore → re-translate.
The result: no crashes, **and** live data keeps updating on translated pages — in the visitor's language.
```
We could keep the lib only and no plugin? Yes, but I want to make our
app more resilient without need the help of the lib, so we can continue
to adopt/fix places that has the pattern to crash the app, and
eventually, we can remove the lib because our app is resilient enough.
<!--Reference issues using `Closes #issue-number` to enable automatic
closure on merge. -->
#### Issues closed by this PR
Closes https://github.com/SigNoz/platform-pod/issues/2912
<!--If applicable, include screenshots or screen recordings that clearly
show the behavior before the change and the result after the change. -->
#### Screenshots / Screen Recordings
https://github.com/user-attachments/assets/0225464b-1afe-46ad-afe7-25f79e25201a
<!--Anything reviewers should keep in mind while reviewing -->
#### Additional Information
This lib has a performance cost but the lib only enable itself when it
detects the translation is enabled, so our app (and users) should not
see/perceive any performance cost due to this lib. But again, this is
another reason to slowly adapt and fix all places that offers a
potential problem to google translate.
|
||
|
|
535a29adbf |
fix(query-builder): let tag add-on fields grow instead of spilling their tags (#12541)
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description - Adding a few values to **Group By** made the tags wrap onto a second row that rendered outside the field, on top of the add-on toggles below it. **Order By** and the formula Order By row had the same bug. - The add-on field pinned the antd select and its selector to `height: 36px`, so it could never grow. Both are `min-height: 36px` now — single-line selects keep the same 36px row, tag selects grow with their rows. <!--If applicable, include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. --> #### Screenshots / Screen Recordings Before <img width="1742" height="117" alt="image" src="https://github.com/user-attachments/assets/12dfccbe-d087-4857-9bd0-3b6dfa0a1da1" /> After <img width="1778" height="164" alt="image" src="https://github.com/user-attachments/assets/abeb0b38-b0ce-4749-bf1c-32fc865833b9" /> #### Issues Closed Closes https://github.com/SigNoz/pulse-pod/issues/270 <!--Anything reviewers should keep in mind while reviewing --> #### Additional Information - Broke in #11992, which put `height: 36px` on `.ant-select-selector` and moved the field's border onto it. The same `height` on the root `.ant-select` predates that but never applied, because `GroupByFilter`/`OrderByFilter` pass an inline `height: 100%` — antd was left to size the selector from its content, so the field used to grow as tags wrapped. - Checked in a headless-Chromium repro of the field using antd 5.11's select rules: 12 tags in a ~900px field hang 20px below the box on `main`, and sit inside it with this change. |
||
|
|
3d5aab744d |
fix(logs): stringify body_v2 in the v3 logs select (#12534)
#### Description Two commits: a clean revert of #12523, then a reland with the body stringified. **Why the revert.** #12523 selected `body_v2 as body` for orgs on JSON bodies. ClickHouse resolves identifiers in `WHERE` against SELECT aliases, and the v3 filter builder emits a bare `body` (`body != ''` for exists, `lower(body) like …` for contains), so every body filter started running against the JSON column and failed with `Code: 117 … Cannot parse JSON object here: while converting '' to JSON`. The pipelines preview always sends the pipeline's filter, so picking sample logs by body errored outright. **What the reland changes.** The select is `toString(body_v2) as body`, so the alias stays a String and those filters compare against the body text again. As a bonus they now actually match — before #12523 they ran against the legacy `body` column, which the collector writes empty for these orgs, so they silently matched nothing. The JSON column decoding #12523 added to `GetListResultV3` is not relanded: nothing selects a JSON column on this path now, and it failed the entire query on a row it could not unmarshal rather than just that row. Reproduced directly against ClickHouse: ```sql SELECT body_v2 AS body FROM signoz_logs.distributed_logs_v2 WHERE body != '' LIMIT 1; -- Code: 117. DB::Exception: Cannot parse JSON object here: while converting '' to JSON(...) SELECT toString(body_v2) AS body FROM signoz_logs.distributed_logs_v2 WHERE body != '' LIMIT 1; -- {"level":"error","message":"json log line","user":"alice"} ``` #### Additional Information Verified end to end on a local stack (devenv ClickHouse + a collector with `body_json_enabled`, `use_json_body` on): `body EXISTS` and `body CONTAINS` both return rows, and the body comes back as the stringified JSON. v5 is unaffected — its field mapper builds a real JSON expression instead of emitting a bare `body`, so `body EXISTS` there already worked and still returns object bodies. The response shape for v3 is a JSON string rather than the object #12523 returned. Consumers that need structure can parse it; the pipelines preview endpoint accepts either, since it types the log body as `any` and re-parses through the `normalize` pipeline. Known gaps left alone, since they predate this or need the filter builder to become JSON-aware: aggregation and group-by queries still read the empty legacy `body` column (only the list select carries the alias), body filters cannot use the `body_v2` skip indexes while stringified, and the v4 endpoint never sets the flag. |
||
|
|
a8309a1a02 |
test(qb): add integration tests for recent searches dropdown (#12045)
#### Description Adds integration tests for the Recent Searches dropdown in the query builder search editor. What's covered: - A saved recent shows up under "Recent searches" on focus - Recents filter by substring as you type - Recents stay partitioned by signal — a `traces` recent never leaks into the `logs` editor - A recent identical to what's already typed is excluded - Clicking a recent applies the whole expression and closes the popup - The dropdown caps at `RECENTS_DISPLAY_CAP` entries, newest first (asserted as a full ordered array) - The per-entry delete button removes the recent from both the dropdown and the store, without applying it #### Issues closed by this PR Closes https://github.com/SigNoz/engineering-pod/issues/5649 --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
897036968c |
feat(trace-details): add analytics events to span percentile flow (#12540)
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description Instrument the span percentile widget with product analytics: - panel toggle - time-range change - resource-attributes selector toggle - attribute selection change. Events go through the existing useTraceDetailLogEvent hook so view and traceId are injected. <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Issues closed by this PR Closes https://github.com/SigNoz/engineering-pod/issues/5908 |
||
|
|
55ef5fbc3c |
fix(infrastructure-monitoring-namespaces): wrong division for available/desired and use lastest instead of avg (#12429)
Some checks failed
build-staging / js-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
## Pull Request --- ### 📄 Summary > Why does this change exist? > What problem does it solve, and why is this the right approach? This follows the same pattern as https://github.com/SigNoz/signoz/pull/11681 to use `latest` instead of `avg`, and also fixes the calculation of `util %` that was suppose to be `desired/available * 100` instead of current value `available/desired`. #### Screenshots / Screen Recordings (if applicable) > Include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. This helps reviewers quickly understand the impact and verify the update. Before: <img width="857" height="364" alt="image" src="https://github.com/user-attachments/assets/949db1a8-c27d-41da-8573-398a4d53af24" /> After: <img width="851" height="336" alt="image" src="https://github.com/user-attachments/assets/5181849a-28e4-45f8-b7a5-0d611b5ae02e" /> #### Issues closed by this PR > Reference issues using `Closes #issue-number` to enable automatic closure on merge. Closes https://github.com/SigNoz/pulse-pod/issues/210 --- ### ✅ Change Type _Select all that apply_ - [ ] ✨ Feature - [x] 🐛 Bug fix - [ ] ♻️ Refactor - [ ] 🛠️ Infra / Tooling - [ ] 🧪 Test-only --- ### 🧪 Testing Strategy > How was this change validated? - Tests added/updated: No - Manual verification: Yes - Edge cases covered: - --- ### ⚠️ Risk & Impact Assessment > What could break? How do we recover? - Blast radius: Infrastructure Monitoring - Namespaces - Potential regressions: None - Rollback plan: Revert this commit --- ### 📝 Changelog > Fill only if this affects users, APIs, UI, or documented behavior > Use **N/A** for internal or non-user-facing changes | Field | Value | |------|-------| | Deployment Type | Cloud / OSS / Enterprise | | Change Type | Bug Fix | | Description | We updated the table for Desired (pods) inside the Namespace Details on Infrastructure Monitoring to correctly show the `util %`. | --- ### 📋 Checklist - [x] Tests added or explicitly not required - [x] Manually tested - [ ] Breaking changes documented - [ ] Backward compatibility considered |
||
|
|
49749626dc |
fix(onboarding): list multi-signal data sources under every signal they support (#12522)
#### Description - Some data sources ship a single doc that sets up two or three signals, but carried only one tag, so they showed up in exactly one section of the picker. Searching `temporal` surfaced it only under APM/Traces even though both Temporal docs configure traces, metrics and logs. - Tagged them with every signal their doc actually configures, so they list under each matching section — the same way `Deno` already does. No UI changes needed: `groupDataSourcesByTags` already fans an entry out across its tags. | entry | was | now | | --- | --- | --- | | Temporal | `apm/traces` | `apm/traces`, `logs`, `metrics` | | Nginx - OpenTelemetry (was "Nginx - Tracing") | `apm/traces` | `apm/traces`, `logs`, `metrics` | | OpenTelemetry eBPF (OBI) | `apm/traces` | `apm/traces`, `metrics` | | DBOS | `apm/traces` | `apm/traces`, `logs` | | Cloudflare Workers | `apm/traces` | `apm/traces`, `logs` | - "Nginx - Tracing" is renamed to "Nginx - OpenTelemetry" since it no longer lists only under traces, and to stay distinct from the existing built-in Nginx integration entry. #### Additional Information - All 82 docs behind the 70 single-signal-tagged entries were read to decide this; the other 77 are genuinely single-signal. Every language APM doc explicitly sets `OTEL_METRICS_EXPORTER=none` / `OTEL_LOGS_EXPORTER=none`, and the matching metrics docs set `OTEL_TRACES_EXPORTER=none` — so splits like `Java` / `Java logs` / `Java Metrics` are correct as they stand. - Left unchanged, but worth a second opinion: the logs docs for Java, Python, Node.js (Pino/Winston/Bunyan) and Golang (Logrus/Zerolog) run auto-instrumentation that emits traces, but only ever mention traces to tell you how to switch them off. Read as logs-only here. |
||
|
|
061eb1f867 |
chore(deps): bump clickhouse-sql-parser to v0.5.6 (#12536)
Some checks failed
build-staging / staging (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
### Description Bumps `github.com/AfterShip/clickhouse-sql-parser` from v0.5.5 to v0.5.6. - v0.5.6 parses a parenthesized left operand of a set operator (upstream https://github.com/AfterShip/clickhouse-sql-parser/pull/312), e.g. `(SELECT 1) UNION ALL (SELECT 2)`. - Moves the three now-passing parenthesized set-operation cases into the pass table in `clickhouse_sql_test.go` as regression canaries. - Records the outstanding `NULLS FIRST|LAST` ORDER BY gap in the known-gap table — the parser still rejects it, so it stays tracked until fixed upstream. |
||
|
|
092e0b7d99 |
refactor(qb): build IN as an OR of equalities (#12504)
#### Description
- `IN` and `NOT IN` now route each value back through the condition
builder with `=` / `!=` instead of assembling the comparisons a second
time, so whatever a builder does for a scalar comparison applies to the
list form too. Applied to logs, traces and audit — the three that
already fanned a list out into per-value comparisons.
- Fixes `body.<path>[*] IN [...]` with `use_json_body` off returning a
**500**. The list shape made the path extract as `Array(String)`, and
ClickHouse refuses to compare an array to a scalar (code 130);
extracting per value reads the field instead. The new case in
`querierlogs/06_json_body.py` fails on `main` and passes here — verified
both ways against a real ClickHouse.
#### Additional Information
- **resourcefilter is deliberately left out**: it asserts the key index
filter (`labels LIKE '%key%'`) once for the whole list, alongside one
value filter per value. A recursed arm derives its own key filter, so
the same predicate would be repeated per value — `(e1 AND kIdx AND l1)
OR (e2 AND kIdx AND l2)` instead of `(e1 OR e2) AND kIdx AND (l1 OR
l2)`. Same rows either way, but no reason to emit the duplicate.
- **telemetrymetadata is deliberately left out**: it applies a
key-existence guard at a single exit, so a recursed arm comes back
already wrapped and the guard would either nest or the case would have
to skip the shared tail — losing the invariant that every condition is
guarded.
- **metrics and rulestatehistory** build a real `sb.In`; there is no
per-value fan-out to delegate to.
- Mixed-type lists are safe: `DataTypeCollisionHandledFieldName`
normalises the whole list before the loop, so `IN ('200', 5)` emits
identical SQL before and after.
- Base of a stack — the follow-ups add index-friendly predicates to `=`,
which `IN` then picks up.
|
||
|
|
16849967c5 |
feat(frontend): register search() as a query builder function (#12513)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
#### Description Stacked on SigNoz/signoz#12491 — review that one first. #12491 makes the frontend parser lex and parse `search()`. This makes the editor act on it. Scoped to `search('x')` and `search(x)` for now — scope arguments are not handled yet. - **Function suggestion.** The cursor on `search` resolved to no context, so the suggestion list never opened and `search()` was never offered as a completion. Registered alongside the `has` family, in the same two places `hasToken` needed. - **The term is free text, not a key.** `search(x)` lexes its term as a key, so the editor offered attribute keys inside the call and would complete one into the term — and pair extraction turned it into a filter item keyed `x`, which the log detail drawer rebuilds into a real filter. Key and value suggestions are now suppressed inside a `search()` call, and its argument no longer produces a pair. `has(key, value)` does take a real key, so its suggestions are untouched. - **Logs only.** `FilterOperatorSearch` is implemented in `logstelemetryschema` alone; traces and metrics reject it as an unsupported operator, so the suggestion is gated to the logs signal. - **Recents.** `SEARCH(...)` and `search(...)` no longer dedup as two distinct recent queries. #### Additional Information `search` is a reserved word now, so `search = 'x'` and `search exists` no longer parse — the same tradeoff `has`/`hasAny` already carry, matching the backend grammar. Three things deliberately left out: - After picking any function from the autocomplete the cursor lands outside the brackets, so you have to arrow back before typing the argument. Long-standing behaviour across the whole `has` family, but `search()` is the case where an empty call is always a syntax error. Filed as SigNoz/engineering-pod#5893. - `has(key, value)` still contributes a phantom filter item keyed on its first argument, which reaches the trace waterfall's API query, the metrics drilldown and the infra filter telemetry. Fixing it needs the autocomplete to keep reading that argument as a key, so it is not a one-liner. - Scope arguments (`search('err', body)`) parse but are not supported here. `isCursorInSearchTerm` runs on every cursor move, so it text-matches `search` before paying for a lex. A `SEARCH` token only exists where the lexer matched exactly those six letters — a word character on either side would have produced a `KEY` — so the pre-check cannot produce a false negative. `body = 'search this'` is covered by a test, since only the lexer can tell that one is a quoted value. Unrelated to this PR: `QuerySearch.test.tsx › fetches key suggestions on mount for LOGS` is flaky on `main` too. An earlier test in that file types `http.` and never unmounts, so its debounced `getKeySuggestions` resolves after this test's `mockClear()` and wins the `mock.calls[length - 1]` read. |
||
|
|
c8e7685f06 |
test(integration): drop the deprecated user endpoints from the suite (#12529)
#### Description
- The integration suite was the last consumer of the five deprecated v1
user endpoints. It now provisions through `POST /api/v2/users`, `PUT
/api/v2/users/{id}/reset_password_tokens` and `POST
/api/v2/factor_password/reset`, so those routes can be deleted once the
remaining upstream consumer is deployed.
- Role assignment moves off the deprecated `POST
/api/v2/users/{id}/roles` and `DELETE /api/v2/users/{id}/roles/{roleId}`
onto `/api/v2/user_roles`. Removal is keyed by the `user_role` entry id,
so the tests read it from `GET /api/v2/users/{id}`. `GET
/api/v2/users/{id}/roles` is not deprecated and stays.
- `create_active_user` takes managed role names (`signoz-viewer`),
matching `change_user_role` and `create_service_account`.
- `find_role_by_name` moves to `fixtures/role.py` as a plain function
and replaces the `find_role_id` fixture — a stateless lookup shouldn't
be a fixture factory.
#### Issues closed by this PR
Contributes to SigNoz/platform-pod#2667
#### Additional Information
- `test_provision_user` now makes the provisioning calls inline, in
order, and covers the conflict branch that had no coverage before.
- `test_reset_password_v2` is gone; `test_reset_password` now targets v2
and absorbed its single-use-token assertion.
|
||
|
|
a3caaaf7f2 |
chore(frontend): regenerate ANTLR parser with search() support (#12491)
#### Description
- The frontend parser under `frontend/src/parser/` is generated from
`grammar/FilterQuery.g4` — the same grammar the backend query builder
uses — but the committed output predates the `search()` rule, so the UI
couldn't lex or parse `search('term')` even though the backend accepts
it. Regenerated it.
- Also fixed `scripts/grammar/generate-frontend-parser.sh`: ANTLR
reproduces the input's relative path under `-o`, so the old command
wrote to `frontend/src/parser/grammar/` instead of
`frontend/src/parser/`. It now runs from inside `grammar/`.
- Generated with ANTLR 4.13.2 (was 4.13.1), matching the `antlr4`
runtime in `frontend/package.json` and the version used for the Go
parser. That bump also adds `.js` extensions to the generated relative
imports — tsc (`moduleResolution: bundler`) and ts-jest resolve them
fine.
- Codegen only: no visitor/UI wiring for `search()` yet, so surfacing it
in autocomplete/validation is follow-up work.
#### Issues closed by this PR
Closes https://github.com/SigNoz/engineering-pod/issues/5875
#### Additional Information
- Verified with a throwaway spec (not committed) that the regenerated
parser parses `search('error')`, `search('error', body, attribute)` and
`search('error') AND service.name = 'redis'` with zero syntax errors,
and still parses `has(payload.user_ids, 123)`.
- `src/parser/**` is in both the oxfmt and oxlint ignore lists, so the
raw ANTLR output is committed unformatted, as before. Because every
staged frontend file is ignored, lint-staged's `oxfmt --write` step
errors with "Expected at least one target file" — the commit needed
`--no-verify`.
- Ran the jest suites that consume the parser (`src/utils`,
`src/components/QueryBuilderV2`, `src/lib/recentQueries`): 371 passed, 1
pre-existing failure in `QuerySearch.test.tsx` that reproduces on `main`
without these changes.
|
||
|
|
a355996a5d |
feat(logs-explorer): resolve body json fields in logs table columns (#12503)
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description In the logs explorer **table view**, a column for a field that lives inside a JSON body now shows its value instead of coming up empty. Scoped to `use_json_body` tenants. - Added a wrapper util which sits on top of existing util which provides the col values(FlatLogData). - This searches for the attribute in body json. If its not present there we will get it from attribute/resources as its happening currently. - Only does this if `use_json_body` is true. <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Issues closed by this PR Closes https://github.com/SigNoz/engineering-pod/issues/4610 <!--If applicable, include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. --> #### Screenshots / Screen Recordings Before: DB Operation col is empty <img width="3402" height="1850" alt="image" src="https://github.com/user-attachments/assets/7f8c6945-2c43-4ea6-9b82-5fd07b36c52f" /> After: DB Operation col is populated from body <img width="3346" height="1778" alt="image" src="https://github.com/user-attachments/assets/c1ae2953-986e-42d5-bef3-9bc10e932fc2" /> |
||
|
|
eea11972a9 |
fix(logs): return the JSON body from v3 query_range (#12523)
#### Description
- For orgs on JSON bodies the collector writes the legacy `body` column
empty (`processBody` blanks it unless `body_json_old_body_enabled`) and
keeps the log body in `body_v2`. The v3 logs list still selected `body`,
so every log came back with an empty body — verified on a tenant: all
2159 rows had `body = ''` and `body_v2` populated.
- `queryRangeV3` now resolves `use_json_body` for the caller's org and
the list query selects `body_v2 as body`, the same expression v5 uses.
- `GetListResultV3` decodes JSON columns into a map, mirroring the
querier's raw-row consumption — the driver cannot decode JSON into
native Go values, so it is read as raw bytes and unmarshalled. A v3
response now carries the same body object v5 returns, so clients need no
change when they move to v5.
#### Additional Information
Scoped to the v3 endpoint: `QueryRangeV4` does not set the flag, so v4
keeps selecting the legacy column even though it shares the builder. The
livetail select is untouched — `/api/v3/logs/livetail` is served by the
v5 handler now, and `PrepareLiveTailQuery` has no callers.
One difference from v5 remains by choice: v5's `postProcessLogBody`
drops an empty `message` key, so a log with an empty message reads
`{"message":""}` here and `{}` there. Nothing branches on it, and
copying that logic would be a second implementation to keep in sync on a
path we are retiring.
#12520 is stacked on this branch — it types the pipelines preview log
body as `any`, which that endpoint needs before it starts receiving the
object bodies this PR returns.
|
||
|
|
2616885d22 |
feat: adding mysql GCP service (#12514)
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description - Adding GCP integration MySQL service - Related fix: adding formula to convert CPU utilization fraction into percentage for Postgres dashboard <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Issues closed by this PR https://github.com/SigNoz/platform-pod/issues/2942 |
||
|
|
52dd57074e |
feat: filter fields with no name in field selector (#12512)
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description Filter field selector options with name field empty <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Issues closed by this PR closes https://github.com/SigNoz/engineering-pod/issues/5890 <!--If applicable, include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. --> #### Screenshots / Screen Recordings No screen recording as this is hard to reproduce. |
||
|
|
fe94b817db |
fix(promql): remove NaN and Inf values from PromQL query range response (#12388)
## Pull Request --- ### 📄 Summary Currently, builder and clickhouse queries remove NaN and Inf values, but PromQL does not. This way, it ends up in the final response. While the UI handles these values, a lot of other places in the flow do not, such as our query response caching. This can lead to unexpected issues. The current issue at hand is that while the first query range call shows the correct data, the second call (that fetches from cache) does not. Instead of fixing the caching, better to solve the problem at root level and not return non-finite values for PromQL altogether. #### Recordings On local data before the change: https://github.com/user-attachments/assets/c08ec796-a7e5-47d8-8cc5-3dfd302dba49 After the change: https://github.com/user-attachments/assets/9162c963-1a98-4ebc-83ce-759a9127b772 #### Issues closed by this PR Closes https://github.com/SigNoz/pulse-pod/issues/185 --- ### 🧪 Testing Strategy - Tests added/updated: Yes, integration and unit tests - Manual verification: Added data locally to reproduce the exact scenario --- ### ⚠️ Risk & Impact Assessment - Blast radius: PromQL queries - Rollback plan: Revert PR or just add a fix --- |
||
|
|
ea36032d96 |
fix(sentry): drop benign cancellation errors from reporting on sentry (#12524)
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description This PR drops Cancelation error from monaco on sentry to reduce noise <!--Anything reviewers should keep in mind while reviewing --> #### Additional Information Pager: https://signoz-1.pagerduty.com/incidents/Q1JG9MJ5DRA4LW Sentry: https://signoz-io.sentry.io/issues/7491905006 |
||
|
|
6ecfa839f3 |
fix(service-map): stop the resource attribute filter bar from clearing (#12521)
#### Description Selecting a filter on the Service Map cleared the filter bar instead of applying it, and the same filter then turned up applied on the Services tab. Three separate causes: - The resource attribute context filtered its queries by the current route, so a filter the map cannot apply vanished from the bar while staying in state and in the `resourceAttribute` URL param — which the sidebar carries across routes, hence it reappearing on Services. The context now exposes whatever is in the URL, and the Service Map narrows the queries for its own `/dependency_graph` request, so the request payload is unchanged. - `ServiceMap` returned early with the filter bar under a different parent element in each branch, so React tore the bar down and rebuilt it whenever the map flipped between having services and being empty (and it wasn't rendered at all while loading). It now renders once, above the loading / empty / map states. As a side effect the graph tooltip styles in `Container` finally wrap the graph rather than only the empty state. - The environment `Select` was keyed on its own value, remounting an already-controlled select on every pick and closing the dropdown before a second environment could be chosen. #### Issues closed by this PR Closes SigNoz/pulse-pod#199 #### Additional Information - Related but deliberately left out of scope: `whilelistedKeys` lists `resource_k8s_cluster_namespace`, while the backend column is `k8s_namespace_name` (`pkg/query-service/app/services/map.go`), so that filter is accepted by the UI and silently dropped server side. |
||
|
|
62d382b3cc |
fix(alerts): tolerate a null channels field when editing an existing alert rule (#12510)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
## Summary Opening an existing alert rule for editing crashes the whole page with `Cannot read properties of null (reading 'length')`. It happens when a rule's threshold has `channels: null`, which is the case for rules not created through the UI. The generated type is right — `RuletypesBasicRuleThresholdDTO.channels` is `string[] | null`. The problem is our own `BasicThreshold` wrapper type, which we keep because v1 and v2 alert shapes both exist. It says `channels: string[]`, and `fromRuleDTOToPostableRuleV2` casts the DTO straight into it with `as unknown as`. So the null reaches our code while the compiler thinks it can't. `getThresholdStateFromAlertDef` copied that null into state, and the footer validator then read `.length` on it during render, which takes down the page instead of failing one field. This PR defaults `channels` to `[]` where the API data becomes local state, so the validator, the payload builder and both channel dropdowns are all safe. The validator also gets an optional chain, since a throw there can't be recovered. This is a guard, not the real fix. The cast in `fromRuleDTOToPostableRuleV2` is the actual gap, and the same wrapper also claims `spec` is non-nullable when the generated type allows null — so `spec.map` and `spec[0].op` in the same function can still crash. Worth fixing at the converter. ## Test plan One test per guard. Both fail with the original error when the fix is reverted. - `pnpm jest src/container/CreateAlertV2/` — 420 pass, 28 suites - `oxfmt`, `oxlint`, `tsgo --noEmit` clean Closes https://github.com/SigNoz/pulse-pod/issues/261 |
||
|
|
cc07e2fa24 |
fix(alert-channel-integrations): de-flake the Google Chat alert channel save tests (#12509)
## Summary The Google Chat save test fails on CI now and then with `Exceeded timeout of 5000 ms for a test`. The two Google Chat tests fill the form with `userEvent.type()`, which sends one keystroke at a time. Each keystroke re-renders the whole form. The payload test types 91 characters, so it takes ~850ms locally. CI is about 5x slower, which puts it near the 5s limit. A busy runner then pushes it over. This PR pastes the values instead of typing them. One event per field, same assertions. | Test | Before | After | | --- | --- | --- | | `saving sends a googlechat_configs payload` | 847 ms | 283 ms | | `saving with a webhook url outside chat.googleapis.com` | 590 ms | 326 ms | Nothing regressed. The new test was added recently to an already existing suite. It was always close to the limit. ## Test plan - `pnpm jest src/container/AllAlertChannels/__tests__/CreateAlertChannel.test.tsx` — 57/57 pass, 3 runs - `oxfmt`, `oxlint`, `tsgo --noEmit` clean Closes https://github.com/SigNoz/pulse-pod/issues/259 |
||
|
|
d7aa63f1bc |
fix(infrastructure-monitoring): migrate having clause to new format (#12467)
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description This fixes the bad migration I did at https://github.com/SigNoz/signoz/pull/11060, and correctly fixes the expressions for `having` clause inside the charts. <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Issues closed by this PR Closes https://github.com/SigNoz/platform-pod/issues/2905 Closes https://github.com/SigNoz/pulse-pod/issues/212 <!--If applicable, include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. --> #### Screenshots / Screen Recordings | Before | After | |--------|--------| | <img width="2156" height="1081" alt="screenshot-2026-08-07_17-15-41" src="https://github.com/user-attachments/assets/b5617e88-2d63-4a21-915f-d21ed78f9f8b" /> | <img width="2148" height="1075" alt="screenshot-2026-08-07_17-12-06" src="https://github.com/user-attachments/assets/4de3ffd0-533f-4b3b-81ac-df1515b4a076" /> | | <img width="2145" height="357" alt="screenshot-2026-08-07_17-16-08" src="https://github.com/user-attachments/assets/0bfb92f3-e0c4-4cf6-9e4e-62068501da96" /> | <img width="2146" height="360" alt="screenshot-2026-08-07_17-11-54" src="https://github.com/user-attachments/assets/bba8ee82-68cd-4205-951f-711adaad07e0" /> | | <img width="1074" height="356" alt="screenshot-2026-08-07_17-15-55" src="https://github.com/user-attachments/assets/574430b4-8547-4a1e-b53a-982ef33344ae" /> | <img width="1074" height="363" alt="screenshot-2026-08-07_17-11-44" src="https://github.com/user-attachments/assets/bf5698af-f7fb-45b6-886a-bc8ed4aba808" /> | |
||
|
|
c36b748370 |
feat: ai-011y quickfilters support (#12406)
## Pull Request --- ### 📄 Summary AI 011y quickfilter Will add the migration later. #### Issues closed by this PR Part of https://github.com/SigNoz/engineering-pod/issues/5714 --- ### ✅ Change Type _Select all that apply_ - [x] ✨ Feature - [ ] 🐛 Bug fix - [ ] ♻️ Refactor - [ ] 🛠️ Infra / Tooling - [ ] 🧪 Test-only --- ### 🧪 Testing Strategy > How was this change validated? - Tests added/updated: - Manual verification: - Edge cases covered: --- ### ⚠️ Risk & Impact Assessment > What could break? How do we recover? - Blast radius: None - Potential regressions: - Rollback plan: --- |
||
|
|
89bf0f953a |
chore(frontend): drop the dead v1 invite client and its mocks (#12511)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
#### Description - `sendInvite` has had no call sites since the invite flow moved to `POST /api/v2/users`. Removing it orphans its types file, the two MSW handlers for `/api/v1/invite` and `/api/v1/user`, and the members mock data they served. - No product behaviour changes; nothing in the app or the tests requested either endpoint. #### Issues closed by this PR Contributes to SigNoz/platform-pod#2667 |
||
|
|
a850f548f8 |
chore: remove normalized metrics compatibility (#12470)
we no longer need it, helps with the upcoming sem conv change - the `transition.go` will go away completely when the sem conv support for metrics added - we will add deprecation notice and migration guide for infra monitoring v1 apis just in case if anyone using it and then remove it altogether areas touched and tested - services - logs detailed page node/pod metrics for a log - message queues |
||
|
|
5bf6fd9192 |
fix(savedview): handle old invalid data in specs (#12477)
## Summary
- Handle malformed selectedFields in the extradata in the migration and
new migration to fix in the already migrated cases.
- Restructure saved-view create/update/get payloads so
`schemaVersion`/`spec` are top-level (unwrapping the old `data`
nesting), matching how dashboards and rules shape their wire types.
- Publish `schemaVersion` as an `enum: [v2]`
- Make `display` and `selectedFields` optional in the OpenAPI schema
- Declare `409` on `CreateSavedView`
- Require `minItems: 1` on `queries`
New API contract in [below
comment](https://github.com/SigNoz/signoz/pull/12477#issuecomment-5230041074),
follow up on https://github.com/SigNoz/signoz/pull/12342
Closes https://github.com/SigNoz/engineering-pod/issues/4651
Notes to reviewer:
- Please pay attention to the last case in above linked comment for
partial display field updates.
- Still assuming that [migration
046](
|
||
|
|
13f2ba7d34 |
fix(dashboard-v2): stop a time-range change resetting a dynamic variable's selection to ALL (#12416)
## Summary On a V2 dashboard, picking values in a multi-select variable and then changing the time range could silently switch the variable to **ALL** — widening every panel to all values without the user touching the variable. A value *typed into* a variable was dropped on any refetch for the same underlying reason. The post-fetch reconcile compares a selection against freshly-fetched options and could not tell *why* those options changed: "the user has nothing selected yet" and "the user's selection was just invalidated by a refetch" arrived as the same input, and both resolved to the variable's default — ALL for an ALL-enabled multi-select. A time-range change refetches every variable, so any window without data for the selected value hit that path. Two guarantees now, each with its own mechanism: | Guarantee | Mechanism | | --- | --- | | A refetch nothing else caused (time range, reload) never re-defaults a selection | The fetch engine tags each cycle with why it was enqueued; only a value cascade may re-default | | A typed-in value survives every refetch, whatever caused it | The selection records which entries were typed, judged at pick time against the options then offered | A parent variable's value changing still re-scopes its children — that behaviour is unchanged and intended. Single-select variables have preserved a non-empty value since #12178; this brings multi-select in line, which is the half that was left untouched then. Also fixed, same family: opening and closing the dropdown without touching it promoted an explicit pick into a standing ALL whenever the current window offered only the selected values, and rewrote a dynamic ALL's `__all__` into concrete values. Closes https://github.com/SigNoz/pulse-pod/issues/207 ## Commits 1. `refactor` — record why each variable fetch cycle was enqueued (full cycle vs value cascade) 2. `fix` — keep a variable's selection across a time-range refetch 3. `fix` — keep typed-in variable values through every refetch; ALL now means exactly the option set 4. `fix` — a no-op close of the variable list commits nothing; commit rule extracted out of the component Each commit typechecks on its own. ## Test plan - [x] `jest src/pages/DashboardPageV2` — 136 suites / 1073 tests pass, including 20 added: the reconcile split by cycle reason, the cycle tagging in the store, a time-range change tagging every variable as a full cycle, the typed-value rules, and the commit resolver - [x] `tsgo --noEmit` clean, at every commit - [x] `oxlint` and `oxfmt --check` clean on the changed files - [x] Manual: multi-select variable, pick one value, switch to a window with no data for it → selection holds, panels show no data rather than everything - [x] Manual: type a custom value into a variable, change the time range and switch a sibling variable → the typed value stays selected - [x] Manual: namespace → pod pair, change namespace → pod values still re-scope ## Notes for reviewers - `customValues` is new on the runtime selection and is persisted with it. It never reaches the wire or a shared link: `buildVariablesPayload` and the share-URL builder both project `value` / the `__all__` sentinel explicitly. - A selection seeded from a `?variables=` share link carries no typed-value marker — that URL format stores `name → value` only, so a typed value from a link is indistinguishable from a fetched one and a cascade can still drop it. - The pill can still *read* ALL when the current option list happens to be a subset of the selection: `CustomMultiSelect` infers that from `options ⊆ value`, and V1 depends on the inference. It is display-only now and self-corrects as the window widens; making it exact needs an explicit prop on the shared control. |
||
|
|
848046de91 |
fix: allow deletion of legacy dashboards via delete api (#12500)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
#### Description If a dashboard failed to migrate to the new schema, currently the delete API does not delete them. This PR changes it to be able to delete those un-migrated dashboards as well. #### Issues closed by this PR Closes https://github.com/SigNoz/signoz/issues/12390 |
||
|
|
68e61af0be |
test: adding tests for covering GCP integrations across APIs (#12501)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description Added missing tests for covering GCP integrations API, which initially was just covering AWS <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Issues closed by this PR https://github.com/SigNoz/platform-pod/issues/2899 |
||
|
|
84780acee1 |
test(integration): drop the 10k filter-expression fuzz test (#12505)
#### Description - Removes `test_filter_expressions_no_server_error`, which fires all 9,999 lines of `filter_expressions_10000.txt` at the logs endpoint, one request at a time. It dominates a local integration run, enough that the habit is to comment it out first. - It asserted almost nothing: both `200` and `400` pass, so all it checked was that the server didn't crash. - Its corpus has no `[*]` array paths, so it missed `body.<path>[*] IN [...]` returning a 500 — exactly the failure it exists to catch. That one is fixed in #12504, with a targeted case that asserts the rows returned. - Deletes the corpus file too; nothing else reads it. `test_not_filter_expression` is untouched and its 11 cases still pass. #### Additional Information This does give up cheap crash-fuzzing breadth in CI, where runtime matters less than it does locally. If that breadth is worth keeping, the alternative is a much smaller curated corpus that includes the shapes this one misses — happy to do that instead. |
||
|
|
c70b2be4d5 |
feat(frontend): save recent searches from summary and infra detail pages (#12054)
## Pull Request --- ### 📄 Summary The "Recent searches" dropdown (introduced in #11523) is built into the `QuerySearch` editor and reads from per-signal localStorage buckets, but entries were only ever **saved** by the QueryBuilder provider's `handleRunQuery` — a path only the Logs/Traces/Metrics explorers go through. Every other page embedding `QuerySearch` runs queries through local handlers, so searches run there displayed explorer recents but were never captured themselves. This PR closes that gap for: | Route | Surface | Save triggers | |---|---|---| | `/metrics-explorer/summary` | Metrics Summary search bar | Run button, Cmd+Enter | | `/infrastructure-monitoring/hosts` | Host details drawer → Logs / Traces tabs | Run button, Cmd+Enter | | `/infrastructure-monitoring/kubernetes` | Entity details drawer → Logs / Traces / Events tabs | Run button, Cmd+Enter | **Approach:** rather than fabricating a fake composite query on each page, a new expression-level helper `saveRecentQueryByExpression(dataSource, expression, source?)` is added to `lib/recentQueries`. It owns the shared policy (trim → `validateQuery` → signal check → save), and the existing composite-level `saveRecentQuery` now delegates to it, so validation rules live in exactly one place. Saves land in the same per-signal buckets the dropdown already reads, so recents are shared with the explorers both ways. Deliberate choices: - **Infra entity tabs** save the user-typed expression only (not the combined entity-scoped one), matching what the recents dropdown inserts back into the editor. - Expressions are now stored trimmed; dedup was already trim-insensitive, so this only cleans up display labels. #### Screenshots / Screen Recordings (if applicable) https://github.com/user-attachments/assets/852c6273-c797-4281-ac8c-be57eedf5d77 #### Issues closed by this PR Closes https://github.com/orgs/SigNoz/projects/39/views/11?filterQuery=assignee%3Atewarig&pane=issue&itemId=210386109&issue=SigNoz%7Cengineering-pod%7C5650 --- ### ✅ Change Type _Select all that apply_ - [ ] ✨ Feature - [x] 🐛 Bug fix - [ ] ♻️ Refactor - [ ] 🛠️ Infra / Tooling - [ ] 🧪 Test-only --- ### 🐛 Bug Context --- ### 🧪 Testing Strategy - Tests: existing `lib/recentQueries` unit tests still pass (37/37) — `saveRecentQuery` now routes through the new helper, so its behaviour stays covered. - Manual verification: `tsgo --noEmit`, `oxlint` (no new warnings), and production build all pass. - Edge cases covered: invalid/partial expressions are rejected by `validateQuery` before saving; empty/whitespace-only expressions and unsupported data sources are no-ops. --- ### ⚠️ Risk & Impact Assessment --- ### 📝 Changelog | Field | Value | |------|-------| | Deployment Type | Cloud / OSS / Enterprise | | Change Type | Bug Fix | | Description | Searches run on Metrics Summary and Infra Monitoring entity detail tabs (Logs/Traces/Events) now appear in the "Recent searches" dropdown, shared with the explorers. | --- ### 📋 Checklist - [x] Tests added or explicitly not required - [x] Manually tested - [x] Breaking changes documented - [x] Backward compatibility considered --- ## 👀 Notes for Reviewers --- --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
cda2955b93 |
feat(members): assign member roles through the user_roles API (#12498)
#### Description
- Member role assignment used the deprecated `POST` / `DELETE
/api/v2/users/{id}/roles`. It now uses `POST` and `DELETE
/api/v2/user_roles`, which had no consumers until now.
- Roles are read from `useGetUser` instead of `useGetRolesByUserID`,
because the delete route is keyed by the `user_role` join row and only
that response carries its id.
#### Issues closed by this PR
Closes SigNoz/platform-pod#2918
#### Screenshots / Screen Recordings
https://github.com/user-attachments/assets/4c0790fb-a93e-4c37-8608-51fe03d4d962
#### Additional Information
- `EditMemberDrawer` already issues the same `useGetUser` query, so the
two share one request and the component itself needed no change.
|
||
|
|
1a293652f7 |
fix(sentry): drop benign aborted/cancelled requests from error reporting (#12495)
<!--A few plain bullets saying what changed and why, for a reviewer
skimming it - not a wall of text, not a restatement of the diff, not
generated boilerplate.-->
#### Description
This PR filters network request aborts via fetch and axios in beforeSend
so they stop surfacing as Sentry issues.
- axios: ECONNABORTED ("Request aborted"), ERR_CANCELED
- native fetch: AbortError
<!--Reference issues using `Closes #issue-number` to enable automatic
closure on merge. -->
#### Issues closed by this PR
<!--If applicable, include screenshots or screen recordings that clearly
show the behavior before the change and the result after the change. -->
#### Screenshots / Screen Recordings
<!--Anything reviewers should keep in mind while reviewing -->
#### Additional Information
<!--Please delete paragraphs that you did not use before submitting.-->
|
||
|
|
0f3fb71067 |
feat(reset-password): use the v2 endpoint on the reset password page (#12492)
#### Description - The reset password page still called the deprecated `POST /api/v1/resetPassword`. It now uses the generated `useResetPassword` hook, which targets `POST /api/v2/factor_password/reset`. - Deletes the hand-written v1 client and its types; nothing else referenced them. #### Issues closed by this PR Contributes to SigNoz/platform-pod#2667 #### Screenshots / Screen Recordings https://github.com/user-attachments/assets/9804f619-5928-4c72-83a2-2aae16855e7f #### Additional Information - Manual `loading` and `errorMessage` state give way to the hook's `isLoading` and `convertToApiError`, matching how `ForgotPassword` consumes its generated hook. - Once this merges, `POST /api/v1/resetPassword` has no callers left in the product. |
||
|
|
b4f5b3eddf |
fix(query-builder): normalise doc length in codemirror fixing Selection points outside of document error (#12496)
Setting the query expression to a value containing CRLF line breaks crashed the search bar with "RangeError: Selection points outside of document". CodeMirror normalises CRLF to LF when building a change, so the resulting document is shorter than the raw string. The selection anchor used value.length (pre-normalisation), which pointed past the end of the document. Build the ChangeSet first and anchor the selection at changes.newLength, the actual post-change document length. Adds a regression test. <!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description To fix the above mentioned problem, we now switch the cursor position from `value.length` (which is not yet normalized by CodeMirror) to `changes.newLength`, which is the normalized length. Added test case <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Issues closed by this PR Closes https://github.com/SigNoz/engineering-pod/issues/5869 <!--If applicable, include screenshots or screen recordings that clearly show the behavior before the change and the result after the change. --> #### Screenshots / Screen Recordings Before https://github.com/user-attachments/assets/ec7a3182-177f-4545-9bae-83ee0c3a61db After https://github.com/user-attachments/assets/06350698-1960-47c2-b65e-81ea2d10b15d |
||
|
|
b9f4fcd681 |
chore(telemetrytypes): introduce LogicalField (#12499)
Some checks failed
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
Possible options 1. The compatibility keys maps (the approach already in the code). `backward_compat_keys.go` makes an alias key at metadata time. We rejected this option because of evidence. The alias key resolves, but it reads the wrong data. It prepares to `attributes_string['<alias>']`, and that physical key does not hold the data. 2. The flat multi-key. `GetKeys` returns multiple keys in order, and the downstream code uses the list. The option fails on semantics. It removes one piece of information that the downstream must have. The downstream must know the difference between two cases: - Two keys are the same field with two spellings so we can merge them into one expression. - Two keys are different fields with the same name. The condition builder must make one condition for each key. The operator connects the conditions. Three failures show the problem: - Negative operators connect with OR across the keys. A row that has only one spelling then always matches. Example: `env != 'prod'` matches each row that does not have one of the two keys. - A row that has both spellings with different values gets no clear result. - A value position (group-by, select) needs exactly one expression for one field. A flat list cannot point to that expression. The information must live somewhere. 3. Annotations on `TelemetryFieldKey` Maintain the `SemconvMembers` and `SemconvMaterializedColumns` fields on the keys. The information is the same as in option 4. But it's awkward because "these N keys are one family, in this order" lives in N copies, one copy on each key. 4. introduce `LogicalField` The information is the same as in option 3, but the structure holds it: - The slice is the ambiguity. - The group is the family. - The member order is the precedence. The code sorts the members one time, by family rank, at construction. - The members point to the metadata entries. The code copies nothing and changes nothing. - The identity (signal, context, data type) is on the group. A merge across contexts or data types is not possible. The design does not avoid that merge; the design cannot express it. Co-authored-by: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
0dd9a156b9 |
feat(log-details): add highlights section to log details drawer [2/3] (#12425)
## Pull Request --- ### 📄 Summary > Why does this change exist? > What problem does it solve, and why is this the right approach? **What it does:** Slice 2 of the log-details drawer revamp, a new **Highlights** row at the top of the drawer that surfaces a log's key fields as chips. Gated behind `isLogDetailsV2` (ships off). Stacked on the header PR (#12310 / `feat/log-detail-revamp`); the DataViewer lands in the next PR. **Change points** - New Highlight section added. Check screenshot - Driven by config. - Severity chip color - Trace id click opens trace details page in new tab - Tests updated #### Screenshots / Screen Recordings (if applicable) <img width="2158" height="834" alt="image" src="https://github.com/user-attachments/assets/9b9af5b0-8437-4a6d-8b34-e97b0d55de26" /> <img width="2308" height="920" alt="image" src="https://github.com/user-attachments/assets/69e3702f-cc25-4570-87d2-67a000925705" /> #### Issues closed by this PR > Reference issues using `Closes #issue-number` to enable automatic closure on merge. --- ### ✅ Change Type _Select all that apply_ - [x] ✨ Feature - [ ] 🐛 Bug fix - [ ] ♻️ Refactor - [ ] 🛠️ Infra / Tooling - [ ] 🧪 Test-only --- ### 🐛 Bug Context > Required if this PR fixes a bug #### Root Cause > What caused the issue? > Regression, faulty assumption, edge case, refactor, etc. #### Fix Strategy > How does this PR address the root cause? --- ### 🧪 Testing Strategy > How was this change validated? - Tests added/updated: - Manual verification: - Edge cases covered: --- ### ⚠️ Risk & Impact Assessment > What could break? How do we recover? - Blast radius: - Potential regressions: - Rollback plan: --- ### 📝 Changelog > Fill only if this affects users, APIs, UI, or documented behavior > Use **N/A** for internal or non-user-facing changes | Field | Value | |------|-------| | Deployment Type | Cloud / OSS / Enterprise | | Change Type | Feature / Bug Fix / Maintenance | | Description | User-facing summary | --- ### 📋 Checklist - [ ] Tests added or explicitly not required - [ ] Manually tested - [ ] Breaking changes documented - [ ] Backward compatibility considered --- ## 👀 Notes for Reviewers <!-- Anything reviewers should keep in mind while reviewing --> --- |
||
|
|
f44d6c7c84 |
docs(contributing): document the kind/spec envelope for sum types (#12494)
#### Description - Documents the kind/spec envelope pattern for sum types in `docs/contributing/go/types.md`: the envelope shape, why it goes at the point of variance rather than the resource root, the tagging-style rationale (adjacently tagged vs internally tagged vs sibling optional fields), the validating `UnmarshalJSON`, the OpenAPI variant structs, and the data-migration-vs-storable-twin trade-off for legacy persisted shapes. - Examples are generic (`FooConfig` with `bar`/`baz` kinds), with `RuleThresholdData`, `EvaluationEnvelope` and the dashboard plugins as the in-tree references. - Cross-links from `handler.md`'s "`oneOf` with a discriminator" section, which keeps owning the schema mechanics. |
||
|
|
90d280d871 |
feat: add ai explorer tab (#12484)
#### Description So in this PR , we have introduced a new rapper for AI o11y explorer . we will be introducing new changes inside this tab. #### Issues closed by this PR https://github.com/orgs/SigNoz/projects/39/views/11?filterQuery=assignee%3Atewarig&pane=issue&itemId=223105731&issue=SigNoz%7Cengineering-pod%7C5842 #### Screenshots / Screen Recordings This is just a demo of Shell - https://github.com/user-attachments/assets/f647def2-f43d-46e7-850c-98330a7232b7 #### Additional Information We have enabled this Shell now , since anyway. ai o11y is behind a flag. Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
1ab44d4244 |
feat(integrations): add GCP cloud integration (#12210)
## Pull Request --- ### 📄 Summary > Why does this change exist? > What problem does it solve, and why is this the right approach? Adds **Google Cloud Platform** as a cloud integration, bringing GCP to parity with the existing AWS and Azure integrations. Users can now connect a GCP account and manage which projects are monitored, directly from the Integrations UI. The integration reuses the shared cloud-integration surfaces (services list, service details, account actions, header) and adds the GCP-specific data-entry flows on top doc - https://app.notion.com/p/signoz/GCP-Integration-frontend-requirements-39cfcc6bcd1980b39428e1e66a77893b#39cfcc6bcd19808aa9bccef55661bf9d Artifacts- https://claude.ai/design/p/3591c3c0-3cc5-42ca-9ff9-dc8698e4d4dc?file=GCP+Integration.dc.html The commits are stacked so that **each one type-checks, builds, and runs on its own** — you can check out any commit and use the GCP page in the state that commit describes: 1. |
||
|
|
cd8346a91a |
test(callbackauthn): cover the google authn flow end to end (#12486)
#### Description - Adds end-to-end coverage for the google authn flow (`callbackauthn/04_google.py`): happy-path login, hd-claim mismatch rejection, unverified-email rejection + `insecureSkipEmailVerified` opt-in, and roleMapping defaultRole. - The google callback authn hardcodes `https://accounts.google.com` as its issuer and fully verifies the RS256 id_token, so a wiremock container impersonates Google: it joins the test network under the `accounts.google.com` alias and serves HTTPS with a certificate issued by a new integration CA (`tests/fixtures/tls.py`), which every signoz container now trusts via `SSL_CERT_FILE`. - Stubs (discovery, auto-approving authorize, token, JWKS) are installed per test via the existing `make_http_mocks` fixture with a pre-signed id_token for the identity under test; one session-scoped RSA key signs all tokens. |
||
|
|
db5f4b4cd5 |
feat(user): add v2 reset password endpoint (#12489)
#### Description - `POST /api/v1/resetPassword` was the last password endpoint with no v2 equivalent. Adds `POST /api/v2/factor_password/reset`, next to the existing `/factor_password/forgot`, so the whole recovery flow lives under one namespace. - v1 keeps working and is now marked deprecated. Both routes share the same handler, so behaviour is identical. - A malformed request body now returns a structured 400 instead of a 500. This applies to v1 too, since the handler is shared. #### Issues closed by this PR Contributes to SigNoz/platform-pod#2667 #### Additional Information - The generated frontend client is included because CI re-runs `pnpm generate:api` and fails on drift. The UI still calls v1; moving it to the new `useResetPassword` hook is a separate PR to keep review ownership split. - Not fixed here: a reset doesn't revoke existing sessions, though a voluntary password change does. Worth its own ticket. |
||
|
|
3bd9b2a96a |
feat(log-details): update log details header (#12310)
## Pull Request --- ### 📄 Summary > Why does this change exist? > What problem does it solve, and why is this the right approach? Slice 1 of the log-details drawer revamp, a reworked drawer **header**, gated behind the new `isLogDetailsV2` flag (ships off). Highlights and the DataViewer land in the following stacked PRs. **Change points** - Added a new **Log Details Header** with: - A formatted timestamp based on the user's timezone - A ⋯ menu with **Copy log** and **Copy link to log** - Up/down arrows to move between logs - An optional **Open in Explorer** button - Moved the log navigation logic into a separate `useLogNavigation` hook - Updated the Log Details drawer: - Shows the new header when the feature flag is on (otherwise keeps the old title) - Replaced the WARN/ERROR divider with `LogStateIndicator`, which shows colors for all log levels - Moved the copy actions into the ⋯ menu and removed the old inline copy button in V2 - Uses the new navigation hook for both keyboard shortcuts and header arrows - Updated the copy link handler: - `onLogCopy` now accepts an optional click event, so it can be called from the ⋯ menu - Moved the "Copied to clipboard" toast from the top-right to the bottom-right - Everything is gated behind feature flag for now #### Screenshots / Screen Recordings (if applicable) https://github.com/user-attachments/assets/4a73e299-4715-4feb-81e3-762fdc3d0757 #### Issues closed by this PR > Reference issues using `Closes #issue-number` to enable automatic closure on merge. --- ### ✅ Change Type _Select all that apply_ - [ ] ✨ Feature - [ ] 🐛 Bug fix - [ ] ♻️ Refactor - [ ] 🛠️ Infra / Tooling - [ ] 🧪 Test-only --- ### 🐛 Bug Context > Required if this PR fixes a bug #### Root Cause > What caused the issue? > Regression, faulty assumption, edge case, refactor, etc. #### Fix Strategy > How does this PR address the root cause? --- ### 🧪 Testing Strategy > How was this change validated? - Tests added/updated: - Manual verification: - Edge cases covered: --- ### ⚠️ Risk & Impact Assessment > What could break? How do we recover? - Blast radius: - Potential regressions: - Rollback plan: --- ### 📝 Changelog > Fill only if this affects users, APIs, UI, or documented behavior > Use **N/A** for internal or non-user-facing changes | Field | Value | |------|-------| | Deployment Type | Cloud / OSS / Enterprise | | Change Type | Feature / Bug Fix / Maintenance | | Description | User-facing summary | --- ### 📋 Checklist - [ ] Tests added or explicitly not required - [ ] Manually tested - [ ] Breaking changes documented - [ ] Backward compatibility considered --- ## 👀 Notes for Reviewers <!-- Anything reviewers should keep in mind while reviewing --> --- |
||
|
|
c4e6487e0d |
chore(frontend): remove the loginPrecheck mock for a removed endpoint (#12485)
#### Description - Removes the msw mock for `/api/v1/loginPrecheck` — the endpoint no longer exists in the backend and nothing in the frontend calls it anymore; the login flow runs on `/api/v2/sessions/context`. |
||
|
|
40aa322cc3 |
feat(invite): accept multiple roles per invited member (#12476)
Some checks failed
build-staging / prepare (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
#### Description - Invited members can now be given more than one role. The picker was single-select even though `POST /api/v2/users` has accepted a list of roles since custom roles landed. - Frontend only — nothing changed on the backend, the grant chain was already multi-role. - Onboarding analytics now emits `teamMembers[].roles` as a list, replacing the singular `role` key. #### Issues closed by this PR Closes SigNoz/platform-pod#2920 #### Screenshots / Screen Recordings #### Members Page https://github.com/user-attachments/assets/8b556549-789c-4ddf-b4af-5994eccc75f3 #### Onboarding Flow https://github.com/user-attachments/assets/a6dde5d3-e9b4-48c1-965f-352bb0a6a89f #### Additional Information - A row still requires at least one role to be considered valid. - Existing invite tests moved to `findByTitle` for role options, matching how `EditMemberDrawer` already drives the multi-select. |
||
|
|
2a2b393146 |
chore(user): remove the deprecated user by id endpoints (#12474)
#### Description
- Removes `GET`, `PUT` and `DELETE /api/v1/user/{id}` — all deprecated
and superseded by `/api/v2/users/{id}`, which the frontend already uses.
- Drops the dead code this leaves behind: the `SelfAccess` middleware
and `Claims.IsSelfAccess` (no callers left), the deprecated update
setters, and three `DeprecatedUser` helpers.
- Points the integration tests that deleted users at `DELETE
/api/v2/users/{id}`.
#### Issues closed by this PR
Contributes to SigNoz/platform-pod#2667
#### Additional Information
- Behaviour change: the removed `GET`/`PUT` were `SelfAccess`, the v2
equivalents are `AdminAccess`. Self-serve reads and updates go through
`/api/v2/users/me`, which is what the UI already calls — but worth a
second pair of eyes.
- `DELETE /api/v1/user/{id}` was the most widely reached of the three.
Please confirm nothing external (zeus) still calls it before merging.
- OpenAPI spec and the generated frontend client are regenerated, not
hand-edited.
|
||
|
|
b904aca1a8 |
chore(user): remove the deprecated bulk invite endpoint (#12473)
#### Description - Removes `POST /api/v1/invite/bulk` — already deprecated, superseded by `POST /api/v1/invite`, and no callers left. - `Setter.CreateBulkInvite` stays; `CreateInvite` still delegates to it for the single-invite case. #### Issues closed by this PR Contributes to SigNoz/platform-pod#2667 #### Additional Information - OpenAPI spec and the generated frontend client are regenerated, not hand-edited. - The `integrationci / fmtlint` failure here is not from this PR — `make py-lint` is broken on `main`. Fixed separately in #12475; this PR needs that merged (or a rebase on it) to go green. - First of three PRs splitting a v1 user-API cleanup. The other two also regenerate the spec and generated client, so whichever merges second needs the generators re-run. |
||
|
|
530c050b71 |
fix(tests): call Metrics.load_from_file directly in the pods filter test (#12475)
#### Description - `make py-lint` is failing on `main` with `F821 Undefined name _load_pods_metrics` at `inframonitoring/02_pods.py:471`, which blocks every open PR. - `test_pods_filter_pagination_and_ordering` calls a helper that no longer exists. Replaced with `Metrics.load_from_file(get_testdata_file_path(...))`, matching the two other tests that seed `pods_phases.jsonl`. #### Additional Information - How it broke: #12460 replaced the module-level `_load_pods_metrics` with a `load_pods_metrics` fixture, then #12462 dropped that fixture in favour of calling `Metrics.load_from_file` directly. #12278 branched before either landed and merged after, re-introducing one call to the long-gone helper. Git merged cleanly because the branches touched different lines, so nothing flagged it. - No behaviour change: the broken call passed no `start_time`, so no placeholder substitution happened; `load_from_file` with `label_substitutions=None` does the same earliest-to-`base_time` rebase. The replacement is byte-identical to the two sibling call sites for the same dataset. |
||
|
|
bfa174ce2a |
refactor: removing logs support for gcp integration services (#12471)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
<!--A few plain bullets saying what changed and why, for a reviewer skimming it - not a wall of text, not a restatement of the diff, not generated boilerplate.--> #### Description Disabling logs support for all GCP integration services. Reasons: 1. googlecloudpubsubpush receiver needs to reach Alpha stability, thus not included in contrib build -> can't suggest for logs 2. signoz otel collector includes this receiver in the build but it needs upgrade to v0.158.0 for a metrics related [fix](https://github.com/open-telemetry/opentelemetry-collector-contrib/pull/49826) -> needs more testing hence can't suggest either Decision was taken to go ahead without logs for now - follow [ticket here](https://github.com/SigNoz/platform-pod/issues/2901) for details. <!--Reference issues using `Closes #issue-number` to enable automatic closure on merge. --> #### Contributes to https://github.com/SigNoz/platform-pod/issues/2901 <!--Anything reviewers should keep in mind while reviewing --> #### Additional Information The explanation above should be enough <!--Please delete paragraphs that you did not use before submitting.--> |
||
|
|
85bf5ce644 |
feat(infra-monitoring): filter by pod status (#12278)
## Pull Request --- ### 📄 Summary Adds a `filterByPodStatus` secondary filter to the v2 infra-monitoring list APIs (pods, nodes, namespaces, clusters, deployments, statefulsets, jobs, daemonsets). Pod status is a derived kubectl-style value (`k8s.pod.phase` + status reasons, resolved via `argMax`), not a real label, so it can't go through the normal query-builder filter. This PR resolves the full-scope status keyset up-front and intersects it with the metadata + ranked groups, keeping `total` and pagination correct. - Multi-select: the field is an array, pushed down as `WHERE lower(display_status) IN (...)` (OR within status, AND with the attribute filter). - When the optional status metrics were never ingested, the endpoint returns a non-blocking warning + empty page instead of silently filtering everything out. #### Screenshots / Screen Recordings (if applicable) N/A — backend + generated FE API types only; the UI is a separate change. #### Issues closed by this PR Part of SigNoz/engineering-pod#5778. --- ### ✅ Change Type - [x] ✨ Feature - [ ] 🐛 Bug fix - [x] ♻️ Refactor - [ ] 🛠️ Infra / Tooling - [ ] 🧪 Test-only --- ### 🐛 Bug Context N/A — not a bug fix. --- ### 🧪 Testing Strategy - Tests added/updated: - Unit test for the status push-down (`applyPodStatusFilter`, built with go-sqlbuilder). - Integration tests across all 8 entity APIs: list mode, grouped mode, validation, missing-metric warning, and multi-select union. - Manual verification: smoke-tested against staging data (single, multi, and grouped filters). - Edge cases covered: missing status metric → warning + empty; grouped mode keeps a group if ≥1 pod matches; multi-select returns the union of the selected statuses. --- ### ⚠️ Risk & Impact Assessment - Blast radius: v2 infra-monitoring list endpoints only. - Potential regressions: none when the filter is unset (empty = off, fully additive). When set, an extra status query runs; it is gated behind the filter being present. - Rollback plan: revert the PR — no schema or data migrations involved. --- ### 📝 Changelog | Field | Value | |------|-------| | Deployment Type | OSS, Cloud, Enterprise | | Change Type | Feature | | Description | v2 infra-monitoring lists can now be filtered by pod status (multi-select). | --- ### 📋 Checklist - [x] Tests added or explicitly not required - [x] Manually tested - [x] Breaking changes documented - [x] Backward compatibility considered --- ## 👀 Notes for Reviewers - `filterByPodStatus` is optional and additive — no change to existing responses when omitted. - The status keyset is resolved once at full scope, then intersected — this is what keeps `total`/pagination correct despite status being a post-aggregation value. - OpenAPI spec + FE API types are regenerated (scalar → array); no hand-written FE. |
||
|
|
a654f648ee |
fix(infra-monitoring): the count query's alias collision when groupBy overlaps counted attrs (#12451)
## Pull Request --- ### 📄 Summary The infra-monitoring v2 clusters/namespaces list APIs 500 with ClickHouse error 179 (`MULTIPLE_EXPRESSIONS_FOR_ALIAS`) when the request groups by an attribute that is also a counted resource attribute (e.g. clusters grouped by `k8s.node.name` or `k8s.namespace.name`, namespaces grouped by `k8s.deployment.name`). Root cause: `getPerGroupDistinctCounts` aliases each `uniqExactIf(...)` count column with the bare attr key, which collides with the groupBy column alias for the same key. Fix: alias count columns as `__count_<attr>`. Row scanning is positional and the result map is keyed in Go from `attrNames`, so nothing downstream changes. Integration tests: clusters API grouped by `k8s.namespace.name` and namespaces API grouped by `k8s.deployment.name`, with exact per-group `counts` assertions (identity-tuple semantics). Both reproduce the 500 on the pre-fix build and pass on the fixed build. #### Issues closed by this PR Closes https://github.com/SigNoz/pulse-pod/issues/245 ### ✅ Change Type _Select all that apply_ - [ ] ✨ Feature - [x] 🐛 Bug fix - [ ] ♻️ Refactor - [ ] 🛠️ Infra / Tooling - [ ] 🧪 Test-only --- ### 🧪 Testing Strategy - Tests added/updated: Yes — integration (`04_namespaces.py`, `05_clusters.py`): new groupBy-on-counted-attr cases + per-group `counts` assertions on existing cases - Manual verification: Yes — replayed the failing production query with the fixed aliasing against ClickHouse - Edge cases covered: groupBy overlapping a counted attr; same-named deployment across namespaces counted as distinct entities --- ### ⚠️ Risk & Impact Assessment - Blast radius: Infrastructure Monitoring — clusters & namespaces list APIs (counts query) - Potential regressions: None — SQL alias rename only; scanning is positional and result map keys are unchanged - Rollback plan: Revert this commit --- ### 📝 Changelog | Field | Value | |------|-------| | Deployment Type | Cloud / OSS / Enterprise | | Change Type | Bug Fix | | Description | Fixed a 500 error in Infrastructure Monitoring clusters/namespaces APIs when grouping by an attribute that is also part of the resource counts (e.g. node, namespace, or deployment name). | --- ### 📋 Checklist - [x] Tests added or explicitly not required - [x] Manually tested - [ ] Breaking changes documented - [x] Backward compatibility considered |
||
|
|
a81c7d3f97 |
fix(sqlmigration): skip saved views with dangling org_id in migration 109 (#12469)
## Summary - `restructureSavedViewSpec` (migration 109) bulk-inserts legacy `saved_views` rows into the new `saved_view` table, which has an enforced `org_id -> organizations(id)` FK (sqlite runs with `foreign_keys=ON`). - Some tenants hit `constraint failed: FOREIGN KEY constraint failed (787)` on startup because a row's `org_id` didn't match any live organization -- e.g. an org deleted before the old table had a cascading FK, or an install where `org_id` was never backfilled (`015_update_dashboards_savedviews` only backfills it when there's exactly one org). - Fix: fetch live organization IDs up front inside the same transaction, and skip (with a `WarnContext` log, counted in `skipped`) any row whose non-empty `org_id` isn't among them -- same treatment as the existing empty-`org_id` skip. Followup to https://github.com/SigNoz/signoz/pull/12342 Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
b2ff5ef99c |
fix(querier): use collector-stamped insert time for last_observed stats (#12455)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
The `telemetry.*.last_observed` stats took `max()` over client-supplied event-time columns, so a single row with a skewed or corrupt timestamp (a 2050-dated log, a `2^32−1`-second span) poisoned them indefinitely. ### What - Traces/logs `last_observed` now reads `max(inserted_at)` — the collector-stamped insert time added in SigNoz/signoz-otel-collector#875; metrics reads `inserted_at_unix_milli` (metrics migration 1007). - Each signal checks `hasColumnInTable` first and falls back to the previous expression, so tenants without the schema migration keep today's behavior and switch over automatically. ### Notes - `created_at` is unusable here: pre-migration rows evaluate its `now64(3)` default at read time, so `max(created_at)` always reads as "now". - Pre-migration rows read `inserted_at` as epoch, which `max()` ignores; the all-old case lands on the existing `Unix() != 0` skip-guard. - Future-dated garbage never TTLs out (TTL is keyed on the event timestamp), which is why the old stat stayed wrong once poisoned. ### Testing - Expressions validated against `clickhouse local`, including garbage rows (`2^64−1`, `9.3e18` ns) and empty/pre-migration tables. - `go build`, `go vet`, golangci-lint clean. Fixes https://github.com/SigNoz/engineering-pod/issues/5864 |
||
|
|
58c21637a1 |
fix(tests): deflake SSO login tests — wait until the browser has left the idp after keycloak login (#12399)
Deflakes the SSO login tests (`callbackauthn` and `basepath`). They all share the `idp_login` fixture, and after it clicked Keycloak's login button it could hand control back to the test too early — in two different ways ([example CI failure](https://github.com/SigNoz/signoz/actions/runs/30898802502/job/91957986941)). ### What The fixture used to wait for the login button to disappear and treat that as "login is done". Two things go wrong with that: 1. **The page can vanish while we're looking at it.** Asking "is the button still visible?" takes two round-trips to the browser: find `kc-login`, then ask whether it's displayed. If Keycloak's redirect lands between the two, the second call is asking about a node that no longer exists. Selenium normally recognises that as a stale element and quietly retries — but Keycloak → SigNoz is a *same-site* hop (`localhost` → `localhost`), where the renderer survives the swap and that detection can miss. The raw chromedriver error (`Node with given id does not belong to the document`) then escapes and fails the test. That's the CI failure above. 2. **The button disappearing doesn't mean login finished.** It only means we left the login *page*. In the SAML flow Keycloak next serves a small auto-submitting page — still on the IdP — and *that* POST is what actually creates the user in SigNoz. So a test could go looking for the user before SigNoz had ever seen the callback, and fail with `User ... not found`. Reproduces locally on `test_idp_initiated_saml_authn`. The wait now checks what the tests actually need: **the browser has left the IdP host** (the hostname in the URL changed) *and* the login button is gone. ### Guardrails - Nothing is held across the navigation — the button is looked up fresh on every poll with `find_elements`, so "gone" is simply an empty list, never a question asked of a dying node. - Any browser error during a poll is read as "still navigating, try again" instead of failing the wait. - The wait sits through everything that's still on Keycloak (the `login-actions` hops, the SAML interstitial) and passes only once SigNoz has handled the callback and redirected — so the user exists by the time the test asserts on it. - Wrong credentials still fail loudly: Keycloak re-renders the login form on its own host, so the wait times out exactly as before. One change, in the shared fixture — the OIDC and SAML flows in both `callbackauthn` and `basepath` all go through it. ### Notes - Failure 1 needs the redirect to land inside a ~2–5 ms window of a poll that only runs every 500 ms, so it's effectively a loaded-CI-runner lottery — which is why it's rare and CI-only. Failure 2 shows up locally. - Unrelated to the PR it fired on (#12382, query-builder only); the identical SAML test passed in the same run. ### Testing - Reproduced failure 1 outside pytest, with a probe driving real headless **Chrome for Testing 151.0.7922.71** (the exact build from the CI log) through a click → POST → same-site redirect that mimics the Keycloak login flow, with server think-time near the 500 ms poll boundary. Both waits ran verbatim, at their real polling rate: | Post-click wait | Logins | Failures | |---|---|---| | old (`EC.invisibility_of_element`) | 400 | **3 × the exact CI inspector error** | | new (left-the-IdP check) | 400 | **0** | - Cross-checked the mechanism against the selenium 4.40 source with a stubbed driver: the detached-node error does escape the old wait (it only catches stale/not-found), while the new one absorbs it and passes on the next poll. A bad-credentials control times out on both old and new, so failure detection isn't weakened. - Ran the full suites locally on the final fixture, with a fresh sqlite + wal store per suite (matching the failing CI leg): `basepath` 6/6, and all 36 SSO/domain tests in `callbackauthn` — including `test_idp_initiated_saml_authn`, which flaked with `User not found` on the old wait in the same setup. (The one local non-pass, `test_apply_license`, is unrelated: it asserts on wiremock's request journal and the reused license-mock container is never reset between runs — CI gets a fresh mock.) - `make py-fmt` / `make py-lint` clean. Fixes https://github.com/SigNoz/engineering-pod/issues/5850 |
||
|
|
80fd5cc38a |
chore(deps): upgrade tests project dependencies (#12463)
#### Description - `uv lock --upgrade` across the tests project: pytest 9.0.3→9.1.1, ruff 0.15.11→0.16.2, selenium 4.43→4.46, numpy 2.4.4→2.5.1, uvicorn 0.46→0.52.1, testcontainers 4.14.2→4.15.0, requests, sqlalchemy, websockets, and the rest of the transitive set (zstandard dropped as no longer required). - Ignore `PLR0917` (too-many-positional-arguments), newly enforced by ruff 0.16 — muted alongside the other `PLR09xx` complexity rules the project already ignores (193 pre-existing hits, all in test/fixture signatures). #### Additional Information - `py-fmt` (no reformats), `py-lint` (clean), and full integration-test collection (1782 tests) pass on the upgraded toolchain. Runtime verification against the docker stack was not run. |
||
|
|
fa05a73aef |
chore: convert lifecycle-free fixture-factories to plain functions (#12462)
#### Description - Add the fixture-vs-function rule to `.claude/rules/pytest.md`: a fixture earns its indirection only by owning setup/teardown (`yield` + cleanup) or provisioning a resource; a stateless action or lookup is a plain importable function in the matching `tests/fixtures/` module taking `signoz`/`token` as ordinary arguments. - Apply it to the three fixture-factories introduced in #12460 that have no lifecycle: `delete_all_dashboards` (renamed from `wipe_all_dashboards`) and `run_query_case` are now plain functions, their modules deregistered from `pytest_plugins`, and all call sites updated. - Generalize `Metrics.load_from_file` with a `label_substitutions` parameter (placeholder rewriting, e.g. `__START_TIME__` → runtime ISO string) and drop the bespoke `load_pods_metrics`, which duplicated the base-time rebase logic — `02_pods.py` now loads JSONL the same way as every other inframonitoring suite file. Follow-up promised in https://github.com/SigNoz/signoz/pull/12460#discussion_r3737099384. |
||
|
|
38cc4d2bea |
chore: add pytest conventions rule and apply it across integration tests (#12460)
#### Description - Add `.claude/rules/pytest.md` with conventions for the Python integration suite. The lead rule: **no `_`-prefixed helper functions in test modules** — inline the logic; repetition across tests is cheaper than indirection; genuinely shared machinery becomes a fixture. Fixtures live in `tests/fixtures/` only, never under `integration/tests/` — with one exception: SigNoz-level fixtures (a suite spinning up SigNoz with different envs via `create_signoz`/`create_migrator`) always belong in that suite's `conftest.py`. Plus: fixture-factory over indirect parametrization, skip at collection, config via explicit `--flags`, snake_case parametrize ids, and collection gotchas (`python_files` prefix matching, `--import-mode=importlib`). - Apply the no-`_helper` rule across `tests/integration`: all 40 module-level `_` helpers eliminated in dashboard, inframonitoring, promqlconformance, querier_json_body, querierlogs, queriermetrics, and queriertraces. Pure transforms and request wrappers were inlined at their call sites; case-table verifier callables became data flags with inline branches; the two 115-line resource-evolution mega-helpers folded into parametrized tests; shared machinery moved to `tests/fixtures/` as fixture-factories (`wipe_all_dashboards`, `load_pods_metrics`, `run_query_case`) registered via `pytest_plugins`. - Apply the py-comments rule across `tests/`: drop module docstrings that restate the filename, relocate the ones carrying real constraints next to the code they constrain, delete function/class docstrings that restate the identifier, trim narrated steps and Args/Returns boilerplate. - Fix camelCase parametrize ids in `queriermetrics/01_fill.py` (`fillGaps`/`fillZero` → `fill_gaps`/`fill_zero`). #### Additional Information - All 629 tests in the touched suites collect cleanly; `py-fmt`/`py-lint`/compileall pass. Runtime verification against the docker stack was not run. |
||
|
|
e0b278e8e2 |
test(querier): pin keyless-row semantics for filter operators (#12456)
## Summary Adds an integration-test matrix that pins the deliberate keyless-row contract for filter operators, independent of any feature work: - **Negative operators are a set complement over all rows.** A row that does not carry the key at all must match `!=`, `NOT IN`, `NOT LIKE`, and `NOT CONTAINS`. Users opt into presence explicitly with `AND key EXISTS`. - **Positive operators carry an implicit existence guard** (`FilterOperator.AddDefaultExistsFilter`), so keyless rows never false-positive against sentinel defaults. - **`EXISTS` / `NOT EXISTS` partition rows exactly** by key presence, and `!= x AND EXISTS` is the documented composition for "present and not x". - **Numeric attributes inherit the map-default sentinel**: a missing key reads as `0`, so `num != 5` includes keyless rows while `num != 0` excludes them. This conflation is deliberate and pinned by name (`numeric_neq_zero_sentinel_conflation`) as the reference point for any value-expression change. Coverage: 46 cases — one shared matrix over traces and logs (resource and attribute contexts), metric labels (series without the label), the numeric sentinel, and the EXISTS composition. The contract, matrix, seed data, and assertions live together in one file so the contract reads top to bottom. ## Why These semantics were enforced only implicitly by the operator list in `AddDefaultExistsFilter`, with no test naming the intent. That gap allows an implementation change to alter negative-filter results silently and lets new tests calibrate expectations against the implementation instead of the contract. The attribute names used here are deliberately outside every semantic-convention family, so this file pins the base contract regardless of the semconv overlay state and serves as the oracle that family-field behavior (`queriertraces/13_semconv_evolution.py` in the semconv stack) must mirror. ## Testing - `uv run pytest --basetemp=./tmp/ --reuse integration/tests/queriercommon/06_keyless_semantics.py` — 46/46 passed against a stack built from main-based sources, and 2×46 against a long-lived shared stack, confirming the set-based assertions stay stable under environment reuse. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
a711cda7ba |
feat: generate semantic convention families (#12441)
## Summary Adds the semantic-convention evolution foundation: - vendors the OpenTelemetry schema and SigNoz overlay - generates Go and TypeScript family tables deterministically - exposes the Go resolver API for family members, current names, and historical names - adds generation checks and unit tests Related to #6143. ## Stack 1. #12441 — Foundations (base: main) 2. #12442 — Phase 1 query (base: #12441) 3. #12443 — Phase 1 services (base: #12442) 4. #12444 — Phase 1 closure gate (base: #12443) 5. #12445 — Phase 2 signals (base: #12444) 6. #12446 — Phase 3 migration UX (base: #12445) 7. #12447 — Phase 4 rollout (base: #12446) **Current layer:** #12441 ## Testing - `go test ./scripts/semconv` - `go test ./pkg/types/telemetrytypes/semconv` - `make semconv-check` ## Risk and rollback This layer is additive apart from CI generation checks. Roll back by reverting this PR; no stored telemetry is changed. |
||
|
|
e08ef01170 |
refactor(savedview): restructure api and storage to spec based (#12342)
## Summary
- Saved views now persist a versioned, typed spec (`schemaVersion` +
`spec{compositeQuery, selectedFields, display}`) instead of a bare
composite-query blob plus an opaque, frontend-owned `extraData` string
-- mirroring the pattern dashboards already use for their v2/perses
schema.
- `/api/v1/explorer/views` keeps working exactly as before: a thin
conversion layer translates to/from the legacy wire format, including
folding `extraData`'s ad hoc JSON into the typed spec and back for
backward compatibility.
- A one-time migration rewrites existing rows into the new shape and
drops the now-unused `extra_data`/`category`/`tags` columns.
### Scaffolding decisions
- Using v2 for new handlers instead of renaming old handlers to
something else for these reasons - keep the diff minimum for easier
reviews, avoiding any git history or last updated at change in old route
registration.
- Keeping the conversion to old saved view type in handler itself rather
than `savedviewtypes` package to keep it un-exported and not let them be
available anywhere else to be used. It also enables `savedviewtypes` to
be independent on query-service models.
- Modified the existing handler and it's interface to include the v2
methods instead of adding another handlerV2 since apiserver already had
handler wired in, so don't want to pass on 2 version simultaneously.
### Breaking change
- Any unknown key in the `ExtraData` will be rejected and dropped
silently in the old APIs and give error in new version.
- If there was any way to add tag or category in saved view earlier,
that data will be lost.
- Old APIs will not support the old QB request payload, only v5 format
is supported.
---
Closes SigNoz/engineering-pod#4651
Alternative discarded https://github.com/SigNoz/signoz/pull/12208
---------
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
|
||
|
|
00b7ecbd71 |
chore: remove the docs-check workflow (#12459)
#### Description - Remove `.github/workflows/docs.yml`, which labeled `feat:` PRs with "docs required" and failed the check until "docs shipped" was added. - The job is not a required status check on `main`, and nothing else references the workflow or its labels. |
||
|
|
7243560d8d |
chore: simplify PR template and add agent rules (#12457)
#### Description - Replace the multi-section PR template (change type, risk assessment, changelog, checklist) with four concise headings: Description, Issues closed, Screenshots, Additional Information. - Add `.claude/rules/` with agent rules for comments (repo-wide, Go, Python) and pull requests. - Ignore `.dev/` and `.claude/worktrees/` in `.gitignore`. |
||
|
|
53ab4546bc |
chore(deps): bump clickhouse-sql-parser to v0.5.5 (#12454)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
Bumps `clickhouse-sql-parser` to v0.5.5, fixes the false rejection that was left over once it landed, and closes three holes in the same validator that the first two changes brought to light. ## The bump **Reserved keywords as expression operands** ([#305](https://github.com/AfterShip/clickhouse-sql-parser/pull/305)). `interval` was fixed in v0.5.4, but the same defect affected 36 other keywords once the column appeared as an operand rather than bare. Sweeping 94 candidates against ClickHouse 26.8.1.337, only `on` still rejects — and ClickHouse runs that too. This one was live: `sum(limit)` on a metric label. **Panic on an unparseable `DEFAULT` expression** ([#306](https://github.com/AfterShip/clickhouse-sql-parser/pull/306)). Both known cases return a parse error now instead of dereferencing nil. The `recover` in `ErrIfStatementIsNotValid` stays — it guards the next one of these, not these two. [#307](https://github.com/AfterShip/clickhouse-sql-parser/pull/307) also allows `CAST` in a table function's argument list. ## Table functions are only table functions in a table position The parser types a call inside a table function's argument list as a `TableFunctionExpr` as well, so the generator allow list only ever cleared a generator whose argument was a literal. Every real dashboard computes its row count — `numbers(greatest(1, intDiv(end_ns - start_ns, step_ns) + 1))` — and every one was refused, on `intDiv` rather than on `numbers`. `TableExpr.Expr` is the only table position a SELECT can reach, so the allow list asks that instead. Of the four places the parser builds a `TableFunctionExpr`, two are `CREATE TABLE` paths rejected as not-a-SELECT before the walk starts, one is `parseTableArgPrimaryExpr`, and one is the `FROM`/`JOIN` path that wraps into a `TableExpr`. ## Three holes that were already open Skipping argument position is only safe if nothing there can read, and that turned out not to be true — not because of this change, but independently of it. **Reading functions.** `file` is both a table function and a scalar function, and the validator never inspected scalar calls at all. On `main` today, `SELECT file('/etc/passwd')` is accepted and returns the file. A numeric wrapper passes ClickHouse's type check, so the row count alone is an oracle: `numbers(length(file(x)))` yields one row per byte. The same applies to the 42 dictionary accessors, which can be backed by HTTP, ODBC or another database, to `catboostEvaluate`, and to the introspection functions. All are now refused by name wherever they appear, under `clickhouse_sql_reading_function`. **`x IN db.table`.** ClickHouse reads this as `x IN (SELECT * FROM db.table)`, and a qualified name on the right of `IN` parses as a `Path`, not a `TableIdentifier` — so `SELECT * FROM t WHERE a IN system.users` bypassed the internal-database rule entirely. Now checked, including the `GLOBAL IN` and `NOT IN` forms. **Quoted generator names.** The allow list matched on the formatted name, which carries the quoting, so ``SELECT * FROM `numbers`(31)`` was refused. It now reads the identifier the way the internal-database branch already did. ## Effect Replaying 72 distinct shapes of production `clickhouse_sql` that the validator currently rejects: **64 pass, up from 59 on v0.5.4**. Two came from the bump, three from the table-position change, and those three are 379 of the 1390 sampled occurrences. The three new rules add no false positives to the corpus. Of the eight left, four are correct rejections (`system` reads, `SHOW TABLES`), one is a dashboard variable rendering as the literal `<no value>`, one is SQL ClickHouse also rejects, and two are an open upstream gap. ## Tests `TestErrIfStatementIsNotValid_ShouldPassButFails` is back, holding what remains: three forms of a parenthesised left operand of a set operator, and `on` as a column name. It also stopped panicking — `errors.Asc` dereferences the error it is given, so a case starting to pass took the suite out with a SIGSEGV instead of reporting. Both refusal tables now share one harness, bounded by the same timeout the passing table uses. Known gap: no input is currently known to panic the parser, so the `recover` has no test exercising it. |
||
|
|
5c0dfe2ad1 |
feat(promql): transpile allowlisted query shapes to ClickHouse grid statements (#12325)
> **Stack** (review in order; each PR's diff is against its predecessor): > 1. #12323 `v2-read-path` — v2 native read path (leaf package) > 2. #12324 `v2-wiring` — wiring, shadow/pin rollout machinery, dual-leg conformance > 3. #12325 `v2-transpiler` — PromQL→ClickHouse transpiler + classification golden > 4. #12093 `issue-4293` — the /prometheus API move (breaking slice, last) ### What The performance half of the v2 provider: an allowlist compiler (`classify`/`rewrite`) that evaluates proven PromQL shapes entirely inside ClickHouse on the `timeSeries*ToGrid` aggregate functions (CH ≥ 25.6), so one row per output series comes back instead of every raw sample. Everything not provably equivalent falls back to the engine over the PR-1 querier; a transpilable subtree under a non-transpilable node runs hybrid (subtree materialized as synthetic series, engine on top). `TryExecuteRange` slots into the PR-2 serve/shadow paths (until now engine-only) through the new `prometheus.RangeExecutor` capability interface — the provider stays unexported and pkg/querier keeps holding `prometheus.Prometheus`; providers without the capability (v1) simply never transpile. The capability folds into the main interface once v1 is removed. Highlights (docs/contributing/prometheus.md carries the full correctness story): - Range functions map to verified grid aggregates; `increase` is `rate × range` exactly (same extrapolated delta, factor algebra). - Instant selectors reproduce stale-marker shadowing with a three-aggregate compare — skipping stale rows in WHERE would resurrect the sample the marker buried. - `*_over_time` at range = k·step aggregates whole step buckets (`groupArrayInsertAt` + slide) — no per-window fan-out, no prefix-sum differencing. - **Window-sliver filtering** (the headline perf commit, folded here): when the window is narrower than the step, only window/step of the timeline can influence any grid point; a lattice predicate in WHERE cuts the aggregate's input by the coverage ratio — measured 74s/28GiB → 16s/4.3GiB on a 36k-series 1w rate, and a 2.67B-sample case that exceeded 150GiB now completes in 19s/17GiB. Over sliver-filtered rows the last-style gates lift (instant selectors and `last_over_time` transpile at window < step), and disjoint-window `*_over_time` forms drop the divisibility gate. - Scalar-op pipelines apply in Go, slot by slot — same float64 ops, same order the AST dictates. Two guards land with it: - **Classification golden** (`classification_golden_test.go` + `testdata/classification_golden.json`): freezes the route (full/hybrid(n)/fallback + reason) of every conformance-corpus expression, one line each — 317 expressions: 132 full, 39 hybrid, 146 fallback. The test also requires each expression to route the same on every corpus grid; if a classifier change ever makes the route grid-dependent, the test fails and the key must grow. Routing is its own correctness surface — silently falling back costs the pushdown, silently transpiling an unproven shape risks wrong numbers; both now show up in review as a golden diff, with the corpus suite's v2 leg judging the numbers. - **Workload coverage reporter** (`TestClassifyCorpus`, env-gated): classifies a JSON-lines corpus of real dashboard/alert queries and buckets fallbacks by reason, to steer future allowlist work. **What the dual-leg suite caught on its first transpiled run** (evidence the PR-2 guard works, worth stating in review): - The classifier read a duration expression's offset (`x offset step()`) as zero and transpiled it — offset expressions parse *without* the experimental-parser flag, so they reach production. 20 corpus cases served silently wrong numbers. Fixed by refusing `OriginalOffsetExpr` / `RangeExpr` / `StepExpr` at classification (engine evaluates them exactly); regression cases added, golden regenerated (30 routings flipped to fallback). - Name-drop assembly treated temporally-disjoint same-labelset twins as separate series: `-{job="api"}` spanning `http_requests`/`http_errors` returned a 400 the engine would not raise, and hybrid `-metric_a or -metric_b` returned duplicate `{}` series. The engine's actual rule is: assemble the matrix by labelset, merging elements that never share an evaluation timestamp; error only on a same-timestamp conflict. Both the full-plan path (`mergeSameLabelsetSeries`) and the hybrid post-strip path (`mergeMatrixByLabelset`) now reproduce it, with unit tests pinning the corpus scenarios. - 12 remaining divergences, all one class, recorded in `known_divergences_v2.json` with causes: the engine aggregates with Kahan compensated summation (sum, sum_over_time) and an overflow-free incremental mean (avg); ClickHouse's `sumForEach`/`avgForEach`/`arraySum` are naive, so ±1e100 cancellation returns 0/residue and near-max-float64 `avg` overflows to ±Inf. Burn-down note: `sumKahanForEach` for the cancellation class; the overflow class needs an incremental-mean aggregate ClickHouse doesn't have. ### Alternatives considered and discarded - **General PromQL→SQL translation.** An allowlist inverts the failure mode: an overlooked construct becomes a fallback instead of a wrong number. Every shape on the list was validated slot-for-slot against the vendored engine on live data before entering it. - **ClickHouse's own PromQL dialect** (ClickHouse#57545, `dialect='promql'`). Emits the same grid functions, but currently covers only rate/irate/delta/idelta/last_over_time, has no fallback engine, and ties us to their TimeSeries table engine. We use the same primitives with our own classifier and our own exactness gates. - **Prefix-sum differencing for `*_over_time` windows.** Large-minus-large cancellation drifts past the shadow tolerance on counter-sized values; direct per-slot combination of at most W bucket partials adds the way the engine adds. - **Fanning each sample into every window that covers it.** Multiplies rows by W — billions of rows for a long range over a short step; the bucketed form's row count is series × buckets, the size of the output. - **Handling staleness by filtering stale rows in WHERE (instant units).** Resurrects the older real sample the marker was written to bury; hence the last-overall vs last-non-stale timestamp comparison. - **Transpiling @-modifier and default-resolution subqueries.** Their evaluation grid depends on server runtime settings the transpiler cannot see; they stay on the (exact) engine path. ### Test plan - `go test ./pkg/prometheus/clickhouseprometheusv2` — transpiler unit tests (SQL forms, classification, scalar ops, subquery grids), golden. - `pytest integration/tests/promqlconformance/` — the v2 leg now exercises transpiled serving for every routable corpus case; ledger unchanged (empty). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Pandey <vibhupandey28@gmail.com> |
||
|
|
bb3f5818c1 |
fix(sentry): stop reporting self-healed chunk load failures (#12440)
Some checks failed
build-staging / js-build (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
A tab that outlives a deploy requests hashed assets the new build no longer has. `lazyRetry` already recovers from this by reloading once, so the resulting errors are noise — they spike on every deploy and each one burns a Session Replay (`replaysOnErrorSampleRate: 1.0`). ### Sentry `ignoreErrors` Filters the whole class. Four patterns because the same failure is worded differently per source: | Pattern | Source | |---|---| | `Unable to preload CSS for` | Vite's own thrown `Error`, identical everywhere | | `Failed to fetch dynamically imported module` | Chromium | | `error loading dynamically imported module` | Firefox | | `Importing a module script failed` | Safari | `ignoreErrors` is applied as an event processor (`@sentry/core` `eventFilters.js`), so the event is dropped before transport. Replay's error flush hooks `afterSendEvent`, which never fires for a dropped event — so this stops the replay burn too, not just the issue count. Trade-off, stated plainly: stale-asset failures now produce no Sentry signal at all, including the case where the reload doesn't fix it. A genuinely broken deploy has to be caught from asset 404 rates rather than from Sentry. ### `lazyRetry` Behaviour is unchanged. One guard added: `setSessionStorageApi` returns `false` when sessionStorage is blocked (iframe, storage disabled), and the retry flag can't persist. The reload was previously issued anyway, so every failed import reloaded forever with no way out. It now reloads only when the flag was actually written. |
||
|
|
8a481d8a75 |
feat(onboarding): add Apache, HAProxy, Elasticsearch, RabbitMQ, Open WebUI, DSPy datasources (#12363)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
84eeacd084 |
feat(onboarding): add HCP Vault, OpenTelemetry eBPF, Langflow, Cohere, Auth0, and PgBouncer datasources (#12098)
* feat(onboarding): add HCP Vault, OpenTelemetry eBPF, Langflow, Cohere, and Auth0 datasources Add UI onboarding configurations (logos + datasource entries) so these tools appear in the Add Data Source onboarding flow. SVG logos optimized with svgo. Closes signoz.io#3614 (HCP Vault) Closes signoz.io#3626 (OpenTelemetry eBPF / OBI) Closes signoz.io#3680 (Langflow) Closes signoz.io#3702 (Cohere) Closes signoz.io#3562 (Auth0) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(onboarding): add PgBouncer datasource Add PgBouncer (PostgreSQL connection pooler) metrics onboarding entry, reusing the existing PostgreSQL logo. Closes signoz.io#3553 (PgBouncer) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(onboarding): update SVG logos and category of datasources --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-authored-by: Jugal Kishore <jugal@signoz.io> |
||
|
|
41576954c4 |
fix(query-context): ensure operator is correctly suggested (#11575)
Co-authored-by: Nikhil Mantri <nikhil.mantri1999@gmail.com> |
||
|
|
4a7ce110b3 |
fix(infrastructure-monitoring-hosts): missing warning prop for list table (#12431)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
e42e42ee71 |
feat: enable FGA for dashboards and their public config (#12408)
* feat: enable FGA for dashboards and their public config * test: add integration test for dashboard FGA * fix: fix permissions for public dashboards, pinning, views * fix: allow viewers to manage views * fix: remove edits to the public dashboard line |
||
|
|
b4e1af261b |
chore(deps): bump google.golang.org/grpc from 1.80.0 to 1.82.1 (#12222)
Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.80.0 to 1.82.1. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.80.0...v1.82.1) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-version: 1.82.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
0de7f666e4 |
chore(deps): bump github.com/google/cel-go from 0.28.0 to 0.29.0 (#12305)
Bumps [github.com/google/cel-go](https://github.com/google/cel-go) from 0.28.0 to 0.29.0. - [Release notes](https://github.com/google/cel-go/releases) - [Commits](https://github.com/google/cel-go/compare/v0.28.0...v0.29.0) --- updated-dependencies: - dependency-name: github.com/google/cel-go dependency-version: 0.29.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
20606e274b |
feat(infrastructure-monitoring-details): add support to pin tooltip (#12414)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
465e567028 |
fix(infra-monitoring): use local sample tables in custom queries in metric-reduction-feature path (#12413)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* chore: using local tables in place of distributed tables in infra-monitoring reduced metric path * test: infra-monitoring list endpoints on the metrics reduction path * chore: address review comments |
||
|
|
f567f4f8fb |
refactor(infrastructure-monitoring): remove dead-code of v1 (#12415)
* refactor(metrics-explorer): move use page size out of infra monitoring * refactor(query-builder): update code to reference v2 instead of v1 * refactor(infra-monitoring): delete v1 code |
||
|
|
7633845f27 |
fix: remove if condition for json parser (#12407)
* fix: remove if condition for json parser * fix: update integration tests |
||
|
|
06dd0ed3d3 |
feat(alert-channel-integrations): google chat final leg (#12335)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(alert-channels): add google chat channel type, defaults and url validation Prefills the title and description templates verbatim from the backend's DefaultGoogleChatReceiverConfig, and extracts the slack templates into SlackInitialConfig so the form can restore them when the type changes. * feat(alert-channels): add google chat option and form fields * feat(alert-channels): wire google chat create, edit and test calls * test(alert-channels): cover the google chat channel form * fix(googlechat): use standard markdown in default templates for cardsV2 |
||
|
|
a6ac14344e |
fix(dashboard): count panel stats from the v2 spec (#12396)
* fix(dashboard): count panel stats from the v2 spec The panel counters walked a top-level `widgets` array and returned early when the key was missing. A v2 dashboard stores only `metadata` and `spec`, with panels as a map under `spec.panels`, so every v2 row hit that early return and all `dashboard.panels.*` stats stayed at zero. `dashboard.count` was unaffected — it is a row count. Read the v2 spec instead: count the panels under `spec.panels` and take each panel's signal from its query envelope, reusing the typed read path and `QueryEnvelope.GetSignal`. Signal-less queries (promql, clickhouse sql, formulas) count towards the panel total only. v1 rows are no longer parsed for panel stats and contribute to `dashboard.count` alone. * test(dashboard): drop the constant name arg from the stats query helper statsBuilderQuery only ever received "A", which go-lint flags via unparam. A panel holds a single query, so the name never mattered to the assertions; the composite test still names its sub-queries through statsBuilderQuerySpec. * refactor(dashboard): move v2 panel stats to a perses_ file All v2 code lives in perses_-prefixed files until the v1 code goes away. Pure move of the stats block out of dashboard.go, tests alongside it. * fix(dashboard): count create-v2 stats off the postable spec CreateV2 already holds the postable dashboard, so decoding the storable back into a v2 dashboard just to count its panels was a needless type conversion on the create path. Split the panel walk into addPanelStats over a DashboardSpec, and add NewStatsFromPostableDashboardV2 for the create path. The storable variant keeps its signature for the periodic collectors, which only have rows. |
||
|
|
e4e1c4b9e0 |
refactor(infrastructure-monitoring-v2): more ux/ui fixes after bug-bash (#12402)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix(k8s-expanded-row): ensure values are correctly aligned Ref: https://app.notion.com/p/signoz/Alignment-in-rows-inside-a-group-wrt-column-headers-is-not-correct-3b1fcc6bcd1980dd910bff84d1defe47?v=65cfcc6bcd1982a6bee688d8fd55420c&source=copy_link * fix(pods): ensure table aligment on group by Ref: https://app.notion.com/p/signoz/Alignment-in-rows-inside-a-group-wrt-column-headers-is-not-correct-3b1fcc6bcd1980dd910bff84d1defe47?v=65cfcc6bcd1982a6bee688d8fd55420c&source=copy_link * fix(infra-monitoring): not allowing name columns to be sorted Ref: https://app.notion.com/p/signoz/No-option-to-order-resources-by-name-3b1fcc6bcd198019a729d2575731387e?v=65cfcc6bcd1982a6bee688d8fd55420c&source=copy_link * fix(infra-monitoring): cannot sort name columns when group by is enabled Ref: https://app.notion.com/p/signoz/Cannot-use-sort-when-group-by-is-added-3b2fcc6bcd19806d9514d27e4da26c35?v=65cfcc6bcd1982a6bee688d8fd55420c&source=copy_link * fix(infra-monitoring): sort key was not correct Ref: https://app.notion.com/p/signoz/Review-all-sortable-columns-3b2fcc6bcd1980c4b267f3e35d4e875f?v=65cfcc6bcd1982a6bee688d8fd55420c&source=copy_link * feat(infra-monitoring): add descriptions for each threshold of entity progress Ref: https://app.notion.com/p/signoz/For-usage-metrics-the-info-icon-can-explain-the-colours-right-there-instead-of-just-saying-to-go-to-3b1fcc6bcd1980fc81a4f2b8179541b9?v=65cfcc6bcd1982a6bee688d8fd55420c&source=copy_link * fix(infra-monitoring): explorer button not allowing the back button Ref: https://app.notion.com/p/signoz/After-click-to-go-to-metrics-explorer-on-chart-we-cannot-go-back-3b1fcc6bcd1980d7b52fd7dbe0b3e29f?v=65cfcc6bcd1982a6bee688d8fd55420c&source=copy_link * fix(infra-monitoring): polluted navigation history Fixes the following issue: - Go to namespaces - Select “generator” and open the details - Close the details - Go to pods - Group by namespaces Expand “generator”, this will cause it to be redirected to namespaces category Ref: https://app.notion.com/p/signoz/wrong-redirect-when-navigating-between-categories-3b2fcc6bcd1980e996fedd639ce72b01?v=65cfcc6bcd1982a6bee688d8fd55420c&source=copy_link * fix(infra-monitoring): get min max not detecting 1month as valid interval Ref: https://app.notion.com/p/signoz/1month-is-not-supported-to-be-received-as-relativeTime-on-metrics-explorer-3b2fcc6bcd1980c0bd17f1e3d869e987?v=65cfcc6bcd1982a6bee688d8fd55420c&source=copy_link * refactor(infra-monitoring): update table statistics for better auto page size Ref: https://app.notion.com/p/signoz/change-the-baseline-values-for-calculated-page-size-3b2fcc6bcd19807caafbdedb725b6ab7?v=65cfcc6bcd1982a6bee688d8fd55420c&source=copy_link |
||
|
|
816ae7760e |
feat: QB support for llm trace list and span list (#12027)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat: support llm trace list and span list * fix: take perf into consideration * fix: more tests * fix: more cleanup * fix: cleanup and more tests * fix: add resource fingerprint cte * fix: edge cases and correct cost key * fix: update integration test * fix: update openapi * fix: address comments * fix: address comments * fix: fix tests * fix: add back the flag in metadata * fix: remove source and change to builder ai query * fix: updated openapi * fix: minor cleanup * fix: refactor as requested * fix: address comments * fix: address comments * fix: remove tracefield. explicit rejection * fix: remove comment * fix: remove accidentally added file * fix: add NewFactory * fix: refactor integration tests * fix: address comment * fix: use assert * fix: use assert and condense comments |
||
|
|
985523df93 |
fix(version): detect docker under private cgroup namespaces (#12397)
* fix(version): detect docker under private cgroup namespaces Docker defaults containers to a private cgroup namespace on cgroup v2 hosts (20.10+), which remaps /proc/self/cgroup to "0::/" and defeats the runtime-name sniff, so compose installs report deployment.mode=unknown. Check the container manager marker files (/run/.containerenv, /.dockerenv) and the container env var first, mirroring systemd's detect_container, and fall back to mountinfo when the cgroup path is namespaced away. * fix(version): drop the docker case from the container env check docker never sets the container variable; /.dockerenv already covers it |
||
|
|
5c9606bf9b |
feat(version): detect more cloud platforms (#12403)
Add metadata endpoint checks for openstack (covers OVHcloud), oracle, alibaba, akamai (linode), ibm, and scaleway, and the FLY_APP_NAME environment variable for fly.io. OpenStack must come before AWS since it exposes an EC2-compatible endpoint. |
||
|
|
f9461415bb | chore(flagger): remove use_fine_grained_authz feature flag (#12400) | ||
|
|
d93713c184 |
fix(querybuilder): keep DateTime64 columns native in aggregations (#12382)
A numeric coercion yields seconds since epoch, so max(timestamp) came back
as 1758113657.04 and the third-party APIs "Last Seen" rendered as January
1970. Both rules key on the physical column type, since no FieldDataType
denotes a timestamp.
- a time column is never coerced: it reaches the aggregate in its native
type and the driver returns a time.Time
- a bare `timestamp` resolves to the intrinsic column alone; a same-named
numeric attribute no longer joins the candidate union, where the mixed
branches failed with "no supertype for DateTime64, Float64"
- the exists guard leaves the String bucket: `timestamp <> ''` becomes a
typed epoch-zero comparison, verified equivalent on ClickHouse 25.5
including a non-UTC server timezone
- max/min/quantile/count keep working; sum/avg and the rate_* variants now
fail at the database instead of returning a rescaled number, pinned by
integration tests until they are rejected up front
- tests/fixtures/traces.py wrote kind_string as the enum member name
("SPAN_KIND_CLIENT"), so any feature filtering on it matched nothing; it
now maps the six kinds to the exporter's form ("Client")
- Last Seen assertions pin the encoding and the exact instant, rather than
accepting either an RFC 3339 string or epoch millis
- drop the /overview/domain integration tests and the fixture surface that
served only that route; the endpoint is no longer used
|
||
|
|
0b5d3e939f |
chore(infrastructure-monitoring-v2): remove feature flag (#12398)
* Revert "chore: added infraMonitoringV2 feature flag (#12031)"
This reverts commit
|
||
|
|
089f9eb4c6 |
chore: add api to retry migration for a dashboard (#12387)
* chore: add api to retry migration for a dashboard * feat(dashboard): add retry migration action for legacy dashboards The legacy-dashboard dialog only offered the dashboard ID and a link to support. Now that the v1->v2 migration can be re-run on demand, let an editor trigger it from there and fall back to support only if it still fails. Retrying needs edit access (the endpoint is EDITOR-gated), so viewers keep the ID-and-support dialog unchanged. --------- Co-authored-by: Ashwin Bhatkal <ashwin96@gmail.com> |
||
|
|
6c659e3b26 |
refactor(infrastructure-monitoring-v2): ensure pods docs redirect to right place & move events out of constants (#12359)
* fix(pods): redirecting to the wrong doc for chart * refactor(events): move out of src/constants * test(use-log): fix issue with mock * docs(infra-monitoring): fix more broken doc path * fix(pods): disable sort for pod restarts |
||
|
|
c70866e4b3 |
fix(dashboards-list): never replace past the caret in DSL autocomplete (#12384)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
getCaretContext resolved the active slot to a token's start index while keeping replaceEnd at the caret, so a caret parked in the whitespace before that token produced an inverted range (replaceStart > replaceEnd). dslCompletionSource passes that range to CodeMirror as CompletionResult from/to, and accepting a suggestion threw RangeError: Invalid change range 16 to 15 (in doc of length 36) inside view.dispatch. The same inverted range made spliceAtCaret duplicate the skipped character. The replaced range is defined as ending at the caret, so clamp it there and let the slot collapse to a plain insertion point. |
||
|
|
34041be308 | fix: adjust aggregation values for GCP metrics (#12391) | ||
|
|
957580ec7c |
fix(alertmanager): resolve email SMTP settings from env (#12281)
* fix(alertmanager): resolve email SMTP settings from env * refactor(alertmanager): remove dead legacy config and tidy integration test helpers * test(alertmanager): scope smtp rotation test to env rotation only * chore: drop redundant test * chore: log and warn; do not persist global config |
||
|
|
77c1b601be |
feat(logs): implement search() across all log fields (#12244)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
- Replace the search() stub: the logs condition builder fans a case-insensitive
match of the term across every searchable column (log columns, body/body_v2,
attribute + resource maps).
- Grammar: searchCall takes a valueList (parser regenerated), so the scoped form
search('term', body, resource) parses and narrows the fan-out to those contexts.
- The visitor emits FilterOperatorSearch and flags the statement scan-heavy; the
statement builder attaches a CostGuard the querier enforces via EXPLAIN ESTIMATE
against a per-shard budget, cumulative across buckets on the window-list path.
- body_v2 gets its own, lower budget (search_max_scan_rows_json_body): toString()
rebuilds every document and no skip index prunes.
- Logs-only: other signals reject search().
- Unit tests for the per-context fan-out SQL and both budgets; integration suites
run the same matrix over the legacy body and over body_v2.
|
||
|
|
cfaa7de165 |
fix: enforce the required tag on dashboard spec fields (#12381)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix: enforace the required tag on dashboard spec fields * test: add empty list and objects for required fields in integration tests |
||
|
|
5b3cc2400f |
chore: delta temporality metrics should always be considered as a sum metric (#12313)
* chore: delta temporality metrics should always be considered as a sum metric * test: add integration tests * test: parametrise the non-reduced test for rate and increase both * test: add comment explaining last samples in test * chore: remove unneeded comments --------- Co-authored-by: Srikanth Chekuri <srikanth.chekuri92@gmail.com> |
||
|
|
8eb3f6bc1b |
refactor(querier): squash statement-builder config under querier (#12385)
- Embed statementbuilder.Config into querier.Config with mapstructure ",squash"; keys move to querier.skip_resource_fingerprint.* (env SIGNOZ_QUERIER_*). - Drop the standalone statementbuilder section and its config factory. - Pass statementbuilder.Config wholesale into NewLogQueryStatementBuilder. |
||
|
|
1ac6103685 |
feat(querier): wire clickhouseprometheusv2 for shadow comparison and pinned serving (#12324)
* feat(querier): wire clickhouseprometheusv2 for shadow comparison and pinned serving Stand up the v2 provider next to the default one and give the querier two flag-gated ways to exercise it, neither affecting default serving: - shadow: with use_prometheus_clickhouse_v2 on, every PromQL query re-runs on v2 after the response is sent; result diffs are logged. Bounded by a small per-process admission cap (skip, not queue, at the cap). - pin: the X-SigNoz-PromQL-Provider header serves the response from v2 directly, for side-by-side comparison by integration tests and support. Pinned requests bypass the cache in both directions. Typed storage errors (series/sample budgets) survive the engine's wrapping and surface as 4xx instead of internal 500s. PromQL results now carry ClickHouse scan stats. prometheus::provider: clickhousev2 also makes v2 the serving provider outright (no shadow in that mode - nothing to compare against). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * test(promql): replay the conformance corpus on both providers Every corpus case now runs twice — default provider, and pinned to clickhousev2 via the flag-gated X-SigNoz-PromQL-Provider header — each leg asserted against the same frozen expectations, each leg with its own known-divergences ledger enforced in both directions. The new known_divergences_v2.json is the rollout scorecard: the provider swap is measured by burning it to empty. The legs are never asserted against each other: both can sit within one rounding quantum of the expected value yet differ by up to two quanta at a rounding boundary, so a leg-vs-leg check would reintroduce the boundary noise the tolerance absorbs. Anchoring both to the same oracle over the same ingested bytes already localizes any disagreement to a provider. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
302a40e8df |
chore(lint): satisfy golangci-lint v2.12.2 and de-flake http middleware tests (#12383)
primus bumped golangci-lint to v2.12.2, whose govet now runs the inline analyzer and whose sloglint is stricter. CI resolves primus.workflows@main, so every PR started failing lint the moment that landed. - reflect.Ptr is a deprecated alias carrying //go:fix inline, so it is now reflect.Pointer at all five call sites - metricsstatementbuilder imported golang.org/x/exp/slices, which carries //go:fix inline pointing at the stdlib; the analyzer cannot inline generics, so switch the import to stdlib slices as the directive intends - pkg/instrumentation/loghandler emits OpenTelemetry semantic-convention attributes (code.filepath, exception.type, ...), which are dotted rather than snake_case by definition. Renaming them would break every log consumer, so the keys move to constants in instrumentationtypes, which already held this kind of key -- and already defined code.function, so source.go was duplicating it. Six of the seven alias the semconv constants that define them; exception.code has no OTel equivalent. sloglint resolves a same-package constant back to its literal but skips a qualified one, so this needs no exclusion. CI reported 8 issues but capped at max-same-issues=3, hiding 2 more reflect.Ptr sites and 4 more sloglint ones. Separately, TestTimeout/WaitTillNoTimeoutForExcludedPath failed with "transport connection broken: http: CloseIdleConnections called". TestTimeout and TestCache issue requests through http.DefaultClient while a parallel subtest in response_test.go closes an httptest.Server, and httptest.Server.Close calls http.DefaultTransport.CloseIdleConnections. Both tests now use their own client and transport, and are closed via t.Cleanup. That makes Serve return ErrServerClosed on every run, so the require.NoError wrapping it is dropped -- it could never have held, and require runs t.FailNow off the test goroutine anyway. Bare Serve in a goroutine matches routerweb and render tests. |
||
|
|
87560eaeb9 |
feat(querybuilder): allow row-generator table functions (#12376)
Some checks failed
build-staging / staging (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(querybuilder): allow row-generator table functions
The table-function rule refuses everything, which costs a false positive
on queries that use numbers() or generateSeries() to build a dense
interval axis to join a sparse series against. Neither reads through
anything: they compute their rows from their arguments, open no file or
socket, reach no other host, and name no table, database or dictionary.
Everything else stays refused. Most table functions read through
something, and merge('system', '.*'), remote() and cluster() reach the
internal databases without producing a TableIdentifier for the database
rule to catch, so this rule is all that sees them. generateRandom is pure
but streams rows its arguments do not bound, so it stays out too.
Arguments are visited before the table function itself, which is what
keeps an allowed generator from being usable as a wrapper to smuggle a
read through.
* test(querybuilder): address review on the generator allow list
Names the allowed table functions in the rejection error, collapses the
added comments, and covers the generators in JOIN, CTE, subquery and
UNION position alongside the reads they must not be usable to smuggle.
* refactor(querybuilder): derive the allowed table function message from the map
Values the map by the spelling to name back to the caller, so the message
comes off the same data the lookup uses and cannot drift from it. Drops
the test that existed only to catch that drift.
|
||
|
|
98030c29ef |
fix(dashboard): substitute per-row groupBy values in context-link URLs (#12328)
Per-row field variables are registered `_`-prefixed in useContextVariables so
a clicked row's field can't shadow a dashboard variable of the same name, but
resolveText/resolveTextWithTruncation only ever looked up the bare placeholder
name. A link authored as `/trace/{{trace_id}}` therefore never matched the
registered `_trace_id`, was left literal, and got percent-encoded into
`/trace/%7B%7Btrace_id%7D%7D` on navigation.
Look up the exact name first — so dashboard/global variables keep precedence —
then fall back to the `_`-prefixed field value. Fixes every placeholder syntax
({{var}}, {{.var}}, [[var]], $var) and both V1 and V2 dashboards, which share
this resolver and the same `_` convention.
Closes #11325
|
||
|
|
b1b668925e |
chore(deps): bump clickhouse-sql-parser to v0.5.4 (#12375)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* chore(deps): bump clickhouse-sql-parser to v0.5.4 v0.5.4 carries the four SigNoz-reported grammar fixes: unquoted `interval` as a column name, GLOBAL before a join type and GLOBAL NOT IN, arithmetic inside table function arguments, and the SQL-standard keyword-argument forms of trim/substring/overlay. Replaying the saved production corpus takes the v5 clickhouse_sql rejection rate from 11/198 to 1/198, and the one remaining rejection is a real rule hit rather than a parser gap. TestErrIfStatementIsNotValid_ShouldPassButFails therefore has nothing left to hold; its queries move to _Pass as regression canaries. * test(querybuilder): bound how long a valid statement may take to parse Telling an INTERVAL operator from a column named interval needs backtracking, and v0.5.4 keeps that from going exponential by remembering the offsets it has already failed at. Losing that memoisation would hang the parser rather than fail it, so a 30-term case covers the shape and the loop bounds how long any valid statement may take. * test(querybuilder): address review on the parser bump Collapse the added comments to fewer lines, and fail the timeout branch with assert rather than t.Fatal so a case that does hang reports alongside the rest. * test(querybuilder): drop the stale signed-literal comment * test(querybuilder): pin the numbers table function false positive Restores TestErrIfStatementIsNotValid_ShouldPassButFails around the one rejection the saved production corpus still produces on v0.5.4. numbers() generates rows rather than reading through anything, so this is the blanket table-function rule being stricter than the threat it exists for rather than a parser gap, and the table now asserts the error code. * test(querybuilder): trim the numbers case comment and query Collapses the query to a single line to match the other cases in the file and swaps the tenant's metric name for a placeholder. |
||
|
|
2d90a9f5eb |
chore(deps): bump golang.org/x/net in /scripts/promqltestcorpus (#12373)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.54.0 to 0.55.0. - [Commits](https://github.com/golang/net/compare/v0.54.0...v0.55.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-version: 0.55.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
f75cd0854f |
chore(deps): bump golang.org/x/crypto in /scripts/promqltestcorpus (#12320)
Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.50.0 to 0.52.0. - [Commits](https://github.com/golang/crypto/compare/v0.50.0...v0.52.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-version: 0.52.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
ab91995ee5 |
ci: restore shared go and pnpm caches in integration and e2e jobs (#12369)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(tests): add --signoz-image option to run a prebuilt image * ci: collapse integrationci and e2eci into testsci with a shared image build * ci: rename flag to --zeus-network-aliases * ci: use singular --zeus-network-alias derived from a shared env var * revert: drop the testsci workflow and the --signoz-image option * ci: restore shared go and pnpm caches in integration and e2e jobs * ci: inject cache tarballs instead of directory trees |
||
|
|
fd2bd85e90 |
ci(cacheci): extract cache mounts via docker cp instead of the local exporter (#12370)
* ci(cacheci): extract cache mounts via docker cp instead of the local exporter * ci(cacheci): make extracted cache writable for unprivileged untar * ci(cacheci): move cache contents as tarballs * ci(cacheci): drop temporary pr trigger and cancel superseded runs |
||
|
|
c110e14505 |
ci: add cacheci workflow to maintain shared go and pnpm caches (#12368)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
cacheci / tests (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
5917f9fe31 |
perf(tests): cache go and pnpm stores across integration image builds (#12366)
* perf(tests): cache go and pnpm stores across integration image builds Add BuildKit cache mounts for GOCACHE/GOMODCACHE and the pnpm store to the integration Dockerfiles, and build the image via the docker CLI (docker-py, used by testcontainers' DockerImage, does not support BuildKit). Embed the go build command directly so Makefile changes do not invalidate the build layer, and pin HOME/GOCACHE/GOMODCACHE/PNPM_HOME explicitly so cache-mount targets match tool defaults by contract. The with-web node stage fetches dependencies from the lockfile before the source copy, so frontend edits only re-run the offline install and build. * feat(tests): add --clean flag to prune buildkit cache mounts The go and pnpm caches introduced for the integration image build survive --teardown since they belong to the docker builder, not to any container. --clean runs docker builder prune with a type=exec.cachemount filter at session start, forcing the next image build to start cold. Documented in the integration testing guide. * feat(tests): add --rebuild flag to refresh the signoz container under --reuse --reuse keeps the running signoz container, so backend source changes are never picked up without tearing down the whole stack. --rebuild deletes the cached signoz container and recreates it from the current sources (an incremental image build), while databases, mocks and migrations stay reused. Requires --reuse; combining with --teardown or --clean is a usage error. * chore(tests): prune comments to non-obvious constraints * docs(tests): make py-test-setup rebuild signoz and audit the integration guide py-test-setup now passes --rebuild so re-running it after backend changes transparently swaps in a signoz container built from the current sources. The integration guide documents the iteration loop and fixes stale content: option defaults (clickhouse 25.12.5, schema migrator v0.144.6), the nonexistent --zookeeper-version option, Zookeeper vs ClickHouse Keeper, the e2e doc path, and the lint toolchain (ruff). * docs(tests): wire --rebuild into the e2e setup flow The e2e bootstrap shares the signoz fixture, so --rebuild already applies; with --with-web it also picks up frontend changes since the image bakes the built frontend in. The setup command now passes --rebuild, and the guide documents the iteration loop, the --rebuild/--clean flags, ClickHouse Keeper instead of Zookeeper, and the corrected integration doc path. * docs(tests): qualify --rebuild workflow for suites with custom signoz variants make py-test-setup only rebuilds the default signoz instance; suites that create their own via create_signoz(cache_key=...) keep a separately cached container. Passing --rebuild on the suite run itself rebuilds every variant that run instantiates. * docs(tests): describe --clean behaviour instead of its exact command Keeps the docs from drifting if the prune invocation behind --clean changes. |
||
|
|
052255abf5 |
feat(prometheus): add clickhouseprometheusv2 native read path (#12323)
Second-generation ClickHouse-backed Prometheus provider: the stock engine evaluates over a native storage.Querier instead of the v1 remote-read adapter. Per-selector fetch windows, last-sample-per-step reduction for subquery-free instant selectors (gated on prometheus.QueryTraits), identical-labelset merge, per-type __name__ matchers and anchored regexes, inclusive series-lookup bounds for the exporter's hour-floored registration rows. Not wired: no factory registration, no config selection, nothing serves from this package yet. Fetch budgets (series/sample ceilings) are deliberately left out for now and will come separately. Co-authored-by: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
afc90f532f | chore: remove doc.go files (#12365) | ||
|
|
24390d7192 |
fix(ruletypes): expose above_or_equal and below_or_equal in CompareOperator enum (#12360)
* fix(ruletypes): expose above_or_equal and below_or_equal in CompareOperator enum The operators are accepted by Validate(), normalized, evaluated and returned by the rules API, but were commented out of Enum(), so the generated OpenAPI spec (and clients generated from it, e.g. terraform-provider-signoz) rejected rules the server itself creates. * fix(alerts): support above_or_equal and below_or_equal operators in CreateAlertV2 Adds the two inclusive operators to the v2 alert form: selectable in the threshold operator dropdown, normalized from all backend aliases (5/6, above_or_eq/below_or_eq, >=/<=), rendered with their symbols in threshold rows and match-type tooltips, and prefilled losslessly from dashboard panel thresholds instead of collapsing onto the strict variants. The v1 form is left untouched. |
||
|
|
16c6fdc600 |
chore: combined function for goroutines (#12362)
Some checks failed
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
|
||
|
|
159354a511 |
refactor(authz): ensure roles/service-accounts follow the guidelines (#12348)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(authz): add withPortal prop for button/tooltip To be able to fix the z-index issue when using drawer/modals of our lib Without this, the tooltip is positioned on the back of the modal * fix(authz-tooltip): always forward the testId * fix(create-service-account): ensure this modal follows the authz guideline * fix(service-account-drawer): ensure tooltips has withPortal false Otherwise, the tooltip can appear behind the modal/drawer * fix(service-account-drawer): ensure it follows the authz guideline * fix(roles-listing): use correct component to guard content * fix(create-edit-role): ensure edit follows the authz guidelines Should show header when no permission to read * fix(view-role): ensure edit follows the authz guidelines Should show header when no permission to read * fix(pr): address comments * fix(view-header): have a better name for this component |
||
|
|
30dcb944eb |
refactor(infrastructure-monitoring-v2): ui/ux improvements after bug hunting (#12245)
* fix(tanstack-table): reset prev column id ref when changing storageKey Since all tables we have some far unmounts enterely we didn't notice this bug until I refactor the infrastructure monitoring to be shared and dynamic via config Ref: https://app.notion.com/p/signoz/3a5fcc6bcd19805f8929e549c646985d?v=090fcc6bcd198251bf3c883f842d8798&p=3a5fcc6bcd19800e92a3dd70bb3a08fd&pm=s * refactor(infrastructure-monitoring): remove cellvalue tooltip component Ref: https://app.notion.com/p/signoz/3a5fcc6bcd19805f8929e549c646985d?v=65cfcc6bcd1982a6bee688d8fd55420c&p=3a5fcc6bcd19803581aff083c0a65717&pm=s * feat(k8s-base-details): add copy link Ref: https://app.notion.com/p/signoz/3a5fcc6bcd19805f8929e549c646985d?v=65cfcc6bcd1982a6bee688d8fd55420c&p=3a5fcc6bcd19802aa8e4cc69b88d1fce&pm=s * refactor(hosts): move disk usage closer to cpu/memory usage Ref: https://app.notion.com/p/signoz/3a5fcc6bcd19805f8929e549c646985d?v=65cfcc6bcd1982a6bee688d8fd55420c&p=3a5fcc6bcd1980b292facdfb92b95fa0&pm=s * refactor(k8s-base-details): change wording to go to explorer, and move explorer to right Ref: https://app.notion.com/p/signoz/3a5fcc6bcd19805f8929e549c646985d?v=65cfcc6bcd1982a6bee688d8fd55420c&p=3a5fcc6bcd1980f19e61fedee47a5d5b&pm=s * fix(k8s-base): use text-wrap instead of forcing line break To be able to collapse line to one line on bigger screens Ref: https://app.notion.com/p/signoz/3a5fcc6bcd19805f8929e549c646985d?v=65cfcc6bcd1982a6bee688d8fd55420c&p=3a5fcc6bcd19808a8a30ed9ddbfa029a&pm=s * feat(tanstack-table): add support to reset scroll Without this prop, infra monitoring will keep the same scroll on horizontal when changing category * fix(infrastructure-monitoring): reset horizontal scroll on change category To simulate, just move horizontal scroll to right and then change category that can have horizontal scroll as well * refactor(k8s-list): reorganize filters Ref: https://app.notion.com/p/signoz/3a5fcc6bcd19805f8929e549c646985d?v=65cfcc6bcd1982a6bee688d8fd55420c&p=3a5fcc6bcd19809a9a7fca0138558551&pm=s * refactor(infra-monitoring): reorganize table options Add support to specify font size, max lines per row, and the columns Ref: https://app.notion.com/p/signoz/3a5fcc6bcd19805f8929e549c646985d?v=65cfcc6bcd1982a6bee688d8fd55420c&p=3a5fcc6bcd1980cfadcdeb2f590c3dc3&pm=s * fix(infra-monitoring): add delay to show hover & do not close on click to copy Ref: https://app.notion.com/p/signoz/3a5fcc6bcd19805f8929e549c646985d?v=65cfcc6bcd1982a6bee688d8fd55420c&p=3a5fcc6bcd19801c8ae8c6283357021b&pm=s * refactor(infra-monitoring): handle no data in a consistent way With opacity: 0.6 as recommended by design team * refactor(infra-monitoring): move details drawer to signozhq/ui Few problems with integration but I'm planning to fix it later on our component lib Ref: https://app.notion.com/p/signoz/3a5fcc6bcd19805f8929e549c646985d?v=65cfcc6bcd1982a6bee688d8fd55420c&p=3a5fcc6bcd1980babfc2f29686e86d91&pm=s * fix(infra-monitoring-details-logs): disable group by/replace filter actions This is so deep in the prop that is better to disable this than trying to support part of this (replace filter) Ref: https://app.notion.com/p/signoz/3a5fcc6bcd19805f8929e549c646985d?v=65cfcc6bcd1982a6bee688d8fd55420c&p=3a6fcc6bcd1980d59ba1dd7d1658e9b3&pm=s * fix(infra-monitoring-details-logs): explorer action inherit filters On logs, if you add custom logs and then click in a specific log to see the details, and you click in the go to explorer, it will inherit filters you had added earlier Ref: https://app.notion.com/p/signoz/3a5fcc6bcd19805f8929e549c646985d?v=65cfcc6bcd1982a6bee688d8fd55420c&p=3a6fcc6bcd1980a68bedfd8bbc17e137&pm=s * fix(infra-monitoring-logs): scroll not working & search not allowing type This issue is caused because radix lock the scroll for any component not under the drawer. This also fixed the issue with search, not sure why this was related Ref: https://app.notion.com/p/signoz/3a5fcc6bcd19805f8929e549c646985d?v=65cfcc6bcd1982a6bee688d8fd55420c&p=3a6fcc6bcd1980648061f29a990712dd&pm=s Ref: https://app.notion.com/p/signoz/3a5fcc6bcd19805f8929e549c646985d?v=65cfcc6bcd1982a6bee688d8fd55420c&p=3a6fcc6bcd19805d9404d3d0f78f2c75&pm=s * fix(infra-monitoring-logs): issue with double scroll Ref: https://app.notion.com/p/signoz/3a5fcc6bcd19805f8929e549c646985d?v=65cfcc6bcd1982a6bee688d8fd55420c&p=3a6fcc6bcd198099b764f8e03bc20ac1&pm=s * refactor(infra-monitoring): remove more usages of antd components * refactor(infra-monitoring): use toggle to hide columns This is a similar pattern we have on dashboards Ref: https://app.notion.com/p/signoz/3a5fcc6bcd19805f8929e549c646985d?v=65cfcc6bcd1982a6bee688d8fd55420c&p=3a6fcc6bcd198000b535ca511e4e8c97&pm=s * fix(infra-monitoring): do not refetch when click in the row To prevent doing two requests when data in memory is already enough * fix(infra-monitoring): docs path Ensure all the docs path goes to correct column/chart docs Ref: https://app.notion.com/p/signoz/3a5fcc6bcd19805f8929e549c646985d?v=65cfcc6bcd1982a6bee688d8fd55420c&p=3a6fcc6bcd19809581f3d96dd6ecdeab&pm=s Ref: https://app.notion.com/p/signoz/3a5fcc6bcd19805f8929e549c646985d?v=65cfcc6bcd1982a6bee688d8fd55420c&p=3a6fcc6bcd19809d9c2bf2ec41a4c92b&pm=s * chore(volumes): fix docs path for charts * feat(infra-monitoring-v2-events): add event for page visited * feat(infra-monitoring-v2-events): add event for filter customized * feat(infra-monitoring-v2-events): add event for time range customized * feat(infra-monitoring-v2-events): add event for column customized * feat(infra-monitoring-v2-events): add event for column sorted * feat(infra-monitoring-v2-events): add event for drawer time range customized * feat(infra-monitoring-v2-events): add event for group by change * feat(infra-monitoring-v2-events): add event for filter customized * feat(infra-monitoring-v2-events): add event for tab viewed * feat(infra-monitoring-v2-events): add event for explorer visited * fix(infrastructure-monitoring-v2): migrate tooltip to be from tanstack * fix(k8s-expanded-row): add missing pre-cache when row is expanded * fix(infra-monitoring-v2): copy ID via react-use after hook removal frontend/src/hooks/useCopyToClipboard.ts was deleted on main (#12333) in favour of react-use's execCommand-based copy, leaving this import dangling and breaking tsc and the frontend build. --------- Co-authored-by: Ashwin Bhatkal <ashwin96@gmail.com> |
||
|
|
e9726776ab |
feat(alert-channel-integrations): google chat backend (#12314)
* chore: added googlechat notify function * chore: added content extraction and formatting for google chat content * chore: added tests * chore: adding processing logic for makrdown to google chat format * chore: added utf 8 sanitization and capping the limit * chore: comment correction * chore: added one more test * chore: error on empty title body with non-retryable error and give 429 retryable error due to limit * chore: cardsv2 scaffolding * chore: truncation logic optimized for both body and title * fix(googlechat): guard nil HTTPConfig in New with a clean error * feat(googlechat): render grouped alerts as per-alert card sections Render each alert in its own card section with its own View Related Logs/Traces buttons, and move Open in SigNoz to a shared footer button (it's per-rule). Matches the slack/msteams per-alert layout; the default template still produces one combined section. Cap sections at 30 with a "+N more alerts" note: Google Chat allows 100 widgets per card and silently drops the section that crosses that count and every section after it, so capping keeps the footer and trailing alerts from vanishing. Cap is applied before the size guard so the trim loop only touches rendered bodies. Generalize the 32 KB size guard to trim the longest body, then the title. * docs(googlechat): clarify content.bodies default-vs-custom alignment * test(googlechat): cover default-body grouped alerts (single combined section) * chore: modified comment * fix(googlechat): keep Open-in-SigNoz button when no body renders The footer button was sourced from the capped alert set, which is empty when every body renders empty (cleared Description, or a custom body template that expands to nothing). Source it from the original first alert instead, since the rule-source link is always available. * refactor(googlechat): fold types.go into googlechat.go Other notifier packages (slack, msteamsv2, pagerduty, etc.) keep types and logic in a single file. Match that convention instead of a separate types.go. * refactor(googlechat): validate webhook URL in UnmarshalYAML Move the webhook-URL validation into GoogleChatReceiverConfig.UnmarshalYAML so the config self-validates on unmarshal, matching the upstream receiver convention. Drop the separate validateGoogleChatConfig pass in receiver.go; validation now runs via the defaultedNotifierConfig yaml round-trip. * chore(googlechat): note size-guard button-URL edge as TODO The serialized-size loop trims bodies then title but not button URLs, so a card with many long-URL buttons could still overflow. Not reachable in the default path (few short buttons); add a TODO to drop trailing sections to fit once per-alert templating makes it reachable. * refactor(googlechat): inline webhook URL validation in UnmarshalYAML Fold the validation checks directly into UnmarshalYAML instead of a separate helper, and drive the test through NewReceiver. * test(googlechat): use assert for value checks, require for guards Split testify usage per convention: require for error/nil checks and length guards before indexing, assert for the independent value assertions so one failure doesn't mask the rest. |
||
|
|
a238ed367d |
fix: choose first panel during migration (#12353)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix: choose first panel during migration * test: add unit test |
||
|
|
9197cb8b3b |
fix(dashboard-v2): open the View modal and editor on the panel's own query (#12345)
* fix(dashboard-v2): seed the query builder before the View modal mounts The query builder context is global and outlives the View modal, so it still holds the previously-viewed panel's query when the modal for the next panel mounts. The modal only re-seeded it in a mount effect, and the builder's fields seed themselves on mount — PromQL inputs are uncontrolled and QueryAddOns picks its visible rows once — so they kept rendering the previous panel's query until the modal was closed and reopened. Seed the context in the open handlers instead, before the modal renders. resetQuery (not initQueryBuilderData): the latter sets a staged query, and swapping one staged id for another makes useSyncTimeOnStagedQueryChange re-anchor global time, refetching every panel on the grid. Clearing the staged query also stops the previous panel's query being committed into the new panel's draft, and keeps the provider's URL hydration running for drilldowns. * fix: fixed bar panel ordering issue * test(dashboard-v2): drop the userEvent delay in the View modal suites `userEvent.setup()` defaults to `delay: 0`, which awaits a macrotask between every sub-event of a click. Each await flushes React, so every one re-renders the real query builder these two suites mount — enough to push both add-on tests past jest's 5s default timeout on CI. `delay: null` dispatches the sequence synchronously: the add-on tests drop from 3172ms/1171ms to ~495ms/262ms and PromQL from 815ms to ~455ms, with the full tree still rendered and every assertion unchanged. Verified to still fail against the unseeded builder, so the regressions stay pinned. * fix(dashboard-v2): carry the opened panel's query in compositeQuery The query builder context is mounted above the router, so opening the panel editor or the View modal leaves the previously-opened panel's query in it. Fields that read the query once on mount then keep showing that panel: PromQL inputs are uncontrolled and their rows are keyed by query name, and QueryAddOns picks its visible rows once. Both surfaces now state the panel's query in the URL as compositeQuery, so they derive from the URL and survive a refresh or a shared link (V1 does the same in WidgetHeader.onEditHandler). The URL alone isn't enough — the provider applies it in an effect, a tick after those fields have mounted — so the same query goes into the context before navigating. resetQuery, not initQueryBuilderData: swapping one staged id for another makes useSyncTimeOnStagedQueryChange re-anchor global time and refetch the grid. * fix(dashboard-v2): order time series by mean, sharing the bar sort Review feedback: the sort shouldn't be a bar-panel local. The mean/tiebreak rules move to the visualization layer as a generic `sortByMeanDesc`, with a `PanelSeries` adapter in `Panels/utils` that the bar and time-series renderers both call, so any other bar consumer can adopt it in one line. Time series flipped for the same reason bar did — the backend returns a query's series in Go map-iteration order — so it now sorts too: draw order, legend order and the View modal's legend table are deterministic across refreshes. Colours are unaffected, since `generateColor` hashes the label rather than the position. The order still has to be settled before the uPlot config and aligned data are built: those two and drilldown click attribution index the flattened list positionally, and uPlot draws a stacked bar's segments in series-index order, so sorting inside `BarChart` paints the accumulated total over every segment. --------- Co-authored-by: Ashwin Bhatkal <ashwin96@gmail.com> |
||
|
|
a0a17a99a6 |
chore(deps): bump google.golang.org/grpc in /scripts/promqltestcorpus (#12321)
Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.79.3 to 1.82.1. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.79.3...v1.82.1) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-version: 1.82.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
8fb5703eb1 |
fix(dashboard-v2): variable defaults and clear affordance + other fixes (#12343)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix(dashboard-v2): apply a variable's configured default reliably Three separate ways a variable ignored the default its definition carries: - the reconcile predates the ALL option and filled `options[0]` whenever nothing was selected, so an ALL-enabled multi-select never landed on ALL; - the seed treated any stored entry as a selection, though a selection object is truthy even holding '' or [] — an entry persisted empty shadowed the default forever, so editing a textbox variable's value in settings never took effect; - the bar synthesised an empty selection for the render that precedes the seed, and the textbox snapshots what it is handed into local state on mount, so a variable carrying a value opened with an empty box that filled only on focus + blur. Precedence is now the same everywhere, through the one resolver: the configured default first, then ALL where the variable offers it, then the first option. A stored ALL still wins, even before its option array materializes. The seed also stops rewriting the store when it resolves to what is already there — it re-runs on every spec identity change, and an identical write re-rendered every selection subscriber for nothing. * fix(dashboard-v2): skip the cascade when a variable's value is unchanged Committing a selection always wrote the store and enqueued the variable's dependents, so re-picking the value a variable already held refetched every dependent variable and re-ran every panel query for nothing. Guarded at the single choke point, order-independently. * fix(dashboard-v2): keep ALL readable while a variable's options load The control renders an ALL selection from the option array, so until those options arrive there is nothing to show and it falls back to its placeholder: the variable reads "Select value" next to a spinner, as though nothing were selected. Concrete values do not have this problem — they render from the selection itself. Say ALL in that slot while the options are pending. Display only, so it can never be committed as a value. * perf(dashboard-v2): settle a variable load without a redundant write A load committed the same selection twice and refetched everything downstream once for nothing: - a CUSTOM variable's options need no request, yet the seed stored ALL as a flag and left the post-fetch reconcile to expand it into the concrete array; - that reconcile runs on a selector's first render, before the seed commits, so its auto-fill arrived already satisfied — and the flush wrote it and cascaded anyway. The seed now resolves against options it already knows (materializing ALL, dropping values the list no longer offers), and an auto-fill the store already satisfies is dropped, with the cascade narrowed to the variables that actually moved. Measured on a dashboard with a text and a custom multi-select variable: a settled load goes from two store writes and one dependent refetch to one write and none, and a re-render from a dashboard refetch adds neither. * fix(dashboard-v2): stop a single-select dynamic variable blocking every save Saving forced `allowAllValue: true` for every dynamic variable while `allowMultiple` followed the model, so a single-select one went out with ALL set and no multi-select. The API rejects that combination, and because a save re-serializes the whole variable list, one such variable failed every edit to the dashboard — the error even points at that variable's index rather than the one being edited, which makes it look unrelated. ALL is a set of values, so it now requires multi-select for every type. Dynamic variables still always expose it when they are multi-select (V1 parity). * enh(dashboard-v2): show the variable clear only where it can act The clear icon appeared on hover of the closed control — an action in a row of variable pills whose result you cannot see, since the list it clears is not on screen — and it committed the default immediately in that state. It was also offered while ALL was selected, where the shared control refuses to empty the selection, so the icon sat there doing nothing. It now exists only while the list is open, and not while every option is selected: unchecking ALL in the list is the way out of that. Clicking it empties the list and commits nothing; closing fills in whatever the variable should hold — its configured default, else ALL where it offers one, else the first option. |
||
|
|
ee06d549e6 |
chore(alert-history): use v2 apis (#12132)
* feat(query-search): add support for custom value fetcher
* feat(alert-history): use v2 apis
* refactor(api): remove types and old apis
* fix(rule-history): not accepting severity/threshold.name as filter
* fix(cursor-pagination): simplify pagination
* fix(timeline-table): keep as asc
No idea why it was preferred this way
* fix(hooks): reset page after filter change
* refactor(alert-history): removed unused code
* fix(alert-history-table): add more safe checks
* fix(pr): address comments
* fix(pr): fallback to known existing keys on error for keys
* fix(pr): reset page on change time
* fix(query-search): pass complete prop
* fix(query-search): clean the code a little bit
* fix(filter-suggestions): remove limit
* feat(links): add back the links
* fix(table): remove type hack with new support for links from backend
* fix(alert-history-suggestions): render empty keys when api call fails
And also shows good loading feedback
* fix(query-search): backdrop-filter leaking visual artifacts for some reason
I was only able to reproduce this on alert-history,
not sure why other places don't have the same issue
* fix(alert-history-filter-suggestions): broken types after openapi update
* Revert "fix(query-search): backdrop-filter leaking visual artifacts for some reason"
This reverts commit
|
||
|
|
e7ab03e47f |
fix(query-builder): guard the operator lookup against an unmapped dataType (#12329)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix: qb oprerator un mapped dataType * refactor: review changes * feat: add tests * test(query-builder): drive search interactions with userEvent Standardise the QueryBuilderSearchV2 suite on userEvent instead of a mix of userEvent and fireEvent. userEvent dispatches the full event sequence a browser produces, which matters for a combobox that filters suggestions on per-character input; fireEvent set the value in one shot and skipped focus/keydown entirely. userEvent v14 wraps interactions in act() internally, so the seven manual `await act(async () => ...)` wrappers are no longer needed. Also name the unmapped-dataType fixture 'not-a-real-data-type' so it cannot be mistaken for a member of the DataTypes enum. --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
110d5971a7 | test(role-settings): increase timeout & reduce amount of dom changes on test (#12346) | ||
|
|
7cc728a9c8 |
feat(llm-attribute-mapping): add Test tab with sample-span runner (#11819)
* feat(llm-attribute-mapping): add Test tab with sample-span runner Adds the Test tab to the LLM Observability Attribute Mapping page, replacing the "Coming soon" placeholder. Users paste a sample JSON span and run it through their configured mappers to preview which target attributes get populated and which source key matched, before saving. - Monaco JSON editor with a SigNoz light/dark theme, inline validation and a prefilled sample span - Result diff view labelling attributes added/changed/unchanged/removed - Payload sends all draft groups; per-group mappers are sent only when they differ from the saved snapshot (null -> backend reuses stored mappers), so unsaved edits are testable without persisting - Expose snapshot from useAttributeMappingEditor; add useCanManageAttributeMapping hook Backed by the span mapper test endpoint (#11795). * chore: remove comments * fix: minor changes * chore: review changes * revert: disable tab changes * feat: update code * feat: add reset button as well --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
bad3850117 |
feat: adding cloud storage service for GCP integration (#12341)
* feat: adding gcp memorystore redis service * refactor: updating dashboard title * refactor: extending width of uptime gauge panel * refactor: updating cpu utilization panel * refactor: updating dashboard panel to use rate function instead of hack * feat: adding compute engine service * refactor: updating dashboard panels to use rate aggregation * fix: correct typo and unit in compute engine dashboard * refactor: migrating dashboard to v6 * feat: adding gcp gke service * chore: generating openapi spec * refactor: updating icon in dashboard JSON * feat: adding gcp cloud storage service * refactor: updating dashboard and integration config * refactor: updating cloud storage icon |
||
|
|
5a8ca9573c |
feat: adding gcp gke service (#12319)
* feat: adding gcp memorystore redis service * refactor: updating dashboard title * refactor: extending width of uptime gauge panel * refactor: updating cpu utilization panel * refactor: updating dashboard panel to use rate function instead of hack * feat: adding compute engine service * refactor: updating dashboard panels to use rate aggregation * fix: correct typo and unit in compute engine dashboard * refactor: migrating dashboard to v6 * feat: adding gcp gke service * chore: generating openapi spec * refactor: updating icon in dashboard JSON |
||
|
|
e62bfb4a4c |
feat(authz): add frontend support for telemetry resources (#12292)
Some checks failed
Release Drafter / update_release_draft (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
* feat(authz): expose telemetry resources in generated frontend permissions * feat(authz): add support for telemetry resources on roles page (#12296) * feat(create-edit-role): add support for telemetry resource * test(create-edit-role): add tests for telemetry resource * fix(pr): address comments * fix(authz): app routing and sidebar fixes when no built-in role (#12307) * fix(sidebar): render fallback when user preferences fails on sidenav Otherwise, it fails and don't show any menu that can be pinned * feat(app-routing): bypass unauthorized when authz is enabled Those pages should render to allow us to handle authz directly in each page/component * fix(private): drop feature flag gate * fix(authz): backfill managed role transaction groups for meter metrics * feat(authz): resolve conflicts * refactor(telemetry-selector): couple fixes after feedback on ux/ui (#12316) * fix(pr): address more ux feedback --------- Co-authored-by: Vinicius Lourenço <12551007+H4ad@users.noreply.github.com> Co-authored-by: Vinícius Lourenço <vinicius@signoz.io> |
||
|
|
51d5d3ea35 |
fix: remove navigator clipboard use while using copy btn (#12333)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix(copy-button): use focus-independent clipboard copy navigator.clipboard.writeText requires document focus and rejects with "Document is not focused" in remote-desktop/VDI/multi-monitor setups. Copy through react-use's useCopyToClipboard (execCommand) via a colocated useCopyButton hook that also owns the transient "copied" state. Fixes SIGNOZ-UI-5J4 * refactor(legend): reuse CopyButton for the copy action Replace the duplicated inline copy button with the shared CopyButton. Each button now owns its own copied state, so the per-item id tracking is no longer needed. * chore(hooks): remove unused useCopyToClipboard hook No longer imported after CopyButton and the legend moved to useCopyButton. |
||
|
|
7eb3f7df32 |
fix(logs): open log details in table (Column) format when activeId is set (#12269)
* fix(logs): open log details in table (Column) format when activeId is set
Opening a log link (?activeLogId=...) and switching to Column/table format
left the highlighted row un-openable — clicking it did nothing.
Root cause: the shared TanStackTable decided open vs. close internally from
`isRowActive` + `onRowDeactivate`. LogsExplorerList had overloaded `isRowActive`
with `|| log.id === activeLogId`, so a URL-highlighted-but-closed row looked
"active" and the first click ran the deactivate (close) path instead of opening.
Fix (PR 1 of 2): move click routing to the consumer.
- Remove `onRowDeactivate` from TanStackTable; it took no args and only fired
when re-clicking the same active row (clicking A→B never deactivated A).
- `onRowClick` now receives a third `{ isActive }` context arg (additive; the
~14 existing consumers are unaffected).
- LogsExplorerList and LiveLogsList own the toggle:
`isActive ? handleCloseLogDetail() : handleSetActiveLog(log)`, and
`isRowActive` tracks only `activeLog?.id`.
The linked-row visual highlight (`isHighlighted`) is deferred to PR 2 (blocked
on a design decision for the highlight color); see
frontend/docs/tdd-tanstack-row-click-routing.md.
* feat(logs): highlight the URL-linked (activeLogId) row in table format (#12271)
Restores the linked-row highlight that the TanStack migration (#10946)
dropped from the table view, without coupling it to click routing.
Uses the table's existing `getRowClassName` hook (styling-only) — no new
shared-table prop:
- LogsExplorerList / LiveLogsList set getRowClassName to 'logs-linked-row'
when `log.id === activeLogId`.
- A global, lowest-specificity rule paints `.logs-linked-row td` using the
per-row `--row-active-bg` var (already set via getRowStyle). The table's own
:hover / .tableRowActive cell rules are higher-specificity !important, so
active/hover correctly win when a linked row is also open or hovered.
`isRowActive` stays `activeLog?.id` only, so the highlighted row still opens on
first click (relies on the routing fix in the base PR).
Color reuses --row-active-bg as a placeholder; a distinct "linked" token is a
follow-up pending design.
Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com>
* chore: remove comments
* chore: remove extra comments
* feat: add e2e for flows
* chore: add test id
* chore: chore: remove comment
* chore: remove comment
* chore: remove comment
* chore: add comment
* chore: remove comment
---------
Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com>
|
||
|
|
5eb3b5e3e0 | test(query-builder): make suggestion-fetch debounce overridable to deflake CodeMirror spec (#12336) | ||
|
|
b88ee12cd5 |
chore(docs): add authz guide (#12317)
* chore(docs): add authz guide * chore(assets): clarify what withAuthZContent means |
||
|
|
6f3dd0b7ad |
fix(querybuilder): give each clickhouse sql refusal its own error code (#12339)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix(querybuilder): give each clickhouse sql refusal its own error code Every refusal used CodeInvalidInput, so the only way to tell why a statement was refused was to match on the message. Counting the failures on a live deployment meant regexing the parser's text out of the log, and grouping by cause meant knowing which of five different messages belonged to the same underlying gap. One code per reason instead, which arrives as exception.code on the warning that LogIfStatementIsNotValid writes, so the failures can be grouped and alerted on directly. Pin the expected code on each failing case, so the mapping is checked rather than assumed. * chore(querybuilder): drop the comment above the error codes The names say it. * fix(querybuilder): separate the parser panic code from the parse failure A panic is a parser defect worth alerting on; a parse failure is a grammar gap that shows up in ordinary traffic. Sharing one code lumps the two together. |
||
|
|
d32d93cd39 |
chore(deps): bump clickhouse-sql-parser to v0.5.3 (#12331)
* chore(deps): bump clickhouse-sql-parser to v0.5.3 v0.5.3 stops lexing a signed number after a closing bracket as one literal, so `(now()-1)` and `arr[1]-1` parse where they used to fail. That was the third of the three gaps the validator trips over on real dashboard SQL, and the only one where the statement had to be rewritten to be accepted. Move the two queries it covers out of the failing set, which is what that test exists to prompt. On the production corpus the rejection rate goes from 6.1% to 5.6% of v5 query shapes; the remaining two gaps, `interval` used as a column name and the standard trim(BOTH x FROM y) syntax, are still open upstream. * chore(querybuilder): link the upstream issue on the signed literal cases |
||
|
|
e9a931788c |
chore(statementbuilder): log key adjustment actions at debug level (#12337)
These fired at info on every query build across the audit, logs and traces builders. The behavior is settled, so drop them to debug and remove the TODOs that asked for exactly this. |
||
|
|
e51c464417 |
fix(frontend): alias lodash to lodash-es to survive a page-level AMD loader (#12332)
@grafana/data's ESM build imports bare CJS `lodash` in ~28 modules. lodash's UMD footer checks for an AMD loader before assigning module.exports, so when a third-party script has already defined window.define.amd, lodash takes that branch and never exports. rolldown can't statically detect lodash's dynamic named exports, so those imports compile to runtime namespace reads against an empty object and every method is undefined. lodash-es is the same version, real ESM, and tree-shakes. |
||
|
|
04637bd960 |
test(querier): assert rendered SQL in skip_resource_fingerprint tests (#12334)
Identical rows can't distinguish the optimized instance from the fingerprint baseline, so the tests now also diff the rendered ClickHouse statement via /query_range/preview: the baseline must join the fingerprint CTE and the optimized instance must not. The assertion is pinned to the "resource_fingerprint GLOBAL IN (SELECT fingerprint FROM __resource_filter)" clause, a literal in the statement builder. The resource condition the fallback path renders on the main table is deliberately not asserted: its column form follows the resource JSON evolution boundary, rendering as a multiIf over resources_string while the query window straddles release_time and collapsing to resource.`key`::String once the window sits past it. Also fixes the fixture env prefix. skip_resource_fingerprint moved out of the querier config namespace into its own, so SIGNOZ_QUERIER_SKIP__RESOURCE__FINGERPRINT_* was being ignored and both instances ran with the optimization disabled. |
||
|
|
0703fbf961 |
feat: adding compute engine service in GCP integration (#12166)
* feat: adding gcp memorystore redis service * refactor: updating dashboard title * refactor: extending width of uptime gauge panel * refactor: updating cpu utilization panel * refactor: updating dashboard panel to use rate function instead of hack * feat: adding compute engine service * refactor: updating dashboard panels to use rate aggregation * fix: correct typo and unit in compute engine dashboard * refactor: migrating dashboard to v6 |
||
|
|
4e45620b72 |
refactor(statementbuilder): drop Builders bundle; fold factories into statement_builder.go (#12330)
Remove the statementbuilder.Builders aggregate. The querier chain (querier.New, signozquerier.NewFactory, NewQuerierProviderFactories) now takes the six per-signal statement builders individually, and signoz.go::newQueryStack returns them directly via a plain multi-return. The statementbuilder package is now config-only. Remove each <signal>statementbuilder/new.go and fold its NewFactory into that package's statement_builder.go (traces' NewOperatorFactory into trace_operator_statement_builder.go), giving the layout: struct -> NewFactory -> New<X>QueryStatementBuilder. |
||
|
|
a9506f1354 |
fix: add meter source where needed during dashboard migration (#12322)
* fix: add meter source during migration * chore: move source field handling to wrapinv5envelope * fix: add migration to backfill source for migrated dashboards * chore: shorten comments |
||
|
|
e2e7caf1ca |
refactor(querier): 3-layer per-signal query architecture (#12304)
Split the five telemetry<signal> packages, which mixed three concerns, into three per-signal layers with a cycle-free dependency direction: - telemetryschema/<signal>telemetryschema — primitives (const + table selection, field_mapper, condition_builder, trace helpers); leaf layer. - statementbuilder/<signal>statementbuilder — SQL generation. The parent statementbuilder package is contract-only (the Builders bundle + Config); each sub-package exposes a factory.ProviderFactory[..., statementbuilder.Config] whose New internalizes FieldMapper/ConditionBuilder/AggExprRewriter and reads SkipResourceFingerprint. Traces exposes two factories (query + operator). telemetryresourcefilter moves here as statementbuilder/resourcefilter. - telemetrymetadata — key/value resolution; NewTelemetryMetaStore collapses from 24 args to (settings, telemetrystore, flagger), sourcing table names from the schema constants. Centralize query-stack assembly in signoz.go via newQueryStack: build the single metadata store, run each per-signal statement-builder factory, assemble the statementbuilder.Builders bundle, and build the bucket cache — once. This is the only place that imports the concrete sub-packages (so the edge runs subs -> parent, cycle-free), and it removes the duplicate metadata store that signozquerier used to build, leaving signozquerier a thin querier.New(*statementbuilder.Builders) adapter. Also: - statementbuilder.Config owns SkipResourceFingerprint (moved off querier.Config). YAML key moves querier.skip_resource_fingerprint -> statementbuilder.skip_resource_fingerprint. - Querier interface moves into querier.go (interfaces.go removed); BucketCache -> bucket_cache.go, Handler -> api.go. - Add pkg/querier/queriertest.MockQuerier. |
||
|
|
bca2370862 |
test(promql): add upstream promqltest conformance corpus and suite (#12156)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
Freezes an absolute-truth oracle from prometheus@v0.311.3's own promql/promqltest testdata: a generator command (scripts/promqltestcorpus, go run .) evaluates upstream's load scripts with the vendored reference engine and writes 755 cases to a committed corpus; a new integration suite replays the ingestion and asserts /api/v5/query_range responses against it. The known-divergences ledger is enforced exactly in both directions and is empty: the serving path matches the reference engine on every case. Also folds in the last serving-path fix the corpus surfaced: the v5 output filter dropped every __-prefixed label, mangling labelsets that legitimately carry one (e.g. __address__); it now strips only known storage keys (__temporality__, __scope./__resource. prefixes). The metrics fixture writes registration rows per (series, hour bucket) with hour-floored timestamps, matching the exporter; the queriermetrics dormant-metric warning test now uses genuinely dormant data (production- shaped registration shares an hour bucket with recently-stale data). Co-authored-by: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
591837152e |
fix(warning-popover): background color to l2 & message alignment (#12302)
Some checks failed
build-staging / prepare (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
* fix: update css styles * feat: add warning popover * chore: revert bg color change * feat: update styles * chore: css conventios --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
2c5b4184c4 |
feat(querier): log user-authored clickhouse sql after running them through the parser (#12301)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix(querier): restrict user-authored clickhouse sql to read-only selects Validate every user-authored ClickHouse statement before it runs: exactly one statement, SELECT only, no table functions and no readonly override. Validation runs on the rendered statement, since substituted variable values are user input too. Apply it to both entry points that reach the telemetry store with user SQL, the clickhouse_sql query type in query_range and the dashboard variables query, and replace the substring blacklist in the latter, which ran before substitution. Also run these statements with readonly = 2 as a backstop. The connection is shared with write paths, so it is opt-in per query and writers never set it. * fix(querier): address review on clickhouse sql validation Rename the validator to ValidateReadOnlySelect and collapse the multi-line error constructions onto single lines. Carry the parse failure in the message rather than as a wrapped cause. Neither renderer surfaces the cause: render.Error reads only the message off the base error, and RespondError reads Error(), which returns the cause alone and drops the message. Both now show the same text with a 400. Add unit tests covering statement kinds, table functions nested in joins, CTEs, subqueries and unions, and readonly overrides. * fix(querier): reject internal databases in user-authored clickhouse sql Reading system or information_schema exposes grants, users and server metadata, and ClickHouse read-only mode does not prevent it, so reject any table reference into them. Update the dashboard variables test for the new rejection message and cover both a statement smuggled through a variable value and a system table read. * fix(querier): reject unterminated block comments before parsing The parser loops forever on an unterminated block comment, so validating a query containing one would spin a request goroutine at full CPU instead of rejecting it. Detect it up front, skipping comment markers that sit inside string literals. Cover the parser panicking on a settings clause with no value in its own test, which asserts the input still panics the parser so the case cannot quietly stop exercising the recover. * fix(querier): drop the block comment guard now the parser handles it The parser no longer loops on an unterminated block comment, so the hand-rolled scan that worked around it is redundant, and it was the riskier of the two: it duplicated the lexer's handling of string literals and could have rejected a legitimate query. Leave the parser as the single source of truth. The panic case likewise no longer panics, so its test can no longer cover the recover and is removed. The recover stays as insurance, since this reaches user-authored SQL and the parser has regressed this way before. Cover INTERSECT and EXCEPT, which the parser only started accepting in this version and which reach a second query through the same rules. * fix(querier): log clickhouse sql validation failures instead of rejecting The parser's grammar has gaps against SQL that ClickHouse accepts, so rejecting whatever it cannot read would break working dashboards and alerts. Sampling a week of production clickhouse_sql found roughly one query in eighteen tripping one of three gaps, none of them reading anything a telemetry query should not. Log the failure with the rendered query instead, so the gaps can be told apart from statements that genuinely break the rules before anything is enforced. Wrap the parse error rather than formatting it in, so a caller can recover the parser's *ParseError and read the position off it. The tests use that to pin the construct each gap stops at, alongside the rewrite that the parser does accept. * chore(querier): tighten the clickhouse sql validation comments Condense the comments to single lines, move the recover note inside the defer it explains, separate the visitor cases, and shorten the log message. Report how many statements were found when rejecting a multi-statement query. * fix(querier): log invalid clickhouse sql on the dashboard variables path too The two callers disagreed: query_range logged and carried on, while dashboard variables rejected. Given the parser trips on roughly one real query in eighteen, that path could refuse a legitimate variable query, and being a rejection it left nothing behind to show it had happened. Both now go through LogIfStatementIsNotValid. prepareQuery is back to rendering and nothing else, so the cases that expected it to police the statement move to where the rules actually live. * fix(querier): drop the read-only clickhouse session Setting readonly on the session was defence in depth for a validator that now only logs, so it guarded nothing while adding a context key and a settings branch to a connection that is shared with every write path. Restore the dashboard variables handler to what it was and call the validation alongside, rather than reworking the rendering to accommodate it. * chore(querybuilder): drop the redundant suffix from the failing case names The test they sit in is already named _Fail. |
||
|
|
0b69f5f677 |
fix: smooth Only/Toggle hover reveal in quick-filters checkbox (#12248)
The Only and Toggle buttons were revealed by overlapping hover triggers (`.value` for Toggle, `.checkbox-value-section` for Only), so hovering the label matched both rules and showed the two buttons side by side, shifting the row layout — the visible hover "jerk". - Scope the Toggle trigger to the checkbox (`.check-box:hover ~ ...`) so it no longer overlaps the label region; Only and Toggle are now mutually exclusive by cursor position. - Stack both buttons in a single grid cell (`.value-actions`) so revealing one swaps in place instead of shifting the row. - Add a fade + slide entry/exit animation (opacity + translateX with `@starting-style` and `display` `allow-discrete`), disabled under prefers-reduced-motion. Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
a28b95da35 |
fix(dashboard-v2): keep new-panel Save enabled after running the query (#12311)
* fix(dashboard-v2): keep new-panel Save enabled after running the query A new panel's Save button re-disabled after Stage & Run: the query-dirty baseline was derived from the live draft.spec.queries, which the run commits the current query into, so the baseline drifted onto the just-run query and isQueryDirty flipped back to false. Freeze the seed used for the new-panel baseline so a run can't reset it. Existing panels are unaffected (they anchor to savedQueries). * fix(dashboard-v2): always allow Save and surface the real save-failure message Two follow-ups to the new-panel Save regression: - Decouple the Save button from the dirty check so it is never disabled on account of "no changes"; Save is gated only by read-only / in-flight. The dirty flag still drives the discard-on-close confirmation. - On a failed save, show the server's error message in the toast description instead of only the generic "Failed to save panel". * feat(dashboard-v2): show the "Unsaved Changes" badge only when the panel is dirty Gate the panel-editor header badge on isDirty so it appears only when there are unsaved edits, and import Badge from the @signozhq/ui/badge subpath. * chore: replaced toast with the error modal * fix: dashboard delete calling v1 api |
||
|
|
b4b8a9fda0 |
fix(api): guard ErrorResponseHandlerV2 against non-envelope error bodies (#12209)
* fix(api): guard ErrorResponseHandlerV2 against non-envelope error bodies
The handler assumed every non-2xx response carried the V2 error envelope
and read response.data.error.code directly. During a deployment the
gateway returns a 5xx with an HTML/empty body, so response.data.error is
undefined and the handler threw its own TypeError, masking the real
failure and crashing the caller.
Type the inbound body as unknown and narrow it with an isErrorV2Resp type
guard; when the body isn't a V2 envelope, synthesize an APIError from the
HTTP status instead of throwing. Callers already pass
AxiosError<ErrorV2Resp>, which stays assignable to AxiosError<unknown>.
* refactor(api): keep ErrorV2Resp signature, launder response.data via unknown
Restore the AxiosError<ErrorV2Resp> signature so it documents that this is
the V2 error handler, and confine the runtime uncertainty to the one spot
that matters: launder response.data through a local unknown binding before
narrowing it with the isErrorV2Resp guard.
* fix(api): use UPSTREAM_UNAVAILABLE code for non-envelope error bodies
Address review: when the response body isn't a V2 envelope (e.g. a gateway
5xx during a deploy), throw a stable UPSTREAM_UNAVAILABLE code instead of
the stringified HTTP status, and trim the guard comment.
* fix(api): use UPSTREAM_UNAVAILABLE fallback code in convertToApiError
When the response body carries no error code, fall back to a stable
UPSTREAM_UNAVAILABLE code instead of a stringified HTTP status, mirroring
the ErrorResponseHandlerV2 fallback.
* test(dashboard-v2): update panelStatus fallback code to UPSTREAM_UNAVAILABLE
convertToApiError now returns UPSTREAM_UNAVAILABLE (not a stringified
status) when the response carries no error code; update the panelStatus
fallback assertion to match.
* fix(api): guard generated-API handler + strengthen V2 handler tests
- Guard the deprecated ErrorResponseHandlerForGeneratedAPIs against a
non-envelope response body (gateway 5xx with HTML/empty body), mirroring
ErrorResponseHandlerV2 — falls back to UPSTREAM_UNAVAILABLE instead of
throwing on response.data.error.code.
- Parametrize the V2 handler tests into an { error, expected } table and
assert the sub-error 'errors' messages, which several UI surfaces rely on.
* revert(api): drop generated-API handler guard from this PR
The deprecated ErrorResponseHandlerForGeneratedAPIs guard broke toAPIError's
defaultMessage fallback (which relied on the handler crashing), regressing the
error UX in ServiceAccount/Roles screens. Moved to a stacked PR + tracked in
engineering-pod#5761. Keeps this PR scoped to ErrorResponseHandlerV2 +
convertToApiError, and the strengthened V2 handler tests remain.
* fix(api): guard deprecated generated-API handler against non-envelope bodies (#12228)
|
||
|
|
de59c123e1 |
fix(metrics-explorer): fetch related dashboards from the v3 API (#12312)
The metric details drawer resolved "N dashboards" through `GET /api/v2/metrics/dashboards`, whose backend walks the raw `data["widgets"]` array and so only matches v1-schema dashboards. Since #12249 migrated stored dashboards to the Perses v6 schema and made `/dashboard/:id` render V2 unconditionally, that endpoint has nothing left to match and the popover silently shows no dashboards. Switch to `useGetMetricDashboardsV2` (`GET /api/v3/metrics/dashboards`, added in #11784), which parses the Perses spec. Response items change from `MetricDashboard` (`widgetId`/`widgetName`) to `DashboardPanelRef` (`panelId`/`panelName`); the popover only reads `dashboardId`/`dashboardName`, so the render path is unchanged. Alerts stay on `/api/v2/metrics/alerts` — there is no v3 counterpart, and it reads the rule store rather than dashboard schema, so it is unaffected. |
||
|
|
9aeb9a8240 |
fix(drilldown): carry the field type through a breakout (#12309)
getBreakoutQuery rebuilt the group-by as `{ key, type }`, dropping `dataType`.
The breakout query then goes out with no field type for the backend to work
from, and a drilldown on the breakout's own result has nothing to branch on —
so a numeric column's filter value gets quoted like a string.
Carrying it through needed the type to be nameable, and it wasn't:
QueryKeyDataSuggestionsProps declared `fieldDataType` as the antlr key-type
enum (`string | number | boolean`), which that endpoint never returns. Five
call sites already cast it back to FieldDataType to get work done.
- declare the suggestions response's `fieldDataType` as FieldDataType, and drop
the casts that existed only to undo the wrong declaration
- convert where a reported type becomes a query-builder one, so the crossing is
a function rather than a cast. The table is keyed `Record<FieldDataType, …>`,
so a type added to the API union fails to compile here instead of going
missing at runtime
- carry `dataType` through getBreakoutQuery; the object now satisfies
BaseAutocompleteData on its own, so that cast goes too
Depends on the operator-lookup fix in #12298: a numeric breakout now carries
`float64`, and before that change the menu threw on anything the operator map
didn't have.
|
||
|
|
44828b4185 |
chore(deps): bump clickhouse-sql-parser to v0.5.2 (#12303)
Some checks failed
build-staging / js-build (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* chore(deps): bump clickhouse-sql-parser to v0.5.2 The parser hangs in an infinite loop on an unterminated block comment and panics on a settings clause with no value, both reachable from user-authored SQL. v0.5.2 fixes those, along with Accept and Walk missing AST children, which anything walking the tree to inspect a query depends on. String() on Expr is gone in favour of FormatSQL, so the callers that rendered a node back to SQL now go through the Format helper, which formats compactly the way String() did. * test(querierlogs): cover the rate aggregation family rate and rate_sum divide by the query window rather than the step, and nothing exercised that path, so a change to how the aggregation expression is rendered would have gone unnoticed. Assert both against the inserted logs. The window is now passed to the request helper instead of relying on its default, since these are the only assertions in the file that depend on it. * test(querierlogs): match the response rounding for rate expectations Scalar responses round floats to three significant figures below one, and the rates are the only values in this test that do not divide evenly, so compare against the rounded form rather than the exact quotient. * test(queriertraces): cover the rate aggregation family Traces derives the scalar rate window separately from logs, so a divergence between the two would go unnoticed with only the logs case. rate_sum here is taken over the intrinsic duration column, which also puts it on the other side of the response rounding boundary from the logs test. |
||
|
|
33a0cd043c |
fix(dashboard-v2): stop the table drilldown crashing on a numeric group-by (#12298)
Clicking a numeric group-by column in a V2 table panel replaced the whole dashboard with "Something went wrong :/". getGroupContextMenuConfig indexed QUERY_BUILDER_OPERATORS_BY_TYPES with the group-by's `dataType` and called `.filter` on the result. That map is keyed by the V3 data types, but a V2 panel's group-by carries the V5 `fieldDataType`, and the backend stores every `float64` as `number` — a key the map has never had. The lookup returned undefined, `.filter` threw during render, and the page-level error boundary swallowed the dashboard. The same gap made isNumberDataType miss `number`, so the filter value was sent as a quoted string instead of a number. Resolve the operator list through a table that knows `number`, falling back to the string set so an unmapped type can't white-screen a panel, and treat `number` as numeric. No query payload changes. |
||
|
|
1a6a693466 | refactor(cloud-integrations): remove cloud_integration_id query param (#12300) | ||
|
|
3e35d1ef64 |
fix(dashboards-v2): new panel reads clean on open, not dirty (#12297)
The panel-editor dirty check trips a new panel the instant it opens: an
untouched, query-less new panel (e.g. Time Series) showed Save enabled and a
discard-changes prompt with no user edit.
The isDirty third clause `(isNew && draft.spec.queries.length > 0)` gates a new
panel as savable once it carries a query — List auto-seeds one, other kinds open
query-less. It read the live `draft`, but the staged-query sync (added in
|
||
|
|
1483fbd2c5 |
fix(query-builder): coerce table sort values to string to avoid localeCompare crash (#12289)
The QueryTable column sorter called `.localeCompare` on values cast with `as string`, which is compile-time only. Upstream `processTableRowValue` normalizes numeric-looking strings to real numbers while null becomes the string "N/A", so a grouped column can mix numbers and text. Comparing a number cell against a text cell skipped the numeric branch and invoked `(200).localeCompare(...)`, throwing "localeCompare is not a function" and crashing the table on sort. Extract the compare logic into `compareTableColumnValues` and coerce both sides with `String(x ?? '')` so any value type sorts safely while preserving empty-string semantics for null/undefined. Affects all QueryTable surfaces: Traces/Logs table views, APM Top Operations, and dashboard Table panels. Fixes SIGNOZ-UI-5GC |
||
|
|
1255637e25 | fix(authz): changelog column type for postgres metastore (#12299) | ||
|
|
38639847be | fix: clamp over-wide widgets, drop zero-width widgets, and properly handle invalid order by (#12295) | ||
|
|
31cb4d7520 |
feat(logs): unwrap lone message field from json log body (#12206)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
5ede27e8fb |
fix(ai-assistant): page context for the V2 panel editor (edit + create) and the v2 dashboards list in the picker (#12291)
* fix(ai-assistant): add page context for the V2 panel editor route The V2 panel editor lives on `/dashboard/:dashboardId/panel/:panelId`, which `getAutoContexts` never matched — the three existing dashboard matchers are all `exact`, so a 4-segment URL fell through every branch and the assistant opened with no context chip and a page type of `other`. A saved panel maps to `panel_edit` with its id. The unsaved `panel/new` route has no id to attach yet and the schema requires a non-empty `panel_edit.widgetId`, so it degrades to the dashboard context; the in-progress query and time range still ride along in shared metadata. * fix(ai-assistant): use the v2 dashboards list in the context picker `GET /api/v1/dashboards` is now a stub that returns a V1-deprecated error, and `useGetAllDashboard` routes errors through `useErrorModal` — so opening the picker on the Dashboards tab both showed "Failed to load dashboards" and popped a global error modal. Switch to `useListDashboardsForUserV2`, the same source the V2 list page and export picker already use. `resolveAutoContextName` reads the v2 query key from cache too, so auto-context chips resolve to real dashboard titles again instead of falling back to a generic label. The assistant was the last live caller of the v1 list: the only other one, `container/ListOfDashboard`, is unreachable now that the routed `pages/DashboardsListPage` renders the V2 page. * fix(ai-assistant): report panel_create on the unsaved panel editor `/dashboard/:id/panel/new` previously reported `dashboard_detail`, so the assistant was told the user was looking at a dashboard rather than creating a panel. It now reports `panel_create`, which renders a "New panel" chip. `PageTypeDTO` has no `panel_create` member — `alert_new` is the precedent it's missing — so `resolvePageType` maps it to `panel_edit` until the backend adds one. An unmapped key would fall through to `other` and lose the empty-state chips. The context itself carries no `widgetId`, which the schema only requires when `metadata.page` is literally `panel_edit`. Also drops the `DASHBOARD_WIDGET` matcher. That V1 route is unreachable — nothing generates a link to it since V2 always builds panel-editor paths — and it read the `:widgetId` path segment, which V1's own page ignored in favour of `?widgetId=`, so its `widgetId` was never right. |
||
|
|
5d41c5c016 |
fix(dashboard): variable value hover reveals, readable collapsed-bar 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.
|
||
|
|
6dcc9f191d |
fix(query-builder): drop empty having from V5 query payload (V2 panel 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.
|
||
|
|
52df42511b |
fix(dashboard-v2): config-pane restyle, section quick-add, pie labels & 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
|
||
|
|
08715a704a |
feat(rulestatehistory): populate related logs/traces links in v2 history APIs (#12211)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* 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> |
||
|
|
41c66f2634 |
chore: add sql migration for dashboards (#12249)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* chore: add migration script from current to perses dashboard * fix: move WrapInV5Envelope to types package * fix: generate internal name from title * fix: match with lower case signal for variables * fix: sanitize tags instead of throwing error * fix: extract row and widget positions to build expanded sections * chore: add a catch all panic check to log migration error * chore: catch typecast errors * fix: remove nil nil return * test: fix ut to check for v2 internal name * chore: remove spec md file * chore: separate error type for migration * feat: note down all errors in migration * fix: allow zero value for threshold values * fix: ignore react placeholders in layout * fix: note error in query parsing * fix: read threshold value properly during migration * fix: adjust to schema changes in variables * test: fix unit tests * fix: catch error from decodeTelemetryFields * fix: make threshold value non-nullable * fix: handle list of widget IDs in panel maps * fix: add better error note down for failed conversions * fix: normalize having array from v4 schema * fix: remove metric aggregation from non metric queries (malformed json) * fix: normalize telemetry field keys in query * chore: add temporary doc for other malformation handlers needed * fix: add more malformed query handling * fix: add more malformation handling * chore: reuse transition package (adds dependency, need to see what to do) * fix: fix go lint issue * revert: remove md file * fix: make none the default fill mode during migration * fix: add nil check on limit value when normalizing page size * fix: validate dashboard spec after migration * fix: remove unused method * fix: match shape safe version to existing version * chore: improve variable names * chore: better comments and names in layout migrator * chore: add explanation comment for continuing on empty id widget * fix: ditch dynamic vars with no attr, rearrange overlapping layouts * fix: add default aggregation count() if none is present in logs/traces * fix: add empty list tolerance to v1 variables * fix: add fixes based on backup migration testing * chore: skip over unreferenced widgets * chore: remove widgets that have a single query that has no metric name * chore: assign missing formula names like ui does * chore: assign query names to queries if missing * chore: drop legacy filter fields that ui also ignores * chore: make migration drop widgets that have no aggregations for metrics * chore: normalize group by * chore: remove expressions from metric aggregations * chore: add more error notes * chore: replace em dash with hyphen in widget id * chore: add more panel id sanitization * chore: replace faulty order by keys with aggregation expression * chore: fill valid span gaps * chore: handle misformed threshold operators * chore: remove repeat occurences of widgets in layouts * chore: remove limits that cross max limit * chore: restore function args malformed by v4->v5 migration * chore: remove invalid functions * chore: skip variables in wrong type * chore: add wdiget id type check in layout migration * chore: add a.count to malformed order by keys list * chore: remove bad aggregations that accompany valid ones * chore: drop trace operators with no expression * chore: drop invalid formulas * chore: skip unknown panel kind * chore: drop widgets with >1 and all aggregations as malformed * chore: skip empty type variables * chore: pass threshold format raw without typecasting * chore: add handling for trace operators around wrapinv5env * chore: handle no string value for variable sort * test: fix span gaps test * chore: undo schema change in threshold value * chore: final set of error fixes/hacks * fix: fix build errors post merge conflicts * test: remove test for floating pt value * test: use appendf instead of sprintf * feat: add scaffolding to migrate dashboards * chore: add sql migration for dashboards * fix: fill in ref path when building grid layout * feat: handle v1 payloads in v2 create api * fix: return empty objects instead of null if no variables/panels/layouts are there * test: fix unit test for empty layouts * test: fix unit test for empty layouts * fix: add empty links array in migration * test: add unit test to show v5 takes precedence over v4 * fix: change EXISTS to exists so that migrateCommon handles it properly * test: add unit test for count with attributes * fix: run order by handling after default aggregation handling * fix: restore formula fields that wrapinv5envelope removes * fix: keep thresholds that do not have an optional label * fix: force allowAll to be false if allowMultiple is false * fix: migrate name column even if data column migration fails * chore: add orgid name unique index post dashboard migration * fix: use slog for logging * refactor(dashboard): re-host ConvertAllV1ToV2 off the Module interface Mirror base's removal of ConvertAllV1ToV2 from the shared files (Module interface, v2_module.go, EE delegation, result types) so future base→branch merges stay conflict-free, and re-host the capability in dedicated branch-only files (V1ToV2Migrator interface + module method + result types). Migration 103 now obtains it via a dashboard.V1ToV2Migrator type assertion. * refactor(dashboard): drop ConvertAllV1ToV2 module scaffolding from base Remove the temporary v1→v2 bulk-conversion module method (ConvertAllV1ToV2 + migrateOneV1ToV2), its result types (V1ToV2MigrationResult / V1ToV2MigrationItem), the Module interface entry, and the EE delegation. This scaffolding lives on the migration feature branches, not the base branch that merges to main. V1Name and store.UpdateName are kept (small helpers; UpdateName is on the shared Store interface). * fix: add image validation and base64 to asset conversion * fix: move org migration from module to 103 * refactor(dashboard): always use V2, remove use_dashboard_v2 flag (#12252) * chore: pass tag module and dashboard store from signoz.go into the migration * chore: run migration in transaction * test(dashboards-v2): drop V1 export variant from explorer export tests The use_dashboard_v2 flag was removed on this branch, but #12283 landed on main making these tests flag-aware (V1 + V2). The merge left the suite referencing FeatureKeys.USE_DASHBOARD_V2 (type error) and exercising a V1 dashboards API the export hooks no longer call (3 failing tests). Collapse describe.each to the V2 contract only, matching how the sibling export-hook tests were de-flagged. --------- Co-authored-by: Srikanth Chekuri <srikanth.chekuri92@gmail.com> Co-authored-by: Ashwin Bhatkal <ashwin96@gmail.com> Co-authored-by: Pandey <vibhupandey28@gmail.com> |
||
|
|
503afb13d4 |
test(dashboards-v2): make explorer export tests flag-aware (V1 + V2) (#12283)
The "Add to dashboard" export dialog is flag-aware via `use_dashboard_v2`: V1 hits `/api/v1/dashboards`, V2 hits the generated endpoints `GET /api/v2/users/me/dashboards` and `POST /api/v2/dashboards`, whose response shapes differ. The tests only mocked V1 and only ran the V1 path (the flag is off in the default test context), so the V2 contract was never exercised. Parametrize the onExport tests over the `use_dashboard_v2` flag, mocking and asserting per contract so both paths are covered and the suite can't drift when the default flips. Also sync on the picker's enabled (loaded) state before clicking the combobox — antd disables the Select while the list request is in flight and a click on a disabled combobox is a no-op. |
||
|
|
774dfc48ae |
chore: deprecate v1 dashboard APIs with proper reference to v2 APIs (#12273)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* chore: deprecate v1 dashboard APIs with proper reference to v2 APIs * fix: use generic doc for all deprecated APIs * test: update integratoin tests to account for deprecation |
||
|
|
d013eab29d |
chore: migrate integration dashboards to v2 (#12242)
* chore: add migration script from current to perses dashboard * fix: move WrapInV5Envelope to types package * fix: generate internal name from title * fix: match with lower case signal for variables * fix: sanitize tags instead of throwing error * fix: extract row and widget positions to build expanded sections * chore: add a catch all panic check to log migration error * chore: catch typecast errors * fix: remove nil nil return * test: fix ut to check for v2 internal name * chore: remove spec md file * chore: separate error type for migration * feat: note down all errors in migration * fix: allow zero value for threshold values * fix: ignore react placeholders in layout * fix: note error in query parsing * fix: read threshold value properly during migration * fix: adjust to schema changes in variables * test: fix unit tests * fix: catch error from decodeTelemetryFields * fix: make threshold value non-nullable * fix: handle list of widget IDs in panel maps * fix: add better error note down for failed conversions * fix: normalize having array from v4 schema * fix: remove metric aggregation from non metric queries (malformed json) * fix: normalize telemetry field keys in query * chore: add temporary doc for other malformation handlers needed * fix: add more malformed query handling * fix: add more malformation handling * chore: reuse transition package (adds dependency, need to see what to do) * fix: fix go lint issue * revert: remove md file * fix: make none the default fill mode during migration * fix: add nil check on limit value when normalizing page size * fix: validate dashboard spec after migration * fix: remove unused method * fix: match shape safe version to existing version * chore: improve variable names * chore: better comments and names in layout migrator * chore: add explanation comment for continuing on empty id widget * fix: ditch dynamic vars with no attr, rearrange overlapping layouts * fix: add default aggregation count() if none is present in logs/traces * fix: add empty list tolerance to v1 variables * fix: add fixes based on backup migration testing * chore: skip over unreferenced widgets * chore: remove widgets that have a single query that has no metric name * chore: assign missing formula names like ui does * chore: assign query names to queries if missing * chore: drop legacy filter fields that ui also ignores * chore: make migration drop widgets that have no aggregations for metrics * chore: normalize group by * chore: remove expressions from metric aggregations * chore: add more error notes * chore: replace em dash with hyphen in widget id * chore: add more panel id sanitization * chore: replace faulty order by keys with aggregation expression * chore: fill valid span gaps * chore: handle misformed threshold operators * chore: remove repeat occurences of widgets in layouts * chore: remove limits that cross max limit * chore: restore function args malformed by v4->v5 migration * chore: remove invalid functions * chore: skip variables in wrong type * chore: add wdiget id type check in layout migration * chore: add a.count to malformed order by keys list * chore: remove bad aggregations that accompany valid ones * chore: drop trace operators with no expression * chore: drop invalid formulas * chore: skip unknown panel kind * chore: drop widgets with >1 and all aggregations as malformed * chore: skip empty type variables * chore: pass threshold format raw without typecasting * chore: add handling for trace operators around wrapinv5env * chore: handle no string value for variable sort * test: fix span gaps test * chore: undo schema change in threshold value * chore: final set of error fixes/hacks * fix: fix build errors post merge conflicts * test: remove test for floating pt value * test: use appendf instead of sprintf * chore: migrate integration dashboards to v2 * feat: add scaffolding to migrate dashboards * fix: fill in ref path when building grid layout * feat: handle v1 payloads in v2 create api * fix: return empty objects instead of null if no variables/panels/layouts are there * test: fix unit test for empty layouts * fix: add empty links array in migration * chore: rerun migration after links and signal change * test: add unit test to show v5 takes precedence over v4 * fix: change EXISTS to exists so that migrateCommon handles it properly * test: add unit test for count with attributes * fix: run order by handling after default aggregation handling * fix: restore formula fields that wrapinv5envelope removes * fix: keep thresholds that do not have an optional label * fix: force allowAll to be false if allowMultiple is false * chore: rerun migration * fix: migrate name column even if data column migration fails * fix: use slog for logging * refactor(dashboard): re-host ConvertAllV1ToV2 off the Module interface Mirror base's removal of ConvertAllV1ToV2 from the shared files so future base→branch merges stay conflict-free, and re-host the capability in dedicated branch-only files (V1ToV2Migrator interface + module method + result types). * refactor(dashboard): drop ConvertAllV1ToV2 module scaffolding from base Remove the temporary v1→v2 bulk-conversion module method (ConvertAllV1ToV2 + migrateOneV1ToV2), its result types (V1ToV2MigrationResult / V1ToV2MigrationItem), the Module interface entry, and the EE delegation. This scaffolding lives on the migration feature branches, not the base branch that merges to main. V1Name and store.UpdateName are kept (small helpers; UpdateName is on the shared Store interface). * fix: add image validation and base64 to asset conversion * fix: remove unneeded interface * chore: rerun migration * fix: make ReencodeInlineSVGImage so that migration script can call it * chore: remove temp script * fix: remove local laptop default value --------- Co-authored-by: Srikanth Chekuri <srikanth.chekuri92@gmail.com> |
||
|
|
27f47f3ebc |
fix(dashboard): V2 pie legend format/height + table empty-cell parity with V1 (#12282)
* fix(dashboard): align pie chart legend height with other panels
The pie legend wrapper was missing box-sizing:border-box and
overflow:hidden and applied top padding unconditionally, so its height
exceeded the value from calculateChartDimensions and clipped the donut.
Mirror the shared chart legend wrapper so the height is honored, gating
the top padding to the right-legend position.
* fix(dashboard): render empty table cells as n/a instead of zero
Empty scalar cells (null/undefined/'') were coerced via Number() to 0,
so they rendered as 0, picked up value-column color thresholds, and
sorted as real zeros. Route cells through toCellNumber (NaN for empty)
so empties show n/a, skip threshold coloring, and sort last.
* fix(dashboard): serialise V2 pie legends as {key="value"} for parity with V1
V2's pie renderer joined only the group-by values, showing legends like
"write" where V1 shows {direction="write"}. Route the single-value-column
label through getLabelName (as V1's slicesFromSeries does), reusing the
labels map already built for drilldown. Multi-value-column labels are
unchanged.
|
||
|
|
18f5baafa0 |
fix: enforce scalar response contract + reject invalid v2 dashboard bodies (#12276)
* fix: enforce scalar response contract for promql and metric builder queries * fix: reject invalid v2 dashboard bodies instead of migrating them as v1 * fix(dashboards-v2): post legacy v1 dashboards unchanged from the import flow * fix: add reduce to for scalar requests if not present --------- Co-authored-by: Naman Verma <naman.verma@signoz.io> |
||
|
|
e728942fec |
fix: handle malformed reduceTo + pick correct columns for traces in list panel (#12275)
Some checks failed
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
|
||
|
|
5bf95534ad |
fix: reencode svg images to base64 when migrating dashboards (#12274)
Some checks failed
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
51819d6337 |
chore: add migration script from current to perses dashboard (#11712)
* chore: add migration script from current to perses dashboard * fix: move WrapInV5Envelope to types package * fix: generate internal name from title * fix: match with lower case signal for variables * fix: sanitize tags instead of throwing error * fix: extract row and widget positions to build expanded sections * chore: add a catch all panic check to log migration error * chore: catch typecast errors * fix: remove nil nil return * test: fix ut to check for v2 internal name * chore: remove spec md file * chore: separate error type for migration * feat: note down all errors in migration * fix: allow zero value for threshold values * fix: ignore react placeholders in layout * fix: note error in query parsing * fix: read threshold value properly during migration * fix: adjust to schema changes in variables * test: fix unit tests * fix: catch error from decodeTelemetryFields * fix: make threshold value non-nullable * fix: handle list of widget IDs in panel maps * fix: add better error note down for failed conversions * fix: normalize having array from v4 schema * fix: remove metric aggregation from non metric queries (malformed json) * fix: normalize telemetry field keys in query * chore: add temporary doc for other malformation handlers needed * fix: add more malformed query handling * fix: add more malformation handling * chore: reuse transition package (adds dependency, need to see what to do) * fix: fix go lint issue * revert: remove md file * fix: make none the default fill mode during migration * fix: add nil check on limit value when normalizing page size * fix: validate dashboard spec after migration * fix: remove unused method * fix: match shape safe version to existing version * chore: improve variable names * chore: better comments and names in layout migrator * chore: add explanation comment for continuing on empty id widget * fix: ditch dynamic vars with no attr, rearrange overlapping layouts * fix: add default aggregation count() if none is present in logs/traces * fix: add empty list tolerance to v1 variables * fix: add fixes based on backup migration testing * chore: skip over unreferenced widgets * chore: remove widgets that have a single query that has no metric name * chore: assign missing formula names like ui does * chore: assign query names to queries if missing * chore: drop legacy filter fields that ui also ignores * chore: make migration drop widgets that have no aggregations for metrics * chore: normalize group by * chore: remove expressions from metric aggregations * chore: add more error notes * chore: replace em dash with hyphen in widget id * chore: add more panel id sanitization * chore: replace faulty order by keys with aggregation expression * chore: fill valid span gaps * chore: handle misformed threshold operators * chore: remove repeat occurences of widgets in layouts * chore: remove limits that cross max limit * chore: restore function args malformed by v4->v5 migration * chore: remove invalid functions * chore: skip variables in wrong type * chore: add wdiget id type check in layout migration * chore: add a.count to malformed order by keys list * chore: remove bad aggregations that accompany valid ones * chore: drop trace operators with no expression * chore: drop invalid formulas * chore: skip unknown panel kind * chore: drop widgets with >1 and all aggregations as malformed * chore: skip empty type variables * chore: pass threshold format raw without typecasting * chore: add handling for trace operators around wrapinv5env * chore: handle no string value for variable sort * test: fix span gaps test * chore: undo schema change in threshold value * chore: final set of error fixes/hacks * fix: fix build errors post merge conflicts * test: remove test for floating pt value * test: use appendf instead of sprintf * feat: add scaffolding to migrate dashboards * fix: fill in ref path when building grid layout * feat: handle v1 payloads in v2 create api * fix: return empty objects instead of null if no variables/panels/layouts are there * test: fix unit test for empty layouts * fix: add empty links array in migration * test: add unit test to show v5 takes precedence over v4 * fix: change EXISTS to exists so that migrateCommon handles it properly * test: add unit test for count with attributes * fix: run order by handling after default aggregation handling * fix: restore formula fields that wrapinv5envelope removes * fix: keep thresholds that do not have an optional label * fix: force allowAll to be false if allowMultiple is false * fix: migrate name column even if data column migration fails * fix: use slog for logging * refactor(dashboard): drop ConvertAllV1ToV2 module scaffolding from base Remove the temporary v1→v2 bulk-conversion module method (ConvertAllV1ToV2 + migrateOneV1ToV2), its result types (V1ToV2MigrationResult / V1ToV2MigrationItem), the Module interface entry, and the EE delegation. This scaffolding lives on the migration feature branches, not the base branch that merges to main. V1Name and store.UpdateName are kept (small helpers; UpdateName is on the shared Store interface). * fix: add image validation and base64 to asset conversion --------- Co-authored-by: Srikanth Chekuri <srikanth.chekuri92@gmail.com> |
||
|
|
d22ee8f7aa |
fix(telemetrymetadata): update fallback to false for positive operators in related values queries (#12250)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
* chore: update fallback to false for positive operators * chore: changed to distributed table * chore: flip AND to or in outside condition * chore: added data_source condition * chore: added integration tests * chore: simplified comment * chore: more simplified comment * chore: test case both columns contain host.name -> resources take precedence |
||
|
|
5b004d1efc |
refactor(dashboard): store system icons as SVG assets with a safe image resolver (#12259)
* feat(dashboard-v2): add file-based dashboard icons and logos with a safe image resolver * refactor(dashboard-v2): render dashboard icons via the safe resolver * fix(dashboard-v2): clamp dashboard icon size to 16px * fix(dashboard-v2): reject invalid dashboard image before saving * fix(dashboard-v2): validate dashboard image server-side * test(dashboard-v2): stub the Vite-only icon glob for jest and align image fixtures * test(dashboard-v2): update patch test for image validation * refactor(dashboard-v2): hoist dashboard image consts/regex and tidy validation tests * refactor(dashboard-v2): drop the validateImage doc comment |
||
|
|
ecb77af4cb |
chore: fix schema and validations based on migration errors (#12263)
Some checks failed
Release Drafter / update_release_draft (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / staging (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
* chore: fix schema based on migration errors * test: add rejection based integration tests for new validations * fix: remove datasource field from schema |
||
|
|
973429a22f |
fix(logs): stop hasToken and hasAny/hasAll 500s on separator and big-int needles (#12261)
Some checks failed
build-staging / staging (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
hasToken(body, <needle>) returned a 500 whenever the needle contained a token separator or whitespace (ClickHouse code 36). Validate the needle up front in conditionForHasToken (the single choke point for both legacy and JSON modes) and return a clean 400 pointing at CONTAINS instead. hasAny/hasAll on a legacy body array returned a 500 for a quoted integer needle >= 2^32: clickhouse-go binds it as a concrete Array(UInt64), which has no supertype with the Array(Nullable(Int64)) extraction that the function must unify (code 386). CAST the needle array to Array(Int64) to match the extraction. Scalar has() and the scalar OR-fallback are value-level and unaffected. |
||
|
|
9f5ad1ba26 |
fix: list gcp accounts was missing config (#12175)
* fix: list gcp accounts was missing config * refactor: updating cloudintegration integration tests * refactor: moving variables to test file * chore: removing verbose comments |
||
|
|
b2574e7797 |
fix: remove requirement for links to be always present (#12260)
* fix: remove requirement for links to be always present * fix: make links use defined type * test: add integration test for link omission roundtrip * test: change not in to None for links in panel --------- Co-authored-by: Ashwin Bhatkal <ashwin96@gmail.com> |
||
|
|
cbde4dca41 |
fix(dashboard-v2): templates header, long-title handling, variable icon & unified delete modal (#12256)
Some checks failed
build-staging / staging (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(dashboard-v2): add "Request a new template" header to templates tab * fix(dashboard-v2): keep toolbar tags intact when the dashboard title is long * fix(dashboard-v2): use a subtle outline info icon in the variables bar * fix(dashboard-v2): truncate long dashboard title in the breadcrumb * refactor(dashboard-v2): share one delete-confirm modal for views and dashboards * fix(dashboard-v2): reduce panel area horizontal padding * fix(dashboard-v2): show loader while deleting a saved view Deleting a saved view was fire-and-forget: the confirm modal closed instantly and the row vanished later on refetch, with no loading feedback. Make the delete awaitable end-to-end (deleteView -> removeView -> handleRemoveView -> ViewsRail onConfirm) so the shared confirm modal keeps its Delete button loading until the backend call settles, then closes — matching dashboard delete. The active view resets only on success. * fix(dashboard-v2): fire delete success toast after the list refetches Move the dashboard delete success toast to after the list is invalidated and refetched, so it appears once the row is gone, and use a plain success message. * fix(dashboard-v2): centre the delete-confirm alert icon to match v1 The shared delete-confirm modal top-aligned the CircleAlert (align-items: flex-start + a margin-top nudge) at size 20; centre it against the body (align-items: center) at size 3xl, matching the v1 dashboard delete button. |
||
|
|
aabe59103d |
fix(dashboard-v2): variable selection (default reset + multiselect commit-on-close) (#12254)
Some checks failed
build-staging / staging (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(NewSelect): make multi-select Only/All + Toggle real clickable pills * fix(dashboard-v2): reset variable default only on real option-set changes * fix(dashboard-v2): multiselect value selection — commit on close, skip unchanged cascade, allow clear * fix(dashboard-v2): fix multiselect tag layout in the variable pill * fix: format issue * fix(dashboard-v2): clear invalid variable default and fix useVariableForm test OOM Stabilize the useVariableForm test props so the reset-on-`initial` effect no longer loops into a heap OOM (the hook relies on a stable `initial` reference, which memoized callers already provide). With the suite now running, align the QUERY/CUSTOM default-reset to clear an invalidated default to empty rather than pinning the first option, matching the DYNAMIC path and letting resolution fall back to the first option / ALL. * refactor(NewSelect): extract option-row button handler out of JSX Pull the repeated stopPropagation/preventDefault/select/reset logic on the option row's checkbox, Only/All and Toggle buttons into a single `selectFromButton(e, source)` helper so the JSX stays readable. |
||
|
|
6c957d1e8b |
feat(dashboard-v2): ANTLR-composed apply-to-panels with an impact review dialog (#12181)
* fix(dashboard-v2): compose panel filter via ANTLR so apply/remove respect precedence * feat(dashboard-v2): review apply-to-panels query changes in the impact dialog * feat(dashboard-v2): surface non-builder panel queries in the apply-to-panels review findApplyUsages now emits an editable row for every selected panel query that does not yet reference the variable — PromQL/ClickHouse rows default to their current text (never auto-injected) so the review dialog opens for them instead of silently no-op'ing. Adds isVariableAppliedToAllPanels, a cheap boolean scan (no ANTLR) for the 'apply to all' disabled state. * feat(dashboard-v2): route apply-to-all through the review dialog The list-row 'Apply to all' now opens the same VariableImpactDialog review (all panels as target) instead of a plain confirm, and is disabled with an 'Already applied to all panels' tooltip once every panel query references the variable. Removes the now-redundant ApplyToAllDialog and the dead build*VariableToPanelsPatch helpers. |
||
|
|
de1e21a050 |
fix(dashboard-v2): variable, panel-layout, and dashboards-list bug-bash fixes (#12178)
* feat(dashboard-v2): compact panel layout before persisting drag and JSON edits * feat(dashboard-v2): resolve and persist user-typed variable selection across refetch * feat(dashboard-v2): expose image field and close-on-Escape in the JSON editor * fix(dashboard-v2): keep a custom dashboard image selectable in the overview picker * fix(dashboard-v2): variable form & bar fixes * fix(dashboard-v2): unify section title modal, keep open on error * refactor(dashboard-v2): dashboard-list tags (popover to tooltip, TagBadge, DashboardRowTags) * fix(dashboard-v2): sync locked state to the detail cache after list-page toggle * fix(dashboard-v2): stop the variable value control from showing scrollbars * fix(dashboard-v2): hide the not-recommended pill below 1280px, not 1024px |
||
|
|
85abfd626e |
fix(tracedetail): correct EndTimestampMillis in flamegraph API response (#12251)
* fix(tracedetail): use span-derived bounds for flamegraph EndTimestampMillis The trace_summary MV stores max(timestamp) as 'end', which is the maximum span *start* time. For the final span of a trace, this misses the span's duration entirely, making EndTimestampMillis shorter than the actual trace end. FlamegraphTrace already computed the correct end via updateTimeRange (end = max(span_start + duration)) but only used it internally for bucket sampling. Add TimeRange() to expose these span-derived bounds and use them in both getFullFlamegraph and getWindowedFlamegraph instead of summary.End. The waterfall was unaffected — NewWaterfallTraceFromSpans already computes endTime = max(span.TimeUnix + span.DurationNano) from actual spans. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GxTqz7CqqmoFEPHFqhJUCa * chore: remove unnecessary comments --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|
|
66c7e2d157 |
feat(trace-details): download full trace from trace details page (#12115)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat: add blob-stitching and part-fetch primitives for chunked downloads * feat: add bounded worker-pool runner for chunked downloads * feat: add trace download store, query and progress panel * feat: add download trace option to trace options menu * feat: update tests |
||
|
|
3c5c2cdcd9 |
refactor(infrastructure-monitoring-v2): remove map between dot and underscore attributes (#12214)
* refactor(infrastructure-monitoring-v2): remove map between dot and underscore attributes * test(entity-metrics): fix test |
||
|
|
cd1861ff87 |
chore: bump package versions (#12213)
* chore: bump axios version * chore: bump more packages --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
f0a0b95ecd |
chore: removed code and tests (#12243)
Co-authored-by: Pandey <vibhupandey28@gmail.com> |
||
|
|
38340b5027 |
fix(dashboards-v2): dedicated "all" dynamic-variable signal + required non-nullable links (#12201)
* fix(dashboards-v2): make panel/dashboard links required and non-nullable * fix: validate links on read from db as well * fix: allow all as value for signal * fix: dont allow empty string for signal * fix(dashboards-v2): dedicated `all` dynamic-variable signal (frontend + client) * test: add empty links to new payloads in integration tests --------- Co-authored-by: Naman Verma <naman.verma@signoz.io> |
||
|
|
fba56e9a64 |
fix(dashboard): filter-quote escaping, panel export encoding, right-legend width, number-panel query warning (#12246)
* fix(qb): stop doubling escaped quotes on filter round-trip formatSingleValue escapes ' -> \' when quoting a filter value, but its inverse (unquote, in formatSingleValueForFilter) stripped the quotes without unescaping. Each expression <-> filters round-trip therefore added a backslash. "Create alert from panel" re-reads the query through the URL twice, so a filter like name = 'it\'s a ribbon' arrived at the alert page as name = 'it\\'s a ribbon' and failed the filter parser. Unescape \' -> ' so the round-trip is lossless. * fix(dashboard): double-encode compositeQuery in panel export link useGetCompositeQueryParam decodes the compositeQuery param twice, so a single encode left a bare %/+ from a filter expression (e.g. ILIKE 'Inf%') that made the reader's second decode throw and drop the whole query. Encode twice in buildExportPanelLink so the query survives the round-trip. * fix(dashboard): size right legend column to the longest label A right-positioned legend is a single vertical column, so give it its own width budget and size it to fit the longest series label, clamped to [150px, min(320, 40% of container width)], instead of the shared bottom-legend cap. Long service names no longer ellipsize in the pie/donut legend. * feat(dashboard): warn when a number panel has more than one query enabled A Number panel renders only the first query's value, so leaving extra queries enabled (e.g. a formula plus its inputs) silently shows the wrong value with no feedback. Surface a warning in the panel editor and on the rendered panel when a Number panel has more than one enabled query. Refs #9512 |
||
|
|
cbc8b5424b |
feat(qb): parse search() in the filter grammar (not yet implemented) (#12129)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
Add a search('needle') function to the filter grammar, recognized but not
yet executed - using it returns "search is not yet supported" instead of a
syntax error. Alert links, dashboard variables, and the contradiction check
pass it through untouched. `search` is now reserved, like has/hasAny.
|
||
|
|
7ac6df6fb0 |
feat(query-builder): fieldContext prefixed key suggestions (#12200)
* feat(query-builder): fieldContext-prefixed key suggestions and type-aware operator filtering * test(query-builder): extract shared CodeMirror DOM mocks for jsdom specs * test(query-builder): add CodeMirror+MSW behavior specs for suggestion flows |
||
|
|
8c6a0de8c3 |
refactor: gcp integration memorystore redis dashboard update (#12229)
Some checks failed
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
|
||
|
|
c7abe0fe7b |
fix: add rank column to tag relations to keep note of tag ordering in dashboards (#12170)
* fix: always sort dashboard tags in alphabetical order * fix: add rank column to tag relations to keep note of tag ordering in dashboards * fix: dont disable FK just for adding a new column * fix: add back tag relation unique index |
||
|
|
b236273c5f |
test(e2e): cover alert edit-page threshold persistence (#12227)
* test(e2e): cover alert edit-page threshold persistence Adds an E2E test that seeds a notification channel + v2 threshold alert (target 245) via API, opens the alert overview/edit page, and asserts the condition editor shows the persisted threshold value once loaded. New helper tests/e2e/helpers/alerts.ts (channel/alert seed + delete + navigate) mirrors the existing dashboards seeding pattern; the test lives alongside the existing tabs test in tests/e2e/tests/alerts/alerts.spec.ts. Verified against a local --with-web stack (passes with the loaded value, fails when the edit page resets it). * chore: pr review fixes |
||
|
|
14bb4a8437 |
fix: remove omitempty/omitzero and explicit empty value handling in dashboard v2 spec (#12197)
* fix: remove omitempty and omitzero where not needed in dashboard v2 spec * fix: reject explicitly empty enum values if invalid |
||
|
|
842d44d874 |
feat: adding gcp memorystore redis service (#12118)
* feat: adding gcp memorystore redis service * refactor: updating dashboard title * refactor: extending width of uptime gauge panel * refactor: updating cpu utilization panel * refactor: updating dashboard panel to use rate function instead of hack |
||
|
|
0d7aff9ce5 |
fix(alerts-v2): preserve loaded thresholds on edit-page refresh (#12226)
PR #12137 changed the URL-prefill effect dependency from the primitive `thresholdsFromURL` string to the memoized `urlPrefill` object, which gets a fresh reference on every `location.search` change. On the alert overview/edit page the query builder normalizes the loaded query back into the URL after mount, so the effect re-ran and its unconditional threshold RESET wiped the value loaded via SET_INITIAL_STATE (245 -> 0 on refresh). URL-declared prefill is a create-flow concern; in edit mode the alert state is owned by SET_INITIAL_STATE. Skip the effect when isEditMode is true. |
||
|
|
fe101a1835 |
fix: fetch latest monotonicty for metrics instead of any random (#12205)
* fix: fetch latest monotonicty for metrics instead of any random * test: add integration test for is monotonic flag |
||
|
|
69c2f8d73f |
feat: span mapper test endpoint (#11795)
* feat: span mapper test endpoint * feat: integrate with collector * fix: more cleanup and integration test * fix: lint * fix: cleanup go.mod * fix: update openapi * fix: more cleanup * fix: update go.mod * fix: minor cleanup * fix: update group_id to groupId * fix: cleanup integration test --------- Co-authored-by: Gaurav Tewari <gauravtewari111@gmail.com> |
||
|
|
fc6f398828 |
fix: show the backend error message in the error modal instead of a generic axios error (#12215)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
8cd2077522 | fix(dashboard-v2): validate key:value tags in the editor (inline-edit errors + backend-rule space/char/length checks) (#12062) | ||
|
|
7b23286aab |
refactor(infrastructure-monitoring-v2): ui/ux improvements (#12191)
* fix(pods): min width for pod restarts * fix(disk-usage): not have minimum width correctly * perf(infra-monitoring-v2): set cache before opening details modal * feat(tanstack): add custom markers for perf review * feat(tanstack): add hover tooltip + integrate on infra monitoring * perf(grouped-status-counts): use tanstack tooltip hover * fix(k8s-base-list): adding table def to classnames * perf(grouped-status-counts): reduce node count on DOM * feat(infrastructure-monitoring): use single component instead of unmount/mount all content * chore(infrastructure-monitoring-k8s): remove old list components * fix(hosts): make it double line header * fix(infrastructure-monitoring): show scrollbar only on hover * chore(pod-metrics): add docs for charts * fix(perf-lib): address comments * fix(infra-monitoring): rename entityConfig to entity.config |
||
|
|
6bdf054a05 |
test(e2e): fix flaky dashboards-detail specs (sidenav overlay + slow hydration) (#12180)
* test(e2e): pin the sidenav so its flyout stops occluding dashboard content * test(e2e): harden dashboards-detail specs against slow CI hydration |
||
|
|
c7f4aa01c4 |
feat(dashboard-v2): product analytics instrumentation for list + detail pages (#12199)
* feat(dashboard-v2): add analytics event catalog for list + detail Introduce DashboardListEvents and DashboardDetailEvents enums as the single source of truth for V2 dashboard product-analytics event names. Grouped action-discriminator events (RowAction, SectionAction, PanelAction, DrilldownAction, JsonEditorAction, PublicDashboardAction) mirror the existing 'Dashboard Detail: Panel action' pattern. PanelAction reuses the existing V1 string so panel actions stay comparable across versions. * feat(dashboard-v2): instrument dashboards list page analytics Fire logEvent for create/import funnel (tab switch, created success, import failed), find/navigate (search, filter, sort, columns, pin, pagination), Views rail (select/save/rename/delete/reset, rail toggle), row actions (view/open-new-tab/copy-link/rename/edit-tags/duplicate/lock/delete), legacy-dashboard dialog, and error-state actions. * feat(dashboard-v2): instrument dashboard detail page analytics Fire logEvent across the detail page: lifecycle (open, rename, clone, delete, lock, full-screen, stale-reload, public-url), sections (add/rename/clone/delete, collapse, reorder, first-section migration), panels (add, edit/clone/delete/move, export csv/png/svg, view, editor save/discard, type change, search, no-data), layout drag/resize (rate-limited), variables setup (save/delete/reorder/test/ apply-to-all) and runtime selection (value selected rate-limited, multiselect clear, options-fetch failed), drill-down (open + view-logs/traces/breakout/ filter/set-variable/create-variable), panel zoom, JSON editor actions, settings overview save/discard, cursor sync, and public-dashboard actions. * fix: lint * refactor(dashboard-v2): extract inline analytics handlers into named functions Address PR review: pull the inline JSX arrow handlers that wrap logEvent out into named handlers across both V2 dashboard pages (public-url open, cursor/ tooltip sync, settings/JSON/full-screen actions, panel search, drilldown view-logs/traces, create-modal tab, error retry/contact-support, row open-in- new-tab/copy-link, legacy contact-support, save-view actions). Behavior unchanged. Handlers defined inside .map()/per-row renderers and pre-existing complex value-mapping handlers (ValueSelector) are intentionally left inline. |
||
|
|
e93792d427 |
fix(overlayscrollbars): leaking memory due to img.load event listener (#12179)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
6d0f618a9e |
feat(infra-monitoring): persist custom time on drawer across categories (#12038)
* feat(globalTime): add method to reset time of child to parent * refactor(infra-monitoring): extract content from K8sBaseDetails * feat(entity-details): add support to persist custom time across categories of k8s * test(entity-details): update existing tests * test(entity-details): add regression test for time conversion * fix(k8s-list): ensure default value for list is 30m * fix(entity-counts-section): address todo around inherit selected time * fix(pr): missing fix for tab validation, lost of moving/merge |
||
|
|
564d479aae |
test(e2e): fix teardown crashes (network endpoint race + eager keeper lookup) (#12204)
* test(e2e): retry network teardown to survive async endpoint detach `--teardown` fails on CI with `docker.errors.APIError: 403 ... error while removing network ... has active endpoints`: containers are torn down before the network, but Docker detaches endpoints asynchronously, so the network can still report active endpoints for a moment. Retry the removal, force-disconnecting any stragglers each round. * test(e2e): resolve keeper coordinator lazily so --teardown doesn't crash `create_clickhouse` / `create_clickhouse_cluster` computed `next(iter(keeper.container_configs.values()))` eagerly. Under `--teardown` the keeper fixture is empty, so it raised StopIteration during teardown setup, before any finalizer ran. Move the lookup inside create(). |
||
|
|
253ca7dd7e |
fix(session): validate ref and callback state against global allowed_origins (#12172)
* fix(session): use global external_url instead of ref param for SSO state The sessions/context endpoint no longer reads the client-controlled ref query param to build the SSO state and callback URLs. Each callback authn provider now derives the site URL from the server-configured global external_url, and siteURL is removed from the CallbackAuthN and session Module interfaces. * fix(session): validate ref and callback state against global allowed_origins Instead of deriving SSO urls from the global external_url, keep the ref roundtrip and validate its origin against the new optional global.allowed_origins config. The callback state url is re-validated before tokens are attached to it, closing the forged RelayState/state exfiltration path. When allowed_origins is not configured, redirect targets are not validated, preserving existing installs. * fix(session): scope ref origin validation to sso auth domains Move the allowed_origins check from the sessions/context handler to getOrgSessionContext, right before the SSO login URL is built. A disallowed ref no longer fails the whole request; only orgs with an SSO-enabled auth domain get a per-org warning with password fallback. |
||
|
|
cc45c1bef1 |
feat(dashboard-v2): share a dashboard link with the current variable selection (#12198)
* feat(share): support a page-specific extra option in the share dialog * feat(dashboard-v2): share a dashboard link with the current variable selection |
||
|
|
e70b3a0b52 | chore: pr review fixes for 12137 (#12142) | ||
|
|
f514af469e |
fix(dashboards-v2): panel editor Save/dirty, refresh retention, dropdown clipping & time-window fixes (#12146)
* fix(dashboards-v2): carry active time window across panel editor navigation
Opening, creating, or leaving the V2 panel editor now preserves the selected time
range (relative or custom) via URL params derived from Redux global time, so a
custom range picked in the editor isn't reset to the dashboard default on return.
Adds timeParamsFromGlobalTime + useTimeSearchParams; useOpenPanelEditor now takes an
options object ({ handoffState, search }) and appends the time params, and
useCreatePanel routes through it.
* fix(dashboards-v2): sync panel editor preview to the staged query on browser back/forward
The query builder reverts both currentQuery and stagedQuery via initQueryBuilderData on a
URL re-stage (chiefly browser Back/Forward), but the preview kept the last Run's result.
Commit the staged query into the draft whenever it re-stages outside an explicit Run, so the
preview follows. Live edits touch only currentQuery, so they still wait for Run; commitQuery
no-ops when unchanged.
* fix(dashboards-v2): stop query-builder dropdowns being clipped in the panel editor
The panel editor renders the query builder inside an overflow:hidden resizable pane, so
antd Select popups (group-by, order-by, having, metric name, aggregator, units) were cut
off. Make the shared QB filters defer to an ancestor ConfigProvider's popup container
(falling back to trigger.parentNode) via useSelectPopupContainer, and wrap the editor's
builder in a ConfigProvider that portals popups to document.body. Scoped to the editor
host, so the View modal keeps its own container and other surfaces are unchanged.
* fix(dashboards-v2): anchor panel editor dirty check to saved panel; retain query edits on refresh
The editor re-derived its dirty baseline from the incoming panel prop, which
is seeded from transient state — a stale URL compositeQuery after a refresh or
the View-mode handoff spec — instead of the persisted panel. So the draft was
compared against an already-edited baseline: after a refresh the panel showed
the saved query yet read dirty (inverted), and a View->Edit query change read
clean with Save disabled.
- Thread a savedPanel baseline (existingPanel) through PanelEditorPage ->
PanelEditorContainer -> usePanelEditSession, distinct from the seed panel.
- usePanelEditorDraft compares isSpecDirty against savedPanel; the draft still
seeds from the (possibly handed-off) panel.
- usePanelEditorQuerySync computes isQueryDirty as a V5-envelope comparison of
the live query against the saved queries, routing both sides through the same
fromPerses->toPerses round-trip so builder-added defaults absent from an older
stored query never read an untouched panel as modified. Replaces the racy
captured-first-stagedQuery baseline.
- Drop the mount forceReset on useShareBuilderUrl (both its reasons are now
moot) so a refresh / browser Back-Forward hydrates the edited query from the
URL and the staged-query effect syncs it into the draft — query edits survive
a refresh instead of reverting to the saved query.
Add real-QueryBuilderProvider integration tests covering untouched-not-dirty
(incl. an older/minimal stored query), refresh retention, and handoff-dirty;
update the draft + query-sync unit tests.
|
||
|
|
806853798d |
feat(authz): add support for telemetry resource provisioning (#12168)
* feat(authz): provision telemetry roles with plaintext selectors and hashed tuples
Accept a user-facing telemetry selector string (<query_type>/<key>/<value>
with trailing wildcards), validate and canonicalize it, store it as-is in the
role JSON record, and hash it only at the OpenFGA boundary in Object(). Grant
and check both flow through Object() so the hashes match; the plaintext record
stays the readable source of truth for display and recreation.
Because the hash is one-way, role Update diffs at the tuple level via
DiffTuples instead of reconstructing transaction groups from stored tuples.
* refactor(authz): rename telemetry selector helpers and unexport hash
Rename grant_selector.go to selector.go, CanonicalizeTelemetryGrantSelector to
NewTelemetryGrantSelector, and CanonicalTelemetryGrantKey to NewTelemetryGrantKey.
Unexport telemetrySelectorHash since Object() is its only caller.
* fix(authz): expand telemetry ladder in the permission check API
The check API only probed the exact selector plus the full wildcard, so a
scoped grant like builder_query/service.name/* reported a concrete query as
unauthorized even though enforcement allowed it. Relocate the grant selector
ladder to telemetrytypes as NewTelemetryGrantSelectors so both enforcement and
the check API share it, and canonicalize plus fan out the ladder for telemetry
check transactions. Non-telemetry resources keep the exact-plus-wildcard probe.
* refactor(authz): move newCheckSelectors to the bottom of tuple.go
* fix(authz): reject key-scoped selectors for promql and clickhouse_sql
Only builder_query and builder_sub_query extract key-scoped selectors on the
check side, so a grant like clickhouse_sql/service.name/signoz could never
match anything. Track key-scope support per query type and reject the
<query_type>/<key>/<value> form for query types that only emit <query_type>/*.
* test(authz): use a valid promql selector in the check API test
The promql/service.name/service-a case became invalid input after key-scoped
promql/clickhouse_sql selectors were rejected, so the check endpoint returned
400 instead of 200. Use promql/* to keep exercising the different-query-type
denial with a valid selector.
* feat(authz): allow signoz.workspace.key.id as a telemetry grant key
Add signoz.workspace.key.id to the telemetry grant key allowlist so roles can
scope telemetry access by ingestion key, alongside service.name. Grant
validation and check-side extraction both pick it up through the shared
NewTelemetryGrantKey path; bare and resource.-prefixed spellings fold to the
same canonical key.
* Revert "feat(authz): allow signoz.workspace.key.id as a telemetry grant key"
This reverts commit
|
||
|
|
f002b29685 |
fix(onboarding): list Temporal Cloud Metrics under metrics, not APM/Traces (#12203)
Temporal Cloud Metrics scrapes an OpenMetrics endpoint but only showed under APM/Traces, bundled with the Go and TypeScript SDKs. Split it into a standalone metrics card and trimmed the Temporal APM card to Go and TypeScript. Closes SigNoz/growth-pod#1122 |
||
|
|
a5d4ef4498 |
fix(uplot): missing destroy uplot on unmount (#12182)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
|
||
|
|
967289ebc6 |
fix(metrics): resolve any filter key context instead of erroring (#12188)
* fix(metrics): resolve any filter key context instead of erroring
The metrics condition builder hard-errored ("key <name> not found") whenever a
filter key was absent from the metadata keys. This hit the full-text search
column (metric_name in the Metrics Explorer, labels in query_range) and every
explicit label context (resource./scope./attribute.), so a bare/partial filter
token 400'd the Metrics Explorer treemap and metric queries.
Metrics keeps every label in the `labels` JSON with no per-context storage, so
FieldFor already maps any key on its own (intrinsics incl. metric_name to their
column, every label context to a labels JSON extract). Use the key directly in
the len(keys)==0 branch so filters resolve and run instead of 400ing - matching
group-by, which already collapses all label contexts to labels.
Update the label-context test to expect the collapse (resource./scope. now
resolve like bare/attribute.), add unit coverage for the branch, and add a
queriermetrics test that a free-text filter no longer errors.
* fix(metrics): resolve free-text and unregistered filter keys instead of erroring
The metrics condition builder hard-errored ("key <name> not found") whenever a
filter key was absent from the metadata keys: the full-text search column
(metric_name on the Metrics Explorer, labels on query_range) and every explicit
label context (resource./scope.). So a bare/partial filter token 400'd the
Metrics Explorer treemap and metric query-builder filters.
Metrics has no per-context storage - every label lives in the `labels` JSON, and
FieldFor maps any key on its own (intrinsics incl. metric_name to their column,
every label context to a labels extract). Add an opt-in WithIgnoreNotFoundKeys
to the metrics condition builder that resolves such keys directly (matching
nothing) instead of erroring:
- query-builder (querier provider) and Metrics Explorer opt in, so free-text and
unregistered contexts resolve - matching the statement builder's own fallback
and group-by, which already collapses all label contexts to labels;
- infra-monitoring list APIs keep the default (strict), so a typo'd attribute
still surfaces as a 400.
Intrinsics always resolve regardless of the flag. Adds unit coverage for both
modes and a queriermetrics test that a free-text filter no longer errors; the
label-context test now expects the collapse.
* chore: updated integration tests
* fix: dont assert warning == []
* chore: removed warning scaffolding for now
* fix: add back removed integration test
---------
Co-authored-by: nikhilmantri0902 <nikhil.mantri1999@gmail.com>
|
||
|
|
bf0130a983 |
fix(clickhouseprometheus): resolve __name__ matchers against metric_name and anchor matcher regexes (#12154)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
The read client reduced every __name__ matcher to metric_name = <value>
(empty string when absent), so nameless selectors ({job="api"}), regex
names ({__name__=~".+"}), and negations silently returned empty. Map the
__name__ matcher onto the metric_name column per matcher type, drop the
condition when no __name__ matcher exists, and narrow the samples query
by the metric names the series lookup discovered.
Matcher regexes are now anchored (^(?:...)$) the way Prometheus compiles
them; ClickHouse match() is a substring search, so {job=~"api"} also
matched job="api-server" before.
The lookup and samples SQL is built with huandu/go-sqlbuilder (ClickHouse
flavor) as in telemetrymetrics and the v2 transpiler: the samples query
embeds the series lookup as a nested builder, with argument order merged
by the builder in render position instead of hand-numbered placeholders.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
|
||
|
|
9d4349c9d1 |
fix(querybuilder): resolve data-type collisions for numeric intrinsic columns (#12176)
A span/log query that aggregates or filters a numeric intrinsic column (e.g. duration_nano) failed with ClickHouse NO_COMMON_TYPE (386) when a same-named, type-consistent attribute existed in the metadata: field-key resolution unioned the intrinsic column with the attribute into a multiIf/OR whose branches had incompatible types (UInt64 intrinsic vs Float64 attribute). This broke /api/v1/span_percentile on affected tenants. - fallback_expr: DataTypeCollisionHandledFieldName now handles the unspecified data type in the projection/aggregation path (operator Unknown), coercing the column so collision multiIf branches share a supertype. Comparison contexts are left bare so the column index stays usable. - telemetrytraces/condition_builder: run collision handling for duration_nano (so a same-named string attribute is cast in comparisons) and coerce numeric duration values to int64, keeping the intrinsic comparison bare/index-friendly while preserving the duration-string QoL parsing. - tests: add a type-consistent "collision" trace_noise variant; cover it in the percentile aggregation test and add a duration_nano QoL filter regression test. |
||
|
|
d095645d61 |
fix(querybuildertypesv5): round-trip unset stepInterval and empty field-key values (#12171)
* fix(querybuildertypesv5): omit unset stepInterval on the wire
Step is a struct (struct{ time.Duration }), so omitempty had no effect — an
unset stepInterval serialized as 0 instead of being omitted, so a typed
client reading a query back saw a 0 it never sent (create -> GET drift).
Tag stepInterval with ,omitzero so an unset value is dropped while a set
value still serializes (as seconds), on all three sites: builder query,
trace-operator, and secondary aggregation. Schema-invisible (no OpenAPI /
client change). source and the metric enums were already handled in #12164.
* fix(telemetrytypes): round-trip empty fieldContext/fieldDataType on field keys
A TelemetryFieldKey can deliberately leave fieldContext/fieldDataType empty
to match across any context / data type, but ,omitzero dropped that empty
value on serialize, so a typed client that sent "" read it back as absent
(create -> GET drift).
Make both fields always serialize and add the empty member to their Enum()s
so "" is a valid schema value that round-trips verbatim — the same approach
#12164 used for source. Signal keeps ,omitzero: its empty value is invalid
for the query/variable signal contexts that share the enum (adding "" there
breaks those consumers), and a field key's signal is not deliberately empty.
Regenerate the OpenAPI spec + client (fieldContext/fieldDataType enums gain
"") and update the ScalarData marshal test (column keys now echo the fields).
* fix(telemetrytypes): round-trip empty signal on field keys
Extend the field-key round-trip fix to Signal: add the empty member to
Signal.Enum() and make TelemetryFieldKey.Signal always serialize, so an
empty ("any") field-key signal round-trips as a valid value instead of
being dropped — matching the fieldContext/fieldDataType treatment.
The Signal enum is shared with query/variable signals, where "" is invalid.
Narrow the frontend's TelemetrySignal type to logs/traces/metrics (so the
variable/panel signal selectors stay exhaustive), label the empty member in
the panel type switcher's map, and fold an empty drilldown signal into "all".
Regenerate the OpenAPI spec + client (Signal enum gains ""), and update the
ScalarData marshal test and the querierlogs aggregation label assertions to
include the now-serialized empty signal.
|
||
|
|
429fca62be |
fix(query-search): do not override token classes (#12139)
* fix(query-search): do not override token classes * test(token-highlight): add regression test * fix(pr): address comments |
||
|
|
20518a98e9 |
fix(logs-explorer): prevent long json body from overflowing (#12173)
* feat: allow body content to wrap preventing content overflow * feat: align key name and pin to the top |
||
|
|
0b7c266b09 |
fix: css fixes for llm o11y model pricing and overview (#12145)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix: css fixes for llm o11y model pricing and overview * fix: spacing issue * chore: update modal drawer cost * chore: remove comments * chore: spacing between chips right --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
8014c065e8 |
feat: rename llm o11y to ai o11y [2/2] (#12141)
* feat: add llm o11y to side nav * chore: rename route * chore: review comments * chore: update constants * chore: change name to ai * chore: rename draft * chore: move model pricing out of settings * chore: update comment * revert: undo LLM->AI file/dir moves, keep constant rename Reverts the two file-relocation commits ( |
||
|
|
c2c2552cc6 |
feat: add llm observability to side navigation [1/3] (#12123)
* feat: add llm o11y to side nav * chore: update comment --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
88bd737758 |
fix(dashboards-v2): round-trip all zero-valued spec fields (#12162)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix(dashboardtypes): round-trip zero-valued variable/display fields
omitempty dropped explicit zero values from the create -> GET response, so
a typed client (Terraform/SDK) that sent them read back null and reported
drift. Remove the tag so these always serialize:
- Display.Description ("" round-trips; applies to dashboard/panel/variable
displays)
- TextVariableSpec.Constant (constant: false, like the disabled fix)
- ListVariableSpec.CustomAllValue / CapturingRegexp ("" round-trips)
Scalars carry no nullability, so the OpenAPI spec and generated client are
unchanged. Sort stays omitzero: its "no sort" value is "none", not "", so
omitzero only omits the invalid unset state.
* fix(dashboardtypes): round-trip panel and dashboard links
`links` used omitempty (dropped an explicit []) and its element type was the
imported perses dashboard.Link, whose own fields tag name/tooltip/
renderVariables/targetBlank omitempty — so a link's false/"" were dropped
too, and a typed client read them back as null.
- Replicate dashboard.Link as a SigNoz Link type (same pattern as
ListVariableSpec/TextVariableSpec) with every field always serialized.
- Use ,omitzero on PanelSpec.Links and DashboardSpec.Links so an explicit
[] round-trips while an unset list stays omitted (never null).
Regenerate the OpenAPI spec and frontend client: the element schema is now
DashboardtypesLink (was the perses DashboardLink) and links is nullable.
Update the frontend consumers to the renamed type and coalesce the now
type-nullable spec.links (never null on the wire) at its two boundaries.
* test(dashboard): cover variable/display/link round-trip cases
Extend the v2 dashboard round-trip test with the spec-wide zero values this
PR fixes: a display description "", a text variable's constant false, a list
variable's customAllValue/capturingRegexp "", an explicit [] of panel links
that round-trips, a link whose own zero-valued fields (name/tooltip "",
renderVariables/targetBlank false) echo back, and a linkless panel whose
links stay omitted (never null).
* test(dashboard): accept null-or-absent for unset panel links
A panel with no links round-trips as "links": null rather than being
omitted (the panel serialization path differs from the query slices, which
omit). Both mean "no links" and neither drifts for a typed client, so assert
the value is None (null or absent) instead of strictly absent. The explicit
[] case still asserts a verbatim round-trip, which is the guarantee the fix
provides.
* fix(dashboardtypes): round-trip remaining zero-valued spec fields
Complete the dashboards-v2 create -> GET round-trip audit:
- DashboardSpec.Datasources: ,omitempty -> ,omitzero so an explicit {}
round-trips (omitempty dropped it) while an unset map stays omitted.
- DashboardV2 Image, DashboardSpec.Duration/RefreshInterval: drop ,omitempty
so an explicit "" round-trips (same class as Display.Description). The
server accepts "": DurationString.validate() returns nil for len 0, and
Image/Duration/RefreshInterval have no create-time validation, so a
GET-then-PUT of "" is not rejected.
Scalars carry no nullability (no spec change); the datasources map is now
nullable: true in the regenerated OpenAPI spec and client.
* test(dashboard): cover datasources/image/duration/refreshInterval round-trip
Extend the round-trip test with the spec-wide zero values just fixed: a
dashboard-level image "", spec duration/refreshInterval "", and an explicit
empty datasources {} that must echo back as {} (omitzero) rather than being
dropped.
|
||
|
|
8c40d8c2ca |
fix(querybuildertypesv5): allow empty source, temporality and timeAggregation in the metric query spec (#12164)
* fix(querybuildertypesv5): omit unset metric enum fields on the wire
A metric builder query serialized empty strings for its enum fields
because omitempty has no effect on struct-backed valuer types:
"source":"", "aggregations":[{"temporality":"","timeAggregation":"","spaceAggregation":""}]
Those "" values are not members of the corresponding OpenAPI enums
(source=[meter], temporality=[delta,cumulative,unspecified], etc.), so a
typed client reading a rule back rejected it (create -> GET round-trip
drift; terraform-provider-signoz generate-config failed schema validation).
Tag Source/Temporality/TimeAggregation/SpaceAggregation with ,omitzero so
an unset value is dropped instead of emitted as an invalid "", matching the
existing convention (dashboardtypes Sort, telemetrytypes field keys). Valid
values still serialize. The OpenAPI spec regenerates byte-identical, which
confirms the enums were already correct.
* test(querybuildertypesv5): cover client-sent empty enum values
A client (e.g. terraform) may send explicit source:"" / temporality:"" for
an unset enum. Assert unmarshaling accepts them, normalizes to the zero
value, and re-marshaling drops them so the round-trip never echoes an
invalid "" back.
* fix(querybuildertypesv5): allow empty metric enum values in the spec
The server accepts and echoes back an unset source, temporality, and
timeAggregation for a metric query (a create -> GET returns "" for them), but
their OpenAPI enums omitted "". A typed client (terraform-provider-signoz
generate-config) therefore rejected the config generated for an imported rule.
Add "" as a valid member of the Source, Temporality, and TimeAggregation enums
so the spec matches what the server actually accepts and returns. spaceAggregation
is left unchanged: an empty value is rejected with 400 at creation (IsValid), so
it is never stored or echoed and "" must stay out of its enum.
Drop the earlier ,omitzero tags: these fields already always-serialize, so an
accepted "" round-trips faithfully instead of being silently dropped (silent
mutation is itself drift). source loses its no-op omitempty for the same reason.
Regenerate the OpenAPI spec and frontend client (both git-diff gated).
* test(querybuildertypesv5): assert accepted empty enums round-trip
Empty source/temporality/timeAggregation are echoed back (not dropped) and are
stable across marshal -> unmarshal -> marshal; spaceAggregation carries a valid
value since an empty one is 400'd at creation.
* test(querybuildertypesv5): merge and rename metric enum round-trip test
Fold the unmarshal-echo case into the table-driven marshal round-trip test
(its marshal -> unmarshal -> marshal check already covers the client-sends-""
path) and rename to TestQueryBuilderQuery_MetricAggregation_MarshalJSONEnumRoundTrip.
* style(metrictypes): drop explanatory comments on enum changes
Remove the comments added to Temporality/TimeAggregation Enum() and the metric
enum round-trip test case.
* style(telemetrytypes): drop explanatory comment on Source enum change
Remove the comment added to Source.Enum(), keeping the pre-existing doc/TODO.
|
||
|
|
7be340ce69 |
fix(clickhouseprometheus): include hour-floored registration rows at the query window end (#12153)
Some checks failed
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
The series lookup bounded registration rows with unix_milli < end while the samples query uses <= end. The exporter writes registration rows hour-floored, so a series first registered in the hour starting exactly at end was invisible even though its samples were fetchable — queries ending exactly on an hour boundary missed newly-registered series. Co-authored-by: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
852ca779c9 |
fix: convert key not found to warnings for logs (#12134)
* fix: convert key not found to warnings * fix(logs): has-family body-only errors, not-found warnings, and condition-builder cleanup - has/hasAny/hasAll/hasToken on a non-body key now return "supports only body JSON search" (both modes); a not-found body path warns and queries the underlying data instead of 400 (JSON mode) - capture the two has-family 500s (hasToken separator/whitespace needle; hasAny/hasAll quoted int >= 2^32) as regression tests - use telemetrytypes.NewTelemetryFieldKey for derived keys (fresh identity-only keys, no stale resolved metadata) instead of struct copies of the field key - rename ConditionForKeys -> ConditionFor and inline conditionsForKeys into it across the builders; rename private conditionFor -> conditionForResolvedKey - move the trace_noise fixture from queriertraces/conftest.py to fixtures/traces.py * fix: convert trace_noise fixture to util |
||
|
|
05b35dd4ee |
fix(clickhouseprometheus): merge fingerprints sharing a labelset instead of injecting a fingerprint label (#12152)
#8563 worked around duplicate-labelset collisions (a label value going empty re-fingerprints a series; empty-valued labels are dropped at read) by appending a synthetic fingerprint label to every series and stripping it from results. The label participates in evaluation before any strip runs: without() grouped per fingerprint (duplicate identical-labeled output series) and unaggregated vector matching never matched. Resolve series identity at the adapter instead: drop empty-valued labels at unmarshal, merge fingerprints that share the resulting labelset (timestamp-ordered k-way merge, highest fingerprint wins equal timestamps), and delete the injection and every RemoveExtraLabels strip. Engine-semantic duplicates (e.g. rate over {__name__=~"a|b"}) still error, matching upstream Prometheus. Co-authored-by: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
bcea24f449 |
fix(querybuildertypesv5): keep subnormal values finite in roundToNonZeroDecimals (#12157)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
The sub-1 branch's scale (10^(-order+n-1)) overflows to +Inf for subnormal inputs (order below ~-308), and Inf/Inf turned a finite stored value into NaN — which then serializes as the string "NaN". Same guard as the >=1 branch got in #12151; adds the unit coverage for both. Co-authored-by: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
22e55340d7 |
fix(dashboards-v2): round-trip zero-valued threshold + query fields (#12158)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix(dashboardtypes): accept threshold value of 0 on create A NumberPanel/TimeSeries/Table threshold with `value: 0` (a legitimate value the SigNoz UI emits by default) was rejected on create with `dashboard_invalid_input` "Field validation for 'Value' failed on the 'required' tag". go-playground/validator's `required` treats a numeric field equal to its zero value as "missing", so `validate:"required"` on the float `Value` wrongly rejected 0. Drop `validate:"required"` from `Value` on ThresholdWithLabel and ComparisonThreshold; keep `required:"true"` since the field is always present in the schema (0 is a valid present value, not an absent one), so the OpenAPI/generated client are unaffected. `Color` keeps both tags — an empty colour is genuinely invalid. Drop the two "missing value" cases from TestValidateRequiredFields, which asserted the removed invariant. * fix(querybuildertypesv5): round-trip zero-valued query spec fields A dashboard/alert query that sets a zero-valued field — `disabled: false`, `legend: ""`, or an explicit empty `groupBy`/`order`/`selectFields`/etc. — created fine but the GET response omitted it, so a typed client that echoes what it sent (Terraform, SDKs, PUT-after-GET) read back `null`/absent and reported drift. `,omitempty` dropped these zero values on the way out. Fix the create -> GET asymmetry: - Slice fields use `,omitzero` instead of `,omitempty`. `omitzero` omits a nil slice (field never set stays absent) but keeps an explicit non-nil `[]`, so an empty array round-trips as `[]` and there is no `null` regression. Applied to groupBy, order, selectFields, aggregations, functions, secondaryAggregations and function args across the builder, formula, trace-operator and join specs, plus ListPanelSpec.selectFields. - Scalars `disabled` (bool) and `legend` (string) drop the tag entirely; `omitzero`/`omitempty` both suppress false/"", so the only way to round-trip them is to always serialize. Result types in resp.go keep `,omitempty` — they are server-computed and never round-tripped. Regenerate docs/api/openapi.yml and the frontend client: the omitzero slices are now `nullable: true` in the schema (never null on the wire, but the generated types gain `| null`, which existing consumers already handle via `?? []`). * test(dashboard): round-trip serialization for zero-valued fields Add a v2 dashboards integration test that creates one minimal dashboard (stripped from SigNoz/dashboards cicd-perses.json) and asserts the create -> GET round-trip preserves every zero-valued field the fix targets: - threshold value 0 (ComparisonThreshold + ThresholdWithLabel) is accepted on create and echoed back - builder slices set to an explicit [] (groupBy/order/selectFields/functions) round-trip as [], while a bare builder's unset slices stay absent (never null) on read - scalars disabled/legend always echo false/"" Table-driven: one equality table for round-tripped values and one absence table for omitted slices. * test(dashboard): fold round-trip test into 03_v2_dashboard Move test_dashboard_v2_roundtrip_preserves_zero_values alongside the other v2 dashboard tests (test_create_rejects_*, lifecycle, ...) instead of a standalone file, with the dashboard payload inlined per this suite's style. |
||
|
|
dd8cbe0844 |
fix: has function family revamp (#12089)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
6b065aa54c |
fix(querybuildertypesv5): guard float overflow in roundToNonZeroDecimals (#12151)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
math.Round(val*multiplier)/multiplier overflows to +Inf for finite values near math.MaxFloat64, turning a valid series value into JSON-unmarshalable Inf downstream. Return the value unrounded when the scaled intermediate overflows. Co-authored-by: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
ac5b5947eb |
feat(authz): enable FGA for telemetry resources (#12095)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(authz): enable FGA for telemetry resources on v5 query_range
Authorize /api/v5/query_range and /preview at the telemetry-resource level,
derived from the request body:
- coretypes: ResourceWithID + ResourceExtractor as the resource-level analogue
of the id extractors; NewResolvedResourceWithID/NewResolvedResourceWithError;
telemetryresource selector regex widened to query-type selectors with up to
two hashed segments (metric name, where clause) or wildcards
- telemetrytypes: QueryRangeResources maps each query to its telemetry
resource (signal/source aware: audit-logs, meter-metrics) with a hierarchical
selector id (query_type/<hash(metric)>/<hash(where)>); PrefixSelector expands
the id into the grant ladder [exact, prefix/*..., *]
- handler: generic TelemetryResourceDef fans out an injected ResourceExtractor;
fails closed when extraction errors or resolves nothing
- audit: log and skip resolved resources that carry a resolution error
- querier routes: ViewAccess -> CheckResources with telemetry read scopes;
substitute_vars stays ViewAccess (no telemetry access)
- sqlmigration 099: backfill telemetry read tuples for existing orgs
(admin: logs/traces/metrics/audit-logs/meter-metrics; editor/viewer:
logs/traces/metrics)
* feat(authz): widen telemetry selector segments to 128 bits
64-bit truncation permits chosen-collision attacks at ~2^32 work; 128 bits
pushes this to 2^64. No hashed selector is persisted yet, so the change is
free.
* chore(docs): regenerate openapi spec with telemetry read scopes
* feat(telemetry): add where clause visitor
* refactor(telemetry): restructure normalizer file and quote bare values
* feat(authz): gate v5 query_range on service.name telemetry selectors
* feat(authz): encode telemetry grants as query-type qualified atom selectors
* feat(authz): move telemetry grant key to plaintext selector segment
* feat(authz): use escaped plaintext telemetry selectors with mechanical ladder
* revert(authz): restore transaction group diff in role update
* test(authz): add querierauthz integration suite for telemetry query_range gating
* test(authz): seed logs so service.name resolves in allowed querierauthz cases
* feat(authz): backfill telemetry read tuples for existing orgs
* chore(authz): reword empty composite query error message
* feat(authz): add meter metrics and audit logs to clickhouse sql
* Revert "feat(authz): add meter metrics and audit logs to clickhouse sql"
This reverts commit
|
||
|
|
c563d79ee0 |
feat(quick-filters): add support for /v1/fields/values (#11788)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(quick-filters): add field values hook * feat(quick-filters): add support to handle indeterminate state of checkbox * feat(quick-filters): add checkbox header v2 * feat(quick-filters): add item rules to represent the states of checkbox * feat(quick-filters): add checkbox row v2 * feat(quick-filters): add sectioned values hook to correctly calculate checkboxes to render * feat(quick-filters): add hook to get existingQuery for field values * feat(quick-filters): add checkbox filter v2 * test(quick-filters): add tests for checkbox filter v2 * feat(quick-filters): add flag to enable v2 * feat(infra-monitoring): enable quick filters v2 * fix(infra-monitoring): change the prefix of metric namespaces * fix(checkbox-v2): update to improve ux * fix(quick-filters): move from flat list to sections * fix(quick-filters): render related/all values when searching * Revert "fix(infra-monitoring): change the prefix of metric namespaces" This reverts commit |
||
|
|
b9b92f951b |
feat: table export in Logs and Traces explorer table tabs (4) (#12071)
* refactor(data-export): extract the withUnit header helper
Both the timeseries and the upcoming table serializers append units to headers (and skip display-only ids like 'short'/'none') — move the helper to its own module.
* feat(data-export): add generic table-model serializer
exportTableData serializes any prepared antd-style table model ({name, key, isValueColumn} columns + record rows) into a SerializedTable — raw values in display order, units on value columns only, blanks for missing cells. Surface-agnostic: QueryTable-based tables, dashboard tables and plain antd tables all adapt in a line or two.
* feat(data-export): add scalar queryRange serializer
exportScalarData takes the queryRange response object (formatForWeb webTables payload) + the builder query and serializes via createTableColumnsFromQuery — the exact preparer QueryTable renders from — so exports inherit the on-screen merge, naming and column order 1:1.
* feat(data-export): dispatch client exports from the queryRange response
useClientExport now takes the queryRange response object views already hold and picks the serializer from what it carries: rawV5Response (time_series) or the formatForWeb scalar payload (tables) — mounts pass their data without choosing serializers. TimeseriesExportMenu generalizes into components/ExportMenu with the same uniform inputs, so the timeseries views and the table tabs share one menu.
* feat(explorer): enable table export in Logs and Traces table tabs
Mounts ExportMenu on the Logs and Traces Table tabs, feeding the same query the rendered table uses (stagedQuery fallback parity) — exports match the on-screen table's merge, naming and column order. Header rows are class-driven, right-aligned, gated on data presence.
* test(data-export): assert scalar export filename via the naming helper
Same review cleanup as the foundation PR: frozen clock + delegation to getTimestampedFileName instead of a duplicated format regex.
|
||
|
|
6bcc2d66d9 |
feat(dashboards-v2): pre-populate alert condition from panel Reduce To + thresholds (#5291) (#12137)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* refactor(alerts-v2): extract alert condition normalizers to a leaf module normalizeOperator/normalizeMatchType move from CreateAlertV2/utils.tsx into a dependency-free context/conditionNormalizers.ts (re-exported from utils for existing callers), so the CreateAlert context can consume them without an index<->utils cycle. * feat(alerts-v2): apply alert-condition prefill declaratively from the URL The CreateAlertV2 context now resolves a declarative prefill from the URL (resolveUrlAlertPrefill) and applies each field iff present, instead of branching on the request source. Producers own their semantics: ingestion settings now explicitly declares matchType=in_total + evaluationWindowPreset=meter, so adding a new producer needs no consumer change. * feat(dashboards-v2): pre-populate alert condition from panel Reduce To + thresholds (#5291) Creating an alert from a V2 panel now seeds the condition: Reduce To -> occurrence type (sum->in total, avg->on average; Value panel only), and the highest-danger threshold (Red>Orange>Green>Blue) -> operator, target value, and unit. Formula panels apply the reduce only when all queries agree. The seed rides the /alerts/new URL and is applied by the declarative CreateAlertV2 consumer. |
||
|
|
5ee1ca7d05 |
fix(ruletypes): round-trip empty notificationSettings fields (#12138)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix(ruletypes): always serialize notificationSettings.usePolicy usePolicy is a plain bool tagged omitempty, so a false value is dropped from the GET response. Clients that pin usePolicy to false read it back as absent/null. Drop omitempty (matching Renotify.Enabled) so false always serializes and round-trips. * test(ruletypes): assert usePolicy round-trips in minimal read shape usePolicy now always serializes, so the minimal read shape includes it with a false value rather than omitting it. * fix(ruletypes): always serialize notificationSettings.groupBy Like usePolicy, groupBy dropped its omitempty so an explicitly-set empty value round-trips instead of reading back as absent. A nil groupBy now serializes as null. * fix(ruletypes): use omitzero for notificationSettings.groupBy omitzero omits groupBy only when nil (unset) while preserving an explicitly-set empty array as [], so unset and empty stay distinguishable instead of every response carrying groupBy: null. Matches the sibling newGroupEvalDelay tag. * fix(ruletypes): use omitzero for renotify.alertStates Symmetric to groupBy: omitzero omits alertStates only when nil (unset renotify configs stay absent, no regression) while echoing an explicitly-set empty array as []. * chore(ruletypes): regenerate openapi spec and api client groupBy and renotify.alertStates switched to omitzero, so the generated spec marks both slices nullable and the orval client types them as [] | null. |
||
|
|
98c0c53a2b |
feat: add dashboard in llm o11y (#12136)
* feat: add locked dashboard * feat: update test cases * chore: add comments * chore: update comment --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
6d3861d60f |
feat(llm-attribute-mapping): group + mapper drawers + diff-save [3-4/5] (#11780)
* fix(llm-pricing): constrain currency dropdown width, drop tab URL param - Currency SelectSimple stretched to fill the filters bar; give it a fixed 160px width (min-width couldn't cap the trigger). - Model costs is the only enabled tab for now, so use Tabs defaultValue instead of a URL-backed param. Removes the nuqs tab state plus the now-unused TAB_KEYS/TAB_QUERY_KEY constants and TabKey type. * chore: self review changes * fix: add skeleton loading * refactor: self review changes * refactor: initial prop * fix: update styling * fix: add comments in utils * feat(llm-pricing): add model cost drawer and wire into listing page * fix(llm-pricing): restrict pricing management to admins Align the frontend write gate with the backend, which protects the LLM pricing create/update/delete endpoints with AdminAccess (admin only). Previously manage_llm_pricing allowed EDITOR/AUTHOR, so those roles saw the Add/Save affordances but their writes were rejected with a 403. Also removes the AUTHOR entry, which could never reach the page (the route gate excludes it). * fix(llm-pricing): read-only drawer shows View title, hides source picker Non-managers open the drawer in view mode (write APIs are Admin-only), so: - the heading reads "View model cost" instead of "Edit model cost" - the Source (auto vs. override) picker is hidden, since switching source is a manager-only action with nothing actionable for a viewer. * refactor: form in edit / add modal * chore: update color tokens * fix: add error handling * chore: update more self review changes * chore: self review changes * chore: self review changes * fix: minor grammer thing * fix: route thing * feat(llm-attribute-mapping): add attribute mapping foundation (route, permission, page shell) * feat(llm-attribute-mapping): read-only groups and mappers listing * feat(llm-attribute-mapping): group create/edit/delete via drawer with diff-save * fix: css styling * style(llm-attribute-mapping): use design-token css variables for spacing and typography * fix(llm-attribute-mapping): wrap long condition keys so the context badge isn't clipped * fix(llm-attribute-mapping): unlock filters column shrink so long keys wrap within the cell * fix: text overflow in attribute mapping * fix: fetch data only when tab is open * feat: add attribute mapping tab * fix: update col count * chore: review comments * fix: input * fix: update logic * fix: update drawer * feat: update draft and mapper * refactor: migrate to css moduel * refactor: migrate to css module * refactor: migrate to css module * refactor: css module * feat(llm-attribute-mapping): read-only listing on CSS modules [2/5] Rebase the listing slice onto the foundation's CSS-module refactor (which deleted the global stylesheet) and migrate it accordingly: - Merge listing styles into LLMObservabilityAttributeMapping.module.scss (groups/mappers tables, source chips, index badge, error/footer). - Convert all listing components from global BEM classNames to styles.* module access; drop dead/style-less classes (am-table, am-row-actions, am-add-row, *_edited, mappers-table__error). - Adopt theme-aware semantic tokens (--l2/l3-*, --accent-primary, --callout-error-*) in place of --bg-* primitives. * refactor(llm-attribute-mapping): migrate styles to CSS modules * refactor: migrate to tanstack table * docs: clarify price precision comment * chore: remove comment * feat(llm-attribute-mapping): add attribute mapping foundation (route, permission, page shell) * fix: css styling * refactor: css module * feat(llm-attribute-mapping): read-only listing on CSS modules [2/5] Rebase the listing slice onto the foundation's CSS-module refactor (which deleted the global stylesheet) and migrate it accordingly: - Merge listing styles into LLMObservabilityAttributeMapping.module.scss (groups/mappers tables, source chips, index badge, error/footer). - Convert all listing components from global BEM classNames to styles.* module access; drop dead/style-less classes (am-table, am-row-actions, am-add-row, *_edited, mappers-table__error). - Adopt theme-aware semantic tokens (--l2/l3-*, --accent-primary, --callout-error-*) in place of --bg-* primitives. * chore: migrate tanstack table * chore(llm-attribute-mapping): remove orphaned IndexBadge The TanStack mappers table dropped the leading index column, leaving IndexBadge and its .indexBadge style unused. Remove both. * chore: remove comment * fix: disable isDirty in case of llm pricing * refactor: number * feat: add search , dropdown and flag * feat: feature flag on entire route and add mode costs tabs * fix: add isFetchingFeatureFlags * chore: update flag * refactor: shell * fix: add key to route * feat: add flags * chore: additional refactor * chore: add commet in utis * chore: self review changes * refactor: types and other things * refactor: types and other things * chore: add disable on source id * empty commit * chore: empty commit * fix: add demo side nav on sidenav * chore: remove demo side nav * refactor: update routes * chore: remove usd selector for now * fix: layout shift * refactor: styles * refactor: typography component * refactor: more changes * refactor: typograhy * refactor(llm-pricing): break model-cost drawer into per-component files + tokens Apply the CSS-module/component conventions to the drawer that came from drawer-3: - Move the drawer under ModelCostTabPanel/components/ModelCostDrawer/ to mirror the ModelCostsTable structure - Split the single 395-LOC ModelCostDrawer.module.scss into per-component co-located modules; cross-component selectors live in shared.module.scss and are pulled in via CSS-modules `composes` - shared.module.scss is a composes target (parsed as plain CSS), so it is kept flat with block comments — no SCSS nesting or // comments - Use --text-vanilla-* (not --bg-vanilla-*) for text colors, matching the listing code * refactor: more changes * refactor: styling and components * refactor: styling and components * chore: add a tooltip on hover * feat: add delete confirm modal * fix: update title * refactor: css variables * refactor: use signoz button and minor css update * chore: sync table * chore: remove extra comment * chore: use typograpgy test in table config * fix: minior issues * fix: llm pricing listing * refactor: remove extra classes * refactor: side nav changes * fix: update missing styles * chore: update edit and delete options * chore: remove extra comment * chore: revert env changes * chore: add enable check * chore: remove divider * refactor: use delete confirm dialog * chore: remove scss file * feat: move ui to easily accessable tabs * feat: update test cases * chore: update text * chore: self review changes * chore: self review refactor * chore: self review changes * chore: remove worktree * chore: revert env.ts * chore: add attribute mapping foundation * chore: update ui and add animation * refactor: components update * chore: typography changes * chore: typography changes * chore: use badge * refactor: basic components * chore: remove hardcoded value * chore: add comments & tests * chore: update mapper * chore: update test * chore: minior ux update * chore: lodash isEqual * chore: use lodash * chore: update save draft * chore: update env.ts * chore: update tests * chore: self review changes * chore: update test cases * chore: remove extra comments * refactor(llm-pricing): share toast copy via constants * chore: use constants * chore: redclared constants * chore: update test cases * chore: remove unused component * chore: update types * chore: update design * chore: update ui * refactor: minor things * chore: break down thingsinto comps * chore: update files * fix: update mapping * chore: remove draft logic no need for now * chore: more refactor * chore: remove comments * chore: refactor route * chore: update query refech on mount * chore: self review changes * chore: update skeleton * refactor: code * chore: sync up with group mappers * chore: only 1 mapper row at a time * refactor: code * refactor: eslint disable * chore: update selector * chore: sort * refactor: review changes * chore: use refetch group * feat(llm-attribute-mapping): mapper drawer + persistMappers [4/5] (#11781) * feat(llm-attribute-mapping): mapper drawer + persistMappers [4/5] Core of the mapper drawer work: the MapperFormDrawer + SourceAttributeRow UI, persistMappers store logic, mapper row/actions, and supporting utils/types/saveDraft changes. Removes the barrel (index.ts) files introduced by this PR (MapperFormDrawer, MapperActionsMenu, SourceAttributeRow) and imports those modules directly instead. Tests, public locales, the conditions tooltip, and the KeySearchInput relocation follow in a stacked follow-up PR. * test(llm-attribute-mapping): tooltip, locales, tests + drop barrels [4/5 follow-up] Follow-up to the mapper drawer core PR. Contains: - AttributeMappingsTab + LLMObservabilityAttributeMapping test suites - public locale (titles.json) updates - the group ConditionsTooltip and its GroupHeader wiring - relocation of KeySearchInput to the shared components/ dir - removal of the remaining barrel (index.ts) files across the AttributeMapping feature, importing each module directly * chore: remove comments * chore: reduce width * fix: no refetch on open * chore: add discard dialog --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> * chore: remove reduced motion * chore: self review changes * chore: c should be capital * chore: review changes * refactor: sync server store * chore: update tests * Revert "chore: update tests" This reverts commit |
||
|
|
20e13f66e0 |
fix(infra-monitoring): use proper metric names corresponding to entities to be counted (#12130)
* chore: write proper lists of metricNames to lookup for counts * chore: updated integration tests |
||
|
|
07fe353b94 |
refactor(dashboard-v2): organize variable subsystem into components/ hooks/ utils/ (#12135)
* chore(dashboard-v2): drop self-explanatory comments from the variable subsystem Remove comments that restate a well-named symbol or narrate obvious steps, and trim verbose JSDoc to the non-obvious "why". No behavior change. * refactor(dashboard-v2): organize VariablesBar into components/ hooks/ utils/ Split the flat VariablesBar directory into components/ (each component in its own folder, co-locating a component-specific .module.scss), hooks/ (all use* including useVariableOptions, moved out of selectors/), and utils/ (pure modules). The bar's shared cross-cutting classes and .control stay in the root VariablesBar.module.scss. Import paths updated across the subsystem; no behavior change. Also updates a stale URL assertion in the seed test left over from the store-source-of-truth change. * refactor(dashboard-v2): organize DashboardSettings/Variables into components/ hooks/ utils/ Move the loose files out of the Variables root: pure modules into utils/ (rename variableDependencies -> variableCycleDetection to end the name clash with VariablesBar's graph engine), useSaveVariables into hooks/, and VariableRow and VariablesList into their own component folders with co-located .module.scss. The shared model, adapters and types stay at the root as the folder's public API. Import paths updated across the subsystem; no behavior change. * refactor(dashboard-v2): factor the variable tooltip ref lists into one directional component Extract TooltipRefSection so "Depends on" and "Used by" share one component, differing only by color and an up/down arrow that depicts the dependency direction (up = parents this variable depends on, down = children that use it). * refactor(dashboard-v2): stack the variable name above its control Move each variable's name into a notch label above the control: fixed-width columns, name truncated with a hover title and a spaced/centered info icon, single-line multi-select, ~33px control height, and a visible dropdown caret. Nudge the toolbar spacing so the time selector aligns with the shorter bar. Also render the impact dialog's "still references" warning via Typography color="warning" instead of a bespoke CSS class. * fix: top margin |
||
|
|
9fb89fafc8 |
feat(dashboard-v2): variable runtime — resolver, fetch engine, panel loading, impact dialog (#12125)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(dashboard-v2): single default resolver for variable selection One source of truth for a variable's value (seed → reconcile → payload), shared by the bar, the fetch gate and the query payload so they can't disagree. Precedence stays URL → store → default; ALL materializes once, without an extra round-trip. * feat(dashboard-v2): dependency-ordered, value-gated variable fetch engine Query roots + dynamics fetch immediately; query children unblock only once their parents hold a committed value, so a chain fetches each variable once. The cycle is idempotent per (dashboard·order·time) and resets on page unmount, so a re-mount or editor return can't double it or inherit stale state. * refactor(dashboard-v2): consolidate variable selectors; add bar tooltip + loading bar Fold the per-type Query/Dynamic/Custom selectors into one VariableValueControl backed by useVariableOptions. Add a hover tooltip showing a variable's dependencies (Depends on / Used by) and a loading bar flush along the control's bottom edge; refine name/dependency colors to design-system tokens. * feat(dashboard-v2): hold panels in loading until referenced variables resolve A panel waits until every QUERY/DYNAMIC variable it references is ready — a concrete pick and a DYNAMIC ALL are ready immediately, an unselected value or a QUERY ALL waits until it resolves. The wait folds into the panel's loading flags (a disabled query reports neither), so it never flashes "no data". Only referenced variables re-key the cache. * feat(dashboard-v2): rename/delete variable impact dialog Renaming or deleting a referenced variable is blocked behind a dialog listing every usage (QB / PromQL / ClickHouse panels and other variable defs), with a current → resulting preview, per-usage selection, and inline edits; applied as one JSON-Patch. * fix(dashboard-v2): don't flash ALL on a multi-select while its options load CustomMultiSelect derives "all selected" from options + the current value; with options still empty a concrete selection reads as covering everything. Only enable ALL detection once options have loaded. * refactor(dashboard-v2): make the store the source of truth for variable selection The persisted store (localStorage) is now the sole source of truth for runtime variable values. Stop writing ?variables= on every selection change; the URL param is read once on load (a share link) to seed the store and then dropped, so dashboard navigation and drilldown no longer round-trip through the URL. The panel editor reads the selection from the store (a lagging URL snapshot could clobber a just-changed value). Drops the now-unused withVariablesSearch. * refactor(dashboard-v2): address review feedback on the variable subsystem - consolidate the default resolver: one configuredDefault normalizer shared by resolveDefaultSelection and configuredDefaultValue, plus a textDefault helper for TEXT (drops the dead textValue/empty-string fallbacks) - reuse computeVariableDependencies for the bar tooltip's depends-on / used-by - split the fetch machinery out of useVariableOptions into useFetchedVariableOptions - extract useVariableListActions from the variables settings page - reuse removeVariableFromExpression for delete-clause removal (handles dangling syntax / parentheses) and drop the local removeVariableReferenceClause - grey the impact dialog's Current field on uncheck; comment + spacing nits; guard useIsPanelWaitingOnVariable so it reads variableTypes without optional chaining - fix the seed test's read-once URL assertion |
||
|
|
0655328fa9 |
feat(dashboard-v2): export panels & dashboards from explorers (#12043)
* feat(dashboard-v2): new-panel editor route + query-preserving seed
Add the /dashboard/:id/panel/new route helpers (buildExportPanelLink,
parseNewPanelKind, layoutIndex) and buildNewPanelSeed, which converts an
exported explorer compositeQuery into a seeded panel.
Coerces a builder-only kind (List) to a query-compatible one (PromQL ->
TimeSeries, ClickHouse -> Table) so a non-builder query is preserved rather
than dropped. PanelEditorPage consumes the effective kind; new List panels
seed columns from the query's resolved signal.
* feat(dashboard-v2): flag-aware export-to-dashboard hooks
Add the hooks shared by the explorer "Add to dashboard" flow:
- useGetExportToDashboardLink: builds the V2 panel-editor link (or the V1
new-widget link) based on the use_dashboard_v2 flag.
- useExportDashboards: flag-aware, search-filtered dashboard source. V2
searches server-side via the name-contains filter DSL (debounced); V1
filters its already-complete list in memory.
- useCreateExportDashboard: flag-aware "create a new dashboard" - V2 via the
Perses createDashboardV2, V1 via the legacy create - normalized to Dashboard.
* feat(dashboard-v2): rebuild "Add to dashboard" export dialog
Replace the antd Modal-based ExportPanel with a @signozhq/ui DialogWrapper
dialog driven by the export hooks. The picker searches server-side and pins the
selected dashboard as an option so it survives a narrowing search; "New
dashboard" creates via the flag-aware hook and navigates to the panel editor.
Removes the old index.tsx / styles.ts.
* feat(dashboard-v2): wire explorers to flag-aware export
Point the Logs/Traces/Metrics explorer "Add to dashboard" actions at
useGetExportToDashboardLink, so an exported query lands in the V2 panel editor
when use_dashboard_v2 is on (the V1 new-widget link otherwise). ExplorerOptions
now renders the rebuilt ExportPanel dialog directly instead of wrapping it in an
antd Modal.
* chore: fixed failing tests
* refactor(dashboard-v2): address explorer-export review feedback
- rename isQueryTypeSupported → isQueryTypeSupportedByPanelKind for clarity
- buildExportPanelLink returns null (no silent TimeSeries default) when a
panel type has no V2 kind; explorers guard navigation on the null link
- introduce a neutral ExportDashboard {id,title} for the picker instead of
reusing the V1 Dashboard entity with faked fields
- note why an exported Query's single unit doesn't seed columnUnits
* chore: pr review changes
|
||
|
|
f24102c0db |
feat(infrastructure-monitoring-v2): pod status/counts & couple more fixes (#12127)
* refactor(infrastructure-monitoring-v2): remove pod phase and add pod status/counts * fix(column-header): align to left * fix(cell-value): ensure tooltip is correctly aligned * fix(entity-traces): use - instead of N/A * test(entity-traces): fix broken test |
||
|
|
edee102b52 |
feat(infrastructure-monitoring): add pod metrics tab (#12106)
* fix(k8s-base-details): do not allow untoggle tabs * feat(constants): add base queries for all workloads Ref: https://github.com/SigNoz/engineering-pod/issues/4032#issuecomment-4893103716 * feat(daemon-sets): add pod metrics tab * feat(deployments): add pod metrics tab * feat(jobs): add pod metrics tab * feat(namespaces): add pod metrics tab * feat(statefulsets): add pod metrics tab * fix(k8s-base-details): do not keep selected invalid tab * fix(pod-metrics): add new badge * Revert "fix(pod-metrics): add new badge" This reverts commit 09b8624f52c74b2e4dd5895cfc30206c226a1e97. * chore(k8s-base-details): mark tab as possible null |
||
|
|
9a26998d18 |
chore: add integration tests for metrics under reduction - query part (#11979)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* chore: add integration tests for metrics under reduction - query part * chore: add to ci * chore: add todos * chore: update tests * chore: trigger build * chore: address review comments * chore: undo the changes to tests/fixtures/http.py * chore: remove __normalized and add fast path * chore: fix unit tests * chore: update test * chore: sunset 25.5.6, update migrator version, and remove version arg * chore: also update devenv --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
fbf2e62044 |
feat(infrastructure-monitoring-v2): add onboarding checks (#12119)
* feat(infrastructure-monitoring): add onboarding checks * refactor(infrastructure-monitoring): use error content to show error message * test(infrastructure-monitoring): add tests for onboarding checks |
||
|
|
62c44f5eac | chore: pass org id for flagger (#12126) | ||
|
|
65fde71b72 |
feat(infrastructure-monitoring-v2): add counts cards (#12120)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(entity-count): add base structure to show count * feat(entity-count): add count for clusters * feat(entity-count): add count for namespaces * chore(infra-monitoring): move component to be under components folder * fix(pr): address comments |
||
|
|
7f5f63b20a |
feat(infra-monitoring): add docs for every chart (#12037)
* feat(infra-monitoring): add docs for every chart * fix(docs): add missing docs for each column/chart * fix(infra-monitoring): keep referer --------- Co-authored-by: Nikhil Mantri <nikhil.mantri1999@gmail.com> |
||
|
|
63cfbe8bfb | fix: convert key not found to warnings for traces (#12091) | ||
|
|
0c28b8b251 |
feat: scalar/table serializers for client-side export (3) (#12070)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* refactor(data-export): extract the withUnit header helper
Both the timeseries and the upcoming table serializers append units to headers (and skip display-only ids like 'short'/'none') — move the helper to its own module.
* feat(data-export): add generic table-model serializer
exportTableData serializes any prepared antd-style table model ({name, key, isValueColumn} columns + record rows) into a SerializedTable — raw values in display order, units on value columns only, blanks for missing cells. Surface-agnostic: QueryTable-based tables, dashboard tables and plain antd tables all adapt in a line or two.
* feat(data-export): add scalar queryRange serializer
exportScalarData takes the queryRange response object (formatForWeb webTables payload) + the builder query and serializes via createTableColumnsFromQuery — the exact preparer QueryTable renders from — so exports inherit the on-screen merge, naming and column order 1:1.
|
||
|
|
10a0d262d9 | feat: add download option to trace view (#12116) | ||
|
|
334155a226 |
fix(infra-monitoring-v2): ensure workloads has filters by cluster+namespace (#12076)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(tanstack): add support for itemKey be object * feat(infra-monitoring): add base structure for multiple selected items * refactor(infra-monitoring): add cluster for namespaces, cluster/namespace for volumes + update other entities * refactor(infra-monitoring): add cluster + namespace for statefulsets * refactor(infra-monitoring): add cluster + namespace for jobs * refactor(infra-monitoring): add cluster + namespace for deployments * refactor(infra-monitoring): add cluster + namespace for daemonsets * test(infra-monitoring): add new tests for changes of k8s base list * fix(pr): address comments |
||
|
|
42de840534 |
fix(rules): scope alert rule store operations by org (#12117)
* fix(rules): scope alert rule store operations by org The rule store predicates filtered on the rule id only, so on multi-org deployments (Cloud/EE/multi-org self-hosted, where orgs share the instance via the noop sharder) an authenticated user could read, edit or delete another org's alert rules by supplying the target rule UUID. ViewAccess/EditAccess only check the caller's own-org role, never the resource's org, so nothing enforced tenant isolation on the rule itself. Enforce org scoping at the store layer, which is the durable fix: - GetStoredRule and DeleteRule now take the caller's orgID and add `org_id = ?` to their predicates. - EditRule adds `org_id = ?` (from the model, which is now always sourced from an org-scoped read). - The manager passes claims.OrgID on every by-id path; GetRule now derives the org from claims (it previously fetched by id alone). Cross-org ids now resolve to NotFound instead of leaking or mutating another org's rule. Single-org OSS instances are unaffected. CWE-639 (authorization bypass through user-controlled key). * refactor(rules): derive claims org id with valuer.MustNewUUID Claims are pre-validated by the auth middleware, so the NewUUID error branch is dead code. Follow the handler convention (docs/contributing/ go/handler.md) and use the Must constructor on the by-id rule paths. |
||
|
|
891106d1ca |
fix: set correct openapi response struct for span mapper list (#12094)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix: set correct opapi response model for span mapper list * fix: change group_id to groupId in response * fix: format properly * fix: update fixtures |
||
|
|
707f01bd9c |
chore: support non-dsl search in dashboards v2 list apis (#12051)
* chore: support non-dsl search in dashboards v2 list apis * chore: move free text compilation to visitor * chore: shorten comments * fix: support both plain text and dsl together * fix: ensure empty description dashboards are not excluded in NOT checks |
||
|
|
3cd0c21703 | feat(daemonsets): add ready/misscheduled columns (#12102) | ||
|
|
181feb3eb9 |
fix(dashboard-v2): only refetch on-screen panels on time change/auto-refresh (#12113)
Panel visibility was latched (isObserverOnce), so once every panel had scrolled into view they all stayed query-enabled. A time change or auto-refresh re-keys every panel's query, refetching all of them at once. Track the live viewport instead so off-screen panels stay query-disabled and skip the refetch; they fetch lazily when scrolled back in. Add staleTime: Infinity so re-entering an unchanged window serves cache rather than thrash-refetching (key changes and manual refetch still run). |
||
|
|
bf35d12398 |
chore: add functional unique index for tags (#12029)
* feat: add functional unique index * chore: add tag migration * chore: add failing scratch test (to discuss) * chore: fetch expressions as well in getindices call * fix: remove tag unique index (will be added in a separate PR) * fix: remove tag unique index (will be added in a separate PR) * chore: remove temporary tests * chore: add functional unique index for tags * fix: go lint fix * fix: go lint fix * chore: better comment for unique index * test: add test for case insensitive expression equality * test: add equality test for columns with quotes and capital letters * test: add test for quoted columns * chore: add separate type for unique indices with expressions * fix: update migration file to use correct index * test: add test for postgres provider * test: add test for postgres provider * fix: remove round trip tests |
||
|
|
1a1f7b2d78 |
fix(dashboard-v2): bug bash fixes IV (#12056)
* fix(context-menu): keep overlay clickable when opened inside a modal Portal the popover to body and set pointer-events:auto so a modal's dialog/backdrop can't trap it. * fix(dashboard-v2): center scrolled-to panels and sections Default the scroll block to 'center' so a targeted panel lands mid-viewport. * fix(dashboard-v2): make the view modal refresh button secondary Use outlined/secondary so refresh doesn't compete with the primary action. * fix(dashboard-v2): fetch only on-screen panels on dashboard load RGL unfolds panels from the top-left origin on mount, briefly piling them into the viewport. The latched observer then marked all visible; suppress the item transition for the first frame. * chore: readded entry animation |
||
|
|
a2778aa45f |
chore(deps): bump golang.org/x/net from 0.54.0 to 0.55.0 (#11965)
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.54.0 to 0.55.0. - [Commits](https://github.com/golang/net/compare/v0.54.0...v0.55.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-version: 0.55.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
16c1fce326 |
fix(ruletypes): address rule read round-trip gaps (#12110)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
06b762b7ef |
fix(llm o11y): update unpriced models tab test case (#12108)
* fix: update unpriced models tab test case * chore: update ci timming * chore: update comment * chore: remove comment --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
466edf1f1c |
feat: timeseries export in logs, traces and metrics explorers (2) (#12055)
* feat(data-export): surface raw V5 response and legend map from GetMetricQueryRange Keeps the pre-conversion V5 queryRange response and the per-query legend map on the returned MetricQueryRangeSuccessResponse so explorer views can feed client-side export without a refetch. Additive optional fields; the legacy V3 render path is untouched. One chokepoint covers Logs, Traces and Metrics. * fix(data-export): omit display-only format ids from export headers 'short'/'none' are Grafana-style display formats, not physical units — meaningful on a chart axis but misleading as 'value (short)' in a CSV header. Real units (ms, bytes, ...) are unchanged. * feat(data-export): timeseries export menu and opt-in TimeSeriesView header New TimeseriesExportMenu (csv/jsonl, LONG shape default; same look as DownloadOptionsMenu, which stays raw/list-only) rendered from a new opt-in TimeSeriesView header row: unit selector left (onYAxisUnitChange — rendering only, unit state stays with each view), download right (allowExport, needs the surfaced raw V5). Both default off, so views opt in explicitly. Includes gating + menu tests. * feat(explorer): enable timeseries export in Logs, Traces and Metrics Logs and Traces pass allowExport + onYAxisUnitChange and drop their external unit-filter headers (one header row: unit left, download right). Metrics passes allowExport only, per chart — its YAxisUnitSelector stays screen-level (persists to the metric, spans N charts). convertDataValueToMs now converts the raw V5 tree too, so Traces duration exports carry the ms values the chart shows instead of raw nanoseconds. * refactor(data-export): use @signozhq/ui components in the export popover Review feedback: swap antd Button/Popover/Tooltip for the design-system equivalents (radix-style Popover with controlled open, TooltipSimple, Button with native loading). Styles restructured for the DS DOM with periscope font tokens; test renders via tests/test-utils for the TooltipProvider. |
||
|
|
849353b5c0 |
feat(infra-monitoring): counts query for counting related entities (#12000)
* chore: added types and open api spec changes * chore: added method to calculate reason * chore: per group pod status counts with req metric checks method added * chore: wired up pod status counts * chore: pod restarts type added * chore: added restart counts for the group * chore: bug in query fix * chore: onboarding API changes * chore: integration tests added * chore: added podcountsbyphase in other entities * chore: added pod status counts for other entities * chore: added integration tests for other entities * chore: added checks api changes for other entities * chore: rearrangement * chore: removed succeeded status and mark it as completed * chore: query beautified * chore: corrected metrics list for metadata lookup * chore: removed dead constants * chore: goroutines for ListHosts * chore: goroutines for ListPods * chore: goroutines for ListNodes * chore: goroutines for ListNamespaces * chore: goroutines for ListClusters * chore: goroutines for ListDeployments * chore: goroutines for ListStatefulsets * chore: added goroutines for ListStatefulsets, ListJobs and ListDaemonsets * chore: added function * chore: added struct changes * chore: added count attr keys * chore: wired counts to the response fields * chore: regenerated API spec * chore: merged main, resolved conflicts * chore: nodes count surfacing * chore: integration tests added * fix: use tuple mapping to uniquely identify attrs: * chore: integration tests update |
||
|
|
8e4d7c68b3 |
feat(dashboard-v2): query-first DSL filter for the dashboards list (#12046)
* feat(dashboard-v2): stage-aware DSL autocomplete engine for the list filter
* feat(dashboard-v2): single query-string list-filter state with reflect/splice
* feat(dashboard-v2): drive saved/built-in views off the query string
* feat(dashboard-v2): CodeMirror query box with DSL autocomplete popup
* feat(dashboard-v2): antd Created-by/Updated filter selects, drop the Tags dropdown
* feat(dashboard-v2): wire the DSL filter into the dashboards list (sticky header, pagination)
* fix: small css elevation
* refactor(dashboard-v2): reuse shared operator constants in the DSL grammar
Build STRING_OPS / OPERATOR_MATRIX / VALUELESS_OPERATORS from the shared OPERATORS + negateOperator (constants/antlrQueryConstants) instead of hardcoded strings; drop a stale lint-disable in FilterChips. Addresses review comments.
* fix(dashboard-v2): wrap IN/NOT IN autocomplete values in a bracketed list
Picking a value for an IN/NOT IN clause in the DSL search box inserted a
bare literal ('x') instead of a list (['x']). The value stage now wraps a
fresh pick in a closed bracketed list, appends subsequent picks inside the
existing brackets (deduping already-entered values), and keeps the caret
inside the list so multi-select continues.
---------
Co-authored-by: Srikanth Chekuri <srikanth.chekuri92@gmail.com>
|
||
|
|
2704317c6a |
feat(llm-pricing): add Unpriced Models tab with billing-model mapping [6/6] (#11813)
* feat(llm-pricing): add model pricing foundation (route, permission, page shell) * feat(llm-pricing): add listing page and table * chore(llm-pricing): drop search + source filters from list request The list API does not honour the q (search) and source params yet, so the controls did nothing. Remove the search input and source dropdown along with the params we sent, and trim useModelPricingFilters to the URL-backed page state that pagination still needs. Currency dropdown, tabs, table and pagination are unchanged. Filters will return once the backend supports them. * refactor(llm-pricing): extract getRelativeTime helper in utils Pull the relative-time formatting out of getRelativeLastSeen into a small local getRelativeTime helper. Kept feature-local (not in the shared utils/timeUtils) so the LLM pricing module owns its own dayjs config; the local relativeTime extend stays for test self-sufficiency. * refactor(llm-pricing): drop dead NaN guard in formatPricePerMillion Pricing fields are typed as required numbers and JSON can't carry NaN, so Number.isNaN was unreachable. Keep the null/undefined guard as API defensiveness (toFixed on a missing value would crash the row). Also trims the now-redundant dayjs.extend comment. * refactor(llm-pricing): centralize constants and shared types Extract PAGE_SIZE, PAGE_KEY, COLUMN_COUNT and CURRENCY_OPTIONS into a new constants.ts, and move the ModelPricingFilters contract into types.ts. Component prop interfaces stay colocated with their components, matching the convention in the drawer PR. * refactor(llm-pricing): use nuqs for list pagination URL state Replace the hand-rolled useHistory + URLSearchParams plumbing in useModelPricingFilters with nuqs useQueryState, matching the convention used by the dashboards, alerts and k8s list pages. Behaviour is unchanged: parseAsInteger.withDefault(1) keeps ?page=1 out of the URL and history:'replace' avoids polluting the back-stack. * refactor(llm-pricing): inline pagination, drop useModelPricingFilters The hook had shrunk to a one-line nuqs wrapper after search/source were removed, so inline the useQueryState call into the container and remove the hook file plus the now-unused ModelPricingFilters type. When the filters return (once the API honours them) they can move back into a dedicated hook. * feat(llm-pricing): disable currency selector (USD-only for now) Only USD is priced today, so render the currency SelectSimple in a disabled state pinned to USD. A disabled select can't fire onChange, so the currency useState is dead — drop it (and the now-unused useState import). * refactor(llm-pricing): render model costs inside its tab + tab URL param The listing was rendered outside the Tabs, so the tab was decorative. Move all model-cost content (currency control, list query, table, pagination, footer) into a ModelCostsTab component rendered as the 'Model costs' tab's children, and drive the active tab from a 'tab' URL query param (nuqs). The container is now just the page shell. Unpriced models stays a disabled placeholder for a later PR. * style(llm-pricing): target @signozhq table slots, drop dead antd/leftover rules The component uses @signozhq/ui Table/Tabs (Radix-based), not antd, so the .ant-table-* and .ant-tabs-nav selectors never matched — the intended uppercase/muted header styling wasn't applied. Retarget header/cell rules to [data-slot='table-head'|'table-cell'] (no !important needed). Also remove dead rules left over from the removed search/source/add UI (.filters-bar__search, __source, __add, .page-header__actions) and the unused .source-badge--auto/ --override modifiers. * fix(llm-pricing): constrain currency dropdown width, drop tab URL param - Currency SelectSimple stretched to fill the filters bar; give it a fixed 160px width (min-width couldn't cap the trigger). - Model costs is the only enabled tab for now, so use Tabs defaultValue instead of a URL-backed param. Removes the nuqs tab state plus the now-unused TAB_KEYS/TAB_QUERY_KEY constants and TabKey type. * chore: self review changes * fix: add skeleton loading * refactor: self review changes * refactor: initial prop * fix: update styling * fix: add comments in utils * feat(llm-pricing): add model cost drawer and wire into listing page * fix(llm-pricing): restrict pricing management to admins Align the frontend write gate with the backend, which protects the LLM pricing create/update/delete endpoints with AdminAccess (admin only). Previously manage_llm_pricing allowed EDITOR/AUTHOR, so those roles saw the Add/Save affordances but their writes were rejected with a 403. Also removes the AUTHOR entry, which could never reach the page (the route gate excludes it). * fix(llm-pricing): read-only drawer shows View title, hides source picker Non-managers open the drawer in view mode (write APIs are Admin-only), so: - the heading reads "View model cost" instead of "Edit model cost" - the Source (auto vs. override) picker is hidden, since switching source is a manager-only action with nothing actionable for a viewer. * refactor: form in edit / add modal * chore: update color tokens * fix: add error handling * chore: update more self review changes * chore: self review changes * chore: self review changes * fix: minor grammer thing * fix: route thing * refactor: migrate to css moduel * refactor: migrate to css module * refactor: migrate to css module * refactor: migrate to tanstack table * docs: clarify price precision comment * chore: remove comment * chore: remove comment * fix: disable isDirty in case of llm pricing * refactor: number * feat: add search , dropdown and flag * feat: feature flag on entire route and add mode costs tabs * fix: add isFetchingFeatureFlags * feat: llm pricing unpriced model * chore: update flag * refactor: shell * fix: add key to route * feat: add flags * chore: additional refactor * chore: add commet in utis * chore: self review changes * refactor: types and other things * refactor: types and other things * chore: add disable on source id * empty commit * feat: add search to search model name * chore: empty commit * fix: add demo side nav on sidenav * chore: remove demo side nav * refactor: update routes * chore: remove usd selector for now * fix: layout shift * refactor: styles * refactor: typography component * refactor: more changes * refactor: typograhy * refactor(llm-pricing): break model-cost drawer into per-component files + tokens Apply the CSS-module/component conventions to the drawer that came from drawer-3: - Move the drawer under ModelCostTabPanel/components/ModelCostDrawer/ to mirror the ModelCostsTable structure - Split the single 395-LOC ModelCostDrawer.module.scss into per-component co-located modules; cross-component selectors live in shared.module.scss and are pulled in via CSS-modules `composes` - shared.module.scss is a composes target (parsed as plain CSS), so it is kept flat with block comments — no SCSS nesting or // comments - Use --text-vanilla-* (not --bg-vanilla-*) for text colors, matching the listing code * refactor: more changes * refactor: styling and components * refactor: styling and components * chore: add a tooltip on hover * feat: add delete confirm modal * fix: update title * refactor: css variables * refactor: use signoz button and minor css update * chore: sync table * chore: remove extra comment * chore: use typograpgy test in table config * fix: minior issues * fix: llm pricing listing * refactor: remove extra classes * refactor: side nav changes * fix: update missing styles * chore: update edit and delete options * chore: remove extra comment * chore: revert env changes * chore: add enable check * chore: remove divider * refactor: use delete confirm dialog * chore: remove scss file * feat: move ui to easily accessable tabs * feat: update test cases * chore: update text * chore: self review changes * chore: self review refactor * chore: self review changes * feat(llm-pricing): batch-map unpriced models via top Save + confirm drawer Replace the per-row "Map to model" button + inline confirm with a single top-level Save button that opens a confirm drawer listing every pending mapping in a table (model -> billing model + pricing). - Batch the save: group selections by target rule so multiple models mapped to the same rule append their patterns in one PUT instead of clobbering - Capped, skeleton-loaded unpriced table (max-height) to avoid layout shift, matching the model-costs table - Restore the dropped .modelCellName style; drop dead inline-confirm styles - Tests: batch/clobber hook test, tab integration flow, and fix the stale 'unpriced tab disabled' assertion (the tab is now enabled) * chore: remove worktree * chore: revert env.ts * chore: update llm pricing * chore: update ui * chore: sync unpriced modal * chore(llm-pricing): address Copilot review on unpriced confirm table - formatSpanCount: use Intl.NumberFormat compact so 999,999 renders as "1M" (not "1000.0K") and trailing ".0" is dropped - confirm drawer extra-buckets container: non-wrapping inline-flex so buckets stay on one line at the fixed row height - soften the misleading "renders identically" comment (extra buckets are plain inline text here, not the model-costs Badge chips) * chore: flex wrap * chore: self review changes * feat: add support to remove model * chore: update ux * chore: update test cases * chore: remove unused test cases * chore: update tests * chore: remove extra integration * chore: refactor * refactor: imports * refactor: un priced modal * chore: update unpriced modal * chore: update map billing mode select * refactor: code * refactor: remove comments * chore: make bg great again --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
9476d8f70f |
feat(infrastructure-monitoring-v2): add button to open chart at metrics explorer (#12107)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
69a240fdb2 |
chore(frontend): bump deps (#12052)
* chore(frontend): bump deps * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * chore(pnpm-lock): missing update --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> |
||
|
|
6975c4d90c |
chore(codeowners): update infra monitoring file owner (#12073)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
9bfa6e6d59 |
feat(authz): store role transaction groups as JSON document (#12028)
* feat(authz): store role transaction groups as document of record Persist a role's transaction groups as JSON on the role row so the role details page is reconstructed deterministically from SQL instead of being rebuilt from OpenFGA tuples (which will soon carry opaque hashed telemetry selectors): - authtypes: TransactionGroups gains Value/Scan (validated via NewTransactionGroups) and MarshalJSON (nil renders as []); NewRole takes transactionGroups; NewManagedRoles fills managed docs from the registry; RoleWithTransactionGroups removed - Role carries the wire field and the AuthZ interface, handler, and OpenAPI responses use *Role; GettableRole (without transactionGroups) is the list response - sqlmigration 099: add role.transaction_groups, backfill custom roles from their permission tuples (dual dialect) and managed roles from the registry - sqlmigration 059: pin insert columns so the live Role model addition does not break fresh installs (059 runs before 099) - ee provider: writes persist the doc alongside FGA tuples (FGA first, SQL second, as before); GetWithTransactionGroups reads the doc; the per-type ReadTuples fan-out (readAllTuplesForRole) is removed - audit middleware: log and skip resolved resources carrying a resolution error - frontend: regenerated OpenAPI spec and API types; role list consumers retyped to GettableRole; role GET keeps transactionGroups * fix(authz): reconcile role tuples from openfga state, decouple migration 059 - Update and Delete derive their diff/deletion base from the tuples openfga actually holds for the role (readAllTuplesForRole) instead of the stored JSON record, so every mutation sweeps drift and residue; the record stays a display-only artifact written after the tuple write - ReadTuples restored on the AuthZ interface with plain passthroughs in both providers and the ee server - TransactionGroups.Value marshals unconditionally (nil renders as [] via MarshalJSON) instead of returning a nil driver.Value - migration 059 uses a migration-local role struct and constructor so live Role model changes cannot alter its insert; migration 099 drops the manual column-exists guard (AddColumn emits IF NOT EXISTS) * refactor(authz): split role into domain Role and StorableRole Replace the Scan/Value/MarshalJSON codecs on TransactionGroups with the storable pattern: StorableRole is the bun model carrying transaction groups as raw JSON text, Role is the pure domain/wire type, and NewStorableRoleFromRole/NewRoleFromStorableRole convert at the store boundary (nil groups persist as [], reads parse through the validating constructor). RoleStore and sqlauthzstore speak StorableRole; both providers convert; handlers and the wire contract are unchanged. * revert(authz): restore TransactionGroups codecs over the storable split Role is a bun relation target (UserRole.Role, ServiceAccountRole.Role), so splitting it into StorableRole/Role cascaded: relations must point at the bun model, which broke the user-roles join and leaked the storable shape into user and service account responses. Keep the single Role model with Scan/Value/MarshalJSON on TransactionGroups; the storable split fits leaf models only. This reverts commit 73aa7d32b1 and keeps transaction_test.go deleted. * refactor(authz): use bun models in migration 099, wire oss role get - migration 099 follows the migration-local row struct pattern: bun NewSelect/NewUpdate for the role table reads and backfill writes; the openfga store and tuple lookups stay raw like 081/083 - oss provider Get reads the role from the store instead of returning unsupported * refactor(authz): org-scoped backfill in migration 099, empty groups on null scan - migration 099 iterates organizations: per org it backfills custom roles from their permission tuples (readRoleTuples helper) and managed roles from the registry (JSON precomputed per role name) - TransactionGroups scans SQL NULL as an empty slice so the api always renders transactionGroups as []; nullzero keeps writing NULL for nil * fix(authz): pass unique constraints to add column in migration 099 |
||
|
|
86313ae561 |
feat: clousql - adding metrics in definition and dashboard JSON (#12072)
* feat: adding metrics in definition and dashboard JSON * refactor: renaming cloudsql to cloudsql_postgres * refactor: generating openapi specs |
||
|
|
f764a8d9af |
feat(llm-attribute-mapping): read-only listing [2/5] (#11779)
* feat(llm-pricing): add model pricing foundation (route, permission, page shell) * feat(llm-pricing): add listing page and table * chore(llm-pricing): drop search + source filters from list request The list API does not honour the q (search) and source params yet, so the controls did nothing. Remove the search input and source dropdown along with the params we sent, and trim useModelPricingFilters to the URL-backed page state that pagination still needs. Currency dropdown, tabs, table and pagination are unchanged. Filters will return once the backend supports them. * refactor(llm-pricing): extract getRelativeTime helper in utils Pull the relative-time formatting out of getRelativeLastSeen into a small local getRelativeTime helper. Kept feature-local (not in the shared utils/timeUtils) so the LLM pricing module owns its own dayjs config; the local relativeTime extend stays for test self-sufficiency. * refactor(llm-pricing): drop dead NaN guard in formatPricePerMillion Pricing fields are typed as required numbers and JSON can't carry NaN, so Number.isNaN was unreachable. Keep the null/undefined guard as API defensiveness (toFixed on a missing value would crash the row). Also trims the now-redundant dayjs.extend comment. * refactor(llm-pricing): centralize constants and shared types Extract PAGE_SIZE, PAGE_KEY, COLUMN_COUNT and CURRENCY_OPTIONS into a new constants.ts, and move the ModelPricingFilters contract into types.ts. Component prop interfaces stay colocated with their components, matching the convention in the drawer PR. * refactor(llm-pricing): use nuqs for list pagination URL state Replace the hand-rolled useHistory + URLSearchParams plumbing in useModelPricingFilters with nuqs useQueryState, matching the convention used by the dashboards, alerts and k8s list pages. Behaviour is unchanged: parseAsInteger.withDefault(1) keeps ?page=1 out of the URL and history:'replace' avoids polluting the back-stack. * refactor(llm-pricing): inline pagination, drop useModelPricingFilters The hook had shrunk to a one-line nuqs wrapper after search/source were removed, so inline the useQueryState call into the container and remove the hook file plus the now-unused ModelPricingFilters type. When the filters return (once the API honours them) they can move back into a dedicated hook. * feat(llm-pricing): disable currency selector (USD-only for now) Only USD is priced today, so render the currency SelectSimple in a disabled state pinned to USD. A disabled select can't fire onChange, so the currency useState is dead — drop it (and the now-unused useState import). * refactor(llm-pricing): render model costs inside its tab + tab URL param The listing was rendered outside the Tabs, so the tab was decorative. Move all model-cost content (currency control, list query, table, pagination, footer) into a ModelCostsTab component rendered as the 'Model costs' tab's children, and drive the active tab from a 'tab' URL query param (nuqs). The container is now just the page shell. Unpriced models stays a disabled placeholder for a later PR. * style(llm-pricing): target @signozhq table slots, drop dead antd/leftover rules The component uses @signozhq/ui Table/Tabs (Radix-based), not antd, so the .ant-table-* and .ant-tabs-nav selectors never matched — the intended uppercase/muted header styling wasn't applied. Retarget header/cell rules to [data-slot='table-head'|'table-cell'] (no !important needed). Also remove dead rules left over from the removed search/source/add UI (.filters-bar__search, __source, __add, .page-header__actions) and the unused .source-badge--auto/ --override modifiers. * fix(llm-pricing): constrain currency dropdown width, drop tab URL param - Currency SelectSimple stretched to fill the filters bar; give it a fixed 160px width (min-width couldn't cap the trigger). - Model costs is the only enabled tab for now, so use Tabs defaultValue instead of a URL-backed param. Removes the nuqs tab state plus the now-unused TAB_KEYS/TAB_QUERY_KEY constants and TabKey type. * chore: self review changes * fix: add skeleton loading * refactor: self review changes * refactor: initial prop * fix: update styling * fix: add comments in utils * feat(llm-pricing): add model cost drawer and wire into listing page * fix(llm-pricing): restrict pricing management to admins Align the frontend write gate with the backend, which protects the LLM pricing create/update/delete endpoints with AdminAccess (admin only). Previously manage_llm_pricing allowed EDITOR/AUTHOR, so those roles saw the Add/Save affordances but their writes were rejected with a 403. Also removes the AUTHOR entry, which could never reach the page (the route gate excludes it). * fix(llm-pricing): read-only drawer shows View title, hides source picker Non-managers open the drawer in view mode (write APIs are Admin-only), so: - the heading reads "View model cost" instead of "Edit model cost" - the Source (auto vs. override) picker is hidden, since switching source is a manager-only action with nothing actionable for a viewer. * refactor: form in edit / add modal * chore: update color tokens * fix: add error handling * chore: update more self review changes * chore: self review changes * chore: self review changes * fix: minor grammer thing * fix: route thing * refactor: migrate to css moduel * refactor: migrate to css module * refactor: migrate to css module * refactor: migrate to tanstack table * docs: clarify price precision comment * chore: remove comment * feat(llm-attribute-mapping): add attribute mapping foundation (route, permission, page shell) * fix: css styling * refactor: css module * feat(llm-attribute-mapping): read-only listing on CSS modules [2/5] Rebase the listing slice onto the foundation's CSS-module refactor (which deleted the global stylesheet) and migrate it accordingly: - Merge listing styles into LLMObservabilityAttributeMapping.module.scss (groups/mappers tables, source chips, index badge, error/footer). - Convert all listing components from global BEM classNames to styles.* module access; drop dead/style-less classes (am-table, am-row-actions, am-add-row, *_edited, mappers-table__error). - Adopt theme-aware semantic tokens (--l2/l3-*, --accent-primary, --callout-error-*) in place of --bg-* primitives. * chore: migrate tanstack table * chore: remove comment * fix: disable isDirty in case of llm pricing * refactor: number * feat: add search , dropdown and flag * feat: feature flag on entire route and add mode costs tabs * fix: add isFetchingFeatureFlags * chore: update flag * refactor: shell * fix: add key to route * feat: add flags * chore: additional refactor * chore: add commet in utis * chore: self review changes * refactor: types and other things * refactor: types and other things * chore: add disable on source id * empty commit * chore: empty commit * fix: add demo side nav on sidenav * chore: remove demo side nav * refactor: update routes * chore: remove usd selector for now * fix: layout shift * refactor: styles * refactor: typography component * refactor: more changes * refactor: typograhy * refactor(llm-pricing): break model-cost drawer into per-component files + tokens Apply the CSS-module/component conventions to the drawer that came from drawer-3: - Move the drawer under ModelCostTabPanel/components/ModelCostDrawer/ to mirror the ModelCostsTable structure - Split the single 395-LOC ModelCostDrawer.module.scss into per-component co-located modules; cross-component selectors live in shared.module.scss and are pulled in via CSS-modules `composes` - shared.module.scss is a composes target (parsed as plain CSS), so it is kept flat with block comments — no SCSS nesting or // comments - Use --text-vanilla-* (not --bg-vanilla-*) for text colors, matching the listing code * refactor: more changes * refactor: styling and components * refactor: styling and components * chore: add a tooltip on hover * feat: add delete confirm modal * fix: update title * refactor: css variables * refactor: use signoz button and minor css update * chore: sync table * chore: remove extra comment * chore: use typograpgy test in table config * fix: minior issues * fix: llm pricing listing * refactor: remove extra classes * refactor: side nav changes * fix: update missing styles * chore: update edit and delete options * chore: remove extra comment * chore: revert env changes * chore: add enable check * chore: remove divider * refactor: use delete confirm dialog * chore: remove scss file * feat: move ui to easily accessable tabs * feat: update test cases * chore: update text * chore: self review changes * chore: self review refactor * chore: self review changes * chore: remove worktree * chore: revert env.ts * chore: add attribute mapping foundation * chore: update ui and add animation * refactor: components update * chore: typography changes * chore: typography changes * chore: use badge * refactor: basic components * chore: remove hardcoded value * chore: add comments & tests * chore: update env.ts * chore: update tests * chore: self review changes * chore: update test cases * chore: remove extra comments * refactor(llm-pricing): share toast copy via constants * chore: use constants * chore: redclared constants * chore: update test cases * chore: remove unused component * chore: update types * chore: update ui * refactor: minor things * chore: break down thingsinto comps * chore: update files * fix: update mapping * chore: remove draft logic no need for now * chore: more refactor * chore: remove comments * chore: refactor route * chore: update query refech on mount * chore: update skeleton * refactor: code * refactor: code * refactor: eslint disable * chore: update selector * chore: sort --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
3e971a902a |
fix(dashboard-v2): carry unsaved panel edits into view mode (#12049)
* fix(dashboard-v2): carry unsaved panel edits into view mode Switching from the panel editor to View Mode dropped un-saved config edits (thresholds, units, columns, legend, formatting, axes) — the View modal re-seeded from the saved panel spec, carrying only the live query. Hand the live draft spec off via a tab-scoped sessionStorage handoff, correlated to the panel by dashboardId + panelId. The query stays in the URL (compositeQuery) so the query builder hydrates; the rest of the spec rides in sessionStorage so the edits survive a refresh without bloating the URL. The handoff is cleared on plain View, grid drilldown, and close so it can't seed a stale view. * fix(dashboard-v2): hide 'Switch to Edit Mode' without edit permission The View panel modal is reachable by read-only users, so gate the Switch to Edit Mode button on canEditDashboard && !isLocked, mirroring how the panel actions menu gates the Edit panel item. * feat(dashboard-v2): track panel view/edit mode switch events Add DashboardEvents enum and log SWITCH_TO_EDIT_MODE (View modal) and SWITCH_TO_VIEW_MODE (panel editor) when the user toggles between the two panel modes. * fix(dashboard-v2): bound query cacheTime to 0 under auto-refresh Under auto-refresh each cycle mints a fresh time-keyed query, so unused entries accumulate and can OOM the tab. Drop cacheTime to 0 when auto-refresh is enabled (V1 parity) for panel queries and the query/ dynamic variable selectors; keep DASHBOARD_CACHE_TIME otherwise. |
||
|
|
e0a0f49fb4 |
fix(alerts): surface individual validation errors in API response (#11756)
* fix(alerts): surface individual validation errors in API response * chore: address lint |
||
|
|
03abb3ca90 |
fix: update stale docs links in backend and remaining frontend (#12096)
Repairs 10 broken signoz.io/docs links (5 hard 404s + 5 dead anchors) that survived the frontend-only sweep in #11319 because they live in the Go backend and two frontend files it did not cover. - infra-monitoring readiness checks: drop the removed `user-guides/` path segment and remap to the current hostmetrics/k8s-metrics anchors - querybuilder / telemetrylogs search-troubleshooting errors: point to the reworded Q&A anchors (update matching test assertion) - alert generatorURL fallback: `alerts-management/#generator-url` -> `alerts/` (anchor removed in docs restructure) - missing-spans banner: -> traces-management troubleshooting FAQ anchor - agent-skills install link: `#installation` -> `#install-the-plugin` Every changed URL verified live (200 + anchor present). Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
e4f9daf7d2 |
feat(qb): add time_series export support + data-export foundation for other format supports (#12025)
* feat: rename existing export logic to follow the new export data structure * feat(data-export): add time_series serializer Pure serializer that walks the V5 time_series tree (results → aggregations → series) into a format-agnostic SerializedTable — tidy layout, one row per (series, timestamp), labels as columns, raw values, y-axis unit in the value header. Series names match the chart legend (getLabelName + getLegend resolve legend templates and aggregation aliases/expressions from the builder query). * feat(data-export): add csv/jsonl formatters and timestamped client download toCsv/toJsonl turn a SerializedTable into CSV or newline-delimited JSON; downloadFile triggers a client-side blob download with a timestamped filename (base-YYYY-MM-DD_HH-mm-ss.ext) so repeated exports never collide and record when they were taken. * feat(data-export): add useClientExport dispatch hook Frontend-driven export hook: narrows a V5 queryRange response by request type, serializes time_series (scalar lands with the next sub-issue), formats as csv/jsonl and downloads. Takes the builder query for chart-parity series naming. Backend-driven export stays in useServerExport. * test(data-export): assert timestamped filenames via the naming helper Review feedback: the filename-format regexes duplicated the format spec across tests. The hook tests now freeze the clock and assert delegation to getTimestampedFileName; the format itself stays pinned by the single exact-string test beside the function. * feat: comment update * feat: use exsiting request type |
||
|
|
d1a06a91bf |
test(service-account): mock motion lib & change drawer open/close detection (#12077)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* test(service-account): mock motion lib & change drawer open/close detection * test(serviceaccount): remove getByRole & use wait for instead of waitForElementToBeRemoved |
||
|
|
cede9ffc4c |
fix: make span gaps accept day and week as units (#12065)
Some checks failed
build-staging / prepare (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
* fix: make span gaps accept day and week as units * fix: only check for fill less than based on fill only below flag |
||
|
|
4fe311cb0e |
feat: add functional unique index (#11307)
Some checks failed
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat: add functional unique index * chore: add tag migration * chore: add failing scratch test (to discuss) * chore: fetch expressions as well in getindices call * fix: remove tag unique index (will be added in a separate PR) * fix: remove tag unique index (will be added in a separate PR) * chore: remove temporary tests * fix: go lint fix * chore: better comment for unique index * test: add test for case insensitive expression equality * test: add equality test for columns with quotes and capital letters * chore: add separate type for unique indices with expressions * test: add test for postgres provider |
||
|
|
66f4a63978 |
fix: don't return error in v2 list dashboard api if there is a v1 dashboard (#12020)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix: don't return error in v2 list dashboard api if there is a v1 dashboard * chore: generate api specs * feat(dashboard-v2): surface legacy dashboards in the v2 list (#12024) * feat(dashboard-v2): add legacy dashboard dialog Surfaces a copyable dashboard ID and a Contact Support action for a pre-v2 (legacy) dashboard that has no v2 spec to render. * feat(dashboard-v2): hide v2-only actions for legacy dashboards A legacy dashboard has no v2 spec, so view/open/copy-link/rename/ duplicate/lock don't apply. Gate them behind !isLegacy, leaving only Delete (and dropping its now-orphan leading divider). * feat(dashboard-v2): surface legacy dashboards in the v2 list Flag legacy rows with a badge, block navigation, and open the legacy dialog on click instead. Disable the pin action with an explanatory tooltip and gate the row's actions menu to legacy-safe items. --------- Co-authored-by: Ashwin Bhatkal <ashwin96@gmail.com> Co-authored-by: Srikanth Chekuri <srikanth.chekuri92@gmail.com> |
||
|
|
7d29a22e32 |
feat(infra-monitoring): use v2 APIs (#12036)
* feat(query-v2): add metricNamespace prop * feat(tanstack): add way to modify header padding * feat(infra-monitoring): add new components for v2 refactor * refactor(infra-monitoring): add docs prop for entity group header * refactor(infra-monitoring): remove old props of empty state * refactor(infra-monitoring): use column header to show on filter side panel * refactor(infra-monitoring): update header to use new v2 components * refactor(infra-monitoring): update utils and types * refactor(infra-monitoring): update k8s base list to accept v2 apis * refactor(infra-monitoring): update k8s base details to v2 apis * refactor(infra-monitoring): couple fixes and refactors on components * refactor(infra-monitoring): migrate hosts to v2 * refactor(infra-monitoring): migrate clusters to v2 * refactor(infra-monitoring): migrate daemon sets to v2 * refactor(infra-monitoring): migrate deployments to v2 * refactor(infra-monitoring): migrate jobs to v2 * refactor(infra-monitoring): migrate namespaces to v2 * refactor(infra-monitoring): migrate nodes to v2 * refactor(infra-monitoring): migrate pods to v2 * refactor(infra-monitoring): migrate statefulsets to v2 * refactor(infra-monitoring): migrate volumes to v2 * refactor(infra-monitoring): cleanup on entity details * refactor(infra-monitoring): refactor infra monitoring to use v2 * refactor(infra-monitoring): date time border with better contrast * chore(infra-monitoring): remove todo, placeholders are valid * fix(pr): address comments --------- Co-authored-by: Nikhil Mantri <nikhil.mantri1999@gmail.com> |
||
|
|
1e257a5b26 |
feat(infra-monitoring): daemonsets ready and misscheduled nodes count (#12008)
* chore: types and constants added * chore: update buildDaemonSetRecords * chore: updated orderBy: * chore: wired in checks API: * chore: generated api spec: * chore: update integration tests * fix: checks constants updated in integration tests |
||
|
|
7fd6852fa6 | refactor(authz): use new authz components for roles (#12011) | ||
|
|
b5567d1550 | refactor(authz): use new authz components for service accounts (#12007) | ||
|
|
2017660eb8 |
feat(quick-filters): add end-to-end tests and helper functions for qu… (#12063)
* feat(quick-filters): add end-to-end tests and helper functions for quick filters settings panel * chore: fix formatting issues * fix: add classname to skeleton and assert on the classname * fix: address review comments * chore: fix formatting issues |
||
|
|
ca5d888970 |
feat(trace-details): restore Open in Logs Explorer in span details Logs tab (#11941)
* feat(trace-details): add Open in Logs Explorer to span details Logs tab Restores the Open in Logs Explorer action (removed with V2 in #11805): a toolbar button above the log list and an inline action in the no-trace-logs empty state. Also tightens the empty-state RESOURCES card layout (stacked, content-width, no extra height). * feat: add logs explorer btn in footer * test(trace-details): cover Open in Logs Explorer footer button in span details * test(trace-details): assert log-row click opens Logs Explorer with trace/span query * style(trace-details): fix oxfmt formatting in SpanLogs test * fix(trace-details): pin Open in Logs Explorer footer to the panel bottom The footer lived inside the scrolling tab content, so it was pushed below the fold whenever the span summary above the tabs was in view. Render it as a sibling of the scrolling panelBody instead (Logs tab only), making it a true fixed footer that is always visible. |
||
|
|
76b4d249e2 |
chore: update package dependencies in package.json and pnpm-lock.yaml (#12066)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
ef892f3361 |
fix(ruletypes): tag rule threshold targets as format: double (#12061)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix(ruletypes): tag rule threshold targets as format: double
BasicRuleThreshold.{TargetValue,RecoveryTarget} and RuleCondition.Target are
*float64 but emitted a bare 'type: number' (swaggest sets format: double only for
non-pointer floats). Bare number makes oapi-codegen clients generate float32, so a
value like 0.8 loses precision on round-trip. Tag them format:double to match
non-pointer float64 fields (e.g. MetrictypesComparisonSpaceAggregationParam).
* chore(frontend): regenerate API client for rule threshold format: double
Reflects the format: double schema change on the rule threshold/condition
targets in the orval-generated client (oxfmt + oxlint applied).
|
||
|
|
9c4046d84a | fix: revert the resizeable quick filter changes (#12058) | ||
|
|
a91cee2b95 |
chore(sql): enable txlock immediate by default (#12048)
* chore(sql): enable txlock immediate by default * chore(sql): remove the redundant flag from integration tests |
||
|
|
51036d6cc4 |
feat(public-dashboard): integrate v2 (Perses-spec) public dashboards (#12032)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(public-dashboard): detect v1 vs v2 schema for the public viewer
Anonymous public viewers have no feature flags, so the schema can't be read from
use_dashboard_v2. Probe the v2 model endpoint first and fall back to v1 only on the
'dashboard_invalid_data' (HTTP 501) schema-mismatch signal. Probing v2 first also stops
the v1 endpoint from serving v2 dashboards with un-redacted queries.
* feat(public-dashboard): fetch v2 public panel data by key
Adds a by-key fetcher over the anonymous /api/v2/public/dashboards/{id}/panels/{key}/query_range
endpoint (the generated client omits the startTime/endTime params) and a store-free
usePublicPanelQuery that mirrors usePanelQuery's PanelQueryData shape. No variables and no
pagination — the public endpoint supports neither.
* feat(public-dashboard): render v2 public dashboards read-only
Adds a read-only v2 viewer that reuses the authenticated V2 panel renderers
(PanelHeader with hideActions, PanelBody, panel registry) and the pure layoutsToSections
util, with a forked read-only grid. The public page branches on the resolved schema:
v1 keeps the existing container, v2 renders the new viewer. Dashboard variables are not
rendered — the public endpoint does not substitute them.
* feat(public-dashboard): match the standard auto-refresh control
Replace the hand-rolled 'Off' select (which was styled inconsistently and clipped its
options) with a PublicAutoRefresh that mirrors the app's DateTimeSelectionV2 refresh cluster:
a grouped refresh button + auto-refresh popover (Auto Refresh checkbox + full interval list),
portal-rendered so nothing clips. It's prop-driven — the public viewer keeps managing its own
time window — so the container now tracks enabled + interval and exposes a manual refresh.
Also nudge the header-right gap 8→12px.
* feat(public-dashboard): declare v2 query_range params, drop the wrapper, address review
Declare startTime/endTime as query params on the v2 public query_range endpoint via
RequestQuery and regenerate the OpenAPI spec + orval client, so the generated
getPublicDashboardPanelQueryRangeV2 carries them. usePublicPanelQuery now calls the
generated fetcher directly and the hand-written wrapper is removed.
Also from review: drop the defensive panelDefinition guard so an unsupported kind
surfaces loudly, use lodash noop, and trim excessive comments across the v2 files.
* fix: bind query params from PublicWidgetQueryRangeParams
---------
Co-authored-by: Naman Verma <naman.verma@signoz.io>
|
||
|
|
f7bfd0eba6 |
fix(dashboard-v2): bug bash fixes III (#12041)
* fix(dashboard-v2): scroll the saved, cloned, or added panel/section into view
Saving a panel, closing the editor, cloning a panel, or adding a section
now reveals the affected panel/section instead of leaving the dashboard
scrolled to the top. Save resolves with the persisted panel id, a small
scroll-target store hands it to the grid, and a shared
scrollIntoViewWhenReady util polls for the optimistic DOM commit.
* fix(dashboard-v2): seed the metric unit per the kind's formatting controls
Replaces useMetricYAxisUnit with useSeedMetricUnit, driven by the kind's
Formatting controls (the same source buildPluginSpec reads): kinds with a
panel-wide unit seed formatting.unit; Table, which has none, seeds each
resolved value column's formatting.columnUnits instead. Column unit
selectors now also surface the metric-unit mismatch warning. Spec
read/write goes through a shared formattingSpec util.
* fix(dashboard-v2): stop grid placement from overlapping tall panels
findFreeSlot now probes the last-row candidate against every existing
item (mirroring the backend's overlap rejection) before placing there — a
tall panel from an earlier row can reach down into the last row — and
falls back to a fresh bottom row otherwise. Move-to-section reuses the
same primitive instead of always dropping to the bottom.
* fix(dashboard-v2): carry supported config across panel type switches
Switching visualization kind used to keep only formatting and thresholds,
dropping axes entirely and resetting legend/visualization/chartAppearance
to defaults. Each section seed now carries the old spec's fields the
target kind's controls declare: axes softMin/softMax/log scale, the time
preference, stacking/fillSpans, legend position, and chart appearance.
Unsupported fields (and legend customColors, keyed by series labels the
new kind may not reproduce) are still dropped.
* fix(dashboard-v2): keep context link editor alive on undecodable URL params
A literal % in a query value (e.g. ?search=95%) is not valid
percent-encoding, so decodeURIComponent threw URIError while seeding the
edit dialog and unmounted the page. Fall back to the raw string when a
key or value fails to decode.
* fix(dashboard-v2): don't auto-run the preview when a query is added
The query-type/datasource effect re-commits the draft on any structural
builder change, so adding a query immediately refetched the preview for
a still-empty query. Track the previous datasource list and skip the
commit when the change is a pure append — the new query commits on Run
Query as usual.
* fix(dashboard-v2): bootstrap variables and edit context on the editor route
A hard refresh (or direct URL) of the full-page editor mounts without
DashboardContainer or the variables bar, so the preview fetched with
unresolved variables and the store's edit context stayed cold. The
selection seeding moves out of useVariableSelection into a standalone
useSeedVariableSelection (URL → persisted store → default, with stale
URL entries pruned), which PanelEditorPage now mounts alongside
useResolvedVariables and the edit-context seed. The ?variables= param
is carried across dashboard ↔ editor navigation (withVariablesSearch)
so the selection survives the round trip (V1 parity).
* fix(dashboard-v2): carry thresholds and units onto table columns
Switching timeseries/number → table carried thresholds with an empty
columnName, which the save API rejects (TablePanelSpec.Thresholds[]
.ColumnName is required), and dropped the panel-wide unit entirely
(Table has no formatting.unit).
The renderer's keying rule is extracted as getAggregationColumnKey
(query name, or name.expression on multi-aggregation queries), and
getTableColumnKeys derives every enabled query's value-column keys
from the spec's queries alone, before any data exists — skipping
clickhouse_sql, whose columns key by the response's SQL alias.
Carried thresholds key onto the first derivable column and are
dropped when none exists instead of blocking the save; the panel-wide
unit fans out to every value column via formatting.columnUnits. The
carry is one-way: per-column units never seed a panel-wide unit back.
* chore: pr review changes
* chore: qb sticky header in view mode fix
* chore: pr review changes
* chore: pr review changes
- Unify panel/section reveal-scroll into one useScrollIntoView(id, ref, block)
hook backed by a single scrollTargetId store (was two hooks + two ids).
- buildPluginSpec seeds return their slice (empty {}/[] when nothing to carry)
instead of undefined; the omit-empty decision is centralized.
|
||
|
|
da250bfd3e | fix: commented out container metrics to surface k8s.pod.start_time (#12042) | ||
|
|
67007e2902 |
feat(infra-monitoring): Kubernetes Container Monitoring List API (#11946)
* chore: added types for containers * chore: added querier query and constants * chore: added helper queries * chore: added wiring * chore: added open api spec * chore: endpoint and variable rename * chore: use recency for container status.reason as well * chore: pass orgID to getMetadata for containers (adapt to rebased main) * chore: add metrics to the containers list for metadata and earliest time * chore: corrected metrics list for metadata lookup * chore: added changes to the checks API for new kube containers section * chore: containers query modified * chore: added integration tests * chore: integration tests * chore: goroutines in container monitoring * chore: constants deduplication * chore: inlined requests.Post call for this PR instead of wrapping in a function |
||
|
|
ff3ec133b4 |
fix(dashboard-v2): stop false 'updated elsewhere' prompts on your own edits (#12035)
Some checks failed
build-staging / staging (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix(dashboard-v2): close the 'updated elsewhere' dialog on reload Reload set dismissedAt to null and relied on the refetched loaded copy's updatedAt converging with the freshness query's serverUpdatedAt to hide the prompt. Those are two separate queries and the convergence is racy, so the dialog often stayed open across repeated reloads until Dismiss was clicked. Make Reload acknowledge the current version (like Dismiss) and then refetch, so it closes on click; a genuinely newer server version still re-prompts. * fix(dashboard-v2): only prompt when the server copy is strictly newer The stale-check compared the loaded and freshness copies of updatedAt with !==. Your own edits advance the loaded copy immediately (the optimistic patch writes the PATCH response's new updatedAt into the render cache), while the freshness query only re-fetches on window focus. So right after creating a panel, renaming, or editing a variable, loaded jumped ahead while freshness lagged, and !== flagged your own change as 'updated elsewhere' — a false prompt that persisted across in-app navigation until a real window-focus refetch. Compare with a strictly-newer (>) check so the prompt only fires when the server has a version we have not loaded. A genuine external change still trips it; our own edits (loaded ahead of the lagging freshness copy) no longer do. * fix(dashboard-v2): probe freshness on visibilitychange, not refetchOnWindowFocus The freshness check used a separate react-query query with initialData + refetchOnMount:false so the first load made no extra request. But a query that only holds seeded data and never fetched isn't reliably eligible for react-query's focus refetch, so on tab return no request fired and external changes went undetected. Drop the separate query and probe the server's updatedAt explicitly on 'visibilitychange' (guarded to the visible transition): zero requests on first load, exactly one per tab return, no dependence on react-query focus heuristics or staleTime bookkeeping. Comparison and reload/dismiss behaviour are unchanged (strictly-newer; reload = dismiss + refetch). * fix(dashboard-v2): probe on window focus too, and gate stale prompt on spec content Two fixes to the freshness probe: - Also listen to window 'focus', not just document 'visibilitychange'. Switching to another app (e.g. the editor) and back keeps the browser tab 'visible', so visibilitychange never fires and no probe ran — the reported 'no call when coming back to the page'. focus covers that; visibilitychange still covers tab switches. - Prompt only when the server's spec actually differs (deep-equal), gated by strictly-newer. updatedAt is bumped by metadata-only writes like lock/unlock that don't change what the viewer sees; keying on spec makes those a non-event without needing the (void) lock/unlock call to return the new updatedAt. Hook now takes the loaded dashboard so it has both updatedAt and spec to compare. * docs(dashboard-v2): clarify stale-check probes on both tab switch and app focus * docs(dashboard-v2): trim useDashboardStaleCheck comments * fix(dashboard-v2): detect external tag and lock changes too Widen the stale-check content comparison from spec-only to spec + tags + lock state, so an external tag edit or lock/unlock by another user surfaces the reload prompt. Own actions still don't trip it: the render cache advances with them (optimistic patch / cache sync), so loaded matches server. |
||
|
|
0ea5399c15 |
feat(dashboard-v2): bug bash fixes II (list, dashboard page, create modal) (#12040)
* fix(dashboard-v2): source Home recent dashboards from the v2 list under the flag * fix(dashboard-v2): keep same-key:value tags from collapsing to one word in the list * fix(dashboard-v2): commit the inline dashboard-title edit on outside click * fix(dashboard-v2): cap variable multi-select pills so the bar doesn't overflow * fix(dashboard-v2): persist the variables-bar expand state and show "Less" when it loads expanded * feat(dashboard-v2): reusable dashboard image picker for details + create modal Extract the icon/image picker into a shared DashboardImagePicker used by both the dashboard settings form and the create-dashboard modal. Patch `/image` with add (not replace) when the field is absent, and lift the inline dropdown above the create-modal form fields. * feat(dashboard-v2): simplify the create-modal templates tab to browse-and-request Drop the placeholder gallery (search + category list + preview) for a clean, centered browse-and-request block: link out to the published template library, and let cloud users request a template we haven't built yet. * fix(dashboard-v2): contain Escape/Enter and pass Cmd+Enter through the tag editor Escape/Enter no longer bubble to close the host drawer/modal; Cmd/Ctrl+Enter passes through so a host form can submit on it (plain Enter still adds/commits a tag). * feat(dashboard-v2): add/edit a dashboard's tags from the list Add an "Add Tags"/"Edit Tags" kebab action (labelled by whether the dashboard has tags) opening the shared key:value editor, saving via an `add /tags` patch, with Cmd/Ctrl+Enter save. Gated on edit permission, disabled while locked. Also guard row navigation so clicks inside portaled overlays (menu/modals) don't open the dashboard. |
||
|
|
f7aa3cee9c |
fix(dashboard-v2): view-modal, pie chart, and panel fixes (#12033)
* fix(dashboard-v2): tint chart-legend checkbox with its series color The @signozhq/ui Checkbox declares --checkbox-checked-background on the element itself via its data-color rule, so a value set on an ancestor was shadowed and the per-series tint never applied. Feed the color through a private --series-color var and override the vars on the element with a selector that out-specifies the library rule. * fix(dashboard-v2): make antd popups usable inside the view panel modal The editor's antd Selects/pickers portal to document.body, outside the modal Radix dialog, where Radix disables pointer events and traps focus, so their menus opened but couldn't be clicked. Wrap the modal body in an antd ConfigProvider whose getPopupContainer points at the dialog content, so all antd popups render inside the interactive, focus-trapped layer. * feat(dashboard-v2): add the list columns editor and pagination loader to the view modal Surface the List panel's columns editor in the View modal (as in the full editor) by exposing setSpec from useViewPanelMode and wiring it into the query-builder footer. Its add-column combobox portals to body, so inside the modal it opened behind the dialog — lift its z-index above the query-builder popups so it stacks on top. Also thread isPreviousData into PreviewPane so the List panel's page-change loader shows during pagination, matching the full editor and dashboard. * fix(dashboard-v2): measure chart dimensions before first paint useResizeObserver seeded its size to 0 and only reported real dimensions after paint via its debounced observer, so charts rendered once at 0 then jumped — most visibly the pie legend, which rendered left-aligned then re-centered once it learned it fit on one row. Add a useLayoutEffect that measures the element synchronously before paint. In jsdom clientWidth is 0, so tests are unaffected. * feat(dashboard-v2): support per-slice color overrides for pie charts Enable the legend colors control for pie charts. The control is fed by useLegendSeries, which only handled time-series data, so pie returned no series. Resolve pie legend series from the same scalar slices the renderer draws (without overrides, for default colors) so the color keys match what the chart looks up. Extract the series resolution into utils/legendSeries.ts (a shared dedupe primitive plus a pie and a time-series resolver) and reduce the hook to a kind switch that returns none for kinds without a colors control. * feat(dashboard-v2): offer dashboard root and every section in the move menu Rework the "Move to section" submenu to list the dashboard root plus every titled section (minus the panel's own), instead of only titled sections with a separate "move out of section" entry. Hide it entirely when there is nowhere to move. * fix(dashboard-v2): hide the empty panel header in editor preview When a panel has no title, description, or status and the actions menu is suppressed (editor preview), render nothing instead of an empty header bar. Add a min-height so the header keeps a stable size when it does render. * fix(dashboard-v2): lazy-load panels per-panel instead of per-section Move the viewport intersection observer down from Section to a new SectionGridItem wrapper so each panel gates its own fetch. A board with many panels now only queries the ones actually on screen, instead of loading every panel in any section that scrolls into view. * fix(dashboard-v2): hide "Extend time range" for panels with a fixed time preference A panel locked to a non-global timePreference queries a fixed relative span anchored to the dashboard end, so widening the ambient window can't surface data for it — the "Extend time range" CTA was a no-op. NoData now takes the panel and, via panelHasFixedTimePreference, drops the global extender for such panels (only Retry remains). The View modal's local extender still wins. * refactor(dashboard-v2): read panel time preference via shared helper Panel.tsx read visualization.timePreference through an inline cast; replace it with getPanelTimePreference so the header pill and NoData's extend gate share one reader. * feat(dashboard-v2): support per-series legend colors for bar and histogram panels Route BarChartPanel and HistogramPanel through the time-series legend path in useLegendSeries and enable the Legend `colors` control in both kinds' sections, extending the per-series color overrides to these kinds. * feat(dashboard-v2): pin the query-type tabs to the top of the editor scroll area Make the query-type tab nav + Run Query button sticky so they stay visible while the query body scrolls underneath; move the top padding onto the nav so it keeps its spacing at rest and when pinned. |
||
|
|
cd8bf27da7 |
chore: refactor qb to lossen tight coupling of querybuilder with other modules (#11911)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
dde4a3abc7 |
feat(infra-monitoring): add v2 initial files (#12034)
* feat(infra-monitoring-v2): duplicate current infra monitoring code * feat(infra-monitoring-v2): enable v2 via feature flag |
||
|
|
1d441b63cf | chore: added infraMonitoringV2 feature flag (#12031) | ||
|
|
f26c8adb3b |
feat(trace-details): Span Details overhaul — width-driven layout, percentile & shared metadata (#11914)
* feat(trace-details): full-width span percentile panel with visible borders * refactor(trace-details): give TraceIdField its own CSS module * fix(trace-details): single borders for docked span details * feat(trace-details): rework span details panel Extract the summary into a SpanSummary component, place it by panel width (above the tabs when narrow, inside Overview when wide), single-scroll sticky tabs, and fix service/status-message badge overflow + truncation. * feat(trace-details): share metadata row across header and span summary * test: update test cases |
||
|
|
f5a395f229 |
fix(infra-monitoring-details): remove process/containers tab on hosts & better color for http status on traces (#12019)
* refactor(infra-monitoring): remove tabs for containers/processes from hosts * fix(traces): parse http code to int instead of just render sakura color * test(entity-details): add tests for entity traces * fix(pr): address comments |
||
|
|
b1dcbe87fe |
feat(llm-attribute-mapping): foundation — route, permission, page shell [1/5] (#11778)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(llm-pricing): add model pricing foundation (route, permission, page shell) * feat(llm-pricing): add listing page and table * chore(llm-pricing): drop search + source filters from list request The list API does not honour the q (search) and source params yet, so the controls did nothing. Remove the search input and source dropdown along with the params we sent, and trim useModelPricingFilters to the URL-backed page state that pagination still needs. Currency dropdown, tabs, table and pagination are unchanged. Filters will return once the backend supports them. * refactor(llm-pricing): extract getRelativeTime helper in utils Pull the relative-time formatting out of getRelativeLastSeen into a small local getRelativeTime helper. Kept feature-local (not in the shared utils/timeUtils) so the LLM pricing module owns its own dayjs config; the local relativeTime extend stays for test self-sufficiency. * refactor(llm-pricing): drop dead NaN guard in formatPricePerMillion Pricing fields are typed as required numbers and JSON can't carry NaN, so Number.isNaN was unreachable. Keep the null/undefined guard as API defensiveness (toFixed on a missing value would crash the row). Also trims the now-redundant dayjs.extend comment. * refactor(llm-pricing): centralize constants and shared types Extract PAGE_SIZE, PAGE_KEY, COLUMN_COUNT and CURRENCY_OPTIONS into a new constants.ts, and move the ModelPricingFilters contract into types.ts. Component prop interfaces stay colocated with their components, matching the convention in the drawer PR. * refactor(llm-pricing): use nuqs for list pagination URL state Replace the hand-rolled useHistory + URLSearchParams plumbing in useModelPricingFilters with nuqs useQueryState, matching the convention used by the dashboards, alerts and k8s list pages. Behaviour is unchanged: parseAsInteger.withDefault(1) keeps ?page=1 out of the URL and history:'replace' avoids polluting the back-stack. * refactor(llm-pricing): inline pagination, drop useModelPricingFilters The hook had shrunk to a one-line nuqs wrapper after search/source were removed, so inline the useQueryState call into the container and remove the hook file plus the now-unused ModelPricingFilters type. When the filters return (once the API honours them) they can move back into a dedicated hook. * feat(llm-pricing): disable currency selector (USD-only for now) Only USD is priced today, so render the currency SelectSimple in a disabled state pinned to USD. A disabled select can't fire onChange, so the currency useState is dead — drop it (and the now-unused useState import). * refactor(llm-pricing): render model costs inside its tab + tab URL param The listing was rendered outside the Tabs, so the tab was decorative. Move all model-cost content (currency control, list query, table, pagination, footer) into a ModelCostsTab component rendered as the 'Model costs' tab's children, and drive the active tab from a 'tab' URL query param (nuqs). The container is now just the page shell. Unpriced models stays a disabled placeholder for a later PR. * style(llm-pricing): target @signozhq table slots, drop dead antd/leftover rules The component uses @signozhq/ui Table/Tabs (Radix-based), not antd, so the .ant-table-* and .ant-tabs-nav selectors never matched — the intended uppercase/muted header styling wasn't applied. Retarget header/cell rules to [data-slot='table-head'|'table-cell'] (no !important needed). Also remove dead rules left over from the removed search/source/add UI (.filters-bar__search, __source, __add, .page-header__actions) and the unused .source-badge--auto/ --override modifiers. * fix(llm-pricing): constrain currency dropdown width, drop tab URL param - Currency SelectSimple stretched to fill the filters bar; give it a fixed 160px width (min-width couldn't cap the trigger). - Model costs is the only enabled tab for now, so use Tabs defaultValue instead of a URL-backed param. Removes the nuqs tab state plus the now-unused TAB_KEYS/TAB_QUERY_KEY constants and TabKey type. * chore: self review changes * fix: add skeleton loading * refactor: self review changes * refactor: initial prop * fix: update styling * fix: add comments in utils * feat(llm-pricing): add model cost drawer and wire into listing page * fix(llm-pricing): restrict pricing management to admins Align the frontend write gate with the backend, which protects the LLM pricing create/update/delete endpoints with AdminAccess (admin only). Previously manage_llm_pricing allowed EDITOR/AUTHOR, so those roles saw the Add/Save affordances but their writes were rejected with a 403. Also removes the AUTHOR entry, which could never reach the page (the route gate excludes it). * fix(llm-pricing): read-only drawer shows View title, hides source picker Non-managers open the drawer in view mode (write APIs are Admin-only), so: - the heading reads "View model cost" instead of "Edit model cost" - the Source (auto vs. override) picker is hidden, since switching source is a manager-only action with nothing actionable for a viewer. * refactor: form in edit / add modal * chore: update color tokens * fix: add error handling * chore: update more self review changes * chore: self review changes * chore: self review changes * fix: minor grammer thing * fix: route thing * refactor: migrate to css moduel * refactor: migrate to css module * refactor: migrate to css module * refactor: migrate to tanstack table * docs: clarify price precision comment * chore: remove comment * feat(llm-attribute-mapping): add attribute mapping foundation (route, permission, page shell) * fix: css styling * refactor: css module * chore: remove comment * fix: disable isDirty in case of llm pricing * refactor: number * feat: add search , dropdown and flag * feat: feature flag on entire route and add mode costs tabs * fix: add isFetchingFeatureFlags * chore: update flag * refactor: shell * fix: add key to route * feat: add flags * chore: additional refactor * chore: add commet in utis * chore: self review changes * refactor: types and other things * refactor: types and other things * chore: add disable on source id * empty commit * chore: empty commit * fix: add demo side nav on sidenav * chore: remove demo side nav * refactor: update routes * chore: remove usd selector for now * fix: layout shift * refactor: styles * refactor: typography component * refactor: more changes * refactor: typograhy * refactor(llm-pricing): break model-cost drawer into per-component files + tokens Apply the CSS-module/component conventions to the drawer that came from drawer-3: - Move the drawer under ModelCostTabPanel/components/ModelCostDrawer/ to mirror the ModelCostsTable structure - Split the single 395-LOC ModelCostDrawer.module.scss into per-component co-located modules; cross-component selectors live in shared.module.scss and are pulled in via CSS-modules `composes` - shared.module.scss is a composes target (parsed as plain CSS), so it is kept flat with block comments — no SCSS nesting or // comments - Use --text-vanilla-* (not --bg-vanilla-*) for text colors, matching the listing code * refactor: more changes * refactor: styling and components * refactor: styling and components * chore: add a tooltip on hover * feat: add delete confirm modal * fix: update title * refactor: css variables * refactor: use signoz button and minor css update * chore: sync table * chore: remove extra comment * chore: use typograpgy test in table config * fix: minior issues * fix: llm pricing listing * refactor: remove extra classes * refactor: side nav changes * fix: update missing styles * chore: update edit and delete options * chore: remove extra comment * chore: revert env changes * chore: add enable check * chore: remove divider * refactor: use delete confirm dialog * chore: remove scss file * feat: move ui to easily accessable tabs * feat: update test cases * chore: update text * chore: self review changes * chore: self review refactor * chore: self review changes * chore: remove worktree * chore: revert env.ts * chore: add attribute mapping foundation * refactor: basic components * chore: update env.ts * chore: update tests * chore: self review changes * chore: update test cases * chore: remove extra comments * refactor(llm-pricing): share toast copy via constants * chore: use constants * chore: redclared constants --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
a36081b00c |
fix(query-builder): ensure contrast/border/colors are consistent (#11992)
* refactor(query-builder-v2): ensure query builder has consistent colors and allow customization * fix(query-builder-v2-usages): ensure each place using query builder v2 has consistent colors * fix(alert): revert l3 for v2 ui |
||
|
|
48d2460c8e |
feat(trace-details): waterfall timeline crosshair and VQA styling fixes (#11926)
* fix(trace): remove double border at flamegraph/waterfall juncture * fix(trace): square accordion header corners * fix(trace-waterfall): scope span hover-card to the span-name column * feat(trace): move missing-spans banner to header using Callout * feat(trace): use Lucide chevrons for accordion expand icons * fix(trace-waterfall): keep hovered rows at full opacity when dimmed * fix(trace-waterfall): strengthen selected/hover highlight into one continuous band * fix(trace-waterfall): soften row-action button gradient * fix(trace-waterfall): extend span-name divider to the top of the container * fix(trace): use neutral info icon for flamegraph sampling notice * fix(trace): tighten timeline ruler ticks and labels * feat(trace-waterfall): enable timeline crosshair aligned to padded ruler * fix(trace): match crosshair badge unit to ruler ticks |
||
|
|
14d9bbfce9 |
chore: refactor querier integration tests (#12006)
* test(querier): move querier tests into per-signal suites
Pure git renames into querier{logs,traces,metrics,scalar,common} + CI matrix;
monoliths are split in the next commit. Preserves history (git log --follow).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rt2Xi6TdBDBAc3mhYZAb9q
* test(querier): split querier monoliths into theme files
Split 01_logs/04_traces/03_metrics/06_order_by_table into theme files
(functions moved verbatim, 249 tests unchanged); scalar helper -> fixtures.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rt2Xi6TdBDBAc3mhYZAb9q
* test(querier): add coverage for filter/function/aggregation gaps
hasToken + has/hasToken misuse errors, ILIKE/NOT LIKE/NOT CONTAINS,
key:number, key-not-found (logs+traces), min/max, HAVING, metric reduceTo.
hasAny/hasAll over body arrays are marked xfail: they 500 in legacy body
mode (ClickHouse type error) and work only with use_json_body on.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rt2Xi6TdBDBAc3mhYZAb9q
* test(querier_json_body): add hasAny/hasAll positive coverage
Body-JSON array functions hasAny/hasAll (string + numeric arrays) succeed in
JSON-body mode (body_v2 -> ClickHouse Array via dynamicElement), complementing
the legacy-mode xfail in querierlogs/09. Verified on ClickHouse 25.12.5.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rt2Xi6TdBDBAc3mhYZAb9q
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
9c48d17fed |
fix(dashboards): render logs/traces list panels on public dashboards (#11937)
* fix(dashboards): render logs/traces list panels on public dashboards Public list panels rendered nothing even though the query returned data: ListPanelWrapper bails with an empty fragment when setRequestData is undefined, and the public Panel never forwarded one. Back requestData with state and forward the setter to WidgetGraphComponent, mirroring the authenticated GridCard. The per-panel request builder is extracted to utils.ts. Fixes SigNoz/engineering-pod#3646 * fix(dashboards): hide pagination controls on public list panels Public widget data is fetched by index and the payload redacts each widget's limit, so LogsPanelComponent/TracesTableComponent always showed a pager that can't page (the endpoint takes no pagination params). Thread an optional hidePagination flag from the public Panel through WidgetGraphComponent -> PanelWrapper -> ListPanelWrapper to both list components; default off, so authenticated dashboards are unchanged. * fix(dashboards): guard against missing orderBy in useLogsData Public dashboards redact the widget query (orderBy/filter/limit are stripped), so a LIST query can reach useLogsData with no orderBy. The optional chain guarded listQuery but not orderBy, so listQuery?.orderBy.find threw once the public logs panel started rendering. Guard orderBy with ?.. |
||
|
|
33c6cbecda |
feat(dashboard-v2): variables table redesign + apply dynamic variables to panels (#12009)
* feat(dashboard-v2): patch builders to apply/sync a dynamic variable's filter across panels * feat(dashboard-v2): two-column variables table with dynamic apply-to-panels * fix(dashboard-v2): normalize dynamic variable signal so the source field always shows * fix(dashboard-v2): keep field-key options during search refetch (smooth typing) * fix(dashboard-v2): center and show the default-value clear icon * fix(dashboard-v2): keep the add-variable + on one line when the bar is collapsed * fix(dashboard-v2): variable selection flow correctness (#12013) * fix(dashboard-v2): correct "ALL" variable selection end-to-end - Materialize a query/custom ALL selection to the full option array so it reaches the query payload (was stored as value:null → dropped); tracks option growth. - Default a multi-select allow-ALL variable (and the __ALL__ sentinel) to ALL, matching V1. - ValueSelector hands CustomMultiSelect the expanded option set when all-selected, so it no longer renders a literal __ALL__ row. - Keep a still-valid multi-select subset when options re-scope (was collapsing to the first option). - Fix the dead configuredDefault fallback (read defaultValue as string|string[]). * fix(dashboard-v2): variable selector robustness - Surface option-fetch errors with a retry in the variable bar (Query/Dynamic) — a first-fetch failure is no longer a silent, stuck-empty selector. - Custom variables now auto-select their default/first option (via a CustomSelector that runs useAutoSelect) instead of rendering blank. * fix(dashboard-v2): variable fetch-engine correctness - Ignore a stale/late fetch settle for a variable no longer actively fetching (restores V1's active-state guard). - Unblock a waiting query child only once ALL its parents are settled (diamond dependencies no longer fetch against a stale parent). - A value change no longer refetches the changed variable's own options, and only a dynamic change refreshes the other dynamics (query/custom/text changes don't touch dynamics — they don't depend on those values). - Enqueue cycle-dropped query variables as best-effort roots instead of leaving them (and any waiting dynamics) silently stuck. * fix(dashboard-v2): variable selection edge cases - Read the __ALL__ URL sentinel as "ALL" only for variables that support it, so a literal "__ALL__" value (e.g. a text variable) isn't misread. - Prune URL selections for variables that no longer exist (rename/remove), so a shared link can't leak a stale value into a later variable. - Bound option-query cache churn with a cacheTime on the query/dynamic fetches. |
||
|
|
9429c9e632 |
feat(dashboard-v2): show empty sections & clone a section with its panels (#12023)
* fix(dashboard-v2): render a newly-created empty titled section instead of the dashboard empty state * feat(dashboard-v2): clone a section with all its panels |
||
|
|
7821961a6f | feat(dashboard-v2): detect external dashboard changes on tab focus and prompt to reload (#12022) | ||
|
|
08de39cdbd |
fix(dashboard-v2): panel drilldown fixes + New Panel modal one-click create (#12026)
* fix(dashboard-v2): disable panel drilldown for non-builder queries
Drilldown was armed whenever the panel had at least one builder query,
even for PromQL / ClickHouse panels (a mixed CompositeQuery, or the
QUERY_BUILDER fallback of deriveQueryType). Those modes carry no builder
context to refine, so the click produced an empty/invalid drilldown.
Gate enableDrillDown on getPanelQueryType(panel) === QUERY_BUILDER in
addition to the existing capability + builder-query-count checks.
* fix(dashboard-v2): hide "Click to drilldown" hint when drilldown is disarmed
TooltipFooter's canDrilldown defaults to true, and the time-series / bar
renderers never passed it — so the hint showed even in the panel editor
preview (where drilldown is off) and for non-builder query types. Passing
the prop as-is wasn't enough: enableDrillDown is undefined in edit mode, and
canDrilldown={undefined} falls back to the true default.
Pass canDrilldown={!!enableDrillDown} (coerced) and add enableDrillDown to
the useCallback deps (also fixes a stale-closure in the bar renderer). The
hint now shows only when a click will actually open the drilldown menu.
* fix(dashboard-v2): make pie panel drilldown fire
preparePieData built slices with only label/value/color, never the
queryName and labels that enrichPieClick needs. Every slice therefore had
queryName === undefined, so enrichPieClick hit isValidQueryName('') and
returned null — the slice click was a silent no-op and pie drilldown never
worked.
Carry the value column's queryName and the row's group-by key→value labels
(keyed by field name) onto each slice, mirroring how enrichTableClick reads
them off the shared PanelTable shape. Adds regression tests for both.
* fix(dashboard-v2): one-click panel create when the dashboard has one section
The New Panel modal always used a select-then-confirm flow with a footer
section picker. When the dashboard has a single section there is nothing to
pick, so the footer degraded to a lone confirm button and the extra click
was pointless.
Hide the footer entirely for the single-section case and create the panel
directly on tile click; keep select-then-confirm when multiple sections
exist. The section-picker guard moves up to the modal so the footer renders
only when a picker is actually needed.
|
||
|
|
98178795ec |
chore(deps): bump golang.org/x/crypto from 0.49.0 to 0.52.0 (#12012)
Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.49.0 to 0.52.0. - [Commits](https://github.com/golang/crypto/compare/v0.49.0...v0.52.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-version: 0.52.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
0797b26cb2 |
feat(dashboard-v2): variable editor form, add-variable UX & styling (#11942)
* fix(dashboard-v2): cap the variable preview-values box height The 'Preview of Values' box only had a min-height, so a field with many values grew the box tall. Add a max-height so it scrolls instead. * feat(dashboard-v2): restore the V1 combined field/source row for dynamic variables Replace the separate Source and Attribute rows with the single V1-style row: the telemetry field on the left, then "from" and the source select on the right. * feat(dashboard-v2): add-variable button in the variables bar Add a dashed outlined 'Add variable' button on the left of the variables bar (shown for editors even with no variables). It deep-links into the settings drawer at the Variables tab with the add-variable form open, via a transient settingsRequest store slice; the drawer destroys on close so it re-initializes cleanly each open. * feat(dashboard-v2): collapse the add-variable button once variables exist Full labelled button when there are no variables; once some exist it shrinks to a + icon (label on hover) placed after the collapsed +N. Dashed l3 border. * style(dashboard-v2): use the l3 border on toolbar buttons and the empty state Give Actions/Configure/Edit-as-JSON and the dashboard empty-state dashed border the more visible --l3-border. * fix(dashboard-v2): keep add-variable button out of collapsed bar + flat toolbar borders - Move the add-variable + icon inside the strip and only show it when the bar isn't collapsed (no overflow) or is expanded, so it never breaks the layout mid-wrap; expand to reveal it. - Make the Actions/Configure/Edit-as-JSON border a flat l3 outline with no box-shadow/depth. * feat(dashboard-v2): raise dynamic-variable attribute search debounce to 500ms * feat(dashboard-v2): add a Configure step to the dashboard empty state * fix(dashboard-v2): flow the variables bar under the time selector + reposition add button Revert the bar wrapper to block so the strip wraps around the floated time selector (one line beside it collapsed; full-width below it when expanded) — a flex wrapper had made it a BFC that trapped the rows on the left. The add-variable "+" now sits after the +N/Less trigger, kept inline and always mounted so the overflow measurement no longer toggles it (which caused a layout shift), with the collapse math reserving space for it. * feat(dashboard-v2): hide dashboard chrome in full screen Show only the sections and panels in full screen — the header and toolbar (actions, variables bar, time selector) are hidden for a clean presentation view; exit with Esc. Also drops a stray blank line that failed the format check. * refactor(dashboard-v2): extract add-variable buttons into components |
||
|
|
f8846026fb |
fix(authz-devtools): drop global listener for modal keyboard (#12018)
Co-authored-by: Yunus M <myounis.ar@live.com> |
||
|
|
5ec6560613 |
chore(deps): bump starlette from 1.0.0 to 1.3.1 in /tests (#11737)
Bumps [starlette](https://github.com/Kludex/starlette) from 1.0.0 to 1.3.1. - [Release notes](https://github.com/Kludex/starlette/releases) - [Changelog](https://github.com/Kludex/starlette/blob/main/docs/release-notes.md) - [Commits](https://github.com/Kludex/starlette/compare/1.0.0...1.3.1) --- updated-dependencies: - dependency-name: starlette dependency-version: 1.3.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
46e092b2c9 |
chore(deps): bump cryptography from 46.0.7 to 48.0.1 in /tests (#11736)
Some checks failed
build-staging / js-build (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
Bumps [cryptography](https://github.com/pyca/cryptography) from 46.0.7 to 48.0.1. - [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pyca/cryptography/compare/46.0.7...48.0.1) --- updated-dependencies: - dependency-name: cryptography dependency-version: 48.0.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
fe660e27a2 | feat(dashboard-v2): gate list-page edit actions on edit permission (#12021) | ||
|
|
465620fbbb |
feat(dashboard-v2): enforce read-only behavior when a dashboard is locked (#12017)
* feat(dashboard-v2): lock-aware edit context, mutation guard, tooltip primitives & locked indicator, skip chart refetch on lock toggle * feat(dashboard-v2): hide toolbar edit actions (incl. clone) in view mode, disable with a hover reason when locked * feat(dashboard-v2): hide panel & section edit actions in view mode, disable when locked * feat(dashboard-v2): open the JSON editor read-only when not editable * feat(dashboard-v2): disable panel editor save when not editable |
||
|
|
db2e29dde9 |
feat(trace-details): Pretty View interaction polish (hover, search, actions, z-index) (#11940)
* feat(trace-details): restyle Pretty View attributes search bar * feat(trace-details): full-width row hover in Pretty View * feat(trace-details): keep Pretty View row active and brighten value on hover/menu-open * feat(trace-details): move parent-row ellipsis to the right edge * fix(cmdk): raise command palette above the floating span-details panel * feat: use toggle group for data viewer instead of dropdown * fix(trace-details): disable Monaco sticky scroll in JSON view to stop overlap |
||
|
|
cec72e25fd |
feat(dashboard-v2): link variables to panels (#12003)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(dashboard-v2): scope panel refetch to referenced variables A panel now refetches only when a variable its queries reference changes (the cache key is scoped to referenced variables; the full payload is still substituted), and stays in its loading state on first load until those variables resolve. * feat(dashboard-v2): surface dashboard variables in query builder suggestions Publish the dashboard's variables into the shared store the query builder autocomplete reads, so $variable suggestions appear in the dashboards-page builder and the panel editor. |
||
|
|
82c833044d |
feat(dashboard-v2): extend time window from empty panel state (#11999)
* feat(dashboard-v2): add extend-time-window logic for empty panels Add the empty-state "extend the time window" building block: useExtendTimeWindow widens the dashboard's global time via the shared zoom-out ladder (getNextZoomOutRange / useZoomOut), and extendWindow.ts exposes the ExtendTimeWindow type plus a thin buildExtendWindow adapter over the ladder result. * feat(dashboard-v2): add view-session store slice for the modal extender The View modal owns a local time window; add a transient dashboard-store slice so it can publish its extend-window behaviour for the deeply-nested NoData empty state to read, instead of threading it through every renderer. * feat(dashboard-v2): offer an extend-window action in the panel no-data state A panel with no data in the selected window showed only a Retry, which can't help when the query succeeded and there's just nothing in range. Add an "Extend time range" action that widens the window (global time on the grid/editor; the View modal's local window in place, read from the store), shown alongside the retained Retry. Also fix the stale empty state: keepPreviousData retained the empty response so NoData lingered through a refetch then snapped to the chart — a refetch over empty data now shows the shared PanelLoader instead. PanelMessage gains a secondaryAction so the empty state can render both buttons; refetch stays on the renderer contract to drive Retry (standalone call sites like the editor preview may still omit it, showing Extend only). * chore: pr review fixes * chore: pr review changes * chore: pr review changes |
||
|
|
f98b8bb1fd |
feat(dashboard-v2): runtime variable fetch engine & selectors (#12002)
* feat(dashboard-v2): add runtime variable fetch-state engine
Port V1's variable fetch orchestration natively onto the dashboard store: a fetch-state slice (idle/loading/revalidating/waiting/error + per-variable cycle ids) plus the dependency context derivation (query/dynamic order) needed to schedule fetches. Query variables load in dependency order; dynamics wait for query values. enqueueFetchAll drives first load/time change, enqueueDescendants drives a single value change.
* feat(dashboard-v2): drive variable selectors off the fetch engine
Gate the Query/Dynamic option fetches on the engine's per-variable state and key them by cycle id (so a parent change refetches only its dependents, in order, with no duplicate calls), and report completion/failure back. Wire the selection lifecycle: full fetch cycle on load/time change, descendant cascade on value change.
* fix(dashboard-v2): read a variable's default value as string, not { value }
defaultValue is a string | string[] on the wire, but the editor and runtime read
it as { value }, so a saved default showed blank in the form (and couldn't be
cleared) and never auto-applied. Read it directly in all three sites.
* feat(dashboard-v2): show hidden variable values on the collapsed +N hover
When the variables bar collapses the overflow behind +N, hovering it now lists
the hidden variables and their current selected values.
* feat(dashboard-v2): batch initial variable auto-selections into one fetch
Auto-selection now flows through a dedicated onAutoSelect path, separate from
user changes. The initial load burst of fills (each selector picks a value as
its options resolve, at different times) is coalesced across one animation frame
into a single store write plus one enqueueDescendantsBatch, so dependent
variables re-fetch once with the settled parent values instead of once per fill.
* refactor(dashboard-v2): use enum for VariableFetchState
|
||
|
|
2114fbddfe |
feat(dashboard-v2): enforce name-length limits on dashboard inputs (#12015)
* feat(dashboard-v2): cap dashboard, section, panel and variable name inputs at 128 chars * feat(dashboard-v2): cap saved-view names at 64 chars |
||
|
|
b2214cf5a3 | feat: implement resizable quick filters across multiple components with persistent width settings (#12014) | ||
|
|
db4219e0f1 |
feat(dashboards-v2): download panel as PNG/SVG/CSV (#11803)
* chore(dashboards-v2): add html-to-image for panel image export Dependency used to capture a panel's rendered DOM node as PNG/SVG. * feat(dashboards-v2): declare per-kind download capability Adds the DownloadFormat enum and a per-kind `actions.download` map. Tables allow CSV/PNG/SVG, charts PNG/SVG; CSV is table-only (V1 parity). * feat(dashboards-v2): capture a panel as a PNG/SVG image downloadElementAsImage captures the panel's rendered node via html-to-image (dropping the hover chrome); useDownloadPanelImage locates it by its data-panel-root marker and surfaces failures as a toast. toSafeFileName sanitizes the filename. * feat(dashboards-v2): export table panel data as CSV getTableCsvRows flattens the prepared scalar table (reusing the on-screen cell formatting) into rows, and downloadCsv serializes them via papaparse. * feat(dashboards-v2): add the Download action to the panel menu useDownloadPanelMenuItem composes the submenu, dispatching CSV to the query response (useDownloadPanelCsv) and PNG/SVG to the DOM capture; the response is threaded to the menu via props. buildDownloadMenuItem renders the format options; usePanelActionItems consumes the ready item. * chore: pr review fixes |
||
|
|
165c945511 |
feat(frontend): LLM pricing UI update and tests [5/6] (#11910)
* feat(llm-pricing): add model pricing foundation (route, permission, page shell) * feat(llm-pricing): add listing page and table * chore(llm-pricing): drop search + source filters from list request The list API does not honour the q (search) and source params yet, so the controls did nothing. Remove the search input and source dropdown along with the params we sent, and trim useModelPricingFilters to the URL-backed page state that pagination still needs. Currency dropdown, tabs, table and pagination are unchanged. Filters will return once the backend supports them. * refactor(llm-pricing): extract getRelativeTime helper in utils Pull the relative-time formatting out of getRelativeLastSeen into a small local getRelativeTime helper. Kept feature-local (not in the shared utils/timeUtils) so the LLM pricing module owns its own dayjs config; the local relativeTime extend stays for test self-sufficiency. * refactor(llm-pricing): drop dead NaN guard in formatPricePerMillion Pricing fields are typed as required numbers and JSON can't carry NaN, so Number.isNaN was unreachable. Keep the null/undefined guard as API defensiveness (toFixed on a missing value would crash the row). Also trims the now-redundant dayjs.extend comment. * refactor(llm-pricing): centralize constants and shared types Extract PAGE_SIZE, PAGE_KEY, COLUMN_COUNT and CURRENCY_OPTIONS into a new constants.ts, and move the ModelPricingFilters contract into types.ts. Component prop interfaces stay colocated with their components, matching the convention in the drawer PR. * refactor(llm-pricing): use nuqs for list pagination URL state Replace the hand-rolled useHistory + URLSearchParams plumbing in useModelPricingFilters with nuqs useQueryState, matching the convention used by the dashboards, alerts and k8s list pages. Behaviour is unchanged: parseAsInteger.withDefault(1) keeps ?page=1 out of the URL and history:'replace' avoids polluting the back-stack. * refactor(llm-pricing): inline pagination, drop useModelPricingFilters The hook had shrunk to a one-line nuqs wrapper after search/source were removed, so inline the useQueryState call into the container and remove the hook file plus the now-unused ModelPricingFilters type. When the filters return (once the API honours them) they can move back into a dedicated hook. * feat(llm-pricing): disable currency selector (USD-only for now) Only USD is priced today, so render the currency SelectSimple in a disabled state pinned to USD. A disabled select can't fire onChange, so the currency useState is dead — drop it (and the now-unused useState import). * refactor(llm-pricing): render model costs inside its tab + tab URL param The listing was rendered outside the Tabs, so the tab was decorative. Move all model-cost content (currency control, list query, table, pagination, footer) into a ModelCostsTab component rendered as the 'Model costs' tab's children, and drive the active tab from a 'tab' URL query param (nuqs). The container is now just the page shell. Unpriced models stays a disabled placeholder for a later PR. * style(llm-pricing): target @signozhq table slots, drop dead antd/leftover rules The component uses @signozhq/ui Table/Tabs (Radix-based), not antd, so the .ant-table-* and .ant-tabs-nav selectors never matched — the intended uppercase/muted header styling wasn't applied. Retarget header/cell rules to [data-slot='table-head'|'table-cell'] (no !important needed). Also remove dead rules left over from the removed search/source/add UI (.filters-bar__search, __source, __add, .page-header__actions) and the unused .source-badge--auto/ --override modifiers. * fix(llm-pricing): constrain currency dropdown width, drop tab URL param - Currency SelectSimple stretched to fill the filters bar; give it a fixed 160px width (min-width couldn't cap the trigger). - Model costs is the only enabled tab for now, so use Tabs defaultValue instead of a URL-backed param. Removes the nuqs tab state plus the now-unused TAB_KEYS/TAB_QUERY_KEY constants and TabKey type. * chore: self review changes * fix: add skeleton loading * refactor: self review changes * refactor: initial prop * fix: update styling * fix: add comments in utils * feat(llm-pricing): add model cost drawer and wire into listing page * fix(llm-pricing): restrict pricing management to admins Align the frontend write gate with the backend, which protects the LLM pricing create/update/delete endpoints with AdminAccess (admin only). Previously manage_llm_pricing allowed EDITOR/AUTHOR, so those roles saw the Add/Save affordances but their writes were rejected with a 403. Also removes the AUTHOR entry, which could never reach the page (the route gate excludes it). * fix(llm-pricing): read-only drawer shows View title, hides source picker Non-managers open the drawer in view mode (write APIs are Admin-only), so: - the heading reads "View model cost" instead of "Edit model cost" - the Source (auto vs. override) picker is hidden, since switching source is a manager-only action with nothing actionable for a viewer. * refactor: form in edit / add modal * chore: update color tokens * fix: add error handling * chore: update more self review changes * chore: self review changes * chore: self review changes * fix: minor grammer thing * fix: route thing * refactor: migrate to css moduel * refactor: migrate to css module * refactor: migrate to css module * refactor: migrate to tanstack table * docs: clarify price precision comment * chore: remove comment * chore: remove comment * fix: disable isDirty in case of llm pricing * refactor: number * feat: add search , dropdown and flag * feat: feature flag on entire route and add mode costs tabs * fix: add isFetchingFeatureFlags * chore: update flag * refactor: shell * fix: add key to route * feat: add flags * chore: additional refactor * chore: add commet in utis * chore: self review changes * refactor: types and other things * refactor: types and other things * chore: add disable on source id * empty commit * chore: empty commit * fix: add demo side nav on sidenav * chore: remove demo side nav * refactor: update routes * chore: remove usd selector for now * fix: layout shift * refactor: styles * refactor: typography component * refactor: more changes * refactor: typograhy * refactor(llm-pricing): break model-cost drawer into per-component files + tokens Apply the CSS-module/component conventions to the drawer that came from drawer-3: - Move the drawer under ModelCostTabPanel/components/ModelCostDrawer/ to mirror the ModelCostsTable structure - Split the single 395-LOC ModelCostDrawer.module.scss into per-component co-located modules; cross-component selectors live in shared.module.scss and are pulled in via CSS-modules `composes` - shared.module.scss is a composes target (parsed as plain CSS), so it is kept flat with block comments — no SCSS nesting or // comments - Use --text-vanilla-* (not --bg-vanilla-*) for text colors, matching the listing code * refactor: more changes * refactor: styling and components * refactor: styling and components * chore: add a tooltip on hover * feat: add delete confirm modal * fix: update title * refactor: css variables * refactor: use signoz button and minor css update * chore: sync table * chore: remove extra comment * chore: use typograpgy test in table config * fix: minior issues * fix: llm pricing listing * refactor: remove extra classes * refactor: side nav changes * fix: update missing styles * chore: update edit and delete options * chore: remove extra comment * chore: revert env changes * chore: add enable check * chore: remove divider * refactor: use delete confirm dialog * chore: remove scss file * feat: move ui to easily accessable tabs * feat: update test cases * chore: update text * chore: self review changes * chore: self review refactor * chore: self review changes * chore: remove worktree * chore: revert env.ts * chore: update tests * chore: self review changes * chore: update test cases * chore: remove extra comments * chore: use constants --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
ff19aedaa8 |
feat(trace-details): UI polish + reusable CopyButton (#11958)
* refactor(trace-details): use ArrowRightFromLine for filter collapse icon * refactor(trace-details): square header back button with l1 border, tabular-nums trace ID * refactor(trace-details): show events count as an l3 badge * feat(periscope): add reusable CopyButton with copy-to-check animation * refactor(trace-details): use CopyButton in DataViewer and filter query popover * fix(traces): address PR review on CopyButton and events badge - Remove unused onCopy prop from CopyButton; it was wired to fire unconditionally (even on failed clipboard writes), contradicting its documented "on successful copy" contract, and no caller used it. Will be re-added gated on success when actually needed. - Only render the Events tab count badge when eventsCount > 0 so spans with no events don't show a "0" badge. * style(traces): tokenize events badge margin per review Use var(--spacing-3) for the events badge margin-left instead of a raw 6px. Leave the 18px badge box and 5px padding off-grid (no matching token; nearest values would change the single-digit circle). |
||
|
|
ef8319585b |
feat(dashboard-v2): View-modal drill-down + editor "Switch to View Mode" (#12004)
* fix(dashboard-v2): only mark a new panel savable once it has a query A new panel was always treated as dirty, so Save was enabled even with no query to run. Track dirtiness off spec/query edits and require a seeded query (List auto-seeds one; other kinds open query-less) before a new panel is savable. * feat(dashboard-v2): drill down from the panel View modal Wire the shared drill-down orchestration into the View modal so filter-by-value and breakout refine the expanded view in place (URL-persisted, re-runs the preview) instead of opening a nested View modal. Adds an OpenDrilldownView handoff type, an optional openDrilldownView override on useDrilldown, and the PreviewPane onClick/enableDrillDown pass-through the modal uses. Cells and log rows get a pointer/hover affordance for the click. * fix(dashboard-v2): keep the dashboard spec cache patch-driven The spec cache is kept fresh by optimistic patches, so auto-refetching flashed the grid back to server state as observers mounted across the panel tree. Set staleTime: Infinity + refetchOnMount: false; explicit refetch() still works. * feat(dashboard-v2): add "Switch to View Mode" to the panel editor Add the V1 "Switch to View Mode" button to the panel editor header. It leaves the full-page editor for the dashboard with this panel expanded in the View modal, seeded with the live (un-saved) query via the same expandedWidgetId + graphType + compositeQuery URL contract the modal hydrates from. Shown for existing panels only — a new panel isn't saved to the dashboard spec yet. |
||
|
|
14ba332935 |
fix: ui fixes for panel selection modal (#11944)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix: ui fixes for panel selection modal * feat(dashboards-v2): choose target section when adding a panel Add a section picker to the New Panel modal so a panel can be placed in any section (or the untitled root), not just the one the "Add panel" action was triggered from. Sections are read from the cached dashboard query via useDashboardSections (no refetch, no prop-drilling). Picking a panel type now selects it (highlighted card) and reveals a footer holding the section dropdown and an "Add Panel" button split 50/50; confirming shows a brief loader before navigating to the editor. The chosen section's layoutIndex is threaded through useCreatePanel.createPanel. * fix(dashboards-v2): refine New Panel modal footer + section labels - Keep the footer visible at all times; the "Add Panel" confirm is disabled until a panel type is selected (instead of hiding the whole footer). - Footer layout: the section selector fills the available width and the confirm button takes its natural width (no more 50/50 split). - Add a "Select panel type" label above the panel-type grid, matching the existing "Add panel to" label. * chore: pr review fixes |
||
|
|
fda7b66d49 |
feat(authz): add devtools for authz (#11933)
* feat(authz): add devtools for authz * fix(authz): add missing allowed/deniedPermissions to test mocks * fix(pnpm-lock): keep updated * fix(pr): address comments * fix(pr): use our button component * fix(pr): split modal in smaller components |
||
|
|
de2212e8b9 | chore(querier): address impl gap in max_concurrent_queries (#11985) | ||
|
|
ff4f18985c |
Feat/quick filters resizable (#11998)
* feat: add resizable quick filters panel with persistent width settings * feat: add tooltip to checkbox value display for better user experience * feat: add grip handle to resizable box for improved user interaction |
||
|
|
7d555b643a |
feat(dashboard-v2): linkify URLs in dashboard description tooltip (#11996)
* feat(dashboard-v2): linkify URLs in dashboard description tooltip Parse http(s) and www. links in the dashboard description and render them as clickable anchors opening in a new tab. Add a reusable linkifyText util under src/utils. Preserve author line breaks and show the tooltip below the info icon. * feat(dashboard): linkify URLs in V1 dashboard description Apply the linkifyText util to the V1 dashboard description section so pasted URLs become clickable, matching the V2 behaviour. Preserve line breaks and wrap long URLs. |
||
|
|
7839e806fd |
fix(dashboard-v2): warn about orphaned panels & surface JSON save errors (#11989)
Some checks failed
build-staging / staging (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix(dashboard-v2): surface the real API error when a JSON save fails updateDashboardV2 throws the raw generated error; it was passed to the error modal cast as APIError, so a rejected save (e.g. a locked dashboard) rendered no message. Run it through toAPIError so the actual error is shown. * feat(dashboard-v2): warn when JSON edits desync panels and layouts Editing the dashboard JSON can leave a panel in spec.panels that no layout places (orphaned — renders nowhere), or a layout item referencing a panel that no longer exists. Detect both from the draft (findPanelLayoutIssues, typed off the spec DTO) and show a footer warning with a triangle icon; hovering lists the exact panel ids. The tooltip sits above the drawer. * fix(dashboard-v2): keep editor keystrokes from triggering global shortcuts Stop keydown propagation out of the JSON drawer so Shift-selection and typing in the editor don't fire app-level keyboard shortcuts. |
||
|
|
2dcd51391d |
feat(dashboard-v2): rename saved views, org-wide creator filter & visible Locked-view query (#11982)
* feat(dashboard-v2): rename saved views via a shared 128-char name popover Add a per-row rename action wired to renameView() (existing PUT endpoint), and extract the save/rename name input into a shared ViewNamePopover capped at 128 chars (replaces SaveViewPopover). Group the rename/delete row actions so they no longer overlap, patch the renamed view into the list cache inline instead of refetching, and make the active-view 'Reset' restore the view's opening filters. * feat(dashboard-v2): show locked = true in the query for the Locked view The Locked built-in view applied its filter as an invisible server-only clause; seed it into the search box instead so the constraint is visible and editable, and drop the now-unused viewQuery plumbing. * feat(dashboard-v2): source the created-by filter from the org user list The creator filter only listed authors present on the loaded page, so a user who hadn't authored a visible dashboard couldn't be selected. Source options from the v2 List-users API via useCreatorOptions (page authors kept as a fallback until it resolves), labelled with the user's display name. * feat(dashboard-v2): show the unsaved-changes dot on the results header Mirror the views rail's dirty indicator next to the active view name in the results header when the current filters diverge from the view. |
||
|
|
6251616d9d |
fix(dashboard-v2): add (not replace) description when it is empty (#11983)
A dashboard with no description has no /spec/display/description path, so a JSON-Patch replace failed and the description update silently no-op-d. Use add (create-or-replace) when the current description is empty. |
||
|
|
652a9044f4 |
feat(infra-monitoring): goroutines wrapping custom queries for concurrency (#11981)
* chore: added types and open api spec changes * chore: added method to calculate reason * chore: per group pod status counts with req metric checks method added * chore: wired up pod status counts * chore: pod restarts type added * chore: added restart counts for the group * chore: bug in query fix * chore: onboarding API changes * chore: integration tests added * chore: added podcountsbyphase in other entities * chore: added pod status counts for other entities * chore: added integration tests for other entities * chore: added checks api changes for other entities * chore: rearrangement * chore: removed succeeded status and mark it as completed * chore: query beautified * chore: corrected metrics list for metadata lookup * chore: removed dead constants * chore: goroutines for ListHosts * chore: goroutines for ListPods * chore: goroutines for ListNodes * chore: goroutines for ListNamespaces * chore: goroutines for ListClusters * chore: goroutines for ListDeployments * chore: goroutines for ListStatefulsets * chore: added goroutines for ListStatefulsets, ListJobs and ListDaemonsets |
||
|
|
d4646657ca | fix: initalize querier in llmpricing (#11993) | ||
|
|
29681572db |
feat(infra-monitoring): pod status and restart counts. (#11885)
Some checks failed
build-staging / js-build (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* chore: added types and open api spec changes * chore: added method to calculate reason * chore: per group pod status counts with req metric checks method added * chore: wired up pod status counts * chore: pod restarts type added * chore: added restart counts for the group * chore: bug in query fix * chore: onboarding API changes * chore: integration tests added * chore: added podcountsbyphase in other entities * chore: added pod status counts for other entities * chore: added integration tests for other entities * chore: added checks api changes for other entities * chore: rearrangement * chore: removed succeeded status and mark it as completed * chore: query beautified * chore: corrected metrics list for metadata lookup * chore: removed dead constants |
||
|
|
a3fa475e88 |
docs: add contributing guidelines for authz (#11986)
* docs: add contributing guidelines for authz * docs: address review comments on authz contributing guide |
||
|
|
64d0ada495 | feat(infrastructure-monitoring): add disk usage chart for hosts (#11990) | ||
|
|
60886fd906 | fix: opening /ai-assistant opens 2 new conversations instead of one (#11923) | ||
|
|
d8954da307 | fix: context not being passed when user click suggestions in empty state (#11925) | ||
|
|
7476a2cacb |
feat(onboarding): add NGINX Ingress, FluxCD, Cassandra, Cloudflare Workers, PlanetScale, and Hermes Agent datasources (#11884)
* feat(onboarding): add NGINX Ingress, FluxCD, Cassandra, Cloudflare Workers, PlanetScale, and Hermes Agent datasources Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(onboarding): optimize new datasource logo SVGs with svgo Run svgo over cassandra.svg, fluxcd.svg, and planetscale.svg (viewBox and <title> preserved). Trims coordinate precision and metadata; fluxcd.svg shrinks ~24%. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
e1dd7d52eb |
feat(authz): add new authz components (#11970)
* refactor(authz): drop create guarded route component * refactor(authz): drop guarded authz component * refactor(authz): support list of permissions on denied callout * refactor(authz): support list of permissions on denied page * feat(authz): add guard authz button * feat(authz): add guard authz with page/content variants * feat(authz): add withAuthZ HOC component to guard pages/components * feat(authz): add docs for authz + agents update |
||
|
|
1644e35d9c |
feat(authz): make serviceaccount_role and user_role first class citizens (#11977)
* feat(authz): add serviceaccount and user role handlers * feat(authz): add support for role and service account extractors * feat(authz): make the user apis v2 * feat(authz): return the existing service account role id |
||
|
|
379331ee77 |
feat(dashboards-v2): panel drilldown — View in Logs/Traces (#11895)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(dashboards-v2): add the panel View-modal state and hooks URL-driven open state (useViewPanel off expandedWidgetId, V1 parity), a per-view time window isolated from the dashboard (useViewPanelTimeWindow), and useViewPanelEditor which layers the drilldown reset + type-selector signal/query type on top of the shared usePanelEditSession. * refactor(dashboards-v2): address View-mode PR review feedback Naming/convention: - UsePanelEditSessionApi -> UsePanelEditSessionReturn; fullKind -> panelKind - useViewPanelEditor -> useViewPanelMode (hook, types, file, refs, test) - useOpenPanelEditor `state` param -> `handoffState` (view -> edit handoff) Types tightened: - useViewPanelMode: panelDefinition is required (registry always resolves) - signal is required: fold the default-signal fallback into the hook so the query builder + type selector always get a signal; drop the now-dead defaultSignal from the return and the `signal ?? defaultSignal` call site. Behavior-preserving: only List restricts signals and it's already gated by query type under PromQL/ClickHouse. Misc: - PanelEditorPage: drop redundant optional chaining on getPanelDefinition - ViewPanelModal: Typography.Text title with ellipsis truncation - ViewPanelModalHeader: clearer queryType JSDoc * feat(dashboards-v2): add panel drilldown click-enrichment utils * feat(dashboards-v2): declare drilldown as a per-kind panel capability * feat(dashboards-v2): open a drilldown context menu with View in Logs/Traces * feat(dashboards-v2): substitute dashboard variables in drilldown View-in-X Clicking View in Logs/Traces from a panel drilldown now resolves the panel query's $var/dashboard-variable references before building the explorer URL (V1 parity with useBaseAggregateOptions). New useResolvedDrilldownQuery hook fires a /substitute_vars round-trip (useReplaceVariables + buildQueryRangeRequest) when the aggregate menu opens and the dashboard has selections, mirroring the V2-native path in useCreateAlertFromPanel. While resolving, both actions show a spinner and are disabled; no-variable dashboards skip the round-trip. * refactor(dashboards-v2): address drilldown review comments - stepClickTimeRange takes a single stepInterval (defaulted in props); callers do the per-query lookup from exec-stats stepIntervals - move DrilldownAggregateMenu static inline styles into a CSS module, keeping only the dynamic series color inline * feat(dashboards-v2): drill down filter-by-value into the View modal (#11959) * feat(dashboards-v2): drill down filter-by-value into the View modal A table group-cell click opens the filter-by-value menu (Is this / Is not this); picking an operator adds the filter to the panel query and opens the refined result in the View modal, persisted in the URL (V1 parity). Reuses V1's read-only getGroupContextMenuConfig; no V1 files modified. * refactor(dashboards-v2): type the filter-by-value ClickedData without a double-cast Address review: build a genuinely-typed ClickedData for the group-cell filter menu instead of an `as unknown as ClickedData` escape hatch. getGroupContextMenuConfig reads only column.dataIndex, so column carries just that field and record gets a minimal valid RowData. * refactor(dashboards-v2): render the filter-by-value menu from a component Reshape useDrilldownFilter to return data (isGroupColumnClick + onFilter) instead of JSX, and move the operator-menu rendering into a new DrilldownFilterMenu component wired in useDrilldown. Keeps hooks to logic/state and rendering in components (PR review preference). * refactor(dashboards-v2): strongly-type the drilldown popover coordinates Replace the drilldown's use of V1's loosely-typed useCoordinates (clickedData: any) with a V2-local useDrilldownCoordinates hook generic over the click payload, so DrilldownContext flows through without a cast. Extract the pure viewport-clamp math into calculatePopoverPosition with unit tests. * feat(dashboards-v2): panel drilldown — Breakout by .. (#11896) * feat(dashboards-v2): gate the panel editor through the capability guard Route the panel editor's query builder and visualization type switcher through the capability guard instead of V1's PANEL_TYPE_TO_QUERY_TYPES (now no longer imported by any V2 file): - PanelEditorQueryBuilder is keyed on PanelKind; its query-type tabs and query-builder field visibility come from the guard. - Switching the panel kind coerces the active query type via the guard. - The visualization type switcher disables a kind when the active query type or datasource is incompatible with it (e.g. List under ClickHouse/PromQL, or List with a metrics query). The live query type is read from the query-builder provider so a not-yet-staged new panel still gates correctly, and a tooltip explains why a type is disabled. ConfigSelect gains opt-in per-option tooltips. * feat(dashboards-v2): create alerts from a dashboard panel Wire the panel actions menu's "Create Alerts" item to seed a new alert from the panel's query. `buildCreateAlertUrl` translates the panel's V5 queries into the V1 compositeQuery the alert page reads (tagged with the panel type, v5 version and a dashboards source), and `useCreateAlertFromPanel` opens /alerts/new in a new tab and logs the action. Available regardless of edit access (V1 parity: create-alert works on locked dashboards too). To reach the query, the full panel is threaded through Panel -> PanelHeader -> PanelActionsMenu -> usePanelActionItems instead of just its kind; the header now derives its name/description from the panel as well. * refactor(dashboards-v2): ready ChartManager for the standalone view Prep the shared graph-manager so it renders cleanly inside the View modal: swap the legacy useNotifications save toast for the sonner toast, and let ChartLayout grow to its content height (auto) so the manager's legend table isn't clipped under the chart. * feat(dashboards-v2): add the panel View modal The View modal UI — a compact, single-host drilldown editor matching V1's FullView: a draft preview over the per-view window, a toolbar (Reset Query, Switch to Edit Mode, panel-type selector, time picker, refresh), and the query-builder-only drilldown editor (no ClickHouse/PromQL tabs, per V1). Edits are temporary — they never touch the saved dashboard. * feat(dashboards-v2): open a drilldown context menu with View in Logs/Traces * feat(dashboards-v2): add the Breakout by .. drilldown submenu * chore: pr review fixes * refactor(dashboards-v2): render the Breakout by .. menu from a component Reshape useDrilldownBreakout to return data (queryData + onBreakout) instead of JSX, and move the picker rendering into a new DrilldownBreakoutMenu component (with a CSS module) wired in useDrilldown. Keeps hooks to logic/state and rendering in components (PR review preference). * feat(dashboards-v2): panel drilldown — context links (#11897) * feat(dashboards-v2): resolve panel context links in the drilldown menu * feat(dashboards-v2): panel drilldown — dashboard variables + trace link (#11964) * feat(dashboards-v2): complete drilldown V1 parity — dashboard variables + trace link Add the last two V1 drilldown features to V2 panels: - Dashboard Variables submenu: from a grouped click, the aggregate menu now offers, per group-by field, Set/Unset a matching dynamic variable to the clicked value, or Create a new dynamic variable from it. Set/Unset are runtime-only (store + URL, matching V2 selections); Create is the one persisted path (appends to spec.variables via the optimistic patch). New Panel/hooks/useDrilldownDashboardVariables.tsx mirrors V1's useDashboardVarConfig; wired into useDrilldown as a new submenu. - "View Trace Details" data link: the aggregate menu shows a /trace/{id} link when the clicked point carries a trace_id (V1 getDataLinks parity). New Panels/utils/drilldown/getDataLinks.ts. Exports variablesUrlParser from useVariableSelection so the submenu reuses the runtime-selection URL contract without re-running its seeding effect. * fix(dashboards-v2): restrict drilldown filters to group-by dimensions The pure-V5 flattening backfills an ungrouped series' labels with {queryName: queryName} for its legend; the chart/pie enrichers turned every label into an equality filter, leaking a bogus `A=A` into the drilldown context. That broke the "filters are the clicked point's group-by labels, empty when ungrouped" contract — surfacing a spurious Dashboard Variables entry and a corrupt View-in-Logs query that V1 never shows. Add getGroupByFilters to intersect the clicked labels with the query's groupBy, and use it in enrichChartClick/enrichPieClick. * refactor(dashboards-v2): dashboard-variables drilldown review fixes Address PR review on the Dashboard Variables submenu: - render it from a DrilldownDashboardVariablesMenu component; the hook now returns data (hasFieldVariables + actions) instead of JSX, taking a required filters array + signal (rendering belongs in the component, not the hook) - identify dynamic variables by plugin kind on the DTO, not by mapping every variable to a form model first - drop the redundant useGetDashboardV2 enabled guard (the generated hook already gates on !!id) - reference the DrilldownSubMenu enum instead of a raw string - move inline styles to a CSS module * refactor(dashboards-v2): read drilldown variables via useDashboardFetchRequired Use the shared useDashboardFetchRequired in useDrilldownDashboardVariables instead of calling useGetDashboardV2 directly, so it resolves through the one dashboard cache entry and drops the `?? []` guards. Filter dynamic variables on the form model's `type` (via dtoToFormModel) rather than casting the raw spec. That hook throws on a missing dashboard id, and the id was seeded into the store in a useEffect — undefined on the first Panel render. Seed it synchronously during render in DashboardContainer instead, and make setEditContext idempotent so the render-phase call is a safe no-op once seeded. * chore: fix failing lint |
||
|
|
4d079a8338 |
refactor(dashboard-v2): unify dashboard tag chips into one TagBadge component (#11984)
* fix(dashboard-v2): render tag chips with the sienna Badge component The key:value tag editor rendered chips as a hand-rolled div + ghost buttons with sienna colors mixed in by hand. Use the @signozhq Badge (color=sienna, closable) so the chips match the design system and the rest of the dashboard tag styling. * fix(dashboard-v2): keep key:key tags intact in the settings tag editor tagsToStrings collapsed a tag whose key equals its value down to a bare key, so the settings tag editor showed `env` for an `env:env` tag. Always render both sides so key:key tags round-trip through the editor unchanged. * refactor(dashboard-v2): single TagBadge component for all dashboard tags The list rows, details header, and tag editors each rendered tag chips their own way (two hand-rolled sienna variants + an inline Badge), so they drifted. Extract one TagBadge (sienna Badge, optional closable) and use it everywhere, so tag styling changes in one place. List-row chips were not even sienna before. * fix(dashboard-v2): tag label inherits the Badge sienna color The chip label button used --button-variant-ghost-color: inherit, but for a CSS custom property inherit takes the parent's value of that same variable (unset), not the parent color — so the label fell back to the muted ghost default. Use currentColor so it picks up the Badge's sienna foreground. |
||
|
|
91938925ec | feat(infra-monitoring): rework the category selection (#11957) | ||
|
|
e2588e6fff |
feat(dashboards-v2): context-link editor with variable + URL-param support (list + modal) (#11950)
* feat(dashboards-v2): add context-link variable + URL-param building blocks
Reusable primitives for the V2 context-link editor, kept separate from the
UI wiring:
- types: VariableItem / UrlParam / VariableSource
- utils: query-string <-> key/value param parsing, cursor-aware {{variable}}
insertion, and URL validation (http(s)://, /path, or {{var}}/)
- VariablesPopover: autocomplete that lists {{variables}} grouped by source
and inserts the picked token at the cursor
- useContextLinkVariables: self-contained hook sourcing the offered variables
(global timestamps, per-query groupBy fields as _<key>, dashboard variables)
from the query-builder provider + dashboard store, no prop threading
Covered by utils + hook unit tests.
* feat(dashboards-v2): rework context-link editor into a list + modal
The section is now a list of saved links (label + URL with edit/delete),
with add/edit handled in a modal (@signozhq/ui DialogWrapper) instead of the
cramped inline rows.
The modal carries V1's full authoring UX:
- label + URL with {{variable}} autocomplete and inline validation
- a key/value URL-parameters editor synced to the URL query string
- an "open in new tab" toggle; Save is gated on a non-empty, valid URL
Saved links set renderVariables so consumers interpolate the URL at
click-time. The variables popover renders with withPortal=false so it stays
inside the modal (radix's modal disables pointer events on portalled content).
* chore: pr review fixes
* refactor(dashboards-v2): split dashboard fetch into fetch-only hook + required accessor
- useDashboardFetch (renamed from useDashboardV2) now exposes only the raw
dashboard plus fetch lifecycle; spec derivation moves out of it.
- Add useDashboardFetchRequired: reads the active dashboardId from the store,
reuses the shared react-query cache entry, throws when the dashboard is
missing, and derives spec collections (variables). Also exposes refetch.
- Enforce the split with a new signoz/no-dashboard-fetch-outside-root lint rule,
allowlisted for the two root pages and the required hook.
- Point the context-link variables hook at useDashboardFetchRequired and expand
the VariableSource JSDoc.
* chore: fixed fmt
|
||
|
|
832a6cc794 |
feat: v2 versions of public dashboard APIs (#11725)
* feat: add first draft of v2 public dashboard apis * fix: remove duplicate call to GetDashboardByPublicIDV2 in GetPublicWidgetQueryRangeV2 * fix: fill fields that were in the data blob in v1 * chore: trim comments * fix: remove fields that v1 also removes when redacting * chore: rename method name * test: unit tests for GetPanelQuery * fix: add fill gaps to query * fix: generate api specs * test: add integration tests for new v2 public apis * fix: add query validation and aggregation validation * fix: remove unneeded tags db call from public query range api * fix: redact variable queries as well * fix: move regex out of method so that it is only compiled once per package load * chore: remove empty line * fix: use pointer to specs during redaction * fix: move single expression validation to dashboard package, use chparser for it * test: add integration test for variable query redaction * test: add integration test for expression with many parens * test: use valid query in integration test * test: use realistic query in variable |
||
|
|
5948b5b970 |
feat(dashboards-v2): view (expand) a dashboard panel (#11882)
* refactor(dashboards-v2): extract usePanelEditSession shared editing pipeline Pull the panel-editing pipeline (draft + query + staged-query sync + kind switch) out of the editor container into a shared usePanelEditSession hook so the full-page editor and the View modal share one source of truth and can't drift. A characterization test locks the container's forwarding behaviour. * feat(dashboards-v2): open the panel editor on a handed-off spec Let useOpenPanelEditor carry an optional spec via router location state so the View modal can hand its drilldown edits to the full editor; the editor page opens on the handed-off spec when present, falling back to the saved panel on refresh/new-tab. * feat(dashboards-v2): render the graph-manager legend in the standalone view The time-series and bar renderers show V1's graph-manager legend (Filter Series + per-series show/hide + Save) below the chart in STANDALONE_VIEW, threaded through as onCloseStandaloneView. ChartManager moves to the sonner toast, and the shared ChartLayout only drops its fill height when it has stacked layout children (--with-layout-children) so the dashboard grid, alert preview, and other charts keep filling their container. * refactor(dashboards-v2): make the editor preview and panel-type selector reusable Prepare the editor's building blocks so the View modal can reuse them instead of duplicating them: - PreviewPane takes panelMode/hideHeader/dashboardPreference/onCloseStandaloneView so it can render the standalone preview without its own time picker. - Extract usePanelTypeSelectItems from PanelTypeSwitcher so the modal header and the editor build the same capabilities-guarded panel-type options. - The shared query builder's run button reads "Run Query" (V1 FullView parity). * feat(dashboards-v2): add the panel View-modal state and hooks URL-driven open state (useViewPanel off expandedWidgetId, V1 parity), a per-view time window isolated from the dashboard (useViewPanelTimeWindow), and useViewPanelEditor which layers the drilldown reset + type-selector signal/query type on top of the shared usePanelEditSession. * feat(dashboards-v2): add the panel View modal A full-screen, temporary drilldown editor mounted once per dashboard (URL host in the layout). It reuses the editor's PreviewPane, tabbed query builder, and panel-type selector over the isolated per-view window, with Reset Query and Switch to Edit Mode. Edits stay in the builder/URL and the local draft, never the saved dashboard. * feat(dashboards-v2): wire up the panel View action The panel actions menu's View item opens the View modal for the panel, replacing the placeholder. * fix: fixed failing test * refactor(dashboards-v2): address View-mode PR review feedback Naming/convention: - UsePanelEditSessionApi -> UsePanelEditSessionReturn; fullKind -> panelKind - useViewPanelEditor -> useViewPanelMode (hook, types, file, refs, test) - useOpenPanelEditor `state` param -> `handoffState` (view -> edit handoff) Types tightened: - useViewPanelMode: panelDefinition is required (registry always resolves) - signal is required: fold the default-signal fallback into the hook so the query builder + type selector always get a signal; drop the now-dead defaultSignal from the return and the `signal ?? defaultSignal` call site. Behavior-preserving: only List restricts signals and it's already gated by query type under PromQL/ClickHouse. Misc: - PanelEditorPage: drop redundant optional chaining on getPanelDefinition - ViewPanelModal: Typography.Text title with ellipsis truncation - ViewPanelModalHeader: clearer queryType JSDoc * refactor(dashboards-v2): make panel-type selector queryType required queryType originates as a required EQueryType in ConfigPane (from the QB provider) and is always defined in the View modal too, so the optional prop + silent `?? QUERY_BUILDER` fallback on the leaf selector were just typing artifacts. Make queryType required on PanelTypeSwitcher and usePanelTypeSelectItems and drop the fallback. The kind-erased SectionEditorContext stays all-optional per its invariant, so the default now lives at the VisualizationSection boundary that consumes it. * chore: updated dashboard page title * feat(dashboards-v2): persist the View modal's query edits across refresh (#11945) * feat(dashboards-v2): persist the View modal's query edits across refresh The View modal's in-modal query builder is URL-synced (`compositeQuery`, plus `graphType` when present), but the modal seeded its draft from the saved panel on mount — so a page refresh discarded any in-modal edits. Seed the draft from the URL when a query is present (else the saved panel) via a mount-only `buildViewPanelSpec`, and clear those params on a plain open so a stale query can't bleed into the modal. URL-backed, shareable, and refresh-safe (V1 parity). * refactor(dashboards-v2): drop redundant queries fallback in buildViewPanelSpec DashboardtypesPanelSpecDTO.queries is a required array, so `spec.queries ?? []` never falls back — pass spec.queries directly. Addresses PR review feedback. |
||
|
|
84834b087b |
feat: add endpoint for fetching unpriced models (#11763)
* feat: add endpoint for fetching unpriced models * fix: more updates * fix: response model |
||
|
|
d490126162 |
fix(dashboard-v2): list-page bug bash fixes (#11939)
* fix(dashboard-v2): refresh the list after deleting a dashboard
Delete invalidated invalidateListDashboardsV2, but the list renders from
useListDashboardsForUserV2 (as does pin/unpin), so the deleted row lingered until
a manual reload. Invalidate the for-user list instead.
* feat(dashboard-v2): show a lock icon on locked dashboards in the list
The list rows already carry `locked`; surface it with a LockKeyhole icon (with a
tooltip) next to the row actions, mirroring the detail-page header.
* fix(dashboard-v2): show pinned icon (not unpin) until the pin is hovered
A pinned row rendered the PinOff ("unpin") icon at rest, so it read as an action
rather than a state. Show the filled Pin by default and reveal PinOff only on
hover of the pin button.
* fix(dashboard-v2): break long unbroken dashboard names in the list
The list title clamps to 3 lines but a long unbroken string could still overflow
the row horizontally; add overflow-wrap so it wraps within the clamp. (The detail
header already single-line truncates with a tooltip.)
* fix(dashboard-v2): use sienna tags in the dashboard header
The create modal and settings tag inputs already render sienna chips (matching the
list rows); the detail-page header still showed amber/warning badges. Switch them
to sienna for consistency across create, configure and display.
* fix(dashboard-v2): use a columns icon for the list columns control
The columns/metadata popover trigger used the HdmiPort icon, which doesn't read as
'columns'. Swap it for the Columns3 icon.
* fix(dashboard-v2): close the new-dashboard modal after creating
Blank/Import/Template create flows navigated to the new dashboard but left the
modal mounted, so it lingered over the detail page. Call onClose() on success
(Import/Template now take the onClose prop the modal already passes to Blank).
* feat(dashboard-v2): open the public dashboard from the header globe
The header globe now reflects the real public state (via usePublicDashboardMeta,
a deduped read) and is clickable — it opens the public dashboard page in a new
tab, with the tooltip updated to say so alongside the existing text.
* fix(dashboard-v2): embed the V1 template gallery in the new-dashboard modal
The V2 templates tab rendered a mock gallery. Until the templates BE API lands,
show the existing V1 gallery instead: extract it into DashboardTemplatesContent
(shared by the V1 modal and the V2 tab, no modal-in-modal) and embed it inline in
the V2 'From a template' tab. The V1 templates are placeholders, so the action
creates a blank dashboard and closes the modal. Drops the now-unused mock
templatesData.
* feat(dashboard-v2): click-to-unlock header lock icon + keep header icons on long names
The header lock icon is now a click-to-unlock control for author/admin (routes to
the existing lock toggle; static for others). Give it flex-shrink:0 (like the
public globe and description icons) so the description/public/lock icons and the
tag overflow stay visible when the title is long and truncates.
* feat(dashboard-v2): add Rename and Lock/Unlock to the list row actions
Rename opens a small dialog that patches /spec/display/name and refreshes the
list (shown for unlocked dashboards). Lock/Unlock toggles via lock/unlockDashboardV2
and refreshes the list, gated to author/admin on non-integration dashboards
(mirroring the detail-page gate).
* fix(dashboard-v2): list row menu — lock casing, disabled Rename tooltip, stop nav on menu click
- Capitalize 'Lock/Unlock Dashboard'.
- Show Rename disabled (not hidden) on locked dashboards with a tooltip explaining
why (matches Delete).
- Stop clicks inside the actions menu from bubbling to the row's navigate handler
(disabled items were opening the dashboard).
* fix(dashboard-v2): single-line row title + bottom-anchored tooltip
Truncate the list row title to a single line with an ellipsis (was a 3-line clamp),
and show the full name in a tooltip anchored to the bottom (auto-flips to top, with
an arrow) instead of the left.
* feat(dashboard-v2): session-local lock toggle in the header
The header lock control now reflects a session-local state: it appears once the
dashboard is locked (on load or during the session) and stays as a lock/unlock
toggle for the rest of the page. A dashboard that loads unlocked shows no icon
until it's locked. Clicking flips state optimistically so it no longer depends on
the refetch to update.
* fix(dashboard-v2): add top margin above the public-dashboard variables hint
* feat(dashboard-v2): run search with a Run query button + Cmd/Ctrl+Enter
Show a 'Run query' affordance with the OS-aware ⌘/Ctrl ⏎ hint in the search bar
(matching the query builder) and run the search on Cmd/Ctrl+Enter.
* fix(dashboard-v2): make the filter Clear button prominent
Use the primary (outlined) style for the Clear-filters button so it stands out
once a filter is applied.
* revert(dashboard-v2): restore multi-line clamp for list row title
Single-line truncation broke the row's responsiveness; revert to the 3-line clamp.
Keeps the bottom-anchored tooltip for long names.
* fix(dashboard-v2): show the lock tooltip on disabled Rename/Delete items
antd tooltips don't fire on disabled buttons; wrap them in a span the tooltip can
attach to so the 'dashboard is locked' reason shows on hover.
* fix(dashboard-v2): header tooltips update when moving between icons
Set disableHoverableContent on the title/description/public/lock tooltips so
leaving a trigger closes its tooltip immediately, letting the next icon's tooltip
open in both directions (was sticking when moving public → lock).
* fix(dashboard-v2): tooltip on the pin button showing the click action
Replace the native title with an antd tooltip that reads 'Pin dashboard' /
'Unpin dashboard' based on the current state.
* fix(dashboard-v2): delete dashboards via the v2 endpoint from the list
The list-page delete action was calling the v1 delete endpoint; route it through
deleteDashboardV2 so v2-shape dashboards (incl. pinned) delete correctly.
* refactor(dashboard-v2): use signoz Button/Tooltip in list row & dashboard header
Address review feedback on #11939:
- DashboardRow: swap the antd Tooltip for @signozhq TooltipSimple and the native
pin <button> for the @signozhq Button. Only wrap long titles in a tooltip so a
short name no longer renders an empty hanging tooltip. Rename pinBtn -> pinButton.
- DashboardInfo: swap the native public-link and lock <button>s for @signozhq Button.
- Drop the now-orphaned .titleTooltipOverlay antd override.
* fix(dashboard-v2): show a loader and block double-click when deleting a dashboard
The list-row delete confirm fired the mutation on click and closed on settle,
so a quick second click could fire delete twice. Use a promise-based onOk so the
Delete button shows a loading spinner and rejects further clicks until the request
settles, then closes.
|
||
|
|
526a7d1c46 |
fix: update stale docs links in frontend (#11319)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix: update 47 stale docs links in frontend to current URLs Update documentation links across 19 frontend files to match current signoz.io docs structure after product module restructures. Key changes: - Instrumentation links updated to new OpenTelemetry-prefixed paths - product-features/* links replaced with current locations - Query builder links point to new querying module pages - Alert notification channel links point to setup-alerts-notification - SSO, infra monitoring, and version upgrade links corrected Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: update 278 more stale docs links and broken anchors in frontend - Onboarding md-docs: update instrumentation URLs to canonical paths (django/flask/fastapi/falcon → opentelemetry-python, express/nestjs → javascript/opentelemetry-nodejs, springboot → java/opentelemetry-java, tomcat → java/opentelemetry-tomcat, jboss → java/opentelemetry-jboss, golang → opentelemetry-golang, elixir → opentelemetry-elixir, reactjs → frontend-monitoring/sending-traces-with-opentelemetry) - Onboarding md-docs: update tutorial/* → opentelemetry-collection-agents/*, userguide/hostmetrics → infrastructure-monitoring/hostmetrics, userguide/logs# → userguide/logs_query_builder# - Query builder UI: fix broken anchors after query-builder-v5 page restructure (Having → result-manipulation, Order By → result-manipulation, Limit → result-manipulation, Legend → aggregation-grouping, Group By → aggregation-grouping, Formula → multi-query-analysis, Trace Matching → multi-query-analysis, Reduce → result-manipulation, Aggregation functions → aggregation-grouping, Time aggregation → temporal-aggregation) - Fix Apdex link → alerts-management/apdex-alerts - Fix missing spans link → traces-management/troubleshooting/faqs - Fix cost meter, ClickHouse traces, k8s pod logs anchors - Drop broken anchors where sections were removed from docs Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: format CreateAlertRule files after anchor removal Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: revert OnboardingContainer changes (deprecated module) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: Vishal Sharma <makeavish786@gmail.com> Co-authored-by: Ubuntu <ubuntu@ip-172-31-24-8.eu-central-1.compute.internal> |
||
|
|
9f72338c87 |
fix(dashboards-v2): list panel pagination, spanGaps clamp, discard dialog & create-alert fixes (#11974)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix(dashboards-v2): show the list panel pager A new/edited List panel never showed its server pager. The V1→V5 mapper folds a list query's internal `pageSize` into the V5 `limit` (`createBaseSpec`), so a seeded panel (pageSize 100) always looked like it had a user limit — and `usePanelQuery` suppresses the pager when a limit is present. Strip the V1 explorer's `pageSize`/`offset` in `toPerses` before conversion so `limit` reflects only a real user limit; List panels then page by default while an explicit user limit still renders as a static, unpaged list. * fix(dashboards-v2): give logs list requests a deterministic order Offset paging over a non-total order can duplicate or drop rows sharing a value (e.g. same-millisecond logs) across page boundaries. Enforce a total order on every logs-list request (`withListOrderTiebreaker`): default the primary to `timestamp desc` and always append `id` (logs-explorer parity). Request-only, so it never lands in the saved panel spec; traces keep theirs. * fix(dashboards-v2): list pagination runtime behaviour - Drive `canNext` from the backend's `nextCursor` (set iff the page filled) instead of a client-side row-count guess. - Keep the table + pager mounted on a page change (`keepPreviousData`); show the full-panel loader only on the first fetch, not on every refetch. - Ignore a stale cross-type response kept across a panel-kind switch (match the response type to the request) so the list doesn't flash "No data". - While the next page loads, swap the stale rows for horizontal skeleton rows (dashboard grid and editor preview). * fix(dashboards-v2): seed timestamp order when switching to a list panel V1's shared `handleQueryChange` clears orderBy when switching to a list, so the builder's Order By opened empty after e.g. Time series → List. Re-seed the fresh-list default (timestamp desc) in `usePanelTypeSwitch` so the query matches a newly created list panel. * fix(dashboards-v2): clamp time-series spanGaps to the step interval A numeric spanGaps is a max-gap threshold (seconds). Floor it at the smallest step interval so a sub-step value doesn't break the line at every normal point. Boolean "span all" passes through unchanged. * fix(dashboards-v2): flip discard-dialog buttons "Keep editing" now sits on the right and is outlined; "Discard" stays left (destructive). The ConfirmDialog preset can't reorder/restyle its footer, so swap to DialogWrapper with a custom footer (same chrome, async confirm state preserved via the button's loading flag). * fix(dashboards-v2): floor the create-alert time window to integer ms buildQueryRangeRequest's start/end are int64 ms, so passing a float from the nanosecond division could break the call. Floor the ns→ms conversion and use the named NANO_SECOND_MULTIPLIER constant instead of a magic 1e6. * fix(dashboards-v2): clone patched values so optimistic apply can't corrupt outgoing ops Creating the first panel on an empty dashboard failed with "spec.layouts[0].spec.items[0] and items[1] overlap". createPanelOps emits three ops (add empty section, add panel, add item into that section), but useOptimisticPatch.onMutate runs applyJsonPatch before the request is sent, and applyJsonPatch inserted each op.value by reference. The cache's layouts[0].spec.items then aliased the empty items array held inside the section-add op, so applying the item op mutated that op's value too. react-query sent the mutated ops (section already holding the item, plus the separate item add) → two overlapping items. Clone the inserted value on add/replace so the applied document never shares references with the input ops, restoring the purity the docstring already promises. New-dashboard-only because that is the only batch that adds a layout and an item into that same layout together. |
||
|
|
e7ef4c6bdb |
fix(dashboard-v2): correct formatting carry on panel-kind switch + unify spec seeding (#11956)
* refactor(dashboard-v2): make ThresholdVariant a string enum Replace the ThresholdVariant string-union with a string enum so panel section configs reference named members (ThresholdVariant.LABEL/COMPARISON/ TABLE) instead of bare string literals, and update every call site. * fix(dashboard-v2): correct formatting carry on panel-kind switch Switching a panel's visualization kind carried formatting fields the target kind's schema does not accept (e.g. `unit` into a Table, which only supports `columnUnits` + `decimalPrecision`), so the save API rejected the spec. Unify new-panel and kind-switch spec seeding into one per-section registry (`buildPluginSpec`, SECTION_SEEDS): each section derives its plugin-spec slice from the target kind's declared `controls` and optional context, so a carried field is emitted only when the target kind actually supports it. Adding a section now means one registry entry rather than editing two seeders. Delete the redundant `buildDefaultPluginSpec` wrapper (it only forwarded to `buildPluginSpec`); `getSwitchedPluginSpec` becomes a thin delegating wrapper. |
||
|
|
ef9b8eec8a |
perf(tsconfig): improve type check time (#11927)
Some checks failed
build-staging / prepare (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
* chore(tsconfig): explicit path mappings and cleaned includes * perf(tsconfig): enable incremental & fix large type resolution |
||
|
|
94a5e568fd |
refactor(web-settings): move more settings to runtime & disabled by default (#11917)
Some checks failed
build-staging / js-build (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
Co-authored-by: Vikrant Gupta <vikrant@signoz.io> |
||
|
|
25cd3fc705 | chore(authz): move components/hooks to lib (#11932) | ||
|
|
5c3fdb64ed | feat(entity-metrics): use new uplot API for charts (#11954) | ||
|
|
bac68a6707 |
fix(types): guarantee both letter cases in generated factor passwords (#11961)
password.Generate draws letters from both cases without guaranteeing either, so roughly 1 in 1000 generated passwords contained no lowercase letter and failed IsPasswordValid, panicking MustGenerateFactorPassword. The existing "Z" suffix only covered the uppercase requirement; append "zZ" to guarantee both cases while keeping the generated part mixed-case for entropy. |
||
|
|
766a05e24b |
chore: fix issues found in bug bash (#11949)
* fix: return list of all tags sorted alphabetically * chore: return reserved keys in list api response for easy filtering * fix: add length limit to dashboard display name * test: check error message as well * chore: increase the length limits * chore: add copy suffix on cloning dashboards * fix: increase limit to 64 for dashboard view name * fix: send user friendly err message on length check fail * fix: add path to error message * fix: include path in main error message directly * fix: move regex out so that it only compiles once per init * fix: format integration test properly |
||
|
|
1a84503f4b |
feat(dashboards): add auto-refresh to public dashboards (#11938)
* feat(dashboards): add auto-refresh to public dashboards Add a self-contained auto-refresh interval selector to the public dashboard header, shown alongside the time picker when the publisher enabled the time range. On each tick it recomputes the rolling window from the selected relative range and updates local state, so panels refetch with an advanced window. Paused/disabled for fixed 'custom' ranges. Kept independent of Redux global time (which the public viewer doesn't use); reuses the shared refreshIntervalOptions. * refactor(dashboards): dedup public auto-refresh tick, use nano constant, userEvent Route the auto-refresh interval through handleTimeChange instead of duplicating the GetMinMax/setSelectedTimeRange logic, replace the 1e9 magic number with NANO_SECOND_MULTIPLIER, and switch the AutoRefresh test to userEvent. |
||
|
|
9454427b47 |
feat(dashboard-v2): JSON drawer redaction, JSON action cleanup & breadcrumb SPA nav (#11952)
* feat(dashboard-v2): redact JSON editor to tags/spec, preserve other fields on save The dashboard JSON drawer now exposes only the user-editable `tags` and `spec`; server-owned/derived keys (id, orgId, name, timestamps, locked, schemaVersion, image, …) are redacted from the view, copy, and export. On save, the edited draft is overlaid on the current dashboard so those redacted keys are preserved. * feat(dashboard-v2): drop redundant JSON actions, rename Edit-as-JSON to JSON Remove the Actions-menu Data group (Export JSON / Copy as JSON) — these are redundant with the JSON drawer's own Copy/Download. Rename the 'Edit as JSON' toolbar button to 'JSON' (keeping the Braces icon). * feat(dashboard-v2): client-side nav on the Dashboard breadcrumb Intercept a plain click on the 'Dashboard' breadcrumb for instant SPA navigation to the list page instead of a full-page reload; the href is kept so middle/ modifier-click still opens in a new tab. |
||
|
|
124d76068c |
fix(dashboard-v2): reconcile optimistic patches from the PATCH response (#11947)
Panel delete/move flickered A -> B -> A -> B: onSettled invalidateQueries fired an immediate GET that read pre-mutation (stale) data before settling. patchDashboardV2 already returns the updated dashboard, so reconcile the cache from that response (onSuccess) instead of refetching. Sequence is now A -> B -> B; rollback on error is unchanged. |
||
|
|
704b8bf917 |
chore(frontend-readme): clean the readme for frontend (#11955)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
3e6339019e |
fix(meter-explorer): not persisting query after page refresh (#11948)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
372d304a6f | feat(meter): migrate to new uplot API & use bar stacked chart (#11902) | ||
|
|
dbb4eb9574 |
chore: validate layout size and positioning in backend (#11921)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* chore: validate layout size and positioning in backend * test: add integratino test for layout validation * test: use assert instead of require for non blocking check * test: use assert instead of require for non blocking check * fix: move require to assert for actual test checks |
||
|
|
c36226050e |
feat(dashboards-v2): substitute dashboard variables when creating an alert from a panel (#11929)
Wire the `/substitute_vars` round-trip into the panel create-alert flow so `$var` / dynamic variable references resolve to the values selected in the variable bar before the alert is seeded — V1 parity with `useCreateAlerts`, which the previous V2 path skipped (it shipped variable refs verbatim). When the dashboard has resolved variables, `useCreateAlertFromPanel` builds a V5 query-range request (panel queries + resolved variables) and POSTs it through the generated `useReplaceVariables` hook; on success the substituted envelopes are translated to the V1 `Query` the alert page reads. With no variables to substitute the round-trip is a no-op, so we keep seeding synchronously and the new tab stays tied to the click. - persesQueryAdapters: extract `envelopesToQuery` from `fromPerses` (the substitute response hands back envelopes, not panel-query wrappers) - buildCreateAlertUrl: export `buildAlertUrl` + `readPanelUnit` so the sync and substituted paths share URL assembly |
||
|
|
a72484f12c |
feat(dashboard-v2): optimistic updates for dashboard spec mutations (#11936)
* feat(dashboard-v2): add lenient RFC-6902 JSON-Patch applier Add applyJsonPatch, a pure applier for the add/replace/remove ops our patchOps builders emit. Deep-clones and returns a new document (never mutates input), and is deliberately lenient like the backend apply (remove/replace on a missing path is a no-op, add creates missing object parents). This lets a dashboard edit be reflected in the react-query cache optimistically, with the mutation's settle refetch as the reconcile safety net. * feat(dashboard-v2): add useOptimisticPatch central mutation hook A single react-query mutation over patchDashboardV2 that applies the ops to the cached dashboard on onMutate (via applyJsonPatch, patching the envelope's .data), snapshots for rollback on onError, and invalidates on settle to reconcile. Reads dashboardId from the edit-context store (with an optional override for the panel editor, which receives its id as a prop) and exposes error; rethrows so call sites keep their own error handling. * feat(dashboard-v2): route section/layout edits through optimistic patch Migrate the section and layout mutations (rename, add, delete, reorder, resize/ move persist, first-section migration) off the 'await patchDashboardV2(...); refetch()' pattern onto useOptimisticPatch, so section edits render instantly and reconcile in the background. The explicit refetch is dropped (onSettled invalidates) and each hook keeps its own toast/error handling. * feat(dashboard-v2): route panel add/move/delete through optimistic patch Migrate the grid-item panel mutations (delete, move-between-sections, clone) onto useOptimisticPatch so they render instantly and reconcile on settle. useClonePanel keeps its toast.promise UX over the patch promise. Update the clone test to assert against the ops passed to patchAsync. * feat(dashboard-v2): route panel editor save through optimistic patch Migrate usePanelEditorSave off usePatchDashboardV2 + invalidateQueries onto the central useOptimisticPatch (passing the editor's explicit dashboardId). The isNew branch still reads cached layouts to resolve the target section. * feat(dashboard-v2): route settings/toolbar edits through optimistic patch Migrate the remaining patchDashboardV2 spec edits — variable-definition save, Overview metadata (title/description/image/tags), and toolbar rename — onto useOptimisticPatch. The toolbar keeps its refetch prop for the lock/unlock toggle (a non-patch API), and the edit-context refetch stays for the JSON editor's full-document save; both are outside this PR's patch-op scope. * chore(dashboard-v2): ban direct patchDashboardV2 via oxlint Add a no-restricted-imports rule forbidding patchDashboardV2 / usePatchDashboardV2 from api/generated/services/dashboard, directing callers to useOptimisticPatch(). patchAsync so every spec edit goes through the optimistic cache path. The hook itself (the one sanctioned caller) and its test carry a scoped inline exception. |
||
|
|
71eabac1e7 |
fix(dashboards): stop query cache collisions on public dashboards (#11935)
The public payload redacts each widget's query (filters/limit/orderBy stripped), so panels differing only by their filter arrive with identical query bodies. The react-query key was built from that query body, so those panels hashed to the same key and were deduped into one request — its data filled every colliding panel while other indices were never fetched. Key each panel on what determines its response — widget id + index + time — instead of the redacted query body. Fixes SigNoz/engineering-pod#5503 |
||
|
|
fea3be7c51 |
feat(dashboards-v2): panel editor — threshold carry, span-gaps fixes, metric unit defaults, live thresholds and pie multi-column fix (#11918)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(dashboards-v2): carry thresholds across a panel visualization-type switch When switching a panel's visualization kind mid-edit, thresholds now carry over if the target kind supports them, remapped to the target's variant (label/comparison/table) — keeping the shared core (color, value, unit) and seeding any variant-required fields (operator, format, column) with sensible defaults so the carried threshold stays functional. Kinds without a Thresholds section drop them. The carry is a first-visit seed; reversible round-trips still restore from the per-kind session cache. * fix(dashboards-v2): span-gaps Disconnect Values reactivity + fillOnlyBelow flag Fixes three issues in the chart-appearance span-gaps control and makes the fillOnlyBelow flag authoritative end-to-end: - Threshold default now seeds from the live query step interval (which arrives async) instead of being captured once at mount, so it no longer falls back to 1m. - The threshold input no longer re-commits an unchanged value on blur, so clicking "Never" reliably switches mode (the blur/toggle race is gone). - Invalid input is validated live as the user types, surfacing the error immediately rather than only on blur. - Selecting Threshold writes fillOnlyBelow: true (+ duration); Never writes fillOnlyBelow: false and drops the duration. The selected mode is derived from fillOnlyBelow, and the renderer honors it (explicit false spans every gap), with back-compat for panels saved before the flag existed. * feat(dashboards-v2): auto-seed panel unit from the metric with a mismatch warning V1 parity for the formatting unit selector: when the selected metric carries a unit, a new panel auto-initializes its unit from it, and choosing a different unit shows the "Unit mismatch" warning. Reuses the shared useGetYAxisUnit hook and YAxisUnitSelector read-only. The resolution + auto-seed runs at the editor level (not inside the collapsible FormattingSection) so it applies even while that section is closed; the resolved metric unit is threaded down via context purely to drive the warning. Seeding is gated to new panels — editing never overwrites a saved unit. * feat(dashboards-v2): reactive threshold editing with live preview Threshold edits now stream to the spec as the user types, so the panel preview reflects them before Save. The per-row draft is mirrored into the spec via an onLiveChange effect in useThresholdDraft; because edits reach the spec live, ThresholdsSection snapshots the saved value on edit entry and restores it on Discard. Save keeps the value, Discard rolls back, and add-then-discard still removes the row. * fix(dashboard): apply pie multi-column scalar fix to v2 panels Mirror the V1 pie fix in the V2 PieChartPanel. preparePieData already reads the scalar table (via prepareScalarTables) but used columns.find(isValueColumn), so only the first value column was plotted — a ClickHouse `count() AS col1, sum() AS col2` collapsed to a single slice. It now emits one slice per (row × value column); with multiple value columns the column name distinguishes the slices (prefixed by the group when grouped). Single-value and grouped panels are unchanged — a single value column iterates exactly once. Per the V1/V2 split, this duplicates the behaviour into V2 land rather than sharing the V1 helper. * chore: pr review fixes |
||
|
|
66f03d5912 |
fix(metrics): use local table for fingerprint ctes (#11931)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* fix(metrics): use local table for fingerprint ctes * chore: remove queries file * chore: update reduced_test.go |
||
|
|
cf69a05f74 |
fix(dashboards): expose Source as a string enum in the OpenAPI schema (#11930)
The reflector saw Source's unexported valuer.String field and emitted type: object. Add a JSONSchema exposer that pins type: string, deriving the enum values from the existing Enum() method so the list of sources lives in exactly one place. |
||
|
|
1648fce5b1 |
chore(authz): delete the deprecated authz apis (#11924)
* chore(authz): delete the deprecated authz apis * test(authz): rework role integration tests onto the new CRUD APIs Migrate the role integration suite off the deprecated PATCH endpoints and onto the current declarative role CRUD APIs (Create/Get/List/Update/Delete with full transactionGroups). - role/01_register.py: verify managed roles via GetRole's transactionGroups against a golden matrix in testdata/role/managed_role_grants.json (no more DB tuple assertions). - role/02_crud.py (new): custom-role CRUD lifecycle, declarative update, validation (naming, invalid verb/type/kind/selector, duplicate, managed immutability, delete-with-assignee), and license gating. - role/03_fga.py: resource FGA allow/deny via declarative grant sets. - role/02_user.py: deleted; user role-membership is covered by the passwordauthn suite. - serviceaccount/06_fga.py: migrated to declarative grant PUTs. - fixtures/role.py: pure data helpers + find_role_id fixture; tests make their HTTP calls directly. * test(authz): scope role/SA FGA tests to fine-grained selectors - role FGA: grant read/update/delete on a specific role name (not "*") and assert allowed-on-granted vs forbidden-on-other; create is collection-scoped; list on "*" returns every role. - serviceaccount FGA: grant on a specific SA id (with a second SA to prove cross-instance denial); dual attach/detach scoped to SA id + role name. - add create_role fixture (alongside find_role_id) for happy-path role creation; validation/failure cases stay inline. - underscore-prefix file-local constants in both FGA modules. * test(authz): rename grants terminology to transactions in role tests |
||
|
|
f93a70884a |
feat(dashboards-v2): create alerts from a dashboard panel (#11879)
* feat(dashboards-v2): create alerts from a dashboard panel Wire the panel actions menu's "Create Alerts" item to seed a new alert from the panel's query. `buildCreateAlertUrl` translates the panel's V5 queries into the V1 compositeQuery the alert page reads (tagged with the panel type, v5 version and a dashboards source), and `useCreateAlertFromPanel` opens /alerts/new in a new tab and logs the action. Available regardless of edit access (V1 parity: create-alert works on locked dashboards too). To reach the query, the full panel is threaded through Panel -> PanelHeader -> PanelActionsMenu -> usePanelActionItems instead of just its kind; the header now derives its name/description from the panel as well. * feat(dashboards-v2): add a Create alert rule action to the panel editor Add an "Actions" group at the foot of the editor config pane — a list of cross-page navigation links kept distinct from the collapsible config sections above. The first action, "Create alert", reuses useCreateAlertFromPanel to seed an alert from the draft query; the group hides for kinds that can't seed an alert and scales to more actions. ConfigPane now derives the panel kind from its spec and takes the draft panel + panelId so the group can build the link. * refactor(dashboards-v2): address review feedback on panel create-alert - buildCreateAlertUrl: drop redundant `?? []` (spec.queries is a required array) - buildCreateAlertUrl: extract FormattablePluginSpec type for the formatting cast - usePanelActionItems: rename kindActions -> panelCapabilities (its type is PanelActionCapabilities; avoids the clash with the panelActions prop) - useCreateAlerts (V1): mark @deprecated pointing at the V2 create-alert path * chore: pr review changes |
||
|
|
e1c586e0dc |
chore(metrics): review follow ups for volume control (#11887)
Some checks failed
build-staging / staging (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* chore(metrics): review follow ups for volume control * chore: the reduced metrics show up in summary page * chore: 1h; 6h window changes * chore: address some gaps * chore: asset warning gap * chore: address lint * chore: regenerate api |
||
|
|
984b2d0138 |
fix(authz): drop the organization grant tuples (#11922)
* fix(authz): stop seeding organization role tuples and remove existing ones
Fetching the signoz-admin role via GET /api/v1/roles/{id} panicked with
"invalid input format: organization:organization/*". Organization objects
use a 2-part id (organization:organization/<selector>) that
MustNewObjectFromString cannot parse, unlike the 4-part format every other
resource emits.
The signoz-admin managed role granted read/update on the organization
resource, so those tuples were read back and crashed the parser. These
grants are dead weight: org routes are gated by admin role membership, not
by the organization object.
Remove the organization transactions from the signoz-admin seed and add
migration 098 to delete existing organization tuples and changelog rows.
* fix(authz): parse organization object string in MustNewObjectFromString
The organization resource is the root entity and encodes its object as
"organization:organization/<selector>", without the orgID and kind
segments every other resource uses. The 4-part parser panicked with
"invalid input format" when it encountered this shape.
Detect the type first, then handle the organization 2-part format
explicitly, mirroring resourceOrganization.Object(). All other resources
keep the existing 4-part path. This makes listing a role's permissions
robust to organization tuples regardless of how they were created.
|
||
|
|
3ea62d3d50 |
feat(dashboard-v2): link variables to panels and substitute them into panel queries (#11909)
* feat(dashboard-v2): build V5 variables payload from selection
Add buildVariablesPayload, a pure builder mapping a dashboard's variable
definitions + runtime selection into the V5 query-range `variables` map
({ name: { type, value } }). Mirrors V1 getDashboardVariables: maps the
QUERY/CUSTOM/TEXT/DYNAMIC UI types to wire types, collapses a multi-select
dynamic ALL to the __all__ sentinel, falls back to configured defaults, and
omits empties. buildQueryRangeRequest now accepts a `variables` arg (defaults
to {}) instead of hardcoding an empty map.
* feat(dashboard-v2): add resolvedVariables store channel
Add a transient (non-persisted) resolvedVariables map to the variable-selection
slice, keyed by dashboardId, with a setResolvedVariables setter and a
selectResolvedVariables selector. This is the published-to-store channel the
panel query reads from, mirroring the edit-context publish pattern so the
dashboard spec is not threaded down the panel tree.
* feat(dashboard-v2): substitute variable selection into panel queries
Add useResolvedVariables, which derives the variable definitions from the spec,
reads the runtime selection from the store, builds the V5 payload, and publishes
it via setResolvedVariables. DashboardContainer calls it once. usePanelQuery
reads selectResolvedVariables(dashboardId) and threads it into the request and
the query key, so each panel (and the editor preview) substitutes the bar's
selected values and refetches when a selection changes.
|
||
|
|
9317a26337 |
feat(llm-pricing): search + source filter (4/5) (#11808)
* feat(llm-pricing): add model pricing foundation (route, permission, page shell) * feat(llm-pricing): add listing page and table * chore(llm-pricing): drop search + source filters from list request The list API does not honour the q (search) and source params yet, so the controls did nothing. Remove the search input and source dropdown along with the params we sent, and trim useModelPricingFilters to the URL-backed page state that pagination still needs. Currency dropdown, tabs, table and pagination are unchanged. Filters will return once the backend supports them. * refactor(llm-pricing): extract getRelativeTime helper in utils Pull the relative-time formatting out of getRelativeLastSeen into a small local getRelativeTime helper. Kept feature-local (not in the shared utils/timeUtils) so the LLM pricing module owns its own dayjs config; the local relativeTime extend stays for test self-sufficiency. * refactor(llm-pricing): drop dead NaN guard in formatPricePerMillion Pricing fields are typed as required numbers and JSON can't carry NaN, so Number.isNaN was unreachable. Keep the null/undefined guard as API defensiveness (toFixed on a missing value would crash the row). Also trims the now-redundant dayjs.extend comment. * refactor(llm-pricing): centralize constants and shared types Extract PAGE_SIZE, PAGE_KEY, COLUMN_COUNT and CURRENCY_OPTIONS into a new constants.ts, and move the ModelPricingFilters contract into types.ts. Component prop interfaces stay colocated with their components, matching the convention in the drawer PR. * refactor(llm-pricing): use nuqs for list pagination URL state Replace the hand-rolled useHistory + URLSearchParams plumbing in useModelPricingFilters with nuqs useQueryState, matching the convention used by the dashboards, alerts and k8s list pages. Behaviour is unchanged: parseAsInteger.withDefault(1) keeps ?page=1 out of the URL and history:'replace' avoids polluting the back-stack. * refactor(llm-pricing): inline pagination, drop useModelPricingFilters The hook had shrunk to a one-line nuqs wrapper after search/source were removed, so inline the useQueryState call into the container and remove the hook file plus the now-unused ModelPricingFilters type. When the filters return (once the API honours them) they can move back into a dedicated hook. * feat(llm-pricing): disable currency selector (USD-only for now) Only USD is priced today, so render the currency SelectSimple in a disabled state pinned to USD. A disabled select can't fire onChange, so the currency useState is dead — drop it (and the now-unused useState import). * refactor(llm-pricing): render model costs inside its tab + tab URL param The listing was rendered outside the Tabs, so the tab was decorative. Move all model-cost content (currency control, list query, table, pagination, footer) into a ModelCostsTab component rendered as the 'Model costs' tab's children, and drive the active tab from a 'tab' URL query param (nuqs). The container is now just the page shell. Unpriced models stays a disabled placeholder for a later PR. * style(llm-pricing): target @signozhq table slots, drop dead antd/leftover rules The component uses @signozhq/ui Table/Tabs (Radix-based), not antd, so the .ant-table-* and .ant-tabs-nav selectors never matched — the intended uppercase/muted header styling wasn't applied. Retarget header/cell rules to [data-slot='table-head'|'table-cell'] (no !important needed). Also remove dead rules left over from the removed search/source/add UI (.filters-bar__search, __source, __add, .page-header__actions) and the unused .source-badge--auto/ --override modifiers. * fix(llm-pricing): constrain currency dropdown width, drop tab URL param - Currency SelectSimple stretched to fill the filters bar; give it a fixed 160px width (min-width couldn't cap the trigger). - Model costs is the only enabled tab for now, so use Tabs defaultValue instead of a URL-backed param. Removes the nuqs tab state plus the now-unused TAB_KEYS/TAB_QUERY_KEY constants and TabKey type. * chore: self review changes * fix: add skeleton loading * refactor: self review changes * refactor: initial prop * fix: update styling * fix: add comments in utils * feat(llm-pricing): add model cost drawer and wire into listing page * fix(llm-pricing): restrict pricing management to admins Align the frontend write gate with the backend, which protects the LLM pricing create/update/delete endpoints with AdminAccess (admin only). Previously manage_llm_pricing allowed EDITOR/AUTHOR, so those roles saw the Add/Save affordances but their writes were rejected with a 403. Also removes the AUTHOR entry, which could never reach the page (the route gate excludes it). * fix(llm-pricing): read-only drawer shows View title, hides source picker Non-managers open the drawer in view mode (write APIs are Admin-only), so: - the heading reads "View model cost" instead of "Edit model cost" - the Source (auto vs. override) picker is hidden, since switching source is a manager-only action with nothing actionable for a viewer. * refactor: form in edit / add modal * chore: update color tokens * fix: add error handling * chore: update more self review changes * chore: self review changes * chore: self review changes * fix: minor grammer thing * fix: route thing * refactor: migrate to css moduel * refactor: migrate to css module * refactor: migrate to css module * refactor: migrate to tanstack table * docs: clarify price precision comment * chore: remove comment * chore: remove comment * fix: disable isDirty in case of llm pricing * refactor: number * feat: add search , dropdown and flag * feat: feature flag on entire route and add mode costs tabs * fix: add isFetchingFeatureFlags * chore: update flag * refactor: shell * fix: add key to route * feat: add flags * chore: additional refactor * chore: add commet in utis * chore: self review changes * refactor: types and other things * refactor: types and other things * chore: add disable on source id * empty commit * chore: empty commit * fix: add demo side nav on sidenav * chore: remove demo side nav * refactor: update routes * chore: remove usd selector for now * fix: layout shift * refactor: styles * refactor: typography component * refactor: more changes * refactor: typograhy * refactor(llm-pricing): break model-cost drawer into per-component files + tokens Apply the CSS-module/component conventions to the drawer that came from drawer-3: - Move the drawer under ModelCostTabPanel/components/ModelCostDrawer/ to mirror the ModelCostsTable structure - Split the single 395-LOC ModelCostDrawer.module.scss into per-component co-located modules; cross-component selectors live in shared.module.scss and are pulled in via CSS-modules `composes` - shared.module.scss is a composes target (parsed as plain CSS), so it is kept flat with block comments — no SCSS nesting or // comments - Use --text-vanilla-* (not --bg-vanilla-*) for text colors, matching the listing code * refactor: more changes * refactor: styling and components * refactor: styling and components * chore: add a tooltip on hover * feat: add delete confirm modal * fix: update title * refactor: css variables * refactor: use signoz button and minor css update * chore: sync table * chore: remove extra comment * chore: use typograpgy test in table config * fix: minior issues * fix: llm pricing listing * refactor: remove extra classes * refactor: side nav changes * fix: update missing styles * chore: update edit and delete options * chore: remove extra comment * chore: revert env changes * chore: add enable check * chore: remove divider * refactor: use delete confirm dialog * chore: remove scss file --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
fde817d83c |
feat(llm-pricing): model cost add/edit drawer (3/5) (#11761)
* feat(llm-pricing): add model pricing foundation (route, permission, page shell) * feat(llm-pricing): add listing page and table * chore(llm-pricing): drop search + source filters from list request The list API does not honour the q (search) and source params yet, so the controls did nothing. Remove the search input and source dropdown along with the params we sent, and trim useModelPricingFilters to the URL-backed page state that pagination still needs. Currency dropdown, tabs, table and pagination are unchanged. Filters will return once the backend supports them. * refactor(llm-pricing): extract getRelativeTime helper in utils Pull the relative-time formatting out of getRelativeLastSeen into a small local getRelativeTime helper. Kept feature-local (not in the shared utils/timeUtils) so the LLM pricing module owns its own dayjs config; the local relativeTime extend stays for test self-sufficiency. * refactor(llm-pricing): drop dead NaN guard in formatPricePerMillion Pricing fields are typed as required numbers and JSON can't carry NaN, so Number.isNaN was unreachable. Keep the null/undefined guard as API defensiveness (toFixed on a missing value would crash the row). Also trims the now-redundant dayjs.extend comment. * refactor(llm-pricing): centralize constants and shared types Extract PAGE_SIZE, PAGE_KEY, COLUMN_COUNT and CURRENCY_OPTIONS into a new constants.ts, and move the ModelPricingFilters contract into types.ts. Component prop interfaces stay colocated with their components, matching the convention in the drawer PR. * refactor(llm-pricing): use nuqs for list pagination URL state Replace the hand-rolled useHistory + URLSearchParams plumbing in useModelPricingFilters with nuqs useQueryState, matching the convention used by the dashboards, alerts and k8s list pages. Behaviour is unchanged: parseAsInteger.withDefault(1) keeps ?page=1 out of the URL and history:'replace' avoids polluting the back-stack. * refactor(llm-pricing): inline pagination, drop useModelPricingFilters The hook had shrunk to a one-line nuqs wrapper after search/source were removed, so inline the useQueryState call into the container and remove the hook file plus the now-unused ModelPricingFilters type. When the filters return (once the API honours them) they can move back into a dedicated hook. * feat(llm-pricing): disable currency selector (USD-only for now) Only USD is priced today, so render the currency SelectSimple in a disabled state pinned to USD. A disabled select can't fire onChange, so the currency useState is dead — drop it (and the now-unused useState import). * refactor(llm-pricing): render model costs inside its tab + tab URL param The listing was rendered outside the Tabs, so the tab was decorative. Move all model-cost content (currency control, list query, table, pagination, footer) into a ModelCostsTab component rendered as the 'Model costs' tab's children, and drive the active tab from a 'tab' URL query param (nuqs). The container is now just the page shell. Unpriced models stays a disabled placeholder for a later PR. * style(llm-pricing): target @signozhq table slots, drop dead antd/leftover rules The component uses @signozhq/ui Table/Tabs (Radix-based), not antd, so the .ant-table-* and .ant-tabs-nav selectors never matched — the intended uppercase/muted header styling wasn't applied. Retarget header/cell rules to [data-slot='table-head'|'table-cell'] (no !important needed). Also remove dead rules left over from the removed search/source/add UI (.filters-bar__search, __source, __add, .page-header__actions) and the unused .source-badge--auto/ --override modifiers. * fix(llm-pricing): constrain currency dropdown width, drop tab URL param - Currency SelectSimple stretched to fill the filters bar; give it a fixed 160px width (min-width couldn't cap the trigger). - Model costs is the only enabled tab for now, so use Tabs defaultValue instead of a URL-backed param. Removes the nuqs tab state plus the now-unused TAB_KEYS/TAB_QUERY_KEY constants and TabKey type. * chore: self review changes * fix: add skeleton loading * refactor: self review changes * refactor: initial prop * fix: update styling * fix: add comments in utils * feat(llm-pricing): add model cost drawer and wire into listing page * fix(llm-pricing): restrict pricing management to admins Align the frontend write gate with the backend, which protects the LLM pricing create/update/delete endpoints with AdminAccess (admin only). Previously manage_llm_pricing allowed EDITOR/AUTHOR, so those roles saw the Add/Save affordances but their writes were rejected with a 403. Also removes the AUTHOR entry, which could never reach the page (the route gate excludes it). * fix(llm-pricing): read-only drawer shows View title, hides source picker Non-managers open the drawer in view mode (write APIs are Admin-only), so: - the heading reads "View model cost" instead of "Edit model cost" - the Source (auto vs. override) picker is hidden, since switching source is a manager-only action with nothing actionable for a viewer. * refactor: form in edit / add modal * chore: update color tokens * fix: add error handling * chore: update more self review changes * chore: self review changes * chore: self review changes * fix: minor grammer thing * fix: route thing * refactor: migrate to css moduel * refactor: migrate to css module * refactor: migrate to css module * refactor: migrate to tanstack table * docs: clarify price precision comment * chore: remove comment * chore: remove comment * fix: disable isDirty in case of llm pricing * refactor: number * refactor: shell * fix: add key to route * feat: add flags * chore: additional refactor * chore: add commet in utis * chore: self review changes * refactor: types and other things * refactor: types and other things * chore: add disable on source id * refactor: update routes * chore: remove usd selector for now * fix: layout shift * refactor: styles * refactor: typography component * refactor: more changes * refactor: typograhy * refactor(llm-pricing): break model-cost drawer into per-component files + tokens Apply the CSS-module/component conventions to the drawer that came from drawer-3: - Move the drawer under ModelCostTabPanel/components/ModelCostDrawer/ to mirror the ModelCostsTable structure - Split the single 395-LOC ModelCostDrawer.module.scss into per-component co-located modules; cross-component selectors live in shared.module.scss and are pulled in via CSS-modules `composes` - shared.module.scss is a composes target (parsed as plain CSS), so it is kept flat with block comments — no SCSS nesting or // comments - Use --text-vanilla-* (not --bg-vanilla-*) for text colors, matching the listing code * refactor: more changes * refactor: styling and components * refactor: styling and components * chore: add a tooltip on hover * feat: add delete confirm modal * fix: update title * chore: sync table * chore: remove extra comment * chore: use typograpgy test in table config * fix: minior issues * fix: llm pricing listing * refactor: remove extra classes * fix: update missing styles * chore: update edit and delete options * chore: remove extra comment * chore: revert env changes * chore: remove divider * refactor: use delete confirm dialog * chore: remove scss file --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
13812fac62 |
fix(dashboard): pie panel collapses multi-column ClickHouse query to a single slice (#11919)
* fix(dashboard): pie panel collapses multi-column clickhouse scalar to one slice A pie panel backed by a ClickHouse query with several aggregations (e.g. `count() AS col1, sum() AS col2`) rendered a single slice labelled with the query name and only the first value column's value; the other value columns were silently dropped. Root cause: the scalar response carries every value column in the scalar table, but PiePanelWrapper read the legacy `data.result` time-series field instead. For a scalar that field collapses to a single series that keeps only the first value column, so the pie never saw the rest. This is the pie counterpart of the table collapse fixed in #11794. Fix: when the scalar table has more than one value column, build pie slices from the scalar table under `newResult` (the same source the table and value panels already use) — one slice per value column, group-by columns become the label. Single-aggregation and grouped pies keep the existing series path unchanged. Frontend-only, V1. * fix: formatter datetime --------- Co-authored-by: Ashwin Bhatkal <ashwin96@gmail.com> |
||
|
|
df77b8d125 |
fix(settings): ensure scroll on tiny screens (#11916)
Some checks failed
build-staging / staging (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
028ac27496 |
feat: adding cloud integration API changes for GCP (#11892)
* feat: adding cloud integration API changes for GCP * chore: generating openapi specs * fix: integration tests * ci: fixing golang ci lint |
||
|
|
8b56f39261 | refactor(getting-started): use new invite members component (#11874) | ||
|
|
2be1063602 |
feat: QB support for QueryRangePreview (#11185)
* fix: added dry run api * fix: set nullable for api response fields * fix: missed adding one file * fix: comment lint * fix: finding 1 * fix: moved methods to telemetrystore * fix: move interface to telemetrystore * fix: remove wrong flow of imports * fix: generate openapi * fix: move explain methods to clickhousetelemetrystore |
||
|
|
6546602242 |
refactor(members-page): use new invite members component (#11873)
* refactor(members-page): use new invite members component * chore(invite-members): move to be under member settings |
||
|
|
ba49b28c5a | refactor(onboarding-questionaire): use new invite members component (#11875) | ||
|
|
adc3909b71 | feat(sso-configuration): change roles selector to allow custom roles (#11894) | ||
|
|
e00f47c812 |
feat(web): add sentry, posthog, appcues and pylon settings to web config (#11912)
* feat(web): move sentry dsn and tunnel to runtime web settings Move the Sentry dsn and tunnel out of build-time Vite injection into the web.settings config so they are configurable per deployment at runtime via SIGNOZ_WEB_SETTINGS_SENTRY_DSN and SIGNOZ_WEB_SETTINGS_SENTRY_TUNNEL. The backend injects them into index.html and the frontend reads them from window.signozBootData.settings; environment and release stay build-time. * feat(web): move posthog key, api_host and ui_host to runtime web settings Move the PostHog project key, api_host and ui_host out of build-time Vite injection into the web.settings config so they are configurable per deployment at runtime via SIGNOZ_WEB_SETTINGS_POSTHOG_KEY, SIGNOZ_WEB_SETTINGS_POSTHOG_API__HOST and SIGNOZ_WEB_SETTINGS_POSTHOG_UI__HOST. The backend injects them into index.html and the frontend reads them from window.signozBootData.settings; api_host falls back to https://us.i.posthog.com when unset. * feat(web): move appcues app id to runtime web settings Move the Appcues app id out of build-time Vite injection into the web.settings config so it is configurable per deployment at runtime via SIGNOZ_WEB_SETTINGS_APPCUES_APP__ID. The backend injects it into index.html and the Appcues loader reads it from window.signozBootData.settings. * feat(web): move pylon app id and identity secret to runtime web settings Move the Pylon app id and identity secret out of build-time Vite injection into the web.settings config so they are configurable per deployment at runtime via SIGNOZ_WEB_SETTINGS_PYLON_APP__ID and SIGNOZ_WEB_SETTINGS_PYLON_IDENTITY__SECRET. The backend injects them into index.html and the frontend reads them from window.signozBootData.settings. This was the last build-time integration value, so the now-unused createHtmlPlugin is removed. * chore(web): remove unused TUNNEL_DOMAIN VITE_TUNNEL_DOMAIN / process.env.TUNNEL_DOMAIN was only referenced by frontend/src/setupProxy.js, a dead Create-React-App artifact that Vite never loads. Remove the vite define, the type declaration, the dead setupProxy.js file, and the CI steps that wrote VITE_TUNNEL_DOMAIN to .env. * chore(ci): drop build-time VITE_ vars now served at runtime Sentry dsn/tunnel, posthog key, appcues app id, and pylon app id / identity secret are now configured at runtime via SIGNOZ_WEB_SETTINGS_* and no longer baked into the bundle, so the CI steps writing them to .env at build time are dead. Keep the build-only Sentry sourcemap vars (auth token, org, project id), VITE_VERSION, VITE_ENVIRONMENT and VITE_DOCS_BASE_URL. * chore(web): revert frontend and CI web settings changes Drop the frontend consumption (AppRoutes, vite config, index.html, env typings, bootSettings helper, setupProxy) and the CI workflow edits for the web settings migration; these will be done separately. The backend web.settings config and the generated schema/types stay. * refactor(web): make new web settings keys optional The new web settings keys (sentry dsn/tunnel, posthog key/api_host/ ui_host, appcues app_id, pylon app_id/identity_secret) are not required; drop required:"true" so they are optional in the generated schema and types. Only enabled stays required. |
||
|
|
b2f048770e |
feat(dashboards-v2): list tags, DSL search, per-user pinning & org-shared views (#11868)
Some checks failed
build-staging / staging (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(dashboards-v2): remove temporary V2 list banner The 'You're on the V2 dashboards page' warning banner was a stop-gap while the page was in flux. Remove it now that the page is the intended destination. * feat(dashboards-v2): strict key:value tag input with inline edit Add a shared TagKeyValueInput that accepts tags only as key:value pairs, committed on Enter and rejecting bare values, with double-click inline editing, removable sienna chips, and a key:value parser. Use it on the dashboard settings Overview form and the create-dashboard modal (replacing the comma-separated text field). The dashboard list item type adopts the per-user list DTO so rows carry the data the tag/pin features need. * feat(dashboards-v2): DSL search with key suggestions and tag filtering The search box now passes raw filter DSL straight through (parenthesized to keep its precedence isolated) instead of wrapping the term in name CONTAINS, so users can type name/tag/created_by clauses directly. A suggestions dropdown offers the reserved DSL keys plus the tag keys reported by the list endpoint. Adds a Tags filter chip (multi-select from the API's tags) alongside Created by / Updated. * feat(dashboards-v2): per-user dashboard pinning Replace the localStorage favorite star with backend per-user pinning. The row action pins/unpins via the v2 per-user endpoints (pin/unpin), refreshes the personalized list, and surfaces the 10-pin limit (HTTP 409) as a toast. Uses the Pin/PinOff icons. * feat(dashboards-v2): org-shared saved views via the views API Persist saved views through the backend Views API (list/create/update/delete) instead of localStorage, so they are shared across the org. A view stores the combined DSL query plus sort/order and folds into the search box on select. Wires the personalized list (pinned-aware), renames the 'Favorites' built-in to 'Pinned', renames the metadata popover to 'Columns', and polishes the views rail (active accent, left-aligned title). * refactor(dashboards-v2): group list utils under a utils/ folder Move filterQuery, dslSuggestions, views and the general helpers (plus their tests) into DashboardsListPageV2/utils/ so the page's growing set of non-component modules lives in one place; update import paths. No behavior change. * feat(dashboards-v2): retain tags across refetches + DSL keyboard nav Accumulate the tags reported by the list endpoint across refetches so previously- seen tags stay selectable in the Tags chip and DSL suggestions even when a filtered page omits them. The DSL suggestions dropdown is now keyboard-navigable (arrow keys + Enter, Escape to close) and renders as a seamless full-width panel attached to the input. * refactor(dashboards-v2): prefer @signozhq Button/Typography, polish views rail Replace raw <button>/<span> in the V2 list and tag input with @signozhq Button and Typography, and apply icon classes directly to the icon (no wrapper span). Switch the pin row to Pin/PinOff. Views rail: larger view-name font, 'Filter views by name' placeholder, and an editable tag chip using a flattened ghost Button. * chore(dashboards-v2): fix formatting in moved util files * refactor(dashboards-v2): use an enum for built-in view ids Replace the BuiltinViewId string-literal union with a TS enum (string values unchanged, so the URL view param stays compatible) and use its members across the view catalogue, snapshots, and the All-view check. * refactor(dashboards-v2): trim redundant tag-chip remove-button overrides Ghost background is already transparent and the hover colors are not needed; keep only the size overrides plus color:inherit so the close icon matches the chip sienna. * fix(dashboards-v2): don't open the dashboard when cancelling delete The confirm dialog renders through this component's contextHolder, which sits inside the row's click-to-open handler; React replays portal events up the tree, so the Cancel click bubbled to the row and navigated. Stop propagation on cancel. * fix(dashboards-v2): blend the views-rail delete action into the row Revert the delete action to a ghost icon that stays transparent over the row's hover background and only turns red on its own hover (the outlined variant broke the unified background), stop its click from selecting the view, and restore the content-driven row height so all rows stay uniform. * fix(dashboards-v2): overlay the views-rail delete instead of reserving space Absolutely position the delete action on the row's right edge (created views only) so it no longer takes flex space, and drop the --button-height:auto hack so the row keeps its natural height. pointer-events are gated so the hidden button can't intercept row clicks. * fix(dashboards-v2): align tag chip weight and fix remove-button hover Match the chip text weight to the list-row badge (normal, not medium) so the colour reads the same, and give the remove (×) a sienna-tinted hover instead of the Button's default grey. Resting × colour stays at the Button default. |
||
|
|
0711786701 |
fix(dashboards-v2): panel editor fixes + span-gaps Disconnect Values control (#11864)
* fix(dashboards-v2): disable panel types unsupported by the datasource
A new panel's builder is seeded with the kind's default signal, but
`spec.queries` stays empty until the query is modified — so the type
switcher saw an undefined datasource and never disabled incompatible
types (e.g. List on a metrics panel, which then breaks rendering).
Resolve the signal with a fallback to the kind's default signal so
compatibility is enforced from the first render.
* fix(dashboards-v2): place toolbar-created panels in the root section
The top-right "New Panel" button creates a panel with no section context,
which createPanelOps resolved to the LAST section instead of the root.
Fall back to the first (root) section when no valid index is given; still
create an untitled section when the dashboard has none.
* feat(dashboards-v2): add "Move out of section" panel action
The "Move to section" submenu only listed titled sections, so a panel
in a titled section couldn't be moved back to the untitled root. Add a
direct "Move out of section" action, shown when the panel sits in a
titled section and an untitled root section exists to receive it.
* fix(dashboards-v2): allow clearing the threshold value input
The threshold "Value" field was a controlled numeric input, so an
emptied field snapped back to 0 (Number("") is 0, not NaN) and the
seeded 0 could never be removed. Hold a local string so the field can
be cleared and edited; shared by all threshold row variants.
* feat(dashboards-v2): redesign span-gaps as a "Disconnect values" control
Replace the raw seconds input with a Never/Threshold toggle plus a
duration "Threshold value" field. The threshold is stored verbatim as a
duration string ("10m", "5s") — the wire format the backend expects — and
parsed back to seconds only for rendering and validation. Threads the
query step interval through the config pane to seed/floor the threshold,
and rejects invalid or below-step-interval entries inline (V1 parity).
* refactor(dashboards-v2): rename Formatting section to "Formatting & Units"
Serialize section header test ids (lowercase, spaces → dashes) so a
multi-word title doesn't break the data-testid, and update the test.
* chore(dashboards-v2): tidy panel-editor query helpers
- useLegendSeries: drop redundant optional chaining on panel.spec.
- Remove the unused getPanelKindLabel util.
* chore: pr review changes
* chore: fmt fix
* feat(dashboards-v2): deterministic panel capability guard (type × query-type × signal) (#11865)
* feat(dashboards-v2): add a panel capability guard
Centralize "what works with what" for V2 dashboard panels into one
deterministic guard. Each panel kind declares its supported query types and
optional query-builder field rules alongside its existing supported signals; a
pure `capabilities` module reads the panel registry to answer panel x
query-type x signal validity, coerce an unsupported query type, and resolve the
query-builder fields a kind hides.
`supportedQueryTypes` is required, so the registry's mapped type forces every
present and future kind to declare it. This re-homes the panel->query-type
compatibility that V2 previously imported from V1's NewWidget/utils into V2 land.
No behavior change: no consumer is wired to the guard yet.
* feat(dashboards-v2): gate the panel editor through the capability guard
Route the panel editor's query builder and visualization type switcher through
the capability guard instead of V1's PANEL_TYPE_TO_QUERY_TYPES (now no longer
imported by any V2 file):
- PanelEditorQueryBuilder is keyed on PanelKind; its query-type tabs and
query-builder field visibility come from the guard.
- Switching the panel kind coerces the active query type via the guard.
- The visualization type switcher disables a kind when the active query type or
datasource is incompatible with it (e.g. List under ClickHouse/PromQL, or List
with a metrics query). The live query type is read from the query-builder
provider so a not-yet-staged new panel still gates correctly, and a tooltip
explains why a type is disabled. ConfigSelect gains opt-in per-option tooltips.
* chore: pr review changes
* chore: lint fix
|
||
|
|
aeda0a5144 |
refactor(authz): fixes on error feedback (#11901)
* refactor(authz): ensure all error messages matches with api * refactor(roles): little fixes on UI |
||
|
|
b71c49d01f |
docs: refresh README with current SigNoz offerings and features (#11595)
* docs: refresh README * docs: update README Noz section * docs: add Foundry to README self-host path * docs: add README feature docs links * docs: refine README links and badges * docs: fix README LinkedIn badge link * docs: update README instrumentation links * docs: emphasize README contribution help * docs: link Noz docs in README |
||
|
|
570bc0aef1 |
feat(dashboards-v2): switch panel visualization type in the editor (#11820)
* refactor(dashboards-v2): extend ConfigSelect for the type switcher Allow ConfigSelect items to carry an arbitrary icon node and a disabled flag, and align the ConfigSegmented styling — the building blocks the panel-type switcher needs. * feat(dashboards-v2): add panel-type switch logic Add getSwitchedPluginSpec (a reversible per-kind plugin-spec transform) and the usePanelTypeSwitch hook that rebuilds the builder query and spec when the panel kind changes, guarding null queries. * feat(dashboards-v2): add the PanelTypeSwitcher control A ConfigSelect-based control listing the panel kinds, disabling types whose supported signals exclude the current datasource. * refactor(dashboards-v2): component-based icons in the panel-type modal Store icon components (not pre-rendered elements) in PANEL_TYPES so each consumer controls sizing; rename constants.tsx to constants.ts now that it holds no JSX. * feat(dashboards-v2): wire the type switcher into the config pane Render the switcher in the Visualization section, forward the panel kind + datasource signal + switch handler through SectionSlot/registry, and declare a Visualization section on every panel kind. * feat(dashboards-v2): reuse findFreeSlot for panel clone placement Clone now places the copy beside the last row when it fits, else wraps to a fresh row at the section bottom — matching the new-panel save path instead of always starting a new row. * style(dashboards-v2): format getSwitchedPluginSpec test with oxfmt Wrap the long getSwitchedPluginSpec(...) calls so the file passes `oxfmt --check` (the fmt / js CI gate). Formatting only, no behavior change. * chore: pr review changes * refactor(dashboards-v2): make SectionKind a real enum Replace the SectionKind string-literal union and the SECTION_KIND const object with a TypeScript enum. SectionSpecMap, SectionControls, SECTION_METADATA and the section registry are keyed by enum members (computed keys), and every section-kind site (kind configs, section editors, buildDefaultPluginSpec, getSwitchedPluginSpec) references SectionKind.* instead of bare string literals. * refactor(dashboards-v2): drop dead queries null-handling panel.spec.queries is a required DashboardtypesQueryDTO[], so the defensive `|| []` / `?? null` / optional-chaining and the dead getBuilderQueries/toQueryEnvelopes guards were no-ops. Remove them across the V2 dashboard: renderers, config pane, panel-type switch, query sync, perses adapters, panel-query hook, and the query-range builder. Also applies the same cleanup in usePanelEditorQuerySync and persesQueryAdapters (missed by the first pass), and seeds the now-required `queries` field in the ListPanel renderer test fixture. |
||
|
|
a22e7b7b16 |
test(trace-details): add E2E coverage for Trace Details (#11846)
* feat(trace-details): move no-data component from v2 code to v3 before v2 cleanup * feat(trace-details): move span logs out from v2 to v3 before cleanup * feat(trace-details): move events out from v2 to v3 before cleanup * feat(trace-details): remove usage of getTraceV2 from V3 code * fix(trace-details): fix serviceName path in trace funnel * feat(trace-details): remove Trace Details V2 page and its module import * feat(trace-details): remove unused trace details v2 code * feat(trace-details): fix failing test * test(trace-details): add e2e helper and large-trace fixture * test(trace-details): add flamegraph e2e + canvas test hook * test(trace-details): add waterfall e2e + row instrumentation * test(trace-details): add highlight-errors filter e2e * test(trace-details): add analytics panel e2e * test(trace-details): add span details drawer e2e * test(trace-details): add preview-fields hover card e2e * test(trace-details): minor refactor * test(trace-details): add common helpers * test(trace-details): use playwright context instead of browser * test(trace-details): add pinned side nav logic * test(trace-details): remove tests which could go as unit or integration * test(trace-details): remove tests and renumber |
||
|
|
fc83f91058 |
feat(invite-members): add reusable component for invite members (#11872)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(invite-members): add hook for invite members component * feat(invite-members): add component to handle invite member logic * test(invite-members): add tests for the component |
||
|
|
0d47f02100 |
fix(authz): validate transactionGroups in UpdateRole like CreateRole (#11898)
UpdatableRole.UnmarshalJSON unmarshalled transactionGroups directly into the slice, bypassing the verb/resource/kind/selector validation that CreateRole applies via NewTransactionGroups. Parse the field through NewTransactionGroups so update enforces the same constraints, while keeping transactionGroups required (omitted/null still rejected). |
||
|
|
810bf5d9a0 |
fix(notification-channels): edit not persisting any information (#11888)
* fix(edit-alerts): not persisting any information on save * refactor(channels-edit): use matchPath instead of regex |
||
|
|
7d8a00ab8c |
fix(uplotV2): tooltip list clips last row and over-scrolls (#11883)
Some checks failed
build-staging / staging (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
The Virtuoso scroller height was set to min(totalListHeight, 300), but the scroll viewport adds 8px top + 8px bottom padding that totalListHeight does not account for. The box was therefore ~16px shorter than its content, clipping the last row and showing a scrollbar even when every row would fit. Add the viewport's vertical padding back into the computed height so it only scrolls once content genuinely exceeds the max height. |
||
|
|
348fca1b62 |
feat(llm-pricing): listing page + table (2/5) (#11760)
* feat(llm-pricing): add model pricing foundation (route, permission, page shell) * feat(llm-pricing): add listing page and table * chore(llm-pricing): drop search + source filters from list request The list API does not honour the q (search) and source params yet, so the controls did nothing. Remove the search input and source dropdown along with the params we sent, and trim useModelPricingFilters to the URL-backed page state that pagination still needs. Currency dropdown, tabs, table and pagination are unchanged. Filters will return once the backend supports them. * refactor(llm-pricing): extract getRelativeTime helper in utils Pull the relative-time formatting out of getRelativeLastSeen into a small local getRelativeTime helper. Kept feature-local (not in the shared utils/timeUtils) so the LLM pricing module owns its own dayjs config; the local relativeTime extend stays for test self-sufficiency. * refactor(llm-pricing): drop dead NaN guard in formatPricePerMillion Pricing fields are typed as required numbers and JSON can't carry NaN, so Number.isNaN was unreachable. Keep the null/undefined guard as API defensiveness (toFixed on a missing value would crash the row). Also trims the now-redundant dayjs.extend comment. * refactor(llm-pricing): centralize constants and shared types Extract PAGE_SIZE, PAGE_KEY, COLUMN_COUNT and CURRENCY_OPTIONS into a new constants.ts, and move the ModelPricingFilters contract into types.ts. Component prop interfaces stay colocated with their components, matching the convention in the drawer PR. * refactor(llm-pricing): use nuqs for list pagination URL state Replace the hand-rolled useHistory + URLSearchParams plumbing in useModelPricingFilters with nuqs useQueryState, matching the convention used by the dashboards, alerts and k8s list pages. Behaviour is unchanged: parseAsInteger.withDefault(1) keeps ?page=1 out of the URL and history:'replace' avoids polluting the back-stack. * refactor(llm-pricing): inline pagination, drop useModelPricingFilters The hook had shrunk to a one-line nuqs wrapper after search/source were removed, so inline the useQueryState call into the container and remove the hook file plus the now-unused ModelPricingFilters type. When the filters return (once the API honours them) they can move back into a dedicated hook. * feat(llm-pricing): disable currency selector (USD-only for now) Only USD is priced today, so render the currency SelectSimple in a disabled state pinned to USD. A disabled select can't fire onChange, so the currency useState is dead — drop it (and the now-unused useState import). * refactor(llm-pricing): render model costs inside its tab + tab URL param The listing was rendered outside the Tabs, so the tab was decorative. Move all model-cost content (currency control, list query, table, pagination, footer) into a ModelCostsTab component rendered as the 'Model costs' tab's children, and drive the active tab from a 'tab' URL query param (nuqs). The container is now just the page shell. Unpriced models stays a disabled placeholder for a later PR. * style(llm-pricing): target @signozhq table slots, drop dead antd/leftover rules The component uses @signozhq/ui Table/Tabs (Radix-based), not antd, so the .ant-table-* and .ant-tabs-nav selectors never matched — the intended uppercase/muted header styling wasn't applied. Retarget header/cell rules to [data-slot='table-head'|'table-cell'] (no !important needed). Also remove dead rules left over from the removed search/source/add UI (.filters-bar__search, __source, __add, .page-header__actions) and the unused .source-badge--auto/ --override modifiers. * fix(llm-pricing): constrain currency dropdown width, drop tab URL param - Currency SelectSimple stretched to fill the filters bar; give it a fixed 160px width (min-width couldn't cap the trigger). - Model costs is the only enabled tab for now, so use Tabs defaultValue instead of a URL-backed param. Removes the nuqs tab state plus the now-unused TAB_KEYS/TAB_QUERY_KEY constants and TabKey type. * chore: self review changes * fix: add skeleton loading * refactor: self review changes * refactor: initial prop * fix: update styling * fix: add comments in utils * fix: route thing * refactor: migrate to css moduel * refactor: migrate to css module * refactor: migrate to tanstack table * docs: clarify price precision comment * chore: remove comment * refactor: shell * fix: add key to route * feat: add flags * chore: additional refactor * chore: add commet in utis * refactor: types and other things * refactor: types and other things * refactor: update routes * chore: remove usd selector for now * fix: layout shift * refactor: styles * refactor: typography component * refactor: more changes * refactor: typograhy * chore: sync table * chore: remove extra comment * chore: use typograpgy test in table config * fix: llm pricing listing * fix: update missing styles * chore: update edit and delete options * chore: remove divider --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
83e0e974fe | fix: include query metadata in alert edit and new contexts (#11891) | ||
|
|
10217274b8 | fix(render): add missing Content-Type header in Error() response (#11890) | ||
|
|
7c3ac5b221 |
chore: json tags for error struct (#11886)
* chore: json tags for error struct * fix: udpate unit tests |
||
|
|
c1d40d7359 |
fix: schema fixes based on UI and MCP integration review (#11718)
* fix: change schema properties based on UI integration review * fix: check that panels referred in layouts exist * chore: extract out validate panels method * test: add test for missing spec prefix in layout * fix: reject dashbaords that have vars with the same name * fix: add additional error info on patch application error * fix: add validations to list variable that text variable has * fix: replicate text variable spec in signoz to make name required * chore: replicate variable.sort into signoz * chore: remove unsupported enum values (causing errors right now) * chore: fix variable sort type errors * fix: add back enum values * fix: reject single-element list default when allowMultiple is false in list variables * fix: remove unused import * fix: make display required * chore: make queries non-nullable * fix: properly define default value and datasource plugin spec's api specs * fix: promote variable defaultValue to a named oneOf component The list variable defaultValue was an inline string | []string oneOf, which downstream codegen can't canonicalize: tfplugingen-openapi rejects the inline scalar-or-array multi-type, and oapi-codegen has no named type to attach the union's Marshal/UnmarshalJSON to. Shape the vendored variable.DefaultValue as the named VariableDefaultValue oneOf via a reflector InterceptSchema hook and let defaultValue $ref it, instead of overriding the property inline. Regenerate the OpenAPI spec and frontend client accordingly. * refactor: move VariableDefaultValue oneOf into dashboardtypes Define VariableDefaultValue in dashboardtypes as a subclass of the perses variable.DefaultValue and attach the string | []string oneOf via its own PrepareJSONSchema, instead of shaping the perses type from an openapi.go InterceptSchema hook. This keeps the union's schema next to its type. The named component is now DashboardtypesVariableDefaultValue; regenerate the OpenAPI spec and frontend client accordingly. --------- Co-authored-by: Ashwin Bhatkal <ashwin96@gmail.com> Co-authored-by: grandwizard28 <vibhupandey28@gmail.com> |
||
|
|
c5c1913f97 |
fix(querier): pad clamped time range for trace_id-filtered logs (#11800)
* fix(querier): pad clamped time range for trace_id-filtered logs * chore: use a struct instead * chore: more cleanup |
||
|
|
5ab6636863 |
feat: add api to fetch v2 dashboards for a metric name (#11784)
* feat: add api to fetch v2 dashboards for a metric name * chore: switch to query param * chore: generate API specs * chore: use proper struct in return type of GetByMetricNamesV2 * chore: add method for escaping like patterns in sqlstore formatter * fix: use only one db call in GetByMetricNamesV2 * chore: dont use type alias for list of references |
||
|
|
3680cc7779 |
refactor(trace-details): remove dead Trace Details V2 code (#11805)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(trace-details): move no-data component from v2 code to v3 before v2 cleanup * feat(trace-details): move span logs out from v2 to v3 before cleanup * feat(trace-details): move events out from v2 to v3 before cleanup * feat(trace-details): remove usage of getTraceV2 from V3 code * fix(trace-details): fix serviceName path in trace funnel * feat(trace-details): remove Trace Details V2 page and its module import * feat(trace-details): remove unused trace details v2 code * feat(trace-details): fix failing test |
||
|
|
7cfedc46c4 |
refactor(trace-details): migrate SpanLogs/Events/NoData + funnel to V3 (pre-V2-cleanup) (#11855)
* feat(trace-details): move no-data component from v2 code to v3 before v2 cleanup * feat(trace-details): move span logs out from v2 to v3 before cleanup * feat(trace-details): move events out from v2 to v3 before cleanup * feat(trace-details): remove usage of getTraceV2 from V3 code * fix(trace-details): fix serviceName path in trace funnel * feat(trace-details): move no-data component from v2 code to v3 before v2 cleanup * feat(trace-details): move span logs out from v2 to v3 before cleanup * feat(trace-details): move events out from v2 to v3 before cleanup * feat(trace-details): remove usage of getTraceV2 from V3 code * fix(trace-details): fix serviceName path in trace funnel * feat(trace-details): fix css style conventions * feat(trace-details): events code refactor * feat(trace-details): fix tests |
||
|
|
69ba25d82e |
feat(llm-pricing): foundation — route, permission & page shell (1/5) (#11750)
* feat(llm-pricing): add model pricing foundation (route, permission, page shell) * refactor: migrate to css moduel * refactor: shell * fix: add key to route * feat: add flags * refactor: update routes --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
e42159f257 |
feat: enhance context picker with empty state handling and prefill functionality (#11869)
* feat: enhance context picker with empty state handling and prefill functionality * feat: implement empty state CTA styling and testing for context picker |
||
|
|
1e887dc9c9 |
chore(e2eci): source Playwright browsers from official image (#11789)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* chore(e2eci): source Playwright browsers from official image Replace the runtime `pnpm playwright install` (which fetches browser binaries from the Playwright CDN and intermittently times out) with a copy out of the official `mcr.microsoft.com/playwright:v1.57.0-noble` image. The job stays on ubuntu-latest so the testcontainers-based backend bring-up is untouched; only OS deps are still installed via apt (`install-deps`), which does not hit the flaky CDN. Bump @playwright/test from the 1.57.0 alpha to stable 1.57.0 so the client version matches the image tag (browser builds line up). Closes #11772 * fix(e2e): open panel ⋮ menu via click, not hover (#11881) |
||
|
|
7646aabb2b |
fix(member-settings): sidenav button not redirecting to correct invite members modal (#11871)
Some checks failed
build-staging / prepare (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
|
||
|
|
18851afb6d | refactor(onboarding): drop old page (#11860) | ||
|
|
d5221a6ff3 |
feat(metrics): add per-metric label-reduction rules (#11849)
* chore(metric-reduction): scaffold metric volume control API (types, routes, stubs) * chore: generate spec * chore: fix required and generate frontend types * chore(metric-reduction): add module implementation (#11857) |
||
|
|
19712c3579 |
feat(authdomain): support custom roles in SSO group mapping (#11858)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(authdomain): support custom roles in SSO group mapping Role mappings now reference SigNoz roles by name (custom or managed) instead of the legacy ADMIN/EDITOR/VIEWER enum. Legacy values sent by a client are normalized to their managed names (signoz-admin/editor/viewer), and a migration normalizes existing stored mappings. - normalize legacy role names on unmarshal; resolve all matched roles on SSO callback (union of matched groups, else default, else viewer) - validate referenced roles exist on auth domain create/update - block deleting a role referenced by any auth domain mapping, naming the referencing domains (OnBeforeRoleDelete now also passes the role name) - migration 096 to rewrite legacy names in existing auth_domain mappings * refactor(sqlmigration): decode SSO role mapping into a typed struct Decode the roleMapping object into a small frozen struct instead of poking at json.RawMessage per field. The top-level config stays a raw map so the other config fields are preserved untouched. * fix(authdomain): validate SSO role attribute claim against existing roles When the role mapping uses the IDP role attribute, the claimed role is assigned only if it exists in the org (resolved case-insensitively, with legacy ADMIN/EDITOR/VIEWER mapped to their managed names); otherwise the mapping falls through to group mappings and the default role. This lets custom roles be assigned via the attribute and avoids failing login on an unknown claim. Also normalize legacy role names case-insensitively and fold the single-use managed-role lookup into NormalizeRoleName. |
||
|
|
e31683be11 |
fix(metrics-explorer): resolve pagination overlap in table (#11812)
* fix: resolve pagination overlap in metrics explorer table * fix: add padding-bottom to metrics table container per review feedback |
||
|
|
1700ad06e6 |
chore: refactor error response + normalize ClickHouse telemetrystore errors (#11740)
* chore: mark required and nullable in json tag, renamed methods, and added more functionality * fix: unit test * fix: cast clickhouse exceptions * fix: go mod tidy * fix: telemetrystore now returns explicit base errors * fix: typo * fix: added all changes * fix: added nil check * fix: update test files * fix: addressed comments * fix: change errors and suggestions to be non-nullable |
||
|
|
ee3b45b80d |
feat(statsreporter): track role counts (#11866)
Register the authz provider as a stats collector and emit per-org role counts (role.count, role.custom.count, role.managed.count) using the same dynamic key pattern as authdomain. |
||
|
|
4771e30c03 | fix(keyboard-shortcut): monaco-editor should not trigger shortcut (#11848) | ||
|
|
e933fa74c7 |
feat(querybuilder): type untyped value fields in v5 openapi schema (#11850)
* feat(querybuilder): type untyped value fields in v5 openapi schema
The query-builder v5 types FunctionArg, VariableItem and Label carry a
`Value any` field that the reflector rendered as an untyped `{}` in the
OpenAPI spec, and QueryEnvelope left an untyped `spec: {}` on its oneOf
base. Add PrepareJSONSchema methods that document the real wire contract:
- FunctionArg.value -> oneOf [number, string]
- VariableItem.value -> oneOf [string, number, boolean, array<scalar>]
- Label.value -> oneOf [string, number, boolean]
- QueryEnvelope -> drop the duplicate base properties so only the
typed oneOf-of-$ref variants remain
The Go fields stay `any`; this only shapes the generated schema, so the
runtime decode paths and the existing wire format are unchanged.
* chore(api): regenerate openapi spec and frontend client
Regenerates docs/api/openapi.yml (`generate openapi`) and the orval
frontend client (`generate:api`) for the v5 schema typing. The four
value/spec fields are now typed instead of untyped `{}`, and the
QueryEnvelope DTO collapses from a union of `& { spec?: unknown }`
intersections into a clean discriminated union.
* feat(querybuilder): expose builder_join variant and nullable variable value
- Uncomment the QueryEnvelope builder_join variant so the discriminated
union includes joins (the runtime UnmarshalJSON already decodes them),
and type QueryBuilderJoin.aggregations (a []any holding trace/log/metric
aggregations) as a oneOf of the concrete aggregation schemas instead of
an untyped {}.
- Mark VariableItem.value nullable: the frontend sends null for a dynamic
variable whose "ALL" option is selected.
Go field types are unchanged; this only shapes the generated schema.
* chore(api): regenerate spec and frontend client for join + nullable value
Regenerates docs/api/openapi.yml and the orval frontend client. The
QueryEnvelope union gains the builder_join variant (with typed
aggregations), and VariableItem.value is now string | number | boolean |
array | null.
* refactor(querybuilder): extract join aggregations into a named JoinAggregation
The previous inline `items.oneOf` on QueryBuilderJoin.aggregations isn't
mappable by code generators — tfplugingen-openapi rejects a oneOf buried
inline in array items ("schema composition is currently not supported"),
and skaff's detectOneOfRewrites only rewrites top-level component schemas.
Introduce a named JoinAggregation element type exposing the trace/log/metric
shapes via JSONSchemaOneOf, so the schema becomes a named oneOf-of-$ref
component (which generators flatten into one object with three optional
sub-objects) instead of an inline union. The runtime value stays opaque and
the wire shape is unchanged via transparent Marshal/UnmarshalJSON.
* chore(api): regenerate spec and frontend client for JoinAggregation
QueryBuilderJoin.aggregations items now reference the named
Querybuildertypesv5JoinAggregation oneOf component.
* feat(querybuilder): add an OpenAPI discriminator to the QueryEnvelope union
Collapse the three signal-specific builder_query schema variants into a single
queryEnvelopeBuilder whose aggregations are a trace/log/metric union
(BuilderAggregation), so `type` maps 1:1 to one variant. Tag QueryEnvelope with
x-signoz-discriminator (propertyName: type); attachDiscriminators promotes it to
a real OpenAPI 3 discriminator so oapi-codegen emits ValueByDiscriminator and
generated clients can dispatch the union mechanically.
Runtime decoding is unchanged — UnmarshalJSON still dispatches builder queries
by signal. The generated frontend client and its dashboard-v2 consumers need a
follow-up to adopt the discriminated union.
* chore(api): regenerate openapi spec for the QueryEnvelope discriminator
Frontend client regeneration is deferred to the follow-up that adapts the
dashboard-v2 query consumers to the discriminated union.
* chore(api): regenerate frontend client for the QueryEnvelope discriminator
Matches the discriminator added in
|
||
|
|
853397a79e |
feat(dashboards-v2): create new panels from the editor (#11777)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* 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): drop the unsupported-panel fallback
Every panel kind now has a renderer, so the "not yet supported in V2"
body is dead. Remove UnsupportedPanelBody and render the panel body
behind a plain `panelDefinition &&` guard. Also clean up the panel-kind
typing in Panel.tsx: `spec.plugin.kind` is non-optional and already a
PanelKind, so the `as unknown as` cast and `?.` chains go away.
* refactor(dashboards-v2): tighten the getPanelDefinition cast
Drop the dead `if (!kind)` guard (a partial registry already returns
undefined for absent keys) and reduce the `as unknown as` double-cast to
a single `as` — comparability clears it, so the unknown laundering was
unnecessary.
* refactor(dashboards-v2): narrow renderer props to the panel kind
PanelRendererProps<K> now carries a `panel` narrowed to kind K (via a
PluginOfKind helper that picks the variant from the generated plugin
union), so each renderer reads `panel.spec.plugin.spec` as its exact spec
DTO. Removes the per-renderer `as <Kind>SpecDTO` cast (and the now-dead
`?? {}` fallbacks) across all seven renderers; the single unavoidable
widening stays in getPanelDefinition.
* feat(dashboards-v2): create new panels from the editor
Add a draft-first create flow: picking a panel type opens the editor at
`/panel/new?panelKind=…&layoutIndex=…` on an in-memory default panel, and
nothing is persisted until save — cancelling leaves the dashboard
untouched (V1 parity). On save a new panel is minted (uuid) and added to
the target section via `createPanelOps` (resolves the section, or creates
one when the dashboard has none).
All "Add panel" triggers (section header, empty section, empty dashboard,
toolbar) route through a single useCreatePanel hook + the V2 type picker;
the leftover V1 global modal and useAddPanelToSection are removed.
New panels seed sensible defaults from the kind's supported signals: the
query datasource (e.g. List → logs, not the unsupported metrics default)
and, for List, the signal's default columns — so the Columns control
isn't empty on first open. New panels always re-serialize their query for
the kind on save, so the persisted query is valid even if untouched.
echo "--- working tree after commits (should be only dev hack) ---"; git status --short
* fix(dashboards-v2): place a new panel in the last row's free space
createPanelOps placed every new panel at x:0 on a fresh row, so a half-full
last row left its right half empty. Find the first free slot in the section's
last row (right of its panels) and only wrap to a new row when it can't fit.
* fix(uplot): center a single-item chart legend
isSingleRow read the container width from a ref inside useMemo, so it computed
once at mount (ref still null → width 0 → false) and only recovered if the
component happened to re-render. The uPlot legend re-renders on plot sync so it
recovered by luck; the Pie legend doesn't, leaving a single item clipped in a
narrow grid track. Measure the container with useResizeObserver instead.
* feat(dashboards-v2): unified panel empty, no-data and no-query states
Add a shared PanelMessage component (icon + title + description + optional
action) backing every non-chart panel state. PanelBody now shows a 'Nothing to
visualize yet' state for panels with no runnable query and a polished error
state with Retry. NoData becomes a 'No data in this time range' affordance with
an optional Retry, wired through a new optional refetch on the renderer props.
* fix(dashboards-v2): derive the preview "Plotted with" tag from the panel query
The editor preview hardcoded EQueryType.QUERY_BUILDER, so PromQL/ClickHouse
panels were mislabelled and list panels still showed the tag. Add a V2 PlotTag
(mirroring V1: hidden for list panels and before a query exists) fed by a new
getPanelQueryType util that reads the panel's V5 envelopes.
* feat(dashboards-v2): panel header title with description tooltip
Replace PanelHeader's ReactNode title with explicit name + description props,
rendering the description as an info-icon tooltip in the header instead of a
wrapper around the title. Panel passes them directly (no headerTitle memo).
* refactor(dashboards-v2): let consumers own the refetch loader signal
usePanelQuery returns the raw react-query isLoading; the dashboard panel and the
editor preview now compute isLoading || isFetching themselves, so each surface
decides whether a background refetch shows the full loader.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(dashboards-v2): default a threshold's label to an empty string on save
* feat(dashboards-v2): show the panel header in the editor preview
Reuse PanelHeader in PreviewPane so the editor preview shows the panel
title, description tooltip, refetch spinner, and error/warning indicators,
with the body rendered flush beneath it like the dashboard grid panel.
Add a hideActions flag to PanelHeader to suppress the actions menu in the
editor: View/Edit/Clone/Delete don't apply there, and omitting panelActions
alone isn't enough since View/Edit/Download survive their own gates. Wire the
table/list header search through the preview as the grid does, and thread the
raw isFetching for the header's refetch spinner.
* feat(dashboards-v2): seed new panels with per-kind config defaults
A new panel was seeded with an empty plugin spec, so the config pane's
dropdowns and segmented controls (time scope, legend position, line style /
interpolation, fill mode) opened with nothing selected.
Derive a default plugin spec from each kind's declared sections via a new pure
buildDefaultPluginSpec helper and seed it in createDefaultPanel. Each default
equals the matching renderer fallback, so only the config-pane display changes,
not the rendered output. Controls whose empty state already reads as the chart
default (unit/decimals "auto", switches, numeric "Auto" inputs) are left unset.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(dashboards-v2): preserve list columns across datasource round-trips
The List panel stores a single selectFields list, so switching the query
signal replaced the columns with the new datasource's defaults — going
logs -> traces -> logs discarded a customized logs selection.
Remember each signal's columns and restore them when switching back;
defaults still seed a signal the first time it's seen.
* docs(dashboards-v2): trim verbose comments to minimal-why style
Condense multi-paragraph block comments and drop comments that restate
the code across the new-panel editor surface, keeping only the non-obvious
"why" and concise JSDoc on functions and type fields. Comment-only — no
code, types, or test assertions changed.
* fix(dashboards-v2): show resource attributes like service.name in trace list panels
The List renderer only flattened nested resource/attribute maps for logs, so a
selected resource field such as service.name (nested under resources_string)
rendered N/A for traces even though the same data shows in V1. Flatten traces too.
* feat(dashboards-v2): open new List panels on a runnable logs query (V1 parity)
A new List panel opened blank: its seed query had an empty orderBy and lived only
in the builder, so the preview didn't run on open. Seed spec.queries at creation
with the V1 list logs query (orderBy timestamp desc) so the panel opens on logs,
pre-sorted, and the preview runs immediately; wire up useSeedNewListColumns so its
default columns (timestamp, body) are populated too. Switching to traces is handled
by the builder's list-view path.
* fix(dashboards-v2): drop all config-pane sections from the List panel
List columns are edited below the query builder, and Context Links isn't wanted in
the config pane, so the List panel now declares no config-pane sections.
* refactor(dashboards-v2): address PR review feedback
- getPanelDefinition: make PanelRegistry total over PanelKind so it never
returns undefined (a missing kind is now a compile error)
- toQueryEnvelopes/hasRunnableQueries: accept `... | null` and drop the
`?? []` at call sites
- consolidate panel loading to a single `isFetching` signal (Panel,
PreviewPane, PanelEditor)
- rename defaultDataSource -> signal; use TelemetrytypesSignalDTO enum for
the List default columns
- useCreatePanel now owns the panel-type picker state, deduping the three
add-panel triggers; rename pluginKind -> panelKind
- LabelThresholdRow: extract onSave into a callback; ThresholdsSection test
uses userEvent
- PreviewPane: drop the optional chaining on the required display field
- trim over-verbose comments
* refactor(dashboards-v2): type panel signals as TelemetrytypesSignalDTO
Replace the query-builder `DataSource` enum with `TelemetrytypesSignalDTO`
across the panel signal plumbing — the panel definitions' `supportedSignals`,
the List columns editor/suggestions/defaults, and the editor query-sync and
column-seeding hooks — and make the signal non-optional where a panel always
resolves one. Drops the now-dead `DataSource` imports.
* chore: pr review changes
* chore: pr review changes
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
bd526df11d |
feat(roles): rework the create/update pages (#11815)
* fix(styles): little fix for callout I will upstream this fix eventually * fix(settings): ensure tab content can use height: 100% We will need this fix for the create/edit role page later during json mode * refactor(authz): define the verbs that supports selectorId * refactor(roles): drop old components We will rewrite them * refactor(roles): use css modules on role settings * refactor(roles): rewrite delete role modal to use dialog component * feat(roles): add initial type files * feat(error-in-place): add testId to allow assert on future tests * refactor(permission-denied-full-page): change the wording a little bit to match the API This change was requested by Vikrant * feat(service-account-drawer): add copy button for ID Suggested by https://github.com/SigNoz/platform-pod/issues/2529#issuecomment-4776975323 * fix(service-account-drawer): not validating the permissions correctly for read/update Found at https://github.com/SigNoz/platform-pod/issues/2529#issuecomment-4776975323 * feat(timezone): add little helper to allow format optional dates * refactor(authz): export parse permission to get objectId when needed * test(authz): add helper to grant by prefix * test(test-utils): include tooltip provider * feat(hooks): add hook to block navigation via history * feat(roles): add hook to map API interface to own interface for easier integration * feat(roles): add hook to fetch role permissions * feat(roles): add config object around how to define each section for each resource * feat(roles): add config for monaco when showing json * feat(view-roles): add selected ids component * feat(view-roles): add component row to render selected roles * feat(view-roles): add card component to render each resource selected * feat(view-roles): add overview component to view roles * feat(view-roles): add readonly json viewer * feat(view-roles): add view role page * test(view-roles): add tests for view roles * feat(create-edit-roles): add hook for form validation * feat(create-edit-roles): add hook for unsaved changes * feat(create-edit-roles): add hook for generic logic for create-edit * feat(create-edit-roles): add component to render json * feat(create-edit-roles): add component to add new selectors for a permission * feat(create-edit-roles): add component to select scopes of a permission * feat(create-edit-roles): add component render resources to be selected * feat(create-edit-roles): add component render permission editor * feat(create-edit-roles): add page to create/edit roles * test(create-edit-roles): add tests for page and subcomponents * feat(list-roles): refactor to css modules & add row click to open view role page * fix(list-roles): change description when feature gate is disabled * refactor(roles): removed action labels and use function instead * refactor(authz): add todo about permission.config * feat(roles): add routes for create/edit/view * test(service-account): update missing tests * fix(pr): address comments * fix(pr): rename suffix of hooks from callbacks to actions * fix(pr): remove all usages of getByText * test(use-navigation-blocker): fix test |
||
|
|
8ac07d3d37 |
feat(infra-monitoring): v2 onboarding/checks api (#11104)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* chore: baseline setup * chore: endpoint detail update * chore: added logic for hosts v3 api * fix: bug fix * chore: disk usage * chore: added validate function * chore: added some unit tests * chore: return status as a string * chore: yarn generate api * chore: removed isSendingK8sAgentsMetricsCode * chore: moved funcs * chore: added validation on order by * chore: added pods list logic * chore: updated openapi yml * chore: updated spec * chore: pods api meta start time * chore: nil pointer check * chore: nil pointer dereference fix in req.Filter * chore: added temporalities of metrics * chore: added pods metrics temporality * chore: unified composite key function * chore: code improvements * chore: added pods list api updates * chore: hostStatusNone added for clarity that this field can be left empty as well in payload * chore: yarn generate api * chore: return errors from getMetadata and lint fix * chore: return errors from getMetadata and lint fix * chore: added hostName logic * chore: modified getMetadata query * chore: add type for response and files rearrange * chore: warnings added passing from queryResponse warning to host lists response struct * chore: added better metrics existence check * chore: added a TODO remark * chore: added required metrics check * chore: distributed samples table to local table change for get metadata * chore: frontend fix * chore: endpoint correction * chore: endpoint modification openapi * chore: escape backtick to prevent sql injection * chore: rearrage * chore: improvements * chore: validate order by to validate function * chore: improved description * chore: added TODOs and made filterByStatus a part of filter struct * chore: ignore empty string hosts in get active hosts * feat(infra-monitoring): v2 hosts list - return counts of active & inactive hosts for custom group by attributes (#10956) * chore: add functionality for showing active and inactive counts in custom group by * chore: bug fix * chore: added subquery for active and total count * chore: ignore empty string hosts in get active hosts * fix: sinceUnixMilli for determining active hosts compute once per request * chore: refactor code * chore: rename HostsList -> ListHosts * chore: rearrangement * chore: inframonitoring types renaming * chore: added types package * chore: file structure further breakdown for clarity * chore: comments correction * chore: removed temporalities * chore: pods code restructuring * chore: comments resolve * chore: added json tag required: true * chore: removed pod metric temporalities * chore: removed internal server error * chore: added status unauthorized * chore: remove a defensive nil map check, the function ensure non-nil map when err nil * chore: cleanup and rename * chore: make sort stable in case of tiebreaker by comparing composite group by keys * chore: added types and constants * chore: added specs for all component types * chore: added attrs presence check function * chore: added onboarding splits * chore: regen api client for inframonitoring Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore: added required tags * chore: added support for pod phase unknown * chore: removed pods - order by phase * chore: improved api description to document -1 as no data in numeric fields * fix: rebase fixes * chore: added onboarding api * chore: renamed method * chore: get onboarding spec * chore: simplify * chore: readability improvement * chore: added a note from otel * chore: added a note from otel * feat(infra-monitoring): v2 pods list apis - phase counts when custom grouping (#11088) * chore: added phase counts feature * chore: added queries for pod phase counts in custom group by * chore: added unknown phase count * fix: isPodUIDInGroupBy in buildPodRecords * chore: 3 cte --> 2 cte * chore: pod phase with local table of time series as counts * chore: comment correction * chore: corrected comment * chore: value column for samples table added * chore: removed query G for phase counts * chore: rename variable * chore: added PodPhaseNum constants to types * chore: updated comment * chore: onboarding specs updated to match v2 infra-monitoring apis * chore: integration tests added * chore: documentation future links added * chore: added new metrics existence function + modified return types * chore: not required parameter removal * chore: reformatted integration tests * chore: renamed onboarding -> checks --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: Ashwin Bhatkal <ashwin96@gmail.com> |
||
|
|
9bab8e0ae2 |
docs(deploy): restructure migration guide and add Docker Swarm (#11851)
* docs(deploy): restructure migration guide and add Docker Swarm * docs(deploy): title migration guide for both install script and deploy * docs: fix the signoz docs troubleshooting guide url * docs(deploy): point troubleshooting at Slack and Foundry issues |
||
|
|
8040f222ad |
fix: enable opamp for llmpricing/spanmmapper and remove unit from config (#11285)
* fix: enable opamp for llmpricing * fix: test files * chore: cleanups * fix: don't deploy to opamp if ff is disabled * fix: enable spanmapper behild feature flag |
||
|
|
a45212cb79 |
feat(infra-monitoring): remove requiredMetricsCheck from v2 APIs + integration tests for new querier warnings behaviour. (#11792)
* chore: metric_name required checks removed * refactor(inframonitoring): drop required-metrics test, add test hosts_warnings * chore: updated integration tests for pods * chore: updated integration tests for volumes * chore: updated integration tests for nodes * chore: updated integration tests for clusters and deployments * chore: updated statefulsets integration tests * chore: updated integration tests for jobs and daemonsets * chore: removed unwanted provisional comments * test(inframonitoring): dedupe metric-availability warning fixtures, reuse existing datasets * test(inframonitoring): isolate hosts metric-key-pair warning fixture Scenario-2 shared host acc-h1 + the accuracy fixture with test_hosts_value_accuracy, causing a deterministic CI failure (empty warnings). Restore the dedicated kp-h1 fixture + deployment.environment groupBy so the warning assertion never depends on data shared with another test. * chore: removed unimportant tests for same thing * test(inframonitoring): drop obsolete metric-key-pair warning scenario PR #11835 removed the "key X not found on metric" warning from the metric statement builder (lexer-derived check can't tell a key from a value, so $variables got false-flagged). The metric_key_pair_not_seen scenario asserted that now-removed warning, so it fails deterministically after merging main. Remove the scenario and its orphaned fixture; never-seen-metric coverage ("never been received", still emitted) stays. |
||
|
|
a609a4044c |
fix(ui): resolve monaco find widget clipping and flickering (#11826)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
f78d98ea71 |
feat(metrics-explorer): move metric_name from path param to query param (#11745)
* chore: metricName to post body for POST /api/v2/metrics/{metric_name}/metadata
* chore: metricName to query param for GET /api/v2/metrics/{metric_name}/metadata
* chore: added metricName in api get metric attributes
* chore: highlights api modified
* chore: alerts api modified
* chore: dashboards api modified
* chore: description added for metric_name query params
* feat(metrics-explorer): integrate metricName query/body API change in frontend (#11818)
* feat(metrics-explorer): integrate metricName query/body API change in frontend
The metrics-explorer endpoints moved metric_name off the URL path: the
five GETs (attributes, metadata, highlights, alerts, dashboards) now take
a required `metricName` query param, and POST /metadata reads metricName
from the request body.
- Regenerate the orval client from the updated openapi spec, so the GET
helpers build `/api/v2/metrics/<op>?metricName=...` (URL-encoded, so
slashed cloud metric names work) and updateMetricMetadata posts to
`/api/v2/metrics/metadata` with metricName in the body.
- Collapse the useGetMetricAttributes call to the single merged params
object (metricName + start/end).
- Drop the now-removed pathParams wrapper from both updateMetricMetadata
call sites; the payload builders already include metricName in the body.
- Update the Metadata test to assert metricName inside the request body.
* revert(metrics-explorer): drop slashed-metric-name band-aid guards
These two defensive guards were added as temporary workarounds for the
metric_name-with-slash bug (SigNoz/signoz#11527, #11528), which returned
200 + HTML instead of JSON. The root cause is fixed by moving metricName
to a query/body param, so the band-aids are no longer needed and revert
to the original intended code.
- MetricDetails.tsx: `!metricMetadataResponse?.data` -> `!metricMetadataResponse`
- AllAttributes.tsx: `?.data?.attributes` -> `?.data.attributes`
* chore: added description for metricName query params
---------
Co-authored-by: Ashwin Bhatkal <ashwin96@gmail.com>
Co-authored-by: Srikanth Chekuri <srikanth.chekuri92@gmail.com>
|
||
|
|
f60e5039be |
feat(dashboard-v2): toolbar repositioning, JSON editor & expandable variables bar (#11837)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* feat(dashboard-v2): json editor drawer to edit dashboard as raw JSON Right-side drawer with a Monaco JSON editor (reusing the import-JSON theme), a Format/Copy/Download/Reset toolbar, live JSON validation, and Apply via the full-document updateDashboardV2 endpoint. Cmd/Ctrl+Enter applies; Esc closes. * feat(dashboard-v2): grouped actions menu with clone, new section & edit-as-JSON Regroup the actions dropdown into labelled Dashboard/Data/Layout groups, add Clone dashboard (cloneDashboardV2 + navigate) and New section (useAddSection), and surface an Edit as JSON button that opens the JSON editor drawer. The menu trigger is a labelled "Actions" button with a 9-grid icon; the time selector moves out of the actions row to the toolbar's second row. * feat(dashboard-v2): description-on-hover and space-aware tag overflow Collapse the dashboard description behind an info icon shown on hover, and move tags inline after the title where they restrict to the available width and collapse the remainder into a +N badge (reusing the alerts badge measuring). * refactor(dashboard-v2): two-row toolbar with a floated, expandable variables bar Second toolbar row floats the time-range selector top-right; the variables bar flows beside it, collapsing to a single line with an inline +N trigger that hugs the last visible pill. Expanding clears the float so the pills pack full-width on the lines beneath the time selector (no stair-stepping). Overflow pills are display:none but stay mounted (widths cached) so auto-selection and option fetching keep driving the panels. Also centre the variable info icon, give the pills a visible --l3-border (and drop the single-select's stray inner border so it matches), and replace the toolbar's fuzzy drop shadow with a token hairline. * feat(dashboard-v2): section title modal & scroll to the new section New section now opens a title-entry modal instead of inserting a default-named section, and the view scrolls the freshly created section into view once the refetch renders it. Generalise the rename modal into a shared SectionTitleModal reused by both create and rename. * test(dashboard-v2): cover the JSON editor hook and drawer useJsonEditor: seeding, live validation, format/reset, dirty tracking, apply (no-op when clean/invalid, PUTs the narrowed body, error handling) and re-seed on re-open. JsonEditorDrawer: toolbar/footer wiring, validation text, Apply enablement, editor changes and Cmd/Ctrl+Enter — with Monaco and the hook mocked. * refactor(dashboard-v2): extract generic useInlineOverflowCount hook Address review on the variables bar: generalise the single-line overflow measurement into hooks/useInlineOverflowCount (container of data-overflow-item children, with gap/reserveWidth/enabled options) so it's reusable elsewhere, and clarify the internal variable names (container/itemWidths/availableWidth/etc.). * refactor(dashboard-v2): use descriptive names in useInlineOverflowCount Replace single-letter/abbreviated locals (el, i, w, width/widths) with itemElement/index/itemWidth/cachedWidth(s) inside the measure loop. |
||
|
|
a483ef81a4 |
feat(authz): add transaction groups JSON schema (#11827)
* feat(authz): add transaction group schema and validations * fix(authz): drop constant errorFormat param from wrapValidationError unparam flagged wrapValidationError's errorFormat parameter since all call sites passed the same "%s: %s". Inline the format and trim the argument at each call site. No behavior change. * feat(authz): better error handling * chore(authz): suffix generated web settings schema with .schema.json Rename webSettings.json to webSettings.schema.json to follow the JSON Schema file-naming convention and match transactionGroups.schema.json. Updates the generator output path, the json2ts input + banner in package.json, and the generated banner comment. * feat(authz): add schema titles |
||
|
|
b9c107a851 |
fix(dashboards-v2): stop infinite render loop on dashboards with no variable selections (#11841)
selectVariableValues returned an inline `{}` fallback whenever a dashboard had
no stored selections. Zustand reads selectors through useSyncExternalStore,
which compares snapshots with Object.is, so a fresh object every call reads as a
perpetually-changed snapshot and React re-renders without end ("Maximum update
depth exceeded").
This surfaced specifically on fresh/empty dashboards: when a dashboard has
variables, the seeding effect in useVariableSelection populates the store with a
stable object and the loop never starts; with no variables that effect
early-returns, the entry stays undefined, and the selector mints a new `{}` on
every render. VariablesBar renders null in that case, but its hook still
subscribes, so the loop fires anyway.
Return a single module-level empty map so the snapshot is referentially stable.
|
||
|
|
5f6cc4c297 |
feat(data-export): support client-provided offset in export_raw_data API (#11825)
* feat: add support for offset in export api
* chore: add tests similar to limit
* Remove unnecessary tests
This reverts commit
|
||
|
|
69e4c3c6f3 |
chore(querier): route metric reads to buffer/reduced tables behind a flag (#11801)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
Fixes https://github.com/SigNoz/engineering-pod/issues/5341 |
||
|
|
bc8c36095c |
fix: do not warn filter variables as missing keys (#11835)
* fix: do not warn filter variables as missing keys Fixes https://github.com/SigNoz/engineering-pod/issues/5481 * chore: add regression test |
||
|
|
385135ba6c |
chore: add @H4ad as frontend codeowner for authz, members and service accounts (#11834)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
ea4ac08666 |
feat(deprecate): install script and promote foundry (#11811)
* feat(signoz): deprecate install script * feat(signoz): include kind in migration doc * feat(deprecation): remove legacy files and update migration guide * feat(deprecation): update readme, no docker compose reference * feat(deprecation): improved instructions * feat(deprecation): updating docs based on feedback * feat(deprecation): typos and redundant lines * feat(deprecation): include checklist and update references * feat(deprecation): restore install script * feat(deprecation): include link in script |
||
|
|
65cdf8b74d | feat(user): add delete user API (#11833) | ||
|
|
a4ff4093cd |
feat(dashboard-v2): variable settings editor UX polishes (#11775)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* 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 |
||
|
|
b2acf3e856 |
feat(dashboards-v2): config pane + section editors (#11770)
* 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. |
||
|
|
949d18f028 |
feat(dashboards-v2): panel editor foundation + qb/perses adapter (#11769)
* 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> |
||
|
|
8180436432 | chore: update code owner (#11821) | ||
|
|
ad243b88aa |
feat: send all data for trace list api (#10583)
* chore: send all data for trace list api * chore: add integration tests * chore: fix tests * chore: add comment Co-authored-by: Tushar Vats <tushar@signoz.io> * fix: retain existing behaviour * fix: add changes * fix: linting issues * fix: py-fmt * fix: restrict merging to only span data * fix: address comments * fix: address comments * fix: send parsed events and links * fix: remove unnecessary tests * fix: lint issues * fix: send all data for trace operators as well * fix: lint issues * fix: move tests to the same file * fix: tests * fix: lint * fix: comment * fix: lint --------- Co-authored-by: Tushar Vats <tushar@signoz.io> |
||
|
|
3369ed7172 |
chore: add flag for ai observability (#11806)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* chore: add flag for ai observability * chore: add enable prefix |
||
|
|
a98b84c1cd |
feat(user): accept custom roles in user invite (#11802)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* 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 |
||
|
|
4dda1e0ab5 |
feat(dashboards): views-first V2 dashboards list with filters, saved views, and tabbed new-dashboard modal (#11682)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* 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 |
||
|
|
749943abe4 |
feat(dashboard-v2): runtime variable selection (#11646)
* feat(dashboard-v2): variable-selection store, dependency graph & sort helpers * feat(dashboard-v2): runtime variables bar & per-type selectors * feat(dashboard-v2): mount variables bar in dashboard toolbar |
||
|
|
4f51ee37ba | fix: modularize query range function (#11774) | ||
|
|
d5617657b5 |
fix(dashboard): clickhouse table panel collapses value columns onto query name (#11794)
* 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
|
||
|
|
5600576722 | chore: add search and override filters in pricing model list api (#11735) | ||
|
|
f84b818552 |
feat(authz): add unified role APIs (#11798)
* 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 |
||
|
|
4147c5c4bd |
refactor(alerts): move channels to alerts (#11641)
Some checks failed
build-staging / prepare (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
* 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 |
||
|
|
e1cb822091 |
chore(deps): bump @grafana/data and pin transitive deps to patched versions (#11796)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
- @grafana/data ^11.6.14 -> ^11.6.15 - http-proxy-middleware 4.0.0 -> 4.1.1 (dep + resolution) - form-data 4.0.4 -> 4.0.6 - tmp 0.2.4 -> 0.2.7 - add js-cookie ^3.0.7 resolution pin (forces react-use's transitive copy to a patched range) Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
b8567664da |
refactor(quick-filters): split checkbox into multiple files (#11768)
Some checks failed
build-staging / prepare (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
* refactor(quick-filters): extract checkbox value fetching into hook * refactor(quick-filters): extract checkbox query algebra into pure module * refactor(quick-filters): extract checkbox glue hooks * refactor(quick-filters): split checkbox renderers into components |
||
|
|
643aac4424 | fix(alerts): missing fields when duplicating via edit alert (#11767) | ||
|
|
2cf7ef93ea |
chore: send warning instead of error for unseen metrics and missing (… (#11754)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* 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 |
||
|
|
dba827ee33 |
feat(infra-monitoring): namespace+cluster group by for PVC monitoring, cluster group by for namespace monitoring (#11739)
* 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 |
||
|
|
467a556062 |
feat(dashboard-v2): redesign public dashboard publish drawer (#11748)
* 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). |
||
|
|
a8f6b8187e |
chore(release): bump to v0.129.0 (#11773)
Co-authored-by: primus-bot[bot] <171087277+primus-bot[bot]@users.noreply.github.com> |
||
|
|
03796f012f |
chore: bumping agent version to v0.0.13 (#11757)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
|
||
|
|
a06900bbff | chore: added fix for infinite query call on services page (#11755) | ||
|
|
b50933d622 |
chore(trace-details): remove flamegraph v2 API (#11629)
* 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> |
||
|
|
8bf649a3a5 |
feat(dashboards-v2): panel rendering system (pure-V5 data path, renderers, panel chrome) (#11639)
* 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 |
||
|
|
9150c2ac87 |
feat: introduce dashboard views for list dashboards page (#11465)
* 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> |
||
|
|
78df13dabd |
perf: reuse label maps and index series by variable in formulas (#11529)
* 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> |
||
|
|
eb4b11295b |
feat: add clone dashboard API for perses dashboards (#11742)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* 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 |
||
|
|
bdb0091c87 |
feat: use empty suggestions api for empty ui state of ai assistant (#11744)
Some checks failed
build-staging / prepare (push) Has been cancelled
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
* 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 |
||
|
|
5198530056 |
chore(traces): remove legacy trace view toggle and redirect /trace-old to /trace (#11732)
* chore: remove legacy trace view redirect * refactor: review changes --------- Co-authored-by: Gaurav Tewari <tewarig@users.noreply.github.com> |
||
|
|
6a4e694a34 |
fix: AI Assistant improvements (#11722)
* 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 |
||
|
|
bd9a6cc17d | chore: bump cloud integration agent version to v0.0.12 (#11741) | ||
|
|
51f180453e |