分布式度量系统prometheus初体验
背景
度量系统我们则会使用prometheus
。
prometheus默认采用pull的方式,定时到指定的接口去拉取数据。
也可以通过pushgateway服务,push数据到pushgateway,再由prometheus从pushgateway拉取数据。
初体验
[5]
安装prometheus
参考[1]
docker pull prom/node-exporter
docker pull prom/prometheus
docker pull grafana/grafana
docker pull prom/pushgateway
运行prometheus
参考[1]
docker run -d --name prometheus –-net=host -p 9090:9090 prom/prometheus
确认安装成功,输入下面的网址,打开web页面。
http://localhost:9090/graph
复制容器内部的配置文件到宿主机
docker cp -a prometheus:/etc/prometheus/ prometheus
重新启动
docker run -d --name prometheus -p 9090:9090 -v prometheus:/etc/prometheus prom/prometheus
安装node-exporter
docker run -d --name node-exporter -p 9100:9100 prom/node-exporter
确认安装成功,输入下面的网址,打开web页面。
http://localhost:9100/metrics
结果如下
# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 0
go_gc_duration_seconds{quantile="0.25"} 0
go_gc_duration_seconds{quantile="0.5"} 0
go_gc_duration_seconds{quantile="0.75"} 0
安装grafana
启动
docker run -d --name=grafana -p 3000:3000 grafana/grafana
确认安装成功,输入下面的网址,打开web页面。
http://localhost:3000/
默认账号:admin / admin
添加数据源,选择Prometheus[6],地址选择实际的IP地址,如192.168.31.100。
安装cadvisor(可选)
cadvisor可以用来监控容器内的信息[1]。
docker pull google/cadvisor
安装pushgateway
docker run -d --name=pushgateway -p 9091:9091 prom/pushgateway
确认安装成功,访问:
http://127.0.0.1:9091/api/v1/status
得到
{
"status": "success",
"data": {
"build_information": {
"branch": "HEAD",
"buildDate": "20211011-17:51:55",
"buildUser": "root@f68dbd4cbcde",
"goVersion": "go1.16.9",
"revision": "99981d7be923ab18d45873e9eaa3d2c77477b1ef",
"version": "1.4.2"
},
"flags": {
"log.format": "logfmt",
"log.level": "info",
"persistence.file": "",
"persistence.interval": "5m0s",
"push.disable-consistency-check": "false",
"web.config.file": "",
"web.enable-admin-api": "false",
"web.enable-lifecycle": "false",
"web.external-url": "",
"web.listen-address": ":9091",
"web.route-prefix": "",
"web.telemetry-path": "/metrics"
},
"start_time": "2022-02-02T12:03:34.0620457Z"
}
}
修改prometheus.yaml,生效:
global:
scrape_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
# 加入下面这几行
- job_name: pushgateway
static_configs:
- targets: ['192.168.31.100:9091']
labels:
instance: pushgateway
重启 prometheus容器生效
docker restart prometheus
访问:http://localhost:9090/targets,确认其中有pushgateway
进一步阅读见[3]。
使用java sdk向pushgateway写入数据
参考[4],依赖
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient</artifactId>
<version>0.14.1</version>
</dependency>
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_pushgateway</artifactId>
<version>0.14.1</version>
</dependency>
示例代码
import io.prometheus.client.Counter;
import io.prometheus.client.Gauge;
import io.prometheus.client.exporter.PushGateway;
import java.io.IOException;
import java.util.Random;
public class MainServer {
public static void main(String[] args) throws IOException, InterruptedException {
PushGateway gateway = new PushGateway("localhost:9091");
Random rnd = new Random();
Counter counter = Counter.build()
.name("page_visit") //模拟页面访问量
.labelNames("page_id") //页面id
.help("counter_page_visit") // 备注名称
.register();
Gauge gauge = Gauge.build()
.name("page_fans") //这里模拟粉丝数(注:这里我们没设置label)
.help("gauge_page_fans")
.register();
while (true) {
//随机生成1个blogId
int blogId = rnd.nextInt(100000);
//该blogId的访问量+1
counter.labels(blogId + "").inc();
//模拟粉丝数的变化
if (blogId % 2 == 0) {
gauge.inc();
} else {
gauge.dec();
}
//利用网关采集数据
gateway.push(counter, "job-counter-test");
gateway.push(gauge, "job-gauge-test");
//辅助输出日志
System.out.println("blogId:" + blogId);
Thread.sleep(5000);
}
}
}
打开 http://localhost:9091/
,可以看到job是否执行成功[4]。
在 grafana中可以增加配置[4]。
使用OpenTelemetry进行采集
根据[7]上的信息,Metrics的API和Protocol已经stable,SDK处于feature-freeze状态,尚未stable。
所以先观望一段时间,等对应的SDK出来。如果急切了解API的话,可以继续参考[2],依赖
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
<version>1.10.1</version>
</dependency>
其中 opentelemetry-api 中包含了baggage,metrics和trace的接口,没有实现。在GlobalOpenTelemetry
中定义了TracerProvider
,MeterProvider
等接口。
由于OTEL采用了接口和实例分离的方式,上面的api中只有对应的接口,没有实现。如果不加载对应的实现包,则都会调用noop方法。
主动发送有block风险。
被动采集更好一些。
参考
- docker安装prometheus
- OpenTelemetry Metrics Exporter - Prometheus
- prometheus学习笔记(1)-mac单机版环境搭建
- prometheus学习笔记(2)-利用java client写入数据
- OpenTelemetryCollector-数据集散中心
- 基于docker 搭建Prometheus+Grafana
- OpenTelemetry Status