简介:本文系统阐述如何使用 Prometheus 采集指标数据,涵盖核心概念、配置方法、监控实践及故障排查,助力开发者构建高效监控体系。
在云原生与微服务架构盛行的今天,监控系统已成为保障系统稳定性的关键基础设施。Prometheus 作为 CNCF 毕业项目,凭借其多维度数据模型、强大的查询语言(PromQL)和灵活的采集机制,已成为开发者监控容器化应用的首选方案。其独特的拉取式(Pull)模型通过 HTTP 端点定期抓取指标数据,相比传统推送式监控更具扩展性和可靠性。
Prometheus 采用时序数据库存储指标数据,每条数据由以下部分组成:
<metric_name>{<label_name>=<label_value>, ...} <value> <timestamp>
示例:
http_requests_total{method="POST", handler="/api"} 1027 1625097600000
scrape_configs 定义抓取任务/metrics 端点(通常使用客户端库)
# prometheus.yml 核心配置global:scrape_interval: 15sevaluation_interval: 15sscrape_configs:- job_name: 'node-exporter'static_configs:- targets: ['node-exporter:9100']- job_name: 'kubernetes-pods'kubernetes_sd_configs:- role: podrelabel_configs:- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]action: keepregex: true
| 配置项 | 作用说明 |
|---|---|
scrape_interval |
全局抓取间隔,建议生产环境设为30s-60s |
honor_labels |
是否保留目标标签(解决标签冲突时使用) |
metric_relabel_configs |
抓取后对指标名/标签进行重写 |
sample_limit |
单个目标的最大样本数限制(防止内存溢出) |
Go 应用示例:
import ("github.com/prometheus/client_golang/prometheus""github.com/prometheus/client_golang/prometheus/promhttp")func initMetrics() {requestsTotal := prometheus.NewCounterVec(prometheus.CounterOpts{Name: "api_requests_total",Help: "Total API requests",},[]string{"method", "path"},)prometheus.MustRegister(requestsTotal)http.Handle("/metrics", promhttp.Handler())go http.ListenAndServe(":8080", nil)}
| Exporter 类型 | 适用场景 | 推荐方案 |
|---|---|---|
| Node Exporter | 主机级监控(CPU/内存/磁盘) | node_exporter v1.3+ |
| Blackbox Exporter | 端到端探测(HTTP/TCP/ICMP) | blackbox_exporter v0.20+ |
| MySQLd Exporter | MySQL 数据库监控 | mysqld_exporter v0.14+ |
| JMX Exporter | Java 应用监控(通过 JMX) | jmx_exporter v0.16+ |
hashmod 进行目标分片
relabel_configs:- source_labels: [__address__]modulus: 4target_label: __tmp_hashaction: hashmod- source_labels: [__tmp_hash]regex: "^1$"action: keep
metric_relabel_configs 丢弃不需要的指标
metric_relabel_configs:- regex: "go_.*"action: "drop"
federation 实现层级数据汇聚
- job_name: 'federate'scrape_interval: 60shonor_labels: truemetrics_path: '/federate'params:'match[]':- '{job=~".*"}'static_configs:- targets: ['prometheus-primary:9090']
curl -v http://target:9100/metrics
prometheus --config.file=prometheus.yml --log.level=debug
503 Service Unavailable:目标过载429 Too Many Requests:Prometheus 抓取过于频繁500 Internal Error:Exporter 内部错误--storage.tsdb.retention.time=30d 控制数据保留期--web.enable-admin-api 禁用管理接口(生产环境建议关闭)--storage.tsdb.wal-compression 启用 WAL 压缩Python 示例:
from prometheus_client import start_http_server, Counter, GaugeREQUEST_COUNT = Counter('app_requests_total', 'Total requests')LATENCY = Gauge('app_latency_seconds', 'Request latency')def handle_request():REQUEST_COUNT.inc()start = time.time()# 业务逻辑LATENCY.set(time.time() - start)if __name__ == '__main__':start_http_server(8000)while True:handle_request()
Kubernetes 动态配置示例:
scrape_configs:- job_name: 'kubernetes-service-endpoints'kubernetes_sd_configs:- role: endpointsrelabel_configs:- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]action: keepregex: true- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name]target_label: jobseparator: '-'
Prometheus 的指标采集体系通过其灵活的配置模型和丰富的客户端生态,为现代分布式系统提供了强大的监控能力。在实际应用中,建议遵循以下原则:
env、service 等标准标签)recording rules 预计算常用查询随着 eBPF 技术的成熟,Prometheus 生态正在向更细粒度的监控演进,如通过 Prometheus Remote Write 接收 eBPF 采集的指标数据。开发者应持续关注 CNCF 生态项目的发展,构建更具前瞻性的监控体系。