Prometheus基础使用指南
Prometheus基础使用指南
概述
本文介绍Prometheus监控系统的基础使用方法,包括Web界面操作、PromQL查询语言、目标管理、规则配置等核心功能。适合初学者系统性学习Prometheus的基本操作。
Prometheus Web界面导览
访问入口
http://prometheus-server:9090
主要功能模块
- Graph: 查询和图表展示
- Alerts: 告警规则和状态
- Status: 系统状态信息
- Help: 帮助文档
目标管理 (Targets)
查看监控目标状态
导航路径:Status → Targets
目标状态说明
State: UP - 目标可访问,正常采集数据
State: DOWN - 目标不可访问,无法采集数据
典型配置示例
# prometheus.yml配置示例
scrape_configs:- job_name: 'prometheus'static_configs:- targets: ['localhost:9090']- job_name: 'node-exporter'static_configs:- targets: ['node-exporter:9100']- job_name: 'spring-boot-app'static_configs:- targets: ['app-server:8080']metrics_path: '/actuator/prometheus'scrape_interval: 30s
目标状态排查
UP状态检查要点:
- Health: 健康检查通过
- Last Scrape: 最近采集时间
- Scrape Duration: 采集耗时
- Samples: 采集到的指标数量
DOWN状态常见原因:
# 网络连通性检查
curl http://target-host:port/metrics# 防火墙检查
telnet target-host port# DNS解析检查
nslookup target-host
API方式查询目标
# 获取所有目标状态
curl http://prometheus-server:9090/api/v1/targets# 过滤特定job的目标
curl 'http://prometheus-server:9090/api/v1/targets' | jq '.data.activeTargets[] | select(.job=="spring-boot-app")'
配置管理 (Configuration)
查看当前配置
导航路径:Status → Configuration
配置热重载
# 重新加载配置(无需重启)
curl -X POST http://prometheus-server:9090/-/reload# 验证配置语法
promtool check config prometheus.yml
配置文件结构
global:scrape_interval: 15s # 全局采集间隔evaluation_interval: 15s # 规则评估间隔rule_files:- "alert-rules.yml" # 告警规则文件alerting:alertmanagers: # AlertManager配置- static_configs:- targets: ["alertmanager:9093"]scrape_configs: # 采集目标配置- job_name: 'example-app'# ... 具体配置
告警规则管理 (Rules)
查看规则状态
导航路径:Status → Rules
规则类型
- Recording Rules: 预计算规则,生成新的时间序列
- Alerting Rules: 告警规则,触发告警
告警规则示例
# alert-rules.yml
groups:- name: application-alertsrules:# 服务可用性告警- alert: ServiceDownexpr: up{job="spring-boot-app"} == 0for: 1mlabels:severity: criticalannotations:summary: "Service {{ $labels.job }} is down"description: "Service has been down for more than 1 minute"# 高错误率告警- alert: HighErrorRateexpr: rate(http_requests_total{status=~"5.."}[5m]) > 0.1for: 2mlabels:severity: warningannotations:summary: "High error rate detected"description: "Error rate is {{ $value }} requests/sec"
记录规则示例
groups:- name: application-recordingrules:# 计算QPS- record: app:http_requests:rate5mexpr: rate(http_requests_total[5m])# 计算错误率- record: app:http_errors:rate5mexpr: rate(http_requests_total{status=~"5.."}[5m])
规则状态说明
- Active: 规则正常工作
- Firing: 告警规则正在触发
- Pending: 告警规则等待触发(for条件未满足)
PromQL查询语言
基础查询语法
1. 基本指标查询
# 查询单个指标
up# 查询特定job的指标
up{job="spring-boot-app"}# 查询多个条件
http_requests_total{job="spring-boot-app", method="GET"}
2. 时间范围查询
# 查询过去5分钟的数据
http_requests_total[5m]# 查询1小时前的数据
http_requests_total offset 1h
3. 聚合函数
# 求和
sum(http_requests_total)# 按label分组求和
sum(http_requests_total) by (job)# 平均值
avg(cpu_usage_percent)# 最大值和最小值
max(memory_usage_bytes)
min(memory_usage_bytes)# 计数
count(up == 1)
4. 速率计算
# 计算每秒速率
rate(http_requests_total[5m])# 计算增长量
increase(http_requests_total[1h])# 计算瞬时增长率
irate(http_requests_total[5m])
实用查询示例
应用性能监控
# QPS (每秒请求数)
sum(rate(http_requests_total[5m])) by (job)# 平均响应时间
histogram_quantile(0.5, rate(http_request_duration_seconds_bucket[5m]))# 95分位响应时间
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))# 错误率
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))
系统资源监控
# CPU使用率
100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)# 内存使用率
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100# 磁盘使用率
(1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) * 100# 网络流量
rate(node_network_receive_bytes_total[5m])
业务指标监控
# 任务执行成功率
sum(rate(task_executions_total{status="success"}[5m])) / sum(rate(task_executions_total[5m]))# 任务执行时长分布
histogram_quantile(0.95, rate(task_duration_seconds_bucket[10m]))# 活跃用户数
count(user_last_activity_timestamp > (time() - 300))
PromQL操作符
算术操作符
# 基本运算
memory_usage_bytes / 1024 / 1024 # 转换为MB
cpu_usage_percent * 100 # 转换为百分比# 向量运算
node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes
比较操作符
# 过滤条件
cpu_usage_percent > 80
memory_usage_percent <= 90
http_response_time != 0
逻辑操作符
# AND操作
up{job="app"} and on(instance) cpu_usage_percent > 80# OR操作
up{job="app1"} or up{job="app2"}# UNLESS操作 (排除)
up unless on(instance) node_cpu_seconds_total
实用功能和技巧
查询历史数据
# 查询特定时间点的数据
up @ 1609459200 # Unix时间戳# 查询相对时间的数据
up offset 1h # 1小时前
up offset 1d # 1天前
标签操作
# 重命名标签
label_replace(up, "environment", "$1", "instance", "(.+)-.+")# 删除标签
up{job="app"} without (instance)# 选择标签
up{job="app"} by (job, status)
数学函数
# 四舍五入
round(cpu_usage_percent, 0.1)# 取整
floor(memory_usage_gb)
ceil(memory_usage_gb)# 绝对值
abs(temperature_celsius)# 对数和指数
ln(requests_per_second)
exp(log_level)
查询优化技巧
性能最佳实践
1. 时间范围选择
# 好的做法:适当的时间窗口
rate(http_requests_total[5m])# 避免:过短的时间窗口
rate(http_requests_total[30s]) # 可能导致数据不稳定# 避免:过长的时间窗口
rate(http_requests_total[1h]) # 可能掩盖短期变化
2. 标签过滤
# 好的做法:尽早过滤
sum(rate(http_requests_total{job="specific-app"}[5m]))# 避免:后期过滤
sum(rate(http_requests_total[5m])) by (job) and on() vector(job="specific-app")
3. 聚合优化
# 好的做法:先聚合再计算
sum(rate(http_requests_total[5m])) by (job)# 避免:重复聚合
sum(sum(rate(http_requests_total[5m])) by (instance)) by (job)
常见查询错误
错误1:类型不匹配
# 错误:向量与标量运算
up + 1# 正确:确保操作数类型匹配
up + on() group_left() vector(1)
错误2:标签选择问题
# 错误:标签不存在
http_requests_total{nonexistent_label="value"}# 正确:检查标签是否存在
label_names() # 查看所有标签名
错误3:时间序列过多
# 可能有问题:高基数查询
sum(http_requests_total) by (user_id)# 更好:适当聚合
sum(http_requests_total) by (job, status)
监控仪表板最佳实践
图表类型选择
1. 时间序列图表
适用于:趋势监控、性能指标
# CPU使用率趋势
avg(cpu_usage_percent) by (instance)
2. 统计图表
适用于:当前状态、汇总信息
# 当前在线服务数量
count(up == 1)
3. 热力图
适用于:分布数据、响应时间分析
# 响应时间分布
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
告警规则设计原则
1. 明确的阈值
# 好的做法:基于业务需求的阈值
- alert: HighErrorRateexpr: error_rate > 0.05 # 5%错误率# 避免:过于敏感的阈值
- alert: AnyErrorexpr: error_rate > 0 # 任何错误都告警
2. 合适的持续时间
# 好的做法:避免短期波动
- alert: ServiceDownexpr: up == 0for: 1m # 持续1分钟才告警# 避免:立即告警
- alert: ServiceDownexpr: up == 0for: 0s # 立即告警,容易误报
3. 有意义的标签和注释
- alert: DatabaseConnectionFailureexpr: db_connections_active / db_connections_max > 0.9labels:severity: warningcomponent: databaseannotations:summary: "Database connection pool nearly exhausted"description: "Connection usage: {{ $value | humanizePercentage }}"
故障排查指南
常见问题诊断
1. 数据采集问题
# 检查目标状态
curl http://prometheus-server:9090/api/v1/targets# 检查指标端点
curl http://target-app:port/metrics# 验证指标格式
curl http://target-app:port/metrics | grep HELP
2. 查询性能问题
# 检查查询执行时间
prometheus_engine_query_duration_seconds# 检查活跃查询数
prometheus_engine_queries# 查看存储指标
prometheus_tsdb_head_samples_appended_total
3. 存储空间问题
# 检查数据目录大小
du -sh /prometheus/data# 查看数据保留策略
--storage.tsdb.retention.time=15d
--storage.tsdb.retention.size=10GB
总结
Prometheus作为现代监控系统的核心组件,提供了强大而灵活的查询能力。掌握其基础操作和PromQL语言,是构建有效监控体系的关键。
学习要点回顾
- 界面熟悉: 了解各个功能模块的作用
- PromQL语法: 掌握基本查询和聚合操作
- 规则配置: 理解告警和记录规则的设计
- 性能优化: 编写高效的查询语句
- 故障排查: 具备基本的问题诊断能力
进阶学习方向
- 高级PromQL函数和操作符
- 自定义指标设计
- 大规模Prometheus集群管理
- 与其他监控工具的集成
通过持续实践和学习,可以更好地利用Prometheus的强大功能,构建完善的监控告警体系。