コンテンツにスキップ

Flameshot

Flameshot は、Sidecar パターンで動作する軽量な自動パフォーマンスプロファイリングツールです。対象プロセスのリソース使用状況(CPU/メモリ)を監視し、あらかじめ設定した閾値に達すると、async-profiler などの低レベル Profiler を自動的に起動して、非侵襲で現場スナップショットを収集します。


コア機能と仕組み

動作モード

Flameshot は Sidecar コンテナ モードでデプロイします。業務用のメインコンテナ(Main Container)と同じ Pod 内で実行し、PID 名前空間の共有 を有効にする必要があります。

  1. 監視 (Monitor):Flameshot はメインコンテナ内の対象プロセスのリソース水位を継続的にポーリングします。
  2. トリガー (Trigger):閾値(例: CPU > 80%)に達するか、HTTP API リクエストを受けると、収集タスクを起動します。
  3. 実行 (Execute):設定された言語タイプ(現時点では Java と Go をサポート)に応じて、対応する Profiler ツールを呼び出して対象プロセスを収集します。
  4. 収集 (Collect):生成された Profile ファイル(例: .jfr または .pprof)をオブザーバビリティセンターへアップロードします。
  5. 定時: FLAMESHOT_AUTO_PROFILING を設定すると、条件に合致した全プロセスを定期的に 1 回ずつ Profiling します。収集時間の既定値は 30s で、FLAMESHOT_AUTO_PROFILING_DURATION で調整できます。
  6. OOM 要約: コンテナの oom_kill 増分を検知すると、Flameshot は対象 Java プロセスの起動引数から -XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=... を自動解析します。dump ファイルが共有ボリューム内にあり、生成に成功した場合、Flameshot は対応する .hprof を見つけて要約ログを 1 件アップロードします。

適用シーン

  • 本番環境の保険:サービスが CPU 急上昇やメモリリークで落ちる直前に、現場証跡を自動で保持します。
  • 性能負荷試験の分析:負荷試験基盤と組み合わせ、高負荷時の性能ホットスポットを自動収集します。

設定の詳細

Flameshot のすべての挙動は環境変数で制御します。設定は グローバル設定収集ポリシー の 2 つに分かれます。

グローバル環境変数

これらの変数は Sidecar コンテナの基本動作を制御します。

変数名 必須 既定値 説明
FLAMESHOT_DATAKIT_ADDR はい - DataKit の Profiling データ受信エンドポイントのアドレス。
FLAMESHOT_PROFILING_PATH はい /data 共有ディレクトリのパス。ツールライブラリと生成された一時ファイルを格納するために使用し、メインコンテナのマウントと一致している必要があります。
FLAMESHOT_MONITOR_INTERVAL いいえ 1 監視ポーリング間隔(秒)。
FLAMESHOT_LOG_LEVEL いいえ info ログレベル。debug, info, warn, error から選択可能。
FLAMESHOT_HTTP_LOCAL_IP はい - Sidecar 自身の HTTP サービスの待受アドレス。
FLAMESHOT_HTTP_LOCAL_PORT はい 8089 Sidecar 自身の HTTP サービスの待受ポート。
FLAMESHOT_PROFILING_ENABLED いいえ true JFR Profiling を有効にするかどうか。false にすると、定時・閾値・cgroup 高水位・HTTP 手動 Profiling は無効になりますが、OOM 検知、hprof アップロード、能動的 Heap Dump は維持されます。
FLAMESHOT_AUTO_PROFILING いいえ - 条件に合致した全プロセスを定期的に 1 回ずつ Profiling します。最小値は 1 分以上で、たとえば 5 分は "5m"、1 時間は "1h" と指定します。
FLAMESHOT_AUTO_PROFILING_DURATION いいえ 30s 定期収集モードでの 1 回あたりのサンプリング時間。
FLAMESHOT_OOM_HPROF_ENABLED いいえ false OOM 後の .hprof 要約復旧フローを有効にします。Java プロセスのみに有効で、対象 JVM 側で -XX:+HeapDumpOnOutOfMemoryError を明示的に有効化し、共有ボリューム内の -XX:HeapDumpPath=... を設定している必要があります。リリース設定で明示的に宣言することを推奨します。
FLAMESHOT_OOM_HPROF_MATCH_WINDOW いいえ 2m OOM イベントと .hprof ファイルの更新時刻を照合するウィンドウ。
FLAMESHOT_HPROF_UPLOAD_ENABLED いいえ false 一致した、または能動生成した .hprof をオブジェクトストレージへアップロードするかどうか。
FLAMESHOT_HPROF_UPLOAD_PROVIDER いいえ - オブジェクトストレージ種別。osss3 をサポートします。
FLAMESHOT_HPROF_UPLOAD_ENDPOINT いいえ - OSS/S3 endpoint。
FLAMESHOT_HPROF_UPLOAD_REGION いいえ S3 の既定は us-east-1 S3 region。
FLAMESHOT_HPROF_UPLOAD_BUCKET いいえ - 対象 bucket。
FLAMESHOT_HPROF_UPLOAD_ACCESS_KEY_ID いいえ - オブジェクトストレージ AK。
FLAMESHOT_HPROF_UPLOAD_ACCESS_KEY_SECRET いいえ - オブジェクトストレージ SK。
FLAMESHOT_HPROF_UPLOAD_PATH_TEMPLATE いいえ {service}/{pod_name}/{timestamp}/{filename} オブジェクトパステンプレート。service / pod_name / pod_namespace / host / pid / timestamp / filename などの変数をサポートします。
FLAMESHOT_HPROF_DOWNLOAD_URL_TEMPLATE いいえ - 任意のダウンロードリンクテンプレート。設定すると、イベント内でこのテンプレートに従って hprof_download_url を生成します。
FLAMESHOT_HEAP_DUMP_ENABLED いいえ false メモリ緊急閾値に達した際に、Java Heap Dump を能動的に実行するかどうか。
FLAMESHOT_HEAP_DUMP_PATH_TEMPLATE いいえ {profiling_path}/dumps/{service}_{pod_name}_{pid}_{timestamp}.hprof ローカル Heap Dump の出力パステンプレート。
FLAMESHOT_HEAP_DUMP_JMAP_PATH いいえ jmap jmap 実行ファイルのパス。公式 Sidecar イメージには既定で JVM/JDK は含まれていないため、能動的 Heap Dump を有効にする場合は利用可能な jmap を明示的に用意する必要があります。
FLAMESHOT_HEAP_DUMP_TIMEOUT いいえ 120s Heap Dump コマンドのタイムアウト時間。
FLAMESHOT_HEAP_DUMP_COOLDOWN いいえ 10m 単一プロセスに対する能動的 Heap Dump のクールダウン時間。
FLAMESHOT_POD_MEM_LIMIT いいえ - Pod のメモリ limit。単位は Mi。設定すると、Pod limit ベースでメモリ使用率を計算します。
FLAMESHOT_POD_CPU_LIMIT いいえ - Pod CPU limit。単位は m。設定すると、Pod CPU limit ベースで CPU 使用率を計算します。
FLAMESHOT_SERVICE いいえ - FLAMESHOT_PROCESSESservice を設定しなくても、すべて置換できます。
FLAMESHOT_TAGS いいえ - host pod_name pod_namespace の設定を推奨します。例: "host:host_name,pod_name:pod_a"

DataKit を DaemonSet 方式でデプロイし、hostNetwork/hostPort9529 を公開している場合、Flameshot は通常の Service ドメイン名経由でランダム転送するのではなく、現在の業務 Pod が配置されているノード の DataKit に直接接続することを推奨します。

- name: NODE_IP
  valueFrom:
    fieldRef:
      fieldPath: status.hostIP
- name: FLAMESHOT_DATAKIT_ADDR
  value: "http://$(NODE_IP):9529/profiling/v1/input"

これにより、各業務 Pod は Profile を自身のノード上の DataKit にアップロードするようになり、調査やノードローカル収集の意味論を保ちやすくなります。

収集ポリシー設定 (FLAMESHOT_PROCESSES)

環境変数 FLAMESHOT_PROCESSES で監視対象を定義します。この変数の値は標準的な JSON 配列 文字列である必要があります。

Kubernetes YAML 内で設定の可読性を保つため、JSON 設定は YAML の複数行テキスト構文(|)で記述することを 強く推奨 します。以下の例を参照してください。

    env:
      # ... その他の環境変数 ...
      - name: FLAMESHOT_PROCESSES
        value: |
          [
            {
              "service": "user-service",
              "language": "java",
              "command": "^java.*user-service\\.jar$",
              "duration": "60s",
              "events": "cpu,alloc",
              "cpu_usage_percent": 80,
              "mem_usage_percent": 80,
              "mem_usage_mb": 1024,
              "mem_usage_percent_emergency": 92,
              "mem_usage_mb_emergency": 1536,
              "heap_dump_on_memory_emergency": true,
              "emergency_duration": "10s",
              "tags": [
                "env:prod",
                "version:v1.2"
              ]
            }
          ]

共通フィールドの説明:

  • service (String): オブザーバビリティセンターに報告されるサービス名。
  • language (String): 対象プロセスの言語。現時点では javagogolang をサポートします。
  • command (String): プロセスのコマンドラインに一致する正規表現。
  • duration (String): 1 回あたりの収集時間(例: 30s, 1m)。注意: 実行タイムアウトの制約があるため、5 分を超えないことを推奨します。
  • emergency_duration (String): メモリ緊急閾値に達した後の高速収集時間。10s または 15s の設定を推奨します。
  • pprof_url (String): Go pprof の HTTP アドレス。例: http://127.0.0.1:6060languagego または golang の場合に設定が必要です。
  • pprof_types (List): Go pprof の種類。cpugoroutineheapmutexblock をサポートし、profile 収集器の既存 Go pull モードと整合します。
  • pprof_timeout (String): Go pprof リクエストのタイムアウト時間。duration より長く設定することを推奨します。
  • tags (List): カスタムタグのリスト。envversion などのメタ情報を含めることを推奨します。
  • cpu_usage_percent (Int): CPU トリガー閾値 (0-N)。マルチコア環境では 100 を超える場合があります。
  • mem_usage_percent (Int): メモリ使用率の平均閾値 (0-100)。直近 5 点の平均値でトリガーします。
  • mem_usage_mb (Int): メモリ使用量の平均閾値 (MB)。直近 5 点の平均値でトリガーします。
  • mem_usage_percent_emergency (Int): メモリ使用率の緊急瞬時閾値 (0-100)。単一点で一致すると即時トリガーします。
  • mem_usage_mb_emergency (Int): メモリ使用量の緊急瞬時閾値 (MB)。単一点で一致すると即時トリガーします。
  • heap_dump_on_memory_emergency (Bool): メモリ緊急閾値に達した際、そのプロセス規則で能動的 Heap Dump を許可するかどうか。未設定の場合、FLAMESHOT_HEAP_DUMP_ENABLED=true なら既定で許可されます。
  • cpu_usage_percentmem_usage_percentmem_usage_mb は未設定または 0 の場合、その閾値チェックをスキップします。
  • FLAMESHOT_POD_MEM_LIMIT を設定すると、mem_usage_percentmem_usage_percent_emergency はホスト視点ではなく Pod limit 視点で優先的に計算されます。
  • FLAMESHOT_HEAP_DUMP_ENABLED=true を設定すると、メモリ緊急閾値に達した際に jmap Heap Dump タスクが投入されます。この機能を使うには、Sidecar 内で FLAMESHOT_HEAP_DUMP_JMAP_PATH が指す jmap を実行可能である必要があります。hprof のオブジェクトストレージアップロードも同時に設定している場合、生成された .hprof は継続してアップロードされ、イベントには hprof_object_keyhprof_download_url、およびアップロード状態が含まれます。

言語別ガイド

監視対象アプリケーションの技術スタックに応じて、Flameshot は異なる低レベルツールを呼び出します。

Java Profiling

Java アプリケーション向けに、Flameshot には async-profiler (linux-amd64 / linux-arm64 対応) が内蔵されています。

重要な設定フィールド (FLAMESHOT_PROCESSES):

  • language: 必ず java に設定します。
  • events: cpu (CPU cycles), alloc (メモリ割り当て), lock (ロック競合), cache-misses, nativemem をサポートします。既定値は all です。
  • jdk_version: (任意) メタデータ表示用の JDK バージョン。

注意事項:

  • JVM Safepoint に依存せず、オーバーヘッドは非常に低いです。
  • OOM 後に .hprof 要約ログを自動検出してアップロードしたい場合、業務 JVM 側で -XX:+HeapDumpOnOutOfMemoryError を明示的に有効化し、-XX:HeapDumpPath=... を設定する必要があります。FLAMESHOT_OOM_HPROF_ENABLED=true を設定しただけでは、対象 JVM の起動引数は自動変更されません。
  • FLAMESHOT_HEAP_DUMP_ENABLED=true を有効にすると、Flameshot はメモリ緊急閾値に達した際に jmap -dump:format=b,file=<path> <pid> を実行して .hprof を能動生成します。公式 Sidecar イメージには JVM/JDK は既定で含まれていないため、カスタムイメージ、ツールのマウント、その他の方法で対象 JVM と互換性のある jmap を明示的に用意し、FLAMESHOT_HEAP_DUMP_JMAP_PATH でそのパスを指定する必要があります。
  • HeapDumpPath は、業務コンテナと Flameshot Sidecar が 共通でマウント している共有ディレクトリを指していなければなりません。各プロセスごとに安定して識別可能な dump パスを設定することを推奨します。そうでないと、Flameshot が OOM を検知しても dump ファイルを読み取れません。
  • .hprof 要約復旧に関するスイッチは、暗黙の既定値に頼らず、リリース設定で明示的に宣言することを推奨します。

Go Profiling

Go アプリケーション向けに、Flameshot は業務プロセスが公開している net/http/pprof HTTP インターフェースから .pprof データを取得し、DataKit にアップロードします。

重要な設定フィールド (FLAMESHOT_PROCESSES):

  • language: go または golang に設定する必要があります。
  • pprof_url: 業務プロセスの pprof HTTP アドレス。例: http://127.0.0.1:6060
  • pprof_types: cpugoroutineheapmutexblock をサポートします。
  • duration: cpu profile の収集時間。/debug/pprof/profile?seconds=<duration> にマッピングされます。
  • pprof_timeout: pprof リクエストのタイムアウト時間。duration より長くする必要があります。

Go アプリ側の要件:

import (
    "net/http"
    _ "net/http/pprof"
)

func main() {
    go http.ListenAndServe("127.0.0.1:6060", nil)
}

pprof_url には、Flameshot Sidecar が 実際にアクセス可能な アドレスを指定する必要があります。典型的なケースは 2 つあります。

  • pprof が 127.0.0.1:6060 または 0.0.0.0:6060 で待ち受けている場合: http://127.0.0.1:6060 を設定できます。
  • pprof が Pod IP のみで待ち受けている場合、たとえば 10.x.x.x:6060: Downward API で Pod IP を注入し、http://$(POD_IP):6060 を設定する必要があります。
- name: POD_IP
  valueFrom:
    fieldRef:
      fieldPath: status.podIP
- name: FLAMESHOT_PROCESSES
  value: |
    [
      {
        "service": "go-app",
        "language": "go",
        "command": "^/app/go-app$",
        "pprof_url": "http://$(POD_IP):6060",
        "pprof_types": ["cpu", "goroutine", "heap", "mutex", "block"],
        "duration": "30s",
        "pprof_timeout": "45s"
      }
    ]

設定例:

{
  "service": "go-app",
  "language": "go",
  "command": "^/app/go-app",
  "pprof_url": "http://127.0.0.1:6060",
  "pprof_types": ["cpu", "goroutine", "heap", "mutex", "block"],
  "duration": "30s",
  "pprof_timeout": "45s",
  "tags": ["env:prod", "version:v1"]
}

注意事項:

  • heapmutexblock は delta profile としてアップロードされ、最初のサンプリングはベースラインとして保存され、これらの delta 種別はアップロードされません。
  • mutexblock は既定では有効データを収集しません。業務コード側で runtime.SetMutexProfileFractionruntime.SetBlockProfileRate を明示的に有効化する必要があります。
  • pprof インターフェースは機密性の高いランタイム情報を公開する可能性があるため、Pod 内のローカルアドレスのみに待ち受けさせ、Service やパブリックネットワークへは公開しないことを推奨します。

Python Profiling

予定: py-spy などの非侵襲ツールを統合する予定です。


デプロイガイド

Kubernetes Sidecar デプロイ

Flameshot を正常に動作させるには、Pod 設定が次の 3 条件を満たす必要があります。

  1. プロセス空間の共有 (shareProcessNamespace: true)。
  2. 共有ストレージボリューム (EmptyDir)。
  3. システム権限 (Capabilities)。

YAML 例:

apiVersion: v1
kind: Pod
metadata:
  name: java-app-profiled
spec:
  # 1. [コア] PID 共有を有効化し、Sidecar が Java プロセスを参照できるようにする
  shareProcessNamespace: true

  volumes:
  - name: shared-data
    emptyDir: {}

  containers:
  # 業務コンテナ
  - name: my-app
    image: my-app:latest
    volumeMounts:
    - name: shared-data
      mountPath: /data # Sidecar の設定と一致させる必要があります

  # Flameshot Sidecar
  - name: flameshot
    image: pubrepo.jiagouyun.com/datakit/flameshot:latest
    env:
      - name: FLAMESHOT_PROFILING_PATH
        value: "/data"
      # ... その他の環境変数 ...

    # 2. [コア] ptrace 権限を付与する
    securityContext:
      capabilities:
        add: ["SYS_PTRACE"]

    # 3. [コア] 同じディレクトリをマウントする
    volumeMounts:
    - name: shared-data
      mountPath: /data

DataKit DaemonSet 設定の注意事項

DataKit を DaemonSet 方式でデプロイする場合、Flameshot は現在のノード IP 経由で Profile をアップロードすることを推奨します。

- name: NODE_IP
  valueFrom:
    fieldRef:
      fieldPath: status.hostIP
- name: FLAMESHOT_DATAKIT_ADDR
  value: "http://$(NODE_IP):9529/profiling/v1/input"

同時に、DataKit が次の条件を満たしていることを確認する必要があります。

  1. profile 収集器が有効 であり、Profiling アップロードエンドポイントが登録されていること:

    [[inputs.profile]]
      endpoints = ["/profiling/v1/input"]
    
  2. localhost 以外からの Profiling API アクセスを許可 していること。DataKit で HTTP API のホワイトリストを有効にしている場合は、/profiling/v1/inputENV_HTTP_PUBLIC_APIS に追加してください:

    - name: ENV_HTTP_PUBLIC_APIS
      value: /otel/v1/trace,/otel/v1/metric,/otel/v1/logs,/profiling/v1/input
    

    この変数に他のインターフェースがすでに設定されている場合、既存値を直接上書きせず、末尾に /profiling/v1/input を追加してください。さもないと、次のようになります。

    datakit.publicAccessDisabled: api /profiling/v1/input disabled from external IP, only loopback(localhost) allowed
    
  3. DataKit の待受アドレスがノード IP からアクセス可能 であること。DaemonSet の典型設定は hostNetwork: truehostPort: 9529ENV_HTTP_LISTEN=0.0.0.0:9529 です。

OOM HProf 要約の要件

Java プロセスで OOM が発生した後、Flameshot に .hprof 要約を自動補足させたい場合は、次の条件をすべて満たしてください。

  1. 業務 JVM の起動引数で -XX:+HeapDumpOnOutOfMemoryError を有効にする。
  2. 業務 JVM の起動引数で -XX:HeapDumpPath=/data/... を設定し、そのパスが共有ボリューム内にあること。
  3. Flameshot に FLAMESHOT_OOM_HPROF_ENABLED=true を設定する。
  4. 運用側で照合ウィンドウを明確に把握できるよう、FLAMESHOT_OOM_HPROF_MATCH_WINDOW も明示的に設定することを推奨します。

例:

java \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/data/dumps/app.hprof \
  -jar app.jar

説明:

  • Flameshot は対象 Java プロセスの起動引数から直接 HeapDumpPath を自動解析するため、.hprof のパスを別途設定する必要はありません。
  • FLAMESHOT_OOM_HPROF_ENABLED は Flameshot 側の復旧ロジックを有効化するだけで、対象 JVM に HeapDump 関連パラメータを注入するものではありません。
  • 対象プロセスが HeapDumpOnOutOfMemoryError を有効にしていない場合、または HeapDumpPath が共有ボリューム内にない場合、Flameshot は OOM イベントのみを記録し、対応する .hprof ファイルを見つけられません。
  • dump 完了前にコンテナが直接終了した場合、.hprof は生成されないことがあります。

Docker ローカルテスト

ローカルの Docker 環境でテストする必要がある場合は、次のコマンドで Flameshot を起動し、対象コンテナを監視できます。

前提条件:

  • --pid="container:<target_id>" を使用するか、共有ボリューム方式を使用します(Docker のバージョンに依存します)。

テストイメージ: pubrepo.jiagouyun.com/datakit/flameshot:1.85.1-testing_testing-iss-2876

起動コマンド例:

docker run -d \
  --name flameshot-debug \
  --volumes-from <YOUR_JAVA_APP_CONTAINER> \
  -e FLAMESHOT_DATAKIT_ADDR="http://datakit:9529/profiling/v1/input" \
  -e FLAMESHOT_PROCESSES='[{"service":"local-test","command":"java","language":"java","cpu_usage_percent":10}]' \
  pubrepo.jiagouyun.com/datakit/flameshot:1.85.1-testing_testing-iss-2876

API リファレンス

Flameshot は HTTP インターフェースを提供し、ユーザーまたは自動化運用スクリプトが能動的に収集タスクをトリガーできるようにします。

手動収集トリガー

インターフェースGET /v1/profile

意味の説明:このインターフェースは、必要に応じて 1 つの Profile データを生成するためのもので、監視メトリクスを取得するものではありません。

リクエストパラメータ:

パラメータ名 必須 説明
pid どちらか一方必須 対象プロセス ID。command より優先されます。 1234
command どちらか一方必須 対象プロセス名の正規表現。対象プロセスの一致に使用します。 ^java.*app.jar$
duration いいえ 収集時間。既定値は 30s です。 30s
events いいえ Java の収集イベント種別。既定値は all です。Go の収集では pprof_types を優先して使用します。 cpu,alloc

使用例:

  1. PID 指定で収集をトリガー

    # PID 1234 のプロセスを 30 秒間、CPU とメモリ割り当てデータで収集する
    curl "http://localhost:8089/v1/profile?pid=1234&duration=30s&events=cpu,alloc"
    
  2. プロセス名の正規表現で収集をトリガー

    # 名称が tmall.jar に一致するプロセスを、既定時間で収集する
    curl "http://localhost:8089/v1/profile?command=^java\\b.*tmall\\.jar$"
    

JFR データ形式

以下は主要なイベント種別の詳細です。

イベント種別 (Event) 対応パラメータ コア原理 適用シーン 備考
CPU Time cpu カーネルサンプリングまたは itimer を用いて、CPU が定期的にどのコード命令を処理しているかを確認します。 性能改善: 計算集約型の「ホットメソッド」を特定し、アルゴリズムロジックを最適化します。 CPU 上で実行された時間のみを記録します。
Wall-clock wall スレッド状態(実行、スリープ、ブロック)に関係なく、固定頻度でサンプリングします。 応答時間の診断: I/O ブロック、DB 呼び出しの遅さ、ネットワーク遅延などを調査します。 スレッドが「何を待っているか」を把握できます。
Allocation alloc TLAB(スレッドローカル割り当てバッファ)の割り当て状況と大きなオブジェクトの割り当てを記録します。 メモリ最適化: メモリの揺らぎを特定し、頻繁な GC による停止を減らします。 記録されるのは割り当て動作であり、現在の生存メモリ量ではありません。
Lock lock synchronized キーワードにおけるスレッド競合と待機時間を記録します。 並行処理のボトルネック: 激しいロック競合、スレッドデッドロック、同期ブロックの実行遅延を調査します。 既定では通常、一定閾値を超えるブロックイベントを記録します。
Cache Misses cache-misses ハードウェア性能カウンタ (PMU) を利用して L1/L2/L3 キャッシュミス回数を集計します。 低レベル調整: データ構造の最適化(CPU アフィニティ、false sharing 問題など)を行います。 Linux カーネルで perf_events のサポートが必要です。
Context Switch context-switches OS がスレッドを切り替える頻度を記録します。 リソーススケジューリング最適化: スレッド数が多すぎないか、システム負荷が過大でないかを調査します。 頻繁な切り替えは、CPU 時間が管理オーバーヘッドに浪費される原因になります。
Java Methods itimer カーネルタイマーに基づくサンプリングです。 互換モード: perf_events が使えない環境(例: 一部コンテナ)で CPU サンプリングの代替として使用します。 ハードウェアサンプリングより精度はやや低いですが、互換性は非常に高いです。

alloc は現在の全メモリの合計ではなく、現在のサンプリング期間内に割り当てられたメモリ量です。


よくある問題と切り分け

  1. データを収集できない?

    • Pod で shareProcessNamespace: true が有効になっているか確認してください。
    • Sidecar に SYS_PTRACE 権限があるか確認してください。
    • Go アプリについては、pprof_url が Flameshot Sidecar 内からアクセス可能か確認してください。
    • Go アプリの場合、まず Flameshot コンテナ内で pprof endpoint にアクセスできることを確認します。

      curl -v "http://<pprof-host>:6060/debug/pprof/"
      curl -v "http://<pprof-host>:6060/debug/pprof/goroutine?debug=0"
      
    • ログに connect: connection refused が出る場合、対応する IP:Port が待ち受けていません。Pod に入って確認してください。

      netstat -lntp | grep ':6060'
      ss -ltnp | grep ':6060'
      

    LISTEN が表示されない場合、業務プロセスが pprof を有効化していないか、待受ポートが 6060 ではありません。60602 ... ESTABLISHED のような接続が見えても、6060 が待ち受けていることにはなりません。 - pprof が Pod IP で待ち受けている場合、pprof_urlhttp://$(POD_IP):6060 に設定してください。loopback または全アドレスで待ち受けている場合は http://127.0.0.1:6060 を使用できます。

  2. ファイルがアップロードされない?

    • FLAMESHOT_PROFILING_PATH が 2 つのコンテナ間で正しくマウントされているか確認してください。
    • システムがファイルのライフサイクルを自動管理し、収集完了後に一時ファイルの削除を試みます。
    • Go の収集は .pprof をメモリアタッチメント形式で直接アップロードするため、通常はローカルへの書き出しに依存しません。Go の収集ログにすでに upload to DataKit err が出ている場合は、まず DataKit が返す HTTP ステータスコードとレスポンス本文を確認してください。
    • DataKit が 403 を返し、datakit.publicAccessDisabled を含む場合、/profiling/v1/input が localhost 以外に開放されていません。DataKit 設定に次を追加してください。

      - name: ENV_HTTP_PUBLIC_APIS
        value: /otel/v1/trace,/otel/v1/metric,/otel/v1/logs,/profiling/v1/input
      
    • DataKit が input "profile" is not enabled for API "/profiling/v1/input" を返す場合、DataKit で profile 収集器が有効化されていません。次を有効化してください。

      [[inputs.profile]]
        endpoints = ["/profiling/v1/input"]
      
  3. 正規表現設定が面倒

    • JAVA アプリのプロセス名はすべて java なので、"command":"java""language": "java" を設定するだけで、すべての JAVA アプリにマッチします。
    • 特定のアプリだけを設定したい場合は、正規表現の設定が必須です。

更新履歴 (Changelog)

0.2.2 (2026-5-12)

問題修正

  • 修正
    • Profiling 上報メタデータの tags_profilerhostenvversionservice などのタグが重複書き込みされる可能性がある問題を修正しました。
  • 調整
    • 高水位 jcmd スナップショット機能および関連設定項目を削除しました。
    • cgroup メモリ圧迫時の観測フィールドを追加し、閾値、cgroup 現在値、および上限値の調査をしやすくしました。

0.2.1 (2026-2-11)

新機能

  • 最適化
    • コンテナ環境では、リソース設定のサイズを閾値計算の基準値として使用します。

0.2.0 (2026-2-4)

新機能

  • 設定追加
    • 環境変数 FLAMESHOT_AUTO_PROFILING による定期 Profiling 実行をサポートしました。
  • 機能最適化
    • 設定閾値を最適化しました。

0.1.0 (2025-12-17)

Flameshot の最初の正式版です。コンテナ環境下の Java アプリケーションに対して、自動化されたパフォーマンスプロファイリング機能を提供することに重点を置いています。

新機能

  • コアアーキテクチャ
    • Kubernetes の Sidecar モード デプロイをサポートし、共有 PID 名前空間を利用した非侵襲監視を実現します。
    • Linux AMD64ARM64 のマルチアーキテクチャ実行をサポートします。
  • 言語サポート
    • Java: async-profiler を深く統合し、CPU、Alloc、Lock など複数のイベント収集をサポートします。
    • 対象コンテナの JDK 環境を自動検出して適応します。
  • トリガーメカニズム
    • 閾値トリガー: CPU 使用率 (cpu_usage_percent) とメモリ使用率/量 (mem_usage_percent/mem_usage_mb) に基づく自動トリガーをサポートします。
    • API トリガー: HTTP インターフェース GET /v1/monitor を提供し、PID または正規表現でプロセス名を指定して手動トリガーできます。
  • データ統合
    • 生成された .jfr またはフレームグラフデータを DataKit に自動報告できます。
    • 環境変数 FLAMESHOT_PROCESSES で、複数プロセスの監視ポリシーとタグ (tags) を柔軟に設定できます。

フィードバック

このページは役に立ちましたか?