PyroscopeでContinuous Profiling

アプリケーション

概要

PyroscopeというContinous Profilingのツールを導入してみた。

Continous Profilingについてはこちら参照。 What is continuous profiling?

今年に入ってからGrafanaが買収したらしい。

Grafana Labs が Pyroscope を買収してコード プロファイリング機能を追加

買収してからは、Grafana Pyroscopeが正式名称?ぽい。

Grafanaにプラグインが用意されているので連携することもできるが、Pyroscope単体にもUIが用意されている。

Demoが用意されているので触ってみると何が見れるか分かりやすいかも。

OSSとしてコードが公開されているので実装が気になる場合は見に行くこともできる。

grafana/pyroscope

導入

構成について先に目を通しておくと良い。

Pyroscope Agent

1. Pyroscope Serverの導入

DockerHubにイメージがプッシュされているのでこちらを利用することができる。

pyroscope/pyroscope

Dockerの導入ガイドはこちら。

Docker Guide

Kubernetesの導入ガイドもある。

Kubernetes/Helm

2. アプリケーション側でプロファイリングの有効化

アプリケーション側でプロファイリングの設定およびエージェントのインストール。

基本はPush型での対応になるが、Goの場合はPull型の対応があり、Pyroscopeサーバーでターゲットの管理ができる。

Go Pull Mode

GoでPull型で導入する場合は、次のようにターゲットを管理することができる。

---
scrape-configs:
  - job-name: pyroscope
    scrape-interval: 60s
    enabled-profiles: [cpu, mem, goroutines, mutex, block]
    static-configs:
      - application: foo
        spy-name: gospy
        targets:
          - foo:80
      - application: bar
        spy-name: gospy
        targets:
          - bar:81

ここでは設定していないが、データ保持期間は設定したほうが良さそう。デフォルトでは無制限に保持するらしい。 cf. Data retention

サンプルコード

examplesに色々例が用意されている。

自分の管理しているアプリケーションで導入した例は下記。

gobel-example

ハマったところ

パスワード認証の初期設定

PyroscopeにはAPI KEYやOAuth2、パスワード認証の仕組みが用意されている。

パスワード認証で初期の認証情報設定をする際にドキュメントを読み違えて少しハマった。

初期の認証情報をセットするには次のような感じで設定ファイルに記載する。

auth:
  internal:
    admin:
      name: USERNAME
      password: PASSWORD
    enabled: true

ちゃんと読むとconfiguring-built-in-admin-userのところで記載があるのだが、CLIでしか設定変更できないものだと勘違いしてムダにハマってしまった...。

pprof

Pyroscope側の話ではなく、Goのアプリケーション側の話だが、pprofの設定でハマった。

それについてはDefaultServeMux以外でpprofを使う方法に記事を書いたのでそちらを参照。

所感

OSSで利用できるプロファイルングツールを以前から探し求めていたのだが、Pyroscopeは導入がしやすく、使いやすいUIが用意されていて良さそう。GoならPull型も対応していて良い。