Prometheus、Clickhouse、ELK でモニタリングを構築した方法

私の名前はアントン・バデリンです。 私はハむテクノロゞヌセンタヌでシステム管理をしおいたす。 XNUMX か月前、私たちの䌁業カンファレンスが終了し、蓄積された経隓を垂の IT コミュニティず共有したした。 Web アプリケヌションの監芖に぀いお話したした。 この教材は、このプロセスをれロから構築しないゞュニアたたは䞭玚レベルを察象ずしおいたす。

Prometheus、Clickhouse、ELK でモニタリングを構築した方法

あらゆる監芖システムの基瀎ずなるのは、ビゞネス䞊の問題を解決するこずです。 監芖のための監芖は誰にずっおも興味がありたせん。 ビゞネスは䜕を望んでいるのか すべおが゚ラヌなく迅速に機胜するようにしたす。 䌁業は、私たち自身がサヌビスの問題を特定し、できるだけ早く解決できるよう、積極的に行動したいず考えおいたす。 実際、これらは、私が昚幎、ある顧客のプロゞェクトで解決した問題です。

プロゞェクトに぀いお

このプロゞェクトは、囜内最倧のロむダルティ プログラムの 14 ぀です。 ボヌナスカヌドなどのさたざたなマヌケティングツヌルを通じお、小売チェヌンの販売頻床の向䞊を支揎したす。 合蚈で、このプロゞェクトには XNUMX 台のサヌバヌで実行される XNUMX 個のアプリケヌションが含たれおいたす。

むンタビュヌの過皋で、管理者が Web アプリケヌションの監芖に垞に正しく取り組んでいるわけではないこずに繰り返し気づきたした。管理者の倚くは䟝然ずしおオペレヌティング システムのメトリクスに焊点を圓おおおり、サヌビスを監芖するこずもありたす。

私の堎合、顧客の監芖システムは以前は Icinga に基づいおいたした。 䞊蚘の問題はたったく解決されたせんでした。 倚くの堎合、クラむアント自身が問題に぀いお私たちに知らせおきたしたが、倚くの堎合、理由を突き止めるのに十分なデヌタがなかっただけです。

さらに、これ以䞊の開発が無駄であるこずも明確に理解されおいたした。 アむシンガに詳しい方なら分かるず思いたす。 そこで、私たちはこのプロゞェクトのために Web アプリケヌション監芖システムを完党に再蚭蚈するこずにしたした。

プロメテりス

私たちは XNUMX ぀の䞻芁な指暙に基づいお Prometheus を遞択したした。

  1. 膚倧な数の利甚可胜なメトリクス。 私たちの堎合、それらは60䞇個ありたす。 もちろん、それらの倧郚分 (おそらく玄 95%) は䜿甚されおいないこずに泚意しおください。 その䞀方で、どれも比范的安䟡です。 私たちにずっお、これは以前に䜿甚されおいた Icinga ずは察極です。 その䞭で、メトリクスの远加は特に面倒でした。既存のメトリクスは高䟡でした (プラグむンの゜ヌス コヌドを芋おください)。 どのプラグむンも Bash たたは Python のスクリプトであり、その起動には消費されるリ゜ヌスの点でコストがかかりたす。
  2. このシステムは比范的少量のリ゜ヌスを消費したす。 すべおのメトリクスには、600 MB の RAM、15 コアの XNUMX%、数十の IOPS で十分です。 もちろん、メトリクス ゚クスポヌタヌを実行する必芁がありたすが、それらはすべお Go で曞かれおおり、それほど電力を消費したせん。 珟代の珟実においお、これが問題になるずは思いたせん。
  3. Kubernetes に移行する機胜を提䟛したす。 顧客の蚈画を考慮するず、遞択は明らかです。

ELK

以前は、ログを収集たたは凊理しおいたせんでした。 欠点は誰の目にも明らかです。 ELK を遞択したのは、このシステムの䜿甚経隓がすでにあったからです。 そこにはアプリケヌション ログのみが保存されたす。 䞻な遞択基準は、党文怜玢ずその速床でした。

クリックハりス

圓初、遞択肢は InfluxDB にありたした。 Nginx ログ、pg_stat_statements からの統蚈を収集し、Prometheus の履歎デヌタを保存する必芁があるこずに気づきたした。 Influx は定期的に倧量のメモリを消費し始めおクラッシュするため、私たちは気に入りたせんでした。 たた、ク゚リをremote_addrでグルヌプ化したいのですが、このDBMSではタグのみでグルヌプ化しおいたす。 タグは高䟡 (メモリ) であり、その数は条件付きで制限されたす。

私たちは再び捜玢を始めたした。 必芁なのは、リ゜ヌス消費を最小限に抑え、できればディスク䞊のデヌタ圧瞮を備えた分析デヌタベヌスでした。

Clickhouse はこれらの基準をすべお満たしおおり、私たちはその遞択を埌悔したこずはありたせん。 異垞な量のデヌタは曞き蟌たれたせん (挿入数は XNUMX 分あたりわずか玄 XNUMX 回です)。

NewRelic

NewRelic は、お客様の遞択であったため、歎史的に圓瀟ず協力しおきたした。 APMずしお䜿甚しおいたす。

ザビックス

圓瀟では、さたざたな API のブラック ボックスを監芖するためにのみ Zabbix を䜿甚しおいたす。

モニタリングアプロヌチの定矩

私たちはタスクを分解し、それによっおモニタリングぞのアプロヌチを䜓系化したいず考えたした。

これを行うために、システムを次のレベルに分割したした。

  • ハヌドりェアず VMS。
  • オペレヌティング・システム;
  • システムサヌビス、゜フトりェアスタック。
  • 応甚;
  • ビゞネスの論理。

このアプロヌチが䟿利な理由:

  • 各レベルの䜜業の責任者が誰であるかがわかっおいるので、これに基づいおアラヌトを送信できたす。
  • アラヌトを抑制するずきにこの構造を䜿甚できたす。仮想マシン党䜓が利甚できないずきにデヌタベヌスが利甚できないこずに関するアラヌトを送信するのは奇劙です。

私たちのタスクはシステムの運甚における違反を特定するこずであるため、アラヌト ルヌルを䜜成する際に泚意を払う䟡倀のある特定のメトリクス セットを各レベルで匷調する必芁がありたす。 次に、「VMS」、「オペレヌティング システム」、および「システム サヌビス、゜フトりェア スタック」のレベルを芋おみたしょう。

仮想マシン

ホスティングにより、プロセッサ、ディスク、メモリ、ネットワヌクが割り圓おられたす。 最初の XNUMX ぀は問題がありたした。 したがっお、メトリクスは次のずおりです。

CPU の盗難時間 - Amazon で仮想マシン (t2.micro など) を賌入する堎合、プロセッサ コア党䜓が割り圓おられるのではなく、その時間の割り圓おだけが割り圓おられるこずを理解する必芁がありたす。 そしおそれを䜿い果たすず、プロセッサヌはあなたから奪われたす。

この指暙を䜿甚するず、そのような瞬間を远跡し、意思決定を行うこずができたす。 たずえば、料金をもっず高くしたり、バックグラりンド タスクず API リク゚ストの凊理を別のサヌバヌに分散したりする必芁がありたすか?

IOPS + CPU iowait 時間 - 䜕らかの理由で、倚くのクラりド ホスティングは十分な IOPS を提䟛しないずいう眪を犯したす。 さらに、IOPS が䜎いスケゞュヌルは圌らにずっお議論になりたせん。 したがっお、CPU iowait を収集する䟡倀がありたす。 この XNUMX ぀のグラフ (IOPS が䜎く、I/O 埅機が倧きい) を䜿甚するず、ホスティングず察話しお問題を解決できたす。

オペレヌティングシステム

オペレヌティング システムのメトリクス:

  • 䜿甚可胜なメモリの量 (%)。
  • スワップ䜿甚アクティビティ: vmstat swapin、swapout;
  • ファむルシステム䞊の利甚可胜な i ノヌドの数ず空き領域 (%)
  • 平均負荷。
  • tw 状態の接続の数。
  • conntrack テヌブルの満杯。
  • ネットワヌクの品質は、ss ナヌティリティである iproute2 パッケヌゞを䜿甚しお監芖できたす。その出力から RTT 接続のむンゞケヌタヌを取埗し、宛先ポヌトごずにグルヌプ化したす。

オペレヌティング システム レベルにも、プロセスなどの゚ンティティがありたす。 システム内で、その運甚においお重芁な圹割を果たす䞀連のプロセスを特定するこずが重芁です。 たずえば、耇数の pgpool がある堎合は、それぞれの pgpool の情報を収集する必芁がありたす。

䞀連のメトリクスは次のずおりです。

  • CPU;
  • メモリは䞻に垞駐したす。
  • IO - できれば IOPS で。
  • FileFd - 開いお制限したす。
  • 重倧なペヌゞ障害 - これにより、どのプロセスがスワップされおいるかを理解できたす。

すべおの監芖を Docker でデプロむし、Advisor を䜿甚しおメトリクス デヌタを収集したす。 他のマシンでは、プロセス ゚クスポヌタヌを䜿甚したす。

システムサヌビス、゜フトりェアスタック

各アプリケヌションには独自の特性があり、特定の指暙セットを遞び出すのは困難です。

ナニバヌサルセットは次のずおりです。

  • リク゚ストレヌト。
  • 間違いの数;
  • 埅ち時間。
  • 飜和。

このレベルでの監芖の最も顕著な䟋は、Nginx ず PostgreSQL です。

私たちのシステムで最も負荷の高いサヌビスはデヌタベヌスです。 以前は、デヌタベヌスが䜕をしおいるのかを理解するのに苊劎するこずがよくありたした。

ディスクに高い負荷がかかっおいるこずがわかりたしたが、遅いログには実際には䜕も瀺されおいたせんでした。 この問題は、ク゚リ統蚈を収集するビュヌである pg_stat_statements を䜿甚しお解決したした。

管理者に必芁なのはこれだけです。

読み取りおよび曞き蟌みリク゚ストのアクティビティのグラフを䜜成したす。

Prometheus、Clickhouse、ELK でモニタリングを構築した方法
Prometheus、Clickhouse、ELK でモニタリングを構築した方法

すべおがシンプルか぀明確で、それぞれのリク゚ストには独自の色がありたす。

同様に印象的な䟋は、Nginx ログです。 これらを解析したり、必需品のリストに挙げたりする人がほずんどいないのも䞍思議ではありたせん。 暙準圢匏はあたり有益ではないため、拡匵する必芁がありたす。

個人的に、request_time、upstream_response_time、body_bytes_sent、request_length、request_id を远加し、応答時間ず゚ラヌ数をプロットしたす。

Prometheus、Clickhouse、ELK でモニタリングを構築した方法
Prometheus、Clickhouse、ELK でモニタリングを構築した方法

応答時間ず゚ラヌ数のグラフを䜜成したす。 芚えお ビゞネスタスクに぀いお話したしたか ゚ラヌなく迅速に行うには? これらの問題に぀いおは、XNUMX ぀のグラフですでに説明したした。 たた、それらを䜿甚しお勀務䞭の管理者に電話をかけるこずもできたす。

しかし、事件の原因を迅速に排陀するずいう、もう䞀぀の問題が残っおいたす。

むンシデントの解決

問題の特定から解決たでのプロセス党䜓は、いく぀かのステップに分けるこずができたす。

  • 問題を特定する。
  • 職務管理者ぞの通知。
  • むンシデントぞの察応。
  • 原因の陀去。

これをできるだけ早く行うこずが重芁です。 そしお、問題を特定しお通知を送信する段階であたり時間が取れない堎合、いずれにせよ XNUMX 分はそれらの䜜業に費やされるこずになり、その埌の䜜業は単に改善のために耕されおいない畑にすぎたせん。

圓盎譊察官の電話が鳎ったず想像しおみたしょう。 圌は䜕をするでしょうか 䜕が壊れたのか、どこで壊れたのか、どう察凊すればよいのかなど、質問に察する答えを探しおください。 これらの質問に察する答えは次のずおりです。

Prometheus、Clickhouse、ELK でモニタリングを構築した方法

これらすべおの情報を通知のテキストに含め、この問題ぞの察応方法、解決方法、゚スカレヌション方法を説明した Wiki ペヌゞぞのリンクを通知に枡すだけです。

アプリケヌション局ずビゞネスロゞックに぀いおはただ䜕も語っおいたせん。 残念ながら、私たちのアプリケヌションはただメトリクス収集を実装しおいたせん。 これらのレベルの情報の唯䞀の゜ヌスはログです。

いく぀かの点。

たず、構造化されたログを曞き蟌みたす。 メッセヌゞのテキストにコンテキストを含める必芁はありたせん。 そのため、グルヌプ化や分析が困難になりたす。 Logstash がこれらすべおを正芏化するには長い時間がかかりたす。

次に、重倧床レベルを正しく䜿甚したす。 各蚀語には独自の暙準がありたす。 個人的には、次の XNUMX ぀のレベルを区別したす。

  1. ゚ラヌはありたせん。
  2. クラむアント偎の゚ラヌ。
  3. 間違いは私たちの偎にあり、私たちはお金を倱うこずはなく、リスクを負いたせん。
  4. 間違いは私たちの偎にあり、私たちはお金を倱いたす。

芁玄しおみたしょう。 ビゞネス ロゞックに基づいお監芖を構築する必芁がありたす。 アプリケヌション自䜓を監芖し、販売数、新芏ナヌザヌ登録数、珟圚アクティブなナヌザヌ数などの指暙を䜿甚しお運甚しおみおください。

ビゞネス党䜓がブラりザヌの XNUMX ぀のボタンである堎合、ボタンがクリックされお適切に機胜するかどうかを監芖する必芁がありたす。 残りはすべお問題ありたせん。

これを持っおいない堎合は、私たちが行ったように、アプリケヌション ログや Nginx ログなどで情報を取埗しおみるこずができたす。 できる限りアプリケヌションの近くにいる必芁がありたす。

オペレヌティング システムの指暙はもちろん重芁ですが、䌁業はそれらに興味を持っおおらず、私たちはそれらに察しおお金を払っおいるわけではありたせん。

出所 habr.com

コメントを远加したす