Prometheus Pushgateway 的存在是為了讓臨時作業和批次作業將其指標公開給 Prometheus。由於此類工作可能存在的時間不夠長而無法刪除,因此他們可以將其指標推送到 Pushgateway。然後 Pushgateway 將這些指標公開給 Prometheus。
首先,Pushgateway無法將Prometheus變成基於推送的監控系統。有關 Pushgateway 用例的一般描述,請閱讀何時使用 Pushgateway。
Pushgateway 顯然不是聚合器或分散式計數器,而是指標快取。它沒有類似 statsd 的語意。推送的指標與您在永久運行的程式中進行抓取時呈現的指標完全相同。如果您需要分散式計數,您可以將實際的 statsd 與 Prometheus statsd 匯出器結合使用,或查看 prom-aggregation-gateway。隨著經驗的積累,Prometheus 專案有一天可能能夠提供一種獨立於 Pushgateway 的本地解決方案,甚至可能作為 Pushgateway 的一部分。
對於機器級指標,節點導出器的文字檔案收集器通常更合適。 Pushgateway 設計用於服務等級指標。
Pushgateway 不是事件儲存。雖然您可以使用 Prometheus 作為 Grafana 註釋的資料來源,但必須使用某些事件日誌框架來追蹤發布事件等內容。
不久前,我們決定不對推送的指標實現「超時」或 TTL,因為幾乎所有提議的用例都被證明是我們強烈反對的反模式。您可以關注 prometheus-developers 郵件清單上的最新討論。
從發布頁面下載適合您平台的二進位版本並解壓縮 tarball。
如果您想從原始程式碼自行編譯,則需要一個有效的 Go 設定。然後使用提供的 Makefile(類型make
)。
對於最基本的設置,只需啟動二進位檔案即可。若要變更偵聽位址,請使用--web.listen-address
標誌(例如「0.0.0.0:9091」或「:9091」)。預設情況下,Pushgateway 不保留指標。但是, --persistence.file
標誌可讓您指定一個文件,其中推送的指標將被持久化(以便它們在 Pushgateway 重新啟動後繼續存在)。
您可以使用 prom/pushgateway Docker 映像部署 Pushgateway。
例如:
docker pull prom/pushgateway
docker run -d -p 9091:9091 prom/pushgateway
必須使用常用方法之一將 Pushgateway 配置為 Prometheus 抓取的目標。但是,您應該始終在 scrape 配置中設定honor_labels: true
(有關詳細說明,請參閱下文)。
Prometheus 用戶端程式庫應該具有將註冊的指標推送到 Pushgateway 的功能。通常,Prometheus 用戶端被動地提供 Prometheus 伺服器抓取的指標。支援推送的客戶端程式庫都有一個推送函數,需要由客戶端程式碼呼叫。然後,它會使用下面描述的 API 主動將指標推送到 Pushgateway。
使用 Prometheus 文字協議,推送指標非常簡單,無需提供單獨的 CLI。只需使用命令列 HTTP 工具(如curl
即可。您最喜歡的腳本語言很可能具有一些內建的 HTTP 功能,您也可以在此處利用。
請注意,在文字協定中,每一行都必須以換行符(也稱為“LF”或“n”)結尾。以其他方式結束一行,例如使用“CR”又名“r”、“CRLF”又名“rn”,或僅結束資料包,將導致協定錯誤。
推送的指標按群組管理,由任意數量標籤的分組鍵標識,其中第一個標籤必須是job
標籤。透過網路介面可以輕鬆檢查這些群組。
有關標籤值中特殊字元的含義,請參閱下面的 URL 部分。
範例:
將單一樣本推送到{job="some_job"}
標識的群組:
echo "some_metric 3.14" | curl --data-binary @- http://pushgateway.example.org:9091/metrics/job/some_job
由於沒有提供類型信息, some_metric
將是untyped
類型。
將更複雜的內容推入{job="some_job",instance="some_instance"}
標識的群組:
cat <
請注意如何提供類型資訊和幫助字串。這些行是可選的,但強烈建議您使用更複雜的內容。
刪除{job="some_job",instance="some_instance"}
標識的群組中的所有指標:
curl -X DELETE http://pushgateway.example.org:9091/metrics/job/some_job/instance/some_instance
刪除{job="some_job"}
標識的群組中的所有指標(請注意,這不包括上例中{job="some_job",instance="some_instance"}
組中的指標,即使這些指標具有相同的工作標籤):
curl -X DELETE http://pushgateway.example.org:9091/metrics/job/some_job
刪除所有群組中的所有指標(需要透過命令列標誌--web.enable-admin-api
啟用管理 API):
curl -X PUT http://pushgateway.example.org:9091/api/v1/admin/wipe
Prometheus 伺服器將為每個抓取的指標附加一個job
標籤和一個instance
標籤。 job
標籤的值來自抓取配置。當您將 Pushgateway 配置為 Prometheus 伺服器的抓取目標時,您可能會選擇作業名稱,例如pushgateway
。 instance
標籤的值會自動設定為抓取目標的主機和連接埠。因此,從 Pushgateway 抓取的所有指標都將以 Pushgateway 的主機和連接埠作為instance
標籤以及job
標籤(如pushgateway
。您可能已附加到推送到 Pushgateway 的指標的job
和instance
標籤之間的衝突可以透過將這些標籤重新命名為exported_job
和exported_instance
來解決。
然而,在抓取 Pushgateway 時,這種行為通常是不受歡迎的。通常,您希望保留推送到 Pushgateway 的指標的job
和instance
標籤。這就是為什麼你必須在 Pushgateway 的 scrape 設定中設定honor_labels: true
。它可以實現所需的行為。有關詳細信息,請參閱文件。
這給我們留下了推送到 Pushgateway 的指標不具有instance
標籤的情況。這種情況很常見,因為推送的指標通常處於服務級別,因此與特定實例無關。即使使用honor_labels: true
,如果首先沒有設定instance
標籤,Prometheus 伺服器也會附加instance
標籤。因此,如果將指標推送到 Pushgateway 時沒有實例標籤(並且分組鍵中沒有實例標籤,請參見下文),Pushgateway 將使用空實例標籤 ( {instance=""}
) 導出它,這相當於根本沒有instance
標籤,但阻止伺服器附加實例標籤。
Pushgateway 透過相同的/metrics
端點公開所有推送的指標及其自己的指標。 (詳細資訊請參閱公開的指標部分。)因此,所有指標必須相互一致:同名的指標必須具有相同的類型,即使它們被推送到不同的群組,並且不能有重複,即具有相同名稱和完全相同標籤對的指標。會導致不一致的推送將被拒絕,狀態代碼為 400。
不過,不一致的幫助字串是可以容忍的。 Pushgateway 將選擇一個獲勝的幫助字串並在資訊層級記錄它。
遺留說明:Pushgateway 自己的push_time_seconds
指標的幫助字串在 v0.10.0 中已更改。透過使用持久化文件,推送到早期版本Pushgateway的指標可以使其成為v0.10.0或更高版本的Pushgateway。在這種情況下,將顯示上述日誌訊息。一旦先前推送的每個群組被刪除或收到新的推播,日誌訊息就會消失。
推送期間執行的一致性檢查與抓取期間執行的一致性檢查相同。在常見的用例中,抓取比推播更常見。因此,推送時間檢查的效能成本並不相關。然而,如果 Pushgateway 上的大量指標與頻繁的推送相結合,推送時長可能會變得非常長。在這種情況下,您可以考慮使用命令列標誌--push.disable-consistency-check
,這可以節省推送期間一致性檢查的成本,但允許推送不一致的指標。檢查仍然會在抓取過程中進行,因此只要 Pushgateway 上儲存的指標不一致,所有抓取都會失敗。因此,設定該標誌會使您面臨因一次不一致的推送而停用 Pushgateway 的風險。
如果您在時間t 1推送指標,您可能會傾向於相信 Prometheus 會使用相同的時間戳t 1來抓取它們。相反,Prometheus 附加的時間戳記是它抓取 Pushgateway 的時間。為什麼會這樣呢?
在Prometheus的世界觀中,一個metric可以隨時被抓取。無法抓取的指標基本上已經不存在。 Prometheus 具有一定的容忍度,但如果它無法在 5 分鐘內獲得某個指標的任何樣本,它將表現得好像該指標不再存在一樣。防止這種情況實際上是使用 Pushgateway 的原因之一。 Pushgateway 將使您的臨時工作的指標可以隨時進行抓取。將推送時間附加為時間戳會破壞該目的,因為在最後一次推送後 5 分鐘,您的指標對於 Prometheus 來說將顯得過時,就好像它根本無法再被刮擦一樣。 (普羅米修斯只知道每個樣本一個時間戳,無法區分「推送時間」和「抓取時間」。)
由於沒有任何用例可以附加不同的時間戳,並且許多用戶試圖錯誤地這樣做(儘管沒有客戶端庫支援此操作),因此 Pushgateway 拒絕任何帶有時間戳記的推送。
如果您認為需要推送時間戳,請參閱何時使用 Pushgateway。
為了更容易對失敗的推送器或最近未運行的推送器發出警報,Pushgateway 將在指標push_time_seconds
和push_failure_time_seconds
中添加最後一次成功和失敗的POST
/ PUT
到每個組的 Unix 時間戳。這將覆蓋任何使用該名稱推送的指標。任一指標的值為零表示該組從未見過成功或失敗的POST
/ PUT
。
所有推送均透過 HTTP 完成。該介面有點像 REST。
Pushgateway 監聽的預設連接埠是 9091。
/metrics/job/{//}
用作job
標籤的值,後面跟著任意數量的其他標籤對(可能包含也可能不包含instance
標籤)。 URL路徑定義的標籤集用作分組鍵。任何已在請求正文中設定的標籤(作為常規標籤,例如name{job="foo"} 42
)都將被覆蓋,以匹配 URL 路徑定義的標籤!
如果job
或任何標籤名稱以@base64
為後綴,則下列作業名稱或標籤值將根據 RFC 4648 使用 URL 和檔案名稱安全字母表解釋為 Base64 編碼字串。 (填充是可選的,但需要單一=
來編碼空標籤值。)這是處理以下情況的唯一方法:
/
作業名稱或標籤值,因為普通(甚至 URI 編碼) /
否則會被解釋為路徑分隔符號。//
或尾隨/
將會消失。請注意,空job
名稱無效。空標籤值有效但很少有用。要使用 base64 對其進行編碼,您必須至少使用一個=
填充字元以避免//
或尾隨/
。對於其他特殊字符,通常的 URI 組件編碼也可以工作,但 base64 可能更方便。
理想情況下,客戶端庫負責處理後綴和編碼。
範例:
若要使用分組鍵job="directory_cleaner",path="/var/tmp"
,下列路徑將無法運作:
/metrics/job/directory_cleaner/path//var/tmp
相反,對標籤值使用 base64 URL 安全編碼,並透過在標籤名稱後面加上@base64
來標記它:
/metrics/job/directory_cleaner/path@base64/L3Zhci90bXA
如果您沒有使用為您處理編碼的用戶端程式庫,則可以使用編碼工具。例如,有一個命令列工具base64url
(Debian軟體basez
),您可以將其與curl
結合使用,透過以下方式從命令列推送:
echo 'some_metric{foo="bar"} 3.14' | curl --data-binary @- http://pushgateway.example.org:9091/metrics/job/directory_cleaner/path@base64/$(echo -n '/var/tmp' | base64url)
若要使用包含空標籤值的分組鍵,例如job="example",first_label="",second_label="foobar"
,下列路徑將無法運作:
/metrics/job/example/first_label//second_label/foobar
相反,請使用以下包含=
填滿字元的路徑:
/metrics/job/example/first_label@base64/=/second_label/foobar
分組鍵job="titan",name="Προμηθεύς"
可以用 URI 編碼「傳統地」表示:
/metrics/job/titan/name/%CE%A0%CF%81%CE%BF%CE%BC%CE%B7%CE%B8%CE%B5%CF%8D%CF%82
或者您可以使用更緊湊的 base64 編碼:
/metrics/job/titan/name@base64/zqDPgc6_zrzOt864zrXPjc-C
較新版本的 Prometheus 展示格式(文字和 protobuf)支援度量和標籤名稱中的完整 UTF-8 字元集。如果設定了命令列標誌--push.enable-utf8-names
Pushgateway 僅接受名稱中的特殊字元。為了允許作為 URL 路徑一部分的標籤名稱中的特殊字符,該標誌還啟用特定的編碼機制。這與上述標籤值的 base64 編碼類似,但由於技術和歷史原因,其工作原理在細節上有所不同。和以前一樣,客戶端庫通常應該處理編碼。其工作原理如下:
U__
開頭。_1F60A_
。__
。U__
開頭,則這些字元也必須編碼,結果為U___55_____
。 (即U__
+ _55_
(對於U
)+ __
+ __
)。U__
開頭但包含無效序列(例如U__in_xxx_valid
)的標籤名稱保持不變。例如,標籤"foo.bar"="baz"
將被編碼為:
/metrics/job/example/U__foo_2e_bar/baz
此編碼與標籤值的 base64 編碼相容:
/metrics/job/example/U__foo_2e_bar@base64/YmF6
請注意,此方法有一個不太可能的邊緣情況,未正確處理:不知道編碼機制的推送者可能使用的標籤名稱也是另一個標籤名稱的有效編碼版本。例如,如果推播器打算使用標籤名稱U__foo_2e_bar
,但不將其編碼為U___55_____foo__2e__bar
,則 Pushgateway 會將U__foo_2e_bar
解碼為foo.bar
。這是透過--push.enable-utf8-names
標誌選擇解碼的主要原因。
PUT
方法PUT
用於推送一組指標。 URL 中指定的分組鍵的所有指標都將替換為使用PUT
推送的指標。
請求的正文包含要以分隔的二進位協定緩衝區或簡單的純文字格式推送的指標(兩者皆在版本 0.0.4 中,請參閱資料展示格式規格)。兩種變體之間的區分是透過Content-Type
標頭完成的。 (對協定緩衝區使用值application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited
,否則嘗試使用文字格式作為後備。)
成功時的回應代碼為 200、202 或 400。200 回應意味著推送成功,取代現有指標組或建立新指標。如果請求格式錯誤或推送的指標與推送到其他群組的指標不一致或與 Pushgateway 本身的指標衝突,則可能會發生 400 回應。回應正文中傳回解釋並記錄錯誤等級。僅當設定了--push.disable-consistency-check
標誌時才會出現 202。在這種情況下,推送的指標只是排隊,不檢查一致性。然而,如上所述,不一致將導致抓取失敗。
在極少數情況下,Pushgateway 最終可能會推送一組不一致的指標。在這種情況下,即使罪魁禍首是先前推送的指標,新推送也會因不一致而被拒絕。刪除有問題的指標以擺脫這種情況。
如果使用 protobuf 格式,請勿在一次推播中傳送重複的 MetricFamily proto 訊息(即多個同名訊息),因為它們會相互覆蓋。
請注意,Pushgateway 不提供任何強有力的保證將推送的指標持久保存到磁碟。 (伺服器崩潰可能會導致資料遺失。或 Pushgateway 配置為根本不持久保存到磁碟。)
具有空正文的PUT
請求實際上會刪除具有指定分組鍵的所有指標。但是,與下面描述的DELETE
請求相反,它確實更新了push_time_seconds
指標。
POST
方式POST
工作方式與PUT
方法完全相同,但僅替換與新推送的指標同名的指標(在具有相同分組鍵的指標中)。
具有空白正文的POST
請求僅更新push_time_seconds
指標,但不會變更任何先前推送的指標。
DELETE
方法DELETE
用於從 Pushgateway 中刪除指標。請求不得包含任何內容。刪除 URL 中指定的分組鍵的所有指標。
成功時的回應代碼始終為 202。無法保證請求將實際執行或結果將到達持久層(例如,在伺服器崩潰的情況下)。但是, PUT
/ POST
和DELETE
請求的順序是保證的,即如果您成功發送了DELETE
請求,然後發送了PUT
,則保證DELETE
將首先被處理(反之亦然)。
刪除沒有指標的分組鍵是無操作,不會導致錯誤。
POST 或 PUT 請求的正文可以是 gzip 或 snappy 壓縮的。新增標頭Content-Encoding: gzip
或Content-Encoding: snappy
來執行此操作。
範例:
echo " some_metric 3.14 " | gzip | curl -H ' Content-Encoding: gzip ' --data-binary @- http://pushgateway.example.org:9091/metrics/job/some_job
echo " some_metric 3.14 " | snzip | curl -H ' Content-Encoding: snappy ' --data-binary @- http://pushgateway.example.org:9091/metrics/job/some_job
管理 API 提供對 Pushgateway 的管理訪問,並且必須透過設定--web.enable-admin-api
標誌來明確啟用。
Pushgateway 監聽的預設連接埠是 9091。
/api//admin/
HTTP_METHOD | API_版本 | 處理程式 | 描述 |
---|---|---|---|
放 | v1 | 擦拭 | 從 Pushgateway 安全刪除所有指標。 |
例如,要擦除 Pushgateway 中的所有指標:
curl -X PUT http://pushgateway.example.org:9091/api/v1/admin/wipe
查詢 API 允許存取推送的指標以及建置和運行時資訊。
/api//
HTTP_METHOD | API_版本 | 處理程式 | 描述 |
---|---|---|---|
得到 | v1 | 地位 | 以 JSON 格式傳回建置資訊、命令列標誌和開始時間。 |
得到 | v1 | 指標 | 以 JSON 格式傳回推送的指標係列。 |
例如 :
curl -X GET http://pushgateway.example.org:9091/api/v1/status | jq
{
"status": "success",
"data": {
"build_information": {
"branch": "master",
"buildDate": "20200310-20:14:39",
"buildUser": "[email protected]",
"goVersion": "go1.13.6",
"revision": "eba0ec4100873d23666bcf4b8b1d44617d6430c4",
"version": "1.1.0"
},
"flags": {
"log.format": "logfmt",
"log.level": "info",
"persistence.file": "",
"persistence.interval": "5m0s",
"push.disable-consistency-check": "false",
"web.enable-admin-api": "false",
"web.enable-lifecycle": "false",
"web.external-url": "",
"web.listen-address": ":9091",
"web.route-prefix": "",
"web.telemetry-path": "/metrics"
},
"start_time": "2020-03-11T01:44:49.9189758+05:30"
}
}
curl -X GET http://pushgateway.example.org:9091/api/v1/metrics | jq
{
"status": "success",
"data": [
{
"labels": {
"job": "batch"
},
"last_push_successful": true,
"my_job_duration_seconds": {
"time_stamp": "2020-03-11T02:02:27.716605811+05:30",
"type": "GAUGE",
"help": "Duration of my batch job in seconds",
"metrics": [
{
"labels": {
"instance": "",
"job": "batch"
},
"value": "0.2721322309989773"
}
]
},
"push_failure_time_seconds": {
"time_stamp": "2020-03-11T02:02:27.716605811+05:30",
"type": "GAUGE",
"help": "Last Unix time when changing this group in the Pushgateway failed.",
"metrics": [
{
"labels": {
"instance": "",
"job": "batch"
},
"value": "0"
}
]
},
"push_time_seconds": {
"time_stamp": "2020-03-11T02:02:27.716605811+05:30",
"type": "GAUGE",
"help": "Last Unix time when changing this group in the Pushgateway succeeded.",
"metrics": [
{
"labels": {
"instance": "",
"job": "batch"
},
"value": "1.5838723477166057e+09"
}
]
}
}
]
}
Pushgateway 提供了一組管理 API 來簡化自動化和整合。
HTTP_METHOD | 小路 | 描述 |
---|---|---|
得到 | /-/健康 | 當 Pushgateway 健康時返回 200。 |
得到 | /-/準備好 | 當 Pushgateway 準備好為流量提供服務時,返回 200。 |
--web.enable-lifecycle
標誌啟用。HTTP_METHOD | 小路 | 描述 |
---|---|---|
放 | /-/辭職 | 觸發 Pushgateway 正常關閉。 |
或者,可以透過向 Pushgateway 進程發送SIGTERM
來觸發正常關閉。
Pushgateway 透過配置的--web.telemetry-path
(預設值: /metrics
)公開以下指標:
push_time_seconds
和push_failure_time_seconds
,如上所述。process_...
go_...
promhttp_metric_handler_requests_...
# HELP pushgateway_build_info A metric with a constant '1' value labeled by version, revision, branch, and goversion from which pushgateway was built.
# TYPE pushgateway_build_info gauge
pushgateway_build_info{branch="master",goversion="go1.10.2",revision="8f88ccb0343fc3382f6b93a9d258797dcb15f770",version="0.5.2"} 1
# HELP pushgateway_http_push_duration_seconds HTTP request duration for pushes to the Pushgateway.
# TYPE pushgateway_http_push_duration_seconds summary
pushgateway_http_push_duration_seconds{method="post",quantile="0.1"} 0.000116755
pushgateway_http_push_duration_seconds{method="post",quantile="0.5"} 0.000192608
pushgateway_http_push_duration_seconds{method="post",quantile="0.9"} 0.000327593
pushgateway_http_push_duration_seconds_sum{method="post"} 0.001622878
pushgateway_http_push_duration_seconds_count{method="post"} 8
# HELP pushgateway_http_push_size_bytes HTTP request size for pushes to the Pushgateway.
# TYPE pushgateway_http_push_size_bytes summary
pushgateway_http_push_size_bytes{method="post",quantile="0.1"} 166
pushgateway_http_push_size_bytes{method="post",quantile="0.5"} 182
pushgateway_http_push_size_bytes{method="post",quantile="0.9"} 196
pushgateway_http_push_size_bytes_sum{method="post"} 1450
pushgateway_http_push_size_bytes_count{method="post"} 8
# HELP pushgateway_http_requests_total Total HTTP requests processed by the Pushgateway, excluding scrapes.
# TYPE pushgateway_http_requests_total counter
pushgateway_http_requests_total{code="200",handler="static",method="get"} 5
pushgateway_http_requests_total{code="200",handler="status",method="get"} 8
pushgateway_http_requests_total{code="202",handler="delete",method="delete"} 1
pushgateway_http_requests_total{code="202",handler="push",method="post"} 6
pushgateway_http_requests_total{code="400",handler="push",method="post"} 2
一般來說,最好對push_time_seconds
遠遠落後於預期的情況發出警報。這將捕獲失敗的推送以及完全關閉的推送器。
若要更早偵測失敗的推播,請在push_failure_time_seconds > push_time_seconds
上發出警報。
推送也可能會因為格式錯誤而失敗。在這種情況下,它們永遠不會到達任何指標群組,因此不會設定任何push_failure_time_seconds
指標。這些推播仍計為pushgateway_http_requests_total{code="400",handler="push"}
。您可以對該指標的rate
發出警報,但您必須檢查日誌以識別有問題的推播程式。
Pushgateway 支援 TLS 和基本驗證。這可以更好地控制各種 HTTP 端點。
若要使用 TLS 和/或基本驗證,您需要使用--web.config.file
參數傳遞設定檔。文件的格式在匯出工具包儲存庫中進行了描述。
請注意,TLS 和基本驗證設定會影響所有 HTTP 端點:用於抓取的 /metrics、透過 /metrics/... 推送指標的 API、透過 /api/... 的管理 API 以及 Web UI。
普通的二進位檔案將 Web 檔案嵌入到resources
目錄中。出於開發目的,讓正在運行的二進位檔案直接使用這些檔案會很方便(這樣您就可以立即看到更改的效果)。若要切換到直接使用,請將-tags dev
新增至.promu.yml
中的flags
條目,然後make build
。透過恢復.promu.yml
變更並輸入make assets
來切換回「正常」模式。
相關的風格指南是 Go 代碼審查註釋以及 Peter Bourgon 的《Go:生產環境最佳實踐》的格式和風格部分。