首页 > 数据库 >Go 语言实现,将 SQL Server 中每个表的大小信息传输到 Prometheus

Go 语言实现,将 SQL Server 中每个表的大小信息传输到 Prometheus

时间:2024-12-25 17:31:06浏览次数:2  
标签:err prometheus Server Prometheus SQL go id

为了用 Go 语言编写一个程序,将 SQL Server 中每个表的大小信息传输到 Prometheus,你可以遵循以下步骤。
这个过程包括连接到 SQL Server、执行查询获取表大小数据,并使用 Prometheus 客户端库将这些数据暴露给 Prometheus 抓取。

步骤 1: 设置项目环境

首先,确保你已经安装了 Go 和必要的依赖项。然后创建一个新的 Go 模块:

mkdir sql_to_prometheus cd sql_to_prometheus go mod init sql_to_prometheus
步骤 2: 添加依赖
接下来,添加用于连接 SQL Server 和与 Prometheus 交互的依赖包。你需要
github.com/denisenkom/go-mssqldb 来连接 SQL Server,以及
github.com/prometheus/client_golang 来处理 Prometheus 指标。

go get github.com/denisenkom/go-mssqldb go get github.com/prometheus/client_golang/prometheus/promhttp go get github.com/prometheus/client_golang/prometheus
步骤 3: 编写 Go 程序

创建一个名为 main.go 的文件,并在其中编写如下代码:

package main import ( "database/sql" "fmt" "log" "net/http" _ "github.com/denisenkom/go-mssqldb" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) // 定义一个自定义的 Prometheus Gauge 用来存储表大小信息 var tableSizeGauge = prometheus.NewGaugeVec( prometheus.GaugeOpts{ Name: "sql_table_size_mb", Help: "Size of SQL tables in MB", }, []string{"table"}, ) func init() { // 注册自定义的 Gauge 到 Prometheus 默认的注册表中 prometheus.MustRegister(tableSizeGauge) } func collectTableSizes(db *sql.DB) { query := ` SELECT OBJECT_SCHEMA_NAME(t.object_id) + '.' + OBJECT_NAME(t.object_id) AS table_name, SUM(a.total_pages) * 8 / 1024 AS total_space_mb, SUM(a.used_pages) * 8 / 1024 AS used_space_mb, (SUM(a.total_pages) - SUM(a.used_pages)) * 8 / 1024 AS unused_space_mb FROM sys.tables t INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id WHERE t.is_ms_shipped = 0 AND i.object_id > 255 -- 排除系统表 GROUP BY t.object_id` rows, err := db.Query(query) if err != nil { log.Fatalf("Error executing query: %v", err) } defer rows.Close() tableSizeGauge.Reset() // 清除旧的数据 for rows.Next() { var tableName string var totalSpaceMB float64 err := rows.Scan(&tableName, &totalSpaceMB, nil, nil) if err != nil { log.Printf("Error scanning row: %v", err) continue } tableSizeGauge.WithLabelValues(tableName).Set(totalSpaceMB) } if err = rows.Err(); err != nil { log.Fatalf("Error iterating over rows: %v", err) } } func main() { // 替换为你的 SQL Server 连接字符串 connString := "server=your_server;user id=your_user;password=your_password;database=your_db;encrypt=disable" db, err := sql.Open("sqlserver", connString) if err != nil { log.Fatalf("Error opening database: %v", err) } defer db.Close() err = db.Ping() if err != nil { log.Fatalf("Error pinging database: %v", err) } http.Handle("/metrics", promhttp.Handler()) go func() { http.ListenAndServe(":9104", nil) }() log.Println("Starting to collect metrics...") // 每隔一段时间收集一次表大小信息 ticker := time.NewTicker(60 * time.Second) defer ticker.Stop() for { select { case <-ticker.C: collectTableSizes(db) } } }
步骤 4: 配置和运行程序
保存 main.go 文件后,在命令行中运行以下命令来构建并启动应用程序:
go build -o sql_to_prometheus ./sql_to_prometheus
步骤 5: 配置 Prometheus
最后,更新你的 Prometheus 配置 (prometheus.yml),使其能够抓取你新创建的服务提供的指标:scrape_configs:
- job_name: 'sql_table_sizes' static_configs: - targets: ['localhost:9104']

重启 Prometheus 以应用新的配置。现在,Prometheus 应该可以开始抓取来自 SQL Server 的表大小信息了。
注意事项
•安全性:请确保你的数据库连接字符串安全,避免泄露敏感信息。
•性能:根据你的需求调整定时器的时间间隔(当前设置为每分钟),以平衡监控频率和系统负载。
•错误处理:示例代码中的错误处理较为简单;在生产环境中,你可能需要更健壮的错误处理逻辑。
通过上述步骤,你就完成了一个简单的 Go 程序,它可以定期从 SQL Server 获取表大小信息,并将其暴露给 Prometheus 抓取。

  

标签:err,prometheus,Server,Prometheus,SQL,go,id
From: https://www.cnblogs.com/jason-zhao/p/18631028

相关文章

  • RocketMQ5.0 NameServer启动流程
    1.NameServer启动org.apache.rocketmq.namesrv.NamesrvStartup 的Main函数是启动的入口。启动分成了两块:NameServer启动Controller启动(5.0为自动自主切换新增的一个模块,内嵌NameServer的时候会启动)本篇文章只分析NameServer的启动,Controller的启动在后续的文章......
  • MySQL for update skip locked 与 for update nowait
    理论(下方有实操)forupdateskiplocked官方文档:https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html#innodb-locking-reads-for-update语法:select语句后跟forupdateskiplocked作用:目标对象没有被其它会话加锁则可加锁,被其它会话加了锁就跳过。解决问题:......
  • mysql出现unblock with 'mysqladmin flush-hosts'
    朋友发来消息,说一个系统应用登录的时候提示连接超时,让帮忙处理一下。问他应用和数据库是否都正常,回复说数据库好像没有问题,但是应用日志报无法连接数据库。数据库版本是:5.5.53让他telnet数据库是否是通的,回复说不通,并发来了信息提示:12345#telnet 8.8.9.93306......
  • mysql 127.0.0.1连接正常,使用ip无法连接
    mysql127.0.0.1连接正常,使用ip无法连接1.使用127.0.0.1连接mysqlmysql-uroot-p-h127.0.0.12.使用ip连接mysql#查看当前虚机的ip地址ipa#使用ip地址连接mysqlmysql-uroot-p-h192.168.91.133错误信息:ERROR1130(HY000):Host'192.168.91.133'isnotal......
  • 数据同步工具: mysql表级全量同步 / mongodb全量+增量同步 / redis全量+增量同步
    目录数据同步工具方案说明MySql同步方案概述配置说明MongoDB同步方案概述配置说明Redis同步方案概述配置说明启动同步服务文件准备启动服务数据同步工具mysql表级全量同步/mongodb全量+增量同步/redis全量+增量同步源码地址:https://github.com/jiashuaizhang/sync-jobs......
  • 【实战必备】MySQL慢查询优化实战,让你的SQL飞起来!
    本文将详细介绍MySQL慢查询的排查和优化方法,包括如何开启慢查询日志、分析慢查询、优化索引等实用技巧。一、什么是慢查询?在MySQL中,慢查询指的是执行时间超过指定阈值的SQL语句。默认情况下,这个阈值是10秒。通过分析和优化这些慢查询,我们可以显著提升数据库性能。二、开启慢......
  • 【详解】MySQL主从复制配置,一次性搞定读写分离!
    本文将详细介绍MySQL主从复制的配置过程,包括主库配置、从库配置、主从同步状态监控等内容,帮助你轻松实现数据库的读写分离。一、主从复制简介MySQL主从复制是一个异步的复制过程,通过它可以让一台MySQL服务器(从库)的数据与另一台MySQL服务器(主库)的数据保持同步。1.1主从复制的......
  • 源码编译geoserver(idea)
    官方教程:https://docs.geoserver.org/main/en/developer/quickstart/intellij.html 从git存储库中检出源代码:gitclonehttps://github.com/geoserver/geoserver.gitgeoserver列出可用的分支:%gitbranch2.21.x2.22.x*main选择main最新动态:%gi......
  • MySQL安装和基本使用
    1MySQL介绍1.1MySQL系列1.1.1MySQL的三大主要分支MySQLMariadbPerconaServer1.1.2官方网址https://www.mysql.com/http://mariadb.org/https://www.percona.1.1.3官方文档https://dev.mysql.com/doc/https://mariadb.com/kb/en/https://www.percona.com/......
  • MySQL占用内存和SWAP问题解决
    背景发现公司的项目部署上,经常出现数据库占用内存很高(接近6G)的情况,而且还出现了SWAP使用到90%左右的水平。所以需要排查数据库使用内存的情况,看数据库为什么使用了这么多内存,而且会不会频繁使用交换空间。要解决的问题:数据库使用高内存数据库使用SWAP解决SWAP空间在......