默认的各种exporter有时候用起来都不够顺手,特殊情况下,我们还可以自己写sql然后通过python包装下,将metrics发送到pushgateway,进而上报到Prometheus里面。
下面例子中,演示的是将datasize和logsize指标采集上报。其它指标的采集方法类似。
采集脚本如下:
# !/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 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有