• Prometheus 通过 consul 实现自动服务发现


    1、Consul 介绍

    Consul 是基于 GO 语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。Consul 提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能。之前我们通过 Prometheus 实现监控,当新增一个 Target 时,需要变更服务器上的配置文件,即使使用 file_sd_configs 配置,也需要登录服务器修改对应 Json 文件,会非常麻烦。不过 Prometheus 官方支持多种自动服务发现的类型,其中就支持 Consul。

    2、环境、软件准备

    本次演示环境,是在Centos7 系统来执行操作,以下是安装的软件及版本:

    • System: CentOS Linux release 7.4.1708 (Core)
    • Docker: Docker version 20.10.3, build 48d30b5
    • Prometheus: Version 2.25.2
    • Consul: 1.6.1

    注意:方便启动 Prometheus、Consul服务,我使用 Docker 方式启动,,这里忽略 Docker 的安装过程。其中 Prometheus 安装配置,可以参照之前文章 基于Centos7.4搭建prometheus+grafana+altertManger监控Spring Boot微服务(docker版),这里着重介绍一下如何启动并配置 Consul 并配置 Prometheus 基于 Consul 实现自动服务发现。

    3、Consul 安装配置

    使用 Docker 启动 Consul 单节点服务,直接获取最新版官方镜像 consul:latest 命令如下:

    [root@pro-gra-alt prometheus]# docker run --name consul -d -p 8500:8500 consul
    

    启动完毕后,浏览器访问 http://ip:8500 地址(ip为宿主机地址),即可打开 Consul Web 管理页面。可以看到默认只有 consul 一个 Service,后期我们注册到 Consul 的 Service 都可以从页面上看到,非常直观。

    4、API 注册服务到 Consul

    接下来,我们要注册服务到 Consul 中,可以通过其提供的 API 标准接口来添加。那么先注册一个测试服务,该测试数据为spring boot微服务,服务地址及端口为 spring boot 提供指标数据的地址,执行如下命令:

    curl -X PUT -d '{"id": "springboot-anops","name": "anops-10.10.10.10:80","address": "10.10.10.10","port": 80,"tags": ["prometheus-target"],"checks": [{"http": "http://10.10.10.10:80/actuator/prometheus", "interval": "5s"}]}'  http://10.10.10.2:8500/v1/agent/service/register

    脚本批量执行:

    [root@monitor consul]# cat regdit.sh
    #!/bin/bash
    
    proj_array=(agent:10.10.10.9:8080 anops:10.10.10.8:8765)
    
    for((i=0;i<${#proj_array[*]};i++))
    do
            proj_name=`echo ${proj_array[i]} |awk -F':' '{print $1}'`
            ip_a=`echo ${proj_array[i]} |awk -F':' '{print $2}'`
            port=`echo ${proj_array[i]} |awk -F':' '{print $3}'`
            if [ "${proj_name}" == "agent" ];then
                    curl -X PUT -d '{"id": "springboot-'${proj_name}'","name": "'${proj_name}'-'${ip_a}':'${port}'","address": "'${ip_a}'","port": '${port}',"tags": ["prometheus-target"],"checks": [{"http": "http://'${ip_a}':'${port}'/agent/actuator/prometheus", "interval": "5s"}]}'  http://10.10.10.2:8500/v1/agent/service/register
            else
                    curl -X PUT -d '{"id": "springboot-'${proj_name}'","name": "'${proj_name}'-'${ip_a}':'${port}'","address": "'${ip_a}'","port": '${port}',"tags": ["prometheus-target"],"checks": [{"http": "http://'${ip_a}':'${port}'/actuator/prometheus", "interval": "5s"}]}'  http://10.10.10.2:8500/v1/agent/service/register
            fi
    done
    [root@monitor consul]#
    

      

    执行完毕后,刷新一下 Consul Web 控制台页面,可以看到成功注册到 Consul 中。

     如果要注销掉某个服务,可以通过如下 API 命令操作,例如注销上边添加的 spring boot微服务

    curl -X PUT http://10.10.10.2:8500/v1/agent/service/deregister/springboot-anops
    

     

    5、配置 Prometheus 实现自动服务发现

    现在 Consul 服务已经启动完毕,并成功注册了一个服务,接下来,我们需要配置 Prometheus 来使用 Consul 自动服务发现,目的就是能够将上边添加的服务自动发现到 Prometheus 的 Targets 中,增加 prometheus.yml 配置如下:

    [root@pro-gra-alt prometheus]# cat prometheus.yml
    global:
      scrape_interval:     60s
      evaluation_interval: 60s
    
    scrape_configs:
      - job_name: prometheus
        static_configs:
          - targets: ['10.10.10.2:9090']
            labels:
              instance: prometheus
    
      - job_name: 'consul-prometheus'
        consul_sd_configs:
        - server: '10.10.10.2:8500'
    
        relabel_configs:
        - source_labels: [__metrics_path__]
          regex: /metrics
          target_label: __metrics_path__
          replacement: /actuator/prometheus
          action: replace
        - source_labels: [__meta_consul_service_id]
          regex: springboot-agent
          target_label: __metrics_path__
          replacement: /agent/actuator/prometheus
          action: replace
        - source_labels: [__meta_consul_service]
          separator: ;
          regex: (.*)
          target_label: application
          replacement: $1
          action: replace
        - source_labels: [__address__]
          separator: ":"
          regex: (127.0.0.1):(.*)
          target_label: __address__
          replacement: 10.10.10.2:${2}
          action: replace
        - source_labels: ['__meta_consul_tags']
          regex: '^.*,prometheus-target,.*$'
          action: keep
    
    alerting:
      alertmanagers:
      - static_configs:
        - targets:
           - 10.10.10.2:9093
    
    rule_files:
      - "/usr/local/prometheus/rules/*.rules"
    [root@pro-gra-alt prometheus]#

    其中 :

    • consul_sd_configs指定 Consul 的地址
    • relabel_configs 指定配置标签覆盖规则
    • __meta_consul_service
        - source_labels: [__meta_consul_service]
          separator: ;
          regex: (.*)
          target_label: application
          replacement: $1
          action: replace

    这个配置是将 __meta_consul_service 重新映射为 application字段,方便 Prometheus 查询  

    • __metrics_path__
        - source_labels: [__metrics_path__]
          regex: /metrics
          target_label: __metrics_path__
          replacement: /actuator/prometheus
          action: replace

    这个配置是为了将 Prometheus 默认的拉取数据 /metrics改成 /actuator/prometheus,方便从 Spring拉取,如果有多种不同的应用,数据路径不一样,建议设置多个job,以使用不同的规则

        - source_labels: [__meta_consul_service_id]
          regex: springboot-agent
          target_label: __metrics_path__
          replacement: /agent/actuator/prometheus
          action: replace

    这个配置是匹配到__meta_consul_service_id 为 sprintboot-agent 时,将__metrics_path__的值替换为/agent/actuator/prometheus (因为该微服务比其他微服务多了/agent,因此单独过滤)

    • __meta_consul_tags
        - source_labels: ['__meta_consul_tags']
          regex: '^.*,prometheus-target,.*$'
          action: keep
    

    这个配置是为了筛选指定tag的应用,只有有这个tag的应用才会拉取监控数据,这里是 prometheus-target,是在 Spring Boot的配置文件中配置的,这样就可以避免拉取不相关的数据的应用(如 Consul自己的数据,替换路径为/actuator/prometheus后无法获取到监控数据)

    配置完成后重新创建 Prometheus容器,配置文件挂载到宿主机

    docker run -d -p 9090:9090 --name prometheus -v /etc/localtime:/etc/localtime -v /jws/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /jws/prometheus/rules/node-up.rules:/usr/local/prometheus/rules/node-up.rules prom/prometheus --config.file=/etc/prometheus/prometheus.yml --web.enable-lifecycle
    

    重新创建容器后查看Prometheus UI 页面的 Targets 或者Service Discovery是否配置成功

    参考:https://cloud.tencent.com/developer/article/1536967

    参考:https://hellowoodes.blog.csdn.net/article/details/106159160

    参考:https://www.prometheus.wang/promql/prometheus-promql-functions.html

  • 相关阅读:
    POJ 1680 Fork() Makes Trouble
    课堂改进意见
    梦断代码 读后感3
    梦断代码 读后感2
    找一问题
    软件评价——搜狗输入法
    《梦断代码》读后感1
    站立会议第十天
    站立会议第九天
    站立会议第八天
  • 原文地址:https://www.cnblogs.com/yizhipanghu/p/14694537.html
Copyright © 2020-2023  润新知