【入門編】Zabbixエージェントのカスタムプラグイン開発入門:Go言語を用いて独自のパフォーマンスカウンター監視エクステンションをスクラッチから作る方法 – 運用監視・オブザーバビリティ活用バイブル

こんにちは!現場で泥臭いシステム運用から洗練されたオブザーバビリティ基盤の構築まで、日々コードとサーバーに向き合っている先輩エンジニアです。

突然ですが、あなたはその場しのぎの「死活監視」に疲れていませんか?
「CPU使用率が80%を超えた」「Webサーバーが落ちた」。そんなアラートが鳴り響くたびに、夜中に叩き起こされる生活はもう終わりにしましょう。

本物のオブザーバビリティ(可観測性)とは、単に障害を検知することではありません。「システムの内部状態を深く理解し、予兆を捉え、ビジネスの価値を守る」ことです。そのために欠かせないのが、Zabbix Agent 2とGo言語を組み合わせたカスタムプラグイン開発です。

「えっ、Zabbixの拡張って難しそう……」
「Pythonやシェルスクリプトで十分じゃないの?」

そう思ったあなた。シェルスクリプトでのポーリングは、プロセス起動のオーバーヘッドが大きく、高頻度のメトリクス収集ではサーバーのパフォーマンスを食いつぶす「ガン」になります。一方、Zabbix Agent 2はGo言語で書かれており、その拡張性もGoのネイティブなプラグイン機構によって支えられています。

これをマスターすれば、独自のビジネスロジックや特殊なハードウェアメトリクスを、極めて軽量かつセキュアに、非同期でZabbixへ流し込めるようになります。毎日の運用管理が劇的に楽になる世界へ、一緒に一歩を踏み出しましょう!

—

1. Zabbix Agent 2のプラグインアーキテクチャの基本構造と開発環境の準備

なぜ従来のZabbixエージェントではなく「Agent 2」なのか?

かつてのZabbixエージェント(C言語製)で独自のメトリクスを取ろうとすると、外部スクリプトを呼び出すか、C言語でゴリゴリとモジュールを書く必要がありました。前者は遅く、後者はメモリリークやセグメンテーション違反の悪夢と隣り合わせでした。

Zabbix Agent 2は、そのすべてを解決します。

  • Go言語によるモダンな設計: 型安全で、並行処理(Goroutine)が強力。
  • プラグイン機構: エージェントのプロセス内に直接組み込めるため、余計なプロセスを立ち上げるオーバーヘッドがゼロ。
  • 非同期処理(Concurrent Checks): 重い処理や応答の遅い外部APIを叩いても、他のメトリクス収集をブロックしません。

開発環境の準備

まずは、お手元のローカルマシン(LinuxまたはmacOSを推奨)にGo言語の環境を整えましょう。Zabbix Agent 2のプラグイン開発には、公式が提供している専用のSDK(`zabbix-agent2-plugin`)を使用します。

以下のコマンドで、Goがインストールされていることを確認してください。

go version
Go 1.20以上が推奨です

適当な作業ディレクトリを作成し、Goモジュールを初期化します。

mkdir -p $HOME/zabbix-plugins/my-perf-plugin
cd $HOME/zabbix-plugins/my-perf-plugin
go mod init example.com/my-perf-plugin

そして、Zabbix公式のプラグインSDKを依存関係として取得します。

go get git.zabbix.com/ap/plugin-support

これで、開発の土台は整いました。驚くほどシンプルですよね。

—

2. Go言語を用いたカスタムメトリクス収集プラグインの実装コード例とビルド手順

それでは、今回の主役である「カスタム・パフォーマンスカウンター・プラグイン」を書いていきましょう。
今回は、「架空のアプリケーションのコネクション数や処理スループット」を模したメトリクスを定期的に収集し、Zabbixに返すプラグインを作ります。

実装コード (`main.go`)

以下のコードを `main.go` として保存してください。コード内のコメントをしっかりと読み込むことで、Zabbix Agent 2プラグインのお作法が手に取るようにわかるはずです。

package main

import (
“fmt”
“math/rand”
“time”

“git.zabbix.com/ap/plugin-support/metric”
“git.zabbix.com/ap/plugin-support/plugin”
“git.zabbix.com/ap/plugin-support/plugin/container”
)

// Plugin構造体は、Zabbix Agent 2のプラグインとしての本体です。
type Plugin struct {
plugin.Base
}

var impl Plugin

// Exportは、Zabbixサーバーからキーが要求されたときに同期的に呼ばれるメソッドです。
func (p Plugin) Export(key string, parameters []string, ctx plugin.ResultWriter) error {
switch key {
case “my.app.performance”:
// ここでは例として、ランダムなパフォーマンス値を生成しています
// 実際にはここでDBへのコネクション数やOSの特定カウンターを読み取ります
rand.Seed(time.Now().UnixNano())
activeConnections := rand.Intn(100) + 1
throughput := rand.Float64() 500.0

// メトリクスをJSON形式のような構造にして返却(今回はシンプルにアクティブ接続数を返す)
result := fmt.Sprintf(`{“connections”: %d, “throughput”: %.2f}`, activeConnections, throughput)
ctx.Write(result)
return nil
default:
return plugin.UnsupportedMetric
}
}

func init() {
// プラグインのメタデータと、サポートするメトリクス(キー)を登録します
err := plugin.RegisterMetrics(&impl, “MyPerfPlugin”,
“my.app.performance”, “Returns custom application performance metrics.”,
)
if err != nil {
panic(err)
}
}

func main() {
// エージェントとの通信チャネルを確立し、プラグインを起動します
h, err := container.NewHandler(“MyPerfPlugin”)
if err != nil {
fmt.Printf(“Failed to init plugin handler: %s\n”, err.Err.Error())
return
}
impl.Logger = h

err = h.Execute()
if err != nil {
fmt.Printf(“Failed to execute plugin handler: %s\n”, err.Err.Error())
return
}
}

ビルド手順

このGoプログラムをコンパイルし、Zabbix Agent 2が読み込めるバイナリを作成します。

go build -o my-perf-plugin main.go

これで、同ディレクトリに `my-perf-plugin` という実行ファイルが生成されました。これがあなたの作ったカスタムエクステンションです!

—

3. エージェント側での非同期処理実装とZabbixサーバーへの安全なデータ送信テスト

プラグインを作ったら、次はそれをZabbix Agent 2に認識させ、実際にメトリクスが取れるかをテストしましょう。

設定ファイルの調整

Zabbix Agent 2は、外部プラグインをロードする仕組みを持っています。エージェントの設定ファイル(通常は `/etc/zabbix/zabbix_agent2.conf` またはカスタム設定ディレクトリ)に、作成したプラグインのパスを指定します。

例えば、プラグインの設定ディレクトリ(例: `/etc/zabbix/zabbix_agent2.d/plugins.conf`)に以下のように記述します。

カスタムプラグインの実行ファイルのパスを指定
Plugins.MyPerfPlugin.Path=/path/to/my-perf-plugin/my-perf-plugin

動作確認(Zabbixゲットツールでのテスト)

Zabbixサーバーに組み込む前に、必ず手元で動作確認(スモークテスト)を行いましょう。Zabbix Agent 2には、メトリクスを直接テストできる強力なコマンドラインツール `zabbix_get` またはエージェント自体のテスト機能があります。

Agent 2をプラグインモードで直接起動するか、テスト用の設定で動かして、以下のコマンドを叩きます。

zabbix_agent2 -t my.app.performance

【期待される出力イメージ】

my.app.performance [t|{“connections”: 42, “throughput”: 312.45}]

おめでとうございます!これで、あなたが書いたGoのコードが、Zabbixのエコシステムの一部として独自のパフォーマンスカウンターを安全に収集・送信できるようになりました。

—

先輩エンジニアからの最後のメッセージ

ここまで読み進めていただきありがとうございます。
Zabbix Agent 2とGo言語によるカスタムプラグイン開発、いかがでしたでしょうか?

「監視ツールに合わせる」のではなく、「自分たちのシステムに合わせて監視ツールを拡張する」。このアプローチを手に入れた瞬間から、あなたの運用エンジニアとしてのスキルは間違いなく次のステージへジャンプアップします。

シェルスクリプトのモタつきにイライラすることも、ブラックボックス化した監視に頭を悩ませることももうありません。ぜひこの週末、あなたの管理するシステムの「見えないデータ」をこのプラグインで可視化してみてください。毎日の運用が、劇的に、そして圧倒的に楽になりますよ。

それでは、素晴らしいオブザーバビリティライフを!

タイトルとURLをコピーしました