気象監視またはCacti HowTo

この投稿はさまざまな方法で開始できます。 ケースでは、システムエラーを検索するために監視システムがどのように必要であり、ボトルネックの検出にどのように役立つかが考えられます。 しかし、今は夏であり、アウトドアレクリエーションの時期です。まず、人気のある監視ツールCactiを使用して、天気予報がどのくらいの頻度で変化するかを調べることにしました。 好奇心reader盛な読者のカットシーンの下で、あなたはCactiで任意のデータの監視を設定する方法についての物語を待っていますが、それだけでなく、写真もあります。


それで、6月19日の1週間前(金曜日、わかります...)私は見始めました、天気はどうなるでしょうか? 私はYandexでそれを見ました-私はこれらのウェブベースのウェザーシャワーが大好きです。 天気は日々変化し、私は疑問に思っていました-これらの変化の頻度は何ですか? 天気の感覚は主観的なものであり、サイト上の予報の変化の頻度は非常に測定可能です。 これらの目的のために、私は有名な監視ツールCactiを使用することにしました。 この記事は主にプログラマーとシステム管理者を対象としているため、Cactiのインストール方法については考慮していません。これらのユーザーは既にインストール済みであるか、5分で管理できます。
天気予報で天気がどれくらいの頻度で変化するか知りたいが、Cactiが面白くない場合は、最後までスキップしてください。

サボテン哲学



Cactiの中心にあるのは、 RRDToolです。これは、循環データベース( RRD-ラウンドロビンデータベース)を操作するためのツールです。 そのようなデータベースは、間隔で構成される時間座標を考慮し、そのような間隔のノードに保存されたパラメータの値を記録し、必要に応じて測定値を補間します。 1つのデータベースに複数のRRA(ラウンドロビンアーカイブ)が存在する可能性があります-これにより、異なる時間間隔で(つまり、異なる詳細で)値を保存できます。 Cactiはこれらすべての操作をユーザーから隠します-値の監視を設定する必要があるのは、この値を取得し、Cactiにポーラー(データコレクター-すべてのソースからデータを取得して同じRRDに保存するように指示する手段を提供することだけです)

そもそも、Cactiにある「エンティティ」に関するいくつかの言葉。 これらは、管理パネルの左側のメニューにリストされています。
だから:


天気マイニングスクリプト


特定の時刻の予報を見つけるには、Yandex天気ページをダウンロードして解析する必要があります。 興味のある日が事前にわからないので、入力として日付を受け入れ、その日の昼間の温度を出力するスクリプトを作成します。 5分ごとにYandexに連絡しないでください。天気がそれほど頻繁に変わる可能性は低いため、スクリプトでデータをキャッシュします。 ここでは特に詳しく説明しませんが、スクリプトコードを示します。
  1. #!/bin/bash cd / usr / share / cacti flagdate =$ ( date "+%Y-%m-%d %H:00" ) flagfile =yandex.flag touch $flagfile -d " $flagdate " if [ ! -e index.html -o index.html -ot $flagfile ] ; then wget http: // weather.yandex.ru / 27612 / -O index.html > / dev / null 2 >& 1 fi day =$ 1 pos =$ ( cat index.html | grep "<th class= \" weekday \" >" -A1 | grep -o "<th class= \" week[^0-9]*[0-9]*[^0-9]*</th>" | grep -o "[0-9]*" | grep $day -n | grep -o "^[0-9]" ) let pos =pos+ 1 res =$ ( cat index.html | grep "<tr class= \" data day \" >" -A1 | grep -o "+[0-9]*" | sed -n " $pos " "p" ) echo $res | grep -o "[0-9]*"
  2. #!/bin/bash cd / usr / share / cacti flagdate =$ ( date "+%Y-%m-%d %H:00" ) flagfile =yandex.flag touch $flagfile -d " $flagdate " if [ ! -e index.html -o index.html -ot $flagfile ] ; then wget http: // weather.yandex.ru / 27612 / -O index.html > / dev / null 2 >& 1 fi day =$ 1 pos =$ ( cat index.html | grep "<th class= \" weekday \" >" -A1 | grep -o "<th class= \" week[^0-9]*[0-9]*[^0-9]*</th>" | grep -o "[0-9]*" | grep $day -n | grep -o "^[0-9]" ) let pos =pos+ 1 res =$ ( cat index.html | grep "<tr class= \" data day \" >" -A1 | grep -o "+[0-9]*" | sed -n " $pos " "p" ) echo $res | grep -o "[0-9]*"
  3. #!/bin/bash cd / usr / share / cacti flagdate =$ ( date "+%Y-%m-%d %H:00" ) flagfile =yandex.flag touch $flagfile -d " $flagdate " if [ ! -e index.html -o index.html -ot $flagfile ] ; then wget http: // weather.yandex.ru / 27612 / -O index.html > / dev / null 2 >& 1 fi day =$ 1 pos =$ ( cat index.html | grep "<th class= \" weekday \" >" -A1 | grep -o "<th class= \" week[^0-9]*[0-9]*[^0-9]*</th>" | grep -o "[0-9]*" | grep $day -n | grep -o "^[0-9]" ) let pos =pos+ 1 res =$ ( cat index.html | grep "<tr class= \" data day \" >" -A1 | grep -o "+[0-9]*" | sed -n " $pos " "p" ) echo $res | grep -o "[0-9]*"
  4. #!/bin/bash cd / usr / share / cacti flagdate =$ ( date "+%Y-%m-%d %H:00" ) flagfile =yandex.flag touch $flagfile -d " $flagdate " if [ ! -e index.html -o index.html -ot $flagfile ] ; then wget http: // weather.yandex.ru / 27612 / -O index.html > / dev / null 2 >& 1 fi day =$ 1 pos =$ ( cat index.html | grep "<th class= \" weekday \" >" -A1 | grep -o "<th class= \" week[^0-9]*[0-9]*[^0-9]*</th>" | grep -o "[0-9]*" | grep $day -n | grep -o "^[0-9]" ) let pos =pos+ 1 res =$ ( cat index.html | grep "<tr class= \" data day \" >" -A1 | grep -o "+[0-9]*" | sed -n " $pos " "p" ) echo $res | grep -o "[0-9]*"
  5. #!/bin/bash cd / usr / share / cacti flagdate =$ ( date "+%Y-%m-%d %H:00" ) flagfile =yandex.flag touch $flagfile -d " $flagdate " if [ ! -e index.html -o index.html -ot $flagfile ] ; then wget http: // weather.yandex.ru / 27612 / -O index.html > / dev / null 2 >& 1 fi day =$ 1 pos =$ ( cat index.html | grep "<th class= \" weekday \" >" -A1 | grep -o "<th class= \" week[^0-9]*[0-9]*[^0-9]*</th>" | grep -o "[0-9]*" | grep $day -n | grep -o "^[0-9]" ) let pos =pos+ 1 res =$ ( cat index.html | grep "<tr class= \" data day \" >" -A1 | grep -o "+[0-9]*" | sed -n " $pos " "p" ) echo $res | grep -o "[0-9]*"
  6. #!/bin/bash cd / usr / share / cacti flagdate =$ ( date "+%Y-%m-%d %H:00" ) flagfile =yandex.flag touch $flagfile -d " $flagdate " if [ ! -e index.html -o index.html -ot $flagfile ] ; then wget http: // weather.yandex.ru / 27612 / -O index.html > / dev / null 2 >& 1 fi day =$ 1 pos =$ ( cat index.html | grep "<th class= \" weekday \" >" -A1 | grep -o "<th class= \" week[^0-9]*[0-9]*[^0-9]*</th>" | grep -o "[0-9]*" | grep $day -n | grep -o "^[0-9]" ) let pos =pos+ 1 res =$ ( cat index.html | grep "<tr class= \" data day \" >" -A1 | grep -o "+[0-9]*" | sed -n " $pos " "p" ) echo $res | grep -o "[0-9]*"
  7. #!/bin/bash cd / usr / share / cacti flagdate =$ ( date "+%Y-%m-%d %H:00" ) flagfile =yandex.flag touch $flagfile -d " $flagdate " if [ ! -e index.html -o index.html -ot $flagfile ] ; then wget http: // weather.yandex.ru / 27612 / -O index.html > / dev / null 2 >& 1 fi day =$ 1 pos =$ ( cat index.html | grep "<th class= \" weekday \" >" -A1 | grep -o "<th class= \" week[^0-9]*[0-9]*[^0-9]*</th>" | grep -o "[0-9]*" | grep $day -n | grep -o "^[0-9]" ) let pos =pos+ 1 res =$ ( cat index.html | grep "<tr class= \" data day \" >" -A1 | grep -o "+[0-9]*" | sed -n " $pos " "p" ) echo $res | grep -o "[0-9]*"
  8. #!/bin/bash cd / usr / share / cacti flagdate =$ ( date "+%Y-%m-%d %H:00" ) flagfile =yandex.flag touch $flagfile -d " $flagdate " if [ ! -e index.html -o index.html -ot $flagfile ] ; then wget http: // weather.yandex.ru / 27612 / -O index.html > / dev / null 2 >& 1 fi day =$ 1 pos =$ ( cat index.html | grep "<th class= \" weekday \" >" -A1 | grep -o "<th class= \" week[^0-9]*[0-9]*[^0-9]*</th>" | grep -o "[0-9]*" | grep $day -n | grep -o "^[0-9]" ) let pos =pos+ 1 res =$ ( cat index.html | grep "<tr class= \" data day \" >" -A1 | grep -o "+[0-9]*" | sed -n " $pos " "p" ) echo $res | grep -o "[0-9]*"
  9. #!/bin/bash cd / usr / share / cacti flagdate =$ ( date "+%Y-%m-%d %H:00" ) flagfile =yandex.flag touch $flagfile -d " $flagdate " if [ ! -e index.html -o index.html -ot $flagfile ] ; then wget http: // weather.yandex.ru / 27612 / -O index.html > / dev / null 2 >& 1 fi day =$ 1 pos =$ ( cat index.html | grep "<th class= \" weekday \" >" -A1 | grep -o "<th class= \" week[^0-9]*[0-9]*[^0-9]*</th>" | grep -o "[0-9]*" | grep $day -n | grep -o "^[0-9]" ) let pos =pos+ 1 res =$ ( cat index.html | grep "<tr class= \" data day \" >" -A1 | grep -o "+[0-9]*" | sed -n " $pos " "p" ) echo $res | grep -o "[0-9]*"
  10. #!/bin/bash cd / usr / share / cacti flagdate =$ ( date "+%Y-%m-%d %H:00" ) flagfile =yandex.flag touch $flagfile -d " $flagdate " if [ ! -e index.html -o index.html -ot $flagfile ] ; then wget http: // weather.yandex.ru / 27612 / -O index.html > / dev / null 2 >& 1 fi day =$ 1 pos =$ ( cat index.html | grep "<th class= \" weekday \" >" -A1 | grep -o "<th class= \" week[^0-9]*[0-9]*[^0-9]*</th>" | grep -o "[0-9]*" | grep $day -n | grep -o "^[0-9]" ) let pos =pos+ 1 res =$ ( cat index.html | grep "<tr class= \" data day \" >" -A1 | grep -o "+[0-9]*" | sed -n " $pos " "p" ) echo $res | grep -o "[0-9]*"
  11. #!/bin/bash cd / usr / share / cacti flagdate =$ ( date "+%Y-%m-%d %H:00" ) flagfile =yandex.flag touch $flagfile -d " $flagdate " if [ ! -e index.html -o index.html -ot $flagfile ] ; then wget http: // weather.yandex.ru / 27612 / -O index.html > / dev / null 2 >& 1 fi day =$ 1 pos =$ ( cat index.html | grep "<th class= \" weekday \" >" -A1 | grep -o "<th class= \" week[^0-9]*[0-9]*[^0-9]*</th>" | grep -o "[0-9]*" | grep $day -n | grep -o "^[0-9]" ) let pos =pos+ 1 res =$ ( cat index.html | grep "<tr class= \" data day \" >" -A1 | grep -o "+[0-9]*" | sed -n " $pos " "p" ) echo $res | grep -o "[0-9]*"
  12. #!/bin/bash cd / usr / share / cacti flagdate =$ ( date "+%Y-%m-%d %H:00" ) flagfile =yandex.flag touch $flagfile -d " $flagdate " if [ ! -e index.html -o index.html -ot $flagfile ] ; then wget http: // weather.yandex.ru / 27612 / -O index.html > / dev / null 2 >& 1 fi day =$ 1 pos =$ ( cat index.html | grep "<th class= \" weekday \" >" -A1 | grep -o "<th class= \" week[^0-9]*[0-9]*[^0-9]*</th>" | grep -o "[0-9]*" | grep $day -n | grep -o "^[0-9]" ) let pos =pos+ 1 res =$ ( cat index.html | grep "<tr class= \" data day \" >" -A1 | grep -o "+[0-9]*" | sed -n " $pos " "p" ) echo $res | grep -o "[0-9]*"
  13. #!/bin/bash cd / usr / share / cacti flagdate =$ ( date "+%Y-%m-%d %H:00" ) flagfile =yandex.flag touch $flagfile -d " $flagdate " if [ ! -e index.html -o index.html -ot $flagfile ] ; then wget http: // weather.yandex.ru / 27612 / -O index.html > / dev / null 2 >& 1 fi day =$ 1 pos =$ ( cat index.html | grep "<th class= \" weekday \" >" -A1 | grep -o "<th class= \" week[^0-9]*[0-9]*[^0-9]*</th>" | grep -o "[0-9]*" | grep $day -n | grep -o "^[0-9]" ) let pos =pos+ 1 res =$ ( cat index.html | grep "<tr class= \" data day \" >" -A1 | grep -o "+[0-9]*" | sed -n " $pos " "p" ) echo $res | grep -o "[0-9]*"
#!/bin/bash cd / usr / share / cacti flagdate =$ ( date "+%Y-%m-%d %H:00" ) flagfile =yandex.flag touch $flagfile -d " $flagdate " if [ ! -e index.html -o index.html -ot $flagfile ] ; then wget http: // weather.yandex.ru / 27612 / -O index.html > / dev / null 2 >& 1 fi day =$ 1 pos =$ ( cat index.html | grep "<th class= \" weekday \" >" -A1 | grep -o "<th class= \" week[^0-9]*[0-9]*[^0-9]*</th>" | grep -o "[0-9]*" | grep $day -n | grep -o "^[0-9]" ) let pos =pos+ 1 res =$ ( cat index.html | grep "<tr class= \" data day \" >" -A1 | grep -o "+[0-9]*" | sed -n " $pos " "p" ) echo $res | grep -o "[0-9]*"

データ入力方法


スクリプトの準備ができたので、どこかに(ここではあなたの裁量で)配置する必要があります。 たとえば、/ usr / share / cacti /に配置します。 ただし、読み取りと実行(ファイルの作成も)の権限を考慮することを忘れないでください。ポーラーは、ユーザーwww-dataの下でこのスクリプトを実行します 。 次に、 データ入力メソッドを作成します。

<day>構造を使用して、インプットメソッドのテンプレートパラメーターを作成します。 データテンプレートが認識できるように、 入力フィールドリストで宣言する必要があります。 resという名前の出力フィールドを宣言する必要もあります(スクリプトは単一の値を返すため、名前は重要ではありません)。 データ入力方法を作成することは喜びであり、最も興味深いのは先です)

データテンプレート


データテンプレートを作成します。

デフォルトでは、すべてのパラメーターを入力するように求められますが、一部のパラメーターはData Sourceに委任できます。 この場合、 データソーススクリプトの名前とパラメーターを委任します。

データソース


データソースの作成も非常に簡単です。

作成したばかりのデータテンプレートを選択します。ホスト名は空白のままにしておくことができます。この場合、すべてがローカルマシンで行われます。 データソースに一意の名前を付けます(一意である必要はありません-後でチャートに簡単に挿入できるようにするために必要です)および監視する日(この場合は19日目)。 ファイル名は、このデータソースのIDに基づいて計算されますが、独自のものを選択できます(主なことは、衝突がないことです)。

グラフテンプレート


おそらく、おそらくチャートの設定です。 新しいグラフテンプレートを作成し、以下を参照してください。

最初に、グラフ要素がリストされます-線、凡例、その他の署名。 その他のテンプレートパラメータ(それらがない場合、これは同じテンプレートです)。 そして、グラフのパラメーターがたくさんあります(図には示していませんが、かなり明白です-制限、対数目盛、その他の不必要なもの)。
まず、視覚要素を作成します(図では、チャートの設定、署名は類推によって作成できます)。

Data Sourceという名前と色は空のままにします-後でテンプレートparatmeraに配置します。 視覚要素の主なパラメーター:


視覚要素が記述されている場合、グラフ項目入力リストでテンプレートパラメータを作成できます。

このウィンドウでは、テンプレート化するもの(データソース、色、透明度など)とこれを適用する要素を指定する必要があります。 この場合、すべての要素のテンプレートデータソースを渡す必要があります。

ほぼ最終


データソースとグラフテンプレートが用意できたので、 グラフ管理メニューでグラフ自体を作成します。

すべてが正しく行われると、スケジュールがすぐに表示されます。 ただし、1つのBUTがあります-チャートにデータを描画するには、少なくとも2つのポーリングに合格する必要があります-つまり、約10分です。
新しいデータソースを設定する場合、Cactiで十分なリモート情報を使用すると便利です。


ファイナル


そのため、タンバリンとのすべてのダンスのために、Yandexによる6月19日の天気予報の変更のダイナミクス。

そして、ボーナスとして、ロシア連邦中央銀行によるドル為替レートのダイナミクス(そこには空の領域があります-これは危機の象徴ではありませんが、サーバーを削減しました):


何を監視しますか-Apacheエラー、ユーザー数、またはプレイリスト内の曲数-幻想です。 Cactiの実験に興味があるすべての人に幸運を!

PSこの記事を書いている間、Yandexは19日はさらに2度寒くなると決めました...しかし、それにもかかわらず、Yandexからの天気はとても涼しく、パーにさえすばらしかったです。
PPS CactiはRRDを操作するための唯一のツールではありません。Munin、Ganglia、Nagiosなどがあります。

Source: https://habr.com/ru/post/J62312/


All Articles