zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    智能推荐算法演变及学习笔记(三):CTR预估模型综述
    从中国农业银行“雅典娜杯”数据挖掘大赛看金融行业数据分析与建模方法
    智能推荐算法演变及学习笔记(二):基于图模型的智能推荐(含知识图谱/图神经网络)
    (设计模式专题3)模板方法模式
    (设计模式专题2)策略模式
    (设计模式专题1)为什么要使用设计模式?
    关于macOS上常用操作命令(持续更新)
    记录下关于RabbitMQ常用知识点(持续更新)
    EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
    SpringCloud教程二:Ribbon(Finchley版)
  • 原文地址:https://www.cnblogs.com/yizhipanghu/p/14694537.html
Copyright © 2011-2022 走看看