Prometheus 版本 2.41.0
- 平台统一监控的介绍和调研
- 直观感受PromQL及其数据类型
- PromQL之选择器和运算符
- PromQL之函数
- Prometheus 配置身份认证
- Prometheus 动态拉取监控服务
我们在以前的实例中配置Prometheus 的target 都是手动配置,这在监控目标少的情况下还可以接受,如果是要监控上百个微服务,都手动配置岂不是蠢死。Spring Boot Admin 都可以从注册中心拉取服务列表,也可以每个应用单独注册到Spring Boot Admin,Prometheus 当然也可以,先看下两者前后配置。
以前的配置
# 多个监控目标,如此重复配置
#- job_name: 'prometheus-demo'
# scrape_interval: 5s
# static_configs:
# - targets: ['192.168.0.115:8088']
- job_name: 'provider'
metrics_path: '/actuator/prometheus'
scrape_interval: 5s
static_configs:
- targets: ['192.168.0.115:8000']
现在从Eureka拉取的简化配置
- job_name: 'eureka'
metrics_path: '/actuator/prometheus'
eureka_sd_configs:
# 指定 eureka 的服务发现地址
- server: 'http://192.168.0.113:8081/eureka'
这是没有鉴权,没有重写地址的配置,更详细的配置见后面“注册中心Eureka”
注册中心 Consul
配置文件解析
如下是Prometheus提供的完整配置,[]
都是可选配置,项目中按需配置:
# 注册中心地址
[ server: <host> | default = "localhost:8500" ]
[ token: <secret> ]
[ datacenter: <string> ]
# Consul 企业版支持配置 命名空间
[ namespace: <string> ]
# Consul 企业版支持配置 管理分区
[ partition: <string> ]
[ scheme: <string> | default = "http" ]
# 用户名和密码不推荐使用,推荐使用 basic_auth
[ username: <string> ]
[ password: <secret> ]
# 配置需要拉取的服务,[]表示拉取所有
services:
[ - <string> ]
# 可选标签列表,用来筛选给定的服务节点。服务必须包含所有的可选标签
tags:
[ - <string> ]
# 节点元数据 key/value 对,用来筛选给定的服务节点
[ node_meta:
[ <string>: <string> ... ] ]
# Consul 标签拼接的分割符
[ tag_separator: <string> | default = , ]
# 允许过期的Consul 结果,详细查看 https://www.consul.io/api/features/consistency.html,有助于减少Consul负担
[ allow_stale: <boolean> | default = true ]
# 用于names的刷新时间
# 大型配置项中可能有用
[ refresh_interval: <duration> | default = 30s ]
# consul server 身份验证信息
# `basic_auth`, `authorization`, `oauth2` 只能选择一种
# `password` 和 `password_file` 也只能选择一种方式
basic_auth:
[ username: <string> ]
[ password: <secret> ]
[ password_file: <string> ]
# `Authorization` header 配置
authorization:
# authentication 类型.
[ type: <string> | default: Bearer ]
# 设置凭据,跟 `credentials_file` 互斥
[ credentials: <secret> ]
# 将凭据设置为从配置文件读取的凭据
# 跟`credentials` 互斥
[ credentials_file: <filename> ]
# OAuth 2.0 配置
oauth2:
[ <oauth2> ]
# 代理URL
[ proxy_url: <string> ]
# 代理发送头信息
[ proxy_connect_headers:
[ <string>: [<secret>, ...] ] ]
# 配置是否遵循 HTTP 3xx 重定向
[ follow_redirects: <boolean> | default = true ]
# 是否开启 HTTP2
[ enable_http2: <bool> | default: true ]
# TLS 配置
tls_config:
[ <tls_config> ]
如果使用OAuth2 还有一堆配置,如下
client_id: <string>
[ client_secret: <secret> ]
# 从文件中读取客户端秘钥
# 跟 client_secret 是冲突的
[ client_secret_file: <filename> ]
# 作用域
scopes:
[ - <string> ... ]
# 获取token的URL
token_url: <string>
# 拼接在 token URL 客户端参数
endpoint_params:
[ <string>: <string> ... ]
# token 请求的 TLS 配置
tls_config:
[ <tls_config> ]
# 代理URL
[ proxy_url: <string> ]
# 代理发送头信息
[ proxy_connect_headers:
[ <string>: [<secret>, ...] ] ]
TLS 的配置信息,如下
# CA 证书文件地址
[ ca_file: <filename> ]
# 客户端证书和秘钥文件地址
[ cert_file: <filename> ]
[ key_file: <filename> ]
# ServerName扩展 用来指定服务器名称
# https://tools.ietf.org/html/rfc4366#section-3.1
[ server_name: <string> ]
# 是否禁用服务器证书验证
[ insecure_skip_verify: <boolean> ]
# 最低TLS 版本,可接受值:TLS10 (TLS 1.0), TLS11 (TLS
# 1.1), TLS12 (TLS 1.2), TLS13 (TLS 1.3).
# 默认TLS 1.2
# https://pkg.go.dev/crypto/tls#Config.
[ min_version: <string> ]
# 最高TLS 版本,可接受值:TLS10 (TLS 1.0), TLS11 (TLS
# 1.1), TLS12 (TLS 1.2), TLS13 (TLS 1.3).
# 默认TLS 1.3
# See MaxVersion in https://pkg.go.dev/crypto/tls#Config.
[ max_version: <string> ]
Consul 可使用的元标签有,可以在配置文件中引用:
__meta_consul_address:目标的地址
__meta_consul_dc:目标的数据中心名称
__meta_consul_tagged_address_<key>:每个节点标记目标的地址键值
__meta_consul_metadata_<key>:目标的每个节点元数据键值
__meta_consul_node:为目标定义的节点名称
__meta_consul_service_address:目标的服务地址
__meta_consul_service_id:目标的服务ID
__meta_consul_service_metadata_<key>:目标的每个服务元数据键值
__meta_consul_service_port:目标的服务端口
__meta_consul_service:目标所属服务的名称
__meta_consul_tags:标记分隔符连接的目标的标记列表
实例
1、安装Consul 服务端,使用Docker运行
docker run \
-d \
-p 8500:8500 \
-p 8600:8600/udp \
--name=consul-server \
consul agent -server -ui -node=server-1 -bootstrap-expect=1 -client=0.0.0.0
2、配置Consul 验证
在/consul/config/
目录下,创建consul-acl.json
{
"acl":{
"enabled": true,
"default_policy": "deny",
"down_policy": "extend-cache",
"tokens": {
"master": "hello-consul-itysaysay"
}
}
}
3、创建一个Spring Boot 应用
包含consul 注册中心依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
配置yml文件
server:
port: 8860
spring:
cloud:
consul:
#注册中心地址
host: localhost
port: 8500
discovery:
#注册到consul的服务名称
service-name: ${spring.application.name}
instance-id: ${spring.application.name}:${server.port}
application:
name: provider-consul
启动应用,查看Consul 是否成功注册上该服务
4、配置prometheus.yml
- job_name: 'consul'
# 监控指标地址
metrics_path: '/actuator/prometheus'
consul_sd_configs:
# consul 地址
- server: "192.168.0.113:8500"
# consul 鉴权token,生成应该设置的够复杂
token: hello-consul-itysaysay
# 拉取所有服务
services: []
# 拉取指定标签的服务
tags: ["service-1"]
relabel_configs:
# 重写job 名称,否则job 名称都是 该配置文件的job_name
- source_labels: ["__meta_consul_service"]
action: replace
target_label: job
regex: (.+)
重启Prometheus 或者使用 热更新 curl -X POST http://地址:9090/-/reload(前提Prometheus 启动的时候开启--web.enable-lifecycle)
查看Prometheus 上 是否成功注册
🤔 思考一下:不知道你发现没有Consul上是有两个服务的,到Prometheus上怎么只有一个了呢?
注册中心 Eureka
配置文件解析
Prometheus 提供的 Eureka 元标签,可以在配置文件中引用:
__meta_eureka_app_name: 服务名称
__meta_eureka_app_instance_id: 服务实例id
__meta_eureka_app_instance_hostname: 实例主机名
__meta_eureka_app_instance_homepage_url: 实例主页URL
__meta_eureka_app_instance_statuspage_url: 实例状态页URL
__meta_eureka_app_instance_healthcheck_url: 实例健康检查URL
__meta_eureka_app_instance_ip_addr: 实例IP地址
__meta_eureka_app_instance_vip_address: 实例vip地址
__meta_eureka_app_instance_secure_vip_address: 实例安全vip地址
__meta_eureka_app_instance_status: 实例状态
__meta_eureka_app_instance_port: 实例端口号
__meta_eureka_app_instance_port_enabled: 实例端口是否已启用
__meta_eureka_app_instance_secure_port: 实例安全端口
__meta_eureka_app_instance_secure_port_enabled: 实例安全端口是否已启用
__meta_eureka_app_instance_country_id: 实例的地区id
__meta_eureka_app_instance_metadata_<metadataname>: 实例元数据
__meta_eureka_app_instance_datacenterinfo_name: 实例数据中心
__meta_eureka_app_instance_datacenterinfo_<metadataname>: 数据中心元数据
完整配置,[]
都是可选配置,项目中按需配置:
# Eureka 地址
server: <string>
# Eureka鉴权,password 与password_file只能配置一个
basic_auth:
[ username: <string> ]
[ password: <secret> ]
[ password_file: <string> ]
# `Authorization` header 配置
authorization:
# authentication 类型
[ type: <string> | default: Bearer ]
# 设置凭据,跟 `credentials_file` 互斥
[ credentials: <secret> ]
# 将凭据设置为从配置文件读取的凭据
# 跟`credentials` 互斥
[ credentials_file: <filename> ]
# OAuth 2.0 配置
oauth2:
[ <oauth2> ]
# token 请求的 TLS 配置
tls_config:
[ <tls_config> ]
# 代理配置
[ proxy_url: <string> ]
[ proxy_connect_headers:
[ <string>: [<secret>, ...] ] ]
[ follow_redirects: <boolean> | default = true ]
[ enable_http2: <bool> | default: true ]
# 实例列表刷新时间
[ refresh_interval: <duration> | default = 30s ]
实例
同样的搭建好一个Eureka 服务端、一个Spring Boot 客户端,客户端暴露端口。
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
management.metrics.tags.application=${spring.application.name}
Eureka 服务端引入spring security 依赖,开启鉴权。
prometheus.yml 配置Eureka:
- job_name: 'eureka'
# 监控指标地址
metrics_path: '/actuator/prometheus'
eureka_sd_configs:
# 指定 eureka 的服务发现地址
- server: 'http://192.168.0.113:8081/eureka'
basic_auth:
username: demo
password: 123456
relabel_configs:
# 重写job 名称
- source_labels: ["__meta_eureka_app_name"]
action: replace
target_label: job
regex: (.+)
📌 注意,eureka的发现地址,最后不能加
/
,否则会一直没权限访问,http://192.168.0.113:8081/eureka/
这样是错误的
relabel_configs 解析
看到我们上面的配置都使用了relabel_configs,该配置可以对Prometheus 的__address__、__scheme__、__metrics_path__
等标签进行重写,进而使用我们自定义的标签值,完整配置如下:
# 源标签,使用配置的separator进行连接后,与正则表达式进行匹配
[ source_labels: '[' <labelname> [, ...] ']' ]
# 源标签连接分隔符
[ separator: <string> | default = ; ]
# 被替换的标签,正则替换可用,target_label: ${1}
[ target_label: <labelname> ]
# 正则表达式
[ regex: <regex> | default = (.*) ]
# 源标签值的哈希值模数
[ modulus: <int> ]
# 替换值,正则替换可用
[ replacement: <string> | default = $1 ]
# 执行的替换操作
# replace 根据 regex 匹配的 source_labels,设置到 target_label,再使用 replacement 规则进行替换
# lowercase 将匹配到的 source_labels 转换成小写
# uppercase 将匹配到的 source_labels 转换成大写
# keep 删除 与regex 不相匹配的 source_labels 值
# drop 删除 与regex 相匹配的 source_labels 值
# keepequal 删除 source_labels 与 target_label 不相匹配的 值
# dropequal 删除 source_labels 与 target_label 相匹配的 值
# hashmod 将 target_label 设置为源标签连接后哈希值的模数
# 其他还有 labelmap、labeldrop、labelkeep,我们常用也就前3种
[ action: <relabel_action> | default = replace ]
比如另外一个例子,表示将__address__
根据正则表达式替换为 ip:port
- source_labels: [__address__, __meta_eureka_app_instance_metadata_prometheus_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
__meta_eureka_app_instance_metadata_prometheus_port
是Spring Boot 应用中定义的 元标签
注册中心 Nacos
Nacos 提供的就比较简便
- job_name: 'nacos'
# 监控指标地址
metrics_path: '/nacos/actuator/prometheus'
static_configs:
# nacos地址
- targets: ['192.168.0.113:8848']
对于 relabel_configs
的配置同样适用,这里不做过多说明。
总结
以上介绍了常见的几种“Prometheus 动态拉取监控服务”的配置,Prometheus更多的动态注册方式可见其官方文档,欢迎评论区交流沟通。
作者其他文章:
Grafana 系列文章,版本:OOS v9.3.1
- Grafana 的介绍和安装
- Grafana监控大屏配置参数介绍(一)
- Grafana监控大屏配置参数介绍(二)
- Grafana监控大屏可视化图表
- Grafana 查询数据和转换数据
- Grafana 告警模块介绍
- Grafana 告警接入飞书通知
Spring Boot Admin 系列
- Spring Boot Admin 参考指南
- SpringBoot Admin服务离线、不显示健康信息的问题
- Spring Boot Admin2 @EnableAdminServer的加载
- Spring Boot Admin2 AdminServerAutoConfiguration详解
- Spring Boot Admin2 实例状态监控详解
- Spring Boot Admin2 自定义JVM监控通知
- Spring Boot Admin2 自定义异常监控
- Spring Boot Admin 监控指标接入Grafana可视化