Files
poimen-memory/docs/QUERY_METRICS_EXAMPLES.md
T
Story Crater Bot d99cf23e6c feat: Query-aware metrics tracking for M3.8 optimization
Added per-query_id metrics system for real-time progress monitoring.

New Module: mem-ingest/src/query_metrics.rs (500 LOC)
 QueryMetrics: Per-query tracking with progress snapshots
 QueryMetricsRepository: Thread-safe indexed by query_id
 ProgressSnapshot: Real-time monitoring data
 MetricsSummary: Final completion metrics
 Per-compressor and per-content-type breakdowns
 7 unit tests (100% passing)

Features:
- Track progress: percent_complete, records_completed, eta_secs
- Measure compression: input/output bytes, compression_ratio
- Granular breakdown: per compressor, per content type
- Status tracking: Pending, InProgress, Completed, Failed, Paused
- Thread-safe: Arc<Mutex> for concurrent access

API Examples:

1. Create query metrics:
   let repo = QueryMetricsRepository::new();
   let query_id = repo.create_query("query-123", "myproject");

2. Record progress:
   repo.update_metrics(&query_id, |m| {
       m.record_record_optimized("log", "text/plain", 1000, 300);
   })?;

3. Get real-time progress:
   let progress = repo.get_progress(&query_id)?;
   println!("{}% complete", progress.percent_complete);

4. Get final summary:
   let summary = repo.get_metrics(&query_id)?.to_summary();

Output Formats (see QUERY_METRICS_EXAMPLES.md):
 HTTP JSON API: GET /memory/query/metrics/{query_id}
 Structured logging: tracing with query_id labels
 Prometheus metrics: per-query gauges and histograms
 CLI monitoring: curl-based progress script

Use Cases:
- Monitor ingest progress (rebuild.rs integration)
- Track query optimization (http_server integration)
- Stream metrics to UI/dashboard
- Alert on slow compressions
- Store summary to database for auditing

Sample Output Formats:

Integration Points (Ready):
 rebuild.rs: Track optimization progress per query
 http_server: Monitor query endpoint metrics
 Dashboard: Stream progress via WebSocket
 Prometheus: Export gauges for alerting

Tests: 7/7 passing
- creation, progress calculation, compression ratio
- repository CRUD, updates, lookups
- per-compressor tracking

Documentation: docs/QUERY_METRICS_EXAMPLES.md
- HTTP API examples with curl
- Structured logging samples
- Prometheus export format
- CLI monitoring script

Status: Ready for integration into rebuild.rs and http_server
2026-08-28 12:56:16 -07:00

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