Skip to content

Commit 2de162a

Browse files
committed
rename(webapp,clickhouse): concurrency vocabulary for the unlaunched metrics surfaces
The Query tables become concurrency_metrics and concurrency_metrics_by_key, and the combined_* columns become total_* across the query schemas, the insert mapping, the ClickHouse migration, and every TRQL chart, matching the perKey/total shape the SDK will expose. Internal names (stream keys, env vars, ClickHouse table names) are unchanged. None of these surfaces have launched, so this is the last free moment for the rename.
1 parent 9579de0 commit 2de162a

14 files changed

Lines changed: 68 additions & 65 deletions

File tree

apps/webapp/app/components/queues/QueueMetricCards.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ export function QueueSidebarStats({
340340
};
341341

342342
const { rows, showLoading } = useQueueMetric(
343-
`SELECT max(max_queued) AS peak_queued,\n round(quantilesMerge(0.5, 0.9, 0.95, 0.99)(wait_quantiles)[3]) AS worst_p95\nFROM queue_metrics`,
343+
`SELECT max(max_queued) AS peak_queued,\n round(quantilesMerge(0.5, 0.9, 0.95, 0.99)(wait_quantiles)[3]) AS worst_p95\nFROM concurrency_metrics`,
344344
{ ids, timeRange, queueName, defaultPeriod }
345345
);
346346
const row = rows[0];

apps/webapp/app/presenters/v3/BuiltInDashboards.server.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,7 @@ const queuesDashboard: BuiltInDashboard = {
634634
"t-pressure": { title: "Queue pressure", query: "", display: { type: "title" } },
635635
pressure: {
636636
title: "Queue pressure",
637-
query: `SELECT queue,\n argMax(max_running, bucket_start) AS running,\n argMax(max_queued, bucket_start) AS queued,\n argMax(max_limit, bucket_start) AS limit,\n running + queued AS demand,\n max(max_queued) AS peak_queued,\n sum(throttled_count) AS throttled,\n multiIf(running >= limit AND queued > 0, 'queue-limited', queued > 0, 'backlogged', 'healthy') AS status\nFROM queue_metrics\nGROUP BY queue\nORDER BY peak_queued DESC`,
637+
query: `SELECT queue,\n argMax(max_running, bucket_start) AS running,\n argMax(max_queued, bucket_start) AS queued,\n argMax(max_limit, bucket_start) AS limit,\n running + queued AS demand,\n max(max_queued) AS peak_queued,\n sum(throttled_count) AS throttled,\n multiIf(running >= limit AND queued > 0, 'queue-limited', queued > 0, 'backlogged', 'healthy') AS status\nFROM concurrency_metrics\nGROUP BY queue\nORDER BY peak_queued DESC`,
638638
display: {
639639
type: "table",
640640
prettyFormatting: true,
@@ -644,7 +644,7 @@ const queuesDashboard: BuiltInDashboard = {
644644
"t-trends": { title: "Per-queue trends", query: "", display: { type: "title" } },
645645
"running-q": {
646646
title: "Running by queue",
647-
query: `SELECT timeBucket() AS t, queue, max(max_running) AS running\nFROM queue_metrics\nGROUP BY t, queue\nORDER BY t`,
647+
query: `SELECT timeBucket() AS t, queue, max(max_running) AS running\nFROM concurrency_metrics\nGROUP BY t, queue\nORDER BY t`,
648648
// Grouped gauge: carry each queue's running across idle buckets (per-group LOCF).
649649
fillGaps: true,
650650
display: {
@@ -661,7 +661,7 @@ const queuesDashboard: BuiltInDashboard = {
661661
},
662662
"queued-q": {
663663
title: "Queue depth (backlog) by queue",
664-
query: `SELECT timeBucket() AS t, queue, max(max_queued) AS queued\nFROM queue_metrics\nGROUP BY t, queue\nORDER BY t`,
664+
query: `SELECT timeBucket() AS t, queue, max(max_queued) AS queued\nFROM concurrency_metrics\nGROUP BY t, queue\nORDER BY t`,
665665
// Grouped gauge: carry each queue's backlog across idle buckets (per-group LOCF).
666666
fillGaps: true,
667667
display: {
@@ -678,7 +678,7 @@ const queuesDashboard: BuiltInDashboard = {
678678
},
679679
"throttled-q": {
680680
title: "Throttled buckets by queue",
681-
query: `SELECT timeBucket() AS t, queue, sum(throttled_count) AS throttled\nFROM queue_metrics\nGROUP BY t, queue\nORDER BY t`,
681+
query: `SELECT timeBucket() AS t, queue, sum(throttled_count) AS throttled\nFROM concurrency_metrics\nGROUP BY t, queue\nORDER BY t`,
682682
// Grouped counter: per-group zero-fill so idle buckets read 0, not a gap.
683683
fillGaps: true,
684684
display: {
@@ -697,7 +697,7 @@ const queuesDashboard: BuiltInDashboard = {
697697
title: "Enqueued vs started",
698698
// Counter states merge per queue, then sum outside: a single merge across queues
699699
// mixes unrelated odometers and returns wrong totals.
700-
query: `SELECT t, sum(enq) AS enqueued, sum(st) AS started\nFROM (\n SELECT timeBucket() AS t, queue,\n deltaSumTimestampMerge(enqueue_delta) AS enq,\n deltaSumTimestampMerge(started_delta) AS st\n FROM queue_metrics\n GROUP BY t, queue\n)\nGROUP BY t\nORDER BY t`,
700+
query: `SELECT t, sum(enq) AS enqueued, sum(st) AS started\nFROM (\n SELECT timeBucket() AS t, queue,\n deltaSumTimestampMerge(enqueue_delta) AS enq,\n deltaSumTimestampMerge(started_delta) AS st\n FROM concurrency_metrics\n GROUP BY t, queue\n)\nGROUP BY t\nORDER BY t`,
701701
display: {
702702
type: "chart",
703703
chartType: "line",

apps/webapp/app/presenters/v3/reports/health/health-data.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ function queueWorstQuery(): string {
212212
return `SELECT
213213
queue AS name,
214214
argMax(max_queued, bucket_start) AS latest_queued
215-
FROM queue_metrics
215+
FROM concurrency_metrics
216216
GROUP BY queue
217217
ORDER BY latest_queued DESC
218218
LIMIT 20`;
@@ -228,7 +228,7 @@ FROM (
228228
SELECT
229229
deltaSumTimestampMerge(dlq_delta) AS dlq,
230230
argMax(max_queued, bucket_start) AS latest_queued
231-
FROM queue_metrics
231+
FROM concurrency_metrics
232232
GROUP BY queue
233233
)`;
234234
}

apps/webapp/app/presenters/v3/reports/report-registry.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { loadHealthInput } from "./health/health-data";
44
import { type ReportViewModel } from "./report-view-model";
55

66
/** A query table a report may read. Same table names the query API authorizes against. */
7-
export type ReportQueryTable = "runs" | "env_metrics" | "queue_metrics";
7+
export type ReportQueryTable = "runs" | "env_metrics" | "concurrency_metrics";
88

99
export type ReportLoader<TInput> = {
1010
/** Authorization metadata: the route derives its per-table JWT scope check from this. */
@@ -19,7 +19,7 @@ function defineReport<TInput>(loader: ReportLoader<TInput>): ReportLoader<unknow
1919

2020
export const REPORT_REGISTRY: Record<string, ReportLoader<unknown>> = {
2121
health: defineReport({
22-
tables: ["runs", "env_metrics", "queue_metrics"],
22+
tables: ["runs", "env_metrics", "concurrency_metrics"],
2323
load: (env, period) => loadHealthInput(env, period),
2424
interpret: interpretHealth,
2525
}),

apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues/route.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ const SearchParamsSchema = z.object({
128128

129129
// The live "Queued" / "Running" header blocks poll ClickHouse on a short cadence so they stay
130130
// current after first paint. They read the env-wide gauges from env_metrics (the env-level rollup
131-
// of queue_metrics, cheapest for a dimension-free query), always over a fixed 15m window regardless
131+
// of concurrency_metrics, cheapest for a dimension-free query), always over a fixed 15m window regardless
132132
// of the chart/table period, and are NOT scoped to the visible queue set (the blocks are env-wide).
133133
const QUEUE_LIVE_BLOCKS_PERIOD = "15m";
134134
const QUEUE_LIVE_BLOCKS_QUERY =
@@ -1670,7 +1670,7 @@ function QueueHealthBadge(health: QueueHealth) {
16701670
);
16711671
}
16721672

1673-
// The `queue_metrics`-prefixed key a queue is stored under (task queues are prefixed `task/`).
1673+
// The metrics-row key a queue is stored under (task queues are prefixed `task/`).
16741674
function queueMetricsKey(queue: { type: string; name: string }): string {
16751675
return `${queue.type === "task" ? "task/" : ""}${queue.name}`;
16761676
}

apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues_.$queueParam/route.tsx

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ export default function Page() {
266266
// The Concurrency keys tab exists only for queues with key activity: live keys in the
267267
// ckIndex, or nonzero CK history in the selected range (one cached scalar query decides).
268268
const { rows: gateRows, showLoading: gateLoading } = useQueueMetric(
269-
`SELECT max(max_ck_backlogged) AS peak_keys, max(max_ck_wait_ms) AS peak_wait\nFROM queue_metrics`,
269+
`SELECT max(max_ck_backlogged) AS peak_keys, max(max_ck_wait_ms) AS peak_wait\nFROM concurrency_metrics`,
270270
{ ids, timeRange, queueName: fullName }
271271
);
272272
const gateRow = gateRows[0];
@@ -463,7 +463,7 @@ function OverviewCharts({
463463
}
464464
showLegend
465465
className="aspect-[2/1]"
466-
query={`SELECT timeBucket() AS t, max(max_running) AS running, max(max_limit) AS limit\nFROM queue_metrics\nGROUP BY t\nORDER BY t`}
466+
query={`SELECT timeBucket() AS t, max(max_running) AS running, max(max_limit) AS limit\nFROM concurrency_metrics\nGROUP BY t\nORDER BY t`}
467467
fillGaps
468468
minBucketSeconds={SYNCED_CHART_MIN_BUCKET_SECONDS}
469469
ids={ids}
@@ -499,7 +499,7 @@ function OverviewCharts({
499499
}
500500
showLegend
501501
className="aspect-[2/1]"
502-
query={`SELECT timeBucket() AS t, max(max_combined_running) AS running, least(max(max_combined_limit), max(max_env_limit)) AS cap\nFROM queue_metrics\nGROUP BY t\nORDER BY t`}
502+
query={`SELECT timeBucket() AS t, max(max_total_running) AS running, least(max(max_total_limit), max(max_env_limit)) AS cap\nFROM concurrency_metrics\nGROUP BY t\nORDER BY t`}
503503
fillGaps
504504
minBucketSeconds={SYNCED_CHART_MIN_BUCKET_SECONDS}
505505
ids={ids}
@@ -521,7 +521,7 @@ function OverviewCharts({
521521
title="Queue depth"
522522
info="How many runs are waiting in this queue over time."
523523
className="aspect-[2/1]"
524-
query={`SELECT timeBucket() AS t, max(max_queued) AS queued\nFROM queue_metrics\nGROUP BY t\nORDER BY t`}
524+
query={`SELECT timeBucket() AS t, max(max_queued) AS queued\nFROM concurrency_metrics\nGROUP BY t\nORDER BY t`}
525525
fillGaps
526526
minBucketSeconds={SYNCED_CHART_MIN_BUCKET_SECONDS}
527527
ids={ids}
@@ -541,7 +541,7 @@ function OverviewCharts({
541541
showLegend
542542
extraLegend={[{ color: "var(--color-warning)", label: "Falling behind" }]}
543543
className="aspect-[2/1]"
544-
query={`SELECT timeBucket() AS t,\n deltaSumTimestampMerge(enqueue_delta) AS enqueued,\n deltaSumTimestampMerge(started_delta) AS started\nFROM queue_metrics\nGROUP BY t\nORDER BY t`}
544+
query={`SELECT timeBucket() AS t,\n deltaSumTimestampMerge(enqueue_delta) AS enqueued,\n deltaSumTimestampMerge(started_delta) AS started\nFROM concurrency_metrics\nGROUP BY t\nORDER BY t`}
545545
fillGaps
546546
minBucketSeconds={SYNCED_CHART_MIN_BUCKET_SECONDS}
547547
ids={ids}
@@ -560,7 +560,7 @@ function OverviewCharts({
560560
info="How long runs wait before they start."
561561
showLegend
562562
className="aspect-[2/1]"
563-
query={`SELECT timeBucket() AS t,\n round(quantilesMerge(0.5, 0.9, 0.95, 0.99)(wait_quantiles)[1]) AS p50,\n round(quantilesMerge(0.5, 0.9, 0.95, 0.99)(wait_quantiles)[3]) AS p95,\n round(quantilesMerge(0.5, 0.9, 0.95, 0.99)(wait_quantiles)[4]) AS p99,\n sum(wait_ms_count) AS samples\nFROM queue_metrics\nGROUP BY t\nORDER BY t`}
563+
query={`SELECT timeBucket() AS t,\n round(quantilesMerge(0.5, 0.9, 0.95, 0.99)(wait_quantiles)[1]) AS p50,\n round(quantilesMerge(0.5, 0.9, 0.95, 0.99)(wait_quantiles)[3]) AS p95,\n round(quantilesMerge(0.5, 0.9, 0.95, 0.99)(wait_quantiles)[4]) AS p99,\n sum(wait_ms_count) AS samples\nFROM concurrency_metrics\nGROUP BY t\nORDER BY t`}
564564
fillGaps
565565
minBucketSeconds={SYNCED_CHART_MIN_BUCKET_SECONDS}
566566
sampleCountColumn="samples"
@@ -583,7 +583,7 @@ function OverviewCharts({
583583
</>
584584
}
585585
className="aspect-[2/1] sm:col-span-2 sm:aspect-[4/1]"
586-
query={`SELECT timeBucket() AS t, sum(throttled_count) AS throttled\nFROM queue_metrics\nGROUP BY t\nORDER BY t`}
586+
query={`SELECT timeBucket() AS t, sum(throttled_count) AS throttled\nFROM concurrency_metrics\nGROUP BY t\nORDER BY t`}
587587
fillGaps
588588
minBucketSeconds={SYNCED_CHART_MIN_BUCKET_SECONDS}
589589
ids={ids}
@@ -698,7 +698,7 @@ function ConcurrencyKeyCharts({
698698
title="Keys with backlog"
699699
info="Keys with runs waiting at once."
700700
className="aspect-[2/1]"
701-
query={`SELECT timeBucket() AS t, max(max_ck_backlogged) AS keys\nFROM queue_metrics\nGROUP BY t\nORDER BY t`}
701+
query={`SELECT timeBucket() AS t, max(max_ck_backlogged) AS keys\nFROM concurrency_metrics\nGROUP BY t\nORDER BY t`}
702702
fillGaps
703703
ids={ids}
704704
timeRange={timeRange}
@@ -720,7 +720,7 @@ function ConcurrencyKeyCharts({
720720
) : null
721721
}
722722
className="aspect-[2/1]"
723-
query={`SELECT timeBucket() AS t, max(max_ck_wait_ms) AS wait\nFROM queue_metrics\nGROUP BY t\nORDER BY t`}
723+
query={`SELECT timeBucket() AS t, max(max_ck_wait_ms) AS wait\nFROM concurrency_metrics\nGROUP BY t\nORDER BY t`}
724724
fillGaps
725725
ids={ids}
726726
timeRange={timeRange}
@@ -782,7 +782,7 @@ type GroupedKeyChartProps = {
782782
// search can match keys outside the top 8; then filter by the search and keep the top 8 of those.
783783
function GroupedKeyChartCard(props: GroupedKeyChartProps) {
784784
const { rows, showLoading, failed } = useQueueMetric(
785-
`SELECT concurrency_key, ${props.rankExpr} AS peak\nFROM queue_metrics_by_key\nGROUP BY concurrency_key\nORDER BY peak DESC\nLIMIT 50`,
785+
`SELECT concurrency_key, ${props.rankExpr} AS peak\nFROM concurrency_metrics_by_key\nGROUP BY concurrency_key\nORDER BY peak DESC\nLIMIT 50`,
786786
{ ids: props.ids, timeRange: props.timeRange, queueName: props.queueName }
787787
);
788788
const keyFilter = props.keyFilter;
@@ -810,7 +810,7 @@ function GroupedKeySeries({
810810
}: GroupedKeyChartProps & { keys: string[] }) {
811811
const inList = keys.map((k) => `'${trqlString(k)}'`).join(", ");
812812
const { rows, showLoading, failed } = useQueueMetric(
813-
`SELECT timeBucket() AS t, concurrency_key, ${seriesExpr} AS v\nFROM queue_metrics_by_key\nWHERE concurrency_key IN (${inList})\nGROUP BY t, concurrency_key\nORDER BY t`,
813+
`SELECT timeBucket() AS t, concurrency_key, ${seriesExpr} AS v\nFROM concurrency_metrics_by_key\nWHERE concurrency_key IN (${inList})\nGROUP BY t, concurrency_key\nORDER BY t`,
814814
{ ids, timeRange, queueName, fillGaps }
815815
);
816816

@@ -1074,7 +1074,7 @@ function KeyDrilldown({
10741074
</>
10751075
}
10761076
className="aspect-[2/1]"
1077-
query={`SELECT timeBucket() AS t, max(max_queued) AS queued, max(max_running) AS running\nFROM queue_metrics_by_key\nWHERE ${pin}\nGROUP BY t\nORDER BY t`}
1077+
query={`SELECT timeBucket() AS t, max(max_queued) AS queued, max(max_running) AS running\nFROM concurrency_metrics_by_key\nWHERE ${pin}\nGROUP BY t\nORDER BY t`}
10781078
fillGaps
10791079
minBucketSeconds={SYNCED_CHART_MIN_BUCKET_SECONDS}
10801080
ids={ids}
@@ -1089,7 +1089,7 @@ function KeyDrilldown({
10891089
<QueueDetailChartCard
10901090
title={`Key ${keyName}: throughput`}
10911091
className="aspect-[2/1]"
1092-
query={`SELECT timeBucket() AS t, deltaSumTimestampMerge(started_delta) AS started\nFROM queue_metrics_by_key\nWHERE ${pin}\nGROUP BY t\nORDER BY t`}
1092+
query={`SELECT timeBucket() AS t, deltaSumTimestampMerge(started_delta) AS started\nFROM concurrency_metrics_by_key\nWHERE ${pin}\nGROUP BY t\nORDER BY t`}
10931093
fillGaps
10941094
minBucketSeconds={SYNCED_CHART_MIN_BUCKET_SECONDS}
10951095
ids={ids}
@@ -1100,7 +1100,7 @@ function KeyDrilldown({
11001100
<QueueDetailChartCard
11011101
title={`Key ${keyName}: mean scheduling delay`}
11021102
className="aspect-[2/1]"
1103-
query={`SELECT timeBucket() AS t, if(sum(wait_ms_count) > 0, round(sum(wait_ms_sum) / sum(wait_ms_count)), 0) AS wait, sum(wait_ms_count) AS samples\nFROM queue_metrics_by_key\nWHERE ${pin}\nGROUP BY t\nORDER BY t`}
1103+
query={`SELECT timeBucket() AS t, if(sum(wait_ms_count) > 0, round(sum(wait_ms_sum) / sum(wait_ms_count)), 0) AS wait, sum(wait_ms_count) AS samples\nFROM concurrency_metrics_by_key\nWHERE ${pin}\nGROUP BY t\nORDER BY t`}
11041104
fillGaps
11051105
minBucketSeconds={SYNCED_CHART_MIN_BUCKET_SECONDS}
11061106
sampleCountColumn="samples"
@@ -1145,18 +1145,21 @@ function QueueStats({
11451145
timeRange: TimeRangeParams;
11461146
queueName: string;
11471147
}) {
1148-
const { rows } = useQueueMetric(`SELECT max(max_queued) AS peak_queued\nFROM queue_metrics`, {
1149-
ids,
1150-
timeRange,
1151-
queueName,
1152-
});
1148+
const { rows } = useQueueMetric(
1149+
`SELECT max(max_queued) AS peak_queued\nFROM concurrency_metrics`,
1150+
{
1151+
ids,
1152+
timeRange,
1153+
queueName,
1154+
}
1155+
);
11531156
const peakQueued = rows[0] ? toNumber(rows[0].peak_queued) : 0;
11541157

11551158
// Latest gauges from ClickHouse, polled every 15s so the live blocks keep ticking after first
11561159
// paint. Read the newest bucket (largest t); until the first poll lands liveRows is empty and the
11571160
// *Live values stay null, so the blocks show the loader values instead of flashing 0.
11581161
const { rows: liveRows, responseReceivedAt } = useQueueMetric(
1159-
`SELECT timeBucket() AS t, max(max_running) AS running, max(max_queued) AS queued, max(max_limit) AS q_limit, max(max_ck_wait_ms) AS ck_wait FROM queue_metrics GROUP BY t ORDER BY t`,
1162+
`SELECT timeBucket() AS t, max(max_running) AS running, max(max_queued) AS queued, max(max_limit) AS q_limit, max(max_ck_wait_ms) AS ck_wait FROM concurrency_metrics GROUP BY t ORDER BY t`,
11601163
{
11611164
ids,
11621165
timeRange: { period: "15m", from: null, to: null },

apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.tasks.standard.$taskParam/route.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,7 @@ function TaskActivityCard({
527527
>
528528
{view === "queue" ? (
529529
<QueueMetricChart
530-
query={`SELECT timeBucket() AS t, max(max_queued) AS queued\nFROM queue_metrics\nGROUP BY t\nORDER BY t`}
530+
query={`SELECT timeBucket() AS t, max(max_queued) AS queued\nFROM concurrency_metrics\nGROUP BY t\nORDER BY t`}
531531
fillGaps
532532
ids={ids}
533533
timeRange={timeRange}

apps/webapp/app/routes/api.v1.queues.$queueParam.metrics.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export const loader = createLoaderApiRoute(
5151
findResource: async () => 1, // dummy — the queue name isn't resolved against Postgres
5252
authorization: {
5353
action: "read",
54-
resource: () => ({ type: "query", id: "queue_metrics" }),
54+
resource: () => ({ type: "query", id: "concurrency_metrics" }),
5555
},
5656
},
5757
async ({ params, searchParams, authentication }) => {

apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.spans.$spanParam/route.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1342,7 +1342,7 @@ function WaitingInQueueBlock({
13421342
responseReceivedAt,
13431343
lastSuccessfulResponseAt,
13441344
} = useQueueMetric(
1345-
`SELECT timeBucket() AS t, max(max_running) AS running, max(max_queued) AS queued, max(max_limit) AS q_limit\nFROM queue_metrics\nGROUP BY t\nORDER BY t`,
1345+
`SELECT timeBucket() AS t, max(max_running) AS running, max(max_queued) AS queued, max(max_limit) AS q_limit\nFROM concurrency_metrics\nGROUP BY t\nORDER BY t`,
13461346
{
13471347
ids: waiting.ids,
13481348
timeRange: { period: "15m", from: null, to: null },
@@ -1441,7 +1441,7 @@ function WaitingInQueueBlock({
14411441
</div>
14421442
<div className="h-40">
14431443
<QueueMetricChart
1444-
query={`SELECT timeBucket() AS t,\n round(quantilesMerge(0.5, 0.9, 0.95, 0.99)(wait_quantiles)[1]) AS p50,\n round(quantilesMerge(0.5, 0.9, 0.95, 0.99)(wait_quantiles)[3]) AS p95\nFROM queue_metrics\nGROUP BY t\nORDER BY t`}
1444+
query={`SELECT timeBucket() AS t,\n round(quantilesMerge(0.5, 0.9, 0.95, 0.99)(wait_quantiles)[1]) AS p50,\n round(quantilesMerge(0.5, 0.9, 0.95, 0.99)(wait_quantiles)[3]) AS p95\nFROM concurrency_metrics\nGROUP BY t\nORDER BY t`}
14451445
series={[
14461446
{ key: "p50", label: "p50", color: QUEUE_METRIC_COLORS.p50 },
14471447
{ key: "p95", label: "p95", color: QUEUE_METRIC_COLORS.p95 },

0 commit comments

Comments
 (0)