簡介
Categraf 是一個(gè)監(jiān)控采集 Agent,類似 Telegraf、Grafana-Agent祠汇、Datadog-Agent笛厦,希望對(duì)所有常見監(jiān)控對(duì)象提供監(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的代碼托管在兩個(gè)地方:
- github:https://github.com/flashcatcloud/categraf
- gitlink:https://www.gitlink.org.cn/flashcat/categraf
對(duì)比
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)境可能會(huì)部署特別多的 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ū)相對(duì)割裂坑资。
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ù)無需采集友驮,針對(duì)可能會(huì)對(duì)時(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)境兵扬。
如果是從老版本升級(jí)慌盯,也是建議大家查看 categraf releases 頁面亚皂,每個(gè)版本改動(dòng)了什么,升級(jí)時(shí)注意什么狞谱,都會(huì)在這里寫清楚。
在目標(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 就會(huì)忽略這個(gè)采集器佛致。
conf 目錄下還提供了 categraf.service 文件樣例俺榆,便于大家使用 systemd 托管 categraf。如果對(duì) systemd 不熟悉定嗓,建議學(xué)習(xí)一下課程:Linux進(jìn)階知識(shí)
測(cè)試
我們經(jīng)常會(huì)需要測(cè)試某個(gè)采集器的行為,臨時(shí)看一下這個(gè)采集器輸出哪些監(jiān)控指標(biāo)凌简,比如配置好了 conf/input.mysql/mysql.toml
想要看看采集了哪些 mysql 指標(biāo)恃逻,可以執(zhí)行命令:./categraf --test --inputs mysql
這個(gè)命令會(huì)去連接你配置的 mysql 實(shí)例,執(zhí)行SQL收集輸出畔派,將輸出的內(nèi)容做格式轉(zhuǎn)換线椰,最終打印到 stdout尘盼,如果我們?cè)?stdout 正常看到了 mysql 相關(guān)監(jiān)控指標(biāo)配紫,則說明一切正常午阵,否則就是哪里出了問題底桂,大概率是 conf/input.mysql/mysql.toml
配置的有問題。
如果修改了某個(gè)采集器的配置于个,需要重啟 categraf 或者給 categraf 進(jìn)程發(fā)送HUP信號(hào)暮顺,發(fā)送HUP信號(hào)的命令捶码,舉例:
kill -HUP `pidof 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 目錄下的對(duì)應(yīng)采集器的代碼玫锋,Go 的代碼非常易讀撩鹿,比如某個(gè)配置不知道是做什么的,去采集器代碼里搜索相關(guān)配置項(xiàng)键思,很容易就可以找到答案。
配置說明
這里對(duì) config.toml 的每項(xiàng)配置做出解釋:
[global]
# 啟動(dòng)的時(shí)候是否在stdout中打印配置內(nèi)容
print_configs = false
# 機(jī)器名看蚜,作為本機(jī)的唯一標(biāo)識(shí)供炎,會(huì)為時(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è)變量,就會(huì)自動(dòng)替換
# $hostname 自動(dòng)替換為本機(jī)機(jī)器名顷霹,$ip 自動(dòng)替換為本機(jī)IP
# 建議大家使用 --test 做一下測(cè)試击吱,看看輸出的內(nèi)容是否符合預(yù)期
hostname = ""
# 是否忽略主機(jī)名的標(biāo)簽覆醇,如果設(shè)置為true,時(shí)序數(shù)據(jù)中就不會(huì)自動(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)簽會(huì)自動(dòng)附到時(shí)序數(shù)據(jù)上
# [global.labels]
# region = "shanghai"
# env = "localhost"
# 發(fā)給后端的時(shí)序數(shù)據(jù),會(huì)先被扔到 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
對(duì)于每個(gè)采集器的配置湘今,不在這里一一贅述摩瞎,只講一些相對(duì)通用的配置項(xiàng)孝常。
interval
每個(gè)插件的配置中,一開始通常都是 interval 配置上渴,表示采集頻率稠氮,如果這個(gè)配置注釋掉了洛巢,就會(huì)復(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)控的采集插件,想對(duì)4個(gè)IP做PING探測(cè)窥浪,可以按照下面的方式來配置:
[[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 是附到對(duì)應(yīng)的實(shí)例上甘改,global.labels 是附到所有時(shí)序數(shù)據(jù)上
工作計(jì)劃
categraf 已經(jīng)完成了一些常用的采集插件十艾,還有很多需要繼續(xù)開發(fā)腾节,歡迎大家共建補(bǔ)充案腺,已經(jīng)完成的采集插件包括:
- system
- kernel
- kernel_vmstat
- linux_sysctl_fs
- cpu
- mem
- net
- netstat
- disk
- diskio
- ntp
- processes
- exec
- ping
- http_response
- net_response
- procstat
- mysql
- redis
- oracle
- rabbitmq
- prometheus
- tomcat
- 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
更多信息
如果還有問題靶衍,可以到 FAQ 中查找,我們會(huì)持續(xù)補(bǔ)充 FAQ 的內(nèi)容蜈出,如果想加交流群铡原,可以加我的微信:UlricGO 備注: Categraf加群+姓名+公司
本文由mdnice多平臺(tái)發(fā)布