docker - prometheus+grafana监控与集成到spring boot 服务 一、Prometheus 介绍1.数据收集器它以配置的时间间隔定期通过HTTP提取指标数据。2.一个时间序列数据库用于存储所有指标数据。3.一个简单的用户界面您可以在其中可视化查询和监视所有指标。二、Grafana 介绍Grafana 是一款采用 go 语言编写的开源应用允许您从ElasticsearchPrometheusGraphiteInfluxDB等各种数据源中获取数据并通过精美的图形将其可视化。除了Prometheus的AlertManager 可以发送报警Grafana 同时也支持告警。Grafana 可以无缝定义告警在数据中的位置可视化的定义阈值并可以通过钉钉、email等平台获取告警通知。最重要的是可直观的定义告警规则不断的评估并发送通知。由于Grafana alert告警比较弱大部分告警都是通过Prometheus Alertmanager进行告警.请注意Prometheus仪表板也具有简单的图形。 但是Grafana的图形化要好得多。三、AlertmanangerPrometheus 监控平台中除了负责采集数据和存储还能定制事件规则但是这些事件规则要实现告警通知的话需要配合Alertmanager 组件来完成。AlertManager 支持告警分组将多个告警合并一起发送、告警抑制以及告警静默同一个时间段内不发出重复的告警功能。四、监控Java 应用监控模式目前监控系统采集指标有两种方式一种是『推』另一种就是『拉』推的代表有 ElasticSearchInfluxDBOpenTSDB 等需要你从程序中将指标使用 TCPUDP 等方式推送至相关监控应用只是使用 TCP 的话一旦监控应用挂掉或存在瓶颈容易对应用本身产生影响而使用 UDP 的话虽然不用担心监控应用但是容易丢数据。拉的代表主要代表就是 Prometheus让我们不用担心监控应用本身的状态。而且可以利用 DNS-SRV 或者 Consul 等服务发现功能就可以自动添加监控。如何监控Prometheus 监控应用的方式非常简单只需要进程暴露了一个用于获取当前监控样本数据的 HTTP 访问地址。这样的一个程序称为ExporterExporter 的实例称为一个 Target 。Prometheus 通过轮训的方式定时从这些 Target 中获取监控数据样本对于应用来讲只需要暴露一个包含监控数据的 HTTP 访问地址即可当然提供的数据需要满足一定的格式这个格式就是 Metrics 格式.metric name{label namelabel value, ...}主要分为三个部分各个部分需符合相关的正则表达式1.metric name指标的名称主要反映被监控样本的含义 a-zA-Z_:*_2.label name: 标签 反映了当前样本的特征维度[a-zA-Z0-9_]*3.label value: 各个标签的值不限制格式需要注意的是label value 最好使用枚举值而不要使用无限制的值比如用户 IDEmail 等不然会消耗大量内存也不符合指标采集的意义。五、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 安装prometheus1.1、创建挂载目录mkdir-p/opt/prometheus/{etc,data,rules}1.2、下载指定版本的prometheus镜像可以直接去 docker hub 上面去下载 prometheus 镜像我选择的是v2.45.0版本dockerpull prom/prometheus:v2.45.01.3、创建模板配置文件位置就是我们之前创建的目录 etc 目录下scrape_configs具体内容可以先不了解后续我们还是需要修改的那时会详细说明。vim/opt/prometheus/etc/prometheus.yml# my global configglobal: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 configurationalerting: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 its Prometheus itself.scrape_configs:# The job name is added as a label jobjob_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、分别挂载对应的数据目录dockerrun-d-p32440:9090--nameprometheus\-v/opt/prometheus/etc/prometheus.yml:/etc/prometheus/prometheus.yml\-v/opt/prometheus/rules:/etc/prometheus/rules\-v/opt/prometheus/data:/data/prometheus\--restartalways\prom/prometheus:v2.45.0\--config.file/etc/prometheus/prometheus.yml\--storage.tsdb.path/data/prometheus\--web.listen-address0.0.0.0:9090其中–config.file 参数是指定 【容器内部的配置文件位置】 这样我们再将 【容器内部的配置文件位置】 给映射到外部 即可–storage.tsdb.path 参数是指定 【容器内部的数据文件位置】 这样我们再将 【容器内部的数据文件位置】 给映射到外部 即可2、启动之后会发现启动失败我们查看一下日志可以知道是没有权限创建/data/prometheus/queries.active文件我们直接给我们的宿主机的这个数据存储目录权限即可这个问题分析可以查看该片文章 解决 Docker 安装 Prometheus 启动报 permission denied 的问题# 修改文件权限chmod777/opt/prometheus/data# 重启prometheus 即可dockerrestart prometheus1.5、web 访问访问开发出来的端口即可http://192.168.160.150:32440二、docker 安装 Grafana2.1、找到对应需要的版本拉取镜像我这里就拉取 9.4.13 版本了。dockerpull grafana/grafana:9.4.132.2、创建存储目录运行镜像# 创建存储目录mkdir/opt/grafana# 运行 grafana 镜像dockerrun-d-p32540:3000--namegrafana-v/opt/grafana:/var/lib/grafana--restartalways grafana/grafana:9.4.131、会发现启动时失败查看日志了解和前面创建prometheus一样都是数据挂载目录的权限问题我们直接修改文件权限即可# 修改文件权限chmod777/opt/grafana# 重启prometheus 即可dockerrestart grafana2.3、访问web1、访问32540端口即可2、账号密码默认 admin admin 登录成功后会需要你修改密码2.4、创建数据源1、这里的数据源选择我们创建的prometheus2、选择prometheus3、这里的prometheus的地址写宿主机的地址和docker 暴露出来的端口下面还有具体的其它配置比如你的prometheus配置了http的账号密码你都可以选择去配置。4、滑动滚轮到最下面有一个 保存测试的按钮我们点击会弹出数据源正在工作即证明我们配置成功.5、这个时候我们的数据源列表就存在了刚刚配置的prometheus的数据源了.2.5、配置视图1、点击我们的prometheus数据源去配置画板我么选择 2.0的数据展示画板2、查看我们的画板点击进去就能看到一部分的数据了。2.6、grafana好用免费的官方模板地址Grafana Dashboards三、展示服务器监控数据 使用Node Exporter采集主机运行数据 1、目前我们已经搭建好了prometheus和grafana那么现在我们先去展示服务器监控数据2、因为我们我们知道prometheus需要被监控的服务提供一个暴露的http的检测数据接口prometheus才能去定时拉取暴露的数据所以我们现在想要监控服务器那我们也需要为服务器指标信息来提供 http的接口这个已经有了对应的插件我们可以直接来 运行挂载到 宿主机的指定目录这里它就会暴露出对应的指标http接口3.1、选择镜像版本拉取我这里就选择 v1.6.0 版本了dockerpull prom/node-exporter:v1.6.03.2、运行镜像1、这里要说明一点就是对于 linux 服务器的性能参数其实都会以文件的形式存在在本地所以我们只需要挂载对应的目录即可大家可以去了解一下 netdata 的镜像部署对应挂载的目录都是linux的性能数据目录会比较的多# 其中的参数 ro 是说明 在挂载命令中指定读写read-writerw或只读read-onlyro权限所以目前挂载的数据目录只能读取保证安全性dockerrun-d-p32640:9100--namenode-exporter-v/proc:/host/proc:ro-v/sys:/host/sys:ro-v/:/rootfs:ro--restartalways prom/node-exporter:v1.6.03.3、访问web访问 32640 端口即可3.4、配置监控信息1、修改 prometheus 的配置文件并重启2、修改内容如下3、最后展示如下我们可以看到已经有两个我们刚刚配置的实力信息了。3.4、配置监控信息在 grafana 面板中展示1、对于node-exportergrafana 的画板库里面已经有了很多基础的我们直接使用导入一个模板就行就和前面观察prometheus 一样2、直接选择 8919 这个模板的 ID 模板即可3、配置基础信息修改完成点击import按钮4、数据信息如下四、展示 springBoot 项目监控数据4.1、内置监控数据4.1.1、引入依赖dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency!-- Micrometer Prometheus registry --dependencygroupIdio.micrometer/groupIdartifactIdmicrometer-registry-prometheus/artifactId/dependency4.1.2、yml配置1、主要是 management 部分的该部分的配置是spring-boot-starter-actuator依赖提供的如下配置就暴露出了 127.0.0.1:50000/actuator/prometheus 接口可以让prometheus 来获取server:port:9063management: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/prometheusinclude:[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_path3、重启prometheus项目4、查看web 已经正式上去了4.1.4、增加 grafana 图表展示1、这里就是去找模板了和前面差不多但是你也可以直接写自己想要展示的数据规则不使用现成的模板后面自定义的时候会说2、这里可以选择 输入4701 或 12271 [推荐] 这两个模板都还ok4.2、自定义埋点上报监控数据1、todo 抽空补上五、Docker Prometheus AlertManager webhook 报警1、todo 抽空补上5.1、部署1、todo 抽空补上5.2、配置钉钉机器人1、todo 抽空补上六、配置prometheus账户密码1、参考文章 Prometheus使用Basic Auth进行安全防护实现登录控制2、Prometheus于2.24版本包括2.24之后提供Basic Auth功能进行加密访问在浏览器登录UI的时候需要输入用户密码访问Prometheus api的时候也需要加上用户密码。3、大致步骤如下预制用户密码其中密码使用python3工具包加密创建对应用户密码配置文件修改普罗启动命令operator场景通过ngress-nginx方式由于Prometheus访问需要认证如果普罗负载存在探针则修改普罗负载本身的探针配置由于Prometheus访问需要认证如果有grafana需要修改grafana相关步骤6.1、准备工作预制用户密码其中密码使用python3工具包加密因为Basic Auth 需要user、password 信息。访问Prometheus API的所有行为都需要用户名和密码。普罗配置的密码需要加盐加密可以使用python3工具进行生成再配置到普罗的相关配置中作为登录密码认证使用。1、安装 Python 库 bcryptpip install bcrypt2、Python 脚本文件 gen-pass.py 如下importgetpassimportbcrypt passwordgetpass.getpass(password: )hashed_passwordbcrypt.hashpw(password.encode(utf-8),bcrypt.gensalt())print(hashed_password.decode())3、运行脚本假如我们需要的密码为test执行脚本后需要我们手动键入需要使用的密码在终端键入的时候不显示保存密码备用$2b$12$WhMDsuVBG3/iciwWjL3AleT3YOka2LaNQBSsNGovLtG963V/V3hCS6.2、prometheus操作配置实践操作在prometheus的日常使用中通常有三种方式:容器化部署在集群中通过kube-prometheus部署二进制直接在虚机上部署三种不同方式安装的prometheus配置basic auth的方式也略有差异参考文章中这三种都有但是第一种容器化的他配置的是k8s的我这里就再补充一个直接docker的配置。6.2.1、docker中配置1、准备webconfig.yml文件文件内容如下vim/opt/prometheus/etc/webconfig.ymlbasic_auth_users:admin:$2b$12$WhMDsuVBG3/iciwWjL3AleT3YOka2LaNQBSsNGovLtG963V/V3hCS2、需要修改启动命令添加 web.config.file# 停止删除之前的dockerstop prometheusdockerrmprometheus# 重新创建dockerrun-d-p32440:9090--nameprometheus\-v/opt/prometheus/etc/prometheus.yml:/etc/prometheus/prometheus.yml\-v/opt/prometheus/etc/webconfig.yml:/etc/prometheus/webconfig.yml\-v/opt/prometheus/rules:/etc/prometheus/rules\-v/opt/prometheus/data:/data/prometheus\--restartalways\prom/prometheus:v2.45.0\--config.file/etc/prometheus/prometheus.yml\--web.config.file/etc/prometheus/webconfig.yml\--storage.tsdb.path/data/prometheus\--web.listen-address0.0.0.0:90903、再次访问prometheus就会出现验证输入 账户admin密码test即可6.3、Grafana 如何对接鉴权之后的Prometheus1、正常来说如果对Prometheus配置了Basic Auth后所有需要访问Prometheus的组件均需做出调整否则无法获取数据。Grafana也不例外2、我们之前已经配置了许多看板但是数据来源都是prometheus如果你此刻再进入访问这些看板会让你输入prometheus的账户密码虽然输入账户密码又可以了但是这样不方便建议直接在 数据源prometheus那里修改3、修改数据源prometheus,选择 basic auth 输入账号 密码点击savetest即可4、在进入看板就没有问题啦。七、总结最后所有的画板都在八、prometheus配置告警规则发送飞书消息https://www.cnblogs.com/felixzh/p/18879916九、blackbox-exporterhttps://blog.csdn.net/weixin_43266367/article/details/129110541