目录
一、什么是pushgateway?
二、pushgateway的安装
1、根据系统架构选择对应的安装包
2、安装
3、进入安装目录的bin目录进行启动
4、Prometheus配置 pushgateway
5、重启Prometheus
三、java代码推送指标到pushgateway
1、引入依赖
2、配置类
3、推送指标工具类
4、接收指标信息实体类
一、什么是pushgateway?
Pushgateway 是 Prometheus 生态系统中的一种独特数据采集方式,它采用了被动推送的模式来获取监控数据。作为一个独立的插件,Pushgateway 可以灵活地运行在任何节点上,而不必局限于被监控的客户端。用户可以通过自定义编写的脚本,将需要监控的数据发送至 Pushgateway。随后,Pushgateway 会将这些数据推送至 Prometheus Server,从而实现数据的集中管理和监控。
也就是说,如果我们需要监控的对象的指标无法通过Prometheus的exporter直接获取,我们可以采用其他方法自行采集这些指标。随后,将这些采集到的指标推送至Pushgateway,Prometheus再从Pushgateway中拉取这些指标数据,以此实现通过Prometheus进行统一监控的目的。
二、pushgateway的安装
1、根据系统架构选择对应的安装包
下载安装包地址:https://github.com/prometheus/pushgateway/releases
这里我们使用的服务器的系统架构是amd的,所以我们就下载对应amd的安装包即可。
2、安装
解压即安装。
tar -zxvf pushgateway-1.10.0.linux-amd64.tar.gz
3、进入安装目录的bin目录进行启动
nohup ./pushgateway &
访问地址:http://127.0.0.1:9091/metrics ,出现如下页面便是访问成功!
4、Prometheus配置 pushgateway
在Prometheus的配置文件prometheus.yml文件中增加如下配置:
- job_name: pushgateway
honor_labels: true ##加上此配置,exporter节点上传数据中的一些标签将不会被pushgateway节点的相同标签覆盖
static_configs:
- targets: ['127.0.0.1:9091']
labels:
instance: pushgateway
service: pushgatewayservice
5、重启Prometheus
使用如下命令,查出Prometheus进程的pid
lsof -i:19090
使用如下命令,直接杀死Prometheus进程
kill -9 [pid]
使用如下命令,重新启动Prometheus
nohup ./prometheus --config.file=prometheus.yml --web.listen-address=0.0.0.0:19090 &
此时,登录Prometheus的管理界面,便可以看得,pushgateway便已经接入Prometheus的监控中。
三、java代码推送指标到pushgateway
1、引入依赖
<dependency> <groupId>io.prometheus</groupId> <artifactId>simpleclient</artifactId> <version>0.15.0</version> </dependency> <dependency> <groupId>io.prometheus</groupId> <artifactId>simpleclient_pushgateway</artifactId> <version>0.15.0</version> </dependency>
2、配置类
@Configuration
public class PushGateWayConfig {
@Value("${prometheus.pushGateway.ip}")
private String pushGatewayIp;
@Value("${prometheus.pushGateway.port}")
private String pushGatewayPort;
@Bean
public PushGateway pushGateway() {
return new PushGateway(pushGatewayIp + ":" + pushGatewayPort);
}
}
3、推送指标工具类
@Component
public class PushGatewayUtils {
@Autowired
private PushGateway pushGateway;
@Value("${prometheus.pushGateway.port}")
private String pushGatewayPort;
/**
* 子指标,标签名,统一就是subCode
*/
private final static String LABEL_NAME = "subCode";
/**
* @Description: 往pushgateway批量发送指标
* @Date: 2024/10/17 9:23
* @Param paramList: 指标集合
* @Param ip: 监控对象的ip
* @return: void
**/
public void sendMetrics(List<PushMetricToPrometheusParam> paramList, String ip) throws IOException {
Map<String, String> insMap = new HashMap<>();
insMap.put("instance", ip + ":" + pushGatewayPort);
CollectorRegistry registry = new CollectorRegistry();
try {
for (PushMetricToPrometheusParam param : paramList) {
//有子指标
if (param.getIsHaveChildMetric()) {
Gauge duration = Gauge.build()
.name(param.getParamName()).labelNames(LABEL_NAME).help(param.getHelpInfo())
.register(registry);
//设置各个子指标的值
for (int i = 0; i < param.getLabelValues().length; i++) {
duration.labels(param.getLabelValues()[i]).set(param.getMetricValues()[i]);
}
} else {//无子指标
Gauge duration = Gauge.build()
.name(param.getParamName()).help(param.getHelpInfo())
.register(registry);
duration.set(param.getMetricValues()[0]);
}
}
} finally {
pushGateway.push(registry, "custom_metrics_job", insMap);
}
}
}
4、接收指标信息实体类
@Data
@Accessors(chain = true)
public class PushMetricToPrometheusParam {
private String paramName;
private String helpInfo;
/**
* 是否有子指标,默认有
*/
private Boolean isHaveChildMetric = true;
/**
* 子指标,标签名,默认值就是subCode,子指标名称最好也是设置成这个
*/
/* private String[] labelNames = {"subCode"};*/
/**
* 子指标标签名对应的值
*/
private String[] labelValues;
/**
* 指标值,如果是多子指标,子指标标签名、标签值、该子指标的值,就是通过在数组中的位置一一对应
*/
private Double[] metricValues;
}
想要往pushgateway推送指标直接使用步骤3的工具类的方法sendMetrics进行推送即可。推送后访问该地址http://127.0.0.1:9091/metrics ,便可以看到你推送的指标。