mirror of
https://github.com/SigNoz/signoz.git
synced 2026-08-18 02:40:31 +01:00
Compare commits
base: SigNoz:ns/pie-chart
SigNoz:main
SigNoz:feat/semconv-phase1-services
SigNoz:refactor/clickhouse-quoting
SigNoz:test/semconv-phase1-e2e
SigNoz:tvats-fix-bool-type-conflict
SigNoz:platform-pod/issues/2919-remove-routes
SigNoz:feat/auth-domain-fga
SigNoz:feat/google_chat_alert_integration_tests
SigNoz:feat/user-routes-fga
SigNoz:fix/issue-with-staled-params
SigNoz:chore/remova-infra-monitoring-v1
SigNoz:tvats-json-column-scan
SigNoz:ns/harness
SigNoz:issue_5602
SigNoz:feat/add-OverrideCanEditDashboard-prop-to-dashboard
SigNoz:fix/apm-drilldown-empty-operations
SigNoz:feat/ai-o11y-feedback
SigNoz:feat/ai-o11-feedback
SigNoz:feat/jira_alert_channel_integration_frontend
SigNoz:feat/jira_alert_channel_integration_backend
SigNoz:feat/changelog-links-open-in-new-tab
SigNoz:refactor/v2-panel-query-capabilities
SigNoz:feat/initial-wrapper-for-ai-explorer
SigNoz:tvats-pipeline-parse-from-default
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:tvats-improve-body-query-pattern
SigNoz:feat/useBarChart-instead-of-graph
SigNoz:fix/uplot-time-scale-trim
SigNoz:feat/expose-uplot-x-range-prop
SigNoz:ns/scope
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/semconv-phase2-signals
SigNoz:feat/infra-monitoring-e2e
SigNoz:feat/alert-e2e
SigNoz:fix/infrastructure-monitoring-offset-issue
SigNoz:issue_5601_spanlist
SigNoz:ab/dashboards-fga-frontend
SigNoz:ab/dashboards-fga-list
SigNoz:ab/dashboards-fga-foundations
SigNoz:demo/qb-builder-ai-query
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/noz-error-handling
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:issue_4501
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.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:fix/apm-drilldown-empty-operations
SigNoz:feat/semconv-phase1-services
SigNoz:refactor/clickhouse-quoting
SigNoz:test/semconv-phase1-e2e
SigNoz:tvats-fix-bool-type-conflict
SigNoz:main
SigNoz:platform-pod/issues/2919-remove-routes
SigNoz:feat/auth-domain-fga
SigNoz:feat/google_chat_alert_integration_tests
SigNoz:feat/user-routes-fga
SigNoz:fix/issue-with-staled-params
SigNoz:chore/remova-infra-monitoring-v1
SigNoz:tvats-json-column-scan
SigNoz:ns/harness
SigNoz:issue_5602
SigNoz:feat/add-OverrideCanEditDashboard-prop-to-dashboard
SigNoz:fix/apm-drilldown-empty-operations
SigNoz:feat/ai-o11y-feedback
SigNoz:feat/ai-o11-feedback
SigNoz:feat/jira_alert_channel_integration_frontend
SigNoz:feat/jira_alert_channel_integration_backend
SigNoz:feat/changelog-links-open-in-new-tab
SigNoz:refactor/v2-panel-query-capabilities
SigNoz:feat/initial-wrapper-for-ai-explorer
SigNoz:tvats-pipeline-parse-from-default
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:tvats-improve-body-query-pattern
SigNoz:feat/useBarChart-instead-of-graph
SigNoz:fix/uplot-time-scale-trim
SigNoz:feat/expose-uplot-x-range-prop
SigNoz:ns/scope
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/semconv-phase2-signals
SigNoz:feat/infra-monitoring-e2e
SigNoz:feat/alert-e2e
SigNoz:fix/infrastructure-monitoring-offset-issue
SigNoz:issue_5601_spanlist
SigNoz:ab/dashboards-fga-frontend
SigNoz:ab/dashboards-fga-list
SigNoz:ab/dashboards-fga-foundations
SigNoz:demo/qb-builder-ai-query
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/noz-error-handling
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:issue_4501
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.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
643 Commits
ns/pie-cha
...
fix/apm-dr
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
9e1b611a4c |
fix(apm): stop the service drilldown crashing on an empty operations list
The service detail page rebuilds its widget queries with `operation in []` whenever the top-level operations list is momentarily empty, and the filter grammar rejects that outright. The drilldown menu resolved that query through /substitute_vars on a floating promise, so the 400 surfaced as an unhandled rejection. - catch the resolve failure in the drilldown menu and fall back to the unresolved query - skip the /substitute_vars round-trip when there are no variables to substitute, which is every non-dashboard surface - keep the previous operations list across a time-range change so the widget queries are never built with an empty list |
||
|
|
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
|