LoginSignup
34
37

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-04-23

はじめに

公式のマニュアルにも一部記載されているものの、大半はソースコードを参照しないとわからなかったのでまとめてみた。
大半は/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で宣言されたグローバル変数共有メモリー上の構造体collectorから値を取り出し。
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構造体で行われるのはローダブルモジュールによる監視機能の拡張と同じ。

34
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
37