はじめに
公式のマニュアルにも一部記載されているものの、大半はソースコードを参照しないとわからなかったのでまとめてみた。
大半は/proc以下かシステムコールを利用している事がわかった。
内容
※調査対象はzabbix2.4系のLinux(カーネル2.6系)
キー | 取得元 | ソース該当箇所 |
---|---|---|
agent.version | include/version.hでdefineされている文字列ZABBIX_VERSION | src/libs/zbxsysinfo/agent/agent.c AGENT_VERSION() |
agent.hostname | グローバル変数CONFIG_HOSTNAME (設定ファイルのHostnameの項目の値) |
src/libs/zbxsysinfo/agent/agent.c AGENT_HOSTNAME() |
agent.ping | 常に1 | src/libs/zbxsysinfo/agent/agent.c AGENT_PING() |
kernel.maxfiles | /proc/sys/fs/file-max | src/libs/zbxsysinfo/linux/kernel.c KERNEL_MAXFILES() |
kernel.maxproc | /proc/sys/kernel/pid_max | src/libs/zbxsysinfo/linux/kernel.c KERNEL_MAXPROC() |
vfs.fs.size | statvfs(2) | src/libs/zbxsysinfo/linux/diskspace.c VFS_FS_SIZE()→get_fs_size_stat() |
vfs.fs.inode | statvfs(2) | src/libs/zbxsysinfo/linux/inodes.c VFS_FS_INODE() |
vfs.fs.discovery | /proc/mounts | src/libs/zbxsysinfo/linux/diskspace.c VFS_FS_DISCOVERY() |
vfs.dev.read | /proc/diskstats (カーネル2.4は/proc/partitions) |
src/libs/zbxsysinfo/linux/diskio.c VFS_DEV_READ()→vfs_dev_rw()→get_diskstat()でINFO_FILE_NAME(PARSEの処理と一緒にファイルの上部でdefineされている)を開いて項目を呼び出し |
vfs.dev.write | /proc/diskstats | src/libs/zbxsysinfo/linux/diskio.c VFS_DEV_WRITE()(以下同上) |
net.tcp.listen | /proc/net/tcp,/proc/net/tcp6 | src/libs/zbxsysinfo/linux/net.c NET_TCP_LISTEN() |
net.udp.listen | /proc/net/udp,/proc/net/udp6 | src/libs/zbxsysinfo/linux/net.c NET_UDP_LISTEN() |
net.if.in | /proc/net/dev | src/libs/zbxsysinfo/linux/net.c NET_IF_IN()→get_net_stat() |
net.if.out | /proc/net/dev | src/libs/zbxsysinfo/linux/net.c NET_IF_OUT()→get_net_stat() |
net.if.total | /proc/net/dev | src/libs/zbxsysinfo/linux/net.c NET_IF_TOTAL()→get_net_stat() |
net.if.collisions | /proc/net/dev | src/libs/zbxsysinfo/linux/net.c NET_IF_COLLISIONS()→get_net_stat() |
net.if.discovery | /proc/net/dev | src/libs/zbxsysinfo/linux/net.c NET_IF_DISCOVERY() |
vm.memory.size | cachedは/proc/meminfoの"Cached:"の項目 それ以外はシステムコールsysinfo(2) ※sharedの項目はカーネル2.4系でのみ有効(それ以外の環境では値の取得に失敗) |
src/libs/zbxsysinfo/linux/memory.c VM_MEMORY_SIZE()から項目別の関数を呼び出し |
proc.num | /proc/[PID]/cmdline,/proc/[PID]/status | src/libs/zbxsysinfo/linux/proc.c PROC_NUM()で/proc/[PID]/{cmdline,status}をfopen、check_procname関数→cmp_status関数で/proc/[PID]/statusの"Name:"の項目からプロセス名を得ている。 |
proc.mem | /proc/[PID]/cmdline,/proc/[PID]/status | src/libs/zbxsysinfo/linux/proc.c 基本的には同上 /proc/[PID]/statusの"VmSize:"の項目から各プロセスのメモリ使用量を計算 |
system.cpu.switches | /proc/statのctxtの項目 | src/libs/zbxsysinfo/linux/cpu.c SYSTEM_CPU_SWITCHES() |
system.cpu.intr | /proc/statのintrの項目 | src/libs/zbxsysinfo/linux/cpu.c SYSTEM_CPU_INTR() |
system.cpu.util | /proc/statの値をcollectorプロセスが1秒ごとにデータを収集 | SYSTEM_CPU_UTIL()→src/zabbix_agent/cpustat.cのget_cpustat()→get_cpustat_by_num()で、src/zabbix_agent/stats.cで宣言された |
system.cpu.load | getloadavg(3) | src/libs/zbxsysinfo/linux/cpu.c SYSTEM_CPU_LOAD() |
system.cpu.num | sysconf(3) | src/libs/zbxsysinfo/linux/cpu.c SYSTEM_CPU_NUM() sysconfの戻り値 |
system.cpu.discovery | collectorプロセスの起動時に/proc/cpuinfoからCPUの数をカウント 起動後は1秒ごとに/proc/statから情報を更新 |
src/libs/zbxsysinfo/linux/cpu.c SYSTEM_CPU_DISCOVERY()→src/zabbix_agent/cpustat.cのget_cpu_statuses()→ |
system.uname | uname(2) | src/libs/zbxsysinfo/linux/system.c SYSTEM_UNAME() |
system.hw.chassis | SMBIOS | src/libs/zbxsysinfo/linux/hardware.c SYSTEM_HW_CHASSIS()→get_dmi_info()→/dev/mem経由でSMBIOSの情報を取得 |
system.hw.cpu | HW_CPU_INFO_FILE=/proc/cpuinfo /sys/devices/system/cpu/cpu%d/cpufreq/cpuinfo_max_freq |
src/libs/zbxsysinfo/linux/hardware.c SYSTEM_HW_CPU |
system.hw.devices | lspci(8)もしくはlsusb(8) | src/libs/zbxsysinfo/linux/hardware.c SYSTEM_HW_DEVICES->src/libs/zbxsysinfo/common/common.c EXECUTE_STR()->zbx_execute()経由でlspciもしくはlsusbコマンドを実行 |
system.hw.macaddr | ioctl(2) | src/libs/zbxsysinfo/linux/hardware.c SYSTEM_HW_MACADDR |
system.sw.arch | uname(2) | src/libs/zbxsysinfo/linux/software.c SYSTEM_SW_ARCH() |
system.sw.os | アイテムの引数によって下記の通り full→"/proc/version" short→"/proc/version_signature" name→"/etc/issue.net" |
src/libs/zbxsysinfo/linux/software.c SYSTEM_SW_OS() |
system.sw.packages | パッケージ管理ソフトによって下記の通り dpkg→"dpkg --get-selections" pkgtools→"ls /var/log/packages" rpm→"rpm -qa" pacman→"pacman -Q" |
src/libs/zbxsysinfo/linux/software.c SYSTEM_SW_PACKAGES |
system.swap.size | sysinfo(2) | src/libs/zbxsysinfo/linux/swap.c SYSTEM_SWAP_SIZE() |
system.swap.in | kernel2.4→/proc/swaps,/proc/partitions,/proc/stat kernel2.6→/proc/swaps,/proc/diskstat,/proc/vmstat |
src/libs/zbxsysinfo/linux/swap.c SYSTEM_SWAP_IN()→get_swap_stat() |
system.swap.out | kernel2.4→/proc/swaps,/proc/partitions,/proc/stat kernel2.6→/proc/swaps,/proc/diskstat,/proc/vmstat |
src/libs/zbxsysinfo/linux/swap.c SYSTEM_SWAP_OUT→get_swap_stat() |
system.uptime | sysinfo(2) | src/libs/zbxsysinfo/linux/uptime.c SYSTEM_UPTIME() |
system.boottime | /proc/statのbtimeの項目 | src/libs/zbxsysinfo/linux/boottime.c SYSTEM_BOOTTIME() |
sensor | kernel2.4→/proc/sys/dev/sensors以下を探索 kernel2.6→ /sys/class/hwmon以下を探索 |
src/libs/zbxsysinfo/linux/sensors.c GET_SENSOR()→get_device_sensors() |
調べ方
ソースをDL&展開→調べたいアイテムのキーでsrc以下をgrep→アイテムのキーと実際に値の取得を行う関数(上記の表の大文字の文字列)の紐付けが見つかる→関数名でsrc以下をgrep→関数の宣言が見つかるので後はその関数の処理を追っていく。
アイテムキーと実際に処理を行う関数の紐付けがZBX_METRIC構造体で行われるのはローダブルモジュールによる監視機能の拡張と同じ。