Skip to content

feat(metrics): histogram_quantile from OTel explicit-bounds buckets (P6)#63128

Open
DanielVisca wants to merge 1 commit into
posthog-code/metrics-ql5-rate-increasefrom
posthog-code/metrics-ql6-histogram-quantile
Open

feat(metrics): histogram_quantile from OTel explicit-bounds buckets (P6)#63128
DanielVisca wants to merge 1 commit into
posthog-code/metrics-ql5-rate-increasefrom
posthog-code/metrics-ql6-histogram-quantile

Conversation

@DanielVisca

@DanielVisca DanielVisca commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Problem

Latency questions are quantile questions, and OTel histograms arrive as explicit-bounds bucket arrays that nothing could read yet (histogram_bounds/histogram_counts were write-only columns).

Changes

histogram_quantile aggregation (+ quantile field, e.g. 0.95):

  • ClickHouse sums per-le bucket-count distributions per time bucket (sumForEach), reusing the per-series temporality/reset handling from rate/increase applied element-wise to the counts arrays.
  • The Prometheus-style linear interpolation happens in Python where it is exact and unit-tested (overflow bucket clamps to the highest finite bound; first bucket's lower edge is 0).
  • Mixed bucket layouts in one selection 400 with a message telling the caller to narrow with filters. Validation uses groupUniqArray across all contributing rows — any() sampling would miss a mismatch inside a single time bucket (a bug the tests caught).

How did you test this code?

I'm an agent. Automated: interpolation unit tests with hand-computed expectations, plus ClickHouse-backed tests for delta and cumulative histograms, bounds-mismatch rejection, and the API path. Live check: bin/send-dev-metrics.sh seeds an e2e histogram, then query it with {"aggregation": "histogram_quantile", "quantile": 0.95}.

🤖 Agent context

Autonomy: Human-driven (agent-assisted) — directed by @DanielVisca

CH computes distributions, Python interpolates — chosen over a pure-SQL quantile (array gymnastics, hard to verify) and over ClickHouse's approximate quantile functions (wrong tool: the data is already bucketed).

DanielVisca commented Jun 11, 2026

Copy link
Copy Markdown
Contributor Author

Comment on lines +78 to +79
min_value=0.0,
max_value=1.0,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Validation mismatch will cause runtime errors. The serializer allows quantile=0.0 and quantile=1.0 (inclusive bounds), but MetricQueryRunner validation at line 205 requires 0.0 < quantile < 1.0 (exclusive bounds). API requests with quantile=0.0 or quantile=1.0 will pass serializer validation but fail at runtime.

min_value=0.0,  # This should be exclusive, not inclusive
max_value=1.0,  # This should be exclusive, not inclusive

Fix by adding exclusive validation or custom validator to match the runner's (0, 1) requirement.

Suggested change
min_value=0.0,
max_value=1.0,
min_value=1e-10,
max_value=1.0 - 1e-10,

Spotted by Graphite

Fix in Graphite


Is this helpful? React 👍 or 👎 to let us know.

@github-actions

github-actions Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 72.4 MB

ℹ️ View Unchanged
Filename Size
frontend/dist-report/decompression-worker/src/scenes/session-recordings/player/snapshot-processing/decompressionWorker 2.85 kB
frontend/dist-report/exporter/_chunks/chunk 6.7 MB
frontend/dist-report/exporter/_parent/products/actions/frontend/pages/Action 24.1 kB
frontend/dist-report/exporter/_parent/products/actions/frontend/pages/Actions 1.92 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/AIObservabilityScene 117 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/AIObservabilitySessionScene 19.7 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/AIObservabilityTraceScene 129 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/AIObservabilityUsers 1.54 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/clusters/AIObservabilityClusterScene 21.6 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/clusters/AIObservabilityClustersScene 54.3 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/datasets/AIObservabilityDatasetScene 20.7 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/datasets/AIObservabilityDatasetsScene 4.13 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/evaluations/AIObservabilityEvaluation 59.6 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/evaluations/AIObservabilityEvaluationsScene 28.5 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/evaluations/EvaluationTemplates 569 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/LLMASessionFeedbackDisplay 4.71 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/playground/AIObservabilityPlaygroundScene 37.7 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/prompts/LLMPromptScene 29.8 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/prompts/LLMPromptsScene 5.24 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/tags/AIObservabilityTag 28.4 kB
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/tags/AIObservabilityTagsScene 8.11 kB
frontend/dist-report/exporter/_parent/products/business_knowledge/frontend/scenes/BusinessKnowledgeScene 21.1 kB
frontend/dist-report/exporter/_parent/products/conversations/frontend/components/Assignee/CyclotronJobInputAssignee 1.27 kB
frontend/dist-report/exporter/_parent/products/conversations/frontend/components/SlaBusinessHours/CyclotronJobInputBusinessHours 2.59 kB
frontend/dist-report/exporter/_parent/products/conversations/frontend/components/TicketTags/CyclotronJobInputTicketTags 681 B
frontend/dist-report/exporter/_parent/products/conversations/frontend/scenes/settings/SupportSettingsScene 2.48 kB
frontend/dist-report/exporter/_parent/products/conversations/frontend/scenes/ticket/SupportTicketScene 34 kB
frontend/dist-report/exporter/_parent/products/conversations/frontend/scenes/tickets/SupportTicketsScene 1.75 kB
frontend/dist-report/exporter/_parent/products/customer_analytics/frontend/CustomerAnalyticsScene 80.4 kB
frontend/dist-report/exporter/_parent/products/customer_analytics/frontend/scenes/CustomerAnalyticsConfigurationScene/CustomerAnalyticsConfigurationScene 3.24 kB
frontend/dist-report/exporter/_parent/products/customer_analytics/frontend/scenes/CustomerJourneyBuilderScene/CustomerJourneyBuilderScene 2.69 kB
frontend/dist-report/exporter/_parent/products/customer_analytics/frontend/scenes/CustomerJourneyTemplatesScene/CustomerJourneyTemplatesScene 8.16 kB
frontend/dist-report/exporter/_parent/products/data_warehouse/DataWarehouseScene 46.1 kB
frontend/dist-report/exporter/_parent/products/data_warehouse/frontend/scenes/NewSourceScene/NewSourceScene 1.82 kB
frontend/dist-report/exporter/_parent/products/data_warehouse/frontend/scenes/SchemaScene/SchemaScene 26.7 kB
frontend/dist-report/exporter/_parent/products/data_warehouse/frontend/scenes/SourceScene/SourceScene 1.77 kB
frontend/dist-report/exporter/_parent/products/data_warehouse/frontend/scenes/SourcesScene/SourcesScene 6.57 kB
frontend/dist-report/exporter/_parent/products/early_access_features/frontend/EarlyAccessFeature 1.7 kB
frontend/dist-report/exporter/_parent/products/early_access_features/frontend/EarlyAccessFeatures 3.75 kB
frontend/dist-report/exporter/_parent/products/endpoints/frontend/EndpointScene 43.6 kB
frontend/dist-report/exporter/_parent/products/endpoints/frontend/EndpointsScene 23.8 kB
frontend/dist-report/exporter/_parent/products/error_tracking/frontend/scenes/ErrorTrackingFingerprintsScene/ErrorTrackingIssueFingerprintsScene 7.64 kB
frontend/dist-report/exporter/_parent/products/error_tracking/frontend/scenes/ErrorTrackingIssueScene/ErrorTrackingIssueScene 96.7 kB
frontend/dist-report/exporter/_parent/products/error_tracking/frontend/scenes/ErrorTrackingScene/ErrorTrackingScene 35.2 kB
frontend/dist-report/exporter/_parent/products/feature_flags/frontend/FeatureFlagTemplatesScene 6.8 kB
frontend/dist-report/exporter/_parent/products/games/368Hedgehogs/368Hedgehogs 5.13 kB
frontend/dist-report/exporter/_parent/products/games/FlappyHog/FlappyHog 5.6 kB
frontend/dist-report/exporter/_parent/products/legal_documents/frontend/scenes/LegalDocumentNewScene 60.6 kB
frontend/dist-report/exporter/_parent/products/legal_documents/frontend/scenes/LegalDocumentsScene 6.78 kB
frontend/dist-report/exporter/_parent/products/links/frontend/LinkScene 25.5 kB
frontend/dist-report/exporter/_parent/products/links/frontend/LinksScene 4.86 kB
frontend/dist-report/exporter/_parent/products/live_debugger/frontend/LiveDebugger 19.6 kB
frontend/dist-report/exporter/_parent/products/logs/frontend/LogsScene 18.7 kB
frontend/dist-report/exporter/_parent/products/logs/frontend/scenes/LogsAlertDetailScene/LogsAlertDetailScene 17.9 kB
frontend/dist-report/exporter/_parent/products/logs/frontend/scenes/LogsAlertNotificationDetailScene/LogsAlertNotificationDetailScene 8.91 kB
frontend/dist-report/exporter/_parent/products/logs/frontend/scenes/LogsSamplingDetailScene/LogsSamplingDetailScene 5.72 kB
frontend/dist-report/exporter/_parent/products/logs/frontend/scenes/LogsSamplingNewScene/LogsSamplingNewScene 2.78 kB
frontend/dist-report/exporter/_parent/products/managed_migrations/frontend/ManagedMigration 15.3 kB
frontend/dist-report/exporter/_parent/products/mcp_analytics/frontend/MCPAnalyticsScene 78.4 kB
frontend/dist-report/exporter/_parent/products/mcp_analytics/frontend/MCPAnalyticsToolDetail 19 kB
frontend/dist-report/exporter/_parent/products/metrics/frontend/MetricsScene 16.1 kB
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/stickiness/StickinessBarChart/StickinessBarChart 3.74 kB
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/stickiness/StickinessLineChart/StickinessLineChart 3.62 kB
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/trends/TrendsBarChart/TrendsBarChart 9.26 kB
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/trends/TrendsLifecycleChart/TrendsLifecycleChart 5.44 kB
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/trends/TrendsLineChart/TrendsLineChart 5.08 kB
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/trends/TrendsPieChart/TrendsPieChart 4.83 kB
frontend/dist-report/exporter/_parent/products/replay_vision/frontend/observations/ReplayObservation 14.5 kB
frontend/dist-report/exporter/_parent/products/replay_vision/frontend/replay_scanners/ReplayScanner 21.7 kB
frontend/dist-report/exporter/_parent/products/replay_vision/frontend/replay_scanners/ReplayScannersScene 18.7 kB
frontend/dist-report/exporter/_parent/products/replay_vision/frontend/replay_scanners/ScannerEditorScene 25.8 kB
frontend/dist-report/exporter/_parent/products/revenue_analytics/frontend/revenueAnalyticsLogic 1.73 kB
frontend/dist-report/exporter/_parent/products/revenue_analytics/frontend/RevenueAnalyticsScene 26 kB
frontend/dist-report/exporter/_parent/products/session_summaries/frontend/SessionGroupSummariesTable 5.46 kB
frontend/dist-report/exporter/_parent/products/session_summaries/frontend/SessionGroupSummaryScene 19.5 kB
frontend/dist-report/exporter/_parent/products/skills/frontend/LLMSkillScene 1.57 kB
frontend/dist-report/exporter/_parent/products/skills/frontend/LLMSkillsScene 1.58 kB
frontend/dist-report/exporter/_parent/products/tasks/frontend/SlackTaskContextScene 9.39 kB
frontend/dist-report/exporter/_parent/products/tasks/frontend/TaskDetailScene 25.1 kB
frontend/dist-report/exporter/_parent/products/tasks/frontend/TaskTracker 14.6 kB
frontend/dist-report/exporter/_parent/products/tracing/frontend/TracingScene 75 kB
frontend/dist-report/exporter/_parent/products/user_interviews/frontend/UserInterview 10.7 kB
frontend/dist-report/exporter/_parent/products/user_interviews/frontend/UserInterviewResponse 8.14 kB
frontend/dist-report/exporter/_parent/products/user_interviews/frontend/UserInterviews 6.55 kB
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewIndexScene 3.11 kB
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewRunScene 45.9 kB
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewRunsScene 7.75 kB
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewSettingsScene 11.6 kB
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewSnapshotHistoryScene 14.3 kB
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewSnapshotOverviewScene 19.9 kB
frontend/dist-report/exporter/_parent/products/workflows/frontend/TemplateLibrary/MessageTemplate 16.9 kB
frontend/dist-report/exporter/_parent/products/workflows/frontend/Workflows/WorkflowScene 109 kB
frontend/dist-report/exporter/_parent/products/workflows/frontend/WorkflowsScene 58.9 kB
frontend/dist-report/exporter/src/exporter/exporter 42.7 kB
frontend/dist-report/exporter/src/exporter/scenes/ExporterDashboardScene 2.63 kB
frontend/dist-report/exporter/src/exporter/scenes/ExporterHeatmapScene 20.4 kB
frontend/dist-report/exporter/src/exporter/scenes/ExporterInsightScene 3.53 kB
frontend/dist-report/exporter/src/exporter/scenes/ExporterInterviewScene 310 kB
frontend/dist-report/exporter/src/exporter/scenes/ExporterNotebookScene 2.71 MB
frontend/dist-report/exporter/src/exporter/scenes/ExporterRecordingScene 1.79 kB
frontend/dist-report/exporter/src/exporterSharedChunkAnchors 1.23 kB
frontend/dist-report/exporter/src/lib/components/Cards/TextCard/TextCardMarkdownEditor 10.5 kB
frontend/dist-report/exporter/src/lib/components/MonacoDiffEditor 499 B
frontend/dist-report/exporter/src/lib/lemon-ui/LemonMarkdown/MermaidDiagram 1.89 kB
frontend/dist-report/exporter/src/lib/lemon-ui/LemonTextArea/LemonTextAreaMarkdown 688 B
frontend/dist-report/exporter/src/lib/lemon-ui/Link/Link 347 B
frontend/dist-report/exporter/src/lib/monaco/CodeEditorInline 683 B
frontend/dist-report/exporter/src/lib/monaco/vimMode 211 kB
frontend/dist-report/exporter/src/lib/ui/Button/ButtonPrimitives 411 B
frontend/dist-report/exporter/src/queries/nodes/WebVitals/WebVitals 7.86 kB
frontend/dist-report/exporter/src/queries/nodes/WebVitals/WebVitalsPathBreakdown 4.69 kB
frontend/dist-report/exporter/src/queries/Query/Query 1.48 kB
frontend/dist-report/exporter/src/queries/schema 899 kB
frontend/dist-report/exporter/src/scenes/approvals/changeRequestsLogic 520 B
frontend/dist-report/exporter/src/scenes/authentication/shared/passkeyLogic 500 B
frontend/dist-report/exporter/src/scenes/data-pipelines/event-filtering/EventFilterScene 22.4 kB
frontend/dist-report/exporter/src/scenes/data-pipelines/TransformationsScene 6.76 kB
frontend/dist-report/exporter/src/scenes/insights/views/BoxPlot/BoxPlot 5.82 kB
frontend/dist-report/exporter/src/scenes/insights/views/CalendarHeatMap/CalendarHeatMap 9.12 kB
frontend/dist-report/exporter/src/scenes/insights/views/RegionMap/RegionMap 30.1 kB
frontend/dist-report/exporter/src/scenes/insights/views/WorldMap/WorldMap 1.04 MB
frontend/dist-report/exporter/src/scenes/models/ModelsScene 19.1 kB
frontend/dist-report/exporter/src/scenes/models/NodeDetailScene 17 kB
frontend/dist-report/monaco-editor-worker/src/lib/monaco/workers/monacoEditorWorker 288 kB
frontend/dist-report/monaco-json-worker/src/lib/monaco/workers/monacoJsonWorker 419 kB
frontend/dist-report/monaco-typescript-worker/src/lib/monaco/workers/monacoTsWorker 7.02 MB
frontend/dist-report/posthog-app/_chunks/chunk 6.64 MB
frontend/dist-report/posthog-app/_parent/products/actions/frontend/pages/Action 24.9 kB
frontend/dist-report/posthog-app/_parent/products/actions/frontend/pages/Actions 2.63 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/AIObservabilityScene 118 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/AIObservabilitySessionScene 20.3 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/AIObservabilityTraceScene 130 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/AIObservabilityUsers 2.22 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/clusters/AIObservabilityClusterScene 22.3 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/clusters/AIObservabilityClustersScene 55 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/datasets/AIObservabilityDatasetScene 21.4 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/datasets/AIObservabilityDatasetsScene 4.81 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/evaluations/AIObservabilityEvaluation 60.3 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/evaluations/AIObservabilityEvaluationsScene 29.2 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/evaluations/EvaluationTemplates 569 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/LLMASessionFeedbackDisplay 4.71 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/playground/AIObservabilityPlaygroundScene 38.4 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/prompts/LLMPromptScene 29.9 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/prompts/LLMPromptsScene 5.92 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/tags/AIObservabilityTag 29 kB
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/tags/AIObservabilityTagsScene 8.79 kB
frontend/dist-report/posthog-app/_parent/products/business_knowledge/frontend/scenes/BusinessKnowledgeScene 21.8 kB
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/components/Assignee/CyclotronJobInputAssignee 1.27 kB
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/components/SlaBusinessHours/CyclotronJobInputBusinessHours 2.6 kB
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/components/TicketTags/CyclotronJobInputTicketTags 681 B
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/scenes/settings/SupportSettingsScene 3.23 kB
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/scenes/ticket/SupportTicketScene 27.1 kB
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/scenes/tickets/SupportTicketsScene 2.43 kB
frontend/dist-report/posthog-app/_parent/products/customer_analytics/frontend/CustomerAnalyticsScene 79.9 kB
frontend/dist-report/posthog-app/_parent/products/customer_analytics/frontend/scenes/CustomerAnalyticsConfigurationScene/CustomerAnalyticsConfigurationScene 3.99 kB
frontend/dist-report/posthog-app/_parent/products/customer_analytics/frontend/scenes/CustomerJourneyBuilderScene/CustomerJourneyBuilderScene 3.37 kB
frontend/dist-report/posthog-app/_parent/products/customer_analytics/frontend/scenes/CustomerJourneyTemplatesScene/CustomerJourneyTemplatesScene 8.85 kB
frontend/dist-report/posthog-app/_parent/products/data_warehouse/DataWarehouseScene 3.13 kB
frontend/dist-report/posthog-app/_parent/products/data_warehouse/frontend/scenes/NewSourceScene/NewSourceScene 2.57 kB
frontend/dist-report/posthog-app/_parent/products/data_warehouse/frontend/scenes/SchemaScene/SchemaScene 27.4 kB
frontend/dist-report/posthog-app/_parent/products/data_warehouse/frontend/scenes/SourceScene/SourceScene 2.48 kB
frontend/dist-report/posthog-app/_parent/products/data_warehouse/frontend/scenes/SourcesScene/SourcesScene 7.25 kB
frontend/dist-report/posthog-app/_parent/products/early_access_features/frontend/EarlyAccessFeature 2.52 kB
frontend/dist-report/posthog-app/_parent/products/early_access_features/frontend/EarlyAccessFeatures 4.44 kB
frontend/dist-report/posthog-app/_parent/products/endpoints/frontend/EndpointScene 44.3 kB
frontend/dist-report/posthog-app/_parent/products/endpoints/frontend/EndpointsScene 22.5 kB
frontend/dist-report/posthog-app/_parent/products/error_tracking/frontend/scenes/ErrorTrackingFingerprintsScene/ErrorTrackingIssueFingerprintsScene 8.32 kB
frontend/dist-report/posthog-app/_parent/products/error_tracking/frontend/scenes/ErrorTrackingIssueScene/ErrorTrackingIssueScene 96.5 kB
frontend/dist-report/posthog-app/_parent/products/error_tracking/frontend/scenes/ErrorTrackingScene/ErrorTrackingScene 35.9 kB
frontend/dist-report/posthog-app/_parent/products/feature_flags/frontend/FeatureFlagTemplatesScene 6.81 kB
frontend/dist-report/posthog-app/_parent/products/games/368Hedgehogs/368Hedgehogs 5.14 kB
frontend/dist-report/posthog-app/_parent/products/games/FlappyHog/FlappyHog 5.6 kB
frontend/dist-report/posthog-app/_parent/products/legal_documents/frontend/scenes/LegalDocumentNewScene 61.3 kB
frontend/dist-report/posthog-app/_parent/products/legal_documents/frontend/scenes/LegalDocumentsScene 7.46 kB
frontend/dist-report/posthog-app/_parent/products/links/frontend/LinkScene 26.2 kB
frontend/dist-report/posthog-app/_parent/products/links/frontend/LinksScene 5.54 kB
frontend/dist-report/posthog-app/_parent/products/live_debugger/frontend/LiveDebugger 20.3 kB
frontend/dist-report/posthog-app/_parent/products/logs/frontend/LogsScene 18.5 kB
frontend/dist-report/posthog-app/_parent/products/logs/frontend/scenes/LogsAlertDetailScene/LogsAlertDetailScene 18.6 kB
frontend/dist-report/posthog-app/_parent/products/logs/frontend/scenes/LogsAlertNotificationDetailScene/LogsAlertNotificationDetailScene 9.6 kB
frontend/dist-report/posthog-app/_parent/products/logs/frontend/scenes/LogsSamplingDetailScene/LogsSamplingDetailScene 6.41 kB
frontend/dist-report/posthog-app/_parent/products/logs/frontend/scenes/LogsSamplingNewScene/LogsSamplingNewScene 3.46 kB
frontend/dist-report/posthog-app/_parent/products/managed_migrations/frontend/ManagedMigration 16 kB
frontend/dist-report/posthog-app/_parent/products/mcp_analytics/frontend/MCPAnalyticsScene 79.1 kB
frontend/dist-report/posthog-app/_parent/products/mcp_analytics/frontend/MCPAnalyticsToolDetail 19.7 kB
frontend/dist-report/posthog-app/_parent/products/metrics/frontend/MetricsScene 16.8 kB
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/stickiness/StickinessBarChart/StickinessBarChart 4.42 kB
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/stickiness/StickinessLineChart/StickinessLineChart 4.3 kB
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/trends/TrendsBarChart/TrendsBarChart 9.94 kB
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/trends/TrendsLifecycleChart/TrendsLifecycleChart 6.12 kB
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/trends/TrendsLineChart/TrendsLineChart 5.76 kB
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/trends/TrendsPieChart/TrendsPieChart 5.51 kB
frontend/dist-report/posthog-app/_parent/products/replay_vision/frontend/observations/ReplayObservation 15.1 kB
frontend/dist-report/posthog-app/_parent/products/replay_vision/frontend/replay_scanners/ReplayScanner 22.4 kB
frontend/dist-report/posthog-app/_parent/products/replay_vision/frontend/replay_scanners/ReplayScannersScene 19.3 kB
frontend/dist-report/posthog-app/_parent/products/replay_vision/frontend/replay_scanners/ScannerEditorScene 26.5 kB
frontend/dist-report/posthog-app/_parent/products/revenue_analytics/frontend/revenueAnalyticsLogic 2.41 kB
frontend/dist-report/posthog-app/_parent/products/revenue_analytics/frontend/RevenueAnalyticsScene 26.7 kB
frontend/dist-report/posthog-app/_parent/products/session_summaries/frontend/SessionGroupSummariesTable 6.14 kB
frontend/dist-report/posthog-app/_parent/products/session_summaries/frontend/SessionGroupSummaryScene 20.1 kB
frontend/dist-report/posthog-app/_parent/products/skills/frontend/LLMSkillScene 2.25 kB
frontend/dist-report/posthog-app/_parent/products/skills/frontend/LLMSkillsScene 2.26 kB
frontend/dist-report/posthog-app/_parent/products/tasks/frontend/SlackTaskContextScene 10.1 kB
frontend/dist-report/posthog-app/_parent/products/tasks/frontend/TaskDetailScene 25.9 kB
frontend/dist-report/posthog-app/_parent/products/tasks/frontend/TaskTracker 15.3 kB
frontend/dist-report/posthog-app/_parent/products/tracing/frontend/TracingScene 75.7 kB
frontend/dist-report/posthog-app/_parent/products/user_interviews/frontend/UserInterview 10.8 kB
frontend/dist-report/posthog-app/_parent/products/user_interviews/frontend/UserInterviewResponse 8.82 kB
frontend/dist-report/posthog-app/_parent/products/user_interviews/frontend/UserInterviews 7.24 kB
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewIndexScene 3.79 kB
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewRunScene 46.6 kB
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewRunsScene 8.44 kB
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewSettingsScene 12.3 kB
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewSnapshotHistoryScene 15 kB
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewSnapshotOverviewScene 20.5 kB
frontend/dist-report/posthog-app/_parent/products/workflows/frontend/TemplateLibrary/MessageTemplate 17.6 kB
frontend/dist-report/posthog-app/_parent/products/workflows/frontend/Workflows/WorkflowScene 103 kB
frontend/dist-report/posthog-app/_parent/products/workflows/frontend/WorkflowsScene 59.7 kB
frontend/dist-report/posthog-app/src/index 61.3 kB
frontend/dist-report/posthog-app/src/layout/panel-layout/ai-first/tabs/NavTabChat 8.35 kB
frontend/dist-report/posthog-app/src/lib/components/AppShortcuts/utils/DebugCHQueriesImpl 19 kB
frontend/dist-report/posthog-app/src/lib/components/Cards/TextCard/TextCardMarkdownEditor 10.5 kB
frontend/dist-report/posthog-app/src/lib/components/MonacoDiffEditor 499 B
frontend/dist-report/posthog-app/src/lib/lemon-ui/LemonMarkdown/MermaidDiagram 1.89 kB
frontend/dist-report/posthog-app/src/lib/lemon-ui/LemonTextArea/LemonTextAreaMarkdown 688 B
frontend/dist-report/posthog-app/src/lib/lemon-ui/Link/Link 347 B
frontend/dist-report/posthog-app/src/lib/monaco/CodeEditorInline 717 B
frontend/dist-report/posthog-app/src/lib/monaco/vimMode 211 kB
frontend/dist-report/posthog-app/src/lib/ui/Button/ButtonPrimitives 414 B
frontend/dist-report/posthog-app/src/queries/nodes/WebVitals/WebVitals 8.54 kB
frontend/dist-report/posthog-app/src/queries/nodes/WebVitals/WebVitalsPathBreakdown 5.37 kB
frontend/dist-report/posthog-app/src/queries/Query/Query 2.16 kB
frontend/dist-report/posthog-app/src/queries/schema 899 kB
frontend/dist-report/posthog-app/src/scenes/activity/explore/EventsScene 4.31 kB
frontend/dist-report/posthog-app/src/scenes/activity/explore/SessionsScene 5.65 kB
frontend/dist-report/posthog-app/src/scenes/activity/live/LiveEventsTable 6.69 kB
frontend/dist-report/posthog-app/src/scenes/agentic/AgenticAuthorize 5.41 kB
frontend/dist-report/posthog-app/src/scenes/approvals/ApprovalDetail 17.6 kB
frontend/dist-report/posthog-app/src/scenes/approvals/changeRequestsLogic 520 B
frontend/dist-report/posthog-app/src/scenes/audit-logs/AdvancedActivityLogsScene 43 kB
frontend/dist-report/posthog-app/src/scenes/AuthenticatedShell 211 kB
frontend/dist-report/posthog-app/src/scenes/authentication/account/AccountConnected 2.93 kB
frontend/dist-report/posthog-app/src/scenes/authentication/account/AgenticAccountMismatch 2.32 kB
frontend/dist-report/posthog-app/src/scenes/authentication/account/credential-review/CredentialReview 4.9 kB
frontend/dist-report/posthog-app/src/scenes/authentication/cli/CLIAuthorize 11.2 kB
frontend/dist-report/posthog-app/src/scenes/authentication/cli/CLILive 3.95 kB
frontend/dist-report/posthog-app/src/scenes/authentication/email-mfa-verify/EmailMFAVerify 2.94 kB
frontend/dist-report/posthog-app/src/scenes/authentication/invite-signup/InviteSignup 1.2 kB
frontend/dist-report/posthog-app/src/scenes/authentication/login-2fa/Login2FA 4.64 kB
frontend/dist-report/posthog-app/src/scenes/authentication/login/Login 1.21 kB
frontend/dist-report/posthog-app/src/scenes/authentication/password-reset/PasswordReset 4.36 kB
frontend/dist-report/posthog-app/src/scenes/authentication/password-reset/PasswordResetComplete 2.92 kB
frontend/dist-report/posthog-app/src/scenes/authentication/shared/passkeyLogic 500 B
frontend/dist-report/posthog-app/src/scenes/authentication/signup/SignupContainer 1.18 kB
frontend/dist-report/posthog-app/src/scenes/authentication/two-factor-reset/TwoFactorReset 3.94 kB
frontend/dist-report/posthog-app/src/scenes/authentication/vercel/VercelConnect 4.92 kB
frontend/dist-report/posthog-app/src/scenes/authentication/vercel/VercelLinkError 2.2 kB
frontend/dist-report/posthog-app/src/scenes/authentication/verify-email/VerifyEmail 4.68 kB
frontend/dist-report/posthog-app/src/scenes/billing/AuthorizationStatus 662 B
frontend/dist-report/posthog-app/src/scenes/billing/Billing 615 B
frontend/dist-report/posthog-app/src/scenes/billing/BillingSection 22 kB
frontend/dist-report/posthog-app/src/scenes/cohorts/Cohort 28.7 kB
frontend/dist-report/posthog-app/src/scenes/cohorts/CohortCalculationHistory 7.83 kB
frontend/dist-report/posthog-app/src/scenes/cohorts/Cohorts 10.7 kB
frontend/dist-report/posthog-app/src/scenes/coupons/Coupons 793 B
frontend/dist-report/posthog-app/src/scenes/dashboard/Dashboard 3.03 kB
frontend/dist-report/posthog-app/src/scenes/dashboard/dashboards/Dashboards 20.4 kB
frontend/dist-report/posthog-app/src/scenes/dashboard/dashboards/templates/DashboardTemplateCopyScene 7.29 kB
frontend/dist-report/posthog-app/src/scenes/data-management/DataManagementScene 2.33 kB
frontend/dist-report/posthog-app/src/scenes/data-management/definition/DefinitionEdit 18.9 kB
frontend/dist-report/posthog-app/src/scenes/data-management/definition/DefinitionView 27.1 kB
frontend/dist-report/posthog-app/src/scenes/data-management/MaterializedColumns/MaterializedColumns 13.1 kB
frontend/dist-report/posthog-app/src/scenes/data-management/variables/SqlVariableEditScene 8.77 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/batch-exports/BatchExportScene 66.6 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/DataPipelinesNewScene 3.97 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/DestinationsScene 4.31 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/event-filtering/EventFilterScene 23.1 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/legacy-plugins/LegacyPluginScene 21.9 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/TransformationsScene 3.52 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/WebScriptsScene 4.17 kB
frontend/dist-report/posthog-app/src/scenes/data-warehouse/DataWarehouseScene 3.11 kB
frontend/dist-report/posthog-app/src/scenes/data-warehouse/editor/EditorScene 2.78 kB
frontend/dist-report/posthog-app/src/scenes/debug/DebugScene 21.1 kB
frontend/dist-report/posthog-app/src/scenes/debug/hog/HogRepl 8.98 kB
frontend/dist-report/posthog-app/src/scenes/experiments/Experiment 211 kB
frontend/dist-report/posthog-app/src/scenes/experiments/Experiments 22.3 kB
frontend/dist-report/posthog-app/src/scenes/experiments/SharedMetrics/SharedMetric 7.56 kB
frontend/dist-report/posthog-app/src/scenes/experiments/SharedMetrics/SharedMetrics 2.25 kB
frontend/dist-report/posthog-app/src/scenes/exports/ExportsScene 5.6 kB
frontend/dist-report/posthog-app/src/scenes/feature-flags/FeatureFlag 110 kB
frontend/dist-report/posthog-app/src/scenes/feature-flags/FeatureFlags 2.44 kB
frontend/dist-report/posthog-app/src/scenes/groups/Group 16.2 kB
frontend/dist-report/posthog-app/src/scenes/groups/Groups 5.29 kB
frontend/dist-report/posthog-app/src/scenes/groups/GroupsNew 8.88 kB
frontend/dist-report/posthog-app/src/scenes/health-alerts/HealthAlertsScene 5.4 kB
frontend/dist-report/posthog-app/src/scenes/health/categoryDetail/HealthCategoryDetailScene 8.83 kB
frontend/dist-report/posthog-app/src/scenes/health/HealthScene 12.7 kB
frontend/dist-report/posthog-app/src/scenes/health/pipelineStatus/PipelineStatusScene 12.6 kB
frontend/dist-report/posthog-app/src/scenes/heatmaps/scenes/heatmap/HeatmapNewScene 6.54 kB
frontend/dist-report/posthog-app/src/scenes/heatmaps/scenes/heatmap/HeatmapRecordingScene 5.52 kB
frontend/dist-report/posthog-app/src/scenes/heatmaps/scenes/heatmap/HeatmapScene 8.09 kB
frontend/dist-report/posthog-app/src/scenes/heatmaps/scenes/heatmaps/HeatmapsScene 5.42 kB
frontend/dist-report/posthog-app/src/scenes/hog-functions/HogFunctionScene 55.9 kB
frontend/dist-report/posthog-app/src/scenes/inbox/InboxScene 64.1 kB
frontend/dist-report/posthog-app/src/scenes/insights/InsightQuickStart/InsightQuickStart 7.02 kB
frontend/dist-report/posthog-app/src/scenes/insights/InsightScene 35.7 kB
frontend/dist-report/posthog-app/src/scenes/insights/views/BoxPlot/BoxPlot 6.51 kB
frontend/dist-report/posthog-app/src/scenes/insights/views/CalendarHeatMap/CalendarHeatMap 9.8 kB
frontend/dist-report/posthog-app/src/scenes/insights/views/RegionMap/RegionMap 30.8 kB
frontend/dist-report/posthog-app/src/scenes/insights/views/WorldMap/WorldMap 6.18 kB
frontend/dist-report/posthog-app/src/scenes/instance/AsyncMigrations/AsyncMigrations 14.5 kB
frontend/dist-report/posthog-app/src/scenes/instance/DeadLetterQueue/DeadLetterQueue 6.94 kB
frontend/dist-report/posthog-app/src/scenes/instance/QueryPerformance/QueryPerformance 10.2 kB
frontend/dist-report/posthog-app/src/scenes/instance/SystemStatus/SystemStatus 18.3 kB
frontend/dist-report/posthog-app/src/scenes/IntegrationsRedirect/IntegrationsRedirect 752 B
frontend/dist-report/posthog-app/src/scenes/marketing-analytics/MarketingAnalyticsScene 42.4 kB
frontend/dist-report/posthog-app/src/scenes/max/Max 2.38 kB
frontend/dist-report/posthog-app/src/scenes/models/ModelsScene 19.8 kB
frontend/dist-report/posthog-app/src/scenes/models/NodeDetailScene 17.7 kB
frontend/dist-report/posthog-app/src/scenes/moveToPostHogCloud/MoveToPostHogCloud 4.4 kB
frontend/dist-report/posthog-app/src/scenes/new-tab/NewTabScene 3.17 kB
frontend/dist-report/posthog-app/src/scenes/notebooks/NotebookCanvasScene 5.08 kB
frontend/dist-report/posthog-app/src/scenes/notebooks/NotebookPanel/NotebookPanel 7.02 kB
frontend/dist-report/posthog-app/src/scenes/notebooks/NotebookScene 10.2 kB
frontend/dist-report/posthog-app/src/scenes/notebooks/NotebooksScene 8.96 kB
frontend/dist-report/posthog-app/src/scenes/oauth/OAuthAuthorize 708 B
frontend/dist-report/posthog-app/src/scenes/onboarding/coupon/OnboardingCouponRedemption 1.23 kB
frontend/dist-report/posthog-app/src/scenes/onboarding/Onboarding 789 kB
frontend/dist-report/posthog-app/src/scenes/onboarding/sdks/SdkHealthScene 9.37 kB
frontend/dist-report/posthog-app/src/scenes/organization/ConfirmOrganization/ConfirmOrganization 4.4 kB
frontend/dist-report/posthog-app/src/scenes/organization/Create/Create 602 B
frontend/dist-report/posthog-app/src/scenes/organization/Deactivated 1.06 kB
frontend/dist-report/posthog-app/src/scenes/organization/PendingDeletion 2.1 kB
frontend/dist-report/posthog-app/src/scenes/persons/PersonScene 21 kB
frontend/dist-report/posthog-app/src/scenes/persons/PersonsScene 7.02 kB
frontend/dist-report/posthog-app/src/scenes/PreflightCheck/PreflightCheck 5.46 kB
frontend/dist-report/posthog-app/src/scenes/product-tours/ProductTour 268 kB
frontend/dist-report/posthog-app/src/scenes/product-tours/ProductTours 6.24 kB
frontend/dist-report/posthog-app/src/scenes/project-homepage/ProjectHomepage 20 kB
frontend/dist-report/posthog-app/src/scenes/project/Create/Create 795 B
frontend/dist-report/posthog-app/src/scenes/project/PendingDeletion 2.43 kB
frontend/dist-report/posthog-app/src/scenes/resource-transfer/ResourceTransfer 10.8 kB
frontend/dist-report/posthog-app/src/scenes/saved-insights/SavedInsights 2.35 kB
frontend/dist-report/posthog-app/src/scenes/session-recordings/detail/SessionRecordingDetail 3.38 kB
frontend/dist-report/posthog-app/src/scenes/session-recordings/file-playback/SessionRecordingFilePlaybackScene 5.99 kB
frontend/dist-report/posthog-app/src/scenes/session-recordings/kiosk/SessionRecordingsKiosk 11.5 kB
frontend/dist-report/posthog-app/src/scenes/session-recordings/player/snapshot-processing/DecompressionWorkerManager 323 B
frontend/dist-report/posthog-app/src/scenes/session-recordings/playlist/SessionRecordingsPlaylistScene 6.44 kB
frontend/dist-report/posthog-app/src/scenes/session-recordings/SessionRecordings 2.37 kB
frontend/dist-report/posthog-app/src/scenes/session-recordings/settings/SessionRecordingsSettingsScene 3.54 kB
frontend/dist-report/posthog-app/src/scenes/sessions/SessionProfileScene 16.5 kB
frontend/dist-report/posthog-app/src/scenes/settings/SettingsScene 5.28 kB
frontend/dist-report/posthog-app/src/scenes/sites/Site 1.47 kB
frontend/dist-report/posthog-app/src/scenes/startups/StartupProgram 21 kB
frontend/dist-report/posthog-app/src/scenes/StripeConfirmInstall/StripeConfirmInstall 3.5 kB
frontend/dist-report/posthog-app/src/scenes/subscriptions/SubscriptionScene 17.8 kB
frontend/dist-report/posthog-app/src/scenes/subscriptions/SubscriptionsScene 6.88 kB
frontend/dist-report/posthog-app/src/scenes/surveys/forms/SurveyFormBuilder 3.19 kB
frontend/dist-report/posthog-app/src/scenes/surveys/Survey 2.72 kB
frontend/dist-report/posthog-app/src/scenes/surveys/Surveys 27.4 kB
frontend/dist-report/posthog-app/src/scenes/surveys/wizard/SurveyWizard 73.1 kB
frontend/dist-report/posthog-app/src/scenes/themes/CustomCssScene 5.17 kB
frontend/dist-report/posthog-app/src/scenes/toolbar-launch/ToolbarLaunch 4.06 kB
frontend/dist-report/posthog-app/src/scenes/Unsubscribe/Unsubscribe 1.61 kB
frontend/dist-report/posthog-app/src/scenes/web-analytics/SessionAttributionExplorer/SessionAttributionExplorerScene 8.09 kB
frontend/dist-report/posthog-app/src/scenes/web-analytics/WebAnalyticsScene 16 kB
frontend/dist-report/posthog-app/src/scenes/wizard/Wizard 4.34 kB
frontend/dist-report/posthog-app/src/sharedChunkAnchors 1.29 kB
frontend/dist-report/render-query/src/render-query/render-query 27.4 MB
frontend/dist-report/toolbar/src/toolbar/toolbar 10.4 MB

compressed-size-action

@greptile-apps

greptile-apps Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor
Prompt To Fix All With AI
Fix the following 2 code review issues. Work through them one at a time, proposing concise fixes.

---

### Issue 1 of 2
products/metrics/backend/tests/test_metric_query_runner.py:760
**Missing `TestCase` inheritance may silently skip these tests**

`TestHistogramQuantileInterpolation` does not inherit from `unittest.TestCase`. Django's test runner (`manage.py test`) only discovers `TestCase` subclasses, so the five `@parameterized.expand` cases covering the core interpolation logic may never run outside pytest. Every other test class in this file inherits from either `ClickhouseTestMixin, APIBaseTest` or `TestCase`. Adding `unittest.TestCase` as a base keeps discovery consistent across both runners at zero cost.

### Issue 2 of 2
products/metrics/backend/presentation/api.py:75-81
**Serializer accepts boundary values that the runner rejects**

The serializer declares `min_value=0.0, max_value=1.0` (inclusive), but `MetricQueryRunner` requires a strictly open interval `0.0 < q < 1.0`. Sending `quantile=0.0` or `quantile=1.0` passes the serializer yet reaches the runner, which raises a `ValueError` (caught as a `ParseError` → 400). The help text already documents `(0, 1)`, so aligning the validator with that contract avoids the misleading accepted-then-rejected behaviour.

```suggestion
    quantile = serializers.FloatField(
        required=False,
        allow_null=True,
        min_value=0.000001,
        max_value=0.999999,
        help_text="Quantile in (0, 1) for 'histogram_quantile' (e.g. 0.95). Ignored for other aggregations.",
    )
```

Reviews (1): Last reviewed commit: "feat(metrics): histogram_quantile from O..." | Re-trigger Greptile

)


class TestHistogramQuantileInterpolation:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Missing TestCase inheritance may silently skip these tests

TestHistogramQuantileInterpolation does not inherit from unittest.TestCase. Django's test runner (manage.py test) only discovers TestCase subclasses, so the five @parameterized.expand cases covering the core interpolation logic may never run outside pytest. Every other test class in this file inherits from either ClickhouseTestMixin, APIBaseTest or TestCase. Adding unittest.TestCase as a base keeps discovery consistent across both runners at zero cost.

Prompt To Fix With AI
This is a comment left during a code review.
Path: products/metrics/backend/tests/test_metric_query_runner.py
Line: 760

Comment:
**Missing `TestCase` inheritance may silently skip these tests**

`TestHistogramQuantileInterpolation` does not inherit from `unittest.TestCase`. Django's test runner (`manage.py test`) only discovers `TestCase` subclasses, so the five `@parameterized.expand` cases covering the core interpolation logic may never run outside pytest. Every other test class in this file inherits from either `ClickhouseTestMixin, APIBaseTest` or `TestCase`. Adding `unittest.TestCase` as a base keeps discovery consistent across both runners at zero cost.

How can I resolve this? If you propose a fix, please make it concise.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Comment on lines +75 to 81
quantile = serializers.FloatField(
required=False,
allow_null=True,
min_value=0.0,
max_value=1.0,
help_text="Quantile in (0, 1) for 'histogram_quantile' (e.g. 0.95). Ignored for other aggregations.",
)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Serializer accepts boundary values that the runner rejects

The serializer declares min_value=0.0, max_value=1.0 (inclusive), but MetricQueryRunner requires a strictly open interval 0.0 < q < 1.0. Sending quantile=0.0 or quantile=1.0 passes the serializer yet reaches the runner, which raises a ValueError (caught as a ParseError → 400). The help text already documents (0, 1), so aligning the validator with that contract avoids the misleading accepted-then-rejected behaviour.

Suggested change
quantile = serializers.FloatField(
required=False,
allow_null=True,
min_value=0.0,
max_value=1.0,
help_text="Quantile in (0, 1) for 'histogram_quantile' (e.g. 0.95). Ignored for other aggregations.",
)
quantile = serializers.FloatField(
required=False,
allow_null=True,
min_value=0.000001,
max_value=0.999999,
help_text="Quantile in (0, 1) for 'histogram_quantile' (e.g. 0.95). Ignored for other aggregations.",
)
Prompt To Fix With AI
This is a comment left during a code review.
Path: products/metrics/backend/presentation/api.py
Line: 75-81

Comment:
**Serializer accepts boundary values that the runner rejects**

The serializer declares `min_value=0.0, max_value=1.0` (inclusive), but `MetricQueryRunner` requires a strictly open interval `0.0 < q < 1.0`. Sending `quantile=0.0` or `quantile=1.0` passes the serializer yet reaches the runner, which raises a `ValueError` (caught as a `ParseError` → 400). The help text already documents `(0, 1)`, so aligning the validator with that contract avoids the misleading accepted-then-rejected behaviour.

```suggestion
    quantile = serializers.FloatField(
        required=False,
        allow_null=True,
        min_value=0.000001,
        max_value=0.999999,
        help_text="Quantile in (0, 1) for 'histogram_quantile' (e.g. 0.95). Ignored for other aggregations.",
    )
```

How can I resolve this? If you propose a fix, please make it concise.

@DanielVisca DanielVisca force-pushed the posthog-code/metrics-ql6-histogram-quantile branch from ef15c85 to dbb7c8e Compare June 11, 2026 21:33
@DanielVisca DanielVisca force-pushed the posthog-code/metrics-ql5-rate-increase branch 2 times, most recently from 03043f0 to 82bcef4 Compare June 11, 2026 22:06
@DanielVisca DanielVisca force-pushed the posthog-code/metrics-ql6-histogram-quantile branch from dbb7c8e to 3de34c7 Compare June 11, 2026 22:06
@DanielVisca DanielVisca added the stamphog Request AI review from stamphog label Jun 11, 2026 — with Graphite App

@stamphog stamphog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two substantive unresolved inline comments remain in the current diff. The serializer declares inclusive bounds (min_value=0.0, max_value=1.0) while the runner enforces an exclusive interval (0.0 < quantile < 1.0), creating a broken API contract where boundary values pass serializer validation but fail at runtime.

@stamphog stamphog Bot removed the stamphog Request AI review from stamphog label Jun 11, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🕸️ Eager graph

How much code each root forces the browser to download and decode through static imports — the regression class total bundle size can't see.

Root Eager closure Δ vs base Budget
entry (logged-out pages, app bootstrap)
src/index.tsx
14.59 MiB · 749 files no change █████████░ 90.0% of 16.21 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
55.50 MiB · 8,325 files no change █████████░ 90.9% of 61.04 MiB

node_modules/monaco-editor/ stays out of src/index.tsx

Largest files eagerly reachable from src/index.tsx
Size File
878.2 KiB src/styles/global.scss
609.0 KiB public/hedgehog/burning-money-hog.png
541.9 KiB public/hedgehog/waving-hog.png
448.2 KiB public/hedgehog/stop-sign-hog.png
362.0 KiB public/hedgehog/phone-pair-hogs.png
354.8 KiB ../node_modules/.pnpm/@posthog+icons@0.36.6_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
335.6 KiB public/hedgehog/desk-hog.png
323.2 KiB public/hedgehog/3-bears-hogs.png
297.4 KiB src/taxonomy/core-filter-definitions-by-group.json
285.8 KiB src/lib/api.ts
Largest files eagerly reachable from src/scenes/AuthenticatedShell.tsx
Size File
878.2 KiB src/styles/global.scss
760.0 KiB src/queries/validators.js
609.0 KiB public/hedgehog/burning-money-hog.png
541.9 KiB public/hedgehog/waving-hog.png
448.2 KiB public/hedgehog/stop-sign-hog.png
398.7 KiB ../node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chart.js
362.0 KiB public/hedgehog/phone-pair-hogs.png
354.8 KiB ../node_modules/.pnpm/@posthog+icons@0.36.6_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
335.6 KiB public/hedgehog/desk-hog.png
323.2 KiB public/hedgehog/3-bears-hogs.png

Posted automatically by check-eager-graph · sizes are input-source bytes from the esbuild metafile · part of #32479

ClickHouse sums per-le bucket-count distributions per time bucket
(reusing the per-series temporality/reset handling from rate/increase,
applied element-wise to the counts arrays); the Prometheus-style linear
interpolation happens in Python where it is exact and unit-tested.
Mixed bucket layouts in one selection are rejected with a 400 telling
the caller to narrow with filters (bounds-equality validation happens
in the query via groupUniqArray, not on a sampled row).

How to validate manually:
- hogli test products/metrics/backend/tests/ (92 tests)
- bin/send-dev-metrics.sh seeds an e2e histogram; then POST
  /metrics/query with {"aggregation": "histogram_quantile",
  "quantile": 0.95, "metricName": "e2e_dev_test_histogram"}

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@DanielVisca DanielVisca force-pushed the posthog-code/metrics-ql5-rate-increase branch from 82bcef4 to 7c8dc60 Compare June 11, 2026 22:36
@DanielVisca DanielVisca force-pushed the posthog-code/metrics-ql6-histogram-quantile branch from 3de34c7 to 5458194 Compare June 11, 2026 22:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant