Juniper RPMとZabbixを介して通信チャネルを監視

この記事を読んで、「 ジュニパーSRXでの自動ルートスイッチング」という記事を書くようになりました。







RPMを使用するトピックを少し広げたいと思いました。 このテクノロジーは、シスコの世界におけるSLAメカニズムの類似物であり、シスコと同様に、チャネルの切り替えを目的としたものではなく、チャネルの特性をリアルタイムで測定することを目的としています。 そして、私の記事の目的は、これらの測定結果をZabbix監視システムに転送する方法を示すことです。 この情報が誰かに役立つことを願っています。 行こう







Juniper RPMの簡単な紹介



ジュニパーRPMは、リアルタイムパフォーマンス監視の略です。 RPMは次のように機能します。













チャネルの一方の側のデバイス(クライアント)は、チャネルの他方の側のデバイス(サーバー)に一連の要求を定期的に送信し、応答を受信(または受信しない)して結果を保存します







リクエストには次の種類があります。









最初の2種類のリクエストは、明らかにチャネルの品質に完全に関連しているのではなく、Webサービスの可用性と迅速さに関連しています。







最後の4つの要求は拡張され、サーバーの役割を持つデバイスからのRPMサポートが必要です。 ハードウェアでRPMをサポートすることに加えて、これらのテストには拡張ライセンスも必要です。 私の場合、クライアントロールとサーバーロールの両方で、基本ライセンスでex2200スイッチを使用しますが、高度なテストにサーバーRPMロールを使用することはできません。







したがって、この記事では、ICMPエコー要求などの要求に限定します。 さらに、これははるかに普遍的なシナリオです。 サーバーの役割は、pingに応答できる任意のネットワークデバイスによって実行できます。







私のテストスキームは次のとおりです。













2つの通信事業者のオフィス間に2つのL2チャネルがあります。 デバイスを両方のチャネルの側面に接続します。 ここでは、上の図のように、クライアントの役割を持つデバイスが左側にあります。 原則として、両側で1台のデバイスを使用するだけで十分でしたが、テストが組織された頃には、ex-isp1およびex-isp2デバイスがネットワークのこの部分ですでに使用されていました。 もちろん、それらはスイッチとして使用されました。







実際にはすべてのスキームで。 RPM構成に移りましょう。 ex2200-rpmデバイスで、次の構成を記述します。







iddqd@ex2200-rpm> show configuration services rpm probe Gee { test Jitter { probe-type icmp-ping-timestamp; target address 2.2.2.2; probe-count 15; probe-interval 1; test-interval 15; source-address 2.2.2.1; data-size 1400; thresholds { successive-loss 2; } hardware-timestamp; } } probe BARS { test Jitter { probe-type icmp-ping-timestamp; target address 1.1.1.2; probe-count 15; probe-interval 1; test-interval 15; source-address 1.1.1.1; data-size 1400; thresholds { successive-loss 2; } hardware-timestamp; } }
      
      





彼らが言うように、設定は自明であり、特別な説明を必要としません。







コミットして終了し、すぐにテスト結果を収集できます







iddqd @ ex2200-rpm#サービスrpmプローブ結果を表示
 Owner: Gee, Test: Jitter Target address: 2.2.2.2, Source address: 2.2.2.1, Probe type: icmp-ping-timestamp, Test size: 15 probes Probe results: Response received, Fri Apr 28 10:38:11 2017, Client and server hardware timestamps Rtt: 4908 usec, Round trip jitter: -232 usec, Round trip interarrival jitter: 1257 usec Results over current test: Probes sent: 7, Probes received: 7, Loss percentage: 0.000000 Measurement: Round trip time Samples: 7, Minimum: 1921 usec, Maximum: 5243 usec, Average: 3355 usec, Peak to peak: 3322 usec, Stddev: 1514 usec, Sum: 23486 usec Measurement: Positive round trip jitter Samples: 3, Minimum: 262 usec, Maximum: 3322 usec, Average: 2179 usec, Peak to peak: 3060 usec, Stddev: 1364 usec, Sum: 6536 usec Measurement: Negative round trip jitter Samples: 4, Minimum: 232 usec, Maximum: 3179 usec, Average: 1682 usec, Peak to peak: 2947 usec, Stddev: 1448 usec, Sum: 6728 usec Results over last test: Probes sent: 15, Probes received: 15, Loss percentage: 0.000000 Test completed on Fri Apr 28 10:37:50 2017 Measurement: Round trip time Samples: 15, Minimum: 1882 usec, Maximum: 5099 usec, Average: 2502 usec, Peak to peak: 3217 usec, Stddev: 864 usec, Sum: 37535 usec Measurement: Positive round trip jitter Samples: 7, Minimum: 39 usec, Maximum: 3175 usec, Average: 1000 usec, Peak to peak: 3136 usec, Stddev: 979 usec, Sum: 7000 usec Measurement: Negative round trip jitter Samples: 8, Minimum: 26 usec, Maximum: 1444 usec, Average: 476 usec, Peak to peak: 1418 usec, Stddev: 494 usec, Sum: 3809 usec Results over all tests: Probes sent: 124282, Probes received: 124282, Loss percentage: 0.000000 Measurement: Round trip time Samples: 124282, Minimum: 1548 usec, Maximum: 208183 usec, Average: 2964 usec, Peak to peak: 206635 usec, Stddev: 2148 usec, Sum: 368337928 usec Measurement: Ingress delay Samples: 101, Minimum: 1000 usec, Maximum: 6000 usec, Average: 2030 usec, Peak to peak: 5000 usec, Stddev: 1438 usec, Sum: 205000 usec Measurement: Egress delay Samples: 77, Minimum: 1000 usec, Maximum: 6000 usec, Average: 1883 usec, Peak to peak: 5000 usec, Stddev: 980 usec, Sum: 145000 usec Measurement: Positive round trip jitter Samples: 62713, Minimum: 0 usec, Maximum: 205349 usec, Average: 1152 usec, Peak to peak: 205349 usec, Stddev: 1866 usec, Sum: 72214061 usec Measurement: Negative round trip jitter Samples: 61568, Minimum: 1 usec, Maximum: 174369 usec, Average: 1173 usec, Peak to peak: 174368 usec, Stddev: 1645 usec, Sum: 72211519 usec Owner: BARS, Test: Jitter Target address: 1.1.1.2, Source address: 1.1.1.1, Probe type: icmp-ping-timestamp, Test size: 15 probes Probe results: Response received, Fri Apr 28 10:38:08 2017, Client and server hardware timestamps Rtt: 2695 usec, Round trip jitter: -109 usec, Round trip interarrival jitter: 1178 usec Results over current test: Probes sent: 15, Probes received: 15, Loss percentage: 0.000000 Measurement: Round trip time Samples: 15, Minimum: 1654 usec, Maximum: 5020 usec, Average: 2630 usec, Peak to peak: 3366 usec, Stddev: 1105 usec, Sum: 39452 usec Measurement: Positive round trip jitter Samples: 6, Minimum: 20 usec, Maximum: 3079 usec, Average: 1504 usec, Peak to peak: 3059 usec, Stddev: 918 usec, Sum: 9021 usec Measurement: Negative round trip jitter Samples: 9, Minimum: 23 usec, Maximum: 3143 usec, Average: 1186 usec, Peak to peak: 3120 usec, Stddev: 1235 usec, Sum: 10671 usec Results over last test: Probes sent: 15, Probes received: 15, Loss percentage: 0.000000 Test completed on Fri Apr 28 10:38:08 2017 Measurement: Round trip time Samples: 15, Minimum: 1654 usec, Maximum: 5020 usec, Average: 2630 usec, Peak to peak: 3366 usec, Stddev: 1105 usec, Sum: 39452 usec Measurement: Positive round trip jitter Samples: 6, Minimum: 20 usec, Maximum: 3079 usec, Average: 1504 usec, Peak to peak: 3059 usec, Stddev: 918 usec, Sum: 9021 usec Measurement: Negative round trip jitter Samples: 9, Minimum: 23 usec, Maximum: 3143 usec, Average: 1186 usec, Peak to peak: 3120 usec, Stddev: 1235 usec, Sum: 10671 usec Results over all tests: Probes sent: 82380, Probes received: 7769, Loss percentage: 90.569313 Measurement: Round trip time Samples: 7769, Minimum: 1483 usec, Maximum: 10135 usec, Average: 2589 usec, Peak to peak: 8652 usec, Stddev: 1147 usec, Sum: 20110188 usec Measurement: Ingress delay Samples: 3, Minimum: 3000 usec, Maximum: 3000 usec, Average: 3000 usec, Peak to peak: 0 usec, Stddev: 0 usec, Sum: 9000 usec Measurement: Egress delay Samples: 8, Minimum: 1000 usec, Maximum: 4000 usec, Average: 1750 usec, Peak to peak: 3000 usec, Stddev: 1090 usec, Sum: 14000 usec Measurement: Positive round trip jitter Samples: 3936, Minimum: 0 usec, Maximum: 8426 usec, Average: 1048 usec, Peak to peak: 8426 usec, Stddev: 1091 usec, Sum: 4125122 usec Measurement: Negative round trip jitter Samples: 3832, Minimum: 1 usec, Maximum: 8409 usec, Average: 1076 usec, Peak to peak: 8408 usec, Stddev: 1123 usec, Sum: 4124713 usec
      
      





RPMについては以上です。 先に進みます。 そして、トピックの開示については、ジュニパーからの詳細なガイドに送信します







RPMテストを監視するためのZabbixの構成



残念ながら、 JunOSの RPMオブジェクトのMIBは、最も便利な方法で構築されていません。

ZabbixのビルトインSNMP LLD Discovery機能はRPMテストを自動検出するには不十分です







Zabbixは、 自動検出にsnmpwalkメソッドを使用します。 SNMPインデックスとその値が戻りパラメーターとして使用される場所







たとえば、 ifDescrオブジェクトを検索する場合







$ snmpwalk -v 2c -c public 192.168.1.1 IF-MIB :: ifDescr

IF-MIB :: ifDescr。4 =ストリング:WAN

IF-MIB :: ifDescr。7 =ストリング:LAN1

IF-MIB :: ifDescr.11 =ストリング:LAN2

Zabbixの検出方法は、 4,7,11インデックスとその値WAN、LAN1LAN2 検出します







しかし、 RPMテストを検出するために、 ジュニパーはそのような便利なオブジェクトを提供しませんでした。

私が検出できた最も適切なオブジェクトはjnxRpmResSampleValueオブジェクトです







そして、これはこのオブジェクトによって返されるテーブルがどのように見えるかです:







 iddqd@ex2200-rpm> show snmp mib walk jnxRpmResSampleValue jnxRpmResSampleValue.3.71.101.101.6.74.105.116.116.101.114.1 = 1989 jnxRpmResSampleValue.3.71.101.101.6.74.105.116.116.101.114.2 = -424 jnxRpmResSampleValue.3.71.101.101.6.74.105.116.116.101.114.3 = 810 jnxRpmResSampleValue.4.66.65.82.83.6.74.105.116.116.101.114.1 = 3352 jnxRpmResSampleValue.4.66.65.82.83.6.74.105.116.116.101.114.2 = 1612 jnxRpmResSampleValue.4.66.65.82.83.6.74.105.116.116.101.114.3 = 971
      
      





この数字とドットのハッシュの意味を理解しましょう。

jnxRpmResSampleValueは、ウォークスルーするMIBオブジェクトです

一連の数字.3.66.101.101.6.74.105.116.116.101.114はテストの名前です







証拠

これは、asciiパラメーターを指定して前のコマンドを実行することで簡単に確認できます







 iddqd@ex2200-rpm> show snmp mib walk jnxRpmResSampleValue ascii jnxRpmResSampleValue."Gee"."Jitter".1 = 1989 jnxRpmResSampleValue."Gee"."Jitter".2 = -424 jnxRpmResSampleValue."Gee"."Jitter".3 = 810 jnxRpmResSampleValue."BARS"."Jitter".1 = 3352 jnxRpmResSampleValue."BARS"."Jitter".2 = 1612 jnxRpmResSampleValue."BARS"."Jitter".3 = 971
      
      





さて、 SNMPインデックス (ポイントの後の最後の番号)は、テストパラメーターのシリアル番号です。

.1-RTT

.2-往復ジッター

.3-往復の到着間ジッター







RPMテストの結果を見て、snmpwalkによって返された数値と比較することでも簡単にわかります。
 iddqd@ex2200-rpm> show services rpm probe-results | match RTT Rtt: 1989 usec, Round trip jitter: -424 usec, Round trip interarrival jitter: 810 usec Rtt: 3352 usec, Round trip jitter: 1612 usec, Round trip interarrival jitter: 971 usec
      
      





ちなみに、 jnxRpmResSampleValue、jnxRpmResultsSampleTable、jnxRpmHistorySummaryTableなどのJunOS上のMIBオブジェクトのOID (デジタル値)を見つける

その他の場合は、次のコマンドを実行できます。







snmp mib walk jnxRpmResSampleValueを示して下さい| jsonを表示する


自動検出スクリプト



そのため、 Zabbixは外部からの支援なしではRPMテストを検出できません。

そのため、このようなヘルプを外部スクリプトの形式で提供します。

スクリプトはPython 2.7で書かれており、非常にコンパクトです。







スクリプト* zbx_junper_rpm_discovery.py *
 #!/usr/bin/python import sys from pysnmp.hlapi import * import json def findsubstrings(s): la = s.split('.') lb = la[1:] if '6' in lb: # looking for a delimiter. 6 for EX or 10 for SRX i = lb.index('6') elif '10' in lb: i = lb.index('10') else: sys.stderr.write("delimiter nor 6 ot 10") exit(0) l1 = lb[:i] l2 = lb[i+1:] param2 = ''.join([chr(int(i)) for i in l1]) param3 = ''.join([chr(int(i)) for i in l2]) return param2, param3 eRR = '{ data: ["Error parsing arguments"]}\n' if len(sys.argv)!=3: sys.stderr.write(eRR) exit() hostname = sys.argv[1] community=sys.argv[2] jnxRpmResSumSent = "1.3.6.1.4.1.2636.3.50.1.2.1.2" l = [] # init snmpwalk over jnxRpmResSumSent MIB Object varBind = nextCmd(SnmpEngine(), CommunityData(community), UdpTransportTarget((hostname, 161)), ContextData(), ObjectType(ObjectIdentity(jnxRpmResSumSent)), lexicographicMode=False) # do snmmpwalk and collect an rpm specific substring for res in varBind: s = str(res[3][0][0])[len(jnxRpmResSumSent)+1:-2] l.append(s) # lets make values inside the list l uniq u = set(l) jsonData=[] for param1 in u: d={} param2, param3 = findsubstrings(param1) d["{#RPMUUID}"] = param1 d["{#RPMOWNER}"] = param2 d["{#RPMTEST}"] = param3 jsonData.append(d) print (json.dumps({"data": jsonData}, indent=4))
      
      





1つの外部ライブラリのみを使用-pysnmp

ライブラリは人気があり、ほとんどのディストリビューションに存在します







Ubuntuでは、コマンドでそれを置くことができます: apt install python-pysnmp4

または、次のコマンドを使用したPIPマネージャーを介した任意の配布: pip install pysnmp







2つのパラメーターホスト名コミュニティがスクリプト入力に送信されます

JSONはこの形式で返されます







 { "data": [ { "{#RPMTEST}": "Jitter", "{#RPMUUID}": "4.66.65.82.83.6.74.105.116.116.101.114", "{#RPMOWNER}": "BARS" }, { "{#RPMTEST}": "Jitter", "{#RPMUUID}": "3.71.101.101.6.74.105.116.116.101.114", "{#RPMOWNER}": "Gee" } ] }
      
      





カスタムマクロ{#RPMUUID}{#RPMOWNER}および{#RPMTEST}は 、要素名、それらのキー、トリガー、さらにはグラフでさらに使用されます







スクリプトはchmod + xにして、外部Zabbixスクリプトのディレクトリに配置する必要があります

私の場合、これはディレクトリです: / etc / zabbix / etc / externalscripts







模様



さらに、 Zabbixの設定方法については説明しません。 作業用テンプレートを共有するだけです(下のリンク)。 テンプレートには、スクリプトを使用して検出するRPMテストごとに、 RTT、Jitter 、およびPacketLossの 3つの要素が含まれます。

テストのRPMタイプにジッタ測定が含まれない場合、このパラメータは監視から自動的に除外されます







より高度なテストの場合、テンプレートは必要に応じてファイナライズできます。 この場合、スクリプトは変更を必要としません







3つの要素すべてがスケーリングされ、1つのグラフに表示されます。このグラフも自動的に作成されます。







まとめ



RPMテストを実行した状態でテンプレートをJuniperデバイスにプルすると、しばらくするとデータ項目にそのような画像が表示されます







そして、チャートは次のようになります。







以上です。 スクリプトとテンプレートはgitHubに投稿されています 。 必要に応じて、制限なしで変更、分岐などを行うことができます








All Articles