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接口
在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐