前往小程序,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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【floodfill深搜】岛屿数量 && 岛屿的最大面积
​ 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
利刃大大
2025/02/11
660
【floodfill深搜】岛屿数量 && 岛屿的最大面积
【广度优先遍历】岛屿的最大面积 && 被围绕的区域
​ 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
利刃大大
2025/03/02
630
【广度优先遍历】岛屿的最大面积 && 被围绕的区域
【算法专题】FloodFill 算法
题目:有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。
YoungMLet
2024/03/01
1460
【算法专题】FloodFill 算法
【FloodFill】图像渲染 / 岛屿的最大面积 / 太平洋大西洋水流问题 / 扫雷游戏
_小羊_
2025/04/09
450
【FloodFill】图像渲染 / 岛屿的最大面积 / 太平洋大西洋水流问题 / 扫雷游戏
【奇技淫巧】-- 岛屿的最大面积
一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
看、未来
2020/08/26
2950
BFS:Floodfill算法
与dfs一样,从指定的起点开始向四个方向扩展,区别就是用之前通过参数将下标关系传递给dfs,而现在是将下标关系的键值对传给queue。
小陈在拼命
2024/07/16
990
BFS:Floodfill算法
【floodfill深搜】太平洋大西洋水流问题 && 扫雷游戏 &&衣橱整理
​ 有一个 m × n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。
利刃大大
2025/02/13
630
【floodfill深搜】太平洋大西洋水流问题 && 扫雷游戏 &&衣橱整理
【算法/学习】:flood算法
Flood Fill 算法的实现可以使用递归、栈或队列等数据结构。常见的填充条件包括相邻像素颜色相同、相邻像素颜色不同等。 在图像编辑软件中,用户通常通过选择一个起始点和指定填充颜色来触发 Flood Fill 操作,使得相邻区域被填充为指定颜色。 Flood Fill 算法的变种和优化版本也被用于解决其他问题,例如计算连通区域的大小、边界填充、种子点选择策略等。
IsLand1314
2024/10/15
1830
【算法/学习】:flood算法
【回溯算法】回溯,从入门到入土,七道试题精选、精讲、精练
前期准备,要玩得转回溯,递归的基础还是要有的,所以前些日子我就先把递归部分给办了。 【LeetCode】递归 原理入门+复杂度计算+练手试题
看、未来
2020/08/25
4660
【回溯算法】回溯,从入门到入土,七道试题精选、精讲、精练
岛屿问题
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
你的益达
2020/08/05
6390
【算法】bfs解决FloodFill问题
FloodFill就是洪水灌溉,解决的就是下面这样一种模型。 解决性质相同的联通块问题,用的方法就是dfs深度优先搜索遍历:一条道走到黑,直到不能再走,不能再走就倒回去;或者是bfs宽度优先搜索遍历:一层一层剥开
zxctscl
2024/04/15
1140
【算法】bfs解决FloodFill问题
【算法】DFS、BFS、floodfill、记忆化搜索
要将a柱上n个的盘子借助b柱放到c柱上,应该先将a柱上的n-1个盘子借助c放到b上,然后再将b柱上的n-1个盘子借助a柱放到c柱上,以此往复。
_小羊_
2025/03/22
1090
【算法】DFS、BFS、floodfill、记忆化搜索
DFS:floodfill算法解决矩阵联通块问题
小陈在拼命
2024/04/10
1400
DFS:floodfill算法解决矩阵联通块问题
前端算法-岛屿的最大面积 DFS(深度优先搜索) 质数计数
一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
微芒不朽
2022/09/06
6170
通吃岛屿问题
在秋招及实习期间发现岛屿问题在面试中会被经常问到,本节来把leetcode上的所有岛屿问题通吃一遍。
公众号guangcity
2020/09/01
1.3K0
【C++】BFS解决Floodfill问题
图中的数字代表的是陆地的高度,水往地处流,这里我们用负数代表低洼的区域,所以这个图中可以分为陆地和水域两种区域,水域是被陆地包裹着的;
啊QQQQQ
2024/11/19
860
【C++】BFS解决Floodfill问题
[LeetCode]Max Area of Island 岛屿的最大面积 [LeetCode]Max Area of Island 岛屿的最大面积
链接:https://leetcode.com/problems/max-area-of-island/description/ 难度:Easy 题目:695. Max Area of Island Given a non-empty 2D array grid of 0’s and 1’s, an island is a group of 1’s (representing land) connected 4-directionally (horizontal or vertical.) You may assume all four edges of the grid are surrounded by water.
尾尾部落
2018/09/04
4720
LeetCode 695. 岛屿的最大面积(图的BFS/DFS)
给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。
Michael阿明
2020/07/13
6530
LeetCode 695. 岛屿的最大面积(图的BFS/DFS)
Leetcode 【200、695】
求二维矩阵中由 '1' 连通的岛屿个数(上下左右有 '1' 视为连通)。很明显用回溯法(DFS)求解。 (1)在递归回溯的函数外部,遍历二维矩阵,如果某个位置为 '1',则将岛屿个数加 1,并调用回溯函数。 (2)在递归回溯的函数内部,将 '1' 的位置修改为 '0'(防止重复搜索),对上、下、左、右、四个方向进行搜索(注意边界情况),如果某个位置为 '1',则继续回溯;否则结束。
echobingo
2019/06/16
5060
695. 岛屿的最大面积(经典DFS)
岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
杨鹏伟
2022/05/05
1370
推荐阅读
相关推荐
【floodfill深搜】岛屿数量 && 岛屿的最大面积
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验