# 統計 API

> **注意**
>
> この API は [実験的機能](EXPERIMENTAL.html) のため、正式版では仕様が変更される可能性があります。


## GetStatsReport

**x-sora-target**: Sora_20171010.GetStatsReport

Sora が起動している間の Sora 全体の統計情報を取得できます。
この統計情報は Sora を止めたり再起動したりすることでクリアされますので注意してください。

### レスポンス項目

- version- sora のバージョン
- total_connection_created- 現在までの接続が作成された数
- total_connection_updated- 現在までの接続が更新された数
- total_connection_destroyed- 現在までの接続が破棄された数
- total_session_created- 現在までのセッションが作成された数
- total_session_destroyed- 現在までのセッションが破棄された数
- total_successful_connections- 現在までの接続が成功した数
- total_ongoing_connections- 現在接続している数
- total_failed_connections- 現在までの接続が失敗した数
- total_duration_sec- 現在までの合計接続時間 (秒)
- total_turn_udp_connections- 現在までの TURN-UDP での接続数
- total_turn_tcp_connections- 現在までの TURN-TCP または TURN-TLS での接続数
- total_received_invalid_turn_tcp_packet- 現在までの TURN-TCP でパースできないパケットが送られてきた数
- total_auth_webhook_allowed- 認証ウェブフックで許可された数
- total_auth_webhook_denied- 認証ウェブフックで拒否された数
- total_successful_auth_webhook- 認証ウェブフックが成功した数
- total_failed_auth_webhook- 認証ウェブフックが失敗した数
- total_successful_session_webhook- セッションウェブフックが成功した数
- total_failed_session_webhook- セッションウェブフックが失敗した数
- total_ignored_session_webhook- 無視されたセッションウェブフックの合計数
- total_successful_event_webhook- イベントウェブフックが成功した数
- total_failed_event_webhook- イベントウェブフックが失敗した数
- total_ignored_event_webhook- 無視されたイベントウェブフックの合計数
- total_successful_stats_webhook- 統計ウェブフックが成功した数
- total_failed_stats_webhook- 統計ウェブフックが失敗した数
- total_ignored_stats_webhook- 無視された統計ウェブフックの合計数
- total_auth_webhook_response_time_ms- 認証ウェブフックの応答時間の累積合計 (ミリ秒)
- auth_webhook_response_time_ms_buckets- 認証ウェブフックの応答時間ヒストグラム (上限値別の累積件数)
- total_session_webhook_response_time_ms- セッションウェブフックの応答時間の累積合計 (ミリ秒)
- session_webhook_response_time_ms_buckets- セッションウェブフックの応答時間ヒストグラム (上限値別の累積件数)
- total_event_webhook_response_time_ms- イベントウェブフックの応答時間の累積合計 (ミリ秒)
- event_webhook_response_time_ms_buckets- イベントウェブフックの応答時間ヒストグラム (上限値別の累積件数)
- average_duration_sec- 平均接続時間 (秒)
- average_setup_time_msec- 平均セットアップ時間 (ミリ秒)
  - セットアップ時間とはシグナリング接続開始から WebRTC が確立するまでにかかった時間です
- total_received_srtp- 受信した SRTP パケットの数
- total_received_srtp_byte_size- 受信した SRTP パケットのバイト数
- total_sent_srtp- 送信した SRTP パケットの数
- total_sent_srtp_byte_size- 送信した SRTP パケットのバイト数
  - Sora は暗号化したパケットは必ず送信します
- total_decrypted_srtp- 復号した SRTP パケットの数
  - Sora は誰も視聴していない音声や映像パケットを復号しません
- total_decrypted_srtp_byte_size- 復号した SRTP パケットのバイト数
- total_received_sctp- 受信した SCTP パケットの数
- total_received_sctp_byte_size- 受信した SCTP パケットのバイト数
- total_sent_sctp- 送信した SCTP パケットの数
- total_sent_sctp_byte_size- 送信した SCTP パケットのバイト数
- cluster- クラスター機能の統計情報です
  - raft_commit_index- Raft ノードが最後にコミットしたログのインデックス番号
  - raft_state- Raft ノードの現在の状態
  - raft_term- Raft ノードの現在の term
  - total_force_sync_session_resource- セッションリソース情報を他ノードへ即時同期した回数
- cluster_relay- **この統計データは厳密なデータではないため、参考程度にご利用ください**
  - クラスターリレー機能が有効な場合この項目が追加されます
  - node_name- 対象ノード名
  - total_sent_byte_size- 対象ノードへリレー機能で送信したバイト数
  - total_received_byte_size- 対象ノードからリレー機能で受信したバイト数
  - total_sent- 対象ノードからリレー機能で送信したパケット数
  - total_received- 対象ノードからリレー機能で受信したパケット数
  - 対象ノードが削除された場合でも再起動されるまでは統計情報は残ります
  - plumtree- 対象ノードが利用しているツリー構造の統計情報です
    - total_sent_gossip
    - total_received_gossip
    - total_received_gossip_hop
    - total_sent_ihave
    - total_received_ihave
    - total_sent_graft
    - total_received_graft
    - total_sent_prune
    - total_received_prune
    - total_graft_miss
    - total_skipped_send
    - total_ignored

ウェブフックの成功は 2xx 系が戻ってきておりかつ、JSON がある場合は JSON のパースに失敗しない場合です。
それ以外は失敗としています。

応答時間に関する統計は統計ウェブフックを対象外としています。

```console
$ curl -sS \
    -X POST \
    http://127.0.0.1:3000/ \
    -H "x-sora-target: Sora_20171010.GetStatsReport" \
    | jq .
{
    "auth_webhook_response_time_ms_buckets": [
        {"upper_bound": 1250, "count": 0},
        {"upper_bound": 2500, "count": 0},
        {"upper_bound": 3750, "count": 0},
        {"upper_bound": 5000, "count": 0}
    ],
    "average_duration_sec": 1450,
    "average_setup_time_msec": 879,
    "cluster": {
        "raft_commit_index": 98,
        "raft_state": "follower",
        "raft_term": 3,
        "total_force_sync_session_resource": 0
    },
    "cluster_relay": [
        {
            "node_name": "sora2@192.0.2.13",
            "plumtree": {
                "total_graft_miss": 0,
                "total_ignored": 0,
                "total_received_gossip": 1036,
                "total_received_gossip_hop": 1037,
                "total_received_graft": 0,
                "total_received_ihave": 760,
                "total_received_prune": 1,
                "total_sent_gossip": 1731,
                "total_sent_graft": 0,
                "total_sent_ihave": 760,
                "total_sent_prune": 1,
                "total_skipped_send": 0
            },
            "total_received": 1797,
            "total_received_byte_size": 796839,
            "total_sent": 2492,
            "total_sent_byte_size": 1034225
        },
        {
            "node_name": "sora3@192.0.2.13",
            "plumtree": {
                "total_graft_miss": 0,
                "total_ignored": 0,
                "total_received_gossip": 1161,
                "total_received_gossip_hop": 1162,
                "total_received_graft": 0,
                "total_received_ihave": 1034,
                "total_received_prune": 1,
                "total_sent_gossip": 3556,
                "total_sent_graft": 0,
                "total_sent_ihave": 1034,
                "total_sent_prune": 1,
                "total_skipped_send": 0
            },
            "total_received": 2196,
            "total_received_byte_size": 763788,
            "total_sent": 4591,
            "total_sent_byte_size": 2134557
        }
    ],
    "event_webhook_response_time_ms_buckets": [
        {"upper_bound": 1250, "count": 0},
        {"upper_bound": 2500, "count": 0},
        {"upper_bound": 3750, "count": 0},
        {"upper_bound": 5000, "count": 0}
    ],
    "session_webhook_response_time_ms_buckets": [
        {"upper_bound": 1250, "count": 0},
        {"upper_bound": 2500, "count": 0},
        {"upper_bound": 3750, "count": 0},
        {"upper_bound": 5000, "count": 0}
    ],
    "total_auth_webhook_allowed": 0,
    "total_auth_webhook_denied": 0,
    "total_auth_webhook_response_time_ms": 0,
    "total_connection_created": 1,
    "total_connection_destroyed": 0,
    "total_connection_updated": 2,
    "total_decrypted_srtp": 18029,
    "total_decrypted_srtp_byte_size": 4735559,
    "total_duration_sec": 0,
    "total_event_webhook_response_time_ms": 0,
    "total_failed_auth_webhook": 0,
    "total_failed_connections": 0,
    "total_failed_event_webhook": 0,
    "total_failed_session_webhook": 0,
    "total_failed_stats_webhook": 0,
    "total_ignored_event_webhook": 0,
    "total_ignored_session_webhook": 0,
    "total_ignored_stats_webhook": 0,
    "total_ongoing_connections": 1,
    "total_received_invalid_turn_tcp_packet": 0,
    "total_received_sctp": 0,
    "total_received_sctp_byte_size": 0,
    "total_received_srtp": 18029,
    "total_received_srtp_byte_size": 4735559,
    "total_sent_sctp": 0,
    "total_sent_sctp_byte_size": 0,
    "total_sent_srtp": 1343,
    "total_sent_srtp_byte_size": 643870,
    "total_sent_srtp_sfu_delay_us": 3940352,
    "total_session_created": 0,
    "total_session_destroyed": 0,
    "total_session_webhook_response_time_ms": 0,
    "total_successful_auth_webhook": 0,
    "total_successful_connections": 1,
    "total_successful_event_webhook": 0,
    "total_successful_session_webhook": 0,
    "total_successful_stats_webhook": 0,
    "total_turn_tcp_connections": 0,
    "total_turn_udp_connections": 1,
    "version": "2025.1.0"
}
```
