前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >采集SQL Server自定义指标并上报到pushgateway

采集SQL Server自定义指标并上报到pushgateway

原创
作者头像
保持热爱奔赴山海
发布2024-01-27 14:41:49
1120
发布2024-01-27 14:41:49
举报
文章被收录于专栏:饮水机管理员饮水机管理员

默认的各种exporter有时候用起来都不够顺手,特殊情况下,我们还可以自己写sql然后通过python包装下,将metrics发送到pushgateway,进而上报到Prometheus里面。

下面例子中,演示的是将datasize和logsize指标采集上报。其它指标的采集方法类似。

采集脚本如下:

代码语言:python
复制
# !/usr/bin/env python
# -*-coding:utf-8 -*-

import pymssql
from prometheus_client import CollectorRegistry, Gauge, push_to_gateway


def get_db_list(host, port, db, user, passwd):
    conn = pymssql.connect(
        host=host, port=port, user=user, password=passwd, database=db, charset="utf8"
    )
    cursor = conn.cursor()
    sql = """select database_id,name,state from sys.databases where [state] not in(1,2,3,4,6) and name not in ('master','model','tempdb','msdb') ORDER BY name asc"""

    cursor.execute(sql)
    res = cursor.fetchall()

    db_list = []

    for i in res:
        db_list.append(i[1])
        
    return db_list


def push_metrics(host, port, db, user, passwd, db_list):
    for db in db_list:

        conn = pymssql.connect(
            host=host,
            port=port,
            user=user,
            password=passwd,
            database='master',
            charset="utf8",
        )
        cursor = conn.cursor()

        detail_sql = "USE [" + str(db) + "];" +  """
            SELECT
                DB_NAME() AS [Database Name]
                ,SUM(size * 8.0 / 1024) AS [Total_Size]
                ,SUM(CASE WHEN type_desc = 'ROWS' THEN size * 8.0 / 1024 ELSE 0 END) AS [Data Size]
                ,SUM(CASE WHEN type_desc = 'LOG' THEN size * 8.0 / 1024 ELSE 0 END) AS [Log Size]
                ,@@SERVERNAME as instance
            FROM sys.master_files 
            WHERE type in (0,1) AND state = 0 AND database_id = DB_ID('""" + str(db) + "');"

        try:
            cursor.execute(detail_sql)
        except:
            continue

        res = cursor.fetchall()

        for row in res:            
            Database_Name = str(row[0])
            Total_Size = str(row[1])
            Data_Size = str(row[2])
            Log_Size = str(row[3])
            instance = str(row[4])

            labels = ["Metrics"]

            registry = CollectorRegistry()

            rds_metrics = Gauge("Data_Size", "MSSQL自定义指标", labels, registry=registry)
            rds_metrics.labels("Data_Size").set(Data_Size)

            rds_metrics = Gauge("Log_Size", "MSSQL自定义指标", labels, registry=registry)
            rds_metrics.labels("Log_Size").set(Log_Size)


            push_to_gateway(
                gateway='http://192.168.100.200:9091',
                job="MSSQLBasicMetrics",
                grouping_key={"instance": instance,"Database_Name":Database_Name},
                registry=registry,
                timeout=5,
            )
            
            print(f"实例: {instance} , 相关metrics已推送到pushgateway")



if __name__ == "__main__":
    port = "1433"
    db = "master"
    user = "abcd"
    passwd = "1234"

    host_list = ["192.168.100.11","192.168.100.12","192.168.100.13"]

    for host in host_list:
        db_list = get_db_list(host, port, db, user, passwd)
        push_metrics(host, port, db, user, passwd, db_list)

此外,还可以把指标采集到后写到关系型数据库里面,便于关联分析。这里不再赘述。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档