Zabbixアクションスクリプトにアプリケーション名の情報を渡したいがマクロ経由ではできなそう

ZabbixのActionでカスタムスクリプトにマクロで情報を渡しているのですが、このApplicationの情報が取リ方がわかりません。

f:id:yomon8:20180416124629p:plain

マクロ定義されていれば、このあたりと思われますのですが、無さそうです。

https://github.com/zabbix/zabbix/blob/3.2.4/src/libs/zbxserver/expression.c#L1616

https://www.zabbix.org/websvn/wsvn/zabbix.com/trunk/src/libs/zbxserver/expression.c?rev=78516

{ITEM.APPLICATION} というマクロがあれば一番なんだけどなと思っていたらこんなIssueもあったりで、

[ZBXNEXT-4303] {ITEM.APPLICATION} macro - ZABBIX SUPPORT

結局あきらめて、ZabbixのAPIを利用して取得することにしました。

Zabbix API利用例

今回利用したのは application.get です。 application.get [Zabbix Documentation 3.0]

Golangのこちらのライブラリ利用させてもらって実装してみました。

GitHub - AlekSi/zabbix: Go package providing access to Zabbix API.

package main

import (
    "fmt"
    "net/http"

    "github.com/AlekSi/zabbix"
)

type Connection struct {
    url      string
    user     string
    password string
}

func printApplications(conn *Connection, param zabbix.Params) {
    api := zabbix.NewAPI(conn.url)
    api.SetClient(http.DefaultClient)
    auth, err := api.Login(conn.user, conn.password)
    if err != nil {
        if zerr, ok := err.(*zabbix.Error); ok {
            fmt.Printf("%#v\n", zerr)
            panic(err)
        }
        panic(err)
    }
    if auth == "" {
        panic(err)
    }

    apps, err := api.ApplicationsGet(param)
    if err != nil {
        panic(err)
    }
    for _, ap := range apps {
        fmt.Printf("ApplicationId=%s, HostId=%s, Name=%s\n", ap.ApplicationId, ap.HostId, ap.Name)
    }
}

func main() {
    conn := &Connection{
        url:      "http://localhost:8080/api_jsonrpc.php",
        user:     "admin",
        password: "zabbix",
    }

    // get.application API のパラメータ
    // https://www.zabbix.com/documentation/3.0/manual/api/reference/application/get#parameters

    fmt.Println("=====")
    fmt.Println("パラメータを空にすると全件")
    printApplications(conn, zabbix.Params{})

    fmt.Println("=====")
    fmt.Println("{HOST.ID}でフィルタ")
    printApplications(conn, zabbix.Params{
        "hostids": "10105",
    })

    fmt.Println("=====")
    fmt.Println("{HOST.ID}と{ITEM.ID}でフィルタ")
    printApplications(conn, zabbix.Params{
        "hostids": "10105",
        "itemids": "23667",
    })

    fmt.Println("=====")
    fmt.Println("複数の{HOST.ID}でフィルタ")
    printApplications(conn, zabbix.Params{
        "hostids": []string{"10093", "10094", "10095"},
    })
}

出力例

=====
パラメータを空にすると全件
ApplicationId=1, HostId=10001, Name=OS
ApplicationId=5, HostId=10001, Name=Filesystems
ApplicationId=7, HostId=10001, Name=Network interfaces
ApplicationId=9, HostId=10001, Name=Processes
ApplicationId=13, HostId=10001, Name=CPU
ApplicationId=15, HostId=10001, Name=Memory
ApplicationId=17, HostId=10001, Name=Performance
ApplicationId=21, HostId=10001, Name=General
----
----省略
----
ApplicationId=463, HostId=10105, Name=Memory
ApplicationId=464, HostId=10105, Name=Network interfaces
ApplicationId=465, HostId=10105, Name=OS
ApplicationId=466, HostId=10105, Name=Performance
ApplicationId=467, HostId=10105, Name=Processes
ApplicationId=468, HostId=10105, Name=Security
ApplicationId=469, HostId=10105, Name=Zabbix agent
=====
{HOST.ID}でフィルタ
ApplicationId=460, HostId=10105, Name=CPU
ApplicationId=461, HostId=10105, Name=Filesystems
ApplicationId=462, HostId=10105, Name=General
ApplicationId=459, HostId=10105, Name=HTTP service
ApplicationId=463, HostId=10105, Name=Memory
ApplicationId=464, HostId=10105, Name=Network interfaces
ApplicationId=465, HostId=10105, Name=OS
ApplicationId=466, HostId=10105, Name=Performance
ApplicationId=467, HostId=10105, Name=Processes
ApplicationId=468, HostId=10105, Name=Security
ApplicationId=469, HostId=10105, Name=Zabbix agent
=====
{HOST.ID}と{ITEM.ID}でフィルタ
ApplicationId=459, HostId=10105, Name=HTTP service
=====
複数の{HOST.ID}でフィルタ
ApplicationId=446, HostId=10093, Name=FTP service
ApplicationId=447, HostId=10094, Name=HTTP service
ApplicationId=448, HostId=10095, Name=HTTPS service