アクティブ監視
- raw ソケットによる ICMP 死活監視
- SNMP v2c / v3(USM)、GETBULK でインターフェースごとに収集
- HTTP / URL 監視 — 応答時間・本文キーワード・JSON 値・TLS 有効期限
- DNS 名前解決監視と CNAME チェーンの履歴
- 読み取り専用の Dashboard API 経由で Cisco Meraki を監視
- ポーリング間隔のジッタと、機器ごとのレート制限
Yagra は Rust で書かれたオープンソースの NMS です。ICMP・SNMP v2c/v3・HTTP/API 監視、分散ポーラー、オンコール担当者を埋もれさせないアラート。Docker コンテナとして配布し、書き直しではなく設定でスケールアウトします。
Rust · Tokio · Axum · React · PostgreSQL · VictoriaMetrics · NATS
アクティブ/パッシブ監視、ディスカバリ、アラート、トラフィック分析 — 規模が大きくなっても、見落とさず鳴りすぎないことを狙った設計です。
コアとポーラーはバス経由でのみ通信します。そのためポーラーはステートレスで、水平にスケールでき、NAT やファイアウォール越しのリモート拠点にも展開できます。ポーラーは外に向けてポーリングし、内側では syslog・トラップ・フローエクスポートを受け取ります。集めたデータは、種類ごとにそれぞれ適したストアへ入ります。
コアがポーラーを直接呼ぶことはなく、機器からのトラフィックを直接受けることもありません。syslog・SNMP トラップ・フローエクスポートは、すべてエッジのポーラー(NAT 越しのリモート拠点にあるものを含む)が受信し、バス経由でコアへ届きます。例外は受信 Webhook だけで、これは API に直接届きます。なお NATS はブローカー本体であり、各ストアと同じバックエンドサービスです。Bus のほうはコアと各ポーラーの両方に組み込まれるクライアントのクレートで、図で両方に現れるのはそのためです。
ここに並ぶすべてが上の図に描かれています。デプロイする単位は Core・Poller・WebUI の 3 つで、その中に描かれた小さな箱が、各プロセスを構成する Rust クレートです。タグはどのプロセスに入るかを再掲したものです。
MVP は数個のコンテナに同居して動きます。同じビルドのまま、設定だけで分散ポーラーや高可用なストアへスケールアウトできます。
ポーラーは監視対象ごとの状態を持ちません。そのためコーディネーターは、コンシステントハッシュで稼働中のポーラーにノードを割り当て、ハートビートが途絶えたら割り当て直せます。リモートポーラーは中央のバスへ自分から接続しにいき、ネットワークが分断されている間は結果を手元にためます。再接続すると、ためたメトリクスをまとめて送ります。一方アラートは後追いで送らないので、回線が復旧した瞬間に古いイベントで埋め尽くされることはありません。
WebUI は最初から HTTPS です — 自分の証明書を UI から取り込め、再起動も要りません。監視用の認証情報はエンベロープ暗号(AES-256-GCM)で保護し、鍵はデータベースの外に置きます。OIDC によるシングルサインオン(Microsoft Entra ID・Okta・Google Workspace はガイド付き設定で、その製品が必要とする項目だけを尋ねます)、LDAP / Active Directory アカウントでのサインイン、ロールベースのアクセス制御、改ざんできない監査ログ、ポーラーごとにスコープを絞ったバス接続用の認証情報。高度な分散・HA 機能はすべてオプトインで、既定値は保守的かつ後方互換のままです。
コア・ポーラー・WebUI と、背後のストア(PostgreSQL・Redis・NATS・VictoriaMetrics)を Docker Compose でまとめて起動します。
https://localhost:8443http://localhost:8080$ docker compose up --build初回起動時、使い捨ての admin パスワードがコアのログに出力されます。次のコマンドで確認してください。
docker compose logs core公開しているイメージ
ghcr.io/horryworks/yagra-core
ghcr.io/horryworks/yagra-poller
ghcr.io/horryworks/yagra-webソースを読み、自分で動かし、GitHub ですべてのリリースを追えます。サインアップも、テレメトリの壁もありません。
オープンベータ公開中です。バグ報告・質問は GitHub Issue へ(このプロジェクトの唯一の連絡窓口で、問い合わせ用のメールアドレスはありません)。Pull Request は現時点では受け付けていません。