4.1 データ収集メソッド

Zabbixが提供する多様なデータ収集手法の詳細解説

概要

Zabbixのデータ収集メソッドは、監視対象からメトリクスやログ情報を取得するための複数の手法を提供します。各メソッドには固有の特徴と適用場面があり、監視要件に応じて最適な方法を選択することが重要です。

データ収集メソッド比較

メソッド難易度パフォーマンスセキュリティ適用場面
Zabbixエージェントサーバー・ワークステーション
SNMPネットワーク機器・ストレージ
IPMIハードウェア監視
JMXJavaアプリケーション
外部チェックカスタム監視・サードパーティ
データベース監視データベースサーバー
HTTP/WebシナリオWebサービス・API

Zabbixエージェント監視

アーキテクチャと仕組み

Zabbixエージェントは、監視対象ホストにインストールされる軽量なC言語製デーモンです。

通信方式の種類

パッシブチェック(サーバー主導)

  • Zabbixサーバーがエージェントにリクエスト送信
  • エージェントがデータを収集してレスポンス
  • ポート10050を使用

アクティブチェック(エージェント主導)

  • エージェントがサーバーから監視項目リストを取得
  • エージェントが能動的にデータ送信
  • ポート10051を使用

設定例:パッシブエージェント

ini
# /etc/zabbix/zabbix_agentd.conf

# サーバー接続設定
Server=192.168.1.10,192.168.1.11
ListenPort=10050
ListenIP=0.0.0.0

# パフォーマンス設定
StartAgents=3
Timeout=3

# セキュリティ設定
AllowRoot=0
User=zabbix

# ログ設定
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=10
DebugLevel=3

設定例:アクティブエージェント

ini
# アクティブチェック設定
ServerActive=192.168.1.10:10051,192.168.1.11:10051
Hostname=web-server-01
HostnameItem=system.hostname

# バッファリング設定
BufferSend=5
BufferSize=100
MaxLinesPerSecond=20
RefreshActiveChecks=120

# TLS暗号化設定
TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=PSK001
TLSPSKFile=/etc/zabbix/zabbix_agentd.psk

ユーザーパラメータ設定

基本的なユーザーパラメータ

ini
# カスタムメトリクス例
UserParameter=mysql.connections,mysql -u monitoring -p'password' -e "SHOW STATUS LIKE 'Threads_connected'" | tail -1 | awk '{print $2}'

UserParameter=disk.temperature[*],smartctl -A $1 | grep Temperature_Celsius | awk '{print $10}'

UserParameter=nginx.status[*],curl -s http://localhost/nginx_status | grep $1 | awk '{print $3}'

# Apache監視
UserParameter=apache.status[*],curl -s http://localhost/server-status?auto | grep "^$1:" | cut -d: -f2 | tr -d ' '

# プロセス監視
UserParameter=proc.count[*],ps aux | grep -c "$1"

複雑なユーザーパラメータスクリプト

bash
#!/bin/bash
# /etc/zabbix/scripts/mysql_replication.sh

MYSQL_USER="monitoring"
MYSQL_PASS="password"
METRIC=$1

case $METRIC in
    "slave_running")
        mysql -u$MYSQL_USER -p$MYSQL_PASS -e "SHOW SLAVE STATUS\G" | grep "Slave_SQL_Running:" | awk '{print $2}' | grep -c "Yes"
        ;;
    "seconds_behind")
        mysql -u$MYSQL_USER -p$MYSQL_PASS -e "SHOW SLAVE STATUS\G" | grep "Seconds_Behind_Master:" | awk '{print $2}'
        ;;
    "io_running")
        mysql -u$MYSQL_USER -p$MYSQL_PASS -e "SHOW SLAVE STATUS\G" | grep "Slave_IO_Running:" | awk '{print $2}' | grep -c "Yes"
        ;;
esac
ini
# Zabbixエージェント設定
UserParameter=mysql.replication[*],/etc/zabbix/scripts/mysql_replication.sh $1

パフォーマンス最適化

エージェント設定の最適化

ini
# 高負荷環境での設定
StartAgents=10
Timeout=10
UnsafeUserParameters=1

# ログ監視の最適化
MaxLinesPerSecond=100
LogRemoteCommands=1

# メモリ使用量の最適化
BufferSize=1000
BufferSend=5

Windows環境での設定

ini
# Windows用設定例
LogType=file
LogFile=C:\zabbix\zabbix_agentd.log
Include=C:\zabbix\zabbix_agentd.conf.d\*.conf

# Windows サービス監視
UserParameter=service.running[*],sc query "$1" | find /i "running" | wc -l
UserParameter=service.state[*],sc query "$1" | find /i "state" | awk '{print $4}'

# Windows パフォーマンスカウンター
UserParameter=perfmon[*],powershell -Command "(Get-Counter '$1').CounterSamples.CookedValue"

SNMP監視

SNMP設定の基礎

SNMPv2c設定例

ini
# Zabbix設定画面での入力例
SNMP community: {$SNMP_COMMUNITY}
SNMP OID: 1.3.6.1.2.1.1.3.0
Port: 161
SNMP version: SNMPv2

# マクロ設定
{$SNMP_COMMUNITY} = public

SNMPv3設定例(セキュア)

ini
# SNMPv3 認証付き設定
SNMP version: SNMPv3
Context name: ""
Security name: monitoring_user
Security level: authPriv
Auth protocol: SHA
Auth passphrase: AuthPassword123!
Priv protocol: AES
Priv passphrase: PrivPassword456!

一般的なSNMP OID例

システム情報

ini
# システム稼働時間
system.uptime = 1.3.6.1.2.1.1.3.0

# システム名
system.name = 1.3.6.1.2.1.1.5.0

# システム所在地
system.location = 1.3.6.1.2.1.1.6.0

# CPU使用率
cpu.usage = 1.3.6.1.4.1.2021.11.9.0

ネットワークインターフェース

ini
# インターフェース数
if.number = 1.3.6.1.2.1.2.1.0

# インターフェース名
if.name[{#SNMPINDEX}] = 1.3.6.1.2.1.2.2.1.2.{#SNMPINDEX}

# 受信バイト数
if.in.bytes[{#SNMPINDEX}] = 1.3.6.1.2.1.2.2.1.10.{#SNMPINDEX}

# 送信バイト数
if.out.bytes[{#SNMPINDEX}] = 1.3.6.1.2.1.2.2.1.16.{#SNMPINDEX}

# インターフェース状態
if.status[{#SNMPINDEX}] = 1.3.6.1.2.1.2.2.1.8.{#SNMPINDEX}

SNMP低レベルディスカバリ設定

json
{
  "snmp_oid": "discovery[{#SNMPVALUE},1.3.6.1.2.1.2.2.1.2]",
  "key": "net.if.discovery",
  "description": "Network interface discovery"
}

ディスカバリルールに基づくアイテムプロトタイプ

ini
# インターフェース名アイテム
Name: Interface {#SNMPVALUE} name
Key: if.name[{#SNMPINDEX}]
SNMP OID: 1.3.6.1.2.1.2.2.1.2.{#SNMPINDEX}

# 帯域使用率アイテム
Name: Interface {#SNMPVALUE} utilization
Key: if.util[{#SNMPINDEX}]
Type: Calculated
Formula: (last(if.in.bytes[{#SNMPINDEX}])+last(if.out.bytes[{#SNMPINDEX}]))*8/last(if.speed[{#SNMPINDEX}])*100

IPMI監視

IPMI設定と構成

基本的なIPMI設定

ini
# IPMIインターフェース設定
IPMI IP address: 192.168.100.10
IPMI port: 623
IPMI username: monitoring
IPMI password: SecureIPMIPass123!
IPMI privilege level: User

センサー監視項目例

ini
# 温度センサー
ipmi.sensor[temperature,CPU1 Temp]
ipmi.sensor[temperature,System Temp]
ipmi.sensor[temperature,Ambient Temp]

# 電圧センサー
ipmi.sensor[voltage,+12V]
ipmi.sensor[voltage,+5V]
ipmi.sensor[voltage,+3.3V]
ipmi.sensor[voltage,VBat]

# ファンセンサー
ipmi.sensor[fan,FAN1 RPM]
ipmi.sensor[fan,FAN2 RPM]
ipmi.sensor[fan,FAN3 RPM]

# 電源状態
ipmi.sensor[power,PS1 Status]
ipmi.sensor[power,PS2 Status]

高度なIPMI設定

IPMIディスカバリ設定

json
{
  "key": "ipmi.discovery",
  "type": "IPMI agent",
  "sensor_type": "temperature"
}

IPMI SEL(System Event Log)監視

ini
# システムイベントログ監視
ipmi.sel.count
ipmi.sel.get[last]

JMX監視

JMX接続設定

基本的なJMX設定

ini
# JMXインターフェース設定
JMX endpoint: service:jmx:rmi:///jndi/rmi://localhost:12345/jmxrmi
Username: monitoring
Password: JMXPassword123!

Java仮想マシン監視

メモリ監視

ini
# ヒープメモリ使用量
jmx["java.lang:type=Memory"]["HeapMemoryUsage.used"]

# ヒープメモリ最大値
jmx["java.lang:type=Memory"]["HeapMemoryUsage.max"]

# 非ヒープメモリ使用量
jmx["java.lang:type=Memory"]["NonHeapMemoryUsage.used"]

# Metaspace使用量(Java 8+)
jmx["java.lang:type=MemoryPool,name=Metaspace"]["Usage.used"]

ガベージコレクション監視

ini
# GC実行回数
jmx["java.lang:type=GarbageCollector,name=G1 Young Generation"]["CollectionCount"]

# GC実行時間
jmx["java.lang:type=GarbageCollector,name=G1 Young Generation"]["CollectionTime"]

# GC効率
jmx["java.lang:type=GarbageCollector,name=G1 Old Generation"]["CollectionTime"]/jmx["java.lang:type=GarbageCollector,name=G1 Old Generation"]["CollectionCount"]

スレッド監視

ini
# アクティブスレッド数
jmx["java.lang:type=Threading"]["ThreadCount"]

# デーモンスレッド数
jmx["java.lang:type=Threading"]["DaemonThreadCount"]

# ピークスレッド数
jmx["java.lang:type=Threading"]["PeakThreadCount"]

# デッドロック検出
jmx["java.lang:type=Threading"]["FindDeadlockedThreads"]

アプリケーション固有の監視

Tomcat監視例

ini
# リクエスト処理数
jmx["Catalina:type=GlobalRequestProcessor,name=\"http-nio-8080\""]["requestCount"]

# アクティブセッション数
jmx["Catalina:type=Manager,host=localhost,context=/myapp"]["activeSessions"]

# スレッドプール状態
jmx["Catalina:type=ThreadPool,name=\"http-nio-8080\""]["currentThreadCount"]

外部チェック

外部スクリプト作成

基本的な外部チェックスクリプト

bash
#!/bin/bash
# /usr/lib/zabbix/externalscripts/check_mysql_connections.sh

MYSQL_USER="monitoring"
MYSQL_PASS="password"
MYSQL_HOST="localhost"

# MySQLへの接続数確認
CONNECTIONS=$(mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS -e "SHOW STATUS LIKE 'Threads_connected';" | tail -1 | awk '{print $2}')

if [ -z "$CONNECTIONS" ]; then
    echo "ERROR: Could not retrieve MySQL connections"
    exit 1
fi

echo $CONNECTIONS
exit 0

複雑な外部チェックスクリプト

python
#!/usr/bin/env python3
# /usr/lib/zabbix/externalscripts/check_api_response.py

import requests
import json
import sys
import time

def check_api_health(url, timeout=10):
    """API健全性チェック"""
    try:
        start_time = time.time()
        response = requests.get(url, timeout=timeout)
        response_time = time.time() - start_time
        
        # ステータスコード確認
        if response.status_code != 200:
            print(f"ERROR: HTTP {response.status_code}")
            return 1
            
        # レスポンス時間確認
        if response_time > 5.0:
            print(f"WARNING: Slow response ({response_time:.2f}s)")
            return 1
            
        # JSON形式確認
        try:
            data = response.json()
            if data.get('status') != 'healthy':
                print("ERROR: Service unhealthy")
                return 1
        except json.JSONDecodeError:
            print("ERROR: Invalid JSON response")
            return 1
            
        print(f"OK: API healthy (response: {response_time:.2f}s)")
        return 0
        
    except requests.exceptions.RequestException as e:
        print(f"ERROR: {str(e)}")
        return 1

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: check_api_response.py <URL>")
        sys.exit(1)
        
    url = sys.argv[1]
    sys.exit(check_api_health(url))

外部チェック項目設定

ini
# Zabbix設定画面での設定
Name: MySQL Connections
Type: External check
Key: check_mysql_connections.sh
Update interval: 60s

データベース監視

MySQL監視設定

基本的な接続設定

ini
# MySQL ODBC設定
Type: Database monitor
Key: db.mysql.query[connections]
Database: mysql://monitoring:password@localhost:3306/information_schema
SQL query: SELECT VARIABLE_VALUE FROM GLOBAL_STATUS WHERE VARIABLE_NAME='Threads_connected'

詳細な監視クエリ例

sql
-- アクティブ接続数
SELECT count(*) FROM information_schema.PROCESSLIST WHERE COMMAND != 'Sleep';

-- スロークエリ数
SELECT VARIABLE_VALUE FROM information_schema.GLOBAL_STATUS WHERE VARIABLE_NAME='Slow_queries';

-- バッファプール使用率
SELECT 
  (data_length + index_length) / 1024 / 1024 / 1024 as size_gb,
  table_rows
FROM information_schema.TABLES 
WHERE table_schema = 'myapp' 
GROUP BY table_schema;

-- レプリケーション遅延
SELECT IFNULL(SECONDS_BEHIND_MASTER, -1) FROM information_schema.REPLICA_HOST_STATUS;

PostgreSQL監視設定

sql
-- アクティブ接続数
SELECT count(*) FROM pg_stat_activity WHERE state = 'active';

-- データベースサイズ
SELECT pg_database_size('myapp') / 1024 / 1024 / 1024;

-- ロック待ち
SELECT count(*) FROM pg_stat_activity WHERE wait_event IS NOT NULL;

-- 最古のトランザクション年齢
SELECT EXTRACT(EPOCH FROM (now() - min(xact_start))) FROM pg_stat_activity WHERE xact_start IS NOT NULL;

HTTP/Webシナリオ監視

基本的なHTTPチェック

シンプルなHTTPアイテム

ini
# 基本的なWebページチェック
Name: Website availability
Type: HTTP agent
Key: web.page.get[www.example.com]
URL: https://www.example.com
Request type: GET
Timeout: 10s

高度なHTTPアイテム設定

ini
# 認証付きAPIチェック
Name: API Authentication
Type: HTTP agent
Key: api.auth.check
URL: https://api.example.com/auth/login
Request type: POST
Headers: Content-Type: application/json
Post data: {"username":"api_user","password":"api_pass"}
Status codes: 200
Response time: <2

複雑なWebシナリオ

マルチステップWebシナリオ

ini
Scenario: E-commerce Purchase Flow

Step 1: Home Page
  URL: https://shop.example.com/
  Required string: "Welcome"
  Status codes: 200

Step 2: Login
  URL: https://shop.example.com/login
  Request type: POST
  Post data: username=testuser&password=testpass
  Required string: "Dashboard"
  Follow redirects: Yes

Step 3: Add to Cart
  URL: https://shop.example.com/cart/add
  Request type: POST
  Post data: product_id=123&quantity=1
  Required string: "Item added"

Step 4: Checkout
  URL: https://shop.example.com/checkout
  Required string: "Order summary"
  Response time: <5

APIテストシナリオ

json
{
  "scenario": "API Health Check",
  "steps": [
    {
      "name": "Get Token",
      "url": "https://api.example.com/auth/token",
      "method": "POST",
      "headers": {
        "Content-Type": "application/json"
      },
      "body": {
        "client_id": "monitoring",
        "client_secret": "secret123"
      },
      "variables": {
        "token": "$.access_token"
      }
    },
    {
      "name": "Test Endpoint",
      "url": "https://api.example.com/data",
      "method": "GET",
      "headers": {
        "Authorization": "Bearer {token}"
      },
      "required_string": "success"
    }
  ]
}

パフォーマンス最適化のベストプラクティス

データ収集間隔の最適化

ini
# 高頻度監視(1分間隔)
system.cpu.util
vm.memory.util
net.if.in[eth0]

# 中頻度監視(5分間隔)  
vfs.fs.size[/]
proc.num[httpd]

# 低頻度監視(1時間間隔)
system.uname
system.hw.chassis

プロキシ活用による負荷分散

ini
# Zabbixプロキシ設定
ProxyMode=0  # アクティブプロキシ
Server=192.168.1.10
Hostname=proxy-tokyo
DBHost=localhost
DBName=zabbix_proxy
DBUser=zabbix
DBPassword=password

# データ送信最適化
ProxyLocalBuffer=720
ProxyOfflineBuffer=720
HeartbeatFrequency=60
ConfigFrequency=3600
DataSenderFrequency=1

セキュリティ強化

TLS暗号化設定

ini
# サーバーサイド設定
TLSCAFile=/etc/zabbix/ssl/ca.crt
TLSCertFile=/etc/zabbix/ssl/server.crt
TLSKeyFile=/etc/zabbix/ssl/server.key

# エージェントサイド設定
TLSConnect=cert
TLSAccept=cert
TLSCAFile=/etc/zabbix/ssl/ca.crt
TLSCertFile=/etc/zabbix/ssl/agent.crt
TLSKeyFile=/etc/zabbix/ssl/agent.key

PSK(事前共有鍵)設定

bash
# PSK生成
openssl rand -hex 32 > /etc/zabbix/zabbix_agentd.psk

# エージェント設定
TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=PSK001
TLSPSKFile=/etc/zabbix/zabbix_agentd.psk

まとめ

Zabbixの多様なデータ収集メソッドを適切に活用することで、包括的な監視システムを構築できます。各メソッドの特性を理解し、監視対象と要件に応じて最適な組み合わせを選択することが重要です。

次のセクションでは、収集したデータの種類と処理方法について詳しく説明します。


参考リンク

← 目次に戻る | 次へ: 4.2 アイテムとデータタイプ →