跳到主要内容

Grafana

核心功能

Grafana 是开源的可视化与可观测性平台,支持多数据源统一展示。

功能说明
多数据源Prometheus、Loki、Elasticsearch、MySQL、InfluxDB 等
仪表盘丰富的面板类型(图表、表格、热力图、日志等)
告警Grafana Alerting 统一告警管理
变量仪表盘变量实现动态切换(Namespace / Instance)
注解标记部署、事件等时间节点

Dashboard 设计

常用面板类型

面板用途适用指标
Time Series时间序列折线图CPU 使用率、QPS
Stat单值展示总数、当前值
Gauge仪表盘使用率百分比
Table表格Top N、详情列表
Heatmap热力图延迟分布
Logs日志面板Loki 日志
Alert List告警列表当前活跃告警

Dashboard 变量

# 定义变量 $namespace(从 Prometheus 获取所有 Namespace)
label_values(kube_pod_info, namespace)

# 定义变量 $pod(根据已选 namespace 过滤)
label_values(kube_pod_info{namespace="$namespace"}, pod)

# 在查询中使用变量
rate(container_cpu_usage_seconds_total{namespace="$namespace", pod="$pod"}[5m])

推荐 Dashboard

Dashboard ID名称数据源用途
1860Node Exporter FullPrometheus主机监控
3662Prometheus 2.0 OverviewPrometheusPrometheus 自身
7362MySQL OverviewPrometheusMySQL 监控
763Redis DashboardPrometheusRedis 监控
15757K8s Views / PodsPrometheusK8s Pod 监控

导入方式:Grafana → Dashboards → Import → 输入 Dashboard ID。

Grafana Alerting

Grafana 统一告警(Grafana 9+)支持多数据源告警。

告警规则示例
# 在 Grafana UI 或 Provisioning 中配置
# 条件:CPU > 85% 持续 5 分钟
# 表达式:
# A = avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m]))
# B = 100 - A * 100
# C = B > 85

通知渠道

渠道配置
邮件SMTP 配置
SlackWebhook URL
钉钉机器人 Webhook
飞书机器人 Webhook
PagerDutyIntegration Key
Webhook自定义 HTTP 回调

告警模板

通知模板
{{ define "custom.title" }}
[{{ .Status | toUpper }}] {{ .CommonLabels.alertname }}
{{ end }}

{{ define "custom.message" }}
严重级别: {{ .CommonLabels.severity }}
实例: {{ .CommonLabels.instance }}
当前值: {{ .CommonAnnotations.value }}
描述: {{ .CommonAnnotations.summary }}
{{ end }}

Grafana as Code

Provisioning(自动化配置)

provisioning/datasources/prometheus.yml
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
url: http://prometheus:9090
access: proxy
isDefault: true
- name: Loki
type: loki
url: http://loki:3100
access: proxy
provisioning/dashboards/default.yml
apiVersion: 1
providers:
- name: Default
folder: ''
type: file
options:
path: /var/lib/grafana/dashboards

Terraform 管理

Terraform Grafana Provider
resource "grafana_dashboard" "node" {
config_json = file("dashboards/node-exporter.json")
folder = grafana_folder.monitoring.id
}

resource "grafana_data_source" "prometheus" {
type = "prometheus"
name = "Prometheus"
url = "http://prometheus:9090"
}

常见面试问题

Q1: Grafana 告警和 Alertmanager 告警哪个更好?

答案

维度Grafana AlertingAlertmanager
数据源多数据源(Prometheus、Loki、MySQL 等)仅 Prometheus
可视化与 Dashboard 集成无可视化
路由简单复杂路由、分组、抑制
生态Grafana 生态Prometheus 生态

推荐:小团队用 Grafana Alerting 更简单;大型平台用 Alertmanager 更灵活。

Q2: 如何设计运维监控 Dashboard?

答案

按层级组织:

  1. 总览 Dashboard:全局健康状态(绿/黄/红),关键 SLI
  2. 基础设施:Node CPU / 内存 / 磁盘 / 网络
  3. K8s:Pod 状态、资源使用、Deployment
  4. 中间件:MySQL QPS / 慢查询、Redis 命中率 / 内存
  5. 应用:QPS / 错误率 / P99 延迟

每个 Dashboard 用变量(Namespace / Instance)做动态切换。

相关链接