それで、6月19日の1週間前(金曜日、わかります...)私は見始めました、天気はどうなるでしょうか? 私はYandexでそれを見ました-私はこれらのウェブベースのウェザーシャワーが大好きです。 天気は日々変化し、私は疑問に思っていました-これらの変化の頻度は何ですか? 天気の感覚は主観的なものであり、サイト上の予報の変化の頻度は非常に測定可能です。 これらの目的のために、私は有名な監視ツールCactiを使用することにしました。 この記事は主にプログラマーとシステム管理者を対象としているため、Cactiのインストール方法については考慮していません。これらのユーザーは既にインストール済みであるか、5分で管理できます。
天気予報で天気がどれくらいの頻度で変化するか知りたいが、Cactiが面白くない場合は、最後までスキップしてください。
サボテン哲学
Cactiの中心にあるのは、 RRDToolです。これは、循環データベース( RRD-ラウンドロビンデータベース)を操作するためのツールです。 そのようなデータベースは、間隔で構成される時間座標を考慮し、そのような間隔のノードに保存されたパラメータの値を記録し、必要に応じて測定値を補間します。 1つのデータベースに複数のRRA(ラウンドロビンアーカイブ)が存在する可能性があります-これにより、異なる時間間隔で(つまり、異なる詳細で)値を保存できます。 Cactiはこれらすべての操作をユーザーから隠します-値の監視を設定する必要があるのは、この値を取得し、Cactiにポーラー(データコレクター-すべてのソースからデータを取得して同じRRDに保存するように指示する手段を提供することだけです)
そもそも、Cactiにある「エンティティ」に関するいくつかの言葉。 これらは、管理パネルの左側のメニューにリストされています。
だから:
- データ入力方法 -データの取得方法を説明します。 主な方法はSNMP(興味深いトピックですが、深く掘り下げることはありません)と外部スクリプトが私たちの場合です
- データテンプレート - データ入力方法が使用される頻度とパラメータを説明します
- データソース -実際にはRRD-データをファイルに保存し、 データテンプレートに基づいて作成されます
- グラフテンプレート -グラフテンプレート。 データソースを除く、ディスプレイのすべての詳細を記述したり、色、透明度などのテンプレートパラメータを作成したりできます。
- グラフ -グラフ自体。 データソース、グラフテンプレートを混合し、グラフテンプレートからすべてのテンプレートパラメータを指定することで調理できます
- グラフツリー - グラフツリー -多数のグラフがある場合(たとえば、10台のマシンを監視している場合)、階層を作成すると便利です。
- まだまだありますが、まだ必要ありません。
天気マイニングスクリプト
特定の時刻の予報を見つけるには、Yandex天気ページをダウンロードして解析する必要があります。 興味のある日が事前にわからないので、入力として日付を受け入れ、その日の昼間の温度を出力するスクリプトを作成します。 5分ごとにYandexに連絡しないでください。天気がそれほど頻繁に変わる可能性は低いため、スクリプトでデータをキャッシュします。 ここでは特に詳しく説明しませんが、スクリプトコードを示します。
#!/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]*"
#!/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]*"
#!/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]*"
#!/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]*"
#!/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]*"
#!/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]*"
#!/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に配置します。 視覚要素の主なパラメーター:
- グラフ項目タイプ -項目タイプ。 この場合、 AREA (グラフ自体)またはGPRINT (グラフの下部にある署名-平均値と最大値を書き込みます)
- 統合機能 -チャートはAVERAGEである必要があるため、署名を作成するときに、 LAST / MAX / MINを選択することもできます
- GPRINTタイプ -署名の場合、拡張出力形式を指定できます。 メニューグラフ管理 -> GPRINTプリセットで独自のフォーマットを作成できます。 通常のprintf形式があり、興味深いものはありません)
視覚要素が記述されている場合、グラフ項目入力リストでテンプレートパラメータを作成できます。
このウィンドウでは、テンプレート化するもの(データソース、色、透明度など)とこれを適用する要素を指定する必要があります。 この場合、すべての要素のテンプレートデータソースを渡す必要があります。
ほぼ最終
データソースとグラフテンプレートが用意できたので、 グラフ管理メニューでグラフ自体を作成します。
すべてが正しく行われると、スケジュールがすぐに表示されます。 ただし、1つのBUTがあります-チャートにデータを描画するには、少なくとも2つのポーリングに合格する必要があります-つまり、約10分です。
新しいデータソースを設定する場合、Cactiで十分なリモート情報を使用すると便利です。
- / var / log / cacti /には多くのログがあり、特にポーラーエラーpoller-error.log
- [ システムユーティリティ] -> [Cactiログファイルの表示]メニュー
ファイナル
そのため、タンバリンとのすべてのダンスのために、Yandexによる6月19日の天気予報の変更のダイナミクス。
そして、ボーナスとして、ロシア連邦中央銀行によるドル為替レートのダイナミクス(そこには空の領域があります-これは危機の象徴ではありませんが、サーバーを削減しました):
何を監視しますか-Apacheエラー、ユーザー数、またはプレイリスト内の曲数-幻想です。 Cactiの実験に興味があるすべての人に幸運を!
PSこの記事を書いている間、Yandexは19日はさらに2度寒くなると決めました...しかし、それにもかかわらず、Yandexからの天気はとても涼しく、パーにさえすばらしかったです。
PPS CactiはRRDを操作するための唯一のツールではありません。Munin、Ganglia、Nagiosなどがあります。