Prometheus 动态拉取监控服务

news2024/11/16 3:35:05

Prometheus 版本 2.41.0

  1. 平台统一监控的介绍和调研
  2. 直观感受PromQL及其数据类型
  3. PromQL之选择器和运算符
  4. PromQL之函数
  5. Prometheus 配置身份认证
  6. 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

  1. Grafana 的介绍和安装
  2. Grafana监控大屏配置参数介绍(一)
  3. Grafana监控大屏配置参数介绍(二)
  4. Grafana监控大屏可视化图表
  5. Grafana 查询数据和转换数据
  6. Grafana 告警模块介绍
  7. Grafana 告警接入飞书通知

Spring Boot Admin 系列

  1. Spring Boot Admin 参考指南
  2. SpringBoot Admin服务离线、不显示健康信息的问题
  3. Spring Boot Admin2 @EnableAdminServer的加载
  4. Spring Boot Admin2 AdminServerAutoConfiguration详解
  5. Spring Boot Admin2 实例状态监控详解
  6. Spring Boot Admin2 自定义JVM监控通知
  7. Spring Boot Admin2 自定义异常监控
  8. Spring Boot Admin 监控指标接入Grafana可视化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/176166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【基础】BMP格式

BMP格式位图 (BMP)简介格式1.1图和调色板的概念1.2 bmp文件格式1.2.1 位图文件头 14字节1.2.2 位图信息头 40字节1.2.3 调色板1.2.4 注意位图 (BMP)简介 BMP取自位图Bitmap的缩写&#xff0c;也称为DIB&#xff08;与设备无关的位图&#xff09;&#xff0c;是一种独立于显示器…

【苹果家庭群发推】软件keychain中刚打开的证书下载的证书文件要决不会报错 UNTimeIntervalNotificationTrigge

推荐内容IMESSGAE相关 作者✈️IMEAX推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容3.日历推 *** …

linux入门---linux基本指令

目录标题云服务器选择云服务器购买xshell下载如何登陆云服务器Linux的新建与删除新建删除云服务器选择 学习linux的时候云服务器是一个非常重要的工具&#xff0c;那么我们在购买云服务器的时候有很多选择比如说&#xff1a;华为云&#xff0c;腾讯云&#xff0c;阿里云等等&a…

活动星投票网络文明公益广告网络评选微信的投票方式线上免费投票

“网络文明公益广告”网络评选投票_不记名投票小程序_投票帮手免费畅享_扫码投票微信小程序手机互联网给所有人都带来不同程度的便利&#xff0c;而微信已经成为国民的系统级别的应用。现在很多人都会在微信群或朋友圈里转发投票&#xff0c;对于运营及推广来说找一个合适的投票…

ROS2机器人编程简述humble-第三章-PERCEPTION AND ACTUATION MODELS .1

书中&#xff0c;第三章主题&#xff1a;First Behavior: Avoiding Obstacles with Finite States Machines本节旨在应用到现在为止所展示的一切来创建看似“聪明”的行为。这个练习将介绍的许多东西结合起来&#xff0c;并展示使用ROS2编程机器人的效率。此外&#xff0c;将解…

第五届字节跳动青训营 前端进阶学习笔记(八)React框架入门

文章目录前言React 的设计思路1.传统JavaScript更新UI的痛点2.我们对UI代码的需求3.组件&#xff08;1&#xff09;组件定义&#xff08;2&#xff09;组件设计&#xff08;3&#xff09;组件结构4.React的生命周期React的基本语法1.JSXReact的实现1.虚拟DOM2.响应数据的实现前…

Java面试题,Spring Bean的注册与依赖注入

Spring Bean的注册与依赖注入一、XML文件中&#xff0c;将Bean创建到Spring容器1. 基本类型注册2. 类装配3. 有参构造方法装配4. 扩展注入5. Bean的作用域6. Bean的其他配置二、配置类中&#xff0c;将Bean创建到Spring容器1. 在mapper、service、controller中创建&#xff0c;…

计网必会:HTPP详解(非常全面)、cookie、缓存

文章目录应用层协议Web和HTTPHTTP 概述采用非持续连接的HTTPRTT 往返时间的定义**三次握手过程**采用持续连接的HTTPHTTP到底采用哪个&#xff1f;HTTP 的报文格式请求报文功效格式响应报文状态码格式Cookie什么是cookieWeb缓存在学习的过程很多人都遇到了HTTP和Cookie&#xf…

卓有成效的五种用例设计方法

持续坚持原创输出&#xff0c;点击蓝字关注我吧用例设计作为测试工程师的立身之本&#xff0c;是衡量测试工程师综合素质的重要参考&#xff0c;时间是测试工作中重要的测试资源&#xff0c;通过设计高质量的测试用例可以有效地提升测试效率。本文旨在介绍测试工作中常用的五种…

SSO笔记

自己学习做的笔记.没有具体代码 单点登录:多系统,单一位置登录,实现多系统同时登录的一种技术. 也就是说多个应用系统中&#xff0c;用户只需要登录一次就可以访问所有相互信任的应用系统。 和三方登录Oauth2是有区别的.Oauth2属于三方登录.通常是某系统,使用其他系统的用户,…

【机器学习】多分类及多标签分类算法(含源代码)

目录&#xff1a;多分类及多标签分类算法一、单标签二分类问题1.1 单标签二分类算法原理二、单标签多分类问题2.1 ovo2.1.1 手写代码2.1.2 调用API2.2 ovr2.2.1 手写代码2.2.2 调用API2.3 OvO和OvR的区别2.4 Error Correcting三、多标签算法问题3.1 Problem Transformation Met…

Vue3 – Composition API(二)

1、computed函数使用 1.1、computed 在前面我们讲解过计算属性computed&#xff1a;当我们的某些属性是依赖其他状态时&#xff0c;我们可以使用计算属性来处理 在前面的Options API中&#xff0c;我们是使用computed选项来完成的&#xff1b;在Composition API中&#xff0c…

Shell语法

一、概念 Shell 是命令行与操作系统沟通的桥梁&#xff0c;也是一门语言。 Shell 脚本可以直接在命令行中执行&#xff0c;也可以作为文件方便复用。 Linux中常见的 Shell 脚本有&#xff1a; Bourne Shell(/usr/bin/sh或/bin/sh)Bourne Again Shell(/bin/bash)C Shell(/us…

《啊哈算法第四章之bfs》(17张图解)

源自《啊哈算法》 目录 bfs正文 题目 思路 完整代码1 完整代码2 再解炸弹人 题目 思路 完整代码1 完整代码2 总结 bfs正文 第四章--深度优先搜索中&#xff0c;我们用dfs找到了寻找小哈的最短路径 接下来&#xff0c;我们要用bfs&#xff08;Breadth First Sear…

04 |「链表」简析

前言 前言&#xff1a;研究一个数据结构的时候&#xff0c;首先讲的是增删改查。 文章目录前言一、链表简介1. 含义2. 节点组成3. 存储方式1&#xff09;数据在内存中的存储方式2&#xff09;单链表在内存中的存储方式3&#xff09;双链表在内存中的存储方式4&#xff09;循环链…

python-38-降低内存开销的python迭代器

【进阶Python】第五讲&#xff1a;迭代器与生成器 python 迭代器和生成器 迭代是Python中常用且非常强大的一个功能&#xff0c;它可以用于访问集合、列表、字符串、字典等数据结构的元素。 我们经常使用循环和条件语句&#xff0c;我们也清楚哪些是可以迭代访问&#xff0c;但…

结构型模式-代理模式

1.概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时&#xff0c;访问对象不适合或者不能直接引用目标对象&#xff0c;代理对象作为访问对象和目标对象之间的中介。 Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代理代理类在编译…

Nacos 配置中心源码讲解

目录 1. 配置中心的优点 2. 配置模型结构 3. 配置中心 Server 端实现原理 3.1 新建配置 / 发布配置 3.2 查询配置 4. 配置中心 Client 端实现原理 4.1 发布配置 4.2 查询配置 4.3 监听机制 Listener 1. 配置中心的优点 运行时动态修改系统参数配置&#xff0c;不用重启…

排序算法解析:快排,归并 (全)

一、快排原始快排 算法思想&#xff1a;ps&#xff1a;排序的效果其实就是使一个数列中的每个数都满足左边数比它小、右边数比它大&#xff08;假设升序&#xff09;。接下来我们来了解快排&#xff1a;多次递归遍历&#xff0c;每单次遍历&#xff0c;设定一个限定值&#xff…

02 |「数据结构、逻辑结构、物理结构」基本概念简析

前言 前言&#xff1a;简析数据结构、逻辑结构、物理结构。 文章目录前言一、数据结构1. 简介2. 数据3. 结构4. 分析5. 分类1&#xff09;线性结构&#xff08;线性表&#xff09;2&#xff09;树结构3&#xff09;图结构二、逻辑结构与物理结构1. 为什么要有逻辑结构和物理结构…