11. Alert Summary (경고 요약) 대시보드 역시 무조건 고쳐야 합니다.
기존의 Alert Summary 대시보드는 단일 클러스터 기준으로 프로메테우스의 ALERTS 메트릭을 무조건 긁어왔기 때문에, 멀티 클러스터/Thanos Federation 환경에서는 전 세계 모든 리전의 온갖 경고가 한 화면에 뒤섞여 뿜어지는 치명적인 결함이 발생합니다.
장애 상황에서 SRE 엔지니어에게 막대한 인지 부하(Alert Fatigue)를 주기 때문에, 최상단에 $cluster 및 $namespace 가드레일 선택 셀렉터를 탑재하고 현재 딱 선택한 AIStor 인프라 리전의 핵심 경고만 격리 요약하도록 리빌딩한 프로덕션 급 Grafana JSON 명세입니다.
그라파나 Import Dashboard에 복사-붙여넣기하여 즉시 기동할 수 있습니다. 활성화된 경고(firing) 상태와 보류(pending) 상태의 알람을 심각도(Severity) 및 경고 명칭별로 분류하여 탑재합니다.
{
"annotations": {
"list": [
{
"builtIn": 1,
"datasource": {
"type": "datasource",
"uid": "grafana"
},
"enable": true,
"hide": true,
"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": 1100,
"title": "🚨 1. TARGET CLUSTER ACTIVE ALERT COUNTERS",
"type": "row"
},
{
"datasource": {
"type": "prometheus",
"uid": "${datasource}"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 1
}
]
},
"unit": "short"
},
"overrides": []
},
"gridPos": {
"h": 4,
"w": 12,
"x": 0,
"y": 1
},
"id": 1101,
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "center",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "value"
},
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${datasource}"
},
"editorMode": "code",
"expr": "sum(ALERTS{alertstate=\"firing\", severity=\"critical\", cluster=\"$cluster\", namespace=\"$namespace\"}) or vector(0)",
"legendFormat": "Critical",
"refId": "A"
}
],
"title": "Active CRITICAL Alerts Count",
"type": "stat"
},
{
"datasource": {
"type": "prometheus",
"uid": "${datasource}"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "orange",
"value": 1
}
]
},
"unit": "short"
},
"overrides": []
},
"gridPos": {
"h": 4,
"w": 12,
"x": 12,
"y": 1
},
"id": 1102,
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "center",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "value"
},
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${datasource}"
},
"editorMode": "code",
"expr": "sum(ALERTS{alertstate=\"firing\", severity=\"warning\", cluster=\"$cluster\", namespace=\"$namespace\"}) or vector(0)",
"legendFormat": "Warning",
"refId": "A"
}
],
"title": "Active WARNING Alerts Count",
"type": "stat"
},
{
"collapsed": false,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 5
},
"id": 1200,
"title": "📋 2. ISOLATED ALERT LIST & REAL-TIME DETAIL SPECIFICATION",
"type": "row"
},
{
"datasource": {
"type": "prometheus",
"uid": "${datasource}"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"align": "auto",
"displayMode": "auto"
},
"mappings": []
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 24,
"x": 0,
"y": 6
},
"id": 1201,
"options": {
"cellHeight": "sm",
"footer": {
"countRows": false,
"fields": "",
"reducer": [
"sum"
],
"show": false
},
"showHeader": true,
"sortBy": []
},
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${datasource}"
},
"editorMode": "code",
"expr": "ALERTS{alertstate=\"firing\", cluster=\"$cluster\", namespace=\"$namespace\"}",
"format": "table",
"instant": true,
"legendFormat": "",
"refId": "A"
}
],
"title": "Live Firing Alerts Inventory Matrix",
"type": "table"
},
{
"collapsed": false,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 14
},
"id": 1300,
"title": "📈 3. CHRONOLOGICAL ALERT VOLATILITY & TIMELINE PROFILE",
"type": "row"
},
{
"datasource": {
"type": "prometheus",
"uid": "${datasource}"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisBorderShow": false,
"axisPlacement": "auto",
"drawStyle": "line",
"fillOpacity": 5,
"lineInterpolation": "stepAfter",
"lineWidth": 2,
"showPoints": "auto"
},
"mappings": [],
"unit": "short"
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 24,
"x": 0,
"y": 15
},
"id": 1301,
"options": {
"legend": {
"calcs": [
"max"
],
"displayMode": "table",
"placement": "right",
"showLegend": true
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${datasource}"
},
"editorMode": "code",
"expr": "sum(ALERTS{alertstate=\"firing\", cluster=\"$cluster\", namespace=\"$namespace\"}) by (alertname)",
"legendFormat": "{{alertname}}",
"refId": "A"
}
],
"title": "Alert Activation Volatility Trend Timeline",
"type": "timeseries"
}
],
"refresh": "10s",
"schemaVersion": 38,
"style": "dark",
"tags": [
"AIStor",
"Alertmanager",
"Alert-Summary",
"Multi-Cluster-SRE"
],
"templating": {
"list": [
{
"current": {},
"hide": 0,
"includeAll": false,
"label": "Data Source",
"name": "datasource",
"options": [],
"query": "prometheus",
"refresh": 1,
"regex": "",
"skipUrlSync": false,
"type": "datasource"
},
{
"current": {},
"datasource": {
"type": "prometheus",
"uid": "${datasource}"
},
"definition": "label_values(ALERTS, cluster)",
"hide": 0,
"includeAll": true,
"multi": false,
"label": "AIStor Cluster",
"name": "cluster",
"options": [],
"query": {
"query": "label_values(ALERTS, cluster)",
"refId": "ClusterVariableQuery"
},
"refresh": 1,
"regex": "",
"skipUrlSync": false,
"sort": 1,
"type": "query"
},
{
"current": {},
"datasource": {
"type": "prometheus",
"uid": "${datasource}"
},
"definition": "label_values(ALERTS{cluster=\"$cluster\"}, namespace)",
"hide": 0,
"includeAll": false,
"label": "Namespace",
"name": "namespace",
"options": [],
"query": {
"query": "label_values(ALERTS{cluster=\"$cluster\"}, namespace)",
"refId": "NamespaceVariableQuery"
},
"refresh": 1,
"regex": "",
"skipUrlSync": false,
"sort": 1,
"type": "query"
}
]
},
"time": {
"from": "now-6h",
"to": "now"
},
"timepicker": {
"refresh_intervals": [
"5s",
"10s",
"30s"
]
},
"timezone": "browser",
"title": "AIStor Operations - 11. Alert Summary (Multi-Cluster)",
"version": 2
}
이 대시보드가 완벽히 작동하면 프로메테우스의 얼럿매니저(Alertmanager)가 쏘아 올리는 Webhook 페이로드(Payload)의 아키텍처적 일치성이 확보됩니다.
n8n Webhook Receiver로 쏘는 라우팅 규칙에 cluster와 namespace 레이블이 필수 탑재됩니다.cluster="prod-kr-01" 정보를 기반으로 StarRocks 데이터 레이크하우스에 즉시 SELECT * FROM aistor_inventory_daily WHERE cluster = 'prod-kr-01' 형태의 세부 용량/파일 현황 데이터를 쿼리합니다.1번 메인 요약판부터 11번 장애 요약 캔버스까지, 모든 코어 도메인이 다중 클러스터(Thanos) 기반의 Metrics v3 생태계로 완벽하게 마이그레이션되었습니다.
===
특정 클러스터와 네임스페이스가 미리 선택된 상태로 대시보드에 바로 진입하는 방법은 크게 두 가지가 있습니다.
운영 상황에 따라 ① URL 파라미터로 동적 주입하는 방법과 ② 대시보드 자체의 기본 랜딩 값(Default)으로 고정하는 방법 중 편한 방식을 선택하면 됩니다.
그라파나는 상단 변수(Template Variable) 값을 URL 뒤에 쿼리 스트링 파라미터 형태로 인젝션하여 강제 지정하는 기능을 지원합니다. 변수명 앞에 var- 접두사를 붙여 URL을 구성하면 됩니다.
https://<your-grafana-url>/d/aistor-overview/aistor-operations-1-overview-multi-cluster-v3?orgId=1&var-cluster=prod-kr-01&var-namespace=aistor-core
var-cluster=prod-kr-01: 상단 $cluster 셀렉터 단추를 prod-kr-01로 강제 고정합니다.var-namespace=aistor-core: 상단 $namespace 셀렉터 단추를 aistor-core로 강제 고정합니다.앞서 논의한 n8n-LLM 장애 알람 파이프라인을 구동할 때, 슬랙(Slack) 메시지에 대시보드 링크를 넣는다면 아래와 같이 프로메테우스 페이로드에서 추출한 클러스터와 네임스페이스 변수를 n8n에서 조합하여 템플릿 URL을 동적으로 쏴주면 됩니다.
엔지니어가 알람을 누르자마자 장애가 발생한 바로 그 클러스터의 데이터만 띄워진 채로 캔버스가 열리므로 초동 대응 시간이 획기적으로 단축됩니다.
특정 클러스터(예: 가장 빈번하게 모니터링해야 하는 메인 프로덕션 클러스터)를 대시보드 자체의 기본값으로 박아두고 싶을 때 사용하는 그라파나 표준 기능입니다.
Save current variable values as dashboard default (현재 변수 값을 대시보드 기본값으로 저장) 체크박스를 반드시 체크한 후 저장합니다.우리가 1번부터 11번까지 쪼갠 독립형 대시보드 간을 이동할 때 선택한 클러스터가 풀리지 않게 하려면, 그라파나의 Dashboard Links 설정에서 아래 옵션을 켜두면 편리합니다.
이렇게 세팅해 두면 1. Summary 대시보드에서 prod-cn-chongqing 클러스터를 보다가 상단 링크를 눌러 3. Tiering 대시보드로 넘어갈 때, 클러스터 변수가 주소창을 타고 그대로 유지(Pass-through)됩니다.