categraf監(jiān)控采集 Agent
Categraf 是一個(gè)監(jiān)控采集 Agent,類似 Telegraf、Grafana-Agent、Datadog-Agent,希望對所有常見監(jiān)控對象提供監(jiān)控?cái)?shù)據(jù)采集能力,采用 All-in-one 的設(shè)計(jì),不但支持指標(biāo)采集,也希望支持日志和調(diào)用鏈路的數(shù)據(jù)采集。來自快貓研發(fā)團(tuán)隊(duì),和 Open-Falcon、Nightingale 的研發(fā)是一撥人。
categraf 和 telegraf、exporters、grafana-agent、datadog-agent 等的關(guān)系是什么?
telegraf 是 influxdb 生態(tài)的產(chǎn)品,因?yàn)?influxdb 是支持字符串?dāng)?shù)據(jù)的,所以 telegraf 采集的很多 field 是字符串類型,另外 influxdb 的設(shè)計(jì),允許 labels 是非穩(wěn)態(tài)結(jié)構(gòu),比如 result_code 標(biāo)簽,有時(shí)其 value 是 0,有時(shí)其 value 是 1,在 influxdb 中都可以接受。但是上面兩點(diǎn),在類似 prometheus 的時(shí)序庫中,處理起來就很麻煩。
prometheus 生態(tài)有各種 exporters,但是設(shè)計(jì)邏輯都是一個(gè)監(jiān)控類型一個(gè) exporter,甚至一個(gè)實(shí)例一個(gè) exporter,生產(chǎn)環(huán)境可能會部署特別多的 exporters,管理起來略麻煩。
grafana-agent import 了大量 exporters 的代碼,沒有裁剪,沒有優(yōu)化,沒有最佳實(shí)踐在產(chǎn)品上的落地,有些中間件,仍然是一個(gè) grafana-agent 一個(gè)目標(biāo)實(shí)例,管理起來也很不方便。
datadog-agent確實(shí)是集大成者,但是大量代碼是 python 的,整個(gè)發(fā)布包也比較大,有不少歷史包袱,而且生態(tài)上是自成一派,和社區(qū)相對割裂。
categraf 確實(shí)又是一個(gè)輪子,categraf 希望:
- 支持 remote_write 寫入?yún)f(xié)議,支持將數(shù)據(jù)寫入 promethues、M3DB、VictoriaMetrics、InfluxDB
- 指標(biāo)數(shù)據(jù)只采集數(shù)值,不采集字符串,標(biāo)簽維持穩(wěn)態(tài)結(jié)構(gòu)
- 采用 all-in-one 的設(shè)計(jì),所有的采集工作用一個(gè) agent 搞定,未來也可以把日志和 trace 的采集納入 agent
- 純 Go 代碼編寫,靜態(tài)編譯依賴少,容易分發(fā),易于安裝
- 盡可能落地最佳實(shí)踐,不需要采集的數(shù)據(jù)無需采集,針對可能會對時(shí)序庫造成高基數(shù)的問題在采集側(cè)做出處理
- 常用的采集器,不但提供采集能力,還要整理出監(jiān)控大盤和告警規(guī)則,用戶可以直接導(dǎo)入使用
- 未來希望作為快貓 SaaS 產(chǎn)品的重要組成部分,引入快貓團(tuán)隊(duì)的研發(fā)力量持續(xù)迭代,當(dāng)然,希望更多的公司、更多人研發(fā)人員參與共建,做成國內(nèi)最開放、最好用的采集器
安裝
可以直接去 categraf releases 頁面,下載編譯好的二進(jìn)制,也可自行編譯,編譯只需要一條命令:go build 當(dāng)然,前提是機(jī)器上有 Go 環(huán)境。
如果是從老版本升級,也是建議大家查看 categraf releases 頁面,每個(gè)版本改動(dòng)了什么,升級時(shí)注意什么,都會在這里寫清楚。
在目標(biāo)機(jī)器部署,只需要 categraf 二進(jìn)制、以及 conf 目錄,conf 下有一個(gè)主配置文件:config.toml,定義機(jī)器名、全局采集頻率、全局附加標(biāo)簽、remote write backend地址等;另外就是各種采集插件的配置目錄,以input.打頭,如果某個(gè)采集器 xx 不想啟用,把 input.xx 改個(gè)其他前綴,比如 bak.input.xx,categraf 就會忽略這個(gè)采集器。
測試
我們經(jīng)常會需要測試某個(gè)采集器的行為,臨時(shí)看一下這個(gè)采集器輸出哪些監(jiān)控指標(biāo),比如配置好了 conf/input.mysql/mysql.toml 想要看看采集了哪些 mysql 指標(biāo),可以執(zhí)行命令:./categraf --test --inputs mysql
這個(gè)命令會去連接你配置的 mysql 實(shí)例,執(zhí)行SQL收集輸出,將輸出的內(nèi)容做格式轉(zhuǎn)換,最終打印到 stdout,如果我們在 stdout 正??吹搅?mysql 相關(guān)監(jiān)控指標(biāo),則說明一切正常,否則就是哪里出了問題,大概率是 conf/input.mysql/mysql.toml 配置的有問題。
如果修改了某個(gè)采集器的配置,需要重啟 categraf 或者給 categraf 進(jìn)程發(fā)送HUP信號,發(fā)送HUP信號的命令,舉例:kill -HUPpidof categraf”
另外,categraf 支持哪些命令行參數(shù),可以通過 ./categraf --help 查看
插件說明
采集插件的代碼,在代碼的 inputs 目錄,每個(gè)插件一個(gè)獨(dú)立的目錄,目錄下是采集代碼,以及相關(guān)的監(jiān)控大盤JSON(如有)和告警規(guī)則JSON(如有),Linux相關(guān)的大盤和告警規(guī)則沒有散在 cpu、mem、disk等采集器目錄,而是一并放到了 system 目錄下,方便使用。
插件的配置文件,放在conf目錄,以input.打頭,每個(gè)配置文件都有詳盡的注釋,如果整不明白,就直接去看 inputs 目錄下的對應(yīng)采集器的代碼,Go 的代碼非常易讀,比如某個(gè)配置不知道是做什么的,去采集器代碼里搜索相關(guān)配置項(xiàng),很容易就可以找到答案。
配置說明
這里對 config.toml 的每項(xiàng)配置做出解釋:
[global]
# 啟動(dòng)的時(shí)候是否在stdout中打印配置內(nèi)容
print_configs = false
# 機(jī)器名,作為本機(jī)的唯一標(biāo)識,會為時(shí)序數(shù)據(jù)自動(dòng)附加一個(gè) agent_hostname=$hostname 的標(biāo)簽
# hostname 配置如果為空,自動(dòng)取本機(jī)的機(jī)器名
# hostname 配置如果不為空,就使用用戶配置的內(nèi)容作為hostname
# 用戶配置的hostname字符串中,可以包含變量,目前支持兩個(gè)變量,
# $hostname 和 $ip,如果字符串中出現(xiàn)這兩個(gè)變量,就會自動(dòng)替換
# $hostname 自動(dòng)替換為本機(jī)機(jī)器名,$ip 自動(dòng)替換為本機(jī)IP
# 建議大家使用 --test 做一下測試,看看輸出的內(nèi)容是否符合預(yù)期
hostname = ""
# 是否忽略主機(jī)名的標(biāo)簽,如果設(shè)置為true,時(shí)序數(shù)據(jù)中就不會自動(dòng)附加agent_hostname=$hostname 的標(biāo)簽
omit_hostname = false
# 時(shí)序數(shù)據(jù)的時(shí)間戳使用ms還是s,默認(rèn)是ms,是因?yàn)閞emote write協(xié)議使用ms作為時(shí)間戳的單位
precision = "ms"
# 全局采集頻率,15秒采集一次
interval = 15
# 全局附加標(biāo)簽,一行一個(gè),這些寫的標(biāo)簽會自動(dòng)附到時(shí)序數(shù)據(jù)上
# [global.labels]
# region = "shanghai"
# env = "localhost"
# 發(fā)給后端的時(shí)序數(shù)據(jù),會先被扔到 categraf 內(nèi)存隊(duì)列里,每個(gè)采集插件一個(gè)隊(duì)列
# chan_size 定義了隊(duì)列最大長度
# batch 是每次從隊(duì)列中取多少條,發(fā)送給后端backend
[writer_opt]
# default: 2000
batch = 2000
# channel(as queue) size
chan_size = 10000
# 后端backend配置,在toml中 [[]] 表示數(shù)組,所以可以配置多個(gè)writer
# 每個(gè)writer可以有不同的url,不同的basic auth信息
[[writers]]
url = "http://127.0.0.1:19000/prometheus/v1/write"
# Basic auth username
basic_auth_user = ""
# Basic auth password
basic_auth_pass = ""
# timeout settings, unit: ms
timeout = 5000
dial_timeout = 2500
max_idle_conns_per_host = 100
對于每個(gè)采集器的配置,不在這里一一贅述,只講一些相對通用的配置項(xiàng)。
interval
每個(gè)插件的配置中,一開始通常都是 interval 配置,表示采集頻率,如果這個(gè)配置注釋掉了,就會復(fù)用 config.toml 中的采集頻率,這個(gè)配置如果配置成數(shù)字,單位就是秒,如果配置成字符串,就要給出單位,比如:
interval = 60
interval = "60s"
interval = "1m"
上面三種寫法,都表示采集頻率是1分鐘,如果是使用字符串,可以使用的單位有:
- 秒:s
- 分鐘:m
- 小時(shí):h
instances
很多采集插件的配置中,都有 instances 配置段,用 [[]] 包住,說明是數(shù)組,即,可以出現(xiàn)多個(gè) [[instances]] 配置段,比如 ping 監(jiān)控的采集插件,想對4個(gè)IP做PING探測,可以按照下面的方式來配置:
[[instances]]
targets = [
"www.baidu.com",
"127.0.0.1",
"10.4.5.6",
"10.4.5.7"
]
也可以下面這樣子配置:
[[instances]]
targets = [
"www.baidu.com",
"127.0.0.1"
]
[[instances]]
targets = [
"10.4.5.6",
"10.4.5.7"
]
interval_times
instances 下面如果有 interval_times 配置,表示 interval 的倍數(shù),比如ping監(jiān)控,有些地址采集頻率是15秒,有些可能想采集的別太頻繁,比如30秒,那就可以把interval配置成15,把不需要頻繁采集的那些instances的interval_times配置成2
或者:把interval配置成5,需要15秒采集一次的那些instances的interval_times配置成3,需要30秒采集一次的那些instances的interval_times配置成6
labels
instances 下面的 labels 和 config.toml 中的 global.labels 的作用類似,只是生效范圍不同,都是為時(shí)序數(shù)據(jù)附加標(biāo)簽,instances 下面的 labels 是附到對應(yīng)的實(shí)例上,global.labels 是附到所有時(shí)序數(shù)據(jù)上
工作計(jì)劃
categraf 已經(jīng)完成了一些常用的采集插件,還有很多需要繼續(xù)開發(fā),歡迎大家共建補(bǔ)充,已經(jīng)完成的采集插件包括:
- [x] system
- [x] kernel
- [x] kernel_vmstat
- [x] linux_sysctl_fs
- [x] cpu
- [x] mem
- [x] net
- [x] netstat
- [x] disk
- [x] diskio
- [x] ntp
- [x] processes
- [x] exec
- [x] ping
- [x] http_response
- [x] net_response
- [x] procstat
- [x] mysql
- [x] redis
- [x] oracle
- [x] rabbitmq
- [x] prometheus
- [x] tomcat
- [x] nvidia_smi
部分采集器不但提供了采集能力,還提供了監(jiān)控大盤的配置和告警規(guī)則的配置,將JSON導(dǎo)入夜鶯就可以使用,至于有哪些插件提供了JSON配置,可以通過下面的方式找到:
[root@master01 categraf]# find inputs -name "*.json"
inputs/redis/alerts.json
inputs/redis/dashboard.json
inputs/system/dashboard.json
inputs/system/alerts-linux.json
inputs/oracle/dashboard.json
inputs/ping/alerts.json
inputs/ping/dashboard.json
inputs/ntp/alerts.json
inputs/procstat/alerts.json
inputs/mysql/alerts.json
inputs/mysql/dashboard.json
inputs/tomcat/dashboard.json
inputs/rabbitmq/dashboard.json
inputs/http_response/alerts.json
inputs/http_response/dashboard.json
inputs/net_response/alerts.json
inputs/net_response/dashboard.json
還需要繼續(xù)開發(fā)的包括:
- [ ] k8s solution
- [ ] nginx vts
- [ ] mongodb
- [ ] rocketmq
- [ ] activemq
- [ ] kafka
- [ ] elasticsearch
- [ ] prometheus discovery
- [ ] windows
- [ ] mssql
- [ ] iis
- [ ] weblogic
- [ ] was
- [ ] hadoop
- [ ] ad
- [ ] zookeeper
- [ ] statsd
- [ ] snmp
- [ ] ipmi
- [ ] smartctl
- [ ] logging
- [ ] trace
