0

我有一个将事件记录到 MySQL 表中的应用程序,每个条目(行)都有一个时间戳、状态和一些其他任意元数据位。

在非常简化的形式中,日志表可能类似于 log_id | 日期时间 | 结果代码 | 信息

我想要求 Zabbix 离开并直接查询数据库以获取统计数据可能有点雄心勃勃,但我想知道它还能如何构建。

我可以有一个单独的进程来查询表并写出一个日志文件,但这感觉有点笨拙。我可以从 zabbix_agent.conf 运行一个脚本,但我不确定如何将该数据转换为 Zabbix 解释的指标。

4

3 回答 3

3

我理解这个问题的方式是能够以与 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} 和 {项目.日志.源}。

项目的示例配置可能如下:

在此处输入图像描述

于 2014-04-29T07:53:05.073 回答
1

asaveljevs 的回答非常棒而且非常详细。它还将提供 zabbix 日志监控视图。如果不需要,更简单的方法可能是从数据库中获取所有条目(可能通过存储 log_id 并且仅获取较新的条目),然后使用 zabbix_sender 将它们发送到 zabbix(参见https://www.zabbix .com/documentation/2.2/manpages/zabbix_sender )

于 2014-04-30T07:08:30.593 回答
0

对于 asaveljevs 的答案中提到的第 1 部分,我会在这里查看一个MySQL 触发器来提供帮助。所以触发器可以推送一个脚本,将信息推送到 Zabbix。

于 2015-05-20T08:33:57.447 回答