天天看點

Telegraf和Grafana監控多平台上的SQL Server-自定義監控資料收集

問題

在上一篇文章中,我們使用Telegraf自帶的Plugin配置好了的監控,但是自帶的Plugin并不能完全覆寫我們想要的監控名額,就需要收集額外的自定義的監控資料,實作的方法有:

  • 開發自己的Telegraf Plugin
  • 使用可以執行自定義腳本的inputs plugin

此處收集的監控項不多,收集間隔也不是很頻繁,是以我選擇Telegraf預置的Inputs.exec plugin實作。它非常靈活,可以執行任意指令和腳本。在腳本中實作擷取監控資料的邏輯,然後使用inputs.exec執行。擷取資料之後,需要按InfluxDB Line Protocol 格式組織資料,才能寫入到Influxdb。這種格式的組織方式:

[measurement],[tags] [fields] [timestamp]

  • measurement,類似于SQL中表的概念,資料存放的容器
  • tags,K-V格式用于标記資料記錄,一般它們的值不經常變化,如主機名。同時tags上會建立索引,查詢效率會好一些.
  • fields,K-V格式,表示真正收集的不同時間點的資料項,如CPU Load
  • timestamp,UNIX 時間戳,Influxdb是時序資料庫,所有資料都要與時間關聯起來。
  • measurement和tag之間用逗号分隔,fields 與它們用空格(whitespace)分隔

不管是運作在Linux還是Windows上的SQL,通常使用T-SQL查詢執行個體内部的資料和使用作業系統腳本查詢執行個體外部的資料以實作監控。接下來,以執行T-SQL擷取自定義監控資料為例,看看在Windos和Linux上分别如何實作。

解決方案

首先在被監控的執行個體上把相應的邏輯寫成存儲過程,然後通過inputs.exec調用之。

例如我在目标執行個體的influx庫中建立了一個存儲過程influx.usp_getInstanceInfo擷取一些執行個體的配置資訊。然後需要在telegraf配置檔案中啟用inputs.exec調用這個存儲過程。存儲過程的輸出資料如下:

sqlserver_property,host=SQL19N1,sql_instance=SQL19N1 host_platform="Linux",host_distribution="CentOS Linux",host_release=7,edition="Developer Edition (64-bit)",product_version="15.0.4033.1",collation="SQL_Latin1_General_CP1_CI_AS",is_clustered=f,is_hadr=t,cpu_count=2,scheduler_count=2,physical_memory_kb=6523904,max_workers_count=512,max_dop=0,max_memmory=2147483647 1590915136000000000
           

資料寫入到sqlserver_property,tags包括host,sql_instance,後面的全是fields。

  • SQL On Linux

使用SQLCMD調用存儲過程,把SQLCMD指令寫到一個bash檔案中/telegraf/get_sqlproperty.sh

#!/bin/bash

/opt/mssql-tools/bin/sqlcmd -S SQL19N1 -U telegraf -P <yourpassword> -d influx -y 0 -Q "EXEC influx.usp_getInstanceInfo"
           

修改telegraf.conf中的inputs.exec, 然後重新開機telegraf生效:

因為收集的是執行個體屬性資訊,收集間隔設定的比較長。
[[inputs.exec]]
#   ## Commands array
   commands = [
        "/telegraf/get_sqlproperty.sh"
        ]
        
   timeout = "5s"
   interval="24h"
   data_format = "influx"
           
  • SQL On Windows

Windows上首選使用PowerShell實作,把執行SQL的指令寫到C:\Monitoring\scripts\get_sqlproperty.ps1。col_res是存儲過程輸出的列名。

(Invoke-Sqlcmd -ServerInstance SQL17N1 -Username telegraf -Password "<yourpassword>" -Database influx -Query "exec influx.usp_getInstanceInfo" ).col_res
           

修改telegraf.conf中的inputs.exec, 然後重新開機telegraf生效.

需要特别注意的問題:

  • 指定檔案路徑時,要使用Linux路徑表達的forward slash(/), 而不是Windows中的 back slash(\)
  • ps1檔案路徑使用單引号(single quote)
  • 避免檔案路徑中有空格(whitespace)
[[inputs.exec]]
#   ## Commands array
   commands = [
        "powershell 'C:/Monitoring/scripts/get_sqlproperty.ps1' "
        ]
        
   timeout = "5s"
   interval="24h"
   data_format = "influx"
           

配置完成後,看看measurement和資料:

Telegraf和Grafana監控多平台上的SQL Server-自定義監控資料收集

總結

  • 在inputs.exec中最好是調用腳本,而不是指令。這樣當你需要變更資料收集邏輯,直接修改腳本即可,而不需要修改Telegraf的配置檔案,避免重新開機服務和配置幹擾
  • 被調用的腳本的輸出,要是stdout,才能被正确寫入influxdb
  • Windows 上檔案路徑和符号escape要特别注意
  • 如果對收集性能特别敏感或者收集頻率特别高時,使用Go自定義Plugin
  • 本文内容僅代表個人觀點,與任何公司群組織無關

-------------------------------------

作者:Joe.TJ

Joe's Blog:http://www.cnblogs.com/Joe-T/

繼續閱讀