mattintosh note

どこかのエンジニアモドキの備忘録

Zabbix Sender 無しで Zabbix Server にデータを送る

Zabbix API について色々調べてたけど…

「あれ?これってアイテムのデータ追加できなくない?」

という問題にぶち当たった。Slack みたいにデータを追加できるものかと思ったのだが、どうも "request": "sender data" を受け付けない。Zabbix のドキュメントルートを探してみても sender data という文字列は見当たらない。ということは Zabbix Sender が使えないデバイスはデータの追加が出来ないのでは?

いやいやでも Python のモジュールとかあるじゃん。

ってことで Python 系の Zabbix モジュールを色々探して読んでみた。

github.com

このコードを見て、サーバーに送る部分で何をやってるかというと、

  1. Zabbix サーバーの 10051 ポートに接続する
  2. JSON ぶん投げる

以上。マジでこれしかやってないっぽい。

ってことは nc コマンドで接続して JSON 投げるだけで出来るんじゃね?

$ nc 10.0.3.3 10051 <<!
{
    "request": "sender data"
,   "data": [
        {
            "host": "raspberrypi"
        ,   "key": "room_temperature"
        ,   "value": "0"
        }
    ]
,   "clock": `date +%s`
}
!
ZBXDZ{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000074"}

Zabbix Sender 要らないやんけええええええええ

Zabbix Sender とは一体…。

つまり Zabbix Sender さんのお仕事は -s-k-o オプションで受けった引数から JSON を生成して -z のサーバに投げてるだけということだ。これなら Zabbix Sender をインストールできないデバイスでも使えそう。

FlashAir の Lua でも使おうと思ってるので Lua でソケット通信を簡単に書いてみる。Lua は全然やったことがないから作法とかがよくわからない。

#!/usr/bin/lua

local socket = require("socket")
local client = assert(socket.connect("10.0.3.3", 10051))
local json = [[
{
    "request": "sender data"
,   "data": [
        {
            "host": "alarmpi"
        ,   "key": "room_temperature"
        ,   "value": "0"
        }
    ]
}
]]
client:send(json)
socket.sleep(0.5)
local line = client:receive()
print(line)
client:close()

一応 Zabbix にデータは入るんだけど、client:receive()nil で返ってきちゃうなぁ…。そもそも FlashAir で socket が使えるのかどうかわからんな…。HTTP リクエストはできるから REST かなぁ。

$ lua zabbix_sender.lua
nil