golang统计sqlserver每张表的大小,每小时统计一次,输出到prometheus

为了在 Go 语言中统计 SQL Server 数据库中每张表的大小,并将结果每小时输出到 Prometheus,你可以使用以下步骤来实现:

步骤 1: 安装必要的库

首先,确保你的 Go 环境已经安装,并安装以下库:

  • github.com/denisenkom/go-mssqldb: 用于连接 SQL Server。

  • github.com/prometheus/client_golang: 用于与 Prometheus 交互。

安装这些库:

go get -u github.com/denisenkom/go-mssqldb
go get -u github.com/prometheus/client_golang/prometheus
go get -u github.com/prometheus/client_golang/prometheus/promhttp

  

步骤 2: 编写 Go 代码

创建一个 Go 文件,例如 main.go,并编写以下代码:

package main
 
import (
    "database/sql"
    "fmt"
    "log"
    "time"
 
    _ "github.com/denisenkom/go-mssqldb"
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
    "net/http"
)
 
var (
    tableSize = prometheus.NewGaugeVec(prometheus.GaugeOpts{
        Name: "db_table_size",
        Help: "Size of each table in the database",
    }, []string{"table"})
)
 
func init() {
    prometheus.MustRegister(tableSize)
}
 
func main() {
    http.Handle("/metrics", promhttp.Handler())
    go func() {
        for {
            updateTableSizes()
            time.Sleep(1 * time.Hour) // 每小时更新一次
        }
    }()
    log.Fatal(http.ListenAndServe(":8080", nil))
}
 
func updateTableSizes() {
    connStr := "server=your_server;user id=your_username;password=your_password;database=your_database" // 替换为你的连接字符串
    db, err := sql.Open("sqlserver", connStr)
    if err != nil {
        log.Fatalf("Error creating connection pool: %v", err)
    }
    defer db.Close()
 
    rows, err := db.Query("SELECT t.NAME AS TableName, s.size * 8 / 1024 AS SizeMB FROM sys.tables t JOIN sys.sysfiles s ON t.crdate = s.crdate WHERE t.NAME NOT LIKE 'dt%'") // 获取表大小,排除系统表和临时表等
    if err != nil {
        log.Fatalf("Error querying table sizes: %v", err)
    }
    defer rows.Close()
 
    for rows.Next() {
        var tableName string
        var size float64
        if err := rows.Scan(&tableName, &size); err != nil {
            log.Fatalf("Error scanning row: %v", err)
        }
        tableSize.WithLabelValues(tableName).Set(size) // 设置 Prometheus 指标值
    }
}

  

配置 Prometheus 以抓取指标数据

scrape_configs:
  - job_name: 'sqlserver_exporter'
    static_configs:
      - targets: ['localhost:8080'] # 根据实际情况调整地址和端口号

  

posted @ 2025-09-10 14:49  zhaoguanhao  阅读(3)  评论(0)    收藏  举报