こんにちは。技術部の髙岡です。
Azure内のリソースをZabbixから監視する方法を検証してみました。
クラウドシステムを活用する場合、クラウドサービス独自の監視機能を活用することも可能です。
例えば、AzureであれはAzure Monitor、AWSであればCloud Watchのような監視機能です。
マルチクラウド環境のような場合、各々のクラウドベンダが提供する監視機能を使ってしまうと、クラウドベンダ毎に異なる監視機能を使うことになるので、監視運用の統一感が失われて設定や操作をクラウドサービス毎に覚える必要があり、運用負荷が高くなる問題が発生するでしょう。
この問題の解決策の一つとして、クラウドシステムの監視をZabbixから行う方法を検証してみようと思い立ちました。
実現したいこと
Azure仮想マシンのCPU使用率をAzure Monitorから取得するスクリプトを実行します。
取得したCPU使用率をZabbixに取り込みます。
設定方法
AzureリソースのCPU使用率を取得するPythonライブラリが提供されているので、CPU使用率を取得できるPythonスクリプトを作ります。
Pythonスクリプト実行で取得した結果をZabbixで監視する設定を行います。
事前準備
・ZabbixサーバでPythonを実行する環境を作る。
・Azure Monitor用のPythonライブラリをインストールする。
参考資料:Microsoft Azure SDK for Python
・PythonスクリプトからAzureへの認証として使用するサービスプリンシパルをAzure側に作成する。
参考資料:Azure CLI で Azure サービス プリンシパルを作成する
Azure仮想マシンのCPU使用率を取得するPythonスクリプトの作成
ここにサンプルのスクリプトが紹介されていますので、これを改修して作成します。
注意すべき点は、Zabbixが取り込むことができるフォーマットでCPU使用率を出力する必要があるという点です。
数字が一つ出力されるようにするのが一番簡単な手段です。
#! /usr/bin/env python import datetime from azure.mgmt.monitor import MonitorManagementClient subscription_id = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' resource_group_name = 'test-ttakaoka' vm_name = 'azmontestttakaoka11' resource_id = ( "subscriptions/{}/" "resourceGroups/{}/" "providers/Microsoft.Compute/virtualMachines/{}" ).format(subscription_id, resource_group_name, vm_name) # サブスクリプション認証を使います。 from azure.common.credentials import ServicePrincipalCredentials # テナントIDを指定します。 TENANT_ID = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' # サービスプリンシパルのアプリケーションIDを指定します。 CLIENT = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' # サービスプリンシパルのクライアントIDのパスワードを指定します。 KEY = 'xxxxxxxxx' credentials = ServicePrincipalCredentials( client_id = CLIENT, secret = KEY, tenant = TENANT_ID ) client = MonitorManagementClient( credentials, subscription_id ) today = datetime.datetime.now() nexttime = today - datetime.timedelta(minutes=1) metrics_data = client.metrics.list( resource_id, # 監視データを取得する期間を1分と指定します。 timespan="{}/{}".format(nexttime, today), interval='PT1M', # 監視項目を指定します。 # リソース毎に使用可能な監視項目 # https://docs.microsoft.com/ja-jp/azure/azure-monitor/platform/metrics-supported metricnames='Percentage CPU', # 1分間の平均値を取得します。 aggregation='average' ) for item in metrics_data.value: for timeserie in item.timeseries: for data in timeserie.data: print("{}".format(data.average))
このスクリプトを実行した結果です。
# ./azure-mon-cpu.py 1.435
スクリプト実行で取得したCPU使用率をZabbixで監視する設定
Zabbixには外部チェックという機能があって、任意のコマンド実行結果を監視データとして取得することができます。
そこでスクリプトを監視アイテムとして登録します。
ここで工夫しなければいけないのが、ホスト名の指定です。
スクリプトを実行するホストがZabbixサーバ自身なのでIPアドレスとして「127.0.0.1」を指定しますが、
Zabbixが識別するホスト名としてはAzure上のホストであることがわかるような名前「azure-linux-01」を指定します。
ホストの登録
監視アイテムの登録
AzureとZabbixでの監視結果の比較
Azure Monitorでの表示
Zabbixでの表示
ZabbixでAzureリソースを監視する上での課題
Azure 監視ライブラリを活用したPythonスクリプトが、CPU使用率の数字でなく「None」という値を返すことがあります。
ZabbixではCPU使用率の浮動小数点数を取り込むことと前提としたデータ型「数値(浮動小数)」を定義してますので、「None」という値が返されたときはZabbixに取り込むことができません。
この点は、マイクロソフトのサポートに問合せして解決する予定です。