UTF-8メトリック名とラベル名のエスケープ方式

概要

このドキュメントでは、レガシー文字セット外の文字を含むメトリック名とラベル名のテキストExpositionを生成する際にPrometheusが使用するさまざまなエスケープ方式を規定します。これらの方式は、`Accept`ヘッダーと`Content-Type`ヘッダーの`escaping`パラメータを介してスクレイプ時にネゴシエートされます。

はじめに

Prometheusは、レガシー文字セット(a-zA-Z0-9_:)外の文字を含むテキストExpositionのメトリック名とラベル名を処理するために、複数のエスケープ方式をサポートしています。エスケープ方式はスクレイプ時にネゴシエートされ、メトリックの生成者がメトリック名をどのようにフォーマットすべきかに影響します。

エスケープ方式

エスケープなし (allow-utf-8)

ヘッダー値: `escaping=allow-utf-8`

動作:

  • メトリック名とラベル名は、有効なUTF-8文字列でなければなりません。
  • 名前がExpositionフォーマット内で二重引用符で囲まれている場合、`\`、`\n`、`"`はバックスラッシュでエスケープされなければなりません。
  • 名前がExpositionフォーマット内で引用符で囲まれていない場合、`\`と`\n`はバックスラッシュでエスケープされなければなりません。
  • この方式は、生成者と消費者の両方がUTF-8名をサポートしている場合にのみ使用しなければなりません。

アンダースコアエスケープ (underscores)

ヘッダー値: `escaping=underscores`

動作:

  • レガシー文字セット(a-zA-Z0-9_:)に含まれない文字は、アンダースコアに置き換えられなければなりません。
  • 最初の文字は、文字、アンダースコア、またはコロンでなければなりません。
  • 後続の文字は、文字、数字、アンダースコア、またはコロンでなければなりません。
  • 例: `metric.name/with/slashes`は`metric_name_with_slashes`になります。

ドットエスケープ (dots)

ヘッダー値: `escaping=dots`

動作:

  • ドット(.)は`_dot_`に置き換えられなければなりません。
  • 既存のアンダースコアは、二重アンダースコア(`__`)に置き換えられなければなりません。
  • その他の非レガシー文字は、単一のアンダースコアに置き換えられなければなりません。
  • 最初の文字は、文字、アンダースコア、またはコロンでなければなりません。
  • 後続の文字は、文字、数字、アンダースコア、またはコロンでなければなりません。
  • 例: `metric.name.with.dots`は`metric_dot_name_dot_with_dot_dots`になります。

値エンコーディングエスケープ (values)

ヘッダー値: `escaping=values`

動作:

  • 名前は`U__`で始まらなければなりません。
  • レガシー文字セット(a-zA-Z0-9_:)に含まれない各文字は、そのUnicodeコードポイントを16進数で表し、アンダースコアで囲んで置き換えられなければなりません。
  • 単一のアンダースコアは、二重のアンダースコアに置き換えられなければなりません。
  • 例: `metric.name`は`U__metric_2E_name`になります(2Eは「.」の16進数Unicodeコードポイントです)。

デフォルトの動作

Acceptヘッダーでエスケープ方式が指定されていない場合、`underscores`エスケープを使用すべきです。

セキュリティに関する考慮事項

  1. ターゲットは、エスケープを適用する前に入力名を検証しなければなりません。
  2. インジェクション攻撃を防ぐために、エスケープ方式を検証しなければなりません。
  3. `allow-utf-8`方式は、生成者と消費者の両方がUTF-8名をサポートしている場合にのみ使用しなければなりません。

このページの内容