···11+# check performance via logfire
22+33+use `mcp__logfire__arbitrary_query` with `age` in minutes (max 43200 = 30 days).
44+55+note: `duration` is in seconds (DOUBLE PRECISION), multiply by 1000 for ms.
66+77+## latency percentiles by endpoint
88+```sql
99+SELECT span_name,
1010+ COUNT(*) as count,
1111+ ROUND(PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY duration) * 1000, 2) as p50_ms,
1212+ ROUND(PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY duration) * 1000, 2) as p95_ms,
1313+ ROUND(PERCENTILE_CONT(0.99) WITHIN GROUP (ORDER BY duration) * 1000, 2) as p99_ms
1414+FROM records
1515+WHERE span_name LIKE 'http.%'
1616+GROUP BY span_name
1717+ORDER BY count DESC
1818+```
1919+2020+## slow requests with trace IDs
2121+```sql
2222+SELECT span_name, duration * 1000 as ms, trace_id, start_timestamp
2323+FROM records
2424+WHERE span_name LIKE 'http.%' AND duration > 0.1
2525+ORDER BY duration DESC
2626+LIMIT 20
2727+```
2828+2929+## trace breakdown (drill into slow request)
3030+```sql
3131+SELECT span_name, duration * 1000 as ms, message, attributes->>'sql' as sql
3232+FROM records
3333+WHERE trace_id = '<TRACE_ID>'
3434+ORDER BY start_timestamp
3535+```
3636+3737+## database comparison (turso vs local)
3838+```sql
3939+SELECT
4040+ CASE WHEN span_name = 'db.query' THEN 'turso'
4141+ WHEN span_name = 'db.local.query' THEN 'local' END as db,
4242+ COUNT(*) as queries,
4343+ ROUND(AVG(duration) * 1000, 2) as avg_ms,
4444+ ROUND(MAX(duration) * 1000, 2) as max_ms
4545+FROM records
4646+WHERE span_name IN ('db.query', 'db.local.query')
4747+GROUP BY db
4848+```
4949+5050+## recent errors
5151+```sql
5252+SELECT start_timestamp, span_name, exception_type, exception_message
5353+FROM records
5454+WHERE exception_type IS NOT NULL
5555+ORDER BY start_timestamp DESC
5656+LIMIT 10
5757+```
5858+5959+## traffic pattern (requests per minute)
6060+```sql
6161+SELECT date_trunc('minute', start_timestamp) as minute,
6262+ COUNT(*) as requests
6363+FROM records
6464+WHERE span_name LIKE 'http.%'
6565+GROUP BY minute
6666+ORDER BY minute DESC
6767+LIMIT 30
6868+```
6969+7070+## search query distribution
7171+```sql
7272+SELECT attributes->>'query' as query, COUNT(*) as count
7373+FROM records
7474+WHERE span_name = 'http.search' AND attributes->>'query' IS NOT NULL
7575+GROUP BY query
7676+ORDER BY count DESC
7777+LIMIT 20
7878+```
7979+8080+## typical workflow
8181+1. run latency percentiles to get baseline
8282+2. if p95/p99 high, find slow requests with trace IDs
8383+3. drill into specific trace to see which child spans are slow
8484+4. check db comparison to see if turso calls are the bottleneck