prometheus服务发现之file、consul形式详细配置说明

本文介绍了Prometheus的配置方式,包括静态文件服务发现和动态文件服务发现,重点讲述了如何通过Consul配合ConfD实现规则文件的动态刷新,以及Consul的安装、服务注册与删除过程。此外,还展示了Prometheus配置文件中的服务发现配置示例,以及ConfD的配置和模板文件的使用方法。

📚概述

prometheus的配置都是基于文件的,不论是规则配置还是target的配置都是如此,每次新增配置和修改规则都需要操作配置文件,维护成本太高。
prometheus官方提供了多种服务发现机制。
介绍三种方式:基于静态文件、基于动态文件、基于consul的服务发现。
并介绍通过consul+confd实现规则文件动态刷新。

📗基于文件服务发现

🔖静态文件发现

静态文件发现,需要修改prometheus.yml配置文件,对于不变动的配置可以使用,例如alertmanager服务。

  - job_name: "prometheus"
    static_configs:
      - targets: ["10.0.204.66:29090"]

  - job_name: "alertmanager"
    static_configs:
      - targets: ["10.0.204.66:29093"]

🔖动态文件发现

🔖修改prometheus配置

基于文件的服务发现使用file_sd_configs并指定文件路径即可。文件格式可以是json格式。

  - job_name: "服务器监控"
    file_sd_configs:
      - files:
        - './node_config/*.json'   # 文件路径
        refresh_interval: 15s # 自动发现间隔时间,默认5m

json文件示例:

[
  {
    "targets": [
      "192.168.124.109:9182"
    ],
    "labels": {
      "id": "ff80808183d199270183d19b682a0008",
      "instance": "192.168.124.109",
      "ip": "192.168.124.109",
      "name": "lg测试101302",
      "systemType": "WINDOWS",
      "type": "server"
    }
  }
]

📙基于Consul服务发现

📖整理流程设计

confd原理

整理流程图

📃consul安装

🧩单机版安装

下载地址:https://developer.hashicorp.com/consul/downloads
image.png
配置acl,在consul配置文件目录下,可以读取hcl和json格式的配置文件
新增配置文件
全局配置文件:https://github.com/hashicorp/consul/blob/v1.14.3/agent/config/testdata/full-config.json

{
  "datacenter": "dc1",
  "data_dir": "../data",
  "log_level": "INFO",
  "node_name": "node1",
  "server": true,
  "bootstrap": true,
  "client_addr": "0.0.0.0",
  "bind_addr": "10.0.107.55",
  "bootstrap_expect": 1,
  "acl": {
    "enabled": true,
    "default_policy": "deny",
    "enable_token_persistence": true
  }
}

上传服务器,解压后启动。

# 启动
./consul agent -server -ui -bootstrap-expect=1 -client=0.0.0.0 -bind=10.0.107.55 -datacenter=dc1 -data-dir=/data/consul/data -config-dir=/data/consul/conf >> /data/consul/logs/consul.log &

参数说明:

- bootstrap-expect:集群期望的节点数,只有节点数量达到这个值才会选举leader。
- server: 运行在server模式
- data-dir:指定数据目录,其他的节点对于这个目录必须有读的权限
- node:指定节点的名称
- bind:为该节点绑定一个地址
- config-dir:指定配置文件,定义服务的,默认所有一.json结尾的文件都会读
- enable-script-checks=true:设置检查服务为可用
- datacenter: 数据中心没名称,
- join:加入到已有的集群中
- client:指定web  ui、的监听地址,默认127.0.0.1只能本机访问。

启动之后,访问http://ip:8500即可

Consul端口说明:
8300:集群内数据的读写和复制
8301:单个数据中心gossip协议通讯
8302:跨数据中心gossip协议通讯
8500:提供获取服务列表、注册服务、注销服务等HTTP接口;提供UI服务
8600:采用DNS协议提供服务发现功能

📖参考资料

参考资料:
SpringCloud之consul (服务注册发现)客户端的安装与简单使用|第十三章-yellowcong_狂飙的yellowcong的博客-CSDN博客

💡服务注册与删除

🧩更新注册服务

  • URL/v1/agent/service/register
  • MethodPUT
请求参数
{
  "id":"SERVER_10.0.204.143", // 服务id
  "name":"node_exporter", // 服务名称
  "address":"10.0.204.143", // IP地址
  "port": 9100, // 端口 int类型
  "tags": ["server"], // 标签
  "check":{
    "http":"http://10.0.204.143:9100/metrics", // 健康检查接口
    "interval":"1m" // 间隔时间
  },
  "meta":{  // 元数据信息 可以添加map形式的额外数据,String类型
    "gdmpId":"uuid-143222", 
    "gdmpName":"SERVER_10.0.204.143",
    "gdmpType":"server",
    "gdmpResItemType":"linux",
    "__metrics_path__":"/metrics"
  },
  "token":"your_token" // consul的token
}
{
	"service": {
		"name": "web",
		"tags": ["rails"],
		"port": 80,
		"checks": [{
			"id": "api", // 健康检查项的id,唯一
			"name": "HTTP API on port 5000", // 检查项的名字
			"http": "https://localhost:5000/health", // 定期访问的Url,通过这个url请求结果确定服务是否正常
			"tls_skip_verify": false, // 关闭tls验证
			"method": "POST", // 设置http请求方式,默认是GET
			"header": { // 可以自定义请求头,可以不配置
				"x-foo": ["bar", "baz"]
			},
			"interval": "10s", // 定期检查的时间间隔,这里是10秒
			"timeout": "1s" // 请求超时时间,1秒
		}]
	}
}

请求示例
curl -H "Content-Type: application/json" -XPUT http://127.0.0.1:8500/v1/agent/service/register -d '{
    "id":"SERVER_10.0.204.143",
    "name":"node_exporter",
    "address":"10.0.204.143",
    "port": 9100,
    "tags": ["server"],
    "check":{
        "http":"http://10.0.204.143:9100/metrics",
        "interval":"1m"
    },
    "meta":{
        "gdmpId":"uuid-143222",
        "gdmpName":"SERVER_10.0.204.143",
        "gdmpType":"server",
        "gdmpResItemType":"linux",
        "__metrics_path__":"/metrics"

    },
    "token":"your_token"
}'

🌵删除服务

  • URL/v1/agent/service/deregister/{serviceId}
  • MethodPUT
请求参数
参数名参数含义
serverId服务ID
请求示例
curl -H "Content-Type: application/json" -XPUT http://127.0.0.1:8500/v1/agent/service/deregister/89823324afs8jsf93sjfa 

☘️prometheus配置

  - job_name: '服务器监控'
    consul_sd_configs: 
      - server: '10.0.107.55:8500' 
      - services: ["node_exporter"] 
    relabel_configs:
      - source_labels: ["__meta_consul_tags"]
        regex: .*server.*
        action: keep
      - regex: __meta_consul_service_metadata_(.+)
        action: labelmap

说明:

  • consul_sd_configs定义当中通过server定义了Consul服务的访问地址,services则定义了当前需要发现哪些类型服务实例的信息,这里限定了只获取node_exporter的服务实例信息。
  • relabel_configs可以对标签进行重新配置,regex: __meta_consul_service_metadata_(.+)主要用于将注册到consul的元数据转化为label标签
  • source_labels通过正则匹配对于应的标签,只要符合条件的才会到【服务器监控】这个job中
  • action:重新标签动作
    • replace:默认,通过regex匹配source_label的值,使用replacement来引用表达式匹配的分组
    • keep:删除regex与连接不匹配的目标 source_labels
    • drop:删除regex与连接匹配的目标 source_labels
    • labeldrop:删除regex匹配的标签
    • labelkeep:删除regex不匹配的标签
    • hashmod:设置target_label为modulus连接的哈希值source_labels
    • labelmap:匹配regex所有标签名称。然后复制匹配标签的值进行分组,replacement分组引用( 1 , {1}, 1,{2},…)替代

image.png

🎋Confd规则配置

Confd是一个轻量级的配置管理工具。通过查询后端存储,结合配置模板引擎,保持本地配置最新,同时具备定期探测机制,配置变更自动reload
对应的后端存储可以是etcdrediszookeeperconsul等。
github地址:https://github.com/kelseyhightower/confd

🛒confd下载

# 下载二进制包,这里最新的就是0.16.0版本,2018年发布的release版本
wget https://github.com/kelseyhightower/confd/releases/download/v0.16.0/confd-0.16.0-linux-amd64
# 重命名二进制文件,并移动到安装的prometheus目录,/data/monitor/prometheus为prometheus安装目录
mv confd-0.16.0-linux-amd64 /data/monitor/prometheus/confd
chmod +x /data/monitor/prometheus/confd
# 验证是否安装成功
confd --help

🧵创建配置文件目录

需要在prometheus目录下进行创建

# 在prometheus目录下创建
mkdir  conf.d
mkdir templates
mkdir rules

image.png

说明:
conf.dconfd的配置文件,主要包含配置的生成逻辑,例如模板源,后端存储对应的keys,命令执行等。
templates:配置模板Template,即基于不同组件的配置,模板语法格式为:Golang text templates,可参考https://github.com/kelseyhightower/confd/blob/master/docs/templates.md

新增规则到consul

使用key/Value形式新增规则到consul
接口:

  • URL/v1/kv/prometheus/rules/{resType}/{key_id}
  • MethodPUT
  • 说明:
    • kv后就是以folder形式创建的key,有层级关系方便管理。
    • 结合业务场景,设计如下:resType为资源类型,如server、database等,规则文件按照类型分开维护,不至于一个规则文件太大。

数据:

{
	"ruleId":"rule_server_linux_001", # 规则ID,业务数据
	"name": "SERVER_LINUX", # 规则名称
	"rules": [
		{
			"alert": "143服务器运行状态",
			"expr": "up{instance=\"10.0.204.143:9100\"} == 0",
			"for": "5m",
			"labels": {
				"severity": "1"
			},
			"annotations": {
				"alarmRuleConfigCode": "UP_STATUS",
				"currentValue": "{{ $value }}",
				"thresholdValue": "运行状态 == 未连通",
				"description": "{{ $labels.name }}({{ $labels.ip }})的运行状态当前是未连通,请及时处理"
			}
		},
		{
			"alert": "66服务器运行状态",
			"expr": "mysql_up{job=\"10.0.204.66:9100\"} == 0",
			"for": "5m",
			"labels": {
				"severity": "3"
			},
			"annotations": {
				"alarmRuleConfigCode": "UP_STATUS",
				"currentValue": "{{ $value }}",
				"thresholdValue": "运行状态 == 未连通",
				"description": "{{ $labels.name }}({{ $labels.ip }})的运行状态当前是未连通,请及时处理"
			}
		}
	]
}

image.png

配置模板文件templates/server_rule.conf.tmpl
groups: {{range gets "/prometheus/rules/server/*"}}{{$data := json .Value}}
- name: '{{$data.name}}_{{$data.ruleId}}'
  rules:  {{range $data.rules}}
  - alert: '{{.alert}}'
    expr: {{.expr}}
    for: {{.holdDuration}}
    labels:
      severity: {{.labels.severity}}
    annotations:
      description: '{{.annotations.description}}'
      currentValue: '{{.annotations.currentValue}}'
      thresholdValue: '{{.annotations.thresholdValue}}'
      alarmRuleConfigCode: '{{.annotations.alarmRuleConfigCode}}'
  {{end}}
{{end}}

注意:
模板中groups下的name在同一个文件中不能重复,否者prometheus进行reload时会报错。

新增confd的配置文件conf.d/server.toml

[template]
src = "../templates/server_rules.conf.tmpl"  # 模板路径
dest = "/data/monitor/prometheus/rules/server_rules.yml" # 最终生成的文件路径
keys = ["/prometheus/rules/server"]  # 指定key
# check_cmd = "touch /tmp/check" #检查命令,nginx这类软件有nginx -c ,prometheus没有检查命令,直接reload即可
reload_cmd = "/usr/bin/curl --connect-timeout 5 --retry 5 --retry-max-time 40 -X POST http://127.0.0.1:29090/-/reload" # reload prometheus
启动confd

在prometheus下启动confd

nohup ./confd -interval 15 -log-level info -confdir ./ -config-file conf.d/config.toml -backend consul -node 10.0.107.55:8500 &>>./logs/confd.log &

🔩confd配置说明

为了避免一个规则文件过大,将规则文件拆分为不同的文件,方便维护和管理。同时为了兼容不属于指定类型的,提供了默认的规则文件【在prometheus配置服务中控制】。目录结构如下。

.
├── confd # 二进制启动文件
├── conf.d  # 配置目录
│   ├── application.toml # 应用服务配置
│   ├── database.toml  # 数据库配置
│   ├── default.toml # 默认配置,不属于指定类型的都在这个类型中
│   ├── middleware.toml # 中间件配置
│   └── server.toml # 服务器配置
├── stopconfd.sh # 停止脚本
├── stopconf.sh # 启动脚本
└── templates
    ├── application_rules.conf.tmpl # 应用服务规则模板文件
    ├── database_rules.conf.tmpl # 数据库规则模板文件
    ├── default_rules.conf.tmpl  # 默认规则模板文件
    ├── middleware_rules.conf.tmpl # 中间件爱你规则模板文件
    └── server_rules.conf.tmpl # 服务器规则模板文件

🎫promethus规则文件配置

修改prometheus.yml,指定规则文件路径即可

rule_files:
  - "./rules/*.yml"

📄prometheus.yml配置文件示例

# my global config
global:
  scrape_interval: 1m # 采集间隔 Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 1m # 监控规则评估时间间隔 Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
# 可以采用consul形式,也可以直接使用static形式配置
alerting:
  alertmanagers:
    - consul_sd_configs:
        - server: "10.0.169.95:8500"
          tags:
            - "alertmanager"
    #- static_configs:
    #    - targets:
    #       - 127.0.0.1:29093
    #   - targets:
    #      - 192.168.124.75:18880

# 配置规则文件路径
rule_files:
  - "./rules/*.yml"

scrape_configs:

  # static_configs 静态配置
  - job_name: "alertmanager"
    static_configs:
      - targets: ["127.0.0.1:29093"]

  # 动态文件服务发现
  - job_name: "数据库监控"
    file_sd_configs:
      - files:
          - './database_config/*.json'   # 文件路径
        refresh_interval: 15s # 自动发现间隔时间,默认5m

  # 基于consul的服务发现配置
  - job_name: '服务器监控'
    consul_sd_configs:
      - server: '10.0.107.55:8500' # consul服务地址
      - services: ["node_exporter"] # 服务名称,配置后,当前job只监控指定的服务
    relabel_configs:
      - source_labels: ["__meta_consul_tags"] # tag标签,可以用于分组,打标签
        regex: .*server.*  # 正则匹配,包含tags中包含server都会被记录到【服务器监控】这个job中
        action: keep # 具体操作,   删除与regex不匹配的目标 source_labels
        # 解析medata数据,作为标签使用,在consul中可以新增meta数据,这里直接解析作为label使用
      - regex: __meta_consul_service_metadata_(.+)
        action: labelmap

  - job_name: 'graylog监控'
    basic_auth:
      username: admin
      password: admin123graylog
    consul_sd_configs:
      - server: '10.0.107.55:8500'
      - services: ["graylog"]
    relabel_configs:
      - source_labels: ["__meta_consul_tags"]
        regex: .*graylog.*
        action: keep
      - regex: __meta_consul_service_metadata_(.+)
        action: labelmap

📖参考资料

  1. prometheus服务发现 - PunchLinux - 博客园
  2. 拿到40k的offer入职,第一个任务就是搭建一套最牛监控平台!
  3. 【Prometheus】Prometheus 集群与高可用_Young丶的博客-CSDN博客_prometheus 集群
  4. prometheus relabel_configs - 快乐嘉年华 - 博客园
  5. 基于Consul的服务发现 · Prometheus中文技术文档
  6. Nacos + Confd实现Prometheus规则动态更新_Brent-CCNU的博客-CSDN博客
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值