docker - prometheus+grafana监控与集成到spring boot 服务

一、Prometheus 介绍

java 复制代码
1.数据收集器,它以配置的时间间隔定期通过HTTP提取指标数据。
2.一个时间序列数据库,用于存储所有指标数据。
3.一个简单的用户界面,您可以在其中可视化,查询和监视所有指标。

二、Grafana 介绍

Grafana 是一款采用 go 语言编写的开源应用,允许您从Elasticsearch,Prometheus,Graphite,InfluxDB等各种数据源中获取数据,并通过精美的图形将其可视化。

除了Prometheus的AlertManager 可以发送报警,Grafana 同时也支持告警。Grafana 可以无缝定义告警在数据中的位置,可视化的定义阈值,并可以通过钉钉、email等平台获取告警通知。最重要的是可直观的定义告警规则,不断的评估并发送通知。

由于Grafana alert告警比较弱,大部分告警都是通过Prometheus Alertmanager进行告警.

请注意Prometheus仪表板也具有简单的图形。 但是Grafana的图形化要好得多。

三、Alertmananger

Prometheus 监控平台中除了负责采集数据和存储,还能定制事件规则,但是这些事件规则要实现告警通知的话需要配合Alertmanager 组件来完成。

AlertManager 支持告警分组(将多个告警合并一起发送)、告警抑制以及告警静默(同一个时间段内不发出重复的告警)功能。

四、监控Java 应用

监控模式

目前,监控系统采集指标有两种方式,一种是『推』,另一种就是『拉』:

推的代表有 ElasticSearch,InfluxDB,OpenTSDB 等,需要你从程序中将指标使用 TCP,UDP 等方式推送至相关监控应用,只是使用 TCP 的话,一旦监控应用挂掉或存在瓶颈,容易对应用本身产生影响,而使用 UDP 的话,虽然不用担心监控应用,但是容易丢数据。

拉的代表,主要代表就是 Prometheus,让我们不用担心监控应用本身的状态。而且可以利用 DNS-SRV 或者 Consul 等服务发现功能就可以自动添加监控。

如何监控
Prometheus 监控应用的方式非常简单,只需要进程暴露了一个用于获取当前监控样本数据的 HTTP 访问地址。这样的一个程序称为Exporter,Exporter 的实例称为一个 Target 。Prometheus 通过轮训的方式定时从这些 Target 中获取监控数据样本,对于应用来讲,只需要暴露一个包含监控数据的 HTTP 访问地址即可,当然提供的数据需要满足一定的格式,这个格式就是 Metrics 格式.

text 复制代码
metric name>{<label name>=<label value>, ...}

主要分为三个部分,各个部分需符合相关的正则表达式

shell 复制代码
1.metric name:指标的名称,主要反映被监控样本的含义 a-zA-Z_:*_
2.label name: 标签 反映了当前样本的特征维度 [a-zA-Z0-9_]*
3.label value: 各个标签的值,不限制格式

需要注意的是,label value 最好使用枚举值,而不要使用无限制的值,比如用户 ID,Email 等,不然会消耗大量内存,也不符合指标采集的意义。

五、MicroMeter 介绍

前面简述了Prometheus 监控的原理。那么我们的Spring Boot 应用怎么提供这样一个 HTTP 访问地址,提供的数据还得符合上述的 Metrics 格式 ?

还记得吗,在Spring Boot Actuator 模块 详解:健康检查,度量,指标收集和监控中,我有提到过Actuator 模块也可以和一些外部的应用监控系统整合,其中就包括Prometheus 。那么Spring Boot Actuator 怎么让 Spring Boot 应用和Prometheus 这种监控系统结合起来呢?

这个桥梁就是Micrometer。Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API,应用程序只需要使用 Micrometer 的通用 API 来收集性能指标即可。Micrometer 会负责完成与不同监控系统的适配工作。

一、docker 安装prometheus

1.1、创建挂载目录

shell 复制代码
mkdir -p /opt/prometheus/{etc,data,rules}

1.2、下载指定版本的prometheus镜像

可以直接去 docker hub 上面去下载 prometheus 镜像,我选择的是 v2.45.0版本

shell 复制代码
docker pull prom/prometheus:v2.45.0

1.3、创建模板配置文件

位置就是我们之前创建的目录 etc 目录下,scrape_configs具体内容可以先不了解,后续我们还是需要修改的,那时会详细说明。

shell 复制代码
vim /opt/prometheus/etc/prometheus.yml
yaml 复制代码
# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9090']

1.4、部署启动

1、分别挂载对应的数据目录

shell 复制代码
docker run -d -p 32440:9090 --name prometheus \
-v /opt/prometheus/etc/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /opt/prometheus/rules:/etc/prometheus/rules \
-v /opt/prometheus/data:/data/prometheus \
prom/prometheus:v2.45.0 \
--config.file="/etc/prometheus/prometheus.yml" \
--storage.tsdb.path="/data/prometheus" \
--web.listen-address="0.0.0.0:9090"

其中

--config.file 参数是指定 【容器内部的配置文件位置】 ,这样我们再将 【容器内部的配置文件位置】 给映射到外部 即可

--storage.tsdb.path 参数是指定 【容器内部的数据文件位置】 ,这样我们再将 【容器内部的数据文件位置】 给映射到外部 即可

2、启动之后会发现启动失败,我们查看一下日志,可以知道是没有权限创建 /data/prometheus/queries.active文件,我们直接给我们的宿主机的这个数据存储目录权限即可

这个问题分析可以查看该片文章 解决 Docker 安装 Prometheus 启动报 permission denied 的问题

shell 复制代码
# 修改文件权限
chmod 777 /opt/prometheus/data
# 重启prometheus 即可
docker restart  prometheus

1.5、web 访问

访问开发出来的端口即可

java 复制代码
http://192.168.160.150:32440

二、docker 安装 Grafana

2.1、找到对应需要的版本,拉取镜像

我这里就拉取 9.4.13 版本了。

shell 复制代码
docker pull grafana/grafana:9.4.13

2.2、创建存储目录,运行镜像

shell 复制代码
# 创建存储目录
mkdir /opt/grafana
# 运行 grafana 镜像
 docker run -d   -p 32540:3000 --name=grafana   -v /opt/grafana:/var/lib/grafana   grafana/grafana:9.4.13

1、会发现启动时失败,查看日志,了解和前面创建 prometheus 一样,都是数据挂载目录的权限问题,我们直接修改文件权限即可

shell 复制代码
# 修改文件权限
chmod 777 /opt/grafana
# 重启prometheus 即可
docker restart  grafana

2.3、访问web

1、访问32540端口,即可

2、账号密码,默认 admin admin ,登录成功后,会需要你修改密码

2.4、创建数据源

1、这里的数据源选择我们创建的 prometheus

2、选择 prometheus

3、这里的prometheus的地址,写宿主机的地址和docker 暴露出来的端口

下面还有具体的其它配置,比如你的prometheus配置了http的账号密码,你都可以选择去配置。

4、滑动滚轮到最下面,有一个 保存测试的按钮,我们点击,会弹出数据源正在工作,即证明我们配置成功.

5、这个时候,我们的数据源列表,就存在了刚刚配置的 prometheus的数据源了.

2.5、配置视图

1、点击我们的prometheus数据源,去配置画板,我么选择 2.0的数据展示画板

2、查看我们的画板,点击进去,就能看到一部分的数据了。

2.6、grafana好用免费的官方模板地址

Grafana Dashboards

三、展示服务器监控数据 ( 使用Node Exporter采集主机运行数据 )

1、目前我们已经搭建好了 prometheusgrafana,那么现在我们先去展示服务器监控数据

2、因为我们我们知道 prometheus需要被监控的服务提供一个暴露的http的检测数据接口,prometheus才能去定时拉取暴露的数据,所以我们现在想要监控,服务器,那我们也需要为服务器指标信息来提供 http的接口,这个已经有了对应的插件,我们可以直接来 运行,挂载到 宿主机的指定目录,这里它就会暴露出对应的指标http接口

3.1、选择镜像版本,拉取

我这里就选择 v1.6.0 版本了

shell 复制代码
docker pull prom/node-exporter:v1.6.0


3.2、运行镜像

1、这里要说明一点就是,对于 linux 服务器的性能参数,其实都会以文件的形式存在在本地,所以我们只需要挂载对应的目录即可

大家可以去了解一下 netdata 的镜像部署,对应挂载的目录都是linux的性能数据目录,会比较的多

shell 复制代码
# 其中的参数 ro  是说明 在挂载命令中指定读写(read-write,rw)或只读(read-only,ro)权限,所以目前挂载的数据目录只能读取,保证安全性
docker run -d   -p 32640:9100 --name=node-exporter   -v "/proc:/host/proc:ro"   -v "/sys:/host/sys:ro"   -v "/:/rootfs:ro"   prom/node-exporter:v1.6.0

3.3、访问web

访问 32640 端口即可

3.4、配置监控信息

1、修改 prometheus 的配置文件,并重启

2、修改内容如下

3、最后展示如下,我们可以看到,已经有两个我们刚刚配置的实力信息了。

3.4、配置监控信息在 grafana 面板中展示

1、对于 node-exporter ,grafana 的画板库里面已经有了很多基础的,我们直接使用导入一个模板就行,就和前面观察prometheus 一样,

2、直接选择 8919 这个模板的 ID 模板即可

3、配置基础信息,修改完成,点击 import 按钮

4、数据信息如下

四、展示 springBoot 项目监控数据

4.1、内置监控数据

4.1.1、引入依赖

shell 复制代码
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
		<!-- Micrometer Prometheus registry  -->
		<dependency>
		    <groupId>io.micrometer</groupId>
		    <artifactId>micrometer-registry-prometheus</artifactId>
		</dependency>

4.1.2、yml配置

1、主要是 management 部分的,该部分的配置是 spring-boot-starter-actuator 依赖提供的

如下配置,就暴露出了 127.0.0.1:50000/actuator/prometheus 接口,可以让prometheus 来获取

yaml 复制代码
server:
  port: 9063

management:
  server:
    #address: 127.0.0.1 # 启动额外ip,默认使用项目ip调用
    port: 50000   # 启用独立运维端口,默认使用项目端口调用
  endpoints:
    web:
      base-path: /actuator   # 指定上下文路径,启用相应端点,后续相关请求需要加上该前缀,你看下面的请求url就知道了
      exposure:
        # /actuator/prometheus  调用方式如下:
        # curl -X GET 127.0.0.1:50000/actuator/prometheus
        include: ["prometheus"]  # 这里是一个set集合

2、 其中配置 include: ["prometheus"],spring-boot-starter-actuator 依赖其实包含了很多,prometheus 只是其中一个指标,比如 include: ["shutdown"] ,那么会暴露出 127.0.0.1:50000/actuator/prometheus/shutdown 接口,这个是用做 springboot 关机的接口,当然大家可以写成 include: ["*"] 那就会暴露出所有的接口,如下



具体可以参考 文章 Spring Boot之 Actuator监控(各个接口介绍)

3、启动项目,我们访问该接口,就可以看到 spring-boot-starter-actuator 依赖提供的暴露信息

4.1.3、修改prometheus,增加我们的项目接口

1、找到 prometheus 的配置文件,将我们上面暴露出来的接口添加进去

2、其中地址我写成我win的ip了,这样方便一些,不用把项目再部署到linux中,大家记得改成自己对应的ip即可,还有增加了参数 metrics_path

3、重启 prometheus项目

4、查看web ,已经正式上去了

4.1.4、增加 grafana 图表展示

1、这里就是去找模板了,和前面差不多

但是你也可以直接写自己想要展示的数据规则不使用现成的模板,后面自定义的时候会说

2、这里可以选择 输入4701 或 12271 [推荐] ,这两个模板,都还ok

4.2、自定义埋点上报监控数据

1、todo ,抽空补上

五、Docker Prometheus AlertManager webhook 报警

1、todo ,抽空补上

5.1、部署

1、todo ,抽空补上

5.2、配置钉钉机器人

1、todo ,抽空补上

六、总结

最后所有的画板都在

相关推荐
雪域迷影41 分钟前
PostgreSQL Docker Error – 5432: 地址已被占用
数据库·docker·postgresql
莹雨潇潇2 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
tangdou3690986555 小时前
Docker系列-5种方案超详细讲解docker数据存储持久化(volume,bind mounts,NFS等)
docker·容器
漫无目的行走的月亮9 小时前
在Docker中运行微服务注册中心Eureka
docker
大道归简12 小时前
Docker 命令从入门到入门:从 Windows 到容器的完美类比
windows·docker·容器
zeruns80212 小时前
如何搭建自己的域名邮箱服务器?Poste.io邮箱服务器搭建教程,Linux+Docker搭建邮件服务器的教程
linux·运维·服务器·docker·网站
爱跑步的程序员~12 小时前
Docker
docker·容器
疯狂的大狗13 小时前
docker进入正在运行的容器,exit后的比较
运维·docker·容器
长天一色13 小时前
【Docker从入门到进阶】01.介绍 & 02.基础使用
运维·docker·容器
伊玛目的门徒13 小时前
docker 搭建minimalist-web-notepad
运维·docker·notepad