Skip to content

DuckDB による統計情報の保存と HTTP API 経由での統計情報の取得 #57

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 78 commits into
base: develop
Choose a base branch
from

Conversation

voluntas
Copy link
Member

@voluntas voluntas commented Jul 26, 2025

  • duckdb ファイルを出力するディレクトリパスを指定できるようにする
  • duckdb への出力を行わないようにする

voluntas added 2 commits July 26, 2025 19:59
- DEPS に DUCKDB_VERSION=v1.3.2 を追加
- buildbase.py に install_duckdb 関数を実装(プリビルドの静的ライブラリを使用)
- run.py に DuckDB のインストール処理を追加
- FindDuckDB.cmake を作成(静的ライブラリの検出用)
- CMakeLists.txt に DuckDB のリンク設定を追加

macOS ARM64 および Linux x86_64 向けのプリビルド静的ライブラリを使用することで、
ソースコードからのビルドを回避し、ビルド時間を短縮。
C++ SDK で取得したクライアント単位の統計情報を DuckDB にリアルタイムで
保存する基盤を構築。
- --port オプションが指定された場合に HTTP サーバーを起動する機能を追加
- /version エンドポイントを実装し、以下の情報を JSON で返却:
  - zakuro_version: Zakuro のバージョン情報
  - duckdb_version: 組み込まれた DuckDB のバージョン情報
- Boost.Beast を使用した非同期 HTTP サーバーの実装
- DuckDB の全依存ライブラリを静的リンクに追加

使用例:
  ./zakuro --port 8080 --config config.yaml
  curl http://localhost:8080/version
@voluntas voluntas changed the title feat: DuckDB v1.3.2 を静的リンクライブラリとして追加 DuckDB v1.3.2 を静的リンクライブラリとして追加 Jul 26, 2025
voluntas added 7 commits July 26, 2025 20:43
古い SoraServer 関連の TODO コメントと未使用コードを削除
- DuckDBStatsWriterクラスを追加し、接続情報を永続化
- 日付ベースのファイル名(.ddb拡張子)で保存
- connectionsテーブルにchannel_id, connection_id, session_id, audio, video等を記録
- type:offerメッセージから必要な情報を抽出
- DuckDBのSEQUENCE機能を使用してPKを自動生成
- SIGINT/SIGTERMハンドラーで適切にシャットダウン処理
- .gitignoreに*.ddb, *.db, *.pycを追加
- OnSetOfferメソッドでtype:offer受信時に即座にDuckDBに書き込み
- 定期的な書き込み処理を削除し、重複書き込みを防止
- VirtualClientConfigとZakuroConfigにduckdb_writerを追加
- デバッグログを追加して動作確認を容易に
stats.ToJson()で取得したJSON文字列をDuckDBに保存する際、
文字列が二重エスケープされる問題を修正。
INSERT文でCAST( AS JSON)を使用することで、
JSON文字列を適切にJSON型として保存するように変更。
- プリペアドステートメント使用時の問題の原因を詳細に説明
- DuckDB内部でSTRING_LITERAL型として扱われ、Blob::ToString()でエスケープされることを記載
- CAST AS JSONでも解決しない理由を説明
- 回避策として直接SQL文を使用し、シングルクォートのエスケープ処理を実装
- デバッグ用のログ出力とテストファイルを削除
- stats テーブルを codec_stats, inbound_rtp_stats, outbound_rtp_stats に分割
- WebIDL仕様に準拠した型定義を実装
- codec_stats の重複挿入を防止(INSERT...WHERE NOT EXISTS)
- GetStats() 呼び出し時の共通タイムスタンプを使用
@voluntas voluntas changed the title DuckDB v1.3.2 を静的リンクライブラリとして追加 DuckDB を利用した統計情報の保存を追加 Jul 27, 2025
voluntas added 11 commits July 27, 2025 12:56
- media_source_stats テーブルを追加(RTCMediaSourceStats仕様準拠)
- RTCAudioSourceStatsとRTCVideoSourceStatsのフィールドを実装
- media-sourceは常に挿入(変化の有無に関わらず記録)
- jemalloc_extension.aを条件付きでリンクリストに追加
- Linuxビルド時にpthreadとdlライブラリを追加
- POST /query でSQL文字列を受け取り実行
- DuckDBStatsWriter::ExecuteQueryメソッドを追加
- クエリ結果をJSON形式で返す(カラム名、型、データ行を含む)
- HTTPサーバーにDuckDBWriterのインスタンスを渡す仕組みを追加
- text/plainからapplication/sqlに変更
- Content-Typeのチェックを追加
- --ui-remote-url オプションを追加(デフォルト: http://localhost:5173)
- /、/assets/、/static/へのアクセスを指定されたURLにプロキシ
- HTTPクライアント機能をboost::beastで実装
- Boost::urlライブラリをリンクに追加
- Access-Control-Allow-Originに--ui-remote-urlの値を設定
- すべてのレスポンス(成功・エラー・404)にCORSヘッダーを追加
- OPTIONSメソッドでCORS preflightに対応
- Access-Control-Allow-MethodsとAccess-Control-Allow-Headersも設定
- zakuro_versionをバージョン番号のみに変更(GetVersion()メソッドを追加)
- sora_sdk_version、libwebrtc_version、boost_versionを追加
- 各ライブラリのバージョン情報を表示
- sora_cpp_sdk_version: Sora C++ SDKのバージョン番号のみ
- libwebrtc_version: WebRTCのビルドバージョン番号のみ
- GetSoraCppSdkVersion()とGetWebRTCVersion()メソッドを追加
- フルバージョン文字列からバージョン番号を抽出する処理を実装
- Boost.Beastが認識できないHTTPヘッダーフィールドを文字列形式で処理するように修正
- 不要なログ出力とコメントアウトされたコードを削除
- /versionエンドポイントのJSONキーから_versionサフィックスを削除
- 不要なSSL関連のincludeを削除してコードを整理
BOOST_VERSIONマクロの仕組みをコメントで説明
@voluntas voluntas changed the title DuckDB を利用した統計情報の保存を追加 [WIP] DuckDB を利用した統計情報の保存を追加 Jul 27, 2025
voluntas added 7 commits July 28, 2025 00:32
リバースプロキシ経由でのアクセスではCORSヘッダーは不要のため、
以下のヘッダーを削除:
- Access-Control-Allow-Origin
- Access-Control-Allow-Methods
- Access-Control-Allow-Headers
- Access-Control-Max-Age

また、OPTIONSメソッドの処理(CORSプリフライト)も削除。
将来的にはコマンドライン引数でCORSの有効/無効を
切り替えられるようにする予定。
- CMakeLists.txt: MSVC runtime library関連のポリシー設定を削除
- duckdb_stats_writer.cpp: Windows用のlocaltime_sを削除
- http_server.cpp: boost::urlを簡易URLパース実装に置き換え(将来的にboost::urlを使用予定)
- zakuro_audio_device_module.h: WindowsDeviceType引数のメソッドは残す(WebRTCインターフェース要件のため)
- CMakeLists.txt: 静的ライブラリの一覧を削除し、プラットフォーム別にダイナミックライブラリ(.dylib/.so)を設定
- buildbase.py: static-libs-*.zipからlibduckdb-*.zipへの切り替え、ダイナミックライブラリのコピー処理を追加
- run.py: ビルド後とパッケージ作成時にDuckDBのダイナミックライブラリをコピーする処理を追加
- macOSとLinuxの両方でRPATH設定を追加し、実行ファイルと同じディレクトリからライブラリを読み込むように設定
- duckdb.hppからduckdb.hへヘッダーファイルを変更
- C++のクラス(DuckDB、Connection)からCの構造体(duckdb_database、duckdb_connection)へ移行
- すべてのDuckDB操作をC API関数に書き換え
- CMakeLists.txtにBUILD_RPATH_USE_ORIGIN ONを追加してRPATH設定を改善
- buildbase.pyからduckdb.hpp(C++ヘッダー)のダウンロード処理を削除
- http_server.cppでduckdb_library_version()を使用してバージョン情報を取得

この変更により、UbuntuでのlibstdC++とlibc++の違いによる問題を回避
- /version と /query エンドポイントを廃止
- /rpc エンドポイントでJSON-RPC 2.0リクエストを受け付けるように変更
- JSON-RPC 2.0ハンドラーを別ファイル (json_rpc.cpp/h) に分離
- --port オプションを --rpc-port に変更
- idフィールドは数値、文字列、nullをサポート

JSON-RPCメソッド:
- version: バージョン情報を取得
- query: SQLクエリを実行 (params.sql にSQL文を指定)
- json_rpc.cpp: デバッグ用の DEBUG\!\!\! ログをすべて削除
- virtual_client.cpp: 冗長な情報ログ(GetStats、OnSetOffer、Got系)を削除
- main.cpp: HTTPサーバーとDuckDB初期化の重複ログを削除
@voluntas voluntas changed the title [WIP] DuckDB を利用した統計情報の保存を追加 DuckDB を利用した統計情報の保存を追加 Aug 1, 2025
@voluntas voluntas changed the title DuckDB を利用した統計情報の保存を追加 DuckDB による統計情報の保存と HTTP API 経由での統計情報の取得 Aug 1, 2025
@voluntas
Copy link
Member Author

voluntas commented Aug 1, 2025

!opus レビューして、まず要約を用意してからレビューお願いします。

This comment was marked as outdated.

@voluntas
Copy link
Member Author

voluntas commented Aug 1, 2025

!opus 指摘された点をいくつか修正したので再度レビューして

This comment was marked as outdated.

- --duckdb-output-dir オプションで DuckDB ファイルの出力先ディレクトリを指定可能にする
- --no-duckdb-output オプションで DuckDB への統計情報出力を無効化可能にする
- YAML 設定ファイルでも duckdb-output-dir と no-duckdb-output をサポートする
- DuckDB クローズ時の CHECKPOINT コマンドを修正する(WAL_CHECKPOINT は存在しないため)
@voluntas
Copy link
Member Author

voluntas commented Aug 1, 2025

!opus 再度レビューをお願いします。

This comment was marked as outdated.

voluntas added 14 commits August 1, 2025 23:40
VirtualClient::OnDisconnect で rtc_stats_timer_ のキャンセル処理が欠落していたため、
メモリリークとタイマーコールバックの不正アクセスの可能性があった。

Clear() メソッドと同様に、適切なミューテックスロックを使用して
タイマーのキャンセル処理を追加した。
- boost::asio::ssl を使用して SSL/TLS 接続をサポート
- SSL コンテキストの作成と証明書検証の実装
- SNI (Server Name Indication) のサポート
- HTTP と同様のレスポンスボディサイズ制限(10MB)を適用
- デフォルトポート設定(HTTP: 80, HTTPS: 443)の自動判定
…:OnDisconnect で rtc_stats_timer_ のキャンセル処理が欠落していた問題を修正する。
- connections → connection
- codec_stats → rtc_stats_codec
- inbound_rtp_stats → rtc_stats_inbound_rtp
- outbound_rtp_stats → rtc_stats_outbound_rtp
- media_source_stats → rtc_stats_media_source

シーケンス名、インデックス名も同様に変更
…nnel の統計情報テーブルを追加する

以下のテーブルを追加:
- rtc_stats_remote_inbound_rtp
- rtc_stats_remote_outbound_rtp
- rtc_stats_data_channel

WriteRTCStats メソッドに対応する統計タイプの処理を実装
- テーブル名を実装に合わせて修正(connections → connection など)
- 新しいテーブルのドキュメントを追加:
  - zakuro: プロセス実行情報
  - zakuro_scenario: シナリオ情報
  - rtc_stats_remote_inbound_rtp: リモート受信統計
  - rtc_stats_remote_outbound_rtp: リモート送信統計
  - rtc_stats_data_channel: データチャンネル統計
- クエリ例のテーブル名を更新
- データチャンネル統計情報取得の curl コマンド例を追加
- 各ファイルから不要な情報レベルのログを削除
- VirtualClientStats 構造体に role フィールドを追加
- connection テーブルに role カラムを追加して Sora のロール情報を記録
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