原文链接:

https://www.cnblogs.com/chenqionghe/p/10494868.html
https://www.cnblogs.com/hujinzhong/p/14998683.html
https://blog.csdn.net/carson0408/article/details/99663649
https://www.gl.sh.cn/2020/12/25/grafana_ji_ben_shi_yong.html

一,Prometheus介绍:

1,什么是Prometheus

Prometheus是由SoundCloud开发的开源监控报警系统,Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。

2,Prometheus的特点

  • 多维度数据模型。
  • 灵活的查询语言。
  • 不依赖分布式存储,单个服务器节点是自主的。
  • 通过基于HTTP的拉取方式采集时序数据。
  • 可以通过网关进行时序列数据推送。
  • 通过服务发现或者静态配置来发现目标服务对象。
  • 支持多种多样的图表和界面展示,比如Grafana等。

3,基本原理:

Prometheus的基本原理是通过HTTP协议,周期性的抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做虚拟化环境监控系统,比如VM、Docker、Kubernetes等。

输出被监控组件信息的HTTP接口被叫做exporter 。

4,Prometheus组件介绍

1)Prometheus Server: 用于收集和存储时间序列数据。

2)Client Library: 客户端库,检测应用程序代码,当Prometheus抓取实例的HTTP端点时,客户端库会将所有跟踪的metrics指标的当前状态发送到prometheus server端。

3)Exporters: prometheus支持多种exporter,通过exporter可以采集metrics数据,然后发送到prometheus server端,所有向promtheus server提供监控数据的程序都可以被称为exporter

4)Alertmanager: 从 Prometheus server 端接收到 alerts 后,会进行去重,分组,并路由到相应的接收方,发出报警,常见的接收方式有:电子邮件,微信,钉钉, slack等。

5)Grafana:监控仪表盘,可视化监控数据

6)pushgateway: 各个目标主机可上报数据到pushgateway,然后prometheus server统一从pushgateway拉取数据。

Prometheus server的组成部分:

Prometheus server由三个部分组成,Retrieval,Storage,PromQL

  • Retrieval:负责在活跃的目标组件上抓取监控指标数据;
  • Storage:主要是把采集到的数据存储到磁盘中;
  • PromQL:是Prometheus提供的查询语言模块;

5,Prometheus工作流程

1)Prometheus server可定期从活跃的(up)目标主机上(target)拉取监控指标数据,目标主机的监控数据可通过配置静态job或者服务发现的方式,被prometheus server采集到,这种方式默认的pull方式拉取指标;

也可通过pushgateway把采集的数据上报到prometheus server中;还可通过一些组件自带的exporter采集相应组件的数据;

2)Prometheus server把采集到的监控指标数据保存到本地磁盘或者数据库;

3)Prometheus采集的监控指标数据按时间序列存储,通过配置报警规则,把触发的报警发送到alertmanager;

4)Alertmanager通过配置报警接收方,发送报警到邮件,微信或者钉钉等;

5)Prometheus 自带的web ui界面提供PromQL查询语言,可查询监控数据;

6)Grafana可接入prometheus数据源,把监控数据以图形化形式展示;

二,Prometheus的四种数据类型

1、Counter

Counter是计数器类型:
Counter 用于累计值,例如记录请求次数、任务完成数、错误发生次数。
一直增加,不会减少。
重启进程后,会被重置。

2、Gauge

Gauge是测量器类型:
Gauge是常规数值,例如温度变化、内存使用变化。
可变大,可变小。
重启进程后,会被重置

3、Histogram

histogram是柱状图,在Prometheus系统的查询语言中,有三种作用:
1)在一段时间范围内对数据进行采样,并将其计入可配置的存储桶(bucket)中。后续可通过指定区间筛选样本,也可以统计样本总数,最后一般将数据展示为直方图。
2)对每个采样点值累计和(sum)
3)对采样点的次数累计和

4、Summary

与 Histogram 类型类似,用于表示一段时间内的数据采样结果,但它直接存储了分位数(通过客户端计算,然后展示出来),而不是通过区间来计算。
它的主要作用是:对于每个采样点进行统计,并形成分位图。

三,Linux部署Prometheus

1,下载:

下载地址:https://prometheus.io/download/
例如:
image.png

2,部署:

1、将安装包上传到服务器/data目录;
2、解压:
tar -zxvf prometheus-2.28.1.linux-amd64.tar.gz

3、修改目录:

mv prometheus-2.28.1.linux-amd64 prometheus

4、启动:

安装目录下启动:./prometheus --config.file=prometheus.yml

5、访问prometheus

地址:http://ip:port/graph,其中默认端口9090
image.png

6、设置prometheus系统服务,并配置开机启动

创建prometheus.service文件

输入如下命令:
touch /usr/lib/systemd/system/prometheus.service
vi /usr/lib/systemd/system/prometheus.service

将以下配置内容写入prometheus.service:

  1. [Unit]
  2. Description=Prometheus
  3. After=network.target
  4. [Service]
  5. Type=simple
  6. ExecStart=/data/prometheus/prometheus --config.file=/data/prometheus/prometheus.yml --web.enable-lifecycle --storage.tsdb.path=/data/prometheus/data --storage.tsdb.retention=60d
  7. Restart=on-failure
  8. [Install]
  9. WantedBy=multi-user.target

参数说明:

–config.file – 指明prometheus的配置文件路径
–web.enable-lifecycle – 指明prometheus配置更改后可以进行热加载
–storage.tsdb.path – 指明监控数据存储路径
–storage.tsdb.retention —指明数据保留时间

其他设置:

systemctl daemon-reload —重新加载服务配置文件
systemctl enable prometheus.service —设置开机自启

其他命令:

systemctl start prometheus.service — 启动prometheus
systemctl status prometheus.service —查看prometheus状态
./promtool check config prometheus.yml——检查prometheus.yml的格式是否正确

四,SpringBoot项目配置:

1,引入依赖:

    <!-- prometheus 监控相关jar包 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
        </dependency>
        <!--    支持spring boot暴露http endpoint -->
        <!--  支持prometheus endpoint,这个暴露的是OpenMetrics的格式,prometheus从这里采集数据 -->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
        </dependency>
        <dependency>
            <groupId>io.github.mweirauch</groupId>
            <artifactId>micrometer-jvm-extras</artifactId>
            <version>0.1.2</version>
        </dependency>

2,配置SpringBoot中的application.yml:

management:
  server:
    port: 30000
  endpoints:
    web:
      exposure:
        include: "*"
      base-path: /actuator #默认/actuator 不更改可不用配置
      #CORS跨域支持
      cors:
        allowed-origins: http://example.com
        allowed-methods: GET,PUT,POST,DELETE
  endpoint:
    beans:
      cache:
        time-to-live: 10s #端点缓存响应的时间量
    health:
      show-details: always #详细信息显示给所有用户
    prometheus:
      enabled: true
  metrics:
    export:
      prometheus:
        enabled: true
        step: 1ms
        descriptions: true
    tags:
      application: ${spring.application.name}

management里边的server port又称为prometheus port,该prometheus port则必须与该服务在prometheus服务器里边的prometheus.yml配置中的port是一致的,不一致的话则会使该服务down。

3,配置prometheus服务器里边的prometheus.yml:

我们需要在配置文件中添加我们刚刚创建的springboot项目的地址信息,这个地址信息就是我们向外暴露的endPoints。我们看下配置文件如何编写。
image.png

  - job_name: 'prometheus_test'   #prometheus任务名称
    scrape_interval: 5s  #每五秒抓取一次数据
    metrics_path: '/actuator/prometheus'   #数据来源的地址
    static_configs:
      - targets: ['10.2.1.196:30000']   #拉去数据的地址

  - job_name: 'prometheus_tool_test'   #prometheus任务名称
    scrape_interval: 5s  #每五秒抓取一次数据
    metrics_path: '/actuator/prometheus'   #数据来源的地址
    static_configs:
      - targets: ['10.2.1.196:30001']   #拉去数据的地址

解释:
- targets: [‘http://10.2.1.196:30001‘] prometheus默认的网络协议是HTTP协议,所以http头可以省略;——> targets: [‘10.2.1.196:30001’]

4,测试结果:

image.png

五,页面说明:

告警规则:

image.png

自带图表页面:

在这里可以手写表达式查询数据,用的是prometheus自带的promQL查询语言,满足一些比较复杂的查询场景;
image.png

系统属性页面:

image.png
比如说prometheus的配置文件的展示:
image.png
比如配置好的告警角色:
image.png
被监控端:
image.png
服务发现:
image.png

六,整合Grafana

1,下载:

https://dl.grafana.com/enterprise/release/grafana-enterprise-8.5.0.linux-amd64.tar.gz
解压安装:
tar -zxvf grafana-enterprise-8.5.0.linux-amd64.tar.gz

2,启动:

./grafana-server web

3,Grafana介绍:

Grafana是一个开源的指标量监测和可视化工具。官方网站为:https://grafana.com/, 常用于展示基础设施的时序数据和应用程序运行分析。Grafana的dashboard展示非常炫酷,绝对是运维提升逼格的一大利器。

4,数据源(datasource )

数据的存储源,它定义了将用什么方式来查询数据展示在grafana上面,不同的datasource拥有不同的查询语法,grafana支持多种数据源,官方支持以下数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch。

每个数据源的查询语言和能力各不同,我们可以将来自多个数据源的数据组合到一个仪表盘中,但是每个面板都绑定到属于特定组织的特定数据源。

在配置数据源的地方填写prometheus 的url :比如:http://10.2.1.196:9090

5,仪表盘Dashboard与面板Panel

通过数据源定义好可视化的数据来源之后,对于用户而言最重要的事情就是实现数据的可视化。在Grafana中,我们通过Dashboard来组织和管理我们的数据可视化图表。

在一个Dashboard中一个最基本的可视化单元为一个Panel(面板),Panel通过如趋势图,热力图的形式展示可视化数据。

并且在Dashboard中每一个Panel是一个完全独立的部分,通过Panel的Query Editor(查询编辑器)我们可以为每一个Panel自己查询的数据源以及数据查询方式,例如,如果以Prometheus作为数据源,那在Query Editor中,我们实际上使用的是PromQL,而Panel则会负责从特定的Prometheus中查询出相应的数据,并且将其可视化。

由于每个Panel是完全独立的,因此在一个Dashboard中,往往可能会包含来自多个Data Source的数据。

Grafana通过插件的形式提供了多种Panel的实现,常用的如:Graph Panel,Heatmap Panel,SingleStat Panel以及Table Panel等。用户还可通过插件安装更多类型的Panel面板。
PS:由于grafana深度兼容普罗米修斯,你无需安装插件就可以支持了。

除了Panel以外,在Dashboard页面中,我们还可以定义一个Row(行),来组织和管理一组相关的Panel。

6,配置步骤:

启动之后打开http://10.2.1.196:3000/,即grafana的界面;
image.png

配置数据源:
image.png
image.png

添加prometheus:
image.png
将prometheus的服务地址配置好:
image.png
保存配置:
image.png
配置仪表盘:点击导入即可。
image.png
仪表盘自带的有面板,也可以导入其他的面板(但需要连外网);

添加面板:
image.png

Panel面板配置数据源:
image.png
image.png

七,自定义监控指标并展示到 Grafana

参考链接:
https://cloud.tencent.com/developer/article/1508319?from=10680

Micrometer 介绍

Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API,它提供了多种度量指标类型(Timers、Guauges、Counters等),同时支持接入不同的监控系统,例如 Influxdb、Graphite、Prometheus 等。我们可以通过 Micrometer 收集 Java 性能数据,配合 Prometheus 监控系统实时获取数据,并最终在 Grafana 上展示出来,从而很容易实现应用的监控。

Micrometer 中有两个最核心的概念,分别是计量器(Meter)和计量器注册表(MeterRegistry)。
计量器用来收集不同类型的性能指标信息,Micrometer 提供了如下几种不同类型的计量器:

  • 计数器(Counter): 表示收集的数据是按照某个趋势(增加/减少)一直变化的,也是最常用的一种计量器,例如接口请求总数、请求错误总数、队列数量变化等。

  • 计量仪(Gauge): 表示搜集的瞬时的数据,可以任意变化的,例如常用的 CPU Load、Mem 使用量、Network 使用量、实时在线人数统计等,

  • 计时器(Timer): 用来记录事件的持续时间,这个用的比较少。

  • 分布概要(Distribution summary): 用来记录事件的分布情况,表示一段时间范围内对数据进行采样,可以用于统计网络请求平均延迟、请求延迟占比等。

使用步骤:

1、在我们的控制层或者服务层注入计量器注册器MeterRegistry和声明一个计数器Counter(用于统计):

//计量器注册器
@Autowired
MeterRegistry registry; 

//计数器
private Counter counter_generateData;

2、容器启动的时候,初始化计数器变量:

/**
 * 容器启动的时候执行该方法:
 */
@PostConstruct
private void init(){
    counter_generateData = registry.counter("app_requests_method_count", "method", "GenerateServiceImpl.generateData");
}

3、开始计数:

@Override
public List<GenerateReport> generateData(List<GenerateParam> paramList, String username) {

    counter_generateData.increment();  //计数

    ...

    return reportList;
}

4、测试:

使用postman多次发送请求之后,
使用prometheus,在graph界面,填写promQL查询语言进行测试:
app_requests_method_count_total{**application**="data-tool-test-zyh", **instance**="10.2.1.196:30001", **job**="prometheus_tool_test", **method**="GenerateServiceImpl.generateData"}
查询结果:
image.png

5、在 Grafana Dashboard 上添加一个新的 Panel 并添加 Query 查询

我们在 Grafana Dashboard 上添加一个新的 Panel 并添加 Query 查询,最后图形化展示出来。
image.png
将面板重命名,选择数据源,填写promQL查询语句;
image.png
app_requests_method_count_total{application="data-tool-test-zyh", instance="10.2.1.196:30001", job="prometheus_tool_test", method="GenerateServiceImpl.generateData"}
image.png
不过这里为了更好的扩展性,我们可以将 application 及 instance 两个参数赋值为变量,而这些变量可以直接从 Prometheus 上传递过来,最终的查询语句为 app_requests_method_count_total{application=”$application”, instance=”$instance”, method=”IndexController.core”},
image.png

保存:
image.png
点overwrite重写:
image.png
image.png

图形化展示:
image.png