From ef31ef70a5b145c984780c895a27570c90765af3 Mon Sep 17 00:00:00 2001 From: rock Date: Sun, 13 Sep 2026 21:49:30 +0900 Subject: [PATCH] feat(O11): Grafana dashboard for memory-observability - 12 panels: rates, latency, errors, embedding, DB, health, relevance - Covers all O1-O9 metrics in visual form - Import via Grafana UI or provisioning - Dashboard UID: poimen-memory-obs --- k8s/infra/grafana-dashboard.json | 131 +++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 k8s/infra/grafana-dashboard.json diff --git a/k8s/infra/grafana-dashboard.json b/k8s/infra/grafana-dashboard.json new file mode 100644 index 0000000..90f30a0 --- /dev/null +++ b/k8s/infra/grafana-dashboard.json @@ -0,0 +1,131 @@ +{ + "annotations": { "list": [] }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "panels": [ + { + "title": "Ingest Rate (req/s)", + "type": "timeseries", + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 0 }, + "targets": [ + { "expr": "rate(memory_ingest_requests_total[5m])", "legendFormat": "ingest req/s" } + ] + }, + { + "title": "Query Rate (req/s)", + "type": "timeseries", + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 0 }, + "targets": [ + { "expr": "rate(memory_query_requests_total[5m])", "legendFormat": "query req/s" } + ] + }, + { + "title": "Ingest Latency (p50/p95/p99)", + "type": "timeseries", + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 8 }, + "targets": [ + { "expr": "histogram_quantile(0.5, rate(memory_ingest_duration_seconds_bucket[5m]))", "legendFormat": "p50" }, + { "expr": "histogram_quantile(0.95, rate(memory_ingest_duration_seconds_bucket[5m]))", "legendFormat": "p95" }, + { "expr": "histogram_quantile(0.99, rate(memory_ingest_duration_seconds_bucket[5m]))", "legendFormat": "p99" } + ] + }, + { + "title": "Query Latency (p50/p95/p99)", + "type": "timeseries", + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 8 }, + "targets": [ + { "expr": "histogram_quantile(0.5, rate(memory_query_duration_seconds_bucket[5m]))", "legendFormat": "p50" }, + { "expr": "histogram_quantile(0.95, rate(memory_query_duration_seconds_bucket[5m]))", "legendFormat": "p95" }, + { "expr": "histogram_quantile(0.99, rate(memory_query_duration_seconds_bucket[5m]))", "legendFormat": "p99" } + ] + }, + { + "title": "Error Rates", + "type": "timeseries", + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 16 }, + "targets": [ + { "expr": "rate(memory_ingest_errors_total[5m])", "legendFormat": "ingest errors" }, + { "expr": "rate(memory_query_errors_total[5m])", "legendFormat": "query errors" }, + { "expr": "rate(memory_query_embedding_failures_total[5m])", "legendFormat": "embedding failures" } + ] + }, + { + "title": "Embedding Latency", + "type": "timeseries", + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 16 }, + "targets": [ + { "expr": "histogram_quantile(0.5, rate(memory_query_embedding_duration_seconds_bucket[5m]))", "legendFormat": "p50" }, + { "expr": "histogram_quantile(0.95, rate(memory_query_embedding_duration_seconds_bucket[5m]))", "legendFormat": "p95" } + ] + }, + { + "title": "DB Row Counts", + "type": "stat", + "gridPos": { "h": 4, "w": 12, "x": 0, "y": 24 }, + "targets": [ + { "expr": "memory_db_table_entity_rows", "legendFormat": "entities" }, + { "expr": "memory_db_table_edge_rows", "legendFormat": "edges" }, + { "expr": "memory_db_table_chunk_rows", "legendFormat": "chunks" } + ] + }, + { + "title": "Dependency Health", + "type": "stat", + "gridPos": { "h": 4, "w": 12, "x": 12, "y": 24 }, + "targets": [ + { "expr": "memory_dependency_db_up", "legendFormat": "DB" }, + { "expr": "memory_dependency_embedding_up", "legendFormat": "Embedding" }, + { "expr": "memory_dependency_opensearch_up", "legendFormat": "OpenSearch" }, + { "expr": "memory_dependency_llm_up", "legendFormat": "LLM" } + ] + }, + { + "title": "DB Pool Stats", + "type": "timeseries", + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 28 }, + "targets": [ + { "expr": "memory_db_pool_size", "legendFormat": "pool size" }, + { "expr": "memory_db_pool_idle", "legendFormat": "idle" }, + { "expr": "memory_db_pool_active", "legendFormat": "active" } + ] + }, + { + "title": "Relevance Metrics", + "type": "timeseries", + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 28 }, + "targets": [ + { "expr": "memory_relevance_precision", "legendFormat": "precision" }, + { "expr": "memory_relevance_recall", "legendFormat": "recall" }, + { "expr": "memory_relevance_f1_score", "legendFormat": "F1" } + ] + }, + { + "title": "In-Flight Operations", + "type": "timeseries", + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 36 }, + "targets": [ + { "expr": "memory_ingest_in_flight", "legendFormat": "ingest" }, + { "expr": "memory_query_in_flight", "legendFormat": "query" } + ] + }, + { + "title": "Write Volume", + "type": "timeseries", + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 36 }, + "targets": [ + { "expr": "rate(memory_write_entities_total[5m])", "legendFormat": "entities/s" }, + { "expr": "rate(memory_write_edges_total[5m])", "legendFormat": "edges/s" }, + { "expr": "rate(memory_write_chunks_total[5m])", "legendFormat": "chunks/s" } + ] + } + ], + "schemaVersion": 39, + "tags": ["poimen", "memory", "observability"], + "templating": { "list": [] }, + "time": { "from": "now-1h", "to": "now" }, + "title": "Poimen Memory Observability", + "uid": "poimen-memory-obs" +}