先说下环境及使用版本:
Red hat Enterprise Linux 64位系统,zabbix 1.8.5
zabbix server端,agent,web等都搞定了,就剩下一个zabbix_sender,死活搞不定。让人郁闷的是,zabbix server debug的log中,什么都没有写,一切似乎都很正常!于是,一怒之下,用gdb调试zabbix_server来看看究竟是怎么回事。
使用zabbix_sender发送时,信息如下:
[root@localhost tmp]# zabbix_sender -k "online_users" -o "456" -T -vv -c /etc/zabbix/zabbix_agentd.conf -s iPilot-80 -z 10.10.136.83
zabbix_sender [20644]: DEBUG: answer [{
"response":"success",
"info":"Processed 0 Failed 1 Total 1 Seconds spent 0.308953"}]
Info from server: "Processed 0 Failed 1 Total 1 Seconds spent 0.308953"
sent: 1; skipped: 0; total: 1
把zabbix_server的config文件中的debuglevel改成debug,然后在日志中搜索online_users,可以看到有类似下面的日志:
78276- 6460:20111212:220318.043 Trapper got [{
78277- “request”:”sender data”,
78278- “data”:[
78279- {
78280- “host”:”iPilot-80″,
78281: “key”:”onlines”,
78282- “value”:”456″}]}] len 104
78283- 6460:20111212:220318.043 In recv_agenthistory()
78284- 6460:20111212:220318.043 In process_hist_data()
78285- 6460:20111212:220318.043 In process_mass_data()
78286- 6460:20111212:220318.043 In DCinit_nextchecks()
78287- 6460:20111212:220318.043 In DCflush_nextchecks()
78288- 6460:20111212:220318.043 End of process_mass_data()
78289- 6460:20111212:220318.043 In zbx_send_response()
78290- 6460:20111212:220318.043 zbx_send_response() ‘{
78291- “response”:”success”,
78292- “info”:”Processed 0 Failed 1 Total 1 Seconds spent -0.000000″}’
78293- 6460:20111212:220318.043 End of zbx_send_response():SUCCEED
78294- 6460:20111212:220318.043 End of recv_agenthistory()
这里,我们可以清晰的看到函数执行时的调用顺序。
ok,gdb出场了。
首先,编译zabbix_server时,在Makefile中,把
zabbix_server_CFLAGS = -DZABBIX_DAEMON
改成
# zabbix_server_CFLAGS =
重新编译,启动编译后的zabbix_server;
然后,使用gdb attach到zabbix_server上;
当你使用ps aux时,你会发现有很多个(通常有20多个)zabbix_server进程在运行,怎么办?
ok,修改zabbix server的配置文件,把Start开始的进程数配置都改成最小,其中,StartTrappers一定要改成1,我的配置文件修改后,如下:
[root@redhat5 tmp]# cat /etc/zabbix/zabbix_server.conf | grep Start | grep -v ^#
StartPollers=0
StartIPMIPollers=0
StartPollersUnreachable=0
StartTrappers=1
StartPingers=0
StartDiscoverers=0
StartHTTPPollers=0
StartDBSyncers=1
StartProxyPollers=0
靠
重启重新编译后的zabbix_server,用gdb ./zabbix_server来调试(假设当前目录的zabbix_server的编译目录)。
ps aux | grep zabbix_server时,一般会有10个左右的zabbix_server进程,这时,一般第3个进程是trapper的进程,如何判断是不是trapper的进程?
当你attch zabbix_server进程pid后,使用bt命令,显示出函数堆栈,trapper的如下:
(gdb) bt
#0 0xb7f2a410 in __kernel_vsyscall ()
#1 0x005b88c1 in select () from /lib/libc.so.6
#2 0x08093e2b in zbx_tcp_accept (s=0xbfd8b90c) at comms.c:971
#3 0x08064eeb in main_trapper_loop (p=1 '\001', s=0xbfd8b90c) at trapper.c:437
#4 0x08055d02 in MAIN_ZABBIX_ENTRY () at server.c:645
#5 0x0808803b in daemon_start (allow_root=0) at daemon.c:252
#6 0x080551a6 in main (argc=16, argv=0x0) at server.c:437
(gdb)
让
根据上面zabbix server的日志,设置zabbix server的breakpoint:
b process_hist_data
b process_mass_data
当一步一步跟踪下去之后,发现问题出在这个函数身上:
zbx_tcp_check_security
这个函数用来检查zabbix_sender端是否被允许发送数据。
终于搞清楚了,zabbix-sender的文档仅仅说了zabbix_sender的用法,其中,在web界面上,配置zabbix_sender的item时,需要注意:
1、类型一定要是zabbix_trap类型;
2、allowed ip要填写zabbix_sender的ip地址,如果有多个,使用,分割;
3、zabbix_sender命令中的-s参数hostname要和server的web界面上一致;
注意了这几点,基本上就没问题了。
本文转自 liqius 51CTO博客,原文链接:http://blog.51cto.com/szgb17/1888995,如需转载请自行联系原作者