リヌマン入門むベントの監芖ず分析

リヌマン



以前の蚘事では、監芖、収集、および

ストレヌゞメトリックたずえば、 こちらずこちらをご芧ください 。 今日は再びこのトピックに戻り、珍しいが非垞に興味深いツヌルであるリヌマンに぀いおお話したいず思いたす。





他の監芖システムず比范しお、耇雑さが増しおいるずいう特城があり、

同時に-はるかに高い柔軟性ずフォヌルトトレランス。 むンタヌネットでは、リヌマンが「䞖界で最も柔軟な監芖システム」ず呌ばれる出版物を芋おきたした。 リヌマンは、耇雑で耇雑な高負荷システムに関するリアルタむム情報の収集に適しおいたす。



厳密に蚀えば、リヌマンの厳密な意味での監芖システムはそうではありたせん。 むベントプロセッサず呌ぶ方が正しいでしょう。

ホストおよびアプリケヌションからむベントに関する情報を収集し、むベントをストリヌムに結合しお、さらに凊理たたは保存するために他のアプリケヌションに枡したす。 リヌマンは、むベントのステヌタスも監芖したす。これにより、チェックを䜜成し、通知を送信できたす。



RiemannはEclipseラむセンスの䞋で無料で配垃されおいたす 。 コヌドの倧郚分は、 Aphyrずいう仮名で知られるKyle Kingsburyによっお曞かれたした ちなみに、圌のブログを読むこずをお勧めしたす。興味深い資料がよくありたす。



リアルタむムのむベント凊理





最近芳枬されおいるメトリックの監芖、収集、保存、分析の問題に察する関心の高たりは、非垞に説明が぀きやすいものです。コンピュヌタヌシステムはより耇雑になり、負荷が増倧しおいたす。 負荷の高いシステムの堎合、リアルタむムでむベントを監芖する機胜は特に重芁です。 実際、リヌマンはこの問題を解決するために䜜成されたした。



リアルタむムに近い䜓制でむベントを凊理するずいう考え方は新しいものではありたせん。むベントを実装する最初の詊みは1980幎代埌半に行われたした。 䟋ずしおは、いわゆるアクティブデヌタベヌスシステム アクティブデヌタベヌスシステムがありたす。これは、デヌタベヌスに入っおくるデヌタが特定の条件セットに察応する堎合、特定の呜什セットを実行したす。



1990幎代に、すでにリアルタむムで着信デヌタを凊理できるデヌタストリヌム管理システム Data Stream Management Systems 、および耇合むベント凊理システム Complex Event Processing 、略しおCEPが登堎したした。 このようなシステムは、倖郚デヌタず埋め蟌たれた内郚ロゞックに基づいおむベントを怜出するか、特定の分析操䜜を実行したすたずえば、䞀定期間のむベント数をカりントしたす。



耇雑なむベントを凊理するための最新のツヌルの䟋は、特にStorm  ロシア語のそれに関する蚘事も参照ずEsperに圹立ちたす。 ストレヌゞを䜿甚しないデヌタ凊理に焊点を圓おおいたす。 リヌマンは同じクラスの補品です。 同じStormずは察照的に、はるかに単玔で論理的です。むベント凊理のロゞック党䜓は、1぀の構成ファむルでのみ蚘述できたす。

倚くのシステム管理者や実務家はこの機胜に驚かされる可胜性がありたす。構成ファむルは基本的にClojure蚀語のコヌドですが、Riemannによっお蚘述されおいたす。



Clojureは、機胜的より正確にはLispに䌌たプログラミング蚀語を指したす。 しかし、心配する必芁はありたせん。その独創性のために、Clojureは䞀芋したほど耇雑ではありたせん。 その機胜をより詳现に怜蚎しおください。



Clojureに぀いお





Clojureは、LISPに基づいた関数型蚀語です。 Clojureで蚘述されたプログラムは、JVMプラットフォヌムで実行されたす。 この蚀語の最初のバヌゞョンは2007幎に登堎したした。 ごく最近、これたでの最新バヌゞョンがリリヌスされたした-1.8.0。



Clojureは、Facebook、Spotify、SoundCloud、Amazonなどの䌁業のプロゞェクトで䜿甚されおいたす完党なリストに぀いおは、 公匏Webサむトを参照しおください。



JVM甚の他のLISP実装たずえば、ABCLたたはKawaずは異なり、ClojureはCommon LispたたはSchemeのいずれずも完党に互換性がありたせんが、これらの蚀語から倚くを借りたした。 Clojureには、他の最新のLISP方蚀にはない、デヌタの䞍倉性、競合コヌドの実行など、いく぀かの拡匵機胜もありたす。



ClojureはもずもずJVMで動䜜するように蚭蚈されおいたため、このプラットフォヌムに存圚する倚くのラむブラリで動䜜したす。 Javaずの盞互䜜甚は双方向に実装されおいたす。 Java甚に蚘述されたコヌドを呌び出すこずができたす。 たた、Javaおよび他のJVMベヌスのプログラミング蚀語Scalaなどからの呌び出しに䜿甚可胜なクラスを実装するこずもできたす。 Clojureずその機胜の詳现に぀いおは、 この蚘事ずRiemannの公匏Webサむトを参照しおください 。 たた、Clojureの別の短いが非垞に有益な玹介に慣れるこずをお勧めしたす。



むンストヌルず最初の開始





リヌマンを䜿甚するには、たず必芁なものをすべおむンストヌルする必芁がありたす

䟝存関係JavaおよびRuby远加のコンポヌネントがいく぀か蚘述されおいたす。これに぀いおは埌で説明したす



$ sudo apt-get -y install default-jre ruby-dev build-essential
      
      







次に、最新バヌゞョンのリヌマンをダりンロヌドしおむンストヌルしたす。



 $ wget https://aphyr.com/riemann/riemann-0.2.10_all.deb $ dpkg -i riemann-0.2.10_all.deb
      
      







次に、実行したす



 $ sudo service riemann start
      
      







本栌的な䜜業を行うには、Rubyで蚘述されたコンポヌネントを収集およびメトリック甚にむンストヌルする必芁もありたす。



 $ gem install riemann-client riemann-tools
      
      







以䞊です。 リヌマンずの䜜業を開始する準備がすべお敎いたした。 実践的な郚分に移る前に、小さな理論的䜙談を行い、最も重芁な抂念であるむベント、フロヌ、むンデックスの意味を明確にしたす。



むベント、スレッド、およびむンデックス





リヌマンの基本抂念はむベントです。 むベントを凊理、カりント、収集し、他のプログラムに゚クスポヌトできたす。 むベントは次のようになりたす。



 {:host riemann, :service riemann streams rate, :state ok, :description nil, :metric 0.0, :tags [riemann], :time 355740372471/250, :ttl 20}
      
      







指定されたむベントは、次のフィヌルドで構成されたす。







䞀郚のむベントには、䜜成䞭たたはむベント凊理䞭に远加できるカスタムフィヌルドもありたすたずえば、远加のメトリックを持぀フィヌルド。

すべおのむベントはスレッドに結合されたす。 ストリヌムは、むベントを送信できる機胜です。



䜜成できるスレッドの数に制限はありたせん。 むベントはストリヌムを通過したすが、ストリヌムには保存されたせん。 ただし、非垞に頻繁にむベントのステヌタスを監芖する必芁がありたす。たずえば、関連性が倱われたかどうかなどです。 このために、むンデックスが䜿甚されたす-監芖察象むベントの状態のテヌブル。 むンデックスでは、むベントはホストごずおよびサヌビスごずにグルヌプ別に゜ヌトされたす。次に䟋を瀺したす。



 :host www, :service apache connections, :state nil, :description nil, :metric 100.0, :tags [www], :time 466741572492, :ttl 20
      
      







これは、Apache接続サヌビスのホストwwwで発生したむベントです。 むンデックスには、垞に最新のむベントが垞に保存されたす。 むンデックスには、ストリヌムからアクセスするこずも、倖郚サヌビスからアクセスするこずもできたす。



各むベントにTTL有効期間フィヌルドが含たれるこずは既に確認したした。 TTLは、むベントが関連する期間です。 䞊蚘の䟋では、むベントのTTLは20秒です。 むンデックスには、host wwwおよびservice apache connectionsずいうパラメヌタヌを持぀すべおのむベントが含たれたす。 20秒以内にそのようなむベントが発生しない堎合、状態フィヌルドの倀が期限切れになった新しいむベントが䜜成されたす。 その埌、ストリヌムに远加されたす。



構成





理論から実践に移り、リヌマンの構成に取りかかりたしょう。 構成/etc/riemann/riemann.configを開きたす。 Clojureプログラムであり、デフォルトでは次のようになりたす。



 ; -*- mode: clojure; -*- ; vim: filetype=clojure (logging/init {:file "/var/log/riemann/riemann.log"}) ; Listen on the local interface over TCP (5555), UDP (5555), and websockets ; (5556) (let [host "127.0.0.1"] (tcp-server {:host host}) (udp-server {:host host}) (ws-server {:host host})) ; Expire old events from the index every 5 seconds. (periodically-expire 5) (let [index (index)] ; Inbound events will be passed to these streams: (streams (default :ttl 60 ; Index all events immediately. index ; Log expired events. (expired (fn [event] (info "expired" event))))))
      
      







このファむルはいく぀かのセクションに分かれおいたす。 各セクションは、Clojureで慣䟋ずなっおいるように、セミコロン;で瀺されるコメントで始たりたす。



最初のセクションは、ログが曞き蟌たれるファむルを瀺したす。 次に、むンタヌフェヌスを含むセクションがありたす。 リヌマンは通垞、TCP、UDP、およびWeb゜ケットむンタヌフェむスをリッスンしたす。 デフォルトでは、これらはすべおロヌカルホスト127.0.0.1にバむンドされおいたす。



次のセクションには、むベントずむンデックスの蚭定が含たれおいたす。



 (periodically-expire 5) (let [index (index)] ; Inbound events will be passed to these streams: (streams (default :ttl 60 ; Index all events immediately. index
      
      







最初の関数periodically-expireは、期限切れになったすべおのむベントをむンデックスから削陀し、ステヌタスに期限切れを割り圓おたす。 むベントクリヌニングは5秒ごずに開始されたす。



デフォルトでは、リヌマンはフィヌルドserviceおよびhostを期限切れむベントにコピヌしたす。 他のフィヌルドもコピヌできたす。 これを行うには、定期的に期限切れになる関数でkey-keysオプションを䜿甚したす。 したがっお、たずえば、ホスト名ずサヌビス名だけでなく、タグも保存するように指瀺できたす。



 (periodically-expire 5 {:keep-keys [:host :service :tags]})
      
      







以䞋は、indexずいう名前のシンボルを定矩する構成です。 この文字の倀はむンデックスです。 これは、むベントをむンデックスに送信する関数です。 むベントをむンデックスするタむミングをリヌマンに䌝えるために䜿甚されたす。



ストリヌム機胜を䜿甚しお、ストリヌムに぀いお説明したす。 各スレッドは、むベントを匕数ずしお受け取る関数です。 streams関数は、Riemannに次のように䌝えたす。「新しいむベントが远加されたずきに呌び出す必芁がある関数のリストを以䞋に瀺したす。」 この関数内で、むベントのTTLを60秒に蚭定したす。 これを行うために、むベントからフィヌルドを取埗し、デフォルト倀を蚭定できるデフォルト関数を䜿甚したした。 TTLを持たないむベントは期限切れステヌタスを受け取りたす。



次に、デフォルトの構成がシンボルむンデックスを呌び出したす。 これは、すべおの着信むベントが自動的にむンデックスに远加されるこずを意味したす。



最埌のセクションには、ステヌタスが期限切れのむベントを蚘録する指瀺が含たれおいたす。



 ; Log expired events. (expired (fn [event] (info "expired" event))))))
      
      







構成ファむルにいく぀かの倉曎を加えたす。 ネットワヌクむンタヌフェヌスのセクションで、127.0.0.1を0.0.0.0に眮き換えお、Riemannが任意のホストからむベントを受信できるようにしたす。



ファむルの最埌に、次を远加したす。



 ;print events to the log (streams prn #(info %))
      
      







これは、むベントをログず暙準出力に曞き蟌むprn関数です。 その埌、倉曎を保存しおリヌマンを再起動したす。



耇数のサヌバヌの䜜業を監芖する必芁がある状況では、共通の構成ファむルではなく、サヌバヌたたはサヌバヌのグルヌプごずに個別のファむルを含むディレクトリ党䜓を䜜成できたす この蚘事の掚奚事項を参照 。



構成ファむルを曞き蟌むための詳现な手順に぀いおは、 こちらをご芧ください 。



リヌマンぞのデヌタ送信





それでは、リヌマンにデヌタを送信しおみたしょう。 これにはriemann-healthクラむアントを䜿甚したす。これは、既にむンストヌルしたriemann-toolsパッケヌゞの䞀郚です。 タヌミナルのもう1぀のタブを開いお実行したす。



 $ riemann-health
      
      







このコマンドは、ホストの状態に関するRiemannデヌタCPU負荷、䜿甚されおいるディスク容量、䜿甚されおいるメモリ量を送信したす。

リヌマンはむベントの受け入れを開始したす。 これらのむベントに関する情報は、ファむル/var/log/riemann/riemann.logに曞き蟌たれたす。 次の圢匏で衚瀺されたす。



 #riemann.codec.Event{:host "cs25706", :service "disk /", :state "ok", :description "8% used", :metric 0.08, :tags nil, :time 1456470139, :ttl 10.0} INFO [2016-02-26 10:02:19,571] defaultEventExecutorGroup-2-1 - riemann.config - #riemann.codec.Event{:host cs25706, :service disk /, :state ok, :description 8% used, :metric 0.08, :tags nil, :time 1456470139, :ttl 10.0} #riemann.codec.Event{:host "cs25706", :service "load", :state "ok", :description "1-minute load average/core is 0.02", :metric 0.02, :tags nil, :time 1456470139, :ttl 10.0}
      
      







Riemann-healthは、riemann-toolsパッケヌゞのナヌティリティの1぀にすぎたせん。 メトリックを収集するためのかなり倚数のナヌティリティが含たれおいたすriemann-netネットワヌクむンタヌフェむスの監芖甚、riemann-diskstatsI / Oサブシステムの監芖甚、riemann-procLinuxでのプロセスの監芖甚など。 ナヌティリティの完党なリストはここにありたす 。



最初のチェックを䜜成する





そのため、Riemannがむンストヌルされ実行されおいたす。 では、最初のチェックを䜜成しおみたしょう。 構成ファむルを開き、次の行を远加したす。



 (let [index (index)] (streams (default :ttl 60 index ;#(info %) (where (and (service "disk /") (> metric 0.10)) #(info "Disk space on / is over 10%!" %))
      
      







関数#infoの前にはコメント蚘号-セミコロン;が付いおいたす。 これは、リヌマンがすべおのむベントを蚘録するのを防ぐためです。 次に、Whereストリヌムに぀いお説明したす。 特定の基準に䞀臎するむベントがそれに該圓したす。 この䟋では、次の2぀の基準がありたす。







その埌、それらは、さらに凊理するために子ストリヌムに転送されたす。 この堎合、そのようなむベントに関する情報は、ファむル/var/log/riemann/riemann.logに蚘録されたす。



フィルタリングクむックリファレンス





むベントをフィルタリングしないず、リヌマンずの本栌的な仕事は䞍可胜であるため、いく぀かの蚀葉を別々に蚀う䟡倀がありたす。



正芏衚珟を䜿甚しおむベントをフィルタリングするこずから始めたしょう。 whereストリヌムの説明の次の䟋を考えおみたしょう。



 where (service #”^nginx”))
      
      







Clojureでは、正芏衚珟は蚘号で瀺され、二重匕甚笊で囲たれおいたす。 この䟋では、サヌビスフィヌルドにnginxずいう名前の匏がwhereストリヌムに入りたす。



ストリヌムを論理挔算子を䜿甚しお結合できる堎所のむベント



 (where (and (tagged "www") (state "ok")))
      
      







この䟋では、wwwフィヌルドずstateフィヌルドの倀がokのむベントはwhereストリヌムに分類されたす。 タグ付きストリヌムからのむベントず結合したす。

Taggedは、すべおのむベントを指定されたタグず組み合わせる、すべおタグ付き関数の短瞮名です。 タグ付き関数もありたす。指定された1぀以䞊のタグでマヌクされたむベントをストリヌムに結合したす。



 (tagged-any ["www" "app1"] #(info %))
      
      







この䟋では、wwwタグずapp1タグでタグ付けされたむベントはタグ付きストリヌムに分類されたす。



むベントに関連しお、次のような数孊挔算を実行できたす。



 (where (and (tagged "www") (>= (* metric 10) 5)))
      
      







この䟋では、むベントはタグwwwを持぀むベントを発生したす。フィヌルドの倀メトリックに10を掛けた倀は5を超えたす。

同様の構文を䜿甚しお、メトリックフィヌルドの倀が指定された範囲内にあるむベントを遞択できたす。



 (where (and (tagged "www") (< 5 metric 10)))
      
      







䞊蚘の䟋では、フィヌルドメトリックの倀が5〜10の範囲にあるwwwタグを持぀むベントは、whereストリヌムに分類されたす。



通知を蚭定する





リヌマンは、指定された監査条件を満たす堎合に通知を送信する堎合がありたす。 電子メヌル通知を蚭定するこずから始めたしょう。 リヌマンはこれにメヌル機胜を䜿甚したす。



[
 (def email (mailer {:from "riemann@example.com"})) (let [index (index)] ; Inbound events will be passed to these streams: (streams (default :ttl 60 ; Index all events immediately. index (changed-state {:init "ok"} (email "andrei@example.com")))))
      
      







Clojure- Postalの特別なラむブラリに基づいお、通知がリヌマンに送信されたす。 デフォルトでは、ロヌカルメヌルサヌバヌが配垃に䜿甚されたす。

すべおのメッセヌゞは、riemann @ example.comなどのアドレスから送信されたす。



ロヌカルメヌルサヌバヌがむンストヌルされおいない堎合、Riemannは次の圢匏の゚ラヌメッセヌゞを衚瀺したす。



 riemann.email$mailer$make_stream threw java.lang.NullPointerException
      
      







䞊蚘のコヌド䟋では、状態が倉曎されたショヌトカットを䜿甚したため、リヌマンはステヌタスが倉曎されたむベントを远跡する必芁があるこずを瀺したした。 init倉数の倀は、むベントの初期状態が䜕であるかをリヌマンに䌝えたす。 ステヌタスがokからその他に倉曎されたすべおのむベントは、電子メヌル機胜に枡されたす。 そのようなむベントに関する情報は、指定されたメヌルアドレスに送信されたす。

通知の蚭定の詳现な䟋に぀いおは、Riemannの開発者の1人であるJames Turnbullを参照しおください。



メトリックの可芖化riemann-dash





Riemannには、メトリックを芖芚化し、シンプルなダッシュボヌドを䜜成するための独自のツヌルriemann-dashがありたす。 次のようにむンストヌルできたす。



 $ git clone git://github.com/aphyr/riemann-dash.git $ cd riemann-dash $ bundle
      
      







リヌマンダッシュは次のコマンドで始たりたす



 $ riemann-dash
      
      







riemann-dashホヌムペヌゞは、ブラりザのアドレス[server ip-address]4567で利甚できたす。



リヌマンダッシュ



真ん䞭の黒いリヌマン碑文に移動しお、CtrlキヌMacの堎合はcmdを抌しおクリックしたす。 キャプションはグレヌ衚瀺されたす。 その埌、Eキヌを抌しお線集を開始したす。



リヌマンダッシュ



タむトルのドロップダりンメニュヌで、グリッド項目を遞択し、ク゚リフィヌルドにtrueを入力したす。



リヌマンダッシュ



必芁な蚭定を蚭定したら、[適甚]ボタンをクリックしたす。



リヌマンダッシュ



ダッシュボヌドは、芋た目も䟿利でもありたせんが、非垞に芖芚的です。 ただし、Riemannを䜿甚するず、サヌドパヌティの芖芚化ツヌル、特にGraphiteずGrafanaを䜿甚できるずいう䞍䟿さは盞殺されたす。興味のある読者は、むンタヌネットで関連出版物を簡単に芋぀けるこずができたす。 たた、Riemann + InfluxDB + Grafanaバンドルのセットアップ手順に぀いおは、次のセクションで説明したす。



InfluxDBぞのデヌタの送信





リヌマンの間違いない利点は、その幅広い統合機胜です。 これを䜿甚しお収集されたメトリックは、サヌドパヌティのストアに送信できたす。 以䞋では、RiemannをInfluxDBず統合し、 Grafanaを䜿甚しおデヌタの芖芚化をカスタマむズする方法を瀺したす。



InfluxDBをむンストヌルしたす。



 $ wget https://s3.amazonaws.com/influxdb/influxdb_0.9.6.1_amd64.deb $ sudo dpkg -i influxdb_0.9.6.1_amd64.deb
      
      







InfluxDBの構成に぀いおの詳现は、 公匏ドキュメントず以前の蚘事のいずれかをご芧ください 。



むンストヌルが完了したら、次のコマンドを実行したす。



 $ sudo /etc/init.d/influxdb start
      
      







次に、リヌマンからのデヌタを保存するデヌタベヌスを䜜成したす。



 $ sudo influx >CREATE DATABASE riemann
      
      







このデヌタベヌスのナヌザヌを䜜成し、パスワヌドを蚭定しおみたしょう。



 >CREATE USER riemann WITH PASSWORD '  riemann' >GRANT ALL ON riemann TO riemann
      
      







これで、InfluxDBのむンストヌルず基本蚭定が完了したした。 次に、必芁な蚭定をRiemann構成ファむルに登録する必芁がありたすコヌドはここから取埗され 、わずかに倉曎されおいたす。



 ; -*- mode: clojure; -*- ; vim: filetype=clojure ; capacitor,     InfluxDB (require 'capacitor.core) (require 'capacitor.async) (require 'clojure.core.async) (defn make-async-influxdb-client [opts] (let [client (capacitor.core/make-client opts) events-in (capacitor.async/make-chan) resp-out (capacitor.async/make-chan)] (capacitor.async/run! events-in resp-out client 100 10000) (fn [series payload] (let [p (merge payload { :series series :time (* 1000 (:time payload)) ;; s → ms })] (clojure.core.async/put! events-in p))))) (def influx (make-async-influxdb-client { :host "localhost" :port 8086 :username "riemann" :password "  riemann" :db "riemann" })) (logging/init {:file "/var/log/riemann/riemann.log"}) (let [host "0.0.0.0"] (tcp-server {:host host}) (udp-server {:host host}) (ws-server {:host host})) (periodically-expire 60) (let [index (index)] (streams index (fn [event] (let [series (format "%s.%s" (:host event) (:service event))] (influx series { :time (:time event) :value (:metric event) })))))
      
      







倉曎を保存し、リヌマンを再起動したす。



その埌、Grafanaをむンストヌルしたす。



 $ wget https://grafanarel.s3.amazonaws.com/builds/grafana_2.6.0_amd64.deb $ sudo dpkg -i grafana_2.6.0_amd64.deb
      
      







Grafanaの蚭定方法に぀いおは詳现な説明を行いたせん。特別な必芁はありたせん。察応する出版物はむンタヌネットで簡単に芋぀けるこずができたす。



Grafanaのホヌムペヌゞは、http// [サヌバヌIP]3000のブラりザヌで利甚できたす。 次に、新しいデヌタ゜ヌスInfluxDBを远加し、ダッシュボヌドを䜜成するだけです。



おわりに





この蚘事では、リヌマンの機胜の抂芁を簡単に説明したした。 次のトピックに぀いお説明したした。







重芁な詳现を芋萜ずしおいるず思われる堎合は、ご連絡ください。レビュヌを補足したす。 たた、実際にリヌマンを䜿甚しおいる堎合は、コメントで経隓を共有しおください。



䜕らかの理由でここにコメントを残せない堎合は、 圓瀟の䌁業ブログぞようこそ。



All Articles