背景
需要实时统计订单支付成功率并通过折线图展示,达到阈值时进行报警.
技术选型后决定用 Prometheus + Grafana
一.安装 Prometheus
1.下载 Prometheus 能科学速度更快
Prometheus下载地址https://prometheus.io/download/
2.安装及部署
解压
tar xf prometheus-2.53.3.linux-amd64.tar.gz -C /opt/vansys/prometheus/
重命名
mv prometheus-2.53.3.linux-amd64 /opt/vansys/prometheus/prometheus2.53.3
查看配置文件 prometheus.yml 含义我用中文注释上了
# 全局配置
global:
scrape_interval: 15s # 设置 Prometheus 从目标抓取数据的频率,这里为每 15 秒,默认是每分钟一次。
evaluation_interval: 15s # 设置 Prometheus 评估规则的频率,这里为每 15 秒评估一次规则,默认是每分钟一次。
# scrape_timeout: #设置 Prometheus 从目标抓取数据的超时时间,默认是 10 秒。在这个配置文件中没有显式设置,所以使用全局默认值。
# 告警管理器配置
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093 # alertmanagers: 配置告警管理器的地址。这里没有启用,
# 一次性加载规则文件,并根据全局的 'evaluation_interval' 周期性地评估这些规则。
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# 包含一个确切的抓取配置,其中包含一个要抓取的端点:
# 这里抓取的是 Prometheus 本身。
scrape_configs:
# 作业名称将作为标签 `job=<job_name>` 添加到从该配置抓取的任何时间序列中。
- job_name: "prometheus"
# metrics_path 默认为 '/metrics'
# scheme 默认为 'http'
#配置静态目标。这里配置了一个目标 localhost:9090,即 Prometheus 服务器本身的指标端点。
static_configs:
- targets: ["localhost:9090"]
3.启动
为了方便启动编写 prometheus 启动和停止脚本
vi start_prometheus.sh
在 vi 中按 i 进入插入模式,然后粘贴以下内容
#!/bin/bash
# 定义 Prometheus 的安装目录和配置文件路径
PROMETHEUS_HOME="/opt/vansys/prometheus/prometheus2.53.3"
CONFIG_FILE="$PROMETHEUS_HOME/prometheus.yml"
# 检查 Prometheus 是否已经在运行
if pgrep -f "prometheus --config.file=$CONFIG_FILE" > /dev/null; then
echo "Prometheus is already running."
exit 1
fi
# 启动 Prometheus
nohup $PROMETHEUS_HOME/prometheus --config.file=$CONFIG_FILE --web.listen-address=:9090 --web.external-url=http://localhost:9090 > prometheus.log 2>&1 &
# 检查启动是否成功
sleep 5
if pgrep -f "prometheus --config.file=$CONFIG_FILE" > /dev/null; then
echo "Prometheus started successfully."
else
echo "Failed to start Prometheus."
exit 1
fi
vi stop_prometheus.sh
在 vi 中按 i 进入插入模式,然后粘贴以下内容
#!/bin/bash
# 定义 Prometheus 的配置文件路径
CONFIG_FILE="/opt/vansys/prometheus/prometheus2.53.3/prometheus.yml"
# 检查 Prometheus 是否在运行
if ! pgrep -f "prometheus --config.file=$CONFIG_FILE" > /dev/null; then
echo "Prometheus is not running."
exit 1
fi
# 关闭 Prometheus
pkill -f "prometheus --config.file=$CONFIG_FILE"
# 检查关闭是否成功
sleep 5
if ! pgrep -f "prometheus --config.file=$CONFIG_FILE" > /dev/null; then
echo "Prometheus stopped successfully."
else
echo "Failed to stop Prometheus."
exit 1
fi
4.验证启动是否成功
浏览器使用 ip+端口(9090)访问出现页面表示成功
二.安装 grafana
Ubuntu为例使用apt-get安装
sudo apt-get install -y adduser libfontconfig1 musl
wget https://dl.grafana.com/oss/release/grafana_11.2.3+security~01_amd64.deb
sudo dpkg -i grafana_11.2.3+security~01_amd64.deb
启动并设置开机启动,
安装后执行以下命令
#重新加载 systemd 配置,以便系统识别新安装的服务:
sudo /bin/systemctl daemon-reload
#启用 Grafana 服务,使其在系统启动时自动启动:
sudo /bin/systemctl enable grafana-server
#启动 Grafana 服务:
sudo /bin/systemctl start grafana-server
#确保 Grafana 服务正在运行:
sudo /bin/systemctl status grafana-server
登录验证是否成功启动
ip+端口(3000) 确认启动
默认账号:admin
默认密码:admin
登录后需要修改密码
添加Prometheus 数据源
添加Prometheus 数据源 GET 拉取数据 POST推送数据
保存信息
测试
新建仪表盘测试数据是否正常获取
选择 Prometheus 数据源
配置数据 并 点击 蓝色按钮 Run queries
Metric 不填选择表示 任务对应的接口下的所有数据都展示 (如不清楚继续完后看Springboot集成)
展示数据
三.Springboot集成 Prometheus
添加maven依赖
<dependencies>
<!-- 其他依赖 -->
<!-- Spring Boot Actuator 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Micrometer Prometheus 依赖 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
</dependencies>
修改Springboot配置文件
management:
endpoints:
web:
exposure:
include: prometheus # 请求地址是 /actuator/prometheus
endpoint:
prometheus:
enabled: true
修改Prometheus配置文件并重启
在scrape_configs:下新增一个 job_name
scrape_configs:
# 作业名称将作为标签 `job=<job_name>` 添加到从该配置抓取的任何时间序列中。
- job_name: "text-login"
metrics_path: '/<上下文路径>/actuator/prometheus'
# scheme 默认为 'http'
#配置静态目标。这里配置了一个目标 localhost:9090,即 Prometheus 服务器本身的指标端点。
static_configs:
- targets: ["localhost:8081"]
PS:部分项目因为需要登录才能访问,需要先开放接口白名单
在类构造时
Login_success_total 对应的是上面提到的 Metric中的名字选择
private final Counter LoginSuccessCounter;
private final Counter LoginTotalCounter;
@Autowired
public LoginController(MeterRegistry meterRegistry) {
LoginSuccessCounter = meterRegistry.counter("Login_success_total");
LoginTotalCounter = meterRegistry.counter("Login_total");
}
代码中埋点
@ApiOperation("登录接口")
@RequestMapping(value = "/login", method = RequestMethod.POST)
public Result<JSONObject> login(@RequestBody SysLoginModel sysLoginModel){
paymentTotalCounter.increment();
//模拟成功或失败
Random random = new Random();
int i = random.nextInt(0,2);
if (i==0){
paymentSuccessCounter.increment();
}
}
成功率计算
发送请求测试埋点效果
将获取时间窗口内的请求成功率