Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >SQLServer采集data和log的体积推送到prometheus

SQLServer采集data和log的体积推送到prometheus

原创
作者头像
保持热爱奔赴山海
发布于 2024-10-01 01:25:37
发布于 2024-10-01 01:25:37
9500
代码可运行
举报
文章被收录于专栏:数据库相关数据库相关
运行总次数:0
代码可运行

生产上需要采集各个库的datasize和logsize,便于DBA提前介入优化(例如数据文件最近为啥体积暴涨、事务日志为啥一直在涨or收缩失败?)

这种情况下,可以使用下面的脚本采集下datasize和logsize,并推送到pushgateway中:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# -*-coding:utf-8 -*-

import datetime
import json
import os
import sys

import requests

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:
        # print(db)
        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])

            print(f"节点 {instance}, 库名 {Database_Name}, Total_Size: {Total_Size}, Data_Size: {Data_Size}, Log_Size: {Log_Size} ")

            # 把指标格式化成prometheus识别的格式
            labels = ["Metrics"]

            registry = CollectorRegistry()

            db_metrics = Gauge("Data_Size", "MSSQL基础指标", labels, registry=registry)
            db_metrics.labels("Data_Size").set(Data_Size)

            db_metrics = Gauge("Log_Size", "MSSQL基础指标", labels, registry=registry)
            db_metrics.labels("Log_Size").set(Log_Size)


            push_to_gateway(
                gateway='http://192.168.31.181:9091',
                job="MSSQLBasicMetrics",
                # 注意这里的grouping_key是关键,写的有问题会导致不同instance的指标覆盖
                grouping_key={
                    "instance": instance,
                    "Database_Name":Database_Name
                },
                registry=registry,
                timeout=5,
            )
            

if __name__ == "__main__":
    port = "1433"
    db = "master"
    user = "sa"
    passwd = "Abcd1234"

    host_list = ["192.168.31.181","192.168.31.17"]

    for host in host_list:
        print("当前解析的是 ---- ",host)
        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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
⚡3分钟⚡熟悉面试常问状态码,面试官都听呆了
· 100 - Continue 初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP 1.1新) · 101 - Switching Protocols 服务器将遵从客户的请求转换到另外一种协议(HTTP 1.1新)
江一铭
2022/06/16
1.9K0
⚡3分钟⚡熟悉面试常问状态码,面试官都听呆了
HTTP状态码及其含义
        开发Web项目的时候,因为环境搭建和配置的原因,经常会出现部署失败的情况;搭建这个博客的时候,也因为php-admin缺少某些库的原因,导致出现502的稀有的http状态。平时不是很留意这些状态码信息,也不是很了解出现这种状态的内在原因,每次出现都要查找。为了详细梳理和备忘,整理一份http状态码及其含义的解析。
王金龙
2018/09/05
1.8K0
2022秋招前端面试题(五)(附答案)
用CSS实现扇形的思路和三角形基本一致,就是多了一个圆角的样式,实现一个90°的扇形:
helloworld1024
2022/08/08
5540
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。
猿天地
2019/12/18
1.9K0
程序员:我终于知道post和get的区别
前端面试题
解决了创建多个相似对象的问题,但没有解决对象识别的问题。也就是说我们无法知道创建出来的对象类型。
用户7162790
2022/03/23
7150
来聊聊 HTTP 如何
  万维网 WWW(world wide web) 发源于欧洲日内瓦量子物理实验室 CERN,正是 WWW 技术的出现使得因特网得以超乎想象的速度迅猛发展。这项基于 TCP/IP 的技术在短短的十年时间内迅速成为已经发展了几十年的 Internet 上的规模最大的信息系统,它的成功归结于它的简单、实用。在 WWW 的背后有一系列的协议和标准支持它完成如此宏大的工作,这就是 Web 协议族,其中就包括 HTTP 超文本传输协议。   在 1990 年,HTTP 就成为 WWW 的支撑协议。当时由其创始人 WWW 之父蒂姆·贝纳斯·李(TimBerners—Lee) 提出,随后 WWW 联盟(WWW Consortium)成立,组织了 IETF(Internet Engineering Task Force)小组进一步完善和发布 HTTP 协议。   HTTP 是应用层协议,同其他应用层协议一样,是为了实现某一类具体应用的协议,并由某一运行在用户空间的应用程序来实现其功能。HTTP 是一种协议规范,这种规范记录在文档上,为真正通过 HTTP 协议进行通信的 HTTP 的实现程序。   HTTP 协议是基于 C/S 架构进行通信的,而 HTTP 协议的服务器端实现程序有 httpd、nginx 等,其客户端的实现程序主要是 Web 浏览器,例如 Firefox、InternetExplorer、Google chrome、Safari、Opera 等,此外,客户端的命令行工具还有 elink、curl 等。Web 服务是基于 TCP 的,因此为了能够随时响应客户端的请求,Web 服务器需要监听在 80/TCP 端口。这客户端浏览器和 Web 服务器之间就可以通过 HTTP 协议进行通信了。
Demo_Null
2020/09/28
5380
来聊聊 HTTP 如何
面试突击53:常见的 HTTP 状态码有哪些?
HTTP 状态码是服务器端返回给客户端的响应状态码,根据(HTTP)状态码我们就能知道服务器端想要给客户端表达的具体含义,比如 200 就表示请求访问成功,500 就表示服务器端程序出错等。 HTTP 状态码可分为 5 大类:
磊哥
2022/06/02
6330
http码类型状态表
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含 HTTP 状态码的信息头(server header)用以响应浏览器的请求。
炒香菇的书呆子
2021/03/16
1K1
http码类型状态表
基于Django的电子商务网站开发(连载5)
HTTP的请求方式共分为OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE和CONNECT八种(注意:这些方法均为大写),其中比较常用的为GET和POST。
顾翔
2019/12/11
8730
基于Django的电子商务网站开发(连载5)
常用 HTTP 状态码
HTTP 100 Continue 信息型状态响应码表示目前为止一切正常,客户端应该继续请求,如果已完成请求则忽略。
雨落秋垣
2024/10/29
1930
HTTP协议概述
HTTP1.0定义了三种请求方法:GET、POST、HEAD方法。 HTTP1.1新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE和CONNECT方法。
WindRunnerMax
2020/08/27
7100
前端高频面试题(五)(附答案)
题目描述:JS 实现一个带并发限制的异步调度器 Scheduler,保证同时运行的任务最多有两个
helloworld1024
2022/09/01
7390
剖析 HTTP 协议
HTTP 概述 HTTP 是什么? HTTP(HyperText Transfer Protocol,超文本传输协议)是WWW (World Wide Web)实现数据通信的基石。 HTTP是由IET
静默虚空
2018/01/05
9230
剖析 HTTP 协议
记录一下 http status code
一般查询我们都会使用 GET 方法, 创建新的记录使用 POST 方法 更新已有数据使用 PUT 方法 更新已有数据部分属性使用 PATCH 方法 删除已有数据使用 DELETE 方法
用户7053485
2020/06/19
1.3K0
HTTP和HTTPS是什么 二者区别是什么
HTTP(超文本传输协议)是网络上最为广泛的传输协议,被用于在web浏览器和网站服务器之间的传输协议。HTTP是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。
肥晨
2022/09/27
7660
HTTP和HTTPS是什么 二者区别是什么
四、《图解HTTP》- 状态码
状态码章节内容过于贫乏,参考资料找了一个澳大利亚的博客,里面收录了HTTP的状态码介绍,为什么选这个作参考?一个是网站挺漂亮,另一个是做了一张长图容纳了常见的响应码,存到手机可以时不时看看,并且博客有做国际化,点进去自动就是中文(但是团队确实是外国人),挺有意思的。
阿东
2022/08/12
1.2K0
四、《图解HTTP》- 状态码
超全的HTTP请求响应码详细解析
HTTP响应状态码表 1xx: 信息 状态码 英文 描述 100 Continue 服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。 101 Switching Protocols 服务器转换协议:服务器将遵从客户的请求转换到另外一种协议。 2xx: 成功 状态码 英文 描述 200 OK 请求成功(其后是对GET和POST请求的应答文档) 201 Created 请求被创建完成,同时新的资源被创建。 202 Accepted 供处理的请求已被接受,但是处理未完成。
python鱼霸霸
2020/05/04
1.7K0
C++ CGIweb编程
超文本传输协议就是所谓的HTTP,是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。
SimpleAstronaut
2022/08/09
1.3K0
C++ CGIweb编程
拨打13116911968_缅甸九九贵宾会客服我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。
用户4492009
2019/12/29
9920
python爬虫(七)_urllib2:urlerror和httperror
urllib2的异常错误处理 在我们用urlopen或opener.open方法发出一个请求时,如果urlopen或opener.open不能处理这个response,就产生错误。 这里主要说的是URLError和HTTPError,以及对它们的错误处理。 URLError URLError产生的原因主要有: 没有网络连接 服务器链接失败 找不到指定的服务器 我们可以用try except语句来补货相应的异常。下面的例子里我们访问了一个不存在的域名。 #urllib2_urlerror.py impor
用户1174963
2018/01/17
2.4K0
相关推荐
⚡3分钟⚡熟悉面试常问状态码,面试官都听呆了
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验