{
"__inputs": [
{
"name": "DS_PROMETHEUS",
"label": "Prometheus",
"description": "AIStor/MinIO metrics v3 scrape target (must include /bucket/api, /bucket/replication, /bucket/batch scrapes for per-bucket panels to work)",
"type": "datasource",
"pluginId": "prometheus",
"pluginName": "Prometheus"
}
],
"__requires": [
{ "type": "grafana", "id": "grafana", "name": "Grafana", "version": "10.0.0" },
{ "type": "datasource", "id": "prometheus", "name": "Prometheus", "version": "1.0.0" }
],
"annotations": {
"list": [
{
"builtIn": 1,
"datasource": { "type": "grafana", "uid": "-- Grafana --" },
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations & Alerts",
"type": "dashboard"
}
]
},
"editable": true,
"fiscalYearStartMonth": 0,
"graphTooltip": 1,
"id": null,
"links": [],
"liveNow": false,
"panels": [
{
"collapsed": false,
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 },
"id": 100,
"panels": [],
"title": "1. 락 지연 & Goroutine (증상 확인)",
"type": "row"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"description": "노드/서버별 분산 락 평균 지연시간. 평소 수초대에서 급등하는 구간을 여기서 먼저 시간창으로 잡는다.",
"fieldConfig": {
"defaults": {
"unit": "s",
"custom": { "drawStyle": "line", "fillOpacity": 10, "lineWidth": 2, "spanNulls": true },
"thresholds": { "mode": "absolute", "steps": [
{ "color": "green", "value": null },
{ "color": "orange", "value": 5 },
{ "color": "red", "value": 20 }
]}
},
"overrides": []
},
"gridPos": { "h": 8, "w": 12, "x": 0, "y": 1 },
"id": 1,
"options": {
"legend": { "displayMode": "table", "placement": "bottom", "calcs": ["max", "mean", "last"] },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"targets": [
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "minio_locks_dist_avg_latency{server=~\"$instance\"}",
"legendFormat": "{{server}}",
"refId": "A"
}
],
"title": "분산 락(dsync) 평균 지연시간",
"type": "timeseries"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"description": "Pod(서버)별 goroutine 수. 10k~15k 평시 대비 60k~100k 급증 구간 확인. go_goroutines는 /debug/go 또는 Go 기본 콜렉터에서 노출됨 - 스크레이프 job/label명이 다르면 pod 라벨을 환경에 맞게 조정.",
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": { "drawStyle": "line", "fillOpacity": 10, "lineWidth": 2, "spanNulls": true },
"thresholds": { "mode": "absolute", "steps": [
{ "color": "green", "value": null },
{ "color": "orange", "value": 20000 },
{ "color": "red", "value": 50000 }
]}
},
"overrides": []
},
"gridPos": { "h": 8, "w": 12, "x": 12, "y": 1 },
"id": 2,
"options": {
"legend": { "displayMode": "table", "placement": "bottom", "calcs": ["max", "mean", "last"] },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"targets": [
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "go_goroutines{pod=~\"$instance\"}",
"legendFormat": "{{pod}}",
"refId": "A"
}
],
"title": "Pod별 Goroutine 수",
"type": "timeseries"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"description": "요청이 처리되지 못하고 큐에 쌓이는 수. 락 대기로 요청이 밀리면 여기가 같이 오른다.",
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": { "drawStyle": "line", "fillOpacity": 10, "lineWidth": 2 }
},
"overrides": []
},
"gridPos": { "h": 8, "w": 12, "x": 0, "y": 9 },
"id": 3,
"options": {
"legend": { "displayMode": "table", "placement": "bottom", "calcs": ["max", "last"] },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"targets": [
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "minio_api_requests_waiting_total{server=~\"$instance\"}",
"legendFormat": "waiting {{server}}",
"refId": "A"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "minio_api_requests_inflight_total{server=~\"$instance\"}",
"legendFormat": "inflight {{name}} {{server}}",
"refId": "B"
}
],
"title": "요청 대기열 / 인플라이트 (클러스터 레벨)",
"type": "timeseries"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"description": "erasure set 헬스와 healing drive 수. 락 지연이 healing과 겹쳤는지 확인.",
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": { "drawStyle": "line", "fillOpacity": 10, "lineWidth": 2 }
},
"overrides": []
},
"gridPos": { "h": 8, "w": 12, "x": 12, "y": 9 },
"id": 4,
"options": {
"legend": { "displayMode": "table", "placement": "bottom", "calcs": ["max", "last"] },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"targets": [
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "minio_cluster_erasure_set_healing_drives_count",
"legendFormat": "healing drives pool={{pool_id}} set={{set_id}}",
"refId": "A"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "minio_cluster_erasure_set_health",
"legendFormat": "erasure set health pool={{pool_id}} set={{set_id}}",
"refId": "B"
}
],
"title": "Healing / Erasure Set 헬스",
"type": "timeseries"
},
{
"collapsed": false,
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 17 },
"id": 200,
"panels": [],
"title": "2. 버킷별 API 활동 (원인 버킷 지목)",
"type": "row"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"description": "선택 구간에서 요청량이 가장 많았던 버킷+API 조합 Top 10. 인시던트 시간대로 타임레인지를 좁히고 이 표를 보면 어느 버킷/오퍼레이션이 튀었는지 바로 나온다.",
"fieldConfig": {
"defaults": { "unit": "reqps", "custom": { "align": "auto" } },
"overrides": []
},
"gridPos": { "h": 9, "w": 24, "x": 0, "y": 18 },
"id": 5,
"options": {
"showHeader": true,
"sortBy": [{ "displayName": "요청률", "desc": true }]
},
"targets": [
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "topk(10, sum by (bucket, name) (rate(minio_bucket_api_total{bucket=~\"$bucket\"}[5m])))",
"format": "table",
"instant": true,
"legendFormat": "{{bucket}} / {{name}}",
"refId": "A"
}
],
"transformations": [
{
"id": "organize",
"options": {
"renameByName": { "Value": "요청률", "bucket": "버킷", "name": "API" },
"excludeByName": { "Time": true, "__name__": true, "instance": true, "job": true, "server": true, "type": true }
}
}
],
"title": "버킷별 API 요청률 Top 10 (선택 구간)",
"type": "table"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"description": "버킷별 처리 중(inflight) 요청 수 - 락 대기로 요청이 안 빠지고 쌓이면 여기가 계단식으로 증가한다.",
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": { "drawStyle": "line", "fillOpacity": 10, "lineWidth": 2 }
},
"overrides": []
},
"gridPos": { "h": 9, "w": 12, "x": 0, "y": 27 },
"id": 6,
"options": {
"legend": { "displayMode": "table", "placement": "bottom", "calcs": ["max", "last"] },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"targets": [
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "sum by (bucket, name) (minio_bucket_api_inflight_total{bucket=~\"$bucket\"})",
"legendFormat": "{{bucket}} / {{name}}",
"refId": "A"
}
],
"title": "버킷별 Inflight 요청 수",
"type": "timeseries"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"description": "버킷별 TTFB p99. 락 대기 때문에 응답이 늦어지면 특정 버킷에서 튄다.",
"fieldConfig": {
"defaults": {
"unit": "s",
"custom": { "drawStyle": "line", "fillOpacity": 10, "lineWidth": 2 }
},
"overrides": []
},
"gridPos": { "h": 9, "w": 12, "x": 12, "y": 27 },
"id": 7,
"options": {
"legend": { "displayMode": "table", "placement": "bottom", "calcs": ["max", "last"] },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"targets": [
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "histogram_quantile(0.99, sum by (bucket, name, le) (rate(minio_bucket_api_ttfb_seconds_distribution{bucket=~\"$bucket\"}[5m])))",
"legendFormat": "p99 {{bucket}} / {{name}}",
"refId": "A"
}
],
"title": "버킷별 TTFB p99",
"type": "timeseries"
},
{
"collapsed": false,
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 36 },
"id": 300,
"panels": [],
"title": "3. 용의 워크로드 (ILM / Batch / Replication / 대량삭제)",
"type": "row"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"description": "버킷별 DeleteObjects / PutObject 요청률. 대량 멀티오브젝트 삭제나 병렬 업로드가 락 경합의 흔한 원인.",
"fieldConfig": {
"defaults": {
"unit": "reqps",
"custom": { "drawStyle": "line", "fillOpacity": 10, "lineWidth": 2 }
},
"overrides": []
},
"gridPos": { "h": 8, "w": 12, "x": 0, "y": 37 },
"id": 8,
"options": {
"legend": { "displayMode": "table", "placement": "bottom", "calcs": ["max", "mean"] },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"targets": [
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "sum by (bucket, name) (rate(minio_bucket_api_total{bucket=~\"$bucket\", name=~\"DeleteObject.*|PutObject.*|CompleteMultipartUpload\"}[5m]))",
"legendFormat": "{{bucket}} / {{name}}",
"refId": "A"
}
],
"title": "버킷별 삭제/업로드 요청률",
"type": "timeseries"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"description": "ILM 만료 대기열 및 액션 카운트. 버저닝 버킷에서 만료 스윕이 돌면 락 폭증의 흔한 원인.",
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": { "drawStyle": "line", "fillOpacity": 10, "lineWidth": 2 }
},
"overrides": []
},
"gridPos": { "h": 8, "w": 12, "x": 12, "y": 37 },
"id": 9,
"options": {
"legend": { "displayMode": "table", "placement": "bottom", "calcs": ["max", "last"] },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"targets": [
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "minio_ilm_expiry_pending_tasks",
"legendFormat": "expiry pending",
"refId": "A"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "rate(minio_ilm_action_count_delete_all_versions[5m])",
"legendFormat": "delete_all_versions rate",
"refId": "B"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "rate(minio_ilm_action_count_delete_version[5m])",
"legendFormat": "delete_version rate",
"refId": "C"
}
],
"title": "ILM 만료/삭제 액션",
"type": "timeseries"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"description": "Batch 작업(expire, replicate 등) 진행 상황. mc batch start로 대량 작업이 돌았는지 확인.",
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": { "drawStyle": "line", "fillOpacity": 10, "lineWidth": 2 }
},
"overrides": []
},
"gridPos": { "h": 8, "w": 12, "x": 0, "y": 45 },
"id": 10,
"options": {
"legend": { "displayMode": "table", "placement": "bottom", "calcs": ["max", "last"] },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"targets": [
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "minio_batch_jobs_in_progress",
"legendFormat": "in_progress {{type}}",
"refId": "A"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "sum by (bucket) (rate(minio_bucket_batch_objects_completed{bucket=~\"$bucket\"}[5m]))",
"legendFormat": "completed/s {{bucket}}",
"refId": "B"
}
],
"title": "Batch 작업 진행/완료",
"type": "timeseries"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"description": "버킷별 복제 실패/전송량/지연. 타깃 장애 후 백로그 catch-up이 락 폭증의 흔한 원인.",
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": { "drawStyle": "line", "fillOpacity": 10, "lineWidth": 2 }
},
"overrides": []
},
"gridPos": { "h": 8, "w": 12, "x": 12, "y": 45 },
"id": 11,
"options": {
"legend": { "displayMode": "table", "placement": "bottom", "calcs": ["max", "last"] },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"targets": [
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "sum by (bucket) (rate(minio_bucket_replication_sent_count{bucket=~\"$bucket\"}[5m]))",
"legendFormat": "sent/s {{bucket}}",
"refId": "A"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "sum by (bucket) (minio_bucket_replication_last_minute_failed_count{bucket=~\"$bucket\"})",
"legendFormat": "failed(last min) {{bucket}}",
"refId": "B"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "avg by (bucket, operation) (minio_bucket_replication_latency_ms{bucket=~\"$bucket\"})",
"legendFormat": "latency_ms {{bucket}} {{operation}}",
"refId": "C"
}
],
"title": "버킷별 복제 활동",
"type": "timeseries"
},
{
"collapsed": false,
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 53 },
"id": 400,
"panels": [],
"title": "4. 부가 신호 (알림/오디트 큐 백로그)",
"type": "row"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"description": "알림 타깃 큐 길이 - 이벤트 폭주로 인한 goroutine 증가 가능성 배제/확인용.",
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": { "drawStyle": "line", "fillOpacity": 10, "lineWidth": 2 }
},
"overrides": []
},
"gridPos": { "h": 8, "w": 12, "x": 0, "y": 54 },
"id": 12,
"options": {
"legend": { "displayMode": "table", "placement": "bottom", "calcs": ["max", "last"] },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"targets": [
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "minio_notification_target_queue_length",
"legendFormat": "notif queue {{target_id}}",
"refId": "A"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "minio_notification_events_send_in_progress",
"legendFormat": "notif send in-progress",
"refId": "B"
}
],
"title": "알림(Webhook/Kafka) 큐 백로그",
"type": "timeseries"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"description": "감사 로그 큐 길이. 감사 로그가 살아있다면 이 시간대 대상으로 bucket/object별 API 호출 원천 데이터를 조회하는 것이 가장 확실한 방법.",
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": { "drawStyle": "line", "fillOpacity": 10, "lineWidth": 2 }
},
"overrides": []
},
"gridPos": { "h": 8, "w": 12, "x": 12, "y": 54 },
"id": 13,
"options": {
"legend": { "displayMode": "table", "placement": "bottom", "calcs": ["max", "last"] },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"targets": [
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "minio_audit_target_queue_length",
"legendFormat": "audit queue {{target_id}}",
"refId": "A"
},
{
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"expr": "minio_audit_failed_messages",
"legendFormat": "audit failed {{target_id}}",
"refId": "B"
}
],
"title": "감사 로그 큐 백로그",
"type": "timeseries"
}
],
"refresh": "30s",
"schemaVersion": 39,
"tags": ["aistor", "minio", "locks", "root-cause"],
"templating": {
"list": [
{
"current": { "text": "Prometheus", "value": "${DS_PROMETHEUS}" },
"hide": 0,
"label": "Prometheus",
"name": "DS_PROMETHEUS",
"options": [],
"query": "prometheus",
"refresh": 1,
"type": "datasource"
},
{
"current": { "text": "All", "value": "$__all" },
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"definition": "label_values(minio_locks_dist_avg_latency, server)",
"hide": 0,
"includeAll": true,
"label": "Instance/Server",
"multi": true,
"name": "instance",
"options": [],
"query": { "query": "label_values(minio_locks_dist_avg_latency, server)", "refId": "StandardVariableQuery" },
"refresh": 2,
"regex": "",
"type": "query"
},
{
"current": { "text": "All", "value": "$__all" },
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"definition": "label_values(minio_bucket_api_total, bucket)",
"hide": 0,
"includeAll": true,
"label": "Bucket",
"multi": true,
"name": "bucket",
"options": [],
"query": { "query": "label_values(minio_bucket_api_total, bucket)", "refId": "StandardVariableQuery" },
"refresh": 2,
"regex": "",
"type": "query"
}
]
},
"time": { "from": "now-24h", "to": "now" },
"timepicker": {},
"timezone": "",
"title": "AIStor - Distributed Lock Latency Root Cause",
"uid": "aistor-lock-latency-rootcause",
"version": 1,
"weekStart": ""
}