我有一个将事件记录到 MySQL 表中的应用程序,每个条目(行)都有一个时间戳、状态和一些其他任意元数据位。
在非常简化的形式中,日志表可能类似于 log_id | 日期时间 | 结果代码 | 信息
我想要求 Zabbix 离开并直接查询数据库以获取统计数据可能有点雄心勃勃,但我想知道它还能如何构建。
我可以有一个单独的进程来查询表并写出一个日志文件,但这感觉有点笨拙。我可以从 zabbix_agent.conf 运行一个脚本,但我不确定如何将该数据转换为 Zabbix 解释的指标。
我理解这个问题的方式是能够以与 Zabbix 的内置日志监控大致相同的方式监控具有日志记录的数据库。
如果是这样,这个问题分为两部分:(1)如何仅轮询数据库以获取新记录;(2)如何以 Zabbix 可以理解的方式向 Zabbix 发送数据。我将把(1)留给你,但会提出一种处理(2)的方法。
我们可以按照 Zabbix 代理处理 Windows 事件日志的方式对 (2) 的解决方案进行建模。如果我们让 Windows 上的 Zabbix 代理监控,比如“eventlog[Application]”,我们会注意到它向 Zabbix 服务器发送如下 JSON:
{
"data": [
{
"clock": 1398753145,
"ns": 928525552,
"eventid": 9003,
"host": "Windows 2008",
"key": "eventlog[Application]",
"lastlogsize": 51,
"severity": 1,
"source": "Desktop Window Manager",
"timestamp": 1375273705,
"value": "The Desktop Window Manager was unable to ..."
}
],
"request": "agent data"
}
现在,我们可以使用相同的协议发送我们想要的数据。例如,根据您的日志表的简化形式,我们可以将“log_id”放入“lastlogsize”,将“datetime”放入“timestamp”,将“result_code”放入“eventid”,将“message”放入“value”。然后,我们可以使用 Zabbix 源代码中提供的便利 misc/debug/sender.pl 脚本将此数据发送到 Zabbix 服务器:
$ cat mysql.json
{
"data": [
{
"clock": 1398753145,
"ns": 928525552,
"eventid": 12345,
"host": "MySQL Server",
"key": "eventlog[mysql.log]",
"lastlogsize": 1,
"severity": 1,
"source": "My Application",
"timestamp": 1375273705,
"value": "My Application was unable to ..."
}
],
"request": "agent data"
}
$ ./sender.pl -h 127.0.0.1 -p 10051 -i mysql.json
ZBXD^{
"response":"success",
"info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000130"}
不过,有两个警告。一个是为了在 Zabbix 前端享受 Windows 事件日志功能(比如在“监控”->“最新数据”中显示 Windows 事件日志列),键应该以“eventlog [”开头。其次,“lastlogsize”应该随着您发送的每条记录而增加,但是如果您将“log_id”用于“lastlogsize”,那将很自然。
除此之外,您现在应该能够享受 Windows 事件日志特定的触发功能,例如 logeventid()、logseverity() 和 logsource() 以及宏{ITEM.LOG.EVENTID}、{ITEM.LOG.SEVERITY} 和 {项目.日志.源}。
项目的示例配置可能如下:
asaveljevs 的回答非常棒而且非常详细。它还将提供 zabbix 日志监控视图。如果不需要,更简单的方法可能是从数据库中获取所有条目(可能通过存储 log_id 并且仅获取较新的条目),然后使用 zabbix_sender 将它们发送到 zabbix(参见https://www.zabbix .com/documentation/2.2/manpages/zabbix_sender )
对于 asaveljevs 的答案中提到的第 1 部分,我会在这里查看一个MySQL 触发器来提供帮助。所以触发器可以推送一个脚本,将信息推送到 Zabbix。