系列文章目录
运维监控平台搭建
运维监控平台监控标签
golang_Consul代码实现Prometheus监控目标的注册以及动态发现与配置V1版本
文章目录
目的
1、在面临多个监控指标时,实现快速的将指标注册到consul中,Prometheus使用consul服务发现实现监控
2、编写脚本实现自定义监控指标
3、自定监控项监控配置调试
提示:以下是本篇文章正文内容,下面案例可供参考
一、监控指标注册到consul的golang脚本开发
在之前就已经发布过golang_Consul代码实现Prometheus监控目标的注册以及动态发现与配置脚本。如顶部第三个文章链接。
虽然之前写的脚本已经实现了注册服务器ip、微服务ip和端口、url等到consul中,但是只能适用于无密码、无token的consul
但是现在的运维平台consul是开启了ACL认证的,因此需要对脚本做出部分修改。修改部分如下所示
因为之前在https://blog.csdn.net/weixin_50902636/article/details/139903589文章中已经对该注册脚本进行了分析讲解及使用示例,因此在本篇文章中不做过多描述,只对修改部分示例。同时更新后的脚本已上传至csdn资源中,需要的自行下载即可
1、修改settings.yaml文件
consul:
ip: "192.168.56.131"
port: 8500
acl_status: true #新添加字段,判断是否开启了acl认证
token: "a0de7f26-127b-cd67-f01e-477c212d7c48" #新添加字段,consul开启acl后的认证token。其余字段保持不变
service_name:
- "Host_Status"
- "ICMP"
- "Telegraf"
- "Service_TCP"
- "Service_URL"
xlsx:
xlsxfile_path: "/export/wxd/prometheus_import_consul/host_monitor_datasource.xlsx"
sheet_name:
- "hostinfo"
- "serviceinfo"
- "serviceurlInfo"
jsonfile:
hostjson_path: "/export/wxd/prometheus_import_consul/jsonfile/host.json"
servicejson_path: "/export/wxd/prometheus_import_consul/jsonfile/service.json"
serviceurljson_path: "/export/wxd/prometheus_import_consul/jsonfile/serviceUrl.json"
2、修改config/ocnsul,go文件
package config
import "fmt"
//连接consul的ip、端口
type Consul struct {
IP string `yaml:"ip"`
Port int `yaml:"port"`
Acl_Status bool `yaml:"acl_status"` #将yaml文件中新增加的字段 添加到结构体中,用于字段解析初始化
Token string `yaml:"token"` #将yaml文件中新增加的字段 添加到结构体中,用于字段解析初始化
ServiceName []string `yaml:"service_name"`
}
func (c *Consul) URL() string {
return fmt.Sprintf("%s:%d", c.IP, c.Port)
}
3、修改core/consul.go文件
package core
import (
"log"
"prometheus_import_consul/global"
"github.com/hashicorp/consul/api"
)
// consul 初始化
func ConsulConnect() (*api.Client, error) {
config := api.DefaultConfig()
// 新添加 根据 acl_status 判断是否使用 acl_Token
if global.Config.Consul.Acl_Status {
config.Token = global.Config.Consul.Token
log.Printf("consul ACL authentication is enabled. Using token: %s", config.Token)
} else {
log.Println("consul ACL authentication is disabled. Not using any token.")
}
config.Address = global.Config.Consul.URL()
if client, err := api.NewClient(config); err != nil {
return nil, err
} else {
return client, nil
}
}
其余代码不变,如果有需要新增其他类型的监控,在修改代码即可
4、脚本演示
4.1、准备整理好的监控指标文件xlsx格式
4.2、注册上述监控指标到consul 中
代码构建为二进制程序
[root@python2 prometheus_import_consul]# sh scripts/launch.sh build prometheus_consul
[root@python2 prometheus_import_consul]# cat scripts/nohup.out
解析xlsx文件中所有sheet页为json文件
[root@python2 prometheus_import_consul]# sh scripts/launch.sh run-execToAllJson prometheus_consul
将转换为json格式的文件注册到consul中
[root@python2 prometheus_import_consul]# sh scripts/launch.sh run-all prometheus_consul
检查consul web中是否已有上述注册信息
如上图所示,golang脚本已完美的实现监控指标注册功能。具体的脚本功能请自行下载查看
二、Prometheus使用consul服务发现配置
修改prometheus.yml文件,使其监控已经注册到consul中的监控指标
1.修改prometheus.yml文件
文件如下(示例):
- job_name: "consul-prometheus"
consul_sd_configs:
- server: '192.168.56.131:8500'
token: "a0de7f26-127b-cd67-f01e-477c212d7c48"
relabel_configs:
- source_labels: ['__meta_consul_service']
regex: .*monitor_agent.*
action: keep
- source_labels: ['__meta_consul_service_address']
target_label: ip
- source_labels: ['__meta_consul_service_port']
target_label: port
- job_name: 'Host_Status'
metrics_path: /probe
params:
module: [icmp]
scrape_interval: 60s
scrape_timeout: 2s
consul_sd_configs:
- server: '192.168.56.131:8500'
services: []
token: "a0de7f26-127b-cd67-f01e-477c212d7c48"
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*Host_Status.*
action: keep
- source_labels: [__meta_consul_service_address]
target_label: __param_target
- target_label: __address__
replacement: 192.168.56.131:9115
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
- job_name: 'Service_tcp'
scrape_interval: 60s
scrape_timeout: 5s
metrics_path: /probe
params:
module: [tcp_connect]
consul_sd_configs:
- server: '192.168.56.131:8500'
services: []
token: "a0de7f26-127b-cd67-f01e-477c212d7c48"
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*Service_TCP.*
action: keep
- source_labels: [__address__]
target_label: __param_target
- target_label: __address__
replacement: 192.168.56.131:9115
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
- job_name: 'Service_url'
scrape_interval: 60s
scrape_timeout: 5s
metrics_path: /probe
params:
module: [http_2xx]
consul_sd_configs:
- server: '192.168.56.131:8500'
services: []
token: "a0de7f26-127b-cd67-f01e-477c212d7c48"
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*Service_URL.*
action: keep
- source_labels: [__meta_consul_service_metadata_url]
target_label: __param_target
- target_label: __address__
replacement: 192.168.56.131:9115
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
- job_name: icmp
params:
module:
- icmp
scrape_interval: 60s
scrape_timeout: 2s
metrics_path: /probe
consul_sd_configs:
- server: 192.168.56.131:8500
token: "a0de7f26-127b-cd67-f01e-477c212d7c48"
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*,prometheus-icmp,.* # 扫描对应的组的信息
action: keep
- source_labels: [__meta_consul_tags]
regex: .*,ICMP:([^,]+),.*
replacement: '${1}'
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
- target_label: __address__
replacement: localhost:9115
2、telegraf配置自定义监控项
2.1、示例1: 监控内核参数
代码如下(示例):
当在https://github.com/influxdata/telegraf/tree/release-1.30/plugins/inputs
中不到对应的服务监控配置时,则可以使用自定义监控项的方式实现监控。
在github中可以找到大部分开源组件的telegraf的监控配置,粘贴修改后即可使用。
先看结果
实现过程
需求:
需要通过监控telegraf组件实现对10.192.10.14服务器的/etc/sysctl.conf中配置的内核参数进行监控
实现过程:
1、联想到zabbix监控可以通过agent端编辑相关的conf文件,且conf文件中编写脚本或者其他采集发送,实现某个时刻组件的监控,因此再telegraf/scripts目录下也用同样方式测试是否能实现
2、在10.192.10.14机器的/opt/monitor/telegraf/scripts/目录下,增加一个探测的脚本文件check_tcp_timesmaps.sh,并授权执行权限。脚本内容如下
#!/bin/bash
# 读取net.ipv4.tcp_timestamps的值
value=$(sysctl net.ipv4.tcp_timestamps | awk '{print $3}')
# 输出为InfluxDB格式的指标
echo "tcp_timestamps value=$value" #其中tcp_timestamps为监控项,也就是使用它可以在prometheus的web界面中查看对应的数据,即它就是一个自定义的PromQL.
3、在10.192.10.14机器的/opt/monitor/telegraf/etc/telegraf/telegraf.d/目录下新增类似zabbix中的conf文件,配置如下
[[inputs.exec]] #使用telegraf的exec插件,它还有inputs.中间件名 的插件
#指定脚本位置
commands = ["/opt/monitor/telegraf/scripts/check_tcp_timestamps.sh"]
#探测超时时间
timeout = "5s"
#数据格式,通常为influx类型
data_format = "influx"
4、在10.192.10.14机器的/opt/monitor/telegraf/etc/telegraf/telegraf.conf主配置文件中,必须添加以下配置.配置Prometheus从Telegraf抓取对应的指标
[[outputs.prometheus_client]]
listen = ":9273"
5、在监控机器中配置对应的yml告警规则
增加 /opt/monitor/prometheus/rules/sysctl_tcp_timesamps.yml文件,配置文件如下
groups:
- name: tcp_timestamps_check
rules:
- alert: TCPTimestampsDisabled
expr: tcp_timestamps != 0
for: 1m
labels:
severity: warning
annotations:
summary: "TCP Timestamps is not disabled (host {{ $labels.instance }})"
description: "net.ipv4.tcp_timestamps is expected to be 0 but is {{ $value }} on {{ $labels.instance }}"
三、监控接口配置示例
将接口以静态服务发现方式添加到prometheus.yml中
- job_name: 'V3getActivityInfo'
metrics_path: /probe
params:
module: [v3getActivityInfo] #等价于blackbox.yml文件中定义的名称
static_configs:
- targets: ['https://xxxx/activity/V3/getActivityInfo']
labels:
servicetype: '活动查询接口V3POST'
monitortype: 'business_monitor'
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: localhost:9115
通过黑盒监控,修改balckbox_exporter.yml文件中添加该接口的请求方式、请求体及返回值
V3getActivityInfo:
prober: http
timeout: 5s
http:
method: POST #可以替换为对应的请求方式
preferred_ip_protocol: "ip4" #defaults to "ip6"
valid_http_versions: ["HTTP/1.1","HTTP/2.0"]
valid_status_codes: [200] #defaults to 2xx 如果返回的 HTTP 状态码不在 valid_status_codes 指定的范围内,则会被认为是探测失败
headers: #配置post请求的header头
Content-Type: application/json
ClientId: xxxxxxxxxx
body: '{"data": {"signData": "72KFee7x9izEYwvrmOfh/KgzzdjNjf6Ud1Wk19BJZnClY/Q79/rEt9wkspsY/uQYleg9igJ1R5xUTEPWAoRdT111A=="}}'
fail_if_body_not_matches_regexp: #如果响应体中不包含匹配该正则表达式的内容,则探测被视为失败
- '30001'
至此,接口监控已完成