Zabbix中Orabbix监控失效的问题及分析
自从使用了Orabbix监控Oracle以来,很多工作都能够通过这种配置可控的方式处理,有些问题是潜在问题,有些是遗留问题,多多少少还是提高了效率。
最近涉及机房搬迁,我们的Zabbix服务器也在迁移计划中,而因为部署的规模也不大,所以Orabbix和Zabbix Server放在了一起,结果搬迁之后问题就来了,搬迁之后开通了网络防火墙的前提下,系统层面的监控Zabbix Agent表现正常,而原本可用的Orabbix现在没有任何监控信息,
在这种监控基本失效的情况下,我总是不断的收到这样的报警信息,对于一个核心业务而言,这类报警会很敏感,
ZABBIX-监控系统:
------------------------------------
报警内容: Alive xxxx
------------------------------------
报警级别: PROBLEM
------------------------------------
监控项目: Alive:0
------------------------------------
报警时间:2017.07.21-22:25:40
查看Orabbix的日志信息,发现在连接正常的情况下,最后会抛出一个空指针异常。
[root@orabbx_monitor logs]# tail -f orabbix.log
2017-07-22 23:15:43,168 [main] INFO Orabbix - maxIdleSize=1
2017-07-22 23:15:43,168 [main] INFO Orabbix - maxIdleTime=1800000ms
2017-07-22 23:15:43,168 [main] INFO Orabbix - poolTimeout=100
2017-07-22 23:15:43,168 [main] INFO Orabbix - timeBetweenEvictionRunsMillis=-1
2017-07-22 23:15:43,169 [main] INFO Orabbix - numTestsPerEvictionRun=3
2017-07-22 23:15:43,774 [main] INFO Orabbix - Connected as ORABBIX
2017-07-22 23:15:43,778 [main] INFO Orabbix - --------- on Database -> test
ERROR Orabbix - Error on dbJob for database test QueryList error: java.lang.NullPointerException
INFO Orabbix - Done with dbJob on database testQueryList elapsed time 1089 ms
在这种情况下,分析问题也变得很艰难,因为目前还不知道到底是哪里的问题,到底是Zabbix Server,还是Agent还是Orabbix本身。
这个空指针异常很模糊,通过这些信息,我们基本可以断定Zabbix Server是没有问题的,如果有问题Zabbix Agent的系统监控修直接会失效,而Orabbix的角色有点类似于一个Zabbix AGent,本质上是使用JDBC的方式来发送SQL来达到监控的需求。
所以我的注意力自然而然到了Orabbix上面,首先我把监控的数据库列表精简为一到两个,这样方便排查问题。
经过一番排查,大体的收获就是Zabbix Server端的Zabbix Agent没启动,Orabbix还是需要的。另外一个就是因为服务器搬迁,IP信息发生变化,所以原本的本机的防火墙信息需要补充,比如自己给自己开通10050端口的访问,因为这台服务器是Zabbix Server,也是一台服务器,所以也要监控自己,而Orabbix是需要这个Zabbix Agent的,还有一点也很重要,那就是在/etc/hosts里调整IP信息。
做了这些之后重启Orabbix,发现问题依旧,重启了Zabbix Agent,Zabbix Server,问题依旧。
而且我发现日志信息很简单,开启了Debug模式之后,日志信息虽然多了,但是都是失败的信息,暂时没有发现有价值的信息。
所以我决定通过对比来确定问题的边界。
Orabbix本质上架构虽然简单,官方提供的图形如下:
但是出了问题之后信息很有限,要想得到更多的支持就有些难了,我搜了一圈,关于Orabbix的文章,十篇里面有八篇都是我写的,这种情况真是很尴尬,看来只能自己硬着头皮继续分析了。
目前的情况没有进展,数据库层面的监控项都没有生效,所以一个重点的方向就是保证首先Orabbix可用,这个怎么办呢,在当前的环境中调试总是没有进展,那我就干脆重新搭建一套,搭建起来大概10多分钟就搞定了,安装Java,解压orabbix软件包,启动。
数据库和Orabbix的连接信息配置是通过Orabbix里的config.properties文件来控制的,而监控项的信息是通过query.properties来控制的,而在Zabbix里面orabbix的监控项是通过模板来控制的,所以Orabbix的问题分析就主要是通过这三个文件来得到更多的信息。
配置好Orabbix之后,监控项我保留了默认的,发现Orabbix竟然可用了,这就说明config.properties文件没有问题。
而当我把监控项的文件query.properties替换为目前的文件时,启动Orabbix竟然抛出了刚开始的错误,所以可以说明问题出在了query.properties文件上。
那么问题继续如何定位呢,我恢复了query.properties文件之后,监控又恢复了正常,但是我定制了大量的监控项,这些在默认的模板中是没有的,是不是监控模板出了问题呢。
这种情况下,我做了一种中和,那就是使用默认的模板,然后先把一个定制监控项加进去,结果发现这个监控项竟然取不到数据。在Zabbix中错误信息如下:
看起来是数据类型不匹配造成的,我把数据类型改为文本,最后发现这个监控项的输出就是一个空字符,所以转换类型的时候出了问题。
那以前怎么是好的,是不是Orabbix向Zabbix推送数据的时候有问题。监控项是使用Zabbix trapper来推送的,那么我们可以使用zabbix_sender来推送一条信息试试是否成功,比如下面的命令。
./zabbix_sender -z 10.129.xx.xx -p 10051 -s "test" -k db_time -o "test"
info from server: "processed: 1; failed: 0; total: 1; seconds spent: 0.000051"
sent: 1; skipped: 0; total: 1
其中10.129.xx.xx是IP的信息,10051是端口的信息,test是对应的数据库的实例名,也就是对应Zabbix里面的一个主机名,db_time是监控项的名字,最后-o "test"就是发送的信息是test
结果显示这个信息推送还是正常的,那我们就逐步缩小排查范围,基本排除了模板的问题,因为信息推送是没有问题的。
所以一圈排查下来就是query.props文件的问题了,这个空指针的问题看起来很诡异,但是我们可以在这种情况下先折中处理,比如先配置几个优先级很高的监控项,让监控生效,然后在后期对这个监控列表做出很细致的调整。有一点可以确定的是,这个Orabbix自从启动以来就没有停过,所以不排除Orabbix本身的检查机制是否在重启之后有些验证就过不去。
所以我在新服务器上调试成功的Orabbix文件query.properties,在备份之后我就拷贝到了原来的目录下,这样连接信息不变,模板也不变,监控项保留了绝大部分,整个Orabbix的监控又跑起来了。
比如下面的这个DB time监控
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PyQt使用QPropertyAnimation开发简单动画
- 如何使用JavaScript漂亮地打印JSON对象
- Android使用AsyncTask加载图片的操作流程
- nodejs中post请求方式,req.body接值为空如何解决
- Kotlin使用静态变量与静态方法详解
- Android通过代码控制ListView上下滚动的方法
- Android为Tiny4412设备驱动在proc目录下添加一个可读版本信息的文件
- Android Studio 4.1 发布啦
- Spring Boot 2.4 配置文件将加载机制大变化
- 「性能提升」扩展 Spring Cache 支持多级缓存
- OAuth 2.0 单元测试解决方案
- 聊一聊如何搭建高性能网站哪一些事
- Spring Cloud netflix ribbon源码分析
- 抽奖摇号系统随机性算法介绍
- 翻了翻element-ui源码,发现一个很实用的指令clickoutside