プロメテりス

すべおに良い。 私たちはここでコヌスの準備の䞀環ずしお぀たずいた非垞に興味深い蚘事を共有しおいたす。 翻蚳はそのたたですいく぀かのコメントを陀く。



背景



䞀蚀で蚀えば-信念の監芖ず魅力に぀いおの玹介。 倚くの人が知っおいるように、分散システムを監芖するためのむベントフロヌ凊理ツヌルであるリヌマンに同行したす。 監芖に関する私の本では 、リヌマンを新しい監芖手法ずパタヌンを調査するための䞻芁なツヌルずしお䜿甚し、プッシュモデルを䜿甚したホワむトボックス監芖遞択的ブラックボックス監芖のアヌキテクチャに぀いお説明したした。



私が話しおいるこずを理解するために、いく぀かの抂念を説明したす。 ブラックボックスモニタリングは、サヌビスたたはアプリケヌションの倖郚特性をチェックする圹割を果たしたす。サヌビスの開いおいるポヌトに接続するこず、正しいデヌタたたは応答コヌドが返されるこずは可胜ですか。 ブラックボックス監芖の䟋は、ICMP芁求ず応答の確認です。



ホワむトボックスモニタリングは、サヌビスたたはアプリケヌション内で発生しおいるこずに焊点を圓おたす。 適切なツヌルを備えたアプリケヌションは、それ自䜓たたは内郚コンポヌネントの状態、トランザクションたたはむベントの結果を返したす。 このデヌタは、「アプリケヌションの動䜜」ずいう質問ではなく、「アプリケヌションの動䜜」ずいう質問に回答したす。 ホワむトボックス監芖は、むベント、ログ、たたはメトリックを特別な監芖ツヌルに転送するか、監芖ツヌルによるその埌の収集のために情報を倖郚に提䟛したす。



最新の監芖に携わるほずんどの人は、ホワむトボックス監芖に倧芏暡な投資が必芁であるこずを理解しおいたす。 アプリケヌション内から取埗された情報は、衚面䞊で取埗された情報よりも、ビゞネスおよび運甚にずっお非垞に䟡倀がありたす。 これは、ブラックボックスの監芖がリ゜ヌスの浪費であるこずを意味するものではありたせん。 サヌビスずアプリケヌションの倖郚監芖は、特に制埡できないサヌビスや、倖郚から芋た堎合、たずえばルヌティングやDNSの問題など、内郚からアクセスできないコンテキストを提䟛する堎合に圹立ちたす。



この本では、プルではなくプッシュモデルでの䜜業に焊点を圓おおいたす。 たた、この本では、プルモデルよりプッシュモデルベヌスの監芖の利点に倚くの泚意が払われおいたす。 倚くのほずんどではないにしおも監芖システムは、プル/ポヌリングモデルに基づいお特別に構築されおいたす。 このモデルでは、システムは監芖するサヌビスたたはアプリケヌションをポヌリングしたす。 次に、プッシュモデルでは、アプリケヌションずサヌビス自䜓がデヌタを監芖システムに送信したす。



倚くの理由その䞀郚は䞀芋しお明らかではありたせんのため、私はプッシュモデルを奜みたす。 しかし、䞡方のアプロヌチの機胜は、倚くの理由でたずえば、芏暡の理由で実装に干枉したせん。 そしお、成功の可胜性は、実装たたはツヌルに関する玛争に䟝存したせん。 たず第䞀に、ツヌルはあなたに適しおいるべきであり、トレンドや独断䞻矩を軜率に远うこずは意味がありたせん。



プルモデルに基づいた䞻芁な監芖ツヌルの1぀であるプロメテりスの入門チュヌトリアルを曞くようになったきっかけは、カテゎリに属さないずいう欲求ず、コミュニティによる違いの理解の欠劂でした。 特にコンテナずKubernetesの䞖界では非垞に人気がありたす。



プロメテりスの玹介



Prometheusは、以前Googleで働いおいたSoundcloud゚ンゞニアによっお開発されたした。 Goで曞かれおおり、オヌプン゜ヌスであり、 Cloud Native Computing Foundationのサポヌトで開発されおいたす。 このプロゞェクトのむンスピレヌションは、GoogleのBorgmonでした。



プロメテりスはホワむトボックス監芖に焊点を圓おおいたす。 アプリケヌションおよびサヌビスから取埗した時系列デヌタを収集したす。 アプリケヌションは、このデヌタを単独で、たたぱクスポヌタヌず呌ばれるプラグむンを介しお提䟛したす。



Prometheusプラットフォヌムは、時系列デヌタを収集および保存するサヌバヌに基づいおいたす。 メタデヌタのラベルず呌ばれるメトリック名ずキヌ/倀のペアを組み合わせた倚次元時系列モデルがありたす。 時系列デヌタはサヌバヌに保存され、個々のサヌバヌは自埋的であり、分散ストレヌゞから独立しおいたす。



プラットフォヌムには、クラむアントラむブラリず、特定の機胜ずコンポヌネントの倚数の゚クスポヌタヌも含たれおいたす。 たずえば、StatsD゚クスポヌタヌは、時系列のStatsDデヌタをPrometheus圢匏に倉換したす。 さらに、少量の着信デヌタを受信するためのプッシュゲヌトりェむず、トリガヌによっお䜜成された通知を凊理できるアラヌトマネヌゞャヌ、たたはPrometheusによっお収集されたデヌタのしきい倀を超えた堎合にアラヌトマネヌゞャヌがありたす。



より詳现なアヌキテクチャに぀いおは、Prometheusのドキュメントをご芧ください。



蚭眮



プロメテりスサヌバヌ-同じ名前のプロメテりスのバむナリファむル。 最新バヌゞョンを取埗しお解凍したす。



$ wget https://github.com/prometheus/prometheus/releases/download/v1.8.0/prometheus-1.8.0.darwin-amd64.tar.gz $ tar -xzf prometheus-*.tar.gz $ cd prometheus-1.8.0.darwin-amd64/
      
      





公匏Webサむトは、さたざたな远加コンポヌネントもホストしおいたす。通知を送信するためのアラヌトマネヌゞャヌず、さたざたなサヌビスの゚クスポヌタヌです。



カスタマむズ



解凍したばかりのプロメテりスバむナリファむルは、YAMLファむルを介しお蚭定されたす。 それが䜕であるか芋おみたしょう



 global: scrape_interval: 15s evaluation_interval: 15s external_labels: monitor: 'codelab-monitor' rule_files: # - "first.rules" # - "second.rules" scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090']
      
      





この構成ファむルでは、3぀のYAMLブロックが定矩されおいたす。



グロヌバル

最初のグロヌバルブロックには、サヌバヌの動䜜を制埡するためのグロヌバル蚭定が含たれおいたす。



scrape_intervalは、アプリケヌションたたはサヌビスのポヌリング間隔を蚭定したす。この䟋では15秒です。 これは、デヌタスケヌルの解像床、぀たり各デヌタポむントがカバヌする期間です。



evaluation_intervalは、ルヌルに埓っおデヌタを凊理する頻床をPrometheusに䌝えたす。 ルヌルには、蚘録ルヌルずアラヌトルヌルの2぀の䞻なタむプがありたす。 蚘録ルヌルを䜿甚するず、頻繁に䜿甚されるリ゜ヌス集玄型の匏を事前蚈算し、結果を新しい時系列デヌタずしお保存できたす。 アラヌトルヌルを䜿甚するず、アラヌトの条件を決定できたす。 プロメテりスは15秒ごずにこれらの状態を再チェックしたす。



External_labelsには、たずえばアラヌトが生成されたずきにサヌバヌ䞊に存圚するメトリックに远加されるラベルのキヌ/倀のペアのリストが含たれたす。



ルヌルファむル

2番目のブロック-rule_filesには、蚘録たたは譊告のルヌルを含むファむルのリストが含たれおいたす。



調査構成

最埌のscrape_configsブロックには、Prometheusがポヌリングするすべおの目暙が衚瀺されたす。 プロメテりスは目暙むンスタンスを呌び出し、むンスタンスグルヌプはゞョブを呌び出したす。 デフォルトでは、プロメテりスずいう1぀のタスクのみがありたす。 その䞭に、むンスタンスのリストを持぀static_configがありたすデフォルトでは、Prometheusサヌバヌは1぀だけです。 localhostポヌト9090をポヌリングしお、サヌバヌ自䜓の状態メトリックを取埗したす。 メトリックは/メトリックであるず想定されるため、ロヌカルホストアドレスはロヌカルにポヌリングされたす9090 /メトリック。 パスは、metric_pathオプションを䜿甚しお倉曎できたす。



孀独なタスクは退屈なので、もう1぀远加しおロヌカルDockerデヌモンをポヌリングしたす。 Docker ドキュメントの手順を䜿甚しお、localhost9323 / metricsからメトリックを返すようにデヌモンを構成したす。 その埌、dockerずいう別のタスクを远加したす。



 - job_name: 'docker' static_configs: - targets: ['localhost:9323']
      
      





ゞョブには、名前ず、Dockerデヌモンメトリックスを受信するためのアドレスを参照するむンスタンスがありたす。 デフォルトのパスは再び/メトリックです。



完党な蚭定ファむルはこちらにありたす 。



サヌバヌ起動



サヌバヌを起動しお、䜕が起こるか芋おみたしょう。



 $ ./prometheus -config.file "prometheus.yml"
      
      





バむナリファむルを実行し、コマンドラむンフラグ-config.fileで構成ファむルを指定したす。 これで、Prometheusサヌバヌが実行され、prometheusおよびdockerゞョブのむンスタンスをポヌリングし、結果を返したす。



ダッシュボヌド



Prometheusには、結果を確認できる組み蟌みのむンタヌフェむスがありたす。 これを行うには、 http// localhost9090 / graphをブラりザヌで開きたす 。







[カヌ゜ルにメトリックを挿入]をクリックするず、収集されたメトリックの1぀を遞択できたす。 HTTPリク゚ストを芋おみたしょう。 これを行うには、メトリックhttp_requests_totalを遞択しお、「実行」をクリックしたす。







芁玠ず倀のリストが衚瀺されたす。次に䟋を瀺したす。



 http_requests_total{code="200",handler="prometheus",instance="localhost:9090",job="prometheus",method="get"}
      
      





これらの芁玠は、远加のディメンションで区切られたメトリックですメトリックラベルで提䟛されたす。 たずえば、http_requests_totalメトリックには、リク゚ストを生成するプロセスに関する情報を含むハンドララベルがありたす。 これらのラベルのいずれかを含む特定のメトリックを遞択するず、メトリックのリストを枛らすこずができたす。

Prometheusサヌバヌに組み蟌たれおいる匏蚀語の柔軟性により、メトリックの怜玢ず集蚈が簡単になりたす。







ハンドラヌラベルを䜿甚しお、プロメテりスハンドラヌのみのメトリックを遞択したした。

さらに、HTTP芁求のメトリックを集玄したす。 5分以内にHTTPリク゚ストの数をタスク別に分類する必芁があるずしたしょう。 これを行うには、リク゚ストを明確にしたす。



 sum(rate(http_requests_total[5m])) by (job)
      
      





[実行]をクリックしお、ク゚リを実行したす。







さらに、[グラフ]タブを遞択するず、結果グラフを衚瀺できたす。







その䞊に、過去5分間のHTTPリク゚ストの総数がタスクごずにグルヌプ化されお衚瀺されたす。



これらのク゚リを蚘録ルヌルずしお保存し、このルヌルから新しいメトリックを自動的に実行および䜜成できるようにしたす。



これを行うには、ファむルをrule_filesブロックに远加したす。



 rule_files: - "first.rules" # - "second.rules"
      
      





そしお、first.rulesファむルに次のルヌルを蚘述したす。



 job:http_requests_total:sum = sum(rate(http_requests_total[5m])) by (job)
      
      





これにより、新しいゞョブが䜜成されたすhttp_requests_total各ゞョブの合蚈メトリック。







これで、メトリックからグラフを䜜成し、ダッシュボヌドに远加できたす。



アラヌト



集玄のような譊告はルヌルベヌスです。 譊告ルヌルを远加するには、別のファむルをrule_filesブロックに登録する必芁がありたす。



 rule_files: - "first.rules" - "second.rules"
      
      





second.ruleファむルで、むンスタンスが萜ちたずきに通知する新しいルヌルを䜜成したす。 これを行うために、収集に暙準メトリックの1぀を䜿甚したす。upは状態メトリックであり、その倀は、ポヌリングが成功した堎合は1、ポヌリングが倱敗した堎合は0です。



ルヌルファむルにアラヌトルヌルを远加したす。 次のようになりたす。



 ALERT InstanceDown IF up == 0 FOR 5m LABELS { severity = "moderate" } ANNOTATIONS { summary = "Instance {{ $labels.instance }} down", description = "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.", }
      
      





アラヌトルヌルは条件付きリク゚ストに少し䌌おいたす。 InstanceDownずいう名前ず䞀連のルヌルを指定したす。 InstanceDownアラヌトは、アップメトリックが0の堎合぀たり、メトリックの収集が倱敗した堎合、5分間トリガヌされたす。 アラヌトにラベルを远加したした重倧床=䞭぀たり、重倧床=䞭および泚釈。 泚釈を䜿甚するず、むベントの説明など、より倚くの情報をアラヌトに远加できたす。 アノテヌションには{{}}が含たれおいたす-Goでの暙準化のための括匧で、倉数が登録されおいたす。 そのため、 テンプレヌトを䜿甚しおアラヌトをカスタマむズできたす。 この堎合、$ labels倉数にはメトリックラベルが含たれたす。たずえば、$ labels.instanceはむンスタンス名を返し、$ labels.jobはゞョブの名前などを返したす。



Dockerデヌモンを停止しおから5分埌、Prometheusはアラヌトを起動し、 Alertmanagerマネヌゞャヌにメッセヌゞを送信したす Alertmanagerマネヌゞャヌは、最初に個別にむンストヌルしお実行するか、 Alerta toolなどの他のツヌルを䜿甚する必芁がありたす 。 珟圚の通知は、[アラヌト]タブのダッシュボヌドで確認できたす。



おわりに



Prometheusは、むンストヌルず蚭定が簡単な優れたプラットフォヌムです。 蚭定はYAMLで説明されおおり、コヌドずしおのむンフラストラクチャIaCアプロヌチの䜿甚を簡玠化したす。 スタンドアロンサヌバヌのおかげで、単玔な環境を簡単に監芖できたす。 残念ながら、より耇雑な環境の倚くの䟋を芋぀けるこずができなかったため、最適な方法を芋぀けるために実隓ずさたざたなアプロヌチに時間を費やす䟡倀がありたす。



デヌタモデルは非垞に柔軟性があり、特に印象的なのは、メトリックのラベル付けず怜玢が容易であるこずです。 私はほずんどのクラむアントラむブラリずいく぀かの゚クスポヌタヌに䌚いたした。 ツヌルを䜜成し、メトリックを生成するこずはそれほど困難ではありたせん。



組み蟌みのむンタヌフェむスはクリヌンで゚レガントであり、ク゚リ蚀語ず䞀緒に、リ゜ヌスのデバッグたたはスケゞュヌリングに適したツヌルのように芋えたす。 蚘録ルヌルは、メトリックの集蚈に適しおいたす。



ストレヌゞ、セキュリティ、サヌバヌ怜出、その他の利甚可胜な統合を少し研究したした。可胜性は包括的に芋えたす。 GitHubをすばやく怜玢するず、ツヌル、統合、およびサンプルの印象的なセットが瀺されおおり、これは間違いなく開始に十分なはずです。



メむンプラットフォヌムには十分なドキュメントがありたすが、䞀郚の関連プロゞェクトではかなり混chaずしお䞍完党です。 Prometheusの知識が限られおいおも、わずか1時間で動䜜する構成を䜜成できたした。



初期化スクリプトやパッケヌゞ化スクリプトなしで単䞀のバむナリファむルを配垃するこずは、すぐに䜿甚できる゜リュヌションずは蚀えたせんが、それでも倚くのプロゞェクトで有効な゜リュヌションです。 たた、䜿甚できる構成管理システムにはさたざたな準備スクリプトがありたす。 ただし、Prometheusのようなほずんどの研究ツヌルは、むンストヌルを単独で凊理する可胜性が高くなりたす。 コンテナずKubernetesのサポヌトは、これらのツヌルを䜿甚しおいる人々にずっお魅力的です。 たた、マむクロサヌビスず動的たたはクラりドスタックの研究者は、サヌバヌの自埋性ず移怍性に関心を持぀でしょう。



監芖を実装する必芁があるプロゞェクトがある堎合は、Prometheusをお勧めしたす。 アクティビティにDockerやKubernetesなどのコンテナやツヌルが関係しおいる堎合も、時間をかける䟡倀がありたす。 柔軟性があるため、他の既存のプラットフォヌムよりもはるかに優れたツヌルやアヌキテクチャに適しおいたす。



PSこの投皿のむンスピレヌションは、Cindy Sridharanによっお曞かれたCloud Nativeの時代のMonitoringでした。 シンディありがずう



終わり



圹に立぀こずを願っおいたす。



All Articles