このエクスポーターは、Prometheus が取り込める形式で SNMP データを公開するための推奨される方法です。
簡単に開始するには、 public_v2
認証モジュールを使用するスイッチ、アクセス ポイント、またはルーターでif_mib
モジュールを使用することをお勧めします。これは、ターゲット デバイス上の読み取り専用アクセス コミュニティである必要があります。
SNMP のコミュニティ文字列は、SNMP v1 および v2c では暗号化されずに送信されるため、秘密とみなされないことに注意してください。安全にアクセスするには、SNMP v3 が必要です。
SNMP は階層データ構造を使用し、Prometheus は n 次元マトリックスを使用しますが、2 つのシステムは完全にマッピングされており、手作業でデータを調べる必要はありません。 snmp_exporter
データをマッピングします。
Prometheus は、SNMP インデックス インスタンスをラベルにマッピングできます。たとえば、 ifEntry
ifIndex
の INDEX を指定します。これは Prometheus のifIndex
ラベルになります。
SNMP エントリに複数のインデックス値がある場合、各値は個別の Prometheus ラベルにマッピングされます。
SNMP は、MIB によって記述された OID ツリーで構造化されています。 OID サブツリーは、ツリー内の異なる場所にわたって同じ順序を持ちます。 1.3.6.1.2.1.2.2.1.1
( ifIndex
) の順序は、 1.3.6.1.2.1.2.2.1.2
( ifDescr
)、 1.3.6.1.2.1.31.1.1.1.10
( ifHCOutOctets
) などと同じです。数字は OID で、括弧内の名前は MIB (この場合は IF-MIB) からの名前です。
インターフェイス番号 2 を持つデバイスの場合、部分的なsnmpwalk
戻り値は次のようになります。
1.3.6.1.2.1.2.2.1.1.2 = INTEGER: 2 # ifIndex for '2' is literally just '2'
1.3.6.1.2.1.2.2.1.2.2 = STRING: "eth0" # ifDescr
1.3.6.1.2.1.31.1.1.1.1.2 = STRING: "eth0" # IfName
1.3.6.1.2.1.31.1.1.1.10.2 = INTEGER: 1000 # ifHCOutOctets, 1000 bytes
1.3.6.1.2.1.31.1.1.1.18.2 = STRING: "" # ifAlias
snmp_exporter
このすべてのデータを次のように結合します。
ifHCOutOctets{ifAlias="",ifDescr="eth0",ifIndex="2",ifName="eth0"} 1000
snmp_exporter
の単一インスタンスは、数千のデバイスに対して実行できます。
バイナリは Github リリース ページからダウンロードでき、特別なインストールは必要ありません。
サンプルの systemd ユニット ファイルも提供しています。
snmp_exporter
デーモンとして、または CLI から起動します。
./snmp_exporter
http://localhost:9116/snmp?target= 192.0.0.8
にアクセスします。192.0.0.8 は、メトリクスを取得する SNMP デバイスの IP または FQDN です。これは、デフォルトのトランスポート ( udp
)、デフォルトのポート ( 161
)、デフォルトの認証 ( public_v2
)、およびデフォルトのモジュール ( if_mib
) を使用することに注意してください。認証とモジュールはsnmp.yml
ファイルで定義する必要があります。
たとえば、 ddwrt
ウォーキングするためのmy_secure_v3
という名前の認証がある場合、URL は http://localhost:9116/snmp?auth=my_secure_v3&module=ddwrt&target=192.0.0.8 のようになります。
別のトランスポートやポートを構成するには、構文[transport://]host[:port]
使用します。
たとえば、ポート1161
でtcp
使用してデバイスをスクレイピングする場合、URL は http://localhost:9116/snmp?auth=my_secure_v3&module=ddwrt&target=tcp%3A%2F%2F192.0.0.8%3A1161 のようになります。
:
および/
文字があるため、 target
には URL エンコードを使用する必要があることに注意してください。 Prometheus はクエリ パラメーターを自動的にエンコードするため、Prometheus 構成ファイル内で手動でエンコードする必要はありません。
エクスポータ自体の動作に関するメトリクスは、エンドポイント http://localhost:9116/metrics で入手できます。
次のように、URL にオプションのsnmp_context
パラメータを指定できます。 http://localhost:9116/snmp?auth=my_secure_v3&module=ddwrt&target=192.0.0.8&snmp_context=vrf-mgmt URL のsnmp_context
パラメータはcontext_name
をオーバーライドします。 snmp.yml
ファイル内のパラメータ。
マルチモジュール機能を使用すると、複数のモジュールを指定できるため、1 回のスクレイピングで複数のモジュールから情報を取得できます。同時実行性は、snmp-exporter オプション--snmp.module-concurrency
(デフォルトは 1) を使用して指定できます。
注: この実装では、異なるモジュール間のウォークの重複排除は実行されません。
複数のモジュールを指定するには 2 つの方法があります。カンマで区切るか、複数の params_module を定義できます。 URL は次のようになります。
カンマ区切りの場合:
http://localhost:9116/snmp?module=if_mib,arista_sw&target=192.0.0.8
複数の params_module の場合:
http://localhost:9116/snmp?module=if_mib&module=arista_sw&target=192.0.0.8
デフォルトの構成ファイル名はsnmp.yml
であり、手動で編集しないでください。変更する必要がある場合は、構成の生成を参照してください。
デフォルトのsnmp.yml
ファイルは、SNMP v2 GETBULK を使用してハードウェアをウォーキングするさまざまな一般的なハードウェアをカバーしています。
--config.file
パラメーターを複数回使用して、複数のファイルをロードできます。また、 snmp*.yml
などの glob ファイル名のマッチングもサポートします。
--config.expand-environment-variables
パラメーターを使用すると、環境変数を構成ファイルの一部のフィールドに渡すことができます。 auths セクションのusername
、 password
、およびpriv_password
フィールドがサポートされています。デフォルトでは無効になっています。
重複したmodule
またはauth
エントリは無効として扱われ、ロードできません。
URL パラメータのtarget
、 auth
、およびmodule
、ラベルを変更することで制御できます。
設定例:
scrape_configs :
- job_name : ' snmp '
static_configs :
- targets :
- 192.168.1.2 # SNMP device.
- switch.local # SNMP device.
- tcp://192.168.1.3:1161 # SNMP device using TCP transport and custom port.
metrics_path : /snmp
params :
auth : [public_v2]
module : [if_mib]
relabel_configs :
- source_labels : [__address__]
target_label : __param_target
- source_labels : [__param_target]
target_label : instance
- target_label : __address__
replacement : 127.0.0.1:9116 # The SNMP exporter's real hostname:port.
# Global exporter-level metrics
- job_name : ' snmp_exporter '
static_configs :
- targets : ['localhost:9116']
以下の形式で、選択した環境変数を介してusername
、 password
、およびpriv_password
渡すことができます。変数が環境内に存在する場合、その変数はその場で解決されます。それ以外の場合は、構成ファイル内の文字列がそのまま渡されます。
これには、 --config.expand-environment-variables
フラグを設定する必要があります。
auths :
example_with_envs :
community : mysecret
security_level : SomethingReadOnly
username : ${ARISTA_USERNAME}
password : ${ARISTA_PASSWORD}
auth_protocol : SHA256
priv_protocol : AES
priv_password : ${ARISTA_PRIV_PASSWORD}
blackbox_exporter と同様に、 snmp_exporter
いくつかの中央マシン上で実行することを目的としており、「Prometheus プロキシ」のように考えることができます。
SNMP エクスポーターは、TLS と基本認証をサポートします。これにより、さまざまな HTTP エンドポイントをより適切に制御できるようになります。
TLS 認証や基本認証を使用するには、 --web.config.file
パラメーターを使用して構成ファイルを渡す必要があります。ファイルの形式は、exporter-toolkit リポジトリに記載されています。
TLS と基本認証の設定は、すべての HTTP エンドポイント (スクレイピングの場合は /metrics、SNMP デバイスのスクレイピングの場合は /snmp)、および Web UI に影響することに注意してください。
ほとんどのユースケースはデフォルト設定でカバーできるはずです。 MIB から独自の構成を生成する必要がある場合は、ジェネレーターを使用できます。
ウォークするオブジェクトをカスタマイズする必要がある場合、または非パブリック MIB を使用する必要がある場合は、ジェネレーターを使用します。
大きな Counter64 値に正確なカウンターを提供するために、エクスポーターは 2^53 ごとに値を自動的にラップして、64 ビット浮動小数点数の丸めを回避します。 Prometheus はこれを適切に処理し、悪影響に気づくことはありません。
Prometheus 以外のシステムでこの機能を無効にする必要がある場合は、コマンド ライン フラグ--no-snmp.wrap-large-counters
を使用します。
これらすべてを始めるのは不透明かもしれませんが、私たち自身の経験から言えば、SNMP を操作するには snmp_exporter が正直なところ最良の方法です。他の人が簡単にできるように、構成を私たちに提供することを検討してください。 snmp.yml
設定にはジェネレーター設定を伴う必要があります。ダッシュボード、アラート、および記録ルールについては、https://github.com/prometheus/snmp_exporter/tree/main/snmp-mixin に投稿することを検討してください。