当前位置: 首页 > news >正文

编写 prometheus exporter监控 mysql group replication

用 prometheus 监控 mysql,之前用 mysqld_exporter 收集mysql 的监控指标,发现并没有 mysql 组复制状态的指标。只能自己收集了,编写脚本收集指标推送到 pushgateway,这个办法更简单但是扩缩容不是很方便。下面用 python 编写的一个 exporter,比较简单只抓取了一个指标

需要修改的是,mysql_instances_config.yml 实例配置文件的路径,按需暴露的端口和抓取间隔

from prometheus_client import start_http_server, Gauge
import mysql.connector  # 这里的 `mysql` 包是 `mysql-connector-python`
import time
import yaml  # 包是PYyaml# 读取配置文件
def load_config(file_path):with open(file_path, 'r') as file:config = yaml.safe_load(file)return config# 从配置文件加载 MySQL 实例和凭据
config = load_config('/app/mysql_instances_config.yml')  #抓取目标的配置绝对路径
mysql_instances = [(item['host'], item['port']) for item in config['mysql_instances']]
mysql_user = config['mysql_credentials']['user']
mysql_password = config['mysql_credentials']['password']# 自定义指标
replication_group_status = Gauge('replication_group_status','Status of MySQL Group Replication',labelnames=['member_host', 'member_state']
)def collect_metrics():for host, port in mysql_instances:config = {'user': mysql_user,'password': mysql_password,'host': host,'port': port,'database': 'performance_schema',}try:conn = mysql.connector.connect(**config)  # 使用 `mysql.connector.connect`cursor = conn.cursor()cursor.execute("SELECT MEMBER_HOST, MEMBER_STATE, CASE WHEN MEMBER_STATE = 'ONLINE' THEN 1 ELSE 0 END AS state_value FROM performance_schema.replication_group_members")rows = cursor.fetchall()# 更新 Prometheus 指标for row in rows:member_host, member_state, state_value = rowreplication_group_status.labels(member_host=member_host, member_state=member_state).set(state_value)  #指标和标签cursor.close()conn.close()except mysql.connector.Error as err:print(f"Error connecting to MySQL instance {host}:{port} - {err}")if __name__ == '__main__':start_http_server(9104)  # 启动 HTTP 服务,以及暴露的端口while True:collect_metrics()  # 定期收集指标time.sleep(30)  # 每 30 秒收集一次

抓取目标的配置,用的同一套用户名密码,抓取目标自己按需扩减

    mysql_instances:- host: '10.1.11.16'port: 5407- host: '10.1.11.81'port: 5407- host: '10.4.1.1'port: 5407- host: '10.1.11.80'port: 6106- host: '10.1.11.81'port: 6106mysql_credentials:user: 'exporter'password: 'password'

创建数据库用户以及授权

CREATE USER 'exporter'@'%' IDENTIFIED BY 'XXXXXXXX' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
FLUSH PRIVILEGES;

访问抓取指标的 url,指标名字为 replication_group_status,当状态为 ONLINE 时 value 为1,否则为 0

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • jmeter中导入java方法并使用
  • 奇文网盘项目对应windows版本的中间件下载,otp,rabbitmq,postgresql,onlyoffice(在线预览编辑等)
  • 深入理解WebSocket:从基础到实践
  • JavaScript中闭包详解+举例,闭包的各种实践场景:高级技巧与实用指南
  • 4.Redis单线程和多线程
  • Hiprint 打印插件在 Vue3 中的深度剖析
  • Linux磁盘操作之du命令
  • 【Nature】在科研中应用ChatGPT:如何与数据对话
  • “解锁进程间高效沟通,Linux IPC是你的关键钥匙!“#Linux系统编程之进程间通信【下】
  • 一篇内容带你了解Rabbitmq
  • [Leetcode 105][Medium] 从前序与中序遍历序列构造二叉树-递归
  • 接口如何设计
  • 2-76 基于matlab的加权平均融合算法
  • sheng的学习笔记-AI-半监督学习
  • Kubernetes中的Kube-proxy:服务发现与负载均衡的基石
  • python3.6+scrapy+mysql 爬虫实战
  • SegmentFault for Android 3.0 发布
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • [数据结构]链表的实现在PHP中
  • Asm.js的简单介绍
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • es的写入过程
  • Javascript编码规范
  • MobX
  • PHP那些事儿
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Vim 折腾记
  • 给github项目添加CI badge
  • 和 || 运算
  • 解析 Webpack中import、require、按需加载的执行过程
  • 日剧·日综资源集合(建议收藏)
  • 数据科学 第 3 章 11 字符串处理
  • 详解NodeJs流之一
  • 移动端 h5开发相关内容总结(三)
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 白色的风信子
  • Hibernate主键生成策略及选择
  • linux 淘宝开源监控工具tsar
  • ​决定德拉瓦州地区版图的关键历史事件
  • !!Dom4j 学习笔记
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #Linux(make工具和makefile文件以及makefile语法)
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (zhuan) 一些RL的文献(及笔记)
  • (分类)KNN算法- 参数调优
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (算法)N皇后问题
  • (转)Linux下编译安装log4cxx
  • .dwp和.webpart的区别
  • .NET Core WebAPI中使用swagger版本控制,添加注释