原文链接:
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等。
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/
例如:
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
6、设置prometheus系统服务,并配置开机启动
创建prometheus.service文件
输入如下命令:touch /usr/lib/systemd/system/prometheus.service
vi /usr/lib/systemd/system/prometheus.service
将以下配置内容写入prometheus.service:
[Unit]
Description=Prometheus
After=network.target
[Service]
Type=simple
ExecStart=/data/prometheus/prometheus --config.file=/data/prometheus/prometheus.yml --web.enable-lifecycle --storage.tsdb.path=/data/prometheus/data --storage.tsdb.retention=60d
Restart=on-failure
[Install]
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
— 启动prometheussystemctl 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。我们看下配置文件如何编写。
- 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,测试结果:
五,页面说明:
告警规则:
自带图表页面:
在这里可以手写表达式查询数据,用的是prometheus自带的promQL查询语言,满足一些比较复杂的查询场景;
系统属性页面:
比如说prometheus的配置文件的展示:
比如配置好的告警角色:
被监控端:
服务发现:
六,整合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的界面;
配置数据源:
添加prometheus:
将prometheus的服务地址配置好:
保存配置:
配置仪表盘:点击导入即可。
仪表盘自带的有面板,也可以导入其他的面板(但需要连外网);
添加面板:
Panel面板配置数据源:
七,自定义监控指标并展示到 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"}
查询结果:
5、在 Grafana Dashboard 上添加一个新的 Panel 并添加 Query 查询
我们在 Grafana Dashboard 上添加一个新的 Panel 并添加 Query 查询,最后图形化展示出来。
将面板重命名,选择数据源,填写promQL查询语句;app_requests_method_count_total{application="data-tool-test-zyh", instance="10.2.1.196:30001", job="prometheus_tool_test", method="GenerateServiceImpl.generateData"}
不过这里为了更好的扩展性,我们可以将 application 及 instance 两个参数赋值为变量,而这些变量可以直接从 Prometheus 上传递过来,最终的查询语句为 app_requests_method_count_total{application=”$application”, instance=”$instance”, method=”IndexController.core”},
保存:
点overwrite重写:
图形化展示: