Prometheus サービスディスカバリ (Azure編)

スポンサーリンク

Prometheusはコンテナやクラウドなどの大量コンポーネントを監視する事に特化したソフトウェアです。監視対象は大量に存在しますので、その監視対象を1つ1つ手作業で定義するのは非現実的です。このような問題に対応するため、Prometheusには監視対象を動的に検出するサービスディスカバリという機能が備わっています。このページではAzureをサービスディスカバリする方法を説明します。

前提

参照資料

動作確認済環境

  • Rocky Linux 8.5
  • Prometheus 2.36.2

構成図

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

+----------------+ +----------------+ +----------------+
| 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     | |                | |                |
+----------------+ +----------------+ +----------------+

Azureの設定

PrometheusはOAuthでAzureに接続しサービスディスカバリします。ですので、Azure側でOauthを設定する必要があります。

「すべてのサービス」「ID」「Azure Active Directory」「アプリの登録」の順に画面遷移し、適当なアプリケーションを作成しクライアントシークレットを発行します。具体的な操作方法は「Azure REST API操作の説明」を参照ください。

Azure アプリの登録

作成したアプリケーションに対して適切な権限を与えます。以下はリソースグループに対して権限を与える乱暴な設定ですので、実践では弱めの権限にしておきましょう。具体的な操作方法は「Azure REST API操作の説明」を参照ください。

Azure 権限設定

サービスディスカバリ

prometheus.ymlの設定例

/etc/prometheus/prometheus.ymlを以下のように編集します。サブスクリプションIDやテナントIDなどは適宜の変更をお願いします。

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

設定を反映させるために再起動します。

systemctl restart prometheus.service 

動作確認

Service Discoveryページ(http://<ip_addr>:9090/service-discovery)を表示すると、サービスディスカバリの結果が表示されます。

Service Discoveryの結果確認

Targetsページ(http://<ip_addr>:9090/targets)を表示すると、監視対象ホストの一覧が表示されます。

targetの一覧確認

補足

Azureの認証エラー

サービスディスカバリの画面で何も表示されない時はAzureの認証でエラーが発生している可能性があります。RPM版やDocker版のPrometheusを使っている方は、コマンドラインのPrometheusの起動を試みてみましょう。例えば、クライアントIDに誤りがある状態でPrometheusを起動すると、以下のような認証エラーを示すログが出力されます。

[root@linux010 ~]# prometheus --config.file=/etc/prometheus/prometheus.yml
ts=2022-05-14T04:57:21.949Z caller=main.go:488 level=info msg="No time or size retention was set so using the default time retention" duration=15d
ts=2022-05-14T04:57:21.949Z caller=main.go:525 level=info msg="Starting Prometheus" version="(version=2.35.0, branch=HEAD, revision=6656cd29fe6ac92bab91ecec0fe162ef0f187654)"
ts=2022-05-14T04:57:21.949Z caller=main.go:530 level=info build_context="(go=go1.18.1, user=root@cf6852b14d68, date=20220421-09:53:42)"
ts=2022-05-14T04:57:21.949Z caller=main.go:531 level=info host_details="(Linux 4.18.0-348.12.2.el8_5.x86_64 #1 SMP Wed Jan 19 14:35:04 EST 2022 x86_64 linux010 (none))"
ts=2022-05-14T04:57:21.949Z caller=main.go:532 level=info fd_limits="(soft=1024, hard=262144)"
ts=2022-05-14T04:57:21.949Z caller=main.go:533 level=info vm_limits="(soft=unlimited, hard=unlimited)"
ts=2022-05-14T04:57:21.950Z caller=web.go:541 level=info component=web msg="Start listening for connections" address=0.0.0.0:9090
ts=2022-05-14T04:57:21.951Z caller=main.go:957 level=info msg="Starting TSDB ..."
ts=2022-05-14T04:57:21.954Z caller=head.go:493 level=info component=tsdb msg="Replaying on-disk memory mappable chunks if any"
ts=2022-05-14T04:57:21.954Z caller=head.go:536 level=info component=tsdb msg="On-disk memory mappable chunks replay completed" duration=1.6µs
ts=2022-05-14T04:57:21.954Z caller=head.go:542 level=info component=tsdb msg="Replaying WAL, this may take a while"
ts=2022-05-14T04:57:21.956Z caller=tls_config.go:195 level=info component=web msg="TLS is disabled." http2=false
ts=2022-05-14T04:57:21.956Z caller=head.go:613 level=info component=tsdb msg="WAL segment loaded" segment=0 maxSegment=3
ts=2022-05-14T04:57:21.957Z caller=head.go:613 level=info component=tsdb msg="WAL segment loaded" segment=1 maxSegment=3
ts=2022-05-14T04:57:21.969Z caller=head.go:613 level=info component=tsdb msg="WAL segment loaded" segment=2 maxSegment=3
ts=2022-05-14T04:57:21.970Z caller=head.go:613 level=info component=tsdb msg="WAL segment loaded" segment=3 maxSegment=3
ts=2022-05-14T04:57:21.970Z caller=head.go:619 level=info component=tsdb msg="WAL replay completed" checkpoint_replay_duration=42.701µs wal_replay_duration=15.411128ms total_replay_duration=15.473129ms
ts=2022-05-14T04:57:21.970Z caller=main.go:978 level=info fs_type=XFS_SUPER_MAGIC
ts=2022-05-14T04:57:21.970Z caller=main.go:981 level=info msg="TSDB started"
ts=2022-05-14T04:57:21.970Z caller=main.go:1162 level=info msg="Loading configuration file" filename=/etc/prometheus/prometheus.yml
ts=2022-05-14T04:57:21.972Z caller=main.go:1199 level=info msg="Completed loading of configuration file" filename=/etc/prometheus/prometheus.yml totalDuration=1.569123ms db_storage=600ns remote_storage=1.5µs web_handler=200ns query_engine=1.1µs scrape=1.320919ms scrape_sd=57.301µs notify=800ns notify_sd=1.5µs rules=1.5µs tracing=7.5µs
ts=2022-05-14T04:57:21.972Z caller=main.go:930 level=info msg="Server is ready to receive web requests."
ts=2022-05-14T04:57:22.173Z caller=refresh.go:79 level=error component="discovery manager scrape" discovery=azure msg="Unable to refresh target groups" err="could not get virtual machines: could not list virtual machines: azure.BearerAuthorizer#WithAuthorization: Failed to refresh the Token for request to https://management.azure.com/subscriptions/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines?api-version=2018-10-01: StatusCode=400 -- Original Error: adal: Refresh request failed. Status Code = '400'. Response body: {\"error\":\"unauthorized_client\",\"error_description\":\"AADSTS700016: Application with identifier 'a0863a36-6b02-4c7b-a0a4-XXXXXXXXXXXX' was not found in the directory 'gokatei03'. This can happen if the application has not been installed by the administrator of the tenant or consented to by any user in the tenant. You may have sent your authentication request to the wrong tenant.\\r\\nTrace ID: 92585592-3713-4294-bf8c-fb2afcb66501\\r\\nCorrelation ID: 28ee405e-a54f-482d-a81f-a47b2f440639\\r\\nTimestamp: 2022-05-14 04:57:22Z\",\"error_codes\":[700016],\"timestamp\":\"2022-05-14 04:57:22Z\",\"trace_id\":\"92585592-3713-4294-bf8c-fb2afcb66501\",\"correlation_id\":\"28ee405e-a54f-482d-a81f-a47b2f440639\",\"error_uri\":\"https://login.microsoftonline.com/error?code=700016\"} Endpoint https://login.microsoftonline.com/a8f8d8d3-ad2c-4d3a-80f5-f6c5753a5e10/oauth2/token?api-version=1.0"
タイトルとURLをコピーしました