MENU

Prometheus+Grafana(六)Prometheus自动化监控

July 22, 2021 • Read: 901 • 默认分类

Prometheus服务发现

Prometheus添加被监控端支持两种方式:
• 静态配置:手动配置
• 服务发现:动态发现需要监控的Target实例
支持服务发现的来源:
• azure_sd_configs
• consul_sd_configs
• dns_sd_configs
• ec2_sd_configs
• openstack_sd_configs
• file_sd_configs
• gce_sd_configs
• kubernetes_sd_configs
• marathon_sd_configs
• nerve_sd_configs
• serverset_sd_configs
• triton_sd_configs

一、基于文件的服务发现

1、启用基于文件的服务发现:

- job_name: 'file_sd'
  file_sd_configs:
  - files: ['/opt/monitor/prometheus/sd_config/*.yml']  
    refresh_interval: 5s # 每隔5秒检查一次

2、创建目录:

mkdir /opt/monitor/prometheus/sd_config
cd /opt/monitor/prometheus/sd_config

3、生效加载Prometheus配置文件:

kill -HUP 进程号

4、编辑配置文件添加被监控端:

vim /opt/monitor/prometheus/sd_config/node.yml

- targets: ['192.168.31.62:9100','192.168.31.63:9100']

prometheus会自动读取并加载配置目录下的yml文件,就不用每次修改prometheus配置文件重新加载。

二、基于Consul的服务发现

Consul是一个分布式的服务发现和键/值存储系统。由server端和client端组成,每个server和client都是consul的一个节点,consul客户端不保存数据,客户端将接收到的请求转发给响应的Server端。Server之间通过局域网或广域网通信实现数据一致性。

prometheus基于consul的服务发现流程如下:

(1)在consul注册服务或注销服务(监控targets)

(2)Prometheus一直监视consul服务,当发现consul中符合要求的服务有新变化就会更新Prometheus监控对象

consul安装配置

Consul 安装很方便,官网 提供各个系统版本二进制安装包,解压安装即可,同时也可以通过 Docker 来快速安装。

Docker部署Consul:

docker run --name consul -d -p 8500:8500 consul

源码部署Consul:

mkdir /opt/monitor/consul/data -p  && cd /opt/monitor/consul
wget https://releases.hashicorp.com/consul/1.9.5/consul_1.9.5_linux_amd64.zip
unzip consul_1.9.5_linux_amd64.zip
./consul agent -dev   
#在开发模式下启动Consul代理。

警告:切勿-dev在生产模式下运行Consul 。生产环境建议使用集群(3台-5台奇数)

集群部署Consul:

在3个节点分别安装

mkdir /opt/monitor/consul/data -p  && cd /opt/monitor/consul
wget https://releases.hashicorp.com/consul/1.9.5/consul_1.9.5_linux_amd64.zip
unzip consul_1.9.5_linux_amd64.zip
mv consul /usr/bin/
consul version
Consul v1.9.5
Revision 3c1c22679
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)

// 启动192.168.0.25
consul agent -server -ui -bootstrap-expect=3 -data-dir=/opt/monitor/consul/data -node=server-1 -client=0.0.0.0 -bind=192.168.0.25 -datacenter=dc1

// 启动192.168.0.26,并加入192.168.0.25节点
consul agent -server -ui -bootstrap-expect=3 -data-dir=/opt/monitor/consul/data -node=server-2 -client=0.0.0.0 -bind=192.168.0.26 -datacenter=dc1 -join 192.168.0.25

// 启动192.168.0.27,并加入192.168.0.25节点
consul agent -server -ui -bootstrap-expect=3 -data-dir=/opt/monitor/consul/data -node=server-3 -client=0.0.0.0 -bind=192.168.0.27 -datacenter=dc1 -join 192.168.0.25

查看集群启动结果:

# consul members
Node      Address            Status  Type    Build  Protocol  DC   Segment
server-1  192.168.0.25:8301  alive   server  1.9.5  2         dc1  <all>
server-2  192.168.0.26:8301  alive   server  1.9.5  2         dc1  <all>
server-3  192.168.0.27:8301  alive   server  1.9.5  2         dc1  <all>

三台服务都起来后,我们可以访问Consul的WebUI控制台,WEB控制台默认端口为:8500,

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

服务注册到consul

使用HTT PAPI方式注册node-exporter服务到Consul

想学习详细内容可参考https://edu.51cto.com/sd/76993

向Consul注册服务:

curl -X PUT -d '{"id": "prometheus-1","name": "prometheus","address": "192.168.0.25","port":9100,"tags": ["service"],"checks": [{"http":"http://192.168.0.25:9100","interval":"5s"}]}' http://192.168.0.25:8500/v1/agent/service/register

注:上面看到的192.168.0.25,是consul的master1节点ip

若要把consul中注册的服务移除:

curl --request PUT http://192.168.0.25:8500/v1/agent/service/deregister/prometheus

prometheus基于consul服务发现的配置

在部署prometheus的机器上执行如下,

找到prometheus配置文件

vim /opt/monitor/prometheus/prometheus.yml

配置内容如下:

- job_name: 'consul'
  consul_sd_configs:
  - server: 192.168.0.25:8500
    services: []

说明一下:这里需要使用 consul_sd_configs 来配置使用 Consul 服务发现类型,server 为 Consul 的服务地址,这里跟上边要对应上。 配置完毕后,重启 Prometheus 服务,此时可以通过 Prometheus UI 页面的 Targets 下查看是否配置成功。

http://192.168.0.25:19090/targets#job-prometheus

可以看到,在 Targets 中能够成功的自动发现 Consul 中的 Services 信息,后期需要添加新的 Targets 时,只需要通过 API 往 Consul 中注册服务即可,Prometheus 就能自动发现该服务,是不是很方便。

不过,我们会发现有如下几个问题:

  1. 会发现 Prometheus 同时加载出来了默认服务 consul,这个是不需要的。
  2. 默认只显示 job 及 instance 两个标签,其他标签都默认属于 before relabeling 下,有些必要的服务信息,也想要在标签中展示,该如何操作呢?
  3. 如果需要自定义一些标签,例如 team、group、project 等关键分组信息,方便后边 alertmanager 进行告警规则匹配,该如何处理呢?
  4. 所有 Consul 中注册的 Service 都会默认加载到 Prometheus 下配置的 consul组,如果有多种类型的 exporter,如何在 Prometheus 中配置分配给指定类型的组,方便直观的区别它们?

以上问题,我们可以通过 Prometheus 配置中的 relabel_configs 参数来解决

配置 relabel_configs 实现自定义标签及分类

我们先来普及一下 relabel_configs 的功能, Prometheus 允许用户在采集任务设置中,通过 relabel_configs 来添加自定义的 Relabeling 的额过程,来对标签进行指定规则的重写。 Prometheus 加载 Targets 后,这些 Targets 会自动包含一些默认的标签,Target 以 _ 作为前置的标签是在系统内部使用的,这些标签不会被写入到样本数据中。眼尖的会发现,每次增加 Target 时会自动增加一个 instance 标签,而 instance 标签的内容刚好对应 Target 实例的_address_ 值,这是因为实际上 Prometheus 内部做了一次标签重写处理,默认 _address_ 标签设置为 <host>:<port>地址,经过标签重写后,默认会自动将该值设置为 instance 标签,所以我们能够在页面看到该标签。

详细 relabel_configs 配置及说明可以参考 relabel_config官网说明,这里我简单列举一下里面每个 relabel_action 的作用,方便下边演示。

  • replace: 根据 regex 的配置匹配 source_labels 标签的值(注意:多个 source_label 的值会按照 separator 进行拼接),并且将匹配到的值写入到 target_label 当中,如果有多个匹配组,则可以使用 ${1}, ${2} 确定写入的内容。如果没匹配到任何内容则不对 target_label 进行重新, 默认为 replace。
  • keep: 丢弃 source_labels 的值中没有匹配到 regex 正则表达式内容的 Target 实例
  • drop: 丢弃 source_labels 的值中匹配到 regex 正则表达式内容的 Target 实例
  • hashmod: 将 target_label 设置为关联的 source_label 的哈希模块
  • labelmap: 根据 regex 去匹配 Target 实例所有标签的名称(注意是名称),并且将捕获到的内容作为为新的标签名称,regex 匹配到标签的的值作为新标签的值
  • labeldrop: 对 Target 标签进行过滤,会移除匹配过滤条件的所有标签
  • labelkeep: 对 Target 标签进行过滤,会移除不匹配过滤条件的所有标签

接下来,我们来挨个处理上述问题。

问题一,我们可以配置 relabel_configs 来实现标签过滤,只加载符合规则的服务。以上边为例,可以通过过滤 _meta_consul_tags 标签为 test 的服务,relabel_config 向 Consul 注册服务的时候,只加载匹配 regex 表达式的标签的服务到自己的配置文件。修改 prometheus.yml 配置如下:

...
- job_name: 'consul'
    consul_sd_configs:
      - server: '192.168.0.25:8500'
        services: []
    relabel_configs:
      - source_labels: [__meta_consul_tags]
        regex: .*service.*
        action: keep

解释下,这里的 relabel_configs 配置作用为丢弃源标签中 _meta_consul_tags 不包含 service标签的服务,__meta_consul_tags 对应到 Consul 服务中的值为 "tags": ["service"],默认 consul 服务是不带该标签的,从而实现过滤。重启 Prometheus 可以看到现在只获取了注册成功的promeheus 这个服务了。

剩余的问题这里不再阐述,可以参考以下博客:

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

三、自动监控100台服务器思路

思路:

  1. ansible批量部署node_exporter
  2. 基于consul的服务发现
  3. 将node_exporter所在机器的IP和端口注册到consul里
  4. prometheus从consul里获取所有IP和端口自动加入监控

实际运维过程中按照分组管理,一般有Web服务器 、DB服务器、负载均衡服务器、消息队列服务器等。

例:"id": "web1","name": "webservers"

- job_name: 'webservers'
  #basic_auth:
   #username: prometheus
   #password: 123456
  consul_sd_configs:
  - server: 192.168.0.25:8500
    services: ["webservers"]
- job_name: 'dbservers'
  consul_sd_configs:
  - server: 192.168.0.25:8500
    services: ["dbservers"]
......

四、Ansible+Consul实现自动监控

安装Ansible

# yum -y install epel-release
# yum -y install ansible

准备工作

1、无密码登录

# ssh-keygen -t rsa
# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.0.X

2、创建工作目录

# mkdir /opt/monitor/ansible
# cd /opt/monitor/ansible

3、创建hosts

# vim hosts
[webserver]
192.168.0.X  name=web1
[dbserver]
192.168.0.X  name=db1

4、node_exporter二进制安装包

5、复制systemd文件

# cp /usr/lib/systemd/system/node_exporter.service ./
# cat node_exporter.service

[Unit]
Description=node_exporter
[Service]
ExecStart=/usr/local/node_exporter/node_exporter --collector.systemd --collector.systemd.unit-whitelist=(docker|sshd|nginx).service
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
 

6、注册脚本

# cat consul-register.sh

#!/bin/bash
service_name=$1
instance_id=$2
ip=$3
port=$4

curl -X PUT -d '{"id": "'"$instance_id"'","name": "'"$service_name"'","address": "'"$ip"'","port": '"$port"',"tags": ["'"$service_name"'"],"checks": [{"http": "http://'"$ip"':'"$port"'","interval": "5s"}]}' http://192.168.0.25:8500/v1/agent/service/register

7、编写playbook

# cat playbook.yaml

- hosts: webserver
  gather_facts: no
  vars:
    port: 9100
  tasks:
  - name: 推送二进制文件
    unarchive: src=node_exporter-1.1.2.linux-amd64.tar.gz dest=/usr/local
  - name: 重命名
    shell: |
         cd /usr/local
         if [ ! -d node_exporter ];then
             mv node_exporter-1.1.2.linux-amd64  node_exporter
         fi
  #- name: 推送配置文件
  #  copy: src=config.yml dest=/usr/local/node_exporter
  - name: 拷贝systemd文件
    copy: src=node_exporter.service dest=/usr/lib/systemd/system
  - name: 启动服务
    systemd: name=node_exporter state=started enabled=yes daemon_reload=yes
  - name: 推送注册脚本
    copy: src=consul-register.sh dest=/usr/local/bin/
  - name: 注册当前节点
    # 服务名 实例名 IP 端口 
    shell: /bin/bash /usr/local/bin/consul-register.sh {{ group_names[0] }} {{ name }} {{ inventory_hostname }} {{ port }}

8、修改Prometheus配置文件

...... 
- job_name: 'weberver'
    consul_sd_configs:
      - server: '192.168.0.25:8500'
        services: [weberver]

使用热加载生效配置文件

kill -HUP 进程号
或者
curl -XPOST IP:9090/-/reload重新加载

9、查看文件目录:

10、运行playbook:

ansible-playbook -i hosts playbook.yaml

查看prometheus是否获取到Targets:

[toc]

- - - The END - - -
  • 文章作者:谭先生
  • 版权所有:文章转载时,注明出处即可!
  • 本站部分资源收集于网络,纯个人收藏,无商业用途,如有侵权请及时告知!
  • Last Modified: July 27, 2021
    Archives QR Code Tip
    QR Code for this page
    Tipping QR Code
    阅读:901