ZabbixからAzureリソースを監視してみた

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【3/22開催】テックブログを書こう!アウトプットのススメ
1年で100本ブログを出した新米エンジニアがPV数が伸びなくてもTech Blogを書き続ける理由とは?
https://tech-lab.connpass.com/event/312805/

【4/18開催】VSCode Dev Containersで楽々開発環境構築祭り〜Python/Reactなどなど〜
Visual Studio Codeの拡張機能であるDev Containersを使ってReactとかPythonとかSpring Bootとかの開発環境をラクチンで構築する方法を紹介するイベントです。
https://tech-lab.connpass.com/event/311864/

こんにちは。技術部の髙岡です。

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での表示
Azureのグラフ

Zabbixでの表示
zabbixのグラフ

ZabbixでAzureリソースを監視する上での課題

Azure 監視ライブラリを活用したPythonスクリプトが、CPU使用率の数字でなく「None」という値を返すことがあります。
ZabbixではCPU使用率の浮動小数点数を取り込むことと前提としたデータ型「数値(浮動小数)」を定義してますので、「None」という値が返されたときはZabbixに取り込むことができません。
この点は、マイクロソフトのサポートに問合せして解決する予定です。

アバター画像
About 髙岡 貴史 21 Articles
登山家兼投資家兼インフラ寄りのエンジニア。最近はDatastaxを中心としたデータ処理基盤に関心あり。
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる