問題 在上一篇文章中,我們使用Telegraf自帶的Plugin配置好了的監控,但是自帶的Plugin並不能完全覆蓋我們想要的監控指標,就需要收集額外的自定義的監控數據,實現的方法有: 開發自己的Telegraf Plugin 使用可以執行自定義腳本的inputs plugin 此處收集的監控項不多 ...
問題
在上一篇文章中,我們使用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和數據:
總結
-
在inputs.exec中最好是調用腳本,而不是命令。這樣當你需要變更數據收集邏輯,直接修改腳本即可,而不需要修改Telegraf的配置文件,避免重啟服務和配置干擾
-
被調用的腳本的輸出,要是stdout,才能被正確寫入influxdb
-
Windows 上文件路徑和符號escape要特別註意
-
如果對收集性能特別敏感或者收集頻率特別高時,使用Go自定義Plugin
-
本文內容僅代表個人觀點,與任何公司和組織無關