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台に減った事が分かります。
サービスディスカバリの画面を下へスクロールさせると、linux030の「Target Labels」列が「Dropped」と表示される事が分かります。
targesの画面を確認すると、2台のみがupになる事が分かります。
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台しか監視されていない事が分かります。
ラベルの変更
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」に変わった事を確認します。
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」などのラベルが存在する事を確認します。
ラベルの削除
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」が存在しない事を確認します。
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を同時に使う頻度で判断すれば、バグ対応の優先順位観点で不具合改修されない可能性が高いと予想しています。
補足
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"