26S02c

QK·5일 전
{
  "__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": ""
}
profile
engineer

0개의 댓글