Skip to content

Prometheusメトリクス公開#39

Draft
yuu1111 wants to merge 5 commits into
TeamFelNull:developfrom
yuu1111:feat/tts-metrics
Draft

Prometheusメトリクス公開#39
yuu1111 wants to merge 5 commits into
TeamFelNull:developfrom
yuu1111:feat/tts-metrics

Conversation

@yuu1111
Copy link
Copy Markdown
Contributor

@yuu1111 yuu1111 commented May 7, 2026

Summary

#38 (読み上げ文字数の集計) の後続PR。集計データをPrometheus /metrics で外部公開する

このPRは #38 の上に積まれています。 #38 がマージされるまでは差分に集計機能のコミットも含まれます。#38 マージ後、本PRの差分はメトリクス分のみに収束します。

  • Micrometer + JDK標準HttpServerで /metrics 公開 (デフォルト 127.0.0.1:9095、設定で無効化可)
  • 起動時にDB累計をCounterに注入し再起動後も整合
  • JVM標準メトリクス (memory/processor/gc) も同梱

メトリクス例

  • itts_up, itts_uptime_seconds
  • itts_spoken_chars_total{bot_id, server_id}
  • itts_spoken_messages_total{bot_id, server_id}
  • JVM標準メトリクス

設定

config.json5metrics セクション:

metrics: {
  enable: false,        // デフォルトは無効
  bind_address: "127.0.0.1",
  port: 9095
}

外部公開はリバプロ前提のオプトイン。

検証

  • ./gradlew :core:compileJava
  • ./gradlew :core:checkstyleMain (warning 0)
  • ./gradlew :selfhost:shadowJar

Test plan

  • metrics.enable: true で起動 → curl http://127.0.0.1:9095/metricsitts_spoken_chars_total が出ること
  • Bot再起動後、itts_spoken_chars_total がDB累計から再開すること
  • metrics.enable: false でHTTPサーバーが起動しないこと

留意点

  • Counterはプロセス再起動で0リセットされるPrometheusセマンティクス通りの挙動。累計表示は /stat 側で対応
  • 日付境界はUTC固定 (集計側と同じ)
  • 読み上げ文字数の集計 #38 マージ後にrebaseしてレビューしやすい状態に整えます

yuu1111 added 5 commits May 8, 2026 05:41
Bot/サーバー単位 + 日次で読み上げ文字数とメッセージ数をDBに集計記録する。
SQLite/MySQL双方でアトミックUPSERTにより同時書き込みでもロストしない。

- 新規テーブル tts_count_data (bot_id, server_id, target_date 単位)
- TTSCountRecorder で読み上げ確定時に非同期記録
- Micrometer Prometheus レジストリで /metrics エンドポイント公開
  (デフォルト 127.0.0.1:9095, 設定で無効化可)
- /stat コマンド (today/week/all/server) で Bot 所有者向けに集計表示
- 起動時に DB 累計値を Counter に注入し再起動後も整合
- server_id = 0 をBot全体合計の予約値とし、server_id IS NULLの分岐を削除
  unique制約とON CONFLICT/ON DUPLICATE KEY UPDATE単一クエリに統一しrace conditionを解消
- /stat week でメッセージ数も表示
- TTSCountData#getRecord を追加し、StatCommand での2重SELECTを解消
- 起動時のCounter累計注入を削除 (Prometheusのrate計算を狂わせるため)
- MetricsRegistry の getOrCreate{Char,Message}Counter を共通化
- DataRepositoryImpl の sum 系ボイラープレートをwithConnectionヘルパで集約
- botId解決を getBot().getBotId() に統一
- RELATIVE_TIME_FORMAT を BaseCommand に集約
- PrometheusHttpExposer に固定スレッドプールを設定し詰まりを回避
- MetricsRegistryをinterface化しPrometheus実装とNoOp実装を分離
  メトリクス無効時もnon-nullになり呼び出し側のnullチェックを削除
- ITTSRuntimeUseにgetTTSCountRecorder/getMetricsRegistryのdefaultを追加
  VoiceAudioSchedulerのITTSRuntime.getInstance()プルを既存パターンに統一
- ITTSRuntime#initMetricsを生成と起動に限定し、シャットダウンフック登録を
  registerShutdownHooksに分離
集計機能のマージ後に別PRで対応する方針のため、
Prometheus関連の実装を本PRから取り除く

- core/metrics配下を削除
- MetricsConfigを削除
- ITTSRuntime/Use・Config・selfhost ConfigImplから参照を除去
- Micrometer依存を削除
- TTSCountRecorderはDB書き込みのみに簡略化
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant