Skip to content

WebRTC 統計情報を DuckDB ファイルにため込む機能を追加する#78

Open
voluntas wants to merge 34 commits intodevelopfrom
feature/duckdb-output
Open

WebRTC 統計情報を DuckDB ファイルにため込む機能を追加する#78
voluntas wants to merge 34 commits intodevelopfrom
feature/duckdb-output

Conversation

@voluntas
Copy link
Member

@voluntas voluntas commented Dec 5, 2025

No description provided.

/.ok への GET リクエストで 200 OK を返すエンドポイントを追加
- --duckdb-dir と --duckdb-interval オプションを追加
- DuckDB C API を使用して WebRTC 統計情報をファイルに保存
- zakuro, connection, rtc_stats_* テーブルを作成
- E2E テストを追加
- SQL では $name 形式を使用
- duckdb_bind_parameter_index には $ プレフィックスなしの名前を渡す
- NamedBinder クラスを追加してバインド処理を簡素化
- 可読性の向上のため、すべての INSERT 文を名前付きパラメータに変更
conftest.py の tmp_duckdb_dir フィクスチャを削除し、
各テスト関数内で tempfile.TemporaryDirectory() を直接使用するように変更した。
- connection.created イベントで WriteStats を呼び出して接続情報を記録
- テストで DuckDB への書き込み内容を assert で検証するように変更
- conftest.py の build_instance で audio/video/fake-capture-device をデフォルト true に
- CLAUDE.md に Python テストの規約を追加
@voluntas voluntas force-pushed the feature/duckdb-output branch 2 times, most recently from 261681a to e876001 Compare December 5, 2025 05:28
- test/ を python/tests/ に移動
- pyproject.toml をプロジェクトルートに配置
- run.py でビルド後に libduckdb をビルドディレクトリにコピー
- run.py でパッケージ作成時に libduckdb を含める
- .gitignore に .env* の除外を追加
@voluntas
Copy link
Member Author

voluntas commented Dec 5, 2025

!opus レビューして、実際対応が必要ないのは無視するようにしてください。無駄なレビューはしないように。

@github-actions
Copy link

github-actions bot commented Dec 5, 2025

Claude finished @voluntas's task —— View job


PRレビュー完了

  • PRの変更内容を確認
  • コードの品質・セキュリティ・パフォーマンスをレビュー
  • 実際に対応が必要な指摘事項をまとめる

レビュー結果

全体として、DuckDB 統計出力機能の実装は適切に行われています。コードは整理されており、RAII パターンを使用したリソース管理、名前付きパラメータによる SQL インジェクション対策、適切なエラーハンドリングが実装されています。

以下は対応を検討すべき点です:


優先度:高

1. duckdb_stats_writer.cpp:22-44 - DEPS ファイルのパスがハードコード

std::ifstream file("DEPS");

相対パス "DEPS" でファイルを開いているため、実行時のカレントディレクトリによっては読み込めない。実行ファイルからの相対パス、または設定で渡すことを検討すべき。


優先度:中

2. duckdb_stats_writer.cpp:536-591 - WriteStats のループ内で毎回 prepared statement を再作成

for (const auto& stat : stats) {
  // ...
  duckdb_utils::PreparedStatement stmt;
  if (!duckdb_utils::Prepare(conn_, insert_sql, stmt)) {

ループ内で毎回 Prepare を呼び出している。パフォーマンスを考慮すると、ループ外で一度だけ prepare し、ループ内では bind と execute のみを行う方が効率的。

3. duckdb_stats_writer.cpp:661-1161 - WriteRTCStats の大きな if-else チェーン

WriteRTCStats 関数が 500 行を超えており、rtc_type ごとの処理が長大な if-else で記述されている。メンテナンス性を考慮すると、各タイプごとにプライベートメソッドに分離することを推奨。


優先度:低

4. virtual_client.cpp:278-302 - コールバック内での writer の null チェック

pc->GetStats(sora::RTCStatsCallback::Create(
    [channel_id, session_id, connection_id,
     writer](const webrtc::scoped_refptr<
             const webrtc::RTCStatsReport>& report) {
      if (!writer) {
        return;
      }

writershared_ptr のコピーでキャプチャされているため問題ないが、コールバック実行時に writer が解放されている可能性は低いものの、意図は明確。


良い点

  • RAII パターン: duckdb_utils.hResult, PreparedStatement, Transaction, StringValue などの RAII ラッパーが適切に実装されている
  • SQL インジェクション対策: 名前付きパラメータと prepared statement を使用している
  • エラーハンドリング: 各操作でエラーチェックとログ出力が行われている
  • テスト: test_zakuro_duckdb.py で DuckDB 機能の E2E テストが追加されている
  • GitHub Actions: e2e-test.ymldownload-binary アクションによる CI が構築されている

Base automatically changed from feature/remote-ui to develop January 14, 2026 01:21
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