Files
upstream-tldraw/internal/grafana/resources/dashboards.v2.dashboard.grafana.app/ni5k8zc.yaml
upstream-mirror aa862d2a17
Some checks failed
Checks / Tests & checks (push) Has been cancelled
Checks / Build all projects (push) Has been cancelled
Deploy .com / Deploy dotcom to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Has been cancelled
Deploy templates / Deploy templates (push) Has been cancelled
End to end tests (examples) / End to end tests (examples) (push) Has been cancelled
End to end tests (perf) / End to end tests (perf) (push) Has been cancelled
Publish SDK packages / Publish SDK packages (push) Has been cancelled
End to end tests (dotcom) / End to end tests (dotcom) (push) Has been cancelled
End to end tests (mermaid readability) / End to end tests (mermaid readability) (push) Has been cancelled
Publish SDK packages / Tell user released version (push) Has been cancelled
Publish SDK packages / Publishes code templates to separate repositories (push) Has been cancelled
Publish SDK packages / Deploys the template demos with the new SDK version (push) Has been cancelled
Deploy grafana resources / ${{ github.event_name == 'push' && 'Deploy grafana resources' || 'Validate grafana resources (dry run)' }} (push) Failing after 0s
i18n upload strings / Upload latest strings (push) Failing after 0s
Deploy analytics worker / Deploy analytics worker to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 0s
Deploy bemo / Deploy bemo to ${{ (github.ref == 'refs/heads/bemo-production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 0s
End to end tests (dotcom) / Check for relevant changes (push) Failing after 0s
End to end tests (examples) / Check for relevant changes (push) Failing after 0s
End to end tests (mermaid readability) / Check for relevant changes (push) Failing after 0s
End to end tests (perf) / Check for relevant changes (push) Failing after 0s
Publish editor extensions / Publish editor extensions (push) Failing after 0s
Publish SDK packages / Remove the publish-packages label (push) Has been skipped
Close inactive issues / close-issues (push) Failing after 3s
i18n download strings / Download latest strings (push) Failing after 0s
Post release marketing summary to Discord / Post release marketing summary to Discord (push) Failing after 0s
Post release crew to Discord / Post release crew to Discord (push) Failing after 0s
Prune preview deploys / Prune preview deploys (push) Failing after 1s
Staging E2E Daily Cleanup / Daily Cleanup of Test Files (push) Failing after 0s
top-up: 8 source files 128-600 KB
2026-09-23 16:16:53 +05:00

4884 lines
168 KiB
YAML

apiVersion: dashboard.grafana.app/v2
kind: Dashboard
metadata:
annotations:
grafana.app/folder: dotcom
grafana.app/message: MCP metrics
grafana.app/saved-from-ui: Grafana Cloud
labels: {}
name: ni5k8zc
namespace: stacks-890472
spec:
annotations:
- kind: AnnotationQuery
spec:
builtIn: true
enable: true
hide: true
iconColor: rgba(0, 211, 255, 1)
name: Annotations & Alerts
query:
datasource:
name: -- Grafana --
group: grafana
kind: DataQuery
spec: {}
version: v0
cursorSync: Crosshair
editable: true
elements:
panel-2:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: table
formatAs: table
intervalFactor: 1
query: "SELECT count() as rooms_started
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'room_start'
AND blob2 = '${environment}-tldraw-multiplayer'"
rawQuery: "SELECT count() as rooms_started
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'room_start'
AND blob2 = '${environment}-tldraw-multiplayer'"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: room_start events in the selected time range.
id: 2
links: []
title: Rooms started
vizConfig:
group: stat
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: thresholds
thresholds:
mode: absolute
steps:
- color: green
value: 0
unit: short
overrides: []
options:
colorMode: value
graphMode: none
justifyMode: auto
orientation: auto
percentChangeColorMode: standard
reduceOptions:
calcs:
- lastNotNull
fields: ''
values: false
showPercentChange: false
textMode: auto
wideLayout: true
version: 13.2.0-29854286369
panel-5:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: table
formatAs: table
intervalFactor: 1
query: "SELECT count() as failures
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'fail_persist'
AND blob2 = '${environment}-tldraw-multiplayer'"
rawQuery: "SELECT count() as failures
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'fail_persist'
AND blob2 = '${environment}-tldraw-multiplayer'"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: fail_persist events (persist gave up after retries). Anything
above zero deserves a look.
id: 5
links: []
title: Persist failures
vizConfig:
group: stat
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: thresholds
thresholds:
mode: absolute
steps:
- color: green
value: 0
- color: red
value: 1
unit: short
overrides: []
options:
colorMode: value
graphMode: none
justifyMode: auto
orientation: auto
percentChangeColorMode: standard
reduceOptions:
calcs:
- lastNotNull
fields: ''
values: false
showPercentChange: false
textMode: auto
wideLayout: true
version: 13.2.0-29854286369
panel-7:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob1 as event, count() as total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 IN ('room_create', 'room_reopen', 'enter', 'leave',
'last_out')
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, event
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob1 as event, count() as total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 IN ('room_create', 'room_reopen', 'enter', 'leave',
'last_out')
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, event
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: 'Connection lifecycle from TLFileDurableObject: creates, reopens,
enters, leaves.'
id: 7
links: []
title: Room lifecycle events
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: bars
fillOpacity: 80
gradientMode: none
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 0
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: normal
thresholdsStyle:
mode: 'off'
thresholds:
mode: absolute
steps:
- color: green
value: 0
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-8:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob1 as event, count() as total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 IN ('room_start', 'room_empty', 'failed_load_from_db',
'failed_persist_to_db', 'fail_persist')
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, event
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob1 as event, count() as total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 IN ('room_start', 'room_empty', 'failed_load_from_db',
'failed_persist_to_db', 'fail_persist')
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, event
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: 'Room starts/empties plus every failure path: failed loads, failed
persist attempts, and persists that gave up.'
id: 8
links: []
title: Room health & persistence events
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: bars
fillOpacity: 80
gradientMode: none
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 0
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: normal
thresholdsStyle:
mode: 'off'
thresholds:
mode: absolute
steps:
- color: green
value: 0
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-9:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, count() as messages
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'send_message'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, count() as messages
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'send_message'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: send_message events from room durable objects (one per outgoing
sync message).
id: 9
links: []
title: Sync messages sent
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: line
fillOpacity: 25
gradientMode: opacity
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 1.5
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: none
thresholdsStyle:
mode: 'off'
thresholds:
mode: absolute
steps:
- color: green
value: 0
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: false
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-10:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob4 as message_type, sum(double1) as bytes
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'send_message'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, message_type
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob4 as message_type, sum(double1) as bytes
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'send_message'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, message_type
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: Outgoing message payload volume, split by message type (blob4).
double1 is the message length.
id: 10
links: []
title: Sync message bytes by type
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: line
fillOpacity: 30
gradientMode: opacity
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 1.5
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: normal
thresholdsStyle:
mode: 'off'
thresholds:
mode: absolute
steps:
- color: green
value: 0
unit: bytes
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-11:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: table
formatAs: table
intervalFactor: 1
query: "SELECT blob4 as message_type, count() as total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'send_message'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY message_type
ORDER BY total DESC"
rawQuery: "SELECT blob4 as message_type, count() as total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'send_message'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY message_type
ORDER BY total DESC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: Share of outgoing sync messages by type over the selected range.
id: 11
links: []
title: Message type mix
vizConfig:
group: piechart
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
fixedColor: '#73BF69'
mode: palette-classic
custom:
hideFrom:
legend: false
tooltip: false
viz: false
unit: short
overrides: []
options:
displayLabels:
- percent
legend:
displayMode: list
overflow: ellipsis
placement: right
showLegend: true
values: []
pieType: donut
reduceOptions:
calcs:
- lastNotNull
fields: ''
values: true
sort: desc
tooltip:
hideZeros: false
mode: single
sort: none
version: 13.2.0-29854286369
panel-12:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, quantileWeighted(0.5, double1, _sample_interval)
as p50, quantileWeighted(0.95, double1, _sample_interval) as
p95, quantileWeighted(0.99, double1, _sample_interval) as p99
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'db_load_total'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, quantileWeighted(0.5, double1, _sample_interval)
as p50, quantileWeighted(0.95, double1, _sample_interval) as
p95, quantileWeighted(0.99, double1, _sample_interval) as p99
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'db_load_total'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: Full room snapshot load time, weighted by _sample_interval to
account for Analytics Engine sampling.
id: 12
links: []
title: Room load latency percentiles (db_load_total)
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: line
fillOpacity: 12
gradientMode: opacity
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 1.5
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: none
thresholdsStyle:
mode: 'off'
min: 0
thresholds:
mode: absolute
steps:
- color: green
value: 0
unit: ms
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-13:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob1 as stage, avg(double1) as avg_ms
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 IN ('on_request_total', 'on_request_auth', 'on_request_rate_limit',
'on_request_group_check', 'on_request_get_room')
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, stage
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob1 as stage, avg(double1) as avg_ms
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 IN ('on_request_total', 'on_request_auth', 'on_request_rate_limit',
'on_request_group_check', 'on_request_get_room')
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, stage
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: Average duration of each stage of a room connect request (auth,
rate limit, group check, get room, total).
id: 13
links: []
title: Connect request latency breakdown
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: line
fillOpacity: 12
gradientMode: opacity
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 1.5
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: none
thresholdsStyle:
mode: 'off'
min: 0
thresholds:
mode: absolute
steps:
- color: green
value: 0
unit: ms
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-14:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob1 as stage, avg(double1) as avg_ms
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 IN ('create_from_source_fetch_total', 'create_from_source_r2_put',
'create_from_source_await_persist', 'create_from_source_r2_fetch',
'db_load_r2_fetch', 'db_load_supabase_fetch', 'db_load_create_from_source',
'db_load_comments')
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, stage
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob1 as stage, avg(double1) as avg_ms
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 IN ('create_from_source_fetch_total', 'create_from_source_r2_put',
'create_from_source_await_persist', 'create_from_source_r2_fetch',
'db_load_r2_fetch', 'db_load_supabase_fetch', 'db_load_create_from_source',
'db_load_comments')
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, stage
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: Average duration of file duplication stages and room load sub-stages.
id: 14
links: []
title: Create-from-source & load stage latency
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: line
fillOpacity: 12
gradientMode: opacity
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 1.5
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: none
thresholdsStyle:
mode: 'off'
min: 0
thresholds:
mode: absolute
steps:
- color: green
value: 0
unit: ms
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-15:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: table
formatAs: table
intervalFactor: 1
query: "SELECT blob1 as operation, avg(double1) as avg_ms
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 IN ('on_request_total', 'on_request_auth', 'on_request_rate_limit',
'on_request_group_check', 'on_request_get_room', 'get_file_record',
'get_file_record_error', 'db_load_total', 'db_load_total_error',
'db_load_r2_fetch', 'db_load_supabase_fetch', 'db_load_create_from_source', 'db_load_comments',
'create_from_source_fetch_total', 'create_from_source_r2_put',
'create_from_source_await_persist', 'create_from_source_r2_fetch')
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY operation
ORDER BY avg_ms DESC"
rawQuery: "SELECT blob1 as operation, avg(double1) as avg_ms
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 IN ('on_request_total', 'on_request_auth', 'on_request_rate_limit',
'on_request_group_check', 'on_request_get_room', 'get_file_record',
'get_file_record_error', 'db_load_total', 'db_load_total_error',
'db_load_r2_fetch', 'db_load_supabase_fetch', 'db_load_create_from_source', 'db_load_comments',
'create_from_source_fetch_total', 'create_from_source_r2_put',
'create_from_source_await_persist', 'create_from_source_r2_fetch')
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY operation
ORDER BY avg_ms DESC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: Average duration of every timed operation in the selected range,
slowest first.
id: 15
links: []
title: Operation latency league table
vizConfig:
group: bargauge
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: continuous-GrYlRd
min: 0
thresholds:
mode: absolute
steps:
- color: green
value: 0
unit: ms
overrides: []
options:
displayMode: gradient
legend:
calcs: []
displayMode: list
overflow: ellipsis
placement: bottom
showLegend: false
maxVizHeight: 300
minVizHeight: 16
minVizWidth: 8
namePlacement: auto
orientation: horizontal
reduceOptions:
calcs:
- lastNotNull
fields: ''
values: true
showUnfilled: true
sizing: auto
valueMode: color
version: 13.2.0-29854286369
panel-25:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob1 as event, count() as total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 IN ('postgres_client_connect', 'postgres_client_end',
'postgres_client_error')
AND blob2 = '${environment}-tldraw-multiplayer'
AND blob3 != 'user-do'
GROUP BY date, event
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob1 as event, count() as total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 IN ('postgres_client_connect', 'postgres_client_end',
'postgres_client_error')
AND blob2 = '${environment}-tldraw-multiplayer'
AND blob3 != 'user-do'
GROUP BY date, event
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: 'Connection lifecycle from the logging pg client: connect, end, error. Excludes user-do — it dials a fresh client per checkout at roughly 20x the volume of every other pool combined, and its teardown currently mis-fires an error event per release, which would drown this panel. user-do has its own dial, acquire and lifecycle panels below.'
id: 25
links: []
title: Postgres client connection events (excluding user-do)
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: bars
fillOpacity: 80
gradientMode: none
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 0
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: normal
thresholdsStyle:
mode: 'off'
thresholds:
mode: absolute
steps:
- color: green
value: 0
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-26:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob3 as pool, count() as total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'postgres_client_connect'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, pool
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob3 as pool, count() as total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'postgres_client_connect'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, pool
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: postgres_client_connect events split by the pool name (blob3)
that opened them — shows which routes churn connections.
id: 26
links: []
title: Postgres connections by pool
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: line
fillOpacity: 30
gradientMode: opacity
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 1.5
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: normal
thresholdsStyle:
mode: 'off'
thresholds:
mode: absolute
steps:
- color: green
value: 0
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-27:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob2 as origin, count() as connects
FROM 'BEMO_ANALYTICS'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'connect'
GROUP BY date, origin
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob2 as origin, count() as connects
FROM 'BEMO_ANALYTICS'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'connect'
GROUP BY date, origin
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: BEMO_ANALYTICS dataset (demo sync server). blob1 is the event
type here — there is no worker-name column and no environment filter. Requires
the BEMO_ANALYTICS table in this datasource.
id: 27
links: []
title: Demo server connects by origin
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: bars
fillOpacity: 80
gradientMode: none
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 0
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: normal
thresholdsStyle:
mode: 'off'
thresholds:
mode: absolute
steps:
- color: green
value: 0
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-28:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob1 as direction, count() as total
FROM 'BEMO_ANALYTICS'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 IN ('send_message', 'receive_message')
GROUP BY date, direction
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob1 as direction, count() as total
FROM 'BEMO_ANALYTICS'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 IN ('send_message', 'receive_message')
GROUP BY date, direction
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: Messages sent/received by demo rooms (one data point per message).
id: 28
links: []
title: Demo server message throughput
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: line
fillOpacity: 20
gradientMode: opacity
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 1.5
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: none
thresholdsStyle:
mode: 'off'
thresholds:
mode: absolute
steps:
- color: green
value: 0
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-29:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: table
formatAs: table
intervalFactor: 1
query: "SELECT blob2 as origin, count() as total
FROM 'BEMO_ANALYTICS'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'connect'
GROUP BY origin
ORDER BY total DESC
LIMIT 12"
rawQuery: "SELECT blob2 as origin, count() as total
FROM 'BEMO_ANALYTICS'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'connect'
GROUP BY origin
ORDER BY total DESC
LIMIT 12"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: Which domains embed the demo sync server, by connect count.
id: 29
links: []
title: Top embedding origins
vizConfig:
group: piechart
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
fixedColor: '#73BF69'
mode: palette-classic
custom:
hideFrom:
legend: false
tooltip: false
viz: false
unit: short
overrides: []
options:
displayLabels:
- percent
legend:
displayMode: list
overflow: ellipsis
placement: right
showLegend: true
values: []
pieType: donut
reduceOptions:
calcs:
- lastNotNull
fields: ''
values: true
sort: desc
tooltip:
hideZeros: false
mode: single
sort: none
version: 13.2.0-29854286369
panel-33:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: table
formatAs: table
intervalFactor: 1
query: "SELECT count() as renders
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'browser_run_session'
AND blob4 = 'mode:screenshot'
AND blob5 = 'outcome:ok'
AND blob2 = '${environment}-tldraw-multiplayer'"
rawQuery: "SELECT count() as renders
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'browser_run_session'
AND blob4 = 'mode:screenshot'
AND blob5 = 'outcome:ok'
AND blob2 = '${environment}-tldraw-multiplayer'"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: Browser sessions that produced a PNG (browser_run_session rows
with mode:screenshot and outcome:ok), across the MCP tool and the OG queue.
Measure renders, cache hits, and failed sessions are excluded.
id: 33
links: []
title: Board screenshots rendered
vizConfig:
group: stat
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: thresholds
thresholds:
mode: absolute
steps:
- color: green
value: 0
unit: short
overrides: []
options:
colorMode: value
graphMode: area
justifyMode: auto
orientation: auto
percentChangeColorMode: standard
reduceOptions:
calcs:
- lastNotNull
fields: ''
values: false
showPercentChange: false
textMode: auto
wideLayout: true
version: 13.2.0-29854286369
panel-34:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: table
formatAs: table
intervalFactor: 1
query: "SELECT countIf(blob4 = 'cache:hit') / count() * 100
as hit_rate
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'mcp_shared_board_screenshot'
AND blob3 = 'source:og'
AND blob2 = '${environment}-tldraw-multiplayer'"
rawQuery: "SELECT countIf(blob4 = 'cache:hit') / count() * 100
as hit_rate
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'mcp_shared_board_screenshot'
AND blob3 = 'source:og'
AND blob2 = '${environment}-tldraw-multiplayer'"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: Share of GET /app/social-preview requests (source:og) served
straight from the R2 cache. Stale-but-served and never-rendered responses
count against it, since both trigger a background render.
id: 34
links: []
title: OG image cache hit rate
vizConfig:
group: stat
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: thresholds
max: 100
min: 0
thresholds:
mode: absolute
steps:
- color: red
value: 0
- color: orange
value: 50
- color: green
value: 80
unit: percent
overrides: []
options:
colorMode: value
graphMode: none
justifyMode: auto
orientation: auto
percentChangeColorMode: standard
reduceOptions:
calcs:
- lastNotNull
fields: ''
values: false
showPercentChange: false
textMode: auto
wideLayout: true
version: 13.2.0-29854286369
panel-35:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: table
formatAs: table
intervalFactor: 1
query: "SELECT count() as failures
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'mcp_shared_board_screenshot'
AND blob5 != 'failure:none'
AND blob2 = '${environment}-tldraw-multiplayer'"
rawQuery: "SELECT count() as failures
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'mcp_shared_board_screenshot'
AND blob5 != 'failure:none'
AND blob2 = '${environment}-tldraw-multiplayer'"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: Events carrying a failure reason code, across all three surfaces.
Sustained non-zero means boards are missing their previews — break it down
in the failures-by-reason panel below.
id: 35
links: []
title: Screenshot failures
vizConfig:
group: stat
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: thresholds
thresholds:
mode: absolute
steps:
- color: green
value: 0
- color: red
value: 1
unit: short
overrides: []
options:
colorMode: value
graphMode: none
justifyMode: auto
orientation: auto
percentChangeColorMode: standard
reduceOptions:
calcs:
- lastNotNull
fields: ''
values: false
showPercentChange: false
textMode: auto
wideLayout: true
version: 13.2.0-29854286369
panel-36:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: table
formatAs: table
intervalFactor: 1
query: "SELECT count() as blocked
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'mcp_shared_board_screenshot'
AND blob6 = 'rate_limit:blocked'
AND blob2 = '${environment}-tldraw-multiplayer'"
rawQuery: "SELECT count() as blocked
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'mcp_shared_board_screenshot'
AND blob6 = 'rate_limit:blocked'
AND blob2 = '${environment}-tldraw-multiplayer'"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: Events blocked by a rate limiter (per-IP, per-board, or the shared
global Browser Run cap). Queue jobs blocked this way are requeued rather
than dropped.
id: 36
links: []
title: Rate-limited screenshot events
vizConfig:
group: stat
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: thresholds
thresholds:
mode: absolute
steps:
- color: green
value: 0
- color: red
value: 1
unit: short
overrides: []
options:
colorMode: value
graphMode: none
justifyMode: auto
orientation: auto
percentChangeColorMode: standard
reduceOptions:
calcs:
- lastNotNull
fields: ''
values: false
showPercentChange: false
textMode: auto
wideLayout: true
version: 13.2.0-29854286369
panel-37:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, substring(blob3, 8) as surface, count() as
total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'mcp_shared_board_screenshot'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, surface
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, substring(blob3, 8) as surface, count() as
total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'mcp_shared_board_screenshot'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, surface
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: 'All screenshot telemetry split by the surface that emitted it:
mcp (the shared board screenshot tool), og (the social-preview route), and
queue (the background render consumer).'
id: 37
links: []
title: Screenshot events by surface
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: bars
fillOpacity: 80
gradientMode: none
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 0
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: normal
thresholdsStyle:
mode: 'off'
thresholds:
mode: absolute
steps:
- color: green
value: 0
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-38:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, substring(blob3, 8) as source, countIf(blob4
= 'cache:hit') / count() * 100 as hit_rate
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'mcp_shared_board_screenshot'
AND blob4 != 'cache:none'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, source
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, substring(blob3, 8) as source, countIf(blob4
= 'cache:hit') / count() * 100 as hit_rate
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'mcp_shared_board_screenshot'
AND blob4 != 'cache:none'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, source
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: 'Share of cache-consulting requests served a fresh image, per
source. og is the one that matters most: a miss there sends a crawler the
default image and degrades the link unfurl, while an mcp miss just pays for
a render. Stale counts against it; cache:none rows (refusals, and the info
tools which have no cache) are excluded so refusal volume cannot move this
number.'
id: 38
links: []
title: Cache hit rate by source
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: line
fillOpacity: 10
gradientMode: none
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 2
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: none
thresholdsStyle:
mode: 'off'
max: 100
min: 0
thresholds:
mode: absolute
steps:
- color: green
value: 0
unit: percent
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-39:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, substring(blob5, 9) as reason, count() as total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'mcp_shared_board_screenshot'
AND blob5 != 'failure:none'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, reason
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, substring(blob5, 9) as reason, count() as total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'mcp_shared_board_screenshot'
AND blob5 != 'failure:none'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, reason
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: 'Bounded failure reason codes: board_not_viewable, board_empty,
not_found, not_rendered_yet, no_pages, page_out_of_range, invalid_input,
and the rate_limited_* codes.'
id: 39
links: []
title: Screenshot failures by reason
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: bars
fillOpacity: 80
gradientMode: none
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 0
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: normal
thresholdsStyle:
mode: 'off'
thresholds:
mode: absolute
steps:
- color: green
value: 0
overrides:
- __systemRef: hideSeriesFrom
matcher:
id: byNames
options:
mode: exclude
names:
- not_rendered_yet
prefix: 'All except:'
readOnly: true
properties:
- id: custom.hideFrom
value:
legend: false
tooltip: true
viz: true
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-40:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, substring(blob4, 6) as mode, quantileWeighted(0.5,
double3, _sample_interval) as p50, quantileWeighted(0.95, double3,
_sample_interval) as p95, quantileWeighted(0.99, double3, _sample_interval)
as p99
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'browser_run_session'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, mode
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, substring(blob4, 6) as mode, quantileWeighted(0.5,
double3, _sample_interval) as p50, quantileWeighted(0.95, double3,
_sample_interval) as p95, quantileWeighted(0.99, double3, _sample_interval)
as p99
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'browser_run_session'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, mode
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: Wall-clock per browser session from the browser_run_session
ledger, split by what the session was for (measure vs screenshot) and
weighted by _sample_interval to account for Analytics Engine sampling.
Failed sessions are included — they held a browser too.
id: 40
links: []
title: Browser Run render duration percentiles
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: line
fillOpacity: 12
gradientMode: opacity
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 1.5
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: none
thresholdsStyle:
mode: 'off'
min: 0
thresholds:
mode: absolute
steps:
- color: green
value: 0
unit: ms
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-41:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, substring(blob3, 8) as surface, count() as
total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'mcp_shared_board_screenshot'
AND blob6 = 'rate_limit:blocked'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, surface
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, substring(blob3, 8) as surface, count() as
total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'mcp_shared_board_screenshot'
AND blob6 = 'rate_limit:blocked'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, surface
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: Which surface is hitting a limiter. Sustained queue blocking
means the shared global Browser Run cap is saturated; mcp blocking is usually
a single account hitting its per-account limit.
id: 41
links: []
title: Rate-limited screenshots by surface
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: bars
fillOpacity: 80
gradientMode: none
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 0
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: normal
thresholdsStyle:
mode: 'off'
thresholds:
mode: absolute
steps:
- color: green
value: 0
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-42:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval' SECOND) as date, quantileWeighted(0.5, double1, _sample_interval) as p50, quantileWeighted(0.95, double1, _sample_interval) as p95, quantileWeighted(0.99, double1, _sample_interval) as p99 FROM 'MEASURE' WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to) AND blob1 = 'postgres_client_connect_done' AND blob3 = 'user-do' AND blob2 = '${environment}-tldraw-multiplayer' GROUP BY date ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval' SECOND) as date, quantileWeighted(0.5, double1, _sample_interval) as p50, quantileWeighted(0.95, double1, _sample_interval) as p95, quantileWeighted(0.99, double1, _sample_interval) as p99 FROM 'MEASURE' WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to) AND blob1 = 'postgres_client_connect_done' AND blob3 = 'user-do' AND blob2 = '${environment}-tldraw-multiplayer' GROUP BY date ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: 'Time to establish a postgres connection for the user-do pool — TCP, TLS and auth through pgbouncer — from postgres_client_connect_done (double1), weighted by _sample_interval. user-do dials a fresh client per DO checkout and carries ~95% of dial volume, so it gets the full percentile treatment; every other pool is on the dial p95 by pool panel. A dial that hangs never completes and only shows up on the never-completed panel.'
id: 42
links: []
title: Postgres dial duration percentiles (user-do)
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: line
fillOpacity: 12
gradientMode: opacity
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 1.5
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: none
thresholdsStyle:
mode: 'off'
min: 0
thresholds:
mode: absolute
steps:
- color: green
value: 0
unit: ms
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-43:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval' SECOND) as date, blob3 as pool, sum(if(blob1 = 'postgres_client_connect', _sample_interval, -_sample_interval)) as pending FROM 'MEASURE' WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to) AND blob1 IN ('postgres_client_connect', 'postgres_client_connect_done') AND blob2 = '${environment}-tldraw-multiplayer' GROUP BY date, pool ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval' SECOND) as date, blob3 as pool, sum(if(blob1 = 'postgres_client_connect', _sample_interval, -_sample_interval)) as pending FROM 'MEASURE' WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to) AND blob1 IN ('postgres_client_connect', 'postgres_client_connect_done') AND blob2 = '${environment}-tldraw-multiplayer' GROUP BY date, pool ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: "Dial starts minus completions per pool, weighted by _sample_interval because the dataset is sampled. postgres_client_connect fires when a dial starts and postgres_client_connect_done when it resolves either way, so a healthy pool oscillates around zero and a persistently positive line counts dials that hung. Absolute dial volume is on the connections-by-pool panel. Ignore ranges before 2026-08-11 12:40 UTC — the done event didn't exist yet, so everything before then reads as a gap."
id: 43
links: []
title: Postgres dials never completed by pool
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: line
fillOpacity: 12
gradientMode: opacity
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 1.5
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: none
thresholdsStyle:
mode: 'off'
thresholds:
mode: absolute
steps:
- color: green
value: 0
unit: short
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-44:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval' SECOND) as date, quantileWeighted(0.5, double1, _sample_interval) as p50, quantileWeighted(0.95, double1, _sample_interval) as p95, quantileWeighted(0.99, double1, _sample_interval) as p99 FROM 'MEASURE' WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to) AND blob1 = 'postgres_pool_acquire' AND blob3 = 'user-do' AND blob2 = '${environment}-tldraw-multiplayer' GROUP BY date ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval' SECOND) as date, quantileWeighted(0.5, double1, _sample_interval) as p50, quantileWeighted(0.95, double1, _sample_interval) as p95, quantileWeighted(0.99, double1, _sample_interval) as p99 FROM 'MEASURE' WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to) AND blob1 = 'postgres_pool_acquire' AND blob3 = 'user-do' AND blob2 = '${environment}-tldraw-multiplayer' GROUP BY date ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: 'Time from asking the user-do pool for a client to holding one, from postgres_pool_acquire (double1), weighted by _sample_interval. user-do serializes checkouts, so this is lock wait plus a fresh dial — a slow holder shows up here even when the dial itself is fast. Other pools are on the acquire p95 by pool panel.'
id: 44
links: []
title: Postgres pool acquire wait percentiles (user-do)
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: line
fillOpacity: 12
gradientMode: opacity
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 1.5
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: none
thresholdsStyle:
mode: 'off'
min: 0
thresholds:
mode: absolute
steps:
- color: green
value: 0
unit: ms
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-45:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval' SECOND) as date, blob9 as followup, count() as total FROM 'MEASURE' WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to) AND blob1 = 'mcp_shared_board_screenshot' AND blob3 = 'source:queue' AND blob9 != '' AND blob4 = 'cache:miss' AND blob5 = 'failure:none' AND blob2 = '${environment}-tldraw-multiplayer' GROUP BY date, followup ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval' SECOND) as date, blob9 as followup, count() as total FROM 'MEASURE' WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to) AND blob1 = 'mcp_shared_board_screenshot' AND blob3 = 'source:queue' AND blob9 != '' AND blob4 = 'cache:miss' AND blob5 = 'failure:none' AND blob2 = '${environment}-tldraw-multiplayer' GROUP BY date, followup ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: 'Queue renders that spent Browser Run (a cache miss that then rendered without failing; durations moved to browser_run_session, so double3 is now a -1 sentinel) split by blob9. followup:false is the render a trigger asked for; followup:true is the extra render a completed job enqueues because the board moved during its capture. Request surfaces record followup:none and are excluded by the source filter. Data starts 2026-08-11 — earlier queue renders predate the followup blob and are filtered out.'
id: 45
links: []
title: Queue renders by follow-up state
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: bars
fillOpacity: 80
gradientMode: none
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 0
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: normal
thresholdsStyle:
mode: 'off'
thresholds:
mode: absolute
steps:
- color: green
value: 0
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-46:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval' SECOND) as date, blob3 as pool, quantileWeighted(0.95, double1, _sample_interval) as p95 FROM 'MEASURE' WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to) AND blob1 = 'postgres_client_connect_done' AND blob2 = '${environment}-tldraw-multiplayer' GROUP BY date, pool ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval' SECOND) as date, blob3 as pool, quantileWeighted(0.95, double1, _sample_interval) as p95 FROM 'MEASURE' WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to) AND blob1 = 'postgres_client_connect_done' AND blob2 = '${environment}-tldraw-multiplayer' GROUP BY date, pool ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: 'p95 dial time split by pool (blob3), weighted by _sample_interval. Aggregate percentiles would just track user-do (~95% of dial volume), so every pool gets a line of its own here. Low-traffic pools are spiky — read trends, not single buckets.'
id: 46
links: []
title: Postgres dial p95 by pool
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: line
fillOpacity: 12
gradientMode: opacity
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 1.5
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: none
thresholdsStyle:
mode: 'off'
min: 0
thresholds:
mode: absolute
steps:
- color: green
value: 0
unit: ms
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-47:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval' SECOND) as date, blob3 as pool, quantileWeighted(0.95, double1, _sample_interval) as p95 FROM 'MEASURE' WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to) AND blob1 = 'postgres_pool_acquire' AND blob2 = '${environment}-tldraw-multiplayer' GROUP BY date, pool ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval' SECOND) as date, blob3 as pool, quantileWeighted(0.95, double1, _sample_interval) as p95 FROM 'MEASURE' WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to) AND blob1 = 'postgres_pool_acquire' AND blob2 = '${environment}-tldraw-multiplayer' GROUP BY date, pool ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: 'p95 acquire wait split by pool (blob3), weighted by _sample_interval. For the pg pools this is queueing while every client is busy plus any fresh dial; for user-do it is lock wait plus dial, since checkouts serialize.'
id: 47
links: []
title: Postgres pool acquire p95 by pool
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: line
fillOpacity: 12
gradientMode: opacity
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 1.5
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: none
thresholdsStyle:
mode: 'off'
min: 0
thresholds:
mode: absolute
steps:
- color: green
value: 0
unit: ms
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-48:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval' SECOND) as date, blob1 as event, count() as total FROM 'MEASURE' WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to) AND blob1 IN ('postgres_client_connect', 'postgres_client_end', 'postgres_client_error') AND blob3 = 'user-do' AND blob2 = '${environment}-tldraw-multiplayer' GROUP BY date, event ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval' SECOND) as date, blob1 as event, count() as total FROM 'MEASURE' WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to) AND blob1 IN ('postgres_client_connect', 'postgres_client_end', 'postgres_client_error') AND blob3 = 'user-do' AND blob2 = '${environment}-tldraw-multiplayer' GROUP BY date, event ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: 'Connection lifecycle for the user-do pool: connect, end, error. Split from the shared events panel because user-do dials a fresh client per DO checkout at roughly 20x the volume of every other pool combined. Known artifact: teardown currently mis-fires an error event per client release, so the error series runs at end volume — read spikes above that baseline, not the baseline itself.'
id: 48
links: []
title: Postgres client connection events (user-do)
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: bars
fillOpacity: 80
gradientMode: none
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 0
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: normal
thresholdsStyle:
mode: 'off'
thresholds:
mode: absolute
steps:
- color: green
value: 0
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-49:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob3 as wrote, count() as total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'version_chain_write'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, wrote
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob3 as wrote, count() as total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'version_chain_write'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, wrote
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: version_chain_write events split keyframe vs delta. A healthy
chain writes mostly deltas with an occasional keyframe.
id: 49
links: []
title: Version chain writes
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: bars
fillOpacity: 80
gradientMode: none
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 0
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: normal
thresholdsStyle:
mode: 'off'
thresholds:
mode: absolute
steps:
- color: green
value: 0
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-50:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob4 as reason, count() as total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'version_chain_write'
AND blob3 = 'keyframe'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, reason
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob4 as reason, count() as total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'version_chain_write'
AND blob3 = 'keyframe'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, reason
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: "Why keyframes were cut. 'segment-lost' is the lost-open-segment
recovery and 'fingerprint-mismatch' a dead-incarnation seed divergence —
spikes in either deserve a look."
id: 50
links: []
title: Keyframe reasons
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: bars
fillOpacity: 80
gradientMode: none
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 0
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: normal
thresholdsStyle:
mode: 'off'
thresholds:
mode: absolute
steps:
- color: green
value: 0
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-51:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, if(blob3 = 'ok', 'ok', concat(blob3, ':', blob4))
as result, count() as total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'version_chain_verify'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, result
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, if(blob3 = 'ok', 'ok', concat(blob3, ':', blob4))
as result, count() as total
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'version_chain_verify'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, result
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: 'Retired-chain verification. Fail reasons: missing | legacy-fallback
| head-mismatch | error. Any fail means a reconstruction did not reproduce
the persisted state.'
id: 51
links: []
title: Verify results
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: bars
fillOpacity: 80
gradientMode: none
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 0
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: normal
thresholdsStyle:
mode: 'off'
thresholds:
mode: absolute
steps:
- color: green
value: 0
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-52:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: table
formatAs: table
intervalFactor: 1
query: "SELECT count() as errors
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'version_chain_error'
AND blob2 = '${environment}-tldraw-multiplayer'"
rawQuery: "SELECT count() as errors
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'version_chain_error'
AND blob2 = '${environment}-tldraw-multiplayer'"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: Chain writes that failed and fell back to the legacy copy. Anything
above zero deserves a look.
id: 52
links: []
title: Chain write errors
vizConfig:
group: stat
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: thresholds
thresholds:
mode: absolute
steps:
- color: green
value: 0
- color: red
value: 1
unit: short
overrides: []
options:
colorMode: value
graphMode: none
justifyMode: auto
orientation: auto
percentChangeColorMode: standard
reduceOptions:
calcs:
- lastNotNull
fields: ''
values: false
showPercentChange: false
textMode: auto
wideLayout: true
version: 13.2.0-29854286369
panel-53:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob3 as wrote, sum(double1) as bytes
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'version_chain_write'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, wrote
ORDER BY date ASC"
rawQuery: "SELECT toStartOfInterval(timestamp, INTERVAL '$interval'
SECOND) as date, blob3 as wrote, sum(double1) as bytes
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'version_chain_write'
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date, wrote
ORDER BY date ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: Encoded bytes uploaded to the chain bucket, split by write type
(double1 is the encoded body size).
id: 53
links: []
title: Chain bytes written
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: line
fillOpacity: 30
gradientMode: opacity
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 1.5
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: normal
thresholdsStyle:
mode: 'off'
thresholds:
mode: absolute
steps:
- color: green
value: 0
unit: bytes
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-54:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: time_series
formatAs: time_series
intervalFactor: 1
query: |-
SELECT toStartOfInterval(timestamp, INTERVAL '$interval' SECOND) as date, quantileWeighted(0.5, double3, _sample_interval) as total_p50, quantileWeighted(0.5, double4, _sample_interval) as browser_p50, quantileWeighted(0.95, double3, _sample_interval) as total_p95, quantileWeighted(0.95, double4, _sample_interval) as browser_p95
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'browser_run_session'
AND blob4 = 'mode:screenshot'
AND blob5 = 'outcome:ok'
AND double4 > 0
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date
ORDER BY date ASC
rawQuery: |-
SELECT toStartOfInterval(timestamp, INTERVAL '$interval' SECOND) as date, quantileWeighted(0.5, double3, _sample_interval) as total_p50, quantileWeighted(0.5, double4, _sample_interval) as browser_p50, quantileWeighted(0.95, double3, _sample_interval) as total_p95, quantileWeighted(0.95, double4, _sample_interval) as browser_p95
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob1 = 'browser_run_session'
AND blob4 = 'mode:screenshot'
AND blob5 = 'outcome:ok'
AND double4 > 0
AND blob2 = '${environment}-tldraw-multiplayer'
GROUP BY date
ORDER BY date ASC
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: 'Total session wall clock (double3) against the browser wall clock Browser Run bills for it (double4, from the X-Browser-Ms-Used header), for successful screenshot renders on every surface — OG image thumbnails and MCP cluster screenshots alike. The gap between the lines is everything outside the browser — RPC, Browser Run queueing, response transfer — which is where the pipeline variance lives. Sessions with no billed time recorded (failures, the local dev service, rows from before the field existed) are excluded by double4 > 0.'
id: 54
links: []
title: In-browser vs total render time
vizConfig:
group: timeseries
kind: VizConfig
spec:
fieldConfig:
defaults:
color:
mode: palette-classic
custom:
axisBorderShow: false
axisCenteredZero: false
axisColorMode: text
axisLabel: ''
axisPlacement: auto
barAlignment: 0
barWidthFactor: 0.8
drawStyle: line
fillOpacity: 10
gradientMode: opacity
hideFrom:
legend: false
tooltip: false
viz: false
insertNulls: false
lineInterpolation: linear
lineWidth: 1.5
pointSize: 5
scaleDistribution:
type: linear
showPoints: never
showValues: false
spanNulls: false
stacking:
group: A
mode: none
thresholdsStyle:
mode: 'off'
thresholds:
mode: absolute
steps:
- color: green
value: 0
unit: ms
overrides: []
options:
annotations:
clustering: -1
multiLane: false
legend:
calcs: []
displayMode: list
enableFacetedFilter: false
overflow: ellipsis
placement: bottom
showLegend: true
tooltip:
hideZeros: false
maxHeight: 600
mode: multi
sort: desc
version: 13.2.0-29854286369
panel-55:
kind: Panel
spec:
data:
kind: QueryGroup
spec:
queries:
- kind: PanelQuery
spec:
hidden: false
query:
datasource:
name: bdgu7tk03irr4e
group: vertamedia-clickhouse-datasource
kind: DataQuery
spec:
dateTimeType: DATETIME
editorMode: code
extrapolate: true
format: table
formatAs: table
intervalFactor: 1
query:
"SELECT timestamp, blob1 AS operation, double1 AS ms, blob3 AS blob3, blob4 AS blob4
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob2 = '${environment}-tldraw-multiplayer'
AND '${load_id}' != '' AND (blob3 = '${load_id}' OR blob4 = '${load_id}')
ORDER BY timestamp ASC"
rawQuery:
"SELECT timestamp, blob1 AS operation, double1 AS ms, blob3 AS blob3, blob4 AS blob4
FROM 'MEASURE'
WHERE timestamp >= toDateTime($from) AND timestamp <= toDateTime($to)
AND blob2 = '${environment}-tldraw-multiplayer'
AND '${load_id}' != '' AND (blob3 = '${load_id}' OR blob4 = '${load_id}')
ORDER BY timestamp ASC"
round: 0s
showFormattedSQL: false
showHelp: false
skip_comments: true
step: ''
version: v0
refId: A
queryOptions: {}
transformations: []
description: Every timer the sync worker wrote for one page load. Paste the load
id from the browser console ([first-load] <id> total ...) into the load_id
variable. Boot stages (db_load_*, room_start) appear only when that load booted
the room; init_user carries the id in blob4 and its outcome in blob3.
id: 55
links: []
title: One load ($load_id)
vizConfig:
group: table
kind: VizConfig
spec:
fieldConfig:
defaults:
custom:
align: auto
cellOptions:
type: auto
inspect: false
thresholds:
mode: absolute
steps:
- color: green
value: 0
overrides:
- matcher:
id: byName
options: ms
properties:
- id: unit
value: ms
- id: custom.cellOptions
value:
mode: gradient
type: gauge
options:
cellHeight: sm
footer:
countRows: false
fields: ''
reducer:
- sum
show: false
showHeader: true
sortBy: []
version: 13.2.0-29854286369
layout:
kind: RowsLayout
spec:
rows:
- kind: RowsLayoutRow
spec:
collapse: false
layout:
kind: GridLayout
spec:
items:
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-2
height: 4
width: 12
x: 0
y: 0
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-5
height: 4
width: 12
x: 12
y: 0
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-7
height: 9
width: 12
x: 0
y: 4
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-8
height: 9
width: 12
x: 12
y: 4
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-9
height: 8
width: 8
x: 0
y: 13
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-10
height: 8
width: 8
x: 8
y: 13
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-11
height: 8
width: 8
x: 16
y: 13
title: Rooms and sync
- kind: RowsLayoutRow
spec:
collapse: false
layout:
kind: GridLayout
spec:
items:
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-12
height: 9
width: 12
x: 0
y: 0
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-13
height: 9
width: 12
x: 12
y: 0
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-14
height: 8
width: 12
x: 0
y: 9
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-15
height: 8
width: 12
x: 12
y: 9
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-55
height: 8
width: 24
x: 0
y: 17
title: Room and connect latency
- kind: RowsLayoutRow
spec:
collapse: true
layout:
kind: GridLayout
spec:
items:
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-49
height: 8
width: 12
x: 0
y: 0
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-50
height: 8
width: 12
x: 12
y: 0
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-51
height: 8
width: 12
x: 0
y: 8
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-53
height: 8
width: 12
x: 12
y: 8
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-52
height: 4
width: 6
x: 0
y: 16
title: Version chains
- kind: RowsLayoutRow
spec:
collapse: true
layout:
kind: GridLayout
spec:
items:
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-25
height: 8
width: 12
x: 0
y: 0
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-26
height: 8
width: 12
x: 12
y: 0
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-48
height: 8
width: 12
x: 0
y: 8
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-43
height: 8
width: 12
x: 12
y: 8
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-42
height: 8
width: 12
x: 0
y: 16
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-46
height: 8
width: 12
x: 12
y: 16
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-44
height: 8
width: 12
x: 0
y: 24
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-47
height: 8
width: 12
x: 12
y: 24
title: Postgres connections
- kind: RowsLayoutRow
spec:
collapse: true
layout:
kind: GridLayout
spec:
items:
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-33
height: 4
width: 6
x: 0
y: 0
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-34
height: 4
width: 6
x: 6
y: 0
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-35
height: 4
width: 6
x: 12
y: 0
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-36
height: 4
width: 6
x: 18
y: 0
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-37
height: 8
width: 8
x: 0
y: 4
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-38
height: 8
width: 8
x: 8
y: 4
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-39
height: 8
width: 8
x: 16
y: 4
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-40
height: 8
width: 12
x: 0
y: 12
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-41
height: 8
width: 12
x: 12
y: 12
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-45
height: 8
width: 24
x: 0
y: 20
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-54
height: 8
width: 12
x: 0
y: 28
title: Screenshots and OG images
- kind: RowsLayoutRow
spec:
collapse: true
layout:
kind: GridLayout
spec:
items:
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-27
height: 8
width: 12
x: 0
y: 0
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-28
height: 8
width: 6
x: 12
y: 0
- kind: GridLayoutItem
spec:
element:
kind: ElementReference
name: panel-29
height: 8
width: 6
x: 18
y: 0
title: Demo server (bemo)
links: []
liveNow: false
preload: false
tags:
- tldraw
- analytics-engine
- provisioned
- repo:tldraw/tldraw
timeSettings:
autoRefresh: 5s
autoRefreshIntervals:
- 30s
- 1m
- 5m
- 15m
- 30m
- 1h
- 2h
- 1d
fiscalYearStartMonth: 0
from: now-3h
hideTimepicker: false
timezone: browser
to: now
title: Dotcom events
variables:
- kind: TextVariable
spec:
current:
text: production
value: production
description: Environment to filter by. Use production, staging, or your pr number
(pr-42). Applies to MEASURE panels only — the demo server panels query their
own dataset.
hide: dontHide
label: 'Environment: production | staging | pr-42'
name: environment
query: production
skipUrlSync: false
- kind: TextVariable
spec:
current:
text: ''
value: ''
description: A first_load id from the browser console, to list every sync worker
timer for that page load in the "One load" panel.
hide: dontHide
label: 'Load id (from the first_load console line)'
name: load_id
query: ''
skipUrlSync: false