抓取協議內容協商
摘要
本文件規範了 Prometheus 從目標抓取指標時使用的協議協商機制。它定義了 Accept 標頭格式、支援的 Content Type(內容型別)以及用於確定最佳可用指標展示格式的協商過程。
簡介
Prometheus 支援多種用於抓取指標的格式,包括基於文字的格式和二進位制 protobuf 格式。根據 Accept 標頭的值,目標將選擇最合適的可用 Content Type 進行回覆。
協議型別
支援的協議
Prometheus 支援以下協議
PrometheusProto- 二進位制 protobuf 格式PrometheusText0.0.4- Prometheus 文字格式版本 0.0.4PrometheusText1.0.0- Prometheus 文字格式版本 1.0.0OpenMetricsText0.0.1- OpenMetrics 文字格式版本 0.0.1OpenMetricsText1.0.0- OpenMetrics 文字格式版本 1.0.0
協議標頭
每個協議都必須與特定的 MIME 型別和版本相關聯
| 協議 | MIME 型別 | 引數 |
|---|---|---|
| PrometheusProto | application/vnd.google.protobuf | proto=io.prometheus.client.MetricFamily;encoding=delimited |
| PrometheusText0.0.4 | text/plain | version=0.0.4 |
| PrometheusText1.0.0 | text/plain | version=1.0.0 |
| OpenMetricsText0.0.1 | application/openmetrics-text | version=0.0.1 |
| OpenMetricsText1.0.0 | application/openmetrics-text | version=1.0.0 |
Accept 標頭的構建
Accept 標頭由 Prometheus 構建,用於指示其支援的格式。
基本格式
Accept 標頭必須按如下方式構建
- 對於目標支援的每個協議
- 必須指定該協議的 MIME 型別和引數。
- 對於 protobuf 協議,必須指定 "delimited" 編碼。
- 對於 PrometheusText1.0.0 和 OpenMetricsText1.0.0,應該追加轉義方案引數。
- 應該追加權重值(q)引數。
- 應該追加一個具有最低權重值的萬用字元
*/*。
權重值 (Quality Values)
權重值應該根據協議在 Accept 標頭中的位置按降序分配
- 第一個協議:q=0.{n+1}
- 第二個協議:q=0.{n}
- 依此類推,其中 n 是支援的協議數量
轉義方案
對於 PrometheusText1.0.0 和 OpenMetricsText1.0.0 協議,Accept 標頭應該包含一個轉義方案引數:escaping=<scheme>
其中 <scheme> 必須是以下之一
allow-utf-8underscoresdotsvalues
有關轉義方案如何運作的詳細資訊,請參見 轉義方案 規範。
壓縮
Accept-Encoding 標頭應該設定為
- 如果啟用了壓縮,則為
gzip - 如果停用了壓縮,則為
identity
格式選擇
抓取目標應該根據 Prometheus 生成的 Accept 標頭中的協議列表,使用以下過程來選擇合適的 Content-Type
- 它必須使用 Accept 標頭中權重最高且 Prometheus 支援的協議。
- 如果不支援任何協議,目標可以使用使用者配置的備用抓取協議。
- 如果未指定備用協議,則目標必須使用 PrometheusText0.0.4 作為最後手段。
Content-Type 響應
目標應該響應一個與接受的格式之一相匹配的 Content-Type 標頭。Content-Type 標頭必須包含
- 相應的 MIME 型別。
- version(版本)引數。
- 對於 1.0.0 及以上版本的文字格式,轉義方案引數。
安全考量
- 目標必須驗證 Accept 標頭,以防止潛在的注入攻擊
- 必須驗證轉義方案引數,以防止協議混淆
- 必須正確淨化 Content-Type 標頭,以防止 MIME 型別混淆
示例
預設 Accept 標頭
Accept: application/openmetrics-text;version=1.0.0;escaping=allow-utf-8;q=0.5,application/openmetrics-text;version=0.0.1;q=0.4,text/plain;version=1.0.0;escaping=allow-utf-8;q=0.3,text/plain;version=0.0.4;q=0.2,/;q=0.1
Protobuf 優先 Accept 標頭
Accept: application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;q=0.5,application/
openmetrics-text;version=1.0.0;escaping=allow-utf-8;q=0.4,application/openmetrics-text;version=0.0.1;q=0.3,text/plain;version=1.0.0;escaping=allow-utf-8;q=0.2,text/plain;version=0.0.4;q=0.1,/;q=0.0