Prometheus リラベル(ラベル書き換え)

スポンサーリンク

Prometheusのリラベル(relabel)操作をまとめます。サービスティスカバリと呼ばれる監視対象を動的に生成する機能が備わっていますが、しかし、自動生成されるラベルには使いづらいものもあります。このラベルを手作業で編集するのは非常に無理があるので、Prometheusにはラベルを機械的なルールで変換するリラベルと呼ばれる機能があります。

前提

参照資料

動作確認済環境

  • Rocky Linux 8.6
  • Prometheus 2.36.2

構成図

3台の仮想マシンをAzure上に構築し、以下コンポーネントがインストール済の状態とします。

+----------------+ +----------------+ +----------------+
| linux010       | | linux020       | | linux030       |
| 172.16.1.10/24 | | 172.16.1.20/24 | | 172.16.1.30/24 |
|                | |                | |                |
| node_exporter  | | node_exporter  | | node_exporter  |
| prometheus     | |                | |                |
+----------------+ +----------------+ +----------------+

prometheus.ymlはAzure上の仮想マシンを動的に取得するような設定とします。設定の意味は「Prometheus サービスディスカバリ (Azure編)」を参照ください。

global:
  scrape_interval: 10s

scrape_configs:
  - job_name: example
    azure_sd_configs:
      - subscription_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        tenant_id: a8f8d8d3-ad2c-4d3a-80f5-f6c5753a5e10
        client_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        client_secret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        resource_group: MyResourceGroup
        port: 9100

ラベル操作一覧

ラベル操作例

監視対象の削除

drop

relabel actionにdropを指定すると、regexにマッチしたtargetは監視されないようになります。例えば、以下のように指定すると、linux030はtargetの対象外になります。

global:
  scrape_interval: 10s

scrape_configs:
  - job_name: example
    azure_sd_configs:
      - subscription_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        tenant_id: a8f8d8d3-ad2c-4d3a-80f5-f6c5753a5e10
        client_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        client_secret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        resource_group: MyResourceGroup
        port: 9100
    relabel_configs:
      - source_labels: [__meta_azure_machine_computer_name]
        regex: linux030
        action: drop

この設定でサービスディスカバリの画面を確認すると、「2/3 active targets」と監視対象が3台から2台に減った事が分かります。

relabel dropの確認 01

サービスディスカバリの画面を下へスクロールさせると、linux030の「Target Labels」列が「Dropped」と表示される事が分かります。

relabel dropの確認 02

targesの画面を確認すると、2台のみがupになる事が分かります。

relabel dropの確認 03

keep

relabel actionにkeepを指定すると、regexにマッチする対象のみを監視対象とします。言い換えれば、regexにマッチしないものは監視対象外になります。例えば、以下のような設定にすると監視対象はlinux010のみになります。

global:
  scrape_interval: 10s

scrape_configs:
  - job_name: example
    azure_sd_configs:
      - subscription_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        tenant_id: a8f8d8d3-ad2c-4d3a-80f5-f6c5753a5e10
        client_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        client_secret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        resource_group: MyResourceGroup
        port: 9100
    relabel_configs:
      - source_labels: [__meta_azure_machine_computer_name]
        regex: linux010
        action: keep

この設定でサービスディスカバリの画面を確認すると、「1/3 active targets」と3台のうち1台しか監視されていない事が分かります。

relabel keepの確認

ラベルの変更

replace

relabel actionにreplaceを指定すると、ラベルを変更できます。例えば、ラベル「__address__」の値が「172.16.1.10:9100」となる所を、ポート番号を削除し「172.16.1.10」のように置換する設定例は以下のようになります。

「__address__」のように、先頭が「__」で始まるラベルはデフォルトで削除されます。そのため、ラベルが削除されないようにラベルを「__address__」から「address」に変更しています。

global:
  scrape_interval: 10s

scrape_configs:
  - job_name: example
    azure_sd_configs:
      - subscription_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        tenant_id: a8f8d8d3-ad2c-4d3a-80f5-f6c5753a5e10
        client_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        client_secret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        resource_group: MyResourceGroup
        port: 9100
    relabel_configs:
      - source_labels: [__address__]
        target_label: address
        regex: '(.*):9100'
        replacement: '${1}'
        action: replace

この設定でサービスディスカバリの画面を確認し、「172.16.1.10:9100」から「172.16.1.10」に変わった事を確認します。

relabel replaceの確認

labelmap

relabel actionにlabelmapを指定すると、ラベル名を変更できます。「__address__」のように、先頭が「__」で始まるラベルはデフォルトで削除されますので、例えば、以下のように「__address__」や「__metrics_path__」などの接頭辞「__」を削除すれば、addressやmetrics_pathなどのラベルを仕様できます。

global:
  scrape_interval: 10s

scrape_configs:
  - job_name: example
    azure_sd_configs:
      - subscription_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        tenant_id: a8f8d8d3-ad2c-4d3a-80f5-f6c5753a5e10
        client_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        client_secret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        resource_group: MyResourceGroup
        port: 9100
    relabel_configs:
      - regex: '__(address|metrics_path|scheme)__'
        replacement: 'meta_${1}'
        action: labelmap
      - regex: '__meta_azure_(.*)'
        replacement: 'meta_${1}'
        action: labelmap

この設定でサービスディスカバリの画面を確認し、「meta_address」「meta_metrics_path」などのラベルが存在する事を確認します。

relabel labelmapの確認

ラベルの削除

labeldrop

relabel actionにlabeldropを指定すると、regexにマッチするラベルが削除されます。以下はラベル「job」を削除する例です。

global:
  scrape_interval: 10s

scrape_configs:
  - job_name: example
    azure_sd_configs:
      - subscription_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        tenant_id: a8f8d8d3-ad2c-4d3a-80f5-f6c5753a5e10
        client_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        client_secret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        resource_group: MyResourceGroup
        port: 9100
    relabel_configs:
       - regex: '__(address|metrics_path|scheme)__'
        replacement: 'meta_${1}'
        action: labelmap
      - regex: '__meta_azure_(.*)'
        replacement: 'meta_${1}'
        action: labelmap
      - regex: 'job'
        action: labeldrop

この設定でサービスディスカバリの画面を確認し、ラベル「job」が存在しない事を確認します。

relabel labeldropの確認

labelkeep

relabel actionにlabelkeepを指定すると、regexにマッチするラベルのみが残ります。言い換えれば、regexにマッチしないラベルは削除されます。以下は「scrape」「address」を含むラベル名のみを残す例です。

global:
  scrape_interval: 10s

scrape_configs:
  - job_name: example
    azure_sd_configs:
      - subscription_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        tenant_id: a8f8d8d3-ad2c-4d3a-80f5-f6c5753a5e10
        client_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        client_secret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        resource_group: MyResourceGroup
        port: 9100
    relabel_configs:
       - regex: '__(address|metrics_path|scheme)__'
        replacement: 'meta_${1}'
        action: labelmap
      - regex: '__meta_azure_(.*)'
        replacement: 'meta_${1}'
        action: labelmap
      - regex: '.*scrape.*|.*address.*'
        action: labelkeep

この設定でサービスディスカバリの画面を確認し、「address」を含むラベルのみが表示される事を確認します。

「__scrape_interval__」「__scrape_timeout__」は先頭が「__」で始まるラベル名ですので、最終的には削除されます。ですが、Azureのサービスディスカバリ処理はrelabel後にも行われますので「__scrape_interval__」または「__scrape_timeout__」を削除してしまうとAzureのサービスディスカバリ処理が失敗してしまいます。

初回のサービスディスカバリ処理の時にscrape_intervalとscrape_timeouを記録するように仕様変更すれば、上記のトラブルはなくなります。ですが、サービスディスカバリとlabelkeepを同時に使う頻度で判断すれば、バグ対応の優先順位観点で不具合改修されない可能性が高いと予想しています。

relabel labelkeepの確認

補足

labelkeepとサービスディスカバリ併用の注意

将来は改修される可能性はありますが、今現在(2022年5月時点)でサービスディスカバリとlabelkeepを併用する時は「__scrape_interval__」「__scrape_timeout__」を削除しないように注意ください。サービスディスカバリ処理はrelabel後にも行われますので「__scrape_interval__」または「__scrape_timeout__」を削除すると、サービスディスカバリの処理に失敗してしまいます。

例えば、以下のようなprometheus.ymlを定義します。

global:
  scrape_interval: 10s

scrape_configs:
  - job_name: example
    azure_sd_configs:
      - subscription_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        tenant_id: a8f8d8d3-ad2c-4d3a-80f5-f6c5753a5e10
        client_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        client_secret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        resource_group: MyResourceGroup
        port: 9100
    relabel_configs:
       - regex: '__(address|metrics_path|scheme)__'
        replacement: 'meta_${1}'
        action: labelmap
      - regex: '__meta_azure_(.*)'
        replacement: 'meta_${1}'
        action: labelmap
      - regex: '.*address.*'
        action: labelkeep

コマンドラインでprometheusを起動すると、scrape managerがdurationを把握できずエラーを出力している事が分かります。

[root@linux010 ~]# prometheus --config.file=/etc/prometheus/prometheus.yml 

 <ommitd>

ts=2022-05-15T14:53:37.416Z caller=main.go:978 level=info fs_type=XFS_SUPER_MAGIC
ts=2022-05-15T14:53:37.416Z caller=main.go:981 level=info msg="TSDB started"
ts=2022-05-15T14:53:37.416Z caller=main.go:1162 level=info msg="Loading configuration file" filename=/etc/prometheus/prometheus.yml
ts=2022-05-15T14:53:37.426Z caller=main.go:1199 level=info msg="Completed loading of configuration file" filename=/etc/prometheus/prometheus.yml totalDuration=10.2455ms db_storage=900ns remote_storage=1.4µs web_handler=500ns query_engine=600ns scrape=9.8753ms scrape_sd=54µs notify=1µs notify_sd=1.7µs rules=1.3µs tracing=9.2µs
ts=2022-05-15T14:53:37.426Z caller=main.go:930 level=info msg="Server is ready to receive web requests."
ts=2022-05-15T14:53:42.427Z caller=scrape.go:479 level=error component="scrape manager" scrape_pool=example msg="Creating target failed" err="instance 0 in group : error parsing scrape interval: empty duration string"
ts=2022-05-15T14:53:42.427Z caller=scrape.go:479 level=error component="scrape manager" scrape_pool=example msg="Creating target failed" err="instance 1 in group : error parsing scrape interval: empty duration string"
ts=2022-05-15T14:53:42.427Z caller=scrape.go:479 level=error component="scrape manager" scrape_pool=example msg="Creating target failed" err="instance 2 in group : error parsing scrape interval: empty duration string"
タイトルとURLをコピーしました