Prometheus作为一款开源的监控和告警工具,因其强大的数据采集、存储和查询能力,已经成为现代微服务架构中不可或缺的一部分。本文将详细介绍如何使用Prometheus监控API服务的方法与实践,涵盖从基础概念到实际操作的各个环节。
Prometheus的架构主要包括以下几个组件:

Prometheus监控的数据以时间序列的形式存储,每个时间序列由以下几部分组成:
首先,需要在服务器上安装Prometheus。可以从Prometheus的官方网站下载最新版本的二进制文件:
wget https://github.com/prometheus/prometheus/releases/download/v2.35.0/prometheus-2.35.0.linux-amd64.tar.gz
tar -xvf prometheus-2.35.0.linux-amd64.tar.gz
cd prometheus-2.35.0.linux-amd64
启动Prometheus:
./prometheus --config.file=prometheus.yml
Prometheus的配置文件prometheus.yml通常包含以下几个部分:
Prometheus支持以下几种指标类型:
以一个简单的RESTful API服务为例,我们可以定义以下监控指标:
api_requests_total:API请求总数(Counter)。api_request_duration_seconds:API请求耗时(Histogram)。api_current_inprogress_requests:当前正在处理的请求数(Gauge)。如果API服务没有现成的Exporter,可以自定义一个Exporter。以下是一个简单的Python示例,使用prometheus_client库暴露监控指标:
from prometheus_client import start_http_server, Summary, Counter, Gauge
import random
import time
# 定义监控指标
REQUESTS = Counter('api_requests_total', 'Total number of API requests')
DURATION = Summary('api_request_duration_seconds', 'Duration of API requests')
INPROGRESS = Gauge('api_current_inprogress_requests', 'Number of in-progress API requests')
def process_request():
INPROGRESS.inc() # 请求开始,增加计数
start_time = time.time()
# 模拟请求处理时间
time.sleep(random.random())
DURATION.observe(time.time() - start_time) # 记录请求耗时
INPROGRESS.dec() # 请求结束,减少计数
REQUESTS.inc() # 增加请求总数
if __name__ == '__main__':
start_http_server(8000) # 启动Exporter服务
while True:
process_request()
对于常见的API服务框架,如Spring Boot、Django等,已经有现成的Exporter可以使用。以Spring Boot为例,可以使用micrometer库集成Prometheus:
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Metrics;
import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics;
import io.micrometer.core.instrument.binder.system.ProcessorMetrics;
import io.micrometer.prometheus.PrometheusConfig;
import io.micrometer.prometheus.PrometheusMeterRegistry;
public class Application {
public static void main(String[] args) {
PrometheusMeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
Metrics.addRegistry(registry);
new JvmMemoryMetrics().bindTo(registry);
new ProcessorMetrics().bindTo(registry);
Counter requests = Counter.builder("api_requests_total")
.description("Total number of API requests")
.register(registry);
// 模拟API请求
while (true) {
requests.increment();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
在prometheus.yml中配置抓取目标:
scrape_configs:
- job_name: 'api_service'
static_configs:
- targets: ['<api_service_exporter_host>:<port>']
重启Prometheus后,可以通过Prometheus的Web界面查看抓取到的数据。
api_requests_total
api_current_inprogress_requests
rate(api_request_duration_seconds_sum[5m]) / rate(api_request_duration_seconds_count[5m])
sum(api_requests_total) by (path)
topk(1, sum(rate(api_requests_total[5m])) by (path))
在Prometheus中配置告警规则,需要在prometheus.yml中指定告警规则文件:
rule_files:
- 'alerting_rules.yml'
在alerting_rules.yml中定义告警规则:
groups:
- name: api_service_alerts
rules:
- alert: HighRequestRate
expr: rate(api_requests_total[1m]) > 100
for: 5m
labels:
severity: warning
annotations:
summary: "High request rate detected"
description: "API service is experiencing high request rate (> 100 requests/min) for more than 5 minutes."
从Prometheus官网下载并安装Alertmanager:
wget https://github.com/prometheus/alertmanager/releases/download/v0.23.0/alertmanager-0.23.0.linux-amd64.tar.gz
tar -xvf alertmanager-0.23.0.linux-amd64.tar.gz
cd alertmanager-0.23.0.linux-amd64
./alertmanager --config.file=alertmanager.yml
在alertmanager.yml中配置告警接收器和路由:
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'severity']
receiver: 'default-receiver'
receivers:
- name: 'default-receiver'
email_configs:
- to: 'alert@example.com'
from: 'prometheus@example.com'
smarthost: 'smtp.example.com:587'
auth_username: 'user@example.com'
auth_password: 'password'
在prometheus.yml中配置Alertmanager地址:
alerting:
alertmanagers:
- static_configs:
- targets: ['<alertmanager_host>:9093']
Grafana是一个开源的监控和数据可视化平台,可以与Prometheus无缝集成。
wget https://dl.grafana.com/oss/release/grafana-8.2.6.linux-amd64.tar.gz
tar -xvf grafana-8.2.6.linux-amd64.tar.gz
cd grafana-8.2.6
./bin/grafana-server web
登录Grafana后,进入“Configuration” -> “Data Sources”,添加Prometheus数据源,填写Prometheus的URL。
在Grafana中创建新的Dashboard,添加各种图表,使用PromQL查询数据源。
以下是一些常用的图表示例:
api_requests_total
histogram_quantile(0.95, sum(rate(api_request_duration_seconds_bucket[5m])) by (le))
api_current_inprogress_requests
通过本文的介绍,我们详细了解了如何使用Prometheus监控API服务的方法与实践。从Prometheus的基础概念、监控指标的选取与定义、Exporter的使用、PromQL查询、告警配置,到Grafana的可视化,每一步都进行了详细的讲解。希望本文能为读者在实际项目中应用Prometheus提供有价值的参考和指导。监控是一个持续优化的过程,需要根据实际业务需求不断调整和改进,以实现更高效、更可靠的系统监控。
]]>
Lei
November 6, 2024
技术探讨