本文介紹如何使用可觀測監控 Prometheus 版提供的Pushgateway功能推送數據。
方案概覽
如果您的數據源不能或不可以定期被Prometheus Server拉取數據(例如在沒有穩定網絡連接的環境中),您可以使用Pushgateway推送,數據源會先將監控數據發送到Pushgateway,再由Prometheus Server周期性地獲取,實現步驟如下:
獲取Pushgateway地址:通過可觀測監控 Prometheus 版控制臺獲取Pushgateway地址。
上報數據:使用curl命令或者開源SDK實現數據推送,確保指標數據能夠及時、可靠地被Prometheus收集并進行監控。
增加數據保護配置(可選):標準的Pushgateway協議是不包含數據保護相關內容的,在Pushgateway的SDK中只有基本的Basic Auth,并沒有更高級和通用的鑒權實現,即任何客戶端一旦獲取Pushgateway端點地址,都可以推送數據。在可觀測監控 Prometheus 版控制臺獲取Token,實現標準的JWT鑒權協議,從而保護您的數據安全。
前提條件
已創建Prometheus實例。具體操作,請參見:
步驟一:獲取Push Gateway地址
選擇Prometheus實例:登錄Prometheus控制臺。在左側導航欄單擊實例列表,進入可觀測監控 Prometheus 版的實例列表頁面。單擊目標Prometheus實例名稱。
獲取Push Gateway 地址:在左側導航欄,選擇設置,然后在設置頁簽的Push Gateway 地址區域獲取公網的URL地址。
步驟二:上報數據
使用開源SDK推送數據
目前數據協議支持Text Format和Protobuf Delimited這兩種數據層協議,暫不支持Protobuf Text、Protobuf Compact-Text和Openmetrics這三種協議,SDK一般默認是Protobuf Delimited協議。
目前元數據HELP不支持中文字符,如果HELP中有中文字符會導致數據上報失敗。
本文以Go語言和Java語言為例介紹如何使用開源SDK推送指標數據。
Go語言示例如下:
completionTime := prometheus.NewGauge(prometheus.GaugeOpts{
Name: "db_backup_last_completion_timestamp_seconds",
Help: "The timestamp of the last successful completion of a DB backup.",
})
completionTime.SetToCurrentTime()
url : = "https://cn-hangzhou.arms.aliyuncs.com/prometheus/52b12ea9cf4bb9e35****/16727530178****/1df8lj***/cn-hangzhou/api/v2"
pusher := push.New(url, "test").
Collector(completionTime).Client(http.DefaultClient).
Grouping("key1", "test1").Grouping("key2", "dfdf/sdsd/").
Format(expfmt.FmtProtoDelim)
if err := pusher.Push(); err != nil {
fmt.Println("Could not push completion time to PushGateway: ", err)
}
Java語言示例如下:
CollectorRegistry registry = new CollectorRegistry();
Gauge duration = Gauge.build()
.name("my_batch_job_duration_seconds").help("Duration of my batch job in seconds.").register(registry);
Gauge.Timer durationTimer = duration.startTimer();
try {
// Your code here.
// This is only added to the registry after success,
// so that a previous success in the Pushgateway isn't overwritten on failure.
Gauge lastSuccess = Gauge.build()
.name("my_batch_job_last_success").help("Last time my batch job succeeded, in unixtime.").register(registry);
lastSuccess.setToCurrentTime();
} finally {
durationTimer.setDuration();
PushGateway pg = new PushGateway(new URL("https://cn-hangzhou.arms.aliyuncs.com/prometheus/52b12ea9cf4bb9e35****/16727530178****/1df8lj***/cn-hangzhou/api/v2"));
pg.pushAdd(registry, "my_batch_job");
}
在您使用開源SDK時,填入從Prometheus監控控制臺上獲取的Pushgateway地址后,系統會自動補齊類似
/metrics/job/<JOB_NAME>{/<LABEL_NAME>/<LABEL_VALUE>}
的后綴,若您使用的不是開源SDK,那么需要您自行拼接后綴,否則會報404錯誤。若您需要為可觀測監控 Prometheus 版云服務共享租戶集群中推送數據,這里要求推送的指標需統一攜帶
tenant_userid=****
標簽,標簽值是該指標隸屬的阿里云賬號ID(即主賬號ID),用于區分指標的隸屬關系。
使用curl命令推送數據
目前不支持application/x-www-form-urlencoded
類型的Request,在curl命令中,需要增加Header,指定Content-Type: text/plain; version=0.0.4; charset=utf-8
。
echo "some_metric 3.14" | curl -H "Content-Type: text/plain; version=0.0.4; charset=utf-8" --data-binary @- https://cn-hangzhou.arms.aliyuncs.com/prometheus/51bbea9ck41b9e35****/16727530178****/1df8lj***/cn-hangzhou/api/v2/metrics/label_key_1/label_value_1/label_key_2/label_value_2
多個Label可以在URL后面拼接,但需要注意整體URL長度。
步驟三:增加數據保護配置(可選)
獲取token:在左側導航欄,選擇設置,然后在設置頁簽的Token區域單擊生成token。
傳遞token:生成Token后,您可以看到具體的Token值,有以下兩種方式傳遞Token。
方式一:將Token設置到客戶端請求Header里,即可正常的推送數據,否則系統會拒絕數據寫入。Header的設置如下圖所示:
方式二:由于在Pushgateway的SDK里只有基本的Basic Auth,并沒有支持JWT。如果想要完全使用SDK并實現鑒權,可以使用BasicAuth接口,將Password設置為Token,服務側兼容了這種鑒權方式。使用第一種方式有一定的開發成本。這里以Go語言SDK為例。
pusher := push.New(url, "test"). Collector(completionTime).Client(http.DefaultClient). Grouping("key1", "test1").Grouping("key2", "dfdf/sdsd/"). .BasicAuth("admin", "實際token值"). Format(expfmt.FmtProtoDelim)
結果驗證
您可以通過Grafana查詢數據是否成功推送。
進入ApiServer大盤:在左側導航欄,選擇大盤列表,然后單擊名稱為ApiServer的大盤超鏈接,系統會跳轉至大盤頁面。
選擇Explore查看數據:在大盤頁面的左側導航欄將鼠標懸停在圖標上(圖標①),并在彈框中單擊Explore,然后在Explore頁面右側的下拉框中(圖標②)選擇對應Explore查看數據是否推送成功。