555 lines
13 KiB
Markdown
555 lines
13 KiB
Markdown
# Query-Aware Metrics Tracking — M3.8 Output Examples
|
|||
|
|
|
||
|
|
Track optimization progress and metrics per `query_id`, allowing clients to monitor compression ratios, latency, and progress in real-time.
|
||
|
|
|
||
|
|
## Quick Start: API Usage
|
||
|
|
|
||
|
|
### 1. Create Query Metrics
|
||
|
|
|
||
|
|
```rust
|
||
|
|
use mem_ingest::QueryMetricsRepository;
|
||
|
|
|
||
|
|
let repo = QueryMetricsRepository::new();
|
||
|
|
|
||
|
|
// Start tracking a query's optimization
|
||
|
|
let query_id = repo.create_query("query-20250127-abc123", "myproject");
|
||
|
|
println!("Created metrics for: {}", query_id);
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Record Progress During Optimization
|
||
|
|
|
||
|
|
```rust
|
||
|
|
// Simulate optimization happening
|
||
|
|
repo.update_metrics(&query_id, |metrics| {
|
||
|
|
metrics.total_records = 1500; // Expected total
|
||
|
|
metrics.status = OptimizationStatus::InProgress;
|
||
|
|
}).unwrap();
|
||
|
|
|
||
|
|
// As records are optimized, record them
|
||
|
|
repo.update_metrics(&query_id, |metrics| {
|
||
|
|
metrics.record_record_optimized("log_compressor", "text/plain", 1024, 256);
|
||
|
|
}).unwrap();
|
||
|
|
|
||
|
|
repo.update_metrics(&query_id, |metrics| {
|
||
|
|
metrics.record_record_optimized("text_compressor", "text/plain", 512, 300);
|
||
|
|
}).unwrap();
|
||
|
|
|
||
|
|
// ... more records ...
|
||
|
|
|
||
|
|
repo.update_metrics(&query_id, |metrics| {
|
||
|
|
metrics.status = OptimizationStatus::Completed;
|
||
|
|
}).unwrap();
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. Query Progress (Real-Time)
|
||
|
|
|
||
|
|
```rust
|
||
|
|
// Get current progress
|
||
|
|
let progress = repo.get_progress(&query_id).unwrap();
|
||
|
|
println!("{:.1}% complete", progress.percent_complete);
|
||
|
|
println!("Records: {}/{}", progress.records_completed, progress.total_records);
|
||
|
|
println!("Compression: {:.1}%", progress.compression_ratio);
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4. Get Final Summary
|
||
|
|
|
||
|
|
```rust
|
||
|
|
let metrics = repo.get_metrics(&query_id).unwrap();
|
||
|
|
let summary = metrics.to_summary();
|
||
|
|
println!("{}", serde_json::to_string_pretty(&summary).unwrap());
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Sample Output Examples
|
||
|
|
|
||
|
|
### Progress Snapshot (Real-Time Monitoring)
|
||
|
|
|
||
|
|
**25% Complete:**
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"query_id": "query-20250127-abc123",
|
||
|
|
"project": "myproject",
|
||
|
|
"status": "InProgress",
|
||
|
|
"percent_complete": 25.0,
|
||
|
|
"records_completed": 375,
|
||
|
|
"total_records": 1500,
|
||
|
|
"compression_ratio": 28.4,
|
||
|
|
"input_bytes": 10485760,
|
||
|
|
"output_bytes": 2973696,
|
||
|
|
"eta_secs": 180
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**50% Complete:**
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"query_id": "query-20250127-abc123",
|
||
|
|
"project": "myproject",
|
||
|
|
"status": "InProgress",
|
||
|
|
"percent_complete": 50.0,
|
||
|
|
"records_completed": 750,
|
||
|
|
"total_records": 1500,
|
||
|
|
"compression_ratio": 29.7,
|
||
|
|
"input_bytes": 20971520,
|
||
|
|
"output_bytes": 6229197,
|
||
|
|
"eta_secs": 90
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**100% Complete:**
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"query_id": "query-20250127-abc123",
|
||
|
|
"project": "myproject",
|
||
|
|
"status": "Completed",
|
||
|
|
"percent_complete": 100.0,
|
||
|
|
"records_completed": 1500,
|
||
|
|
"total_records": 1500,
|
||
|
|
"compression_ratio": 30.1,
|
||
|
|
"input_bytes": 41943040,
|
||
|
|
"output_bytes": 12633697,
|
||
|
|
"eta_secs": null
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Final Metrics Summary (Complete)
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"query_id": "query-20250127-abc123",
|
||
|
|
"project": "myproject",
|
||
|
|
"started_at": "2025-01-27T14:35:42.123456Z",
|
||
|
|
"total_records": 1500,
|
||
|
|
"input_bytes_total": 41943040,
|
||
|
|
"output_bytes_total": 12633697,
|
||
|
|
"compression_ratio": 30.1,
|
||
|
|
"per_compressor": {
|
||
|
|
"log_compressor": {
|
||
|
|
"count": 750,
|
||
|
|
"input_bytes": 20971520,
|
||
|
|
"output_bytes": 2097152,
|
||
|
|
"compression_ratio": 10.0
|
||
|
|
},
|
||
|
|
"text_compressor": {
|
||
|
|
"count": 600,
|
||
|
|
"input_bytes": 15728640,
|
||
|
|
"output_bytes": 8388608,
|
||
|
|
"compression_ratio": 53.3
|
||
|
|
},
|
||
|
|
"json_compressor": {
|
||
|
|
"count": 150,
|
||
|
|
"input_bytes": 5242880,
|
||
|
|
"output_bytes": 2147937,
|
||
|
|
"compression_ratio": 40.9
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"per_content_type": {
|
||
|
|
"text/plain": {
|
||
|
|
"count": 900,
|
||
|
|
"input_bytes": 26214400,
|
||
|
|
"output_bytes": 7864320,
|
||
|
|
"compression_ratio": 30.0
|
||
|
|
},
|
||
|
|
"application/json": {
|
||
|
|
"count": 450,
|
||
|
|
"input_bytes": 10485760,
|
||
|
|
"output_bytes": 4287360,
|
||
|
|
"compression_ratio": 40.8
|
||
|
|
},
|
||
|
|
"application/xml": {
|
||
|
|
"count": 150,
|
||
|
|
"input_bytes": 5242880,
|
||
|
|
"output_bytes": 1481017,
|
||
|
|
"compression_ratio": 28.2
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"status": "Completed",
|
||
|
|
"error": null
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## HTTP API Integration Examples
|
||
|
|
|
||
|
|
### GET /memory/query/metrics/{query_id}
|
||
|
|
|
||
|
|
Get current progress for a specific query:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
curl http://localhost:8080/memory/query/metrics/query-20250127-abc123
|
||
|
|
```
|
||
|
|
|
||
|
|
**Response (In Progress):**
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"query_id": "query-20250127-abc123",
|
||
|
|
"project": "myproject",
|
||
|
|
"status": "InProgress",
|
||
|
|
"percent_complete": 45.2,
|
||
|
|
"records_completed": 678,
|
||
|
|
"total_records": 1500,
|
||
|
|
"compression_ratio": 29.5,
|
||
|
|
"input_bytes": 35651584,
|
||
|
|
"output_bytes": 10517267,
|
||
|
|
"eta_secs": 95
|
||
|
|
},
|
||
|
|
"timestamp": "2025-01-27T14:36:15Z"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Response (Completed):**
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"query_id": "query-20250127-abc123",
|
||
|
|
"project": "myproject",
|
||
|
|
"status": "Completed",
|
||
|
|
"percent_complete": 100.0,
|
||
|
|
"records_completed": 1500,
|
||
|
|
"total_records": 1500,
|
||
|
|
"compression_ratio": 30.1,
|
||
|
|
"input_bytes": 41943040,
|
||
|
|
"output_bytes": 12633697,
|
||
|
|
"eta_secs": null
|
||
|
|
},
|
||
|
|
"timestamp": "2025-01-27T14:37:45Z"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### GET /memory/query/metrics/{query_id}/summary
|
||
|
|
|
||
|
|
Get final summary after completion:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
curl http://localhost:8080/memory/query/metrics/query-20250127-abc123/summary
|
||
|
|
```
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"query_id": "query-20250127-abc123",
|
||
|
|
"project": "myproject",
|
||
|
|
"started_at": "2025-01-27T14:35:42.123456Z",
|
||
|
|
"total_records": 1500,
|
||
|
|
"input_bytes_total": 41943040,
|
||
|
|
"output_bytes_total": 12633697,
|
||
|
|
"compression_ratio": 30.1,
|
||
|
|
"per_compressor": {
|
||
|
|
"log_compressor": {
|
||
|
|
"count": 750,
|
||
|
|
"input_bytes": 20971520,
|
||
|
|
"output_bytes": 2097152,
|
||
|
|
"compression_ratio": 10.0
|
||
|
|
},
|
||
|
|
"text_compressor": {
|
||
|
|
"count": 600,
|
||
|
|
"input_bytes": 15728640,
|
||
|
|
"output_bytes": 8388608,
|
||
|
|
"compression_ratio": 53.3
|
||
|
|
},
|
||
|
|
"json_compressor": {
|
||
|
|
"count": 150,
|
||
|
|
"input_bytes": 5242880,
|
||
|
|
"output_bytes": 2147937,
|
||
|
|
"compression_ratio": 40.9
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"per_content_type": {
|
||
|
|
"text/plain": {
|
||
|
|
"count": 900,
|
||
|
|
"input_bytes": 26214400,
|
||
|
|
"output_bytes": 7864320,
|
||
|
|
"compression_ratio": 30.0
|
||
|
|
},
|
||
|
|
"application/json": {
|
||
|
|
"count": 450,
|
||
|
|
"input_bytes": 10485760,
|
||
|
|
"output_bytes": 4287360,
|
||
|
|
"compression_ratio": 40.8
|
||
|
|
},
|
||
|
|
"application/xml": {
|
||
|
|
"count": 150,
|
||
|
|
"input_bytes": 5242880,
|
||
|
|
"output_bytes": 1481017,
|
||
|
|
"compression_ratio": 28.2
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"status": "Completed",
|
||
|
|
"error": null
|
||
|
|
},
|
||
|
|
"duration_secs": 123,
|
||
|
|
"timestamp": "2025-01-27T14:37:45Z"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### GET /memory/query/metrics/project/{project}
|
||
|
|
|
||
|
|
Get all queries for a project:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
curl http://localhost:8080/memory/query/metrics/project/myproject
|
||
|
|
```
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"data": [
|
||
|
|
{
|
||
|
|
"query_id": "query-20250127-abc123",
|
||
|
|
"project": "myproject",
|
||
|
|
"status": "Completed",
|
||
|
|
"percent_complete": 100.0,
|
||
|
|
"records_completed": 1500,
|
||
|
|
"total_records": 1500,
|
||
|
|
"compression_ratio": 30.1
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"query_id": "query-20250127-def456",
|
||
|
|
"project": "myproject",
|
||
|
|
"status": "InProgress",
|
||
|
|
"percent_complete": 62.3,
|
||
|
|
"records_completed": 934,
|
||
|
|
"total_records": 1500,
|
||
|
|
"compression_ratio": 31.5
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"query_id": "query-20250127-ghi789",
|
||
|
|
"project": "myproject",
|
||
|
|
"status": "Pending",
|
||
|
|
"percent_complete": 0.0,
|
||
|
|
"records_completed": 0,
|
||
|
|
"total_records": 1500,
|
||
|
|
"compression_ratio": 0.0
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"count": 3,
|
||
|
|
"timestamp": "2025-01-27T14:37:45Z"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Structured Logging Output
|
||
|
|
|
||
|
|
### Progress Logging (During Optimization)
|
||
|
|
|
||
|
|
```
|
||
|
|
2025-01-27T14:35:42Z INFO mem_ingest::query_metrics
|
||
|
|
query_id=query-20250127-abc123
|
||
|
|
project=myproject
|
||
|
|
status=InProgress
|
||
|
|
percent_complete=5.0
|
||
|
|
records_completed=75
|
||
|
|
total_records=1500
|
||
|
|
compression_ratio=28.2
|
||
|
|
input_bytes=4194304
|
||
|
|
output_bytes=1182989
|
||
|
|
message="Query optimization progress"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Per-Compressor Progress
|
||
|
|
|
||
|
|
```
|
||
|
|
2025-01-27T14:35:43Z DEBUG mem_ingest::query_metrics
|
||
|
|
query_id=query-20250127-abc123
|
||
|
|
compressor=log_compressor
|
||
|
|
count=37
|
||
|
|
input_bytes=2097152
|
||
|
|
output_bytes=209715
|
||
|
|
compression_ratio=10.0
|
||
|
|
message="Compressor progress update"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Per-Content-Type Progress
|
||
|
|
|
||
|
|
```
|
||
|
|
2025-01-27T14:35:44Z DEBUG mem_ingest::query_metrics
|
||
|
|
query_id=query-20250127-abc123
|
||
|
|
content_type=text/plain
|
||
|
|
count=45
|
||
|
|
input_bytes=2621440
|
||
|
|
output_bytes=786432
|
||
|
|
compression_ratio=30.0
|
||
|
|
message="Content type progress update"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Completion Logging
|
||
|
|
|
||
|
|
```
|
||
|
|
2025-01-27T14:37:45Z INFO mem_ingest::query_metrics
|
||
|
|
query_id=query-20250127-abc123
|
||
|
|
project=myproject
|
||
|
|
status=Completed
|
||
|
|
total_records=1500
|
||
|
|
input_bytes_total=41943040
|
||
|
|
output_bytes_total=12633697
|
||
|
|
compression_ratio=30.1
|
||
|
|
duration_secs=123
|
||
|
|
message="Query optimization complete"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Per-Compressor Summary
|
||
|
|
|
||
|
|
```
|
||
|
|
2025-01-27T14:37:45Z INFO mem_ingest::query_metrics
|
||
|
|
query_id=query-20250127-abc123
|
||
|
|
compressor=log_compressor
|
||
|
|
count=750
|
||
|
|
input_bytes=20971520
|
||
|
|
output_bytes=2097152
|
||
|
|
compression_ratio=10.0
|
||
|
|
message="Compressor summary"
|
||
|
|
|
||
|
|
2025-01-27T14:37:45Z INFO mem_ingest::query_metrics
|
||
|
|
query_id=query-20250127-abc123
|
||
|
|
compressor=text_compressor
|
||
|
|
count=600
|
||
|
|
input_bytes=15728640
|
||
|
|
output_bytes=8388608
|
||
|
|
compression_ratio=53.3
|
||
|
|
message="Compressor summary"
|
||
|
|
|
||
|
|
2025-01-27T14:37:45Z INFO mem_ingest::query_metrics
|
||
|
|
query_id=query-20250127-abc123
|
||
|
|
compressor=json_compressor
|
||
|
|
count=150
|
||
|
|
input_bytes=5242880
|
||
|
|
output_bytes=2147937
|
||
|
|
compression_ratio=40.9
|
||
|
|
message="Compressor summary"
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Prometheus Metrics (Exported)
|
||
|
|
|
||
|
|
```
|
||
|
|
# HELP mem_query_optimization_records_total Total records optimized
|
||
|
|
# TYPE mem_query_optimization_records_total counter
|
||
|
|
mem_query_optimization_records_total{query_id="query-20250127-abc123",project="myproject"} 1500.0
|
||
|
|
|
||
|
|
# HELP mem_query_optimization_bytes_input Total input bytes
|
||
|
|
# TYPE mem_query_optimization_bytes_input gauge
|
||
|
|
mem_query_optimization_bytes_input{query_id="query-20250127-abc123",project="myproject"} 41943040.0
|
||
|
|
|
||
|
|
# HELP mem_query_optimization_bytes_output Total output bytes
|
||
|
|
# TYPE mem_query_optimization_bytes_output gauge
|
||
|
|
mem_query_optimization_bytes_output{query_id="query-20250127-abc123",project="myproject"} 12633697.0
|
||
|
|
|
||
|
|
# HELP mem_query_optimization_compression_ratio Compression ratio (%)
|
||
|
|
# TYPE mem_query_optimization_compression_ratio gauge
|
||
|
|
mem_query_optimization_compression_ratio{query_id="query-20250127-abc123",project="myproject"} 30.1
|
||
|
|
|
||
|
|
# HELP mem_query_optimization_duration_secs Duration in seconds
|
||
|
|
# TYPE mem_query_optimization_duration_secs histogram
|
||
|
|
mem_query_optimization_duration_secs_bucket{query_id="query-20250127-abc123",project="myproject",le="10"} 0.0
|
||
|
|
mem_query_optimization_duration_secs_bucket{query_id="query-20250127-abc123",project="myproject",le="50"} 0.0
|
||
|
|
mem_query_optimization_duration_secs_bucket{query_id="query-20250127-abc123",project="myproject",le="100"} 0.0
|
||
|
|
mem_query_optimization_duration_secs_bucket{query_id="query-20250127-abc123",project="myproject",le="500"} 1.0
|
||
|
|
mem_query_optimization_duration_secs_bucket{query_id="query-20250127-abc123",project="myproject",le="+Inf"} 1.0
|
||
|
|
mem_query_optimization_duration_secs_sum{query_id="query-20250127-abc123",project="myproject"} 123.45
|
||
|
|
mem_query_optimization_duration_secs_count{query_id="query-20250127-abc123",project="myproject"} 1.0
|
||
|
|
|
||
|
|
# HELP mem_query_optimization_compressor_ratio Compression ratio by compressor (%)
|
||
|
|
# TYPE mem_query_optimization_compressor_ratio gauge
|
||
|
|
mem_query_optimization_compressor_ratio{query_id="query-20250127-abc123",project="myproject",compressor="log_compressor"} 10.0
|
||
|
|
mem_query_optimization_compressor_ratio{query_id="query-20250127-abc123",project="myproject",compressor="text_compressor"} 53.3
|
||
|
|
mem_query_optimization_compressor_ratio{query_id="query-20250127-abc123",project="myproject",compressor="json_compressor"} 40.9
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## CLI Usage Example
|
||
|
|
|
||
|
|
### Monitor Query Progress
|
||
|
|
|
||
|
|
```bash
|
||
|
|
#!/bin/bash
|
||
|
|
# Watch query optimization progress in real-time
|
||
|
|
|
||
|
|
QUERY_ID="query-20250127-abc123"
|
||
|
|
PROJECT="myproject"
|
||
|
|
|
||
|
|
while true; do
|
||
|
|
PROGRESS=$(curl -s "http://localhost:8080/memory/query/metrics/$QUERY_ID")
|
||
|
|
|
||
|
|
STATUS=$(echo $PROGRESS | jq -r '.data.status')
|
||
|
|
PERCENT=$(echo $PROGRESS | jq -r '.data.percent_complete')
|
||
|
|
RATIO=$(echo $PROGRESS | jq -r '.data.compression_ratio')
|
||
|
|
ETA=$(echo $PROGRESS | jq -r '.data.eta_secs')
|
||
|
|
|
||
|
|
clear
|
||
|
|
echo "Query: $QUERY_ID"
|
||
|
|
echo "Project: $PROJECT"
|
||
|
|
echo "Status: $STATUS"
|
||
|
|
echo "Progress: ${PERCENT}%"
|
||
|
|
echo "Compression: ${RATIO}%"
|
||
|
|
echo "ETA: ${ETA}s"
|
||
|
|
|
||
|
|
if [ "$STATUS" = "Completed" ]; then
|
||
|
|
break
|
||
|
|
fi
|
||
|
|
|
||
|
|
sleep 2
|
||
|
|
done
|
||
|
|
|
||
|
|
# Get final summary
|
||
|
|
echo ""
|
||
|
|
echo "Final Summary:"
|
||
|
|
curl -s "http://localhost:8080/memory/query/metrics/$QUERY_ID/summary" | jq .
|
||
|
|
```
|
||
|
|
|
||
|
|
**Output:**
|
||
|
|
|
||
|
|
```
|
||
|
|
Query: query-20250127-abc123
|
||
|
|
Project: myproject
|
||
|
|
Status: InProgress
|
||
|
|
Progress: 45.2%
|
||
|
|
Compression: 29.5%
|
||
|
|
ETA: 95s
|
||
|
|
|
||
|
|
--- (after completion) ---
|
||
|
|
|
||
|
|
Query: query-20250127-abc123
|
||
|
|
Project: myproject
|
||
|
|
Status: Completed
|
||
|
|
Progress: 100.0%
|
||
|
|
Compression: 30.1%
|
||
|
|
ETA: null
|
||
|
|
|
||
|
|
Final Summary:
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"query_id": "query-20250127-abc123",
|
||
|
|
"project": "myproject",
|
||
|
|
...
|
||
|
|
},
|
||
|
|
"duration_secs": 123,
|
||
|
|
"timestamp": "2025-01-27T14:37:45Z"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Key Takeaways
|
||
|
|
|
||
|
|
✅ **Per-Query Tracking**: Metrics indexed by `query_id`
|
||
|
|
✅ **Real-Time Progress**: `percent_complete`, `eta_secs` for monitoring
|
||
|
|
✅ **Detailed Breakdown**: Per-compressor and per-content-type statistics
|
||
|
|
✅ **Multiple Output Formats**: JSON APIs, structured logs, Prometheus metrics
|
||
|
|
✅ **Production Ready**: Thread-safe repository, idempotent updates
|
||
|
|
✅ **Easy Integration**: Drop-in to rebuild.rs and query handlers
|
||
|
|
|