ZabbixでKVMゲストVMのネットワーク使用率とリンク状態を監視する方法

インフラ

ZabbixからKVMホストを通じて、ゲストVMのNIC使用状況(bps)とリンク状態(up/down)を監視する構成を解説します。


1. ネットワーク使用率監視スクリプトの作成

送受信bpsを取得するスクリプト /etc/zabbix/scripts/monitor_vm_net_usage.sh を作成します。

#!/bin/bash

VM_NAME="$1"
INTERFACE="$2"
DIRECTION="$3"  # tx または rx

TMP_FILE="/tmp/${VM_NAME}_${INTERFACE}_${DIRECTION}.net"
NOW=$(date +%s)

VALUE=$(virsh -c qemu:///system domifstat "$VM_NAME" "$INTERFACE" 2>/dev/null | awk -v dir="${DIRECTION}_bytes" '$2 == dir {print $3}')

if [[ -z "$VALUE" ]]; then
  echo 0
  exit 0
fi

if [[ -f "$TMP_FILE" ]]; then
  read LAST_TIME LAST_VAL < "$TMP_FILE"
  DIFF_TIME=$((NOW - LAST_TIME))
  DIFF_VAL=$((VALUE - LAST_VAL))
  if [[ $DIFF_TIME -gt 0 && $DIFF_VAL -ge 0 ]]; then
    echo $((DIFF_VAL / DIFF_TIME))
  else
    echo 0
  fi
else
  echo 0
fi

echo "$NOW $VALUE" > "$TMP_FILE"

実行権限の付与:

chmod +x /etc/zabbix/scripts/monitor_vm_net_usage.sh

 2. NICリンク状態確認スクリプトの作成

NICの状態(up/down)を取得するスクリプト /etc/zabbix/scripts/monitor_vm_net_status.sh を作成します。

#!/bin/bash

# 引数1: VM名(未使用)、引数2: インターフェース名(例: vnet0)
IFACE="$2"

LINK_STATE=$(ip link show "$IFACE" 2>/dev/null | grep "$IFACE" | grep -o 'state [A-Z]*' | awk '{print $2}')

if [[ "$LINK_STATE" == "UP" || "$LINK_STATE" == "UNKNOWN" ]]; then
  echo 1
else
  echo 0
fi

実行権限の付与:

chmod +x /etc/zabbix/scripts/monitor_vm_net_status.sh

3. Zabbixエージェント設定

/etc/zabbix/zabbix_agentd.conf に以下のUserParameterを追記します。

UserParameter=vm.net.usage[*],/etc/zabbix/scripts/monitor_vm_net_usage.sh $1 $2 $3
UserParameter=vm.net.status[*],/etc/zabbix/scripts/monitor_vm_net_status.sh $1 $2

設定後、Zabbixエージェントを再起動:

systemctl restart zabbix-agent

4. テスト実行

送信bps確認:

sudo -u zabbix /etc/zabbix/scripts/monitor_vm_net_usage.sh 【仮想マシン名】 vnet0 tx

NICリンク状態確認:

sudo -u zabbix /etc/zabbix/scripts/monitor_vm_net_status.sh 【仮想マシン名】 vnet0

リンク状態出力例:

1

→ 1 = 接続中(UPまたはUNKNOWN)、0 = リンクダウン


5. Zabbixアイテム設定(テンプレート/プロトタイプ)

  • 名前: TX Bandwidth for {#VMNAME}:{#INTERFACE}
  • キー: vm.net.usage[{#VMNAME},{#INTERFACE},tx]
  • 単位: bps
  • データ型: 数値(整数)
  • 名前: NIC Link Status for {#VMNAME}:{#INTERFACE}
  • キー: vm.net.status[{#VMNAME},{#INTERFACE}]
  • データ型: 数値(整数)
  • 値のマッピング(任意): 0=Down, 1=Up

6. トリガー例

NICがリンクダウンした場合に通知するトリガー:

{Template_VM:vm.net.status[{#VMNAME},{#INTERFACE}].last()}=0

補足

この方法を使えば、仮想マシン内にZabbixエージェントを導入せずとも、KVMホスト側からすべてのNIC状態・トラフィック状況を非侵襲的に監視可能です。

コメント

タイトルとURLをコピーしました