Prometheus运维监控平台之监控指标注册到consul脚本开发、自定义监控项采集配置调试(三)

发布于:2024-10-18 ⋅ 阅读:(37) ⋅ 点赞:(0)

系列文章目录

运维监控平台搭建
运维监控平台监控标签
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'

至此,接口监控已完成