Telegraf和Grafana監控多平臺上的SQL Server-自定義監控數據收集

問題

上一篇文章中,咱們使用Telegraf自帶的Plugin配置好了的監控,可是自帶的Plugin並不能徹底覆蓋咱們想要的監控指標,就須要收集額外的自定義的監控數據,實現的方法有:html

  • 開發本身的Telegraf Pluginlinux

  • 使用能夠執行自定義腳本的inputs pluginsql

此處收集的監控項很少,收集間隔也不是很頻繁,因此我選擇Telegraf預置的Inputs.exec plugin實現。它很是靈活,能夠執行任意命令和腳本。在腳本中實現獲取監控數據的邏輯,而後使用inputs.exec執行。獲取數據以後,須要按InfluxDB Line Protocol 格式組織數據,才能寫入到Influxdb。這種格式的組織方式:shell

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

  • measurement,相似於SQL中表的概念,數據存放的容器數據庫

  • tags,K-V格式用於標記數據記錄,通常它們的值不常常變化,如主機名。同時tags上會創建索引,查詢效率會好一些.windows

  • fields,K-V格式,表示真正收集的不一樣時間點的數據項,如CPU Loadbash

  • timestamp,UNIX 時間戳,Influxdb是時序數據庫,全部數據都要與時間關聯起來。sqlserver

  • measurement和tag之間用逗號分隔,fields 與它們用空格(whitespace)分隔性能

無論是運行在Linux仍是Windows上的SQL,一般使用T-SQL查詢實例內部的數據和使用操做系統腳本查詢實例外部的數據以實現監控。接下來,以執行T-SQL獲取自定義監控數據爲例,看看在Windos和Linux上分別如何實現。spa

解決方案

首先在被監控的實例上把相應的邏輯寫成存儲過程,而後經過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和數據:

總結

  • 在inputs.exec中最好是調用腳本,而不是命令。這樣當你須要變動數據收集邏輯,直接修改腳本便可,而不須要修改Telegraf的配置文件,避免重啓服務和配置干擾

  • 被調用的腳本的輸出,要是stdout,才能被正確寫入influxdb

  • Windows 上文件路徑和符號escape要特別注意

  • 若是對收集性能特別敏感或者收集頻率特別高時,使用Go自定義Plugin

  • 本文內容僅表明我的觀點,與任何公司和組織無關

相關文章
相關標籤/搜索