8.3 修改mysqld_exporter源码 ,改造成类似blackbox的探针型,实现一对多探测

news2024/9/26 5:25:00

本节重点介绍 :

  • 官方的mysqld_exporter问题
    • 只能一对一
    • 不能像探针一样采集多个实例
    • dsn需要配置环境变量或者配置文件解析
  • 需求说明 改造成类似blackbox的探针型,实现一对多探测
  • 改造方案
    • 修改源码
    • prometheus配置文件传参和实例地址获取
    • 改造grafana大盘配置成可以切换instance变量

问题描述

官方的mysqld_exporter问题

  • 只能一个mysqld_exporter对应一个mysqld实例
  • mysql 连接串dsn需要通过如配置文件或者 DATA_SOURCE_NAME 环境变量注入,下面展示之前讲过的环境变量方法
cat <<EOF >mysqld_exporter.service
[Unit]
Description=mysqld_exporter Exporter
Wants=network-online.target
After=network-online.target

[Service]
Environment=DATA_SOURCE_NAME=exporter:123123@tcp/
ExecStart=/opt/app/mysqld_exporter/mysqld_exporter
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=mysqld_exporter
[Install]
WantedBy=default.target
EOF
  • 如果没有dsn配置,那么启动服务的时候会直接报错退出
INFO[0000] Starting mysqld_exporter (version=0.12.1, branch=HEAD, revision=48667bf7c3b438b5e93b259f3d17b70a7c9aff96)  source="mysqld_exporter.go:257"
INFO[0000] Build context (go=go1.12.7, user=root@0b3e56a7bc0a, date=20190729-12:35:58)  source="mysqld_exporter.go:258"
FATA[0000] failed reading ini file: open /root/.my.cnf: no such file or directory  source="mysqld_exporter.go:264"

为何官方要求设计成一对一的模型

  • 主要是云原生环境下,一对一可以以sidecar模式部署
  • 但是mysqld一般不运行在k8s中

改造代码解决方案

需求说明

  • 改造mysqld_exporter 使之可以http传参dsn,变成一个blackbox_exporter形式的探针
http://172.20.70.205:9105/probe?dsn=root:123123@tcp(172.20.70.205:3306)/
  • 这样一个mysqld_exporter 探针可以探测多个mysql实例
  • 通过relabel正则解析dsn,获取instance标签

代码改造方案

首先注释掉代码中dsn的检查限制

  • 代码位置 D:\go_path\pkg\mod\github.com\prometheus\mysqld_exporter@v0.12.1\mysqld_exporter.go
	dsn = os.Getenv("DATA_SOURCE_NAME")
	if len(dsn) == 0 {
		var err error
		if dsn, err = parseMycnf(*configMycnf); err != nil {
			log.Fatal(err)
		}
	}

添加一个/probe 处理的handler方法

  • 代码位置 D:\go_path\pkg\mod\github.com\prometheus\mysqld_exporter@v0.12.1\mysqld_exporter.go
	http.HandleFunc("/probe", func(w http.ResponseWriter, r *http.Request) {

		collector.ProbeHandler(w, r, collector.NewMetrics(), enabledScrapers, logger)

	})
  • 这个函数的作用是,处理http请求 /probe path

collect中添加一个 probe 处理函数

  • 代码位置 D:\go_path\src\github.com\ning1875\mysqld_exporter\collector\exporter.go
func ProbeHandler(w http.ResponseWriter, r *http.Request, metrics Metrics, scrapers []Scraper, logger log.Logger) {
	dsn := r.URL.Query().Get("dsn")
	if dsn == "" {
		http.Error(w, fmt.Sprintf("dsn empty %q", dsn), http.StatusBadRequest)
		return
	}
	mysqlExp := New(r.Context(), dsn, metrics, scrapers, logger)
	registry := prometheus.NewRegistry()
	registry.MustRegister(mysqlExp)
	h := promhttp.HandlerFor(registry, promhttp.HandlerOpts{})
	h.ServeHTTP(w, r)
}
  • 流程解释,先解析 dsn参数
  • 根据dsn参数创建一个 mysqlExporter对象
  • mysqlExporter对象中实现了 prometheus sdk中的Collector接口
func (e *Exporter) Describe(ch chan<- *prometheus.Desc) {
	ch <- e.metrics.TotalScrapes.Desc()
	ch <- e.metrics.Error.Desc()
	e.metrics.ScrapeErrors.Describe(ch)
	ch <- e.metrics.MySQLUp.Desc()
}

// Collect implements prometheus.Collector.
func (e *Exporter) Collect(ch chan<- prometheus.Metric) {
	e.scrape(e.ctx, ch)

	ch <- e.metrics.TotalScrapes
	ch <- e.metrics.Error
	e.metrics.ScrapeErrors.Collect(ch)
	ch <- e.metrics.MySQLUp
}

  • 然后将这个 mysqlExp注册到prometheus的registry中
  • 然后用 promhttp.HandlerFor处理即可

打包代码然后编译运行

  • 编译
go build -v -o mysqld_exporter mysqld_exporter.go 
  • 或者直接下载二进制
# 下载二进制
wget https://github.com/ning1875/mysqld_exporter/releases/download/v0.12.1/mysqld_exporter-0.12.1.linux-amd64.tar.gz

  • 运行
./mysqld_exporter 
  • 浏览器访问或者curl测试如下
curl 'http://localhost:9104/probe?dsn=root:123123@tcp(localhost:3306)/'
  • dsn还是常规的dsn : user=root ,pass=123123 ,host=localhost ,port=3306
  • 如果能显示metrics接口证明ok
  • 举例图片
  • image.png

prometheus配置文件传参和实例地址获取

  • 配置文件实例如下
  • 通过replace正则替换获取 dsn中的mysql实例地址,即 ip+端口
  - job_name: 'mysql_exporter'
    metrics_path: /probe
    static_configs:
      - targets:
        - user1:pass1@tcp(mysql1:port1)/
        - user2:pass2@tcp(mysql2:port2)/

    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_dsn
      - source_labels: [__param_dsn]
        target_label: instance
        regex: .*tcp\((.*?)\).*
        replacement: $1
        action: replace

      - target_label: __address__
        replacement: localhost:9104 # 修改后的mysqld_exporter地址
  • target页面检查,举例图片
  • image.png
  • prometheus查询指标,一个mysql指标如果有两个instance标签说明正常,举例图片
  • image.png

改造grafana大盘配置成可以切换instance变量

  • 设置host变量 label_values(mysql_up{}, instance)
  • 测试host变量切换 ,举例图片
  • image.png

本节重点总结 :

  • 官方的mysqld_exporter问题
    • 只能一对一
    • 不能像探针一样采集多个实例
    • dsn需要配置环境变量或者配置文件解析
  • 需求说明 改造成类似blackbox的探针型,实现一对多探测
  • 改造方案
    • 修改源码
    • prometheus配置文件传参和实例地址获取
    • 改造grafana大盘配置成可以切换instance变量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1981198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【实用指南】如何选择最适合您的圆形连接器?

圆形连接器是一种电子连接器&#xff0c;其基本结构为圆柱形并且拥有圆形的配合面&#xff0c;这种设计使得它们在物理上区别于矩形或其他形状的连接器。它们通常用于设备之间的互连&#xff0c;属于互连分类中的第5类。 圆形连接器的主要组成部分包括&#xff1a; 插头&#…

引用率全球Top2%大佬耗时几年编写深度学习神书分享!!

介绍 这本深度学习书籍是由一位拥有多重职称和荣誉的顶尖科学家所打造&#xff0c;被评为全球引用率最高的2%科学家之一。这本书被认为是目前最全面系统的深度学习著作&#xff0c;涵盖了深度学习的主流算法模型&#xff0c;对于研究生和博士生具有极高的参考价值。这份完整版…

FPGA的工作本科可以做吗?

在FPGA行业中&#xff0c;这样的偏见一直存在。 很多人认为&#xff0c;只有985、211的硕士才有资格涉足这一领域&#xff0c;甚至有人表示&#xff0c;即使是9、2本硕也难以找到工作&#xff0c;本科生就不要想了。 难到真的只有985&#xff0c;211的研究生才能有机会入行FPG…

人工智能深度学习系列—GANs的对抗博弈:深入解析Adversarial Loss

文章目录 1. 背景介绍2. Adversarial Loss计算公式3. 使用场景4. 代码样例5. 总结 1. 背景介绍 生成对抗网络&#xff08;GANs&#xff09;作为深度学习中的一大突破&#xff0c;其核心机制是通过对抗性训练生成逼真的数据。Adversarial Loss&#xff0c;即对抗性损失&#xf…

网站安全证书的作用和申请方法

网站安全证书的作用 网站安全证书&#xff0c;也被称为SSL证书、HTTPS证书或服务器证书&#xff0c;是一个由受信任的数字证书颁发机构&#xff08;CA&#xff09;审核颁发的数字文件。它的主要作用体现在以下几个方面&#xff1a; 增强用户信任&#xff1a;未使用HTTPS协议的…

幸福人生之理性决策

人人每天都在做决策&#xff0c;小到穿衣吃饭&#xff0c;大到恋爱工作&#xff0c;决策的正确性决定了人生的幸福指数。虽然有些小决策&#xff0c;依靠经验和感性已经足以达到一个满意的结果&#xff1b;有些决策即使错了&#xff0c;对漫长的人生来说也没有太多的影响。 但追…

win10自带dll修复丢失的几种方法,快速修复错误dll文件的方式

DLL文件&#xff0c;即动态链接库文件&#xff0c;是Windows操作系统中不可或缺的组成部分&#xff0c;它们包含了可由多个程序共享的代码和数据。当这些文件损坏或丢失时&#xff0c;可能会导致程序无法正常运行&#xff0c;甚至系统崩溃。 幸运的是&#xff0c;Windows 10操作…

JeecgBoot 低代码平台快速集成 Spring AI

JeecgBoot 是一款基于代码生成器的低代码开发平台&#xff01;前后端分离架构 SpringBoot2.x和3.x&#xff0c;SpringCloud&#xff0c;Ant Design Vue3&#xff0c;Mybatis-plus&#xff0c;Shiro&#xff0c;JWT&#xff0c;支持微服务。强大的代码生成器让前后端代码一键生成…

Sun Frame:基于 SpringBoot 的轻量级开发框架(个人开源项目)

文章目录 &#x1f31e; Sun Frame&#xff1a;基于 SpringBoot 的轻量级开发框架&#xff08;个人开源项目&#xff09;&#x1f680; 欢迎使用 Sun Frame&#x1f31f; 项目亮点&#x1f4e6; 模块结构&#x1f310; Sun-Cloud&#x1f4e6; Sun-Common &#x1f4a1; 示例与…

云原生的候选应用

提示 该内容摘自电子书《为 Azure 构建云原生 .NET 应用程序》&#xff0c;可在**.NET Docs**上获取&#xff0c;也可以免费下载 PDF并离线阅读。 考虑一下您的组织需要构建哪些应用程序。然后&#xff0c;看看您投资组合中的现有应用程序。其中有多少需要云原生架构&#xff…

计算机毕业设计选题推荐-租房管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

[网鼎杯]2018Unfinish

使用ctf在线靶场https://adworld.xctf.org.cn/home/index。 进入靶场&#xff0c;发现是一个登录页面。 使用awvs进行扫描&#xff0c;发现存在login.php和register.php&#xff0c;并且register.php存在sql注入漏洞。 访问一下register.php试试&#xff0c;发现是一个注册页面…

JBoss未授权访问漏洞 *

JBoss是一个基于J2EE的开放源代码应用服务器&#xff0c;代码遵循LGPL许可&#xff0c;可以在任何商业应用中免费使用&#xff1b;JBoss也是一个管理EJB的容器和服务器&#xff0c;支持EJB 1.1、EJB 2.0和EJB3规范。,默认情况下访问 http://ip:8080/jmx-console 就可以浏览 JBo…

<数据集>COCO2017行人识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;10000张 标注数量(xml文件个数)&#xff1a;10000 标注数量(txt文件个数)&#xff1a;10000 标注类别数&#xff1a;1 标注类别名称&#xff1a; [person] 序号类别名称图片数框数1person1000041131 使用标注工具…

OpenAI: Stream interrupted (client disconnected)

题意&#xff1a;OpenAI: 流被中断&#xff08;客户端已断开连接&#xff09; 问题背景: Im trying OpenAI. 我正在尝试 OpenAI I have prepared the training data, and used fine_tunes.create. Several minutes later, it showed Stream interrupted (client disco…

虚拟试衣系列Magic Clothing: Controllable Garment-Driven Image Synthesis

目标&#xff1a;生成穿着具有多种文本提示的目标服装的模特图片。 创新点&#xff1a;以特定服装为条件的图像生成。服装驱动的图像生成任务旨在生成穿着指定服装的模特图片&#xff0c;并结合给定的文本提示。 与虚拟试穿(Virtual try-on, VTON)任务的不同&#xff1a; VT…

如何组织一场问卷调查

问卷调查是一种常用的数据收集方法&#xff0c;可以用于了解人群的意见、行为、态度等。以下是一些步骤和建议&#xff0c;帮助你组织1场有效的问卷调查。 确定调查目的&#xff1a;在开始设计问卷之前&#xff0c;你需要明确调查的目的。这将帮助你确定需要收集哪些信息&…

SpringBoot发送QQ邮箱

SpringBoot发送QQ邮箱 前言&#xff1a; 因项目有部分功能要发送企业内部邮箱&#xff0c;要用到QQ邮箱测试下网段是否通&#xff0c;用于排查下问题。 发送邮箱 1&#xff0c;导入依赖 <dependency><groupId>org.springframework.boot</groupId><arti…

【数据分享】2024最新安徽省镇级行政区划矢量shp

今天要分享的数据是2024最新安徽省镇级行政区划矢量shp。 数据介绍 安徽建省公元1667年&#xff0c;省名取当时安庆、徽州两府首字合成&#xff0c;因境内有皖山、春秋时期有古皖国而简称皖。它位于中国中东部&#xff0c;是最具活力的长江三角洲组成部分。全省南北长约57…

liunx运行脚本文件sh,和window运行脚本文件命令及注意事项总结

文章目录 linux运行脚本文件window运行脚本文件工具1. 使用WSL&#xff08;Windows Subsystem for Linux&#xff09;2. 使用Git Bash&#xff08;现在用的&#xff09;3. 使用Cygwin4. 使用Windows PowerShell小结 conda使用&#xff0c;环境变换解决方案1. 配置conda初始化对…