Prometheus 数据采集与 Grafana 可视化实践指南
Prometheus 是一个开源的系统监控和警报工具包,采用拉取(pull)模式从目标收集指标数据。:Prometheus 将所有数据存储为时间序列,每个时间序列由指标名称(metric name)和一组键值对标签(label)唯一标识。
·
Prometheus 采集与 Grafana 可视化指南
一、Prometheus 数据采集原理
Prometheus 是一个开源的系统监控和警报工具包,采用拉取(pull)模式从目标收集指标数据。其核心采集机制包括:
-
数据模型:Prometheus 将所有数据存储为时间序列,每个时间序列由指标名称(metric name)和一组键值对标签(label)唯一标识。时间序列数据格式为:
<metric name>{<label name>=<label value>,...} value [timestamp]
-
指标类型:
- Counter(计数器):单调递增的数值,适合记录请求数量、任务完成数等
- Gauge(仪表盘):可以任意变化的数值,适合记录内存使用量、温度等瞬时值
- Histogram(直方图):采样观察值,自动计算分位数,适合记录请求延迟、响应大小
- Summary(摘要):类似直方图但可直接在客户端计算分位数,适合记录高精度延迟数据
-
采集方式:
- 通过HTTP端点定期抓取指标(默认路径/metrics)
- 支持多种服务发现机制(静态配置、DNS、Kubernetes、Consul等)
- 可配置抓取间隔(scrape_interval)和超时时间(scrape_timeout)
- 支持Pushgateway用于短期任务指标推送
二、配置Prometheus采集
1. 基本配置示例
global:
scrape_interval: 15s # 默认抓取间隔
evaluation_interval: 15s # 规则评估间隔
external_labels: # 外部系统标识
monitor: 'production'
scrape_configs:
- job_name: 'prometheus' # 监控Prometheus自身
scrape_interval: 10s # 覆盖全局设置
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter' # 监控节点指标
metrics_path: '/metrics' # 指标路径
static_configs:
- targets:
- 'node-exporter:9100'
- 'node-exporter2:9100'
relabel_configs: # 标签重写
- source_labels: [__address__]
regex: '(.*):9100'
target_label: 'instance'
replacement: '$1'
2. 高级采集配置
- 文件服务发现:
scrape_configs:
- job_name: 'file_sd'
file_sd_configs:
- files:
- /etc/prometheus/targets/*.json
refresh_interval: 5m # 文件重新加载间隔
- Kubernetes服务发现:
scrape_configs:
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs:
- role: node # 发现集群节点
scheme: https
tls_config:
insecure_skip_verify: true
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- action: labelmap # 将K8s标签映射为Prometheus标签
regex: __meta_kubernetes_node_label_(.+)
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:9100' # 将kubelet端口替换为node-exporter端口
target_label: __address__
三、Grafana可视化配置
1. 连接Prometheus数据源
- 登录Grafana(默认地址http://localhost:3000)
- 导航到Configuration > Data Sources
- 选择"Add data source"
- 选择Prometheus类型
- 配置参数:
- URL: http://prometheus:9090
- Scrape interval: 15s(与Prometheus配置一致)
- HTTP Method: GET
- Timeout: 30s
- 点击"Save & Test"验证连接
2. 创建仪表盘
CPU使用率面板示例
{
"title": "CPU Usage by Instance",
"description": "实时显示各节点CPU使用率",
"type": "gauge",
"datasource": "Prometheus",
"gridPos": { "x": 0, "y": 0, "w": 8, "h": 6 },
"targets": [
{
"expr": "100 - (avg by (instance) (irate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)",
"legendFormat": "{{instance}}",
"interval": "15s",
"refId": "A"
}
],
"options": {
"min": 0,
"max": 100,
"unit": "percent",
"thresholds": {
"mode": "absolute",
"steps": [
{ "color": "green", "value": null },
{ "color": "orange", "value": 70 },
{ "color": "red", "value": 85 }
]
},
"showThresholdLabels": true,
"showThresholdMarkers": true
}
}
内存使用趋势图
{
"title": "Memory Usage Trend",
"type": "graph",
"datasource": "Prometheus",
"gridPos": { "x": 8, "y": 0, "w": 16, "h": 8 },
"targets": [
{
"expr": "(node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Buffers_bytes - node_memory_Cached_bytes) / (1024*1024)",
"legendFormat": "Used ({{instance}})",
"step": "60s",
"refId": "A"
},
{
"expr": "node_memory_MemTotal_bytes / (1024*1024)",
"legendFormat": "Total ({{instance}})",
"step": "60s",
"refId": "B"
}
],
"options": {
"legend": {
"show": true,
"values": true,
"min": false,
"max": true,
"current": true,
"total": false,
"alignAsTable": true
},
"tooltip": {
"shared": true,
"sort": 2 // 按值降序排序
},
"yaxes": [
{
"format": "MB",
"min": 0
},
{
"show": false
}
],
"lines": true,
"fill": 1,
"linewidth": 2
}
}
四、最佳实践与技巧
-
标签使用建议:
- 避免高基数标签(如用户ID、IP地址),可能导致内存爆炸
- 使用一致的标签命名约定(如snake_case)
- 合理利用relabel_configs处理标签:
relabel_configs: - source_labels: [__meta_kubernetes_pod_name] target_label: pod - regex: '.*_token;.*' # 删除敏感标签 action: labeldrop
-
采集优化:
- 关键指标:15s采集间隔
- 次要指标:30-60s采集间隔
- 使用记录规则预计算常用查询:
groups: - name: node_rules rules: - record: instance:node_cpu:avg_rate5m expr: 100 - avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100
-
Grafana高级技巧:
- 使用模板变量实现交互式仪表盘:
"templating": { "list": [ { "name": "instance", "datasource": "Prometheus", "query": "label_values(node_cpu_seconds_total, instance)", "refresh": 1, "multi": true } ] }
- 利用Annotations标记部署、重启等重要事件
- 配置警报规则并与Alertmanager集成
- 使用Dashboard JSON Model进行版本控制
- 应用Grafana插件(如Pie Chart, Worldmap Panel等)
- 使用模板变量实现交互式仪表盘:
五、常见问题排查
-
Prometheus无法抓取指标:
- 检查目标端点是否可访问:
curl http://target:port/metrics
- 验证服务发现配置是否正确:
http://prometheus:9090/service-discovery
- 检查网络连接和防火墙设置
- 查看Prometheus日志:
journalctl -u prometheus -f
- 检查目标端点是否可访问:
-
Grafana显示无数据:
- 验证数据源连接:
Grafana > Data Sources > Test
- 检查查询时间范围设置(右上角时间选择器)
- 确认PromQL查询语法正确:
http://prometheus:9090/graph
中测试 - 检查指标名称是否存在:
count({__name__=~".+"})
- 验证数据源连接:
-
性能问题:
- 监控Prometheus自身指标:
- 内存使用:
process_resident_memory_bytes
- 存储速率:
rate(prometheus_tsdb_head_samples_appended_total[1m])
- 内存使用:
- 优化高消耗查询:
- 避免
.*
正则匹配 - 使用
rate()
而非irate()
处理长时间范围
- 避免
- 考虑分片或联邦部署:
scrape_configs: - job_name: 'federate' honor_labels: true metrics_path: '/federate' params: 'match[]': - '{job="prometheus"}' - '{__name__=~"job:.*"}' static_configs: - targets: - 'source-prometheus:9090'
- 监控Prometheus自身指标:
通过合理配置Prometheus采集和Grafana可视化,您可以构建强大的监控系统,实时掌握系统运行状态,快速定位和解决问题。建议定期审查指标采集策略,删除无用指标,优化存储效率。
更多推荐
所有评论(0)