背景
前段時間無意間看到一篇公衆號 招賢令:一起來搞一個新開源項目,作者介紹他想要做一個開源項目:cprobe 用於整合目前市面上散落在各地的 Exporter
,統一進行管理。
比如我們常用的 blackbox_exporter/mysqld_exporter
等。
以往的每一個 Exporter 都需要單獨部署運維。
同時又完全兼容 Prometheus
生態,也可以複用現有的監控面板。
恰好這段時間我也在公司從事可觀測性相關的業務,發現這確實是一個痛點。
於是便一直在關注這個項目,同時也做了些貢獻;因爲該項目的核心是用於整合 exporter,所以爲其編寫插件也是非常重要的貢獻了。
編寫插件
整個項目執行流程圖如下:
可以看到編寫插件最核心的便是自定義插件解析自定義的配置文件、抓取指標的邏輯。
比如我們需要在配置中指定抓取目標的域名、抓取規則等。
這裏 cprobe
已經抽象出了兩個接口,我們只需要做對應的實現即可。
type Plugin interface {
// ParseConfig is used to parse config
ParseConfig(baseDir string, bs []byte) (any, error)
// Scrape is used to scrape metrics, cfg need to be cast specific cfg
Scrape(ctx context.Context, target string, cfg any, ss *types.Samples) error
}
下面就以我之前編寫的 Consul 爲例。
# Allows any Consul server (non-leader) to service a read.
allow_stale = true
# === CA
# File path to a PEM-encoded certificate authority used to validate the authenticity of a server certificate.
ca_file = "/etc/consul.d/consul-agent-ca.pem"
# File path to a PEM-encoded certificate used with the private key to verify the exporter's authenticity.
cert_file = "/etc/consul.d/consul-agent.pem"
# Generate a health summary for each service instance. Needs n+1 queries to collect all information.
health_summary = true
# File path to a PEM-encoded private key used with the certificate to verify the exporter's authenticity
key_file = "/etc/consul.d/consul-agent-key.pem"
# Disable TLS host verification.
insecure = false
這裏每個插件的配置都不相同,所以我們需要將配置解析到具體的結構體中。
func (*Consul) ParseConfig(baseDir string, bs []byte) (any, error) {
var c Config
err := toml.Unmarshal(bs, &c)
if err != nil {
return nil, err
}
if c.Timeout == 0 {
c.Timeout = time.Millisecond * 500
}
return &c, nil
}
解析配置文件沒啥好說的,根據自己的邏輯實現即可,可能會配置一些默認值而已。
下面是核心的抓取邏輯,本質上就是使用對應插件的 Client
獲取一些核心指標封裝爲 Prometheus
的 Metric
,然後由 cprobe
寫入到遠端的 Prometheus
中(或者是兼容 Prometheus
的數據庫中)。
// Create client
config.HttpClient.Timeout = opts.Timeout
config.HttpClient.Transport = transport
client, err := consul_api.NewClient(config)
if err != nil {
return nil, err
}
var requestLimitChan chan struct{}
if opts.RequestLimit > 0 {
requestLimitChan = make(chan struct{}, opts.RequestLimit)
}
所有的指標數據都是通過對應的客戶端獲取。
如果是遷移一個存在的 export 到 cprobe 中時,這些抓取代碼我們都可以直接複製對應 repo 中的代碼。
比如我就是參考的:https://github.com/prometheus/consul_exporter
除非我們是重新寫一個插件,不然對於一些流行的庫或者是中間件都已經有對應的 exporter
了。
具體的列表可以參考這裏:
https://prometheus.io/docs/instrumenting/exporters/
之後便需要在對應的插件目錄(./conf.d
)創建我們的配置文件:
爲了方便測試,可以在啓動 cprobe 時添加 -no-writer
讓指標打印在控制檯,從而方便調試。
總結
之前就有人問我有沒有畢竟好上手的開源項目,這不就來了嗎?
正好目前項目創建時間不長,代碼和功能也比較簡單,同時還有可觀察系統大佬帶隊,確實是一個非常適合新手參與的開源項目。
項目地址:
https://github.com/cprobe/cprobe
私貨
最後夾帶一點私貨:前兩天幫一個讀者朋友做了一次付費的技術諮詢(主要是關於 Pulsar 相關的),也是我第一次做付費內容,這種拿人錢財替人消災難道就是知識付費的味道嗎😂?
所以我就趁熱打鐵在朋友圈發了個廣告,沒想到又有個朋友找我做關於職場相關諮詢,最後能幫助到對方自己也很開心。
其實經常也有人通過社媒、郵件等渠道找我幫忙看問題,一些簡單的我通常也會抽時間回覆。
但後面這位朋友也提到,如果我不是付費,他也不好意思來找我聊這些內容,畢竟涉及到一些隱私,同時也需要佔用雙方 1~2 小時的時間。
這樣明碼標價的方式確實也能更方便的溝通,同時也能減輕對方的心裏負擔,直接從白嫖轉爲付費大佬。
鋪墊了這麼多,主要目的是想進行一個小範圍的嘗試,如果對以下內容感興趣的朋友歡迎加我微信私聊:
包括但不限於技術、職場、開源等我有經驗的行業都可以聊。
反饋不錯的話也需要可以作爲我的長期副業做下去。