【问题标题】:Zabbix watch a MySQL tableZabbix 监视一个 MySQL 表
【发布时间】:2014-04-28 15:07:36
【问题描述】:

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

在一个非常简化的形式中,日志表可能看起来像 log_id |日期时间 |结果代码 |留言

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

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

【问题讨论】:

  • 不知道 zabbix 是如何工作的,但是如果它可以锁定文件并解析输出,您总是可以设置一个本地 unix 域套接字并使用一个简单的脚本转储 mysql 中的任何新内容定期表。 zabbix 会认为它正在读取一个文件,而你的中间脚本会处理 mysql->zabbix 的翻译。

标签: mysql zabbix


【解决方案1】:

我理解这个问题的方式是能够以与Zabbix'built-in log monitoring大致相同的方式监控具有日志记录的数据库。

如果是这样,这个问题分为两部分:(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 事件日志的 trigger functions,例如 logeventid()、logseverity() 和 logsource() 和 macros {ITEM.LOG.EVENTID}、{ITEM.LOG .SEVERITY} 和 {ITEM.LOG.SOURCE}。

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

【讨论】:

  • 或者,如果您不需要这样的粒度级别,您可以将 MySQL 表行转储到文件并使用 Zabbix 内置的日志监控。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 2016-10-12
      • 2014-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多