zabbixの主要なアイテムの値の取得元データ

#はじめに

公式のマニュアルにも一部記載されているものの、大半はソースコードを参照しないとわからなかったのでまとめてみた。
大半は/proc以下かシステムコールを利用している事がわかった。

#内容
※調査対象はzabbix2.4系のLinux(カーネル2.6系)

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


#調べ方
ソースをDL＆展開→調べたいアイテムのキーでsrc以下をgrep→アイテムのキーと実際に値の取得を行う関数(上記の表の大文字の文字列)の紐付けが見つかる→関数名でsrc以下をgrep→関数の宣言が見つかるので後はその関数の処理を追っていく。

アイテムキーと実際に処理を行う関数の紐付けがZBX_METRIC構造体で行われるのはローダブルモジュールによる監視機能の拡張と同じ。