Prometheus介绍
Prometheus 是一套开源的监控、报警、时间序列数据库的组合。Prometheus基本原理是通过HTTP协议周期性抓取被监控组件的状态,这样做的好处是任意组件只要提供HTTP接口就可以接入监控系统,不需要任何SDK或者其他的集成过程。
1.需要用到的组件
组件名 | 作用 |
---|---|
Prometheus服务器 | 用于周期性抓取被监控组件的状态 |
node_exporter | 用于监控服务器CPU、内存、磁盘、I/O等信息,需要部署在被监控的宿主机上 |
2.部署
采用docker部署node_exporter
官方不推荐将node_exporter部署为Docker容器,因为它需要访问主机系统。对于需要Docker部署的情况,请指定path.rootfs参数。 此参数必须与主机根目录的绑定装载中的路径匹配。node_exporter将使用 路径.rootfs作为访问主机文件系统的前缀。
docker run -d --name node-exporter -p 9100:9100 --net="host" --pid="host" -v "/:/host:ro,rslave" quay.io/prometheus/node-exporter:latest --path.rootfs=/host
node_exporter启动成功后通过浏览器访问 http://ip:9100/metrics 如下图
采用docker部署Prometheus
在F:/soft/prometheus文件夹下创建prometheus.yml文件,内容如下:
global:
scrape_interval: 5s
evaluation_interval: 5s
# 告警规则
rule_files:
# 这里匹配指定目录下所有的.rules文件
- /prometheus/rules/*.rules
scrape_configs:
- job_name: prometheus
static_configs:
# prometheus自带了对自身的exporter监控程序,所以不需额外安装exporter就可配置采集项
- targets: ['127.0.0.1:9090']
labels:
instance: prometheus
- job_name: 'linux'
static_configs:
- targets: ['linux的ip:9100']
执行docker命令
docker run -d -p 9090:9090 --name prometheus -v F:\soft/prometheus/config:/etc/prometheus prom/prometheus --config.file=/etc/prometheus/prometheus.yml --web.enable-lifecycle
prometheus 启动成功后通过浏览器访问 http://localhost:9090/targets 如下图
从浏览器中找到peomrtheus它获取服务指标的请求地址
3.java调用
根据结果来封装相应实体
@Data
public class PromResponceInfo {
/**
* 状态
* 成功-- success
*/
private String status;
/**
* prometheus指标属性和值
*/
private PromDataInfo data;
}
@Data
public class PromDataInfo {
/**
* prometheus结果类型
*/
private String resultType;
/**
* prometheus指标属性和值
*/
private List<PromResultInfo> result;
}
@Data
public class PromResultInfo {
/**
* prometheus指标属性
*/
private PromMetricInfo metric;
/**
* prometheus指标值
*/
private List<Object> value;
}
@Data
public class PromMetricInfo {
/**
* prometheus指标名称
*/
private String __name__;
/**
* 名称
*/
private String name;
/**
* prometheus实例名称
*/
private String instance;
/**
* prometheus任务名称
*/
private String job;
private String id;
private String state;
private String image;
}
调用代码
@RestController
@RequestMapping(value = "pro")
public class ProController {
/**系统CPU使用率*/
public static final String SYSTEM_CPU_USAGE= "(1 - sum(rate(node_cpu_seconds_total{mode=\"idle\"}[1m])) by (instance) / sum(rate(node_cpu_seconds_total[1m])) by (instance) ) * 100";
/**系统内存使用率*/
public static final String SYSTEM_MEMORY_USAGE= "(1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes)))* 100";
/**系统磁盘使用率*/
public static final String SYSTEM_FILESYSTEM_USAGE="(1 - node_filesystem_avail_bytes{fstype=~\"ext4|xfs\"} / node_filesystem_size_bytes{fstype=~\"ext4|xfs\"}) * 100";
/**系统IOutil使用率*/
public static final String SYSTEM_IO_USAGE= "(1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes)))* 100";
@GetMapping(value ="/query")
public ArrayList<PromResponceInfo> getUserByNameAndOccupation(){
String url = "http://localhost:9090/api/v1/query";
Long currentTimeSeconds = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).getEpochSecond();
ArrayList<PromResponceInfo> list = new ArrayList<>();
PromResponceInfo cpu = JSON.parseObject(HttpRequest.get(url + "?time=" + currentTimeSeconds + "&query=" + SYSTEM_CPU_USAGE).execute().body(), PromResponceInfo.class);
list.add(cpu);
PromResponceInfo memory = JSON.parseObject(HttpRequest.get(url + "?time=" + currentTimeSeconds + "&query=" + SYSTEM_MEMORY_USAGE).execute().body(), PromResponceInfo.class);
list.add(memory);
PromResponceInfo disk = JSON.parseObject(HttpRequest.get(url + "?time=" + currentTimeSeconds + "&query=" + SYSTEM_FILESYSTEM_USAGE).execute().body(), PromResponceInfo.class);
list.add(disk);
PromResponceInfo IOutil = JSON.parseObject(HttpRequest.get(url + "?time=" + currentTimeSeconds + "&query=" + SYSTEM_IO_USAGE).execute().body(), PromResponceInfo.class);
list.add(IOutil);
return list;
}
}
通过浏览器调用Java接口