DUICUO

完了!Grafanaが大規模継続パフォーマンス分析のためのオープンソースデータベースをリリース - Phlare

Grafana Phlareは、継続的なプロファイリングデータを集約するためのオープンソースソフトウェアプロジェクトです。Grafana PhlareはGrafanaと完全に統合されており、他の観測可能なシグナルとの相関分析が可能です。

継続的なプロファイリングとは何ですか?

この概念は貴重です。プロファイリングは、プログラムがどのようにリソースを使用しているかを把握するのに役立ち、ひいてはパフォーマンスとコストの最適化に役立ちます。しかし、分散型クラウドネイティブアーキテクチャへの移行により、このプロセスはさらに複雑化しており、コンピューティングインフラストラクチャ全体でリソース使用状況に関する情報を定期的に自動収集し、圧縮して時系列データとして保存する継続的な分析の必要性が生じています。これにより、時間の経過に伴う変化を視覚化し、関心のある期間に一致するプロファイル(例えば、ピーク使用率時のCPU時間など)を拡大表示できます。

継続的分析は、それがもたらす価値の観点から、可観測性の 4 番目の柱 (メトリック、ログ、トレースの後) であると考えられています。

Grafana Labsでは、Grafana Cloudを支えるソフトウェア(Grafana Loki、Grafana Mimir、Grafana Tempo、Grafanaなど)のパフォーマンスを把握するために、継続的な分析の活用を検討し始めました。例えば、Mimirで遅いクエリをページングする場合、分析を使用することで、Mimirのコードベース内でそのクエリが最も時間がかかっている場所を把握できます。Grafanaがメモリ不足エラーで繰り返しクラッシュしている場合は、メモリプロファイルを調べて、クラッシュ前にどのオブジェクトが最も多くのメモリを消費していたかを確認します。

継続的分析データの保存とクエリに利用できるオープンソースプロジェクトはいくつかありますが、私たちは調査を重ねた結果、Grafana Labsが求めるレベルの継続的分析をサポートするために必要なスケーラビリティ、信頼性、そしてパフォーマンス要件を満たすプロジェクトを見つけるべく尽力しました。全社規模のハッカソンでは、エンジニアチームがプロジェクトを主導し、メトリクス、ログ、トレースに接続したデータ分析の価値を実証しました。これにより、あらゆる環境に継続的分析を展開したいという私たちの思いがさらに高まりました。

そのため、私たちは、他のオープンソースの可観測性バックエンドである Loki、Tempo、Mimir を成功に導いた設計原則、つまり水平にスケーラブルなアーキテクチャとオブジェクト ストレージの使用に基づいて、テレメトリの継続的な分析のためのデータベースを作成することにしました。

コア機能

Grafana Phlareは、水平スケーラブルで高可用性、長期保存、そして分析データクエリ機能を提供します。Prometheusと同様に、単一のバイナリファイルだけで簡単にインストールでき、追加の依存関係は不要です。Phlareはオブジェクトストレージを使用するため、大きなコストをかけずに必要なすべての履歴データを保存できます。ネイティブのマルチテナント機能と分離機能により、複数の独立したチームや事業部門が単一のデータベースを実行できます。Grafana Phlareのコア機能は次のとおりです。

  • インストールが簡単:モノリシックモードを使用すると、Grafana Phlareは単一のバイナリファイルだけで起動・実行でき、他の依存関係は必要ありません。Kubernetesでは、Helm Chartsを使用して様々なデプロイメントモードを実現できます。
  • 水平スケーラビリティ: Grafana Phlare は複数のマシンで実行できるため、ワークロードによって生成される分析の量を処理するためにデータベースを簡単に拡張できます。
  • 高可用性:Grafana Phlareは、受信したプロファイルファイルを複製することで、マシン障害発生時でもデータ損失を防ぎます。つまり、プロファイルファイルの取り込みと分析を中断することなく、ロールアウトを実行できます。
  • 安価で耐久性の高いプロファイルファイルストレージ:Grafana Phlareは、長期データストレージにオブジェクトストレージを採用しています。このユビキタスでコスト効率が高く、耐久性の高いテクノロジーを活用できます。AWS S3、Google Cloud Storage、Azure Blob Storage、OpenStack Swift、そしてS3と互換性のあるあらゆるオブジェクトストレージシステムなど、様々なオブジェクトストレージ実装と互換性があります。
  • ネイティブ マルチテナント: Grafana Phlare のマルチテナント アーキテクチャにより、別々のチームまたはビジネス ユニットからデータとクエリを分離し、これらのグループが同じデータベースを共有できるようになります。

建築

Grafana Phlareはマイクロサービスベースのアーキテクチャを採用しており、複数の水平スケーラブルなマイクロサービスが個別に、また並列に実行可能です。これらのマイクロサービスはコンポーネントと呼ばれます。Grafana Phlareは、すべてのコンポーネントコードを単一のバイナリファイルにコンパイルするように設計されています。`-target`パラメータは、Grafana Lokiと同様に、単一のバイナリファイルがどのコンポーネントとして実行されるかを制御します。迅速な操作を求めるユーザー向けに、Grafana Phlareはモノリシックモードで実行することもできます。モノリシックモードでは、すべてのコンポーネントが単一プロセスで同時に実行されます。

Grafana Phlareのほとんどのコンポーネントはステートレスであり、プロセスの再起動間でデータを保持する必要がありません。一部のコンポーネントはステートフルであり、プロセスの再起動間のデータ損失を防ぐために、データ損失が発生しにくいストレージに依存しています。Grafana Phlareは、Distributor、Ingester、Querierという、相互作用してクラスターを形成する一連のコンポーネントで構成されています。

単一ユニットモード

モノリシックモードは、必要なすべてのコンポーネントを単一プロセスで実行し、デフォルトの動作モードです。「-target=all」パラメータを指定することで設定できます。モノリシックモードはGrafana Phlareをデプロイする最も簡単な方法であり、すぐに使い始めたい場合や開発環境でGrafana Phlareを使用したい場合に非常に便利です。「-target」を「all」に設定した場合に実行されているコンポーネントのリストを確認するには、「-modules」フラグを指定してGrafana Phlareを実行してください。

 ./phlare -モジュール

マイクロサービスモデル

マイクロサービスモデルでは、コンポーネントは複数のプロセスにまたがってデプロイされます。スケーリングはコンポーネントごとに行われるため、スケーリングの柔軟性が向上し、障害ドメインの細分化が可能になります。マイクロサービスモデルは本番環境へのデプロイに適したアプローチですが、最も複雑でもあります。

マイクロサービスモードでは、各Grafana Phlareプロセスが呼び出され、その-targetパラメータが特定のGrafana Phlareコンポーネント(例:-target=ingester、-target=distributor)に設定されます。動作するGrafana Phlareインスタンスを取得するには、必要な各コンポーネントをデプロイする必要があります。マイクロサービスモードでGrafana Phlareをデプロイする場合は、Kubernetesを強くお勧めします。

展開する

ここでは、使用可能な Kubernetes クラスターがあり、kubectl と helm が構成されていることを前提に、Helm Chart メソッドを使用して Kubernetes クラスターにデプロイします。

まず、phlare-test という名前の名前空間を作成し、この名前空間内にアプリケーション全体をデプロイします。

 ☸ ➜ kubectl で名前空間 phlare-test を作成します

次に、Phare の Helm Chart リポジトリを追加します。

 ☸ ➜ helm リポジトリ追加 grafana https://grafana.github.io/helm-charts
☸ ➜ helm リポジトリの更新

次に、Helm を使用してインストールします。

デフォルトの単一ユニット方式を使用してインストールする場合は、ワンクリック インストールのために次のコマンドを実行するだけです。

 ☸ ➜ helm -n phlare-test install phlare grafana/phlare

Grafana Phlareをマイクロサービスモードでインストールする場合は、まず公式ドキュメントで提供されているデフォルト値の設定ファイルを取得します。

 # マイクロサービスのデフォルト設定を収集します ☸ ➜ curl -LO values-micro-services.yaml https://raw.githubusercontent.com/grafana/phlare/main/operations/phlare/helm/phlare/values-micro-services.yaml
☸ ➜ cat values-micro-services.yaml
# phlareのデフォルト値。
# これは YAML 形式のファイルです。
# テンプレートに渡される変数を宣言します。
フレア:
コンポーネント:
質問者:
種類: デプロイメント
レプリカ数: 3
リソース:
制限:
メモリ: 1Gi
リクエスト:
メモリ: 256MB
CPU: 100m
卸売業者:
種類: デプロイメント
レプリカ数: 2
リソース:
制限:
メモリ: 1Gi
リクエスト:
メモリ: 256MB
CPU: 500m
エージェント:
種類: デプロイメント
レプリカ数: 1
リソース:
制限:
メモリ: 512Mi
リクエスト:
メモリ: 128MB
CPU: 50分
摂取する:
種類: ステートフルセット
レプリカ数: 3
リソース:
制限:
メモリ: 12Gi
リクエスト:
メモリ: 6Gi
CPU: 1

ミニオ:
有効: true

Grafana Phlareをインストールするには、上記の値ファイルを使用する必要があります。クラスターの実際の状況に応じて設定を調整することもできます。例えば、ingesterで設定されているリソース要求は、memory: 6Gi、cpu: 1です。私のクラスターのリソースは不足しているので、少し減らし、レプリカ数を一時的に1に設定することができます(テスト目的のみ)。そうしないと、スケジューリングが成功しません。

次に、次のコマンドを使用してインストールを開始します。

 ☸ ➜ helm -n phlare-test アップグレード --install phlare grafana/phlare -f values-micro-services.yaml
リリース「phlare」は存在しません。インストール中です。
名前: phlare
最終デプロイ日時: 2022年11月3日(木) 14:37:38
名前空間: phlare-test
ステータス: 展開済み
改訂: 1
テストスイート: なし
注記:
Grafana Phlare を導入していただきありがとうございます。
Phlare データソースを使用するように Grafana を構成するには、Phlare データソースを Grafana インスタンスに追加する必要があります。
クラスター内クエリ URL は次のとおりです。
http://phlare-querier.phlare-test.svc.cluster.local.:4100
クエリ API をローカルホストに転送するには、次を使用します。
kubectl --namespace phlare-test ポートフォワード svc/phlare-querier 4100:4100

デプロイ後、Pod のステータスが正常かどうかを確認します。

 ☸ ➜ kubectl get pods -n phlare-test
名前 準備完了 ステータス 再起動 年齢
phlare-agent-56986dd4b9-4s6z6 1/1 実行中 0 3分23秒
phlare-distributor-7447b4c6c5-f4rjw 1/1 実行中 0 3分23秒
phlare-ingester-0 1/1 ランニング 0 3分23秒
phlare-minio-0 1/1 ランニング 0 3分23秒
phlare-querier-8cdf986c-hhn29 1/1 ランニング 0 3分23秒

すべてのポッドが実行中または完了状態になると、デプロイは完了します。

使用

次に、Grafana を設定してプロファイルデータをクエリします。ここでは、Phlare がインストールされているのと同じ Kubernetes クラスターに Grafana をインストールします。これは 1 つのコマンドで実行できます。

 ☸ ➜ helm テンプレート -n phlare-test grafana grafana/grafana \
--set image.repository=aocenas/grafana \
--set image.tag=profiling-ds-2 \
--set env.GF_FEATURE_TOGGLES_ENABLE=flameGraph \
--env.GF_AUTH_ANONYMOUS_ENABLED=true を設定します \
--set env.GF_AUTH_ANONYMOUS_ORG_ROLE=管理者 \
--env.GF_DIAGNOSTICS_PROFILING_ENABLED=true を設定します \
--env.GF_DIAGNOSTICS_PROFILING_ADDR=0.0.0.0 を設定します \
--env.GF_DIAGNOSTICS_PROFILING_PORT=6060 を設定します \
--set-string 'podAnnotations.phlare\.grafana\.com/scrape=true' \
--set-string 'podAnnotations.phlare\.grafana\.com/port=6060' > grafana.yaml
☸ ➜ kubectl apply -f grafana.yaml

デプロイ後、phrare-test 名前空間全体の Pod のリストは次のようになります。

 ☸ ➜ kubectl get pods -n phlare-test
名前 準備完了 ステータス 再起動 年齢
grafana-5ff87bdfd-whmkm 1/1 ランニング 0 85 秒
phlare-agent-56986dd4b9-4s6z6 1/1 実行中 0 9分17秒
phlare-distributor-7447b4c6c5-f4rjw 1/1 実行中 0 9分17秒
phlare-ingester-0 1/1 ランニング 0 9分17秒
phlare-minio-0 1/1 ランニング 0 9分17秒
phlare-querier-8cdf986c-hhn29 1/1 ランニング 0 9分17秒

次のコマンドを使用して、Grafana サービスをローカルに転送できます。

 ☸ ➜ kubectl port-forward -n phlare-test サービス/grafana 3000:80

次に、ブラウザで http://localhost:3000 を開いて Grafana サービスにアクセスします。

ページの左側で、[構成] -> [データ ソース] をクリックしてプロファイルのデータ ソースを追加し、phlare タイプのデータ ソースを選択します。

データ ソース URL を http://phlare-querier.phlare-test.svc.cluster.local.:4100/ に設定します。

「Save & Test」をクリックして変更を保存します。データソースを追加すると、Grafana Explorerでプロファイルファイルが表示されるはずです。使い方はLokiやPrometheusとほぼ同じです。以下に示すように、GrafanaアプリケーションのCPU使用率を照会できます。

PhlareはGrafanaとネイティブに統合されているため、プロファイルデータをメトリクス、ロギング、トレースと並べて可視化し、スタック全体を包括的に把握できます。また、Grafanaにフレームグラフパネルを追加し、Grafanaで可視化された数百もの異なるデータソースのデータと分析結果を表示するダッシュボードを構築できるようになりました。

Phare の Helm Charts はデフォルトの設定を使用し、エージェントは正しいアノテーションが付与されている限り Pod を取得します。この機能は relabel_config と kubernetes_sd_config を使用します。これらは Prometheus や Grafna エージェントの設定に似ている可能性があります。

Phlare がポッドをクロールできるようにするには、ポッドに次の注釈を追加する必要があります。

メタデータ:
注釈:
phlare.grafana.com/scrape: 「true」
phlare.grafana.com/ポート: "8080"

`phlare.grafana.com/port` は、ポッドが `/debug/pprof/` エンドポイントを提供するために使用するポートに設定する必要があります。`phlare.grafana.io/scrape` と `phlare.grafana.io/port` の値は、文字列として表現されるように二重引用符で囲む必要があることに注意してください。

Grafanaのインストール時にこれら2つのアノテーションを設定したので、Phlareを使用してGrafanaアプリケーションからプロファイルデータを継続的に取得できます。これにより、上記のGrafanaプロファイルデータをフィルタリングすることができました。

参考リンク

  • https://github.com/grafana/phlare.
  • https://grafana.com/blog/2022/11/02/announce-grafana-phlare-oss-continuous-profiling-database/.