rrdtoolによる監視の予測方法





はじめに



最近、私が作成した予測VoIPトランジットモニタリングシステムについて説明しました。 中継VoIPの監視におけるこの方法の最大の利点は、監視対象の値の正常な動作と見なされるものと潜在的な障害となるものの基準を設定する必要がないことです。

システムの中核はrrdtoolであり、 Hort -Winters予測と収差を検出するメカニズムを実装しています。

予測監視は、VoIPだけでなく、他の種類のトラフィック、および予測される一定の周期で時間とともに変化する量にも使用できます。 標準的な方法とは異なり、予測を使用して監視する場合、監視中の値の状態は監視されませんが、状態の経時的な変化のダイナミクスは監視されます。

予測の数学に興味があるなら、それを読むことをお勧めます。 このトピックについて少なくとも少し知っておくには、 以前の投稿の 「rrdtoolで実装された予測メソッド」の章を読んでください。



挑戦する



以前の投稿で書いたように、予測方法を使用して中継VoIPの監視を実装する前に、Cisco AS5400アクセスサーバーで概念を確認し、IPトラフィック、アクティブコールの数、およびプロセッサの負荷を確認することにしました。 これがどのように行われたかを説明します。

この場合、データはSNMPを介して受信するのが最も簡単です。 したがって、テストのために、FastEthernetインターフェイスを通過したIN / OUTオクテットの数、および2つの(SNMPとrrdtoolの観点から)GAUGE値の2つのカウンターでデータを取得する必要があります。 E1。

アクティブなコールの数を確認するには、このOIDを使用します

.1.3.6.1.4.1.9.10.19.1.1.4.0

CPU使用率は、このOIDを読み取ることで検証されます

.1.3.6.1.4.1.9.2.1.58.0

インターフェイスを通過する発信オクテットのカウンタは、 OIDによって利用可能です

.1.3.6.1.2.1.2.2.1.16.1インデックス1のインターフェイスがチェックされている場合。

インターフェイスに着信した着信オクテットのカウンタは、 OIDによって利用可能です

.1.3.6.1.2.1.2.2.1.10.1インデックス1のインターフェイスがチェックされている場合。



解決策



ソリューションはいくつかのタスクに分割されます。 まず、rrdtoolデータベースが正しく形成され、次にデータベースに値を入力するスクリプトが作成され、次にグラフにデータを表示するスクリプトが作成されます。



RRDデータベースの作成


rrdデータベースの形成用に2つのスクリプトを作成します

counter.sh

#!/usr/local/bin/bash rrdtool create --step 300 $1.rrd \ DS:val:COUNTER:600:0:U \ RRA:AVERAGE:0.5:1:8064 \ RRA:HWPREDICT:8064:0.1:0.0035:288 \ RRA:FAILURES:8064:2:3:4
      
      







gauge.sh

 #!/usr/local/bin/bash rrdtool create --step 300 $1.rrd \ DS:val:GAUGE:600:0:U \ RRA:AVERAGE:0.5:1:8064 \ RRA:HWPREDICT:8064:0.1:0.0035:288 \ RRA:FAILURES:8064:2:3:4
      
      







違いは、valの値タイプのみです。

スクリプトの開始時に作成されるものを把握します。

1) RRA:AVERAGE:0.5:1:8064-5分に1回の頻度で8064の測定値を含むデータベース。 5分ごとに1回の測定頻度で、1日あたり288回の測定値が取得され、合計で、データベースに8064/288 = 28日間の情報を保存できます。

2) RRA:HWPREDICT:8064:0.1:0.0035:288-データベースは8064の予測を保存します。つまり、測定値が決定された数だけ保存されます。 係数alpha = 0.1、beta = 0.0035が与えられます。 これらは、予測の精度に影響する係数です。 このようなパラメータは、毎日ほぼ同じ画像がグラフに表示される場合に最適です。 さらに、そのような比率はrrdtool Webサイトで推奨されています。 オッズを変更してより正確な予測を達成することもできますが、これは別の記事のトピックです。 288-季節ごとの測定数。したがって、季節は日数に等しくなります。

3) RRA:失敗:8064:2:3:4。 -データベースには、28日間の計算された異常に関する情報が保存されます(デフォルトでは、昨シーズン-1日のみ保存されます)。 収差は、フローティングウィンドウの長さが3、ウィンドウ内のミス数が2の場合に計算されます。最後のパラメーター-4はDEVSEASONALインデックスです。このインデックスは、rrdtool infoコマンドで表示できます。

データベースの作成について質問がある場合は、 こちらをご覧ください

スクリプトで必要なデータベースを作成します

./counter.sh in_traf

./counter.sh out_traf

./gauge.sh cpu

./gauge.shの呼び出し



データベースに値を入力するスクリプト


実際、スクリプトは簡単です

rrdupdater.sh

 #!/usr/local/bin/bash rrdtool="/usr/local/bin/rrdtool update " # snmpget -OQEav option will make value to be "clean" no quotes, oid name, etc… snmpget="/usr/local/bin/snmpget -OQEav -v2c -c SuperSecret " rrdpath="/usr/rrdmonit/rrd/" ${rrdtool} ${rrdpath}in_traf.rrd N:`${snmpget} 192.168.50.31 .1.3.6.1.2.1.2.2.1.10.1` ${rrdtool} ${rrdpath}out_traf.rrd N:`${snmpget} 192.168.50.31 .1.3.6.1.2.1.2.2.1.16.1` ${rrdtool} ${rrdpath}cpu.rrd N:`${snmpget} 192.168.50.31 .1.3.6.1.4.1.9.2.1.58.0` ${rrdtool} ${rrdpath}calls.rrd N:`${snmpget} 192.168.50.31 .1.3.6.1.4.1.9.10.19.1.1.4.0`
      
      





そしてもちろん、crontabで彼は

* / 5 * * * * /usr/rrdmonit/rrdupdater.sh



グラフ表示


rrdtoolは強力なチャート作成ツールです。 チャートは非常に有益なものにすることができます。

たとえば、当社のVoIPトラフィック監視システムでは、次のとおりです。



青い線は、15分間隔でパートナーに渡された分数の測定値の実際の値です。 灰色の領域-ちょうど1日前の実際の値。 ピンクの線は予報です。 赤と緑の線は、許容値のコリドーの上下の境界線を示しています。 負の値の領域の黒い線は、予測値からの許容偏差の予測(偏差)です。 金色は収差を示します。 異常が発生した場合、システムは潜在的な障害について(電子メール経由で)アラートを発行しました。 明らかに、この場合、トラフィックプロバイダーで障害が発生している可能性が非常に高くなります。

測定値の合計値に注意してください。 エラーは1〜2パーセントで、このプロバイダーの請求から取得した値に等しくなります。 監視システムの場合、これは高精度と見なすことができます。

測定値をプロットする場合、2つの異なるアプローチがあることに注意してください。 最初のアプローチは、従来のMRTGに実装されています。グラフ(図)は、rrdtoolデータベースに新しい値を入力した直後に作成されます。 2番目のアプローチはcactiで実装されています-グラフはユーザーの要求に基づいて作成されます。 VoIP監視システムは2番目のアプローチを使用します。 ただし、コンセプトをテストするには、最初のアプローチを使用できます。これははるかに簡単です。 データベースがいっぱいになるとすぐに写真が生成されます。

実際のスクリプト:

 #!/usr/bin/env python import os import time import rrdtool # Define params rrdpath = '/usr/rrdmonit/rrd/' pngpath = '/usr/local/share/cacti/rrdmonit/' width = '500' height = '200' # Generate charts for last 48 hours enddate = int(time.mktime(time.localtime())) begdate = enddate - 172800 def gen_image(rrdpath, pngpath, fname, width, height, begdate, enddate): """ Generates png file from rrd database: rrdpath - the path where rrd is located pngpath - the path png file should be created in fname - rrd file name, png file will have the same name .png extention width - chart area width height - chart area height begdate - unixtime enddate - unixtime """ # 24 hours before current time, will show on chart using SHIFT option ldaybeg = str(begdate - 86400) ldayend = str(enddate - 86400) # Will show some additional info on chart endd_str = time.strftime("%d/%m/%Y %H:%M:%S",(time.localtime(int(enddate)))).replace(':','\:') begd_str = time.strftime("%d/%m/%Y %H:%M:%S",(time.localtime(int(begdate)))).replace(':','\:') title = 'Chart for: '+fname.split('.')[0] # Files names pngfname = pngpath+fname.split('.')[0]+'.png' rrdfname = rrdpath+fname # Get iformation from rrd file info = rrdtool.info(rrdfname) rrdtype = info['ds[val].type'] # Will use multip variable for calculation of totals, # should be usefull for internet traffic accounting, # or call/minutes count from CDR's. # Do not need logic for DERIVE and ABSOLUTE if rrdtype == 'COUNTER': multip = str(int(enddate) - int(begdate)) else: # if value type is GAUGE should divide time to step value rrdstep = info['step'] multip = str(round((int(enddate) - int(begdate))/int(rrdstep))) # Make png image rrdtool.graph(pngfname, '--width',width,'--height',height, '--start',str(begdate),'--end',str(enddate),'--title='+title, '--lower-limit','0', '--slope-mode', 'COMMENT:From\:'+begd_str+' To\:'+endd_str+'\\c', 'DEF:value='+rrdfname+':val:AVERAGE', 'DEF:pred='+rrdfname+':val:HWPREDICT', 'DEF:dev='+rrdfname+':val:DEVPREDICT', 'DEF:fail='+rrdfname+':val:FAILURES', 'DEF:yvalue='+rrdfname+':val:AVERAGE:start='+ldaybeg+':end='+ldayend, 'SHIFT:yvalue:86400', 'CDEF:upper=pred,dev,2,*,+', 'CDEF:lower=pred,dev,2,*,-', 'CDEF:ndev=dev,-1,*', 'CDEF:tot=value,'+multip+',*', 'CDEF:ytot=yvalue,'+multip+',*', 'TICK:fail#FDD017:1.0:"Failures"\\n', 'AREA:yvalue#C0C0C0:"Yesterday\:"', 'GPRINT:ytot:AVERAGE:"Total\:%8.0lf"', 'GPRINT:yvalue:MAX:"Max\:%8.0lf"', 'GPRINT:yvalue:AVERAGE:"Average\:%8.0lf" \\n', 'LINE3:value#0000ff:"Value \:"', 'GPRINT:tot:AVERAGE:"Total\:%8.0lf"', 'GPRINT:value:MAX:"Max\:%8.0lf"', 'GPRINT:value:AVERAGE:"Average\:%8.0lf" \\n', 'LINE1:upper#ff0000:"Upper Bound "', 'LINE1:pred#ff00FF:"Forecast "', 'LINE1:ndev#000000:"Deviation "', 'LINE1:lower#00FF00:"Lower Bound "') # List files and generate charts for fname in os.listdir(rrdpath): gen_image(rrdpath, pngpath, fname, width, height, begdate, enddate)
      
      







rrdtoolに値を入力した直後にスクリプトの実行を開始する必要があるため、スクリプトを実行する行をスクリプト/usr/rrdmonit/rrdupdater.shの最後に追加する必要があります。

残っているのは、生成された図面をWebのどこかに投稿することだけです。 たとえば、PHPのこのようなスクリプト。

 <?php $dir = './rrdmonit/'; $dirHandle = opendir($dir); while ($file = readdir($dirHandle)) { if(!is_dir($file) && strpos($file, '.png')>0) { print "<img src='.$dir".$file."' />\n"; } } closedir($dirHandle); ?>
      
      





このような監視を最初に設定したとき、自分が間違っていることを理解するために多くの時間を費やしたことを覚えています。 実際、予測をどのように設定しても、さまざまな方法でグラフを作成しようとしても、予測線は永続的に表示されませんでした。 喫煙マニュアルを数時間殺してしまったので、私は翌日、それに戻って吐き出しました。 翌日-見よ、予想はそれだけで現れた。 すべてが些細なものであることが判明したため、最初の予測シーズンが過ぎなかったため(データベースへのデータ入力が開始された日後)、予測は行われませんでした。

前に書いたように、測定値の値の予測とともに、可能な値の広がりの回廊も予測されます。 分裂は、2つの季節の値がある場合にのみ予測できます。

そのため、3日目の初めからのみ予備的な結果を受け取ります。



グラフ上-測定開始から最初の3日間。 予測曲線を見ることができます。 しかし、次に何が起こるか見てください。



予測はより正確です。 1週間で、関心のある量を完全に機能的に監視できます。

提示されたグラフの値は、正弦波に類似した法則に従って日中に動作します。 この方法がそのような量でのみ機能すると感じてほしくありません。 たとえば、中継VoIPのASR値とACD値の動作は多少異なりますが、この方法にも関わらず、この方法はうまく機能します。 写真を見てください





おわりに



監視システムは、管理者が図面をじっと見つめるために行われるだけでなく、異常が検出された場合に(少なくともメールで)警告を発する必要があります。 それについて-次の投稿で。



All Articles