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 REST API操作の説明」を参照ください。
サービスディスカバリ
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)を表示すると、サービスディスカバリの結果が表示されます。
Targetsページ(http://<ip_addr>:9090/targets)を表示すると、監視対象ホストの一覧が表示されます。
補足
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"