- ✅ Metrics pushed to Thanos Receiver
- ⏳ Wait ~30 minutes for TSDB compaction
- ⏳ Wait ~2 hours total for S3 upload and Store Gateway sync
Check if blocks are being created:
oc exec -n kserve-e2e-perf thanos-receiver-0 -- cat /var/thanos/receive/default-tenant/thanos.shipper.jsonShould show new blocks uploaded.
Verify data is queryable from central cluster.
Switch to central cluster:
oc config use-context default/api-ocp4-intlab-redhat-com:6443/editorCheck Store Gateway has synced blocks:
# Get Store Gateway pod
STORE_POD=$(oc get pods -n psap-obs -l app=thanos-store-gateway -o jsonpath='{.items[0].metadata.name}')
# Check if it has guideLLM blocks
oc exec -n psap-obs $STORE_POD -- wget -qO- 'http://localhost:10902/api/v1/label/__name__/values' | jq -r '.data[]' | grep guidellmExpected output:
guidellm_benchmark_duration_seconds
guidellm_benchmark_start_time_seconds
guidellm_output_tokens_per_second
guidellm_request_latency_seconds
guidellm_requests_errored_total
guidellm_requests_per_second
guidellm_requests_successful_total
guidellm_time_to_first_token_ms
Query sample data:
# Port-forward to Thanos Querier
oc port-forward -n psap-obs svc/thanos-querier 9090:9090
# In another terminal, query:
curl "http://localhost:9090/api/v1/query?query=guidellm_time_to_first_token_ms{cluster=\"mehulvalidation-wp4vb\"}" | jq '.data.result | length'Should return > 0 (number of time series).
Add these variables to your existing Grafana dashboard for filtering.
Type: Query
Name: guidellm_profile
Label: GuideLLM Profile
Query:
label_values(guidellm_time_to_first_token_ms{cluster=~"$cluster_name"}, profile)
Multi-value: Yes Include All: Yes
Type: Query
Name: guidellm_concurrency
Label: GuideLLM Concurrency
Query:
label_values(guidellm_time_to_first_token_ms{cluster=~"$cluster_name", profile=~"$guidellm_profile"}, concurrency)
Multi-value: Yes Include All: Yes
Panel Type: Time Series Title: GuideLLM - Time to First Token by Concurrency
Queries:
# P50 TTFT
guidellm_time_to_first_token_ms{
cluster=~"$cluster_name",
profile=~"$guidellm_profile",
concurrency=~"$guidellm_concurrency",
metric_type="p50"
}
# P90 TTFT
guidellm_time_to_first_token_ms{
cluster=~"$cluster_name",
profile=~"$guidellm_profile",
concurrency=~"$guidellm_concurrency",
metric_type="p90"
}
# P99 TTFT
guidellm_time_to_first_token_ms{
cluster=~"$cluster_name",
profile=~"$guidellm_profile",
concurrency=~"$guidellm_concurrency",
metric_type="p99"
}
Legend: {{profile}} - Concurrency {{concurrency}} - {{metric_type}}
Panel Type: Time Series Title: GuideLLM - End-to-End Request Latency
Queries:
# P50 Latency
guidellm_request_latency_seconds{
cluster=~"$cluster_name",
profile=~"$guidellm_profile",
concurrency=~"$guidellm_concurrency",
metric_type="p50"
}
# P90 Latency
guidellm_request_latency_seconds{
cluster=~"$cluster_name",
profile=~"$guidellm_profile",
concurrency=~"$guidellm_concurrency",
metric_type="p90"
}
Legend: {{profile}} - Concurrency {{concurrency}} - {{metric_type}}
Unit: seconds (s)
Panel Type: Time Series Title: GuideLLM - Tokens Per Second
Queries:
# Mean throughput
guidellm_output_tokens_per_second{
cluster=~"$cluster_name",
profile=~"$guidellm_profile",
concurrency=~"$guidellm_concurrency",
metric_type="mean"
}
Legend: {{profile}} - Concurrency {{concurrency}}
Unit: tokens/sec
Panel Type: Stat Title: GuideLLM - Request Success Rate
Query:
(
sum(guidellm_requests_successful_total{cluster=~"$cluster_name", profile=~"$guidellm_profile", concurrency=~"$guidellm_concurrency"})
/
(
sum(guidellm_requests_successful_total{cluster=~"$cluster_name", profile=~"$guidellm_profile", concurrency=~"$guidellm_concurrency"})
+
sum(guidellm_requests_errored_total{cluster=~"$cluster_name", profile=~"$guidellm_profile", concurrency=~"$guidellm_concurrency"})
)
) * 100
Unit: Percent (0-100) Thresholds: Red < 95%, Yellow < 99%, Green >= 99%
Panel Type: Time Series Title: TTFT Comparison - GuideLLM (Client) vs vLLM (Server)
Queries:
# GuideLLM Client-side TTFT (p50)
guidellm_time_to_first_token_ms{
cluster=~"$cluster_name",
profile=~"$guidellm_profile",
metric_type="p50"
} / 1000
# vLLM Server-side TTFT (p50)
histogram_quantile(0.50,
rate(vllm:time_to_first_token_seconds_bucket{
cluster=~"$cluster_name",
deployment_uuid=~"$deployment_uuid"
}[5m])
)
Legend:
GuideLLM Client - {{profile}} - C{{concurrency}}vLLM Server - {{deployment_pod_name}}
Unit: seconds (s)
Panel Type: Time Series Title: GuideLLM Concurrency vs GPU Utilization
Queries:
# Benchmark concurrency level
guidellm_request_concurrency{
cluster=~"$cluster_name",
profile=~"$guidellm_profile",
metric_type="mean"
}
# GPU Utilization during benchmark
avg(DCGM_FI_DEV_GPU_UTIL{cluster=~"$cluster_name"})
Legend:
Concurrency - {{profile}}GPU Utilization %
Y-axis: Dual axis (left: concurrency, right: %)
Panel Type: Table Title: GuideLLM Benchmark Runs
Query:
guidellm_benchmark_start_time_seconds{
cluster=~"$cluster_name",
profile=~"$guidellm_profile",
concurrency=~"$guidellm_concurrency"
}
Transformations:
- Organize fields by name
- Add field from calculation:
Start Time = from_unixtime($value)
Columns:
- Profile
- Concurrency
- Model
- Start Time
- Duration
Add a new collapsed row titled "GuideLLM Benchmark Results" containing all the above panels.
- Open Grafana: https://grafana-psap-obs.apps.ocp4.intlab.redhat.com
- Navigate to existing dashboard (e.g., vLLM + DCGM Metrics - mehulvalidation-wp4vb)
- Click "Dashboard settings" (gear icon)
- Add variables:
guidellm_profileandguidellm_concurrency - Add new row: "GuideLLM Benchmark Results"
- Add panels using queries above
- Save dashboard
I'll create a Python script to programmatically add GuideLLM panels to your existing dashboard.
After adding panels, verify data is showing:
- Check time range: Set Grafana to "Last 6 hours" or specific benchmark time
- Select variables:
- guidellm_profile:
profile-1 - guidellm_concurrency:
Allor specific like100
- guidellm_profile:
- Verify data points: Should see discrete data points at benchmark end times
Profile-1:
- Concurrency levels: 1, 5, 50, 100, 200, 250
- Data points: 5-6 (depending on what succeeded)
- Timestamp: Around Oct 28, 2025 15:00-17:00 UTC
Profile-2:
- Similar structure
- Different ISL/OSL configuration
Profile-3:
- Similar structure
- Different ISL/OSL configuration
No data showing:
- Check time range matches benchmark timestamps
- Verify Store Gateway synced:
oc logs -n psap-obs <store-gateway-pod> | grep sync - Query Thanos Querier directly to verify data exists
- Check variable filters aren't excluding all data
Partial data:
- Some concurrency levels may have failed to push (outside 6h window)
- Check which ones succeeded during push
Data not correlating with vLLM:
- Verify benchmark ran against same deployment_uuid
- Check cluster labels match
- Use absolute time ranges instead of relative