Prometheus和Grafana都是非常流行的开源监控工具,可以协同使用来实现对各种应用程序、系统、网络和服务器等的监视和分析。
下面对Prometheus和Grafana进行简要介绍:
Prometheus是一款开源、云原生的系统和服务监控工具,它采用pull模式的监控方式,可以通过HTTP协议从各种Target中抓取metrics数据,并存储到本地的时间序列数据库中。Prometheus提供了强大的查询语言(PromQL)来支持数据查询、聚合和图表绘制等操作。同时,它还提供了Alertmanager组件来支持告警和通知功能,可以通过配置规则实现各种复杂的告警条件和触发方式。
Grafana是一款开源的监控可视化和数据分析软件,它支持将来自多个数据源的时间序列数据转换为丰富的图表和仪表板,以实时监控和分析各种指标和性能指标。Grafana 的用户可以轻松创建和编辑仪表板、将不同数据源的指标数据组合到一起显示、应用多种过滤器和渲染选项来定制化仪表板的显示方式以及定义警报功能等,从而实现根据需要快速了解应用程序的状态和性能指标以及进行数据分析。
通过将Prometheus和Grafana结合使用,您可以有效地监控和管理各种应用程序和系统的状态和性能指标,从而更好地掌握系统的运行状况并快速发现故障。
本人使用mac电脑安装Prometheus和Grafana,下载可自行根据自己的环境进行,思路才是最重要的。
安装Prometheus:
// 安装
brew install prometheus
// 启动
brew services start prometheus
复制代码
默认端口为9090:
重点:
有了Prometheus后,我们要思考一个问题就是,数据从哪里来?
要了解数据是程序push过来的,还是Prometheus去拉取的,很关键。
package com.example.demo.monitor;
/**
* @author caozhixin
* @date 2023/4/8 13:10
*/
import io.prometheus.client.Counter;
import io.prometheus.client.Gauge;
import io.prometheus.client.exporter.HTTPServer;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class BankAccountSystem {
// 存储每个银行账户的当前余额
private static final Map accountBalances = new HashMap<>();
// 创建一个Counter指标来表示已经从每个账户取款的次数
private static final Counter withdrawals = Counter.build()
.name("bank_account_withdrawals_total")
.help("Total number of account withdrawals.")
.labelNames("account_number") // 为了方便查询,使用名为"account_number"的标签分别标识每个账户的指标
.register();
// 创建一个Gauge指标来表示每个账户的当前余额
private static final Gauge accountBalance = Gauge.build()
.name("bank_account_balance")
.help("Current balance for each account.")
.labelNames("account_number") // 同样使用名为"account_number"的标签来标识每个账户的指标
.register();
public static void main(String[] args) throws IOException {
// Start the HTTP server and expose metrics endpoint.
// 启动一个HTTP服务器,并暴露/metrics端点以便Prometheus从中获取指标数据
HTTPServer server = new HTTPServer(8080);
Random random = new Random();
// 初始化10个不同的银行账户,并对每个账户进行一次初始余额的设置
for (int i = 1; i <= 10; i++) {
String accountNumber = "ACCT" + i;
double initialBalance = random.nextDouble() * 100000;
accountBalances.put(accountNumber, initialBalance);
// 使用set方法将每个账户的初始余额设置为Gauge指标的值,同时使用"labelValues"参数传递与之对应的"account_number"标签值
accountBalance.labels(accountNumber).set(initialBalance);
}
// 模拟一些账户活动
while (true) {
try {
Thread.sleep(5000); // 等待5秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
// 对于每个银行账户,随机从中扣除一些资金,并更新相应的指标数据
for (Map.Entry entry : accountBalances.entrySet()) {
String accountNumber = entry.getKey();
double currentBalance = entry.getValue();
double withdrawAmount = random.nextDouble() * 100;
if (withdrawAmount > currentBalance) {
withdrawAmount = currentBalance; // 不能透支,如果取款金额超过了当前余额,那么就只能全部取出
}
currentBalance -= withdrawAmount;
accountBalances.put(accountNumber, currentBalance);
withdrawals.labels(accountNumber).inc(); // 增加该账户的Counter指标值(表示已经从这个账户中取过款)
accountBalance.labels(accountNumber).set(currentBalance); // 更新该账户的Gauge指标值(表示当前余额)
}
}
}
}
复制代码
在此示例中,我们模拟了一个银行账户管理系统,有10个不同的账户,并使用Map
在无限循环中,我们模拟了一些账户活动,随机从每个账户中扣除一些资金,并更新相应的指标数据。这样,我们就可以通过Prometheus监视银行账户活动并生成警报。
我们可以从Java程序启动的8080看到对应的Prometheus格式数据:
下一步就是我们怎样让Prometheus进程把这些数据抓取过去,这一步很简单,就是在prometheus.yml配置的(安装后的文件路径自己找)。
global:
scrape_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
- job_name: 'java_app'
metrics_path: '/my_metrics'
static_configs:
- targets: ['localhost:8080']
复制代码
把这个java程序的Prometheus客户端端口配置上去即可。
这时候我们就可以到Prometheus的面板去看下是否有数据。
到目前为止,我们已经完成了Prometheus把Java产生的业务数据导入啦。
接下来就是处理Grafana获取Prometheus数据。
// 安装
brew install grafana
// 启动
brew services start grafana
复制代码
Grafana默认端口为3000
这个时候,我们的思路就是怎样去获取Prometheus数据。
Grafana在页面上提供了配置数据源的交互。
支持的数据源很多,按需配置。
这里我们直接把url配置上即可,生产环境的话,需要考虑的更多,比如安全性之类的,配置密钥证书。
数据源配置完了,就剩下面板啦。
选择你想处理的指标和统计口径
也可以直接使用PromQL语句:
round(sum by(account_number) (increase(bank_account_balance{job="java_app"}[$__rate_interval])))
复制代码
到目前为止,一个业务数据的监控就完成啦。大家可以照猫画虎走一个流程!!