Cloudflare Realtime TURN サービスは、イングレスとエグレスの使用量をバイト単位で計測します。このリアルタイムおよび履歴データには、TURN analytics API でアクセスできます。時系列または集計で、時間経過に伴うバイト単位のトラフィックを確認できます。
Cloudflare TURN analytics は GraphQL API でのみ利用できます。
TURN analytics では、さまざまな方法で照会・集計できる豊富なデータを提供します。
次のメトリクスを照会できます。
- egressBytes: TURN サーバーからクライアントへ送信した合計バイト数
- ingressBytes: TURN サーバーがクライアントから受信した合計バイト数
- concurrentConnections: 同時接続数の平均
これらのメトリクスは sum と avg 関数で集計できます。
次のディメンションでデータを分解できます。
- 時間集計:
datetime、datetimeMinute、datetimeFiveMinutes、datetimeFifteenMinutes、datetimeHour - 地理:
datacenterCity、datacenterCountry、datacenterRegion(Cloudflare データセンターの所在地) - 識別:
keyId、customIdentifier、username
TURN analytics のデータは次の条件でフィルターできます。
- Datetime の範囲
- TURN Key ID
- TURN Username
- Custom identifier
GraphQL は自己記述的なプロトコルです。任意の GraphQL クライアントでスキーマと利用可能なフィールドを調べられます。よく使われる選択肢は次のとおりです。
- Altair ↗: スキーマドキュメントエクスプローラー付きの高機能 GraphQL クライアント
- GraphiQL ↗: オリジナルの GraphQL IDE
- Postman ↗: スキーマイントロスペクション付きの GraphQL クエリに対応
スキーマ全体を調べるには、API 認証情報を使って https://api.cloudflare.com/client/v4/graphql に接続するようクライアントを設定します。詳細な手順は GraphQL スキーマを調べる を参照してください。
よくある用途向けのクエリ例です。用途に合わせて変更し、分析データの見え方を変えられます。
この包括的なクエリでは、同時接続数、エグレス、イングレスバイトを 5 分間隔で同時に取得します。ダッシュボード構築やリアルタイム使用量の監視に便利です。
query concurrentConnections {
viewer {
accounts(filter: { accountTag: $accountId }) {
callsTurnUsageAdaptiveGroups(
limit: 10000
filter: { date_geq: $dateFrom, date_leq: $dateTo }
) {
dimensions {
datetimeFiveMinutes
}
avg {
concurrentConnectionsFiveMinutes
}
sum {
egressBytes
ingressBytes
}
}
}
}
}応答の例:
{
"data": {
"viewer": {
"accounts": [
{
"callsTurnUsageAdaptiveGroups": [
{
"avg": {
"concurrentConnectionsFiveMinutes": 816
},
"dimensions": {
"datetimeFiveMinutes": "2025-12-02T03:45:00Z"
},
"sum": {
"egressBytes": 207314144,
"ingressBytes": 8534200
}
},
{
"avg": {
"concurrentConnectionsFiveMinutes": 1945
},
"dimensions": {
"datetimeFiveMinutes": "2025-12-02T16:00:00Z"
},
"sum": {
"egressBytes": 462909020,
"ingressBytes": 128434592
}
},
]
}
]
}
]
}query egressByTurnKey{
viewer {
usage: accounts(filter: { accountTag: $accountId }) {
callsTurnUsageAdaptiveGroups(
filter: {
date_geq: $dateFrom,
date_leq: $dateTo
}
limit: 2
orderBy: [sum_egressBytes_DESC]
) {
dimensions {
keyId
}
sum {
egressBytes
}
}
}
},
"errors": null
}
応答の例:
{
"data": {
"viewer": {
"usage": [
{
"callsTurnUsageAdaptiveGroups": [
{
"dimensions": {
"keyId": "82a58d0aeabfa8f4a4e0c4a9efc9cda5"
},
"sum": {
"egressBytes": 160040068147
}
}
]
}
]
}
},
"errors": null
}query topTurnCustomIdentifiers {
viewer {
accounts(filter: { accountTag: $accountId }) {
callsTurnUsageAdaptiveGroups(
filter: { date_geq: $dateFrom, date_leq: $dateTo }
limit: 1
orderBy: [sum_egressBytes_DESC]
) {
dimensions {
customIdentifier
}
sum {
egressBytes
}
}
}
}
}応答の例:
{
"data": {
"viewer": {
"accounts": [
{
"callsTurnUsageAdaptiveGroups": [
{
"dimensions": {
"customIdentifier": "some identifier"
},
"sum": {
"egressBytes": 160040068147
}
}
]
}
]
}
},
"errors": null
}query {
viewer {
accounts(filter: { accountTag: $accountId }) {
callsTurnUsageAdaptiveGroups(
filter: {
date_geq: $dateFrom
date_leq: $dateTo
customIdentifier: "tango"
}
limit: 100
orderBy: []
) {
dimensions {
keyId
customIdentifier
}
sum {
egressBytes
}
}
}
}
}応答の例:
{
"data": {
"viewer": {
"usage": [
{
"callsTurnUsageAdaptiveGroups": [
{
"dimensions": {
"customIdentifier": "tango",
"keyId": "74007022d80d7ebac4815fb776b9d3ed"
},
"sum": {
"egressBytes": 162641324
}
}
]
}
]
}
},
"errors": null
}query {
viewer {
accounts(filter: { accountTag: $accountId }) {
callsTurnUsageAdaptiveGroups(
filter: { date_geq: $dateFrom, date_leq: $dateTo }
limit: 100
orderBy: [datetimeMinute_ASC]
) {
dimensions {
datetimeMinute
}
sum {
egressBytes
}
}
}
}
}応答の例:
{
"data": {
"viewer": {
"accounts": [
{
"callsTurnUsageAdaptiveGroups": [
{
"dimensions": {
"datetimeMinute": "2025-12-01T00:00:00Z"
},
"sum": {
"egressBytes": 159512
}
},
{
"dimensions": {
"datetimeMinute": "2025-12-01T00:01:00Z"
},
"sum": {
"egressBytes": 133818
}
},
... (more data here)
]
}
]
}
},
"errors": null
}使用量データを Cloudflare データセンターの場所で分解し、TURN トラフィックがどこで処理されているかを把握できます。地域容量の最適化や、ユーザーの地理的分布の理解に役立ちます。
query {
viewer {
accounts(filter: { accountTag: $accountId }) {
callsTurnUsageAdaptiveGroups(
limit: 100
filter: { date_geq: $dateFrom, date_leq: $dateTo }
orderBy: [sum_egressBytes_DESC]
) {
dimensions {
datacenterCity
datacenterCode
datacenterRegion
datacenterCountry
}
sum {
egressBytes
ingressBytes
}
avg {
concurrentConnectionsFiveMinutes
}
}
}
}
}応答の例:
{
"data": {
"viewer": {
"accounts": [
{
"callsTurnUsageAdaptiveGroups": [
{
"avg": {
"concurrentConnectionsFiveMinutes": 3135
},
"dimensions": {
"datacenterCity": "Columbus",
"datacenterCode": "CMH",
"datacenterCountry": "US",
"datacenterRegion": "ENAM"
},
"sum": {
"egressBytes": 47720931316,
"ingressBytes": 19351966366
}
},
...
]
}
]
}
},
"errors": null
}特定の TURN キーまたはカスタム識別子を分析するようにデータをフィルターできます。特定の接続のデバッグや、特定クライアントの使用パターンの分析に便利です。
query {
viewer {
accounts(filter: { accountTag: $accountId }) {
callsTurnUsageAdaptiveGroups(
limit: 1000
filter: {
keyId: "82a58d0aeabfa8f4a4e0c4a9efc9cda5"
date_geq: $dateFrom
date_leq: $dateTo
}
orderBy: [datetimeFiveMinutes_ASC]
) {
dimensions {
datetimeFiveMinutes
keyId
}
sum {
egressBytes
ingressBytes
}
avg {
concurrentConnectionsFiveMinutes
}
}
}
}
}応答の例:
{
"data": {
"viewer": {
"accounts": [
{
"callsTurnUsageAdaptiveGroups": [
{
"avg": {
"concurrentConnectionsFiveMinutes": 130
},
"dimensions": {
"datetimeFiveMinutes": "2025-12-01T00:00:00Z",
"keyId": "82a58d0aeabfa8f4a4e0c4a9efc9cda5"
},
"sum": {
"egressBytes": 609156,
"ingressBytes": 464326
}
},
{
"avg": {
"concurrentConnectionsFiveMinutes": 118
},
"dimensions": {
"datetimeFiveMinutes": "2025-12-01T00:05:00Z",
"keyId": "82a58d0aeabfa8f4a4e0c4a9efc9cda5"
},
"sum": {
"egressBytes": 534948,
"ingressBytes": 401286
}
},
...
]
}
]
}
},
"errors": null
}分析の目的に応じて、時間集計の間隔を選べます。
datetimeMinute: 1 分間隔(最も細かい粒度)datetimeFiveMinutes: 5 分間隔(ダッシュボード向けに推奨)datetimeFifteenMinutes: 15 分間隔datetimeHour: 1 時間間隔(長期トレンド向け)
時間単位の集計クエリの例:
query {
viewer {
accounts(filter: { accountTag: $accountId }) {
callsTurnUsageAdaptiveGroups(
limit: 1000
filter: {
keyId: "82a58d0aeabfa8f4a4e0c4a9efc9cda5"
date_geq: $dateFrom
date_leq: $dateTo
}
orderBy: [datetimeFiveMinutes_ASC]
) {
dimensions {
datetimeFiveMinutes
keyId
}
sum {
egressBytes
ingressBytes
}
avg {
concurrentConnectionsFiveMinutes
}
}
}
}
}応答の例:
{
"data": {
"viewer": {
"accounts": [
{
"callsTurnUsageAdaptiveGroups": [
{
"avg": {
"concurrentConnectionsFiveMinutes": 130
},
"dimensions": {
"datetimeFiveMinutes": "2025-12-01T00:00:00Z",
"keyId": "82a58d0aeabfa8f4a4e0c4a9efc9cda5"
},
"sum": {
"egressBytes": 609156,
"ingressBytes": 464326
}
},
{
"avg": {
"concurrentConnectionsFiveMinutes": 118
},
"dimensions": {
"datetimeFiveMinutes": "2025-12-01T00:05:00Z",
"keyId": "82a58d0aeabfa8f4a4e0c4a9efc9cda5"
},
"sum": {
"egressBytes": 534948,
"ingressBytes": 401286
}
},
...
]
}
]
}
},
"errors": null
}1 つのクエリで複数のディメンションを組み合わせ、より詳細な内訳を取得できます。たとえば、時間と場所の両方で使用量を見る場合:
query {
viewer {
accounts(filter: { accountTag: $accountId }) {
callsTurnUsageAdaptiveGroups(
limit: 10000
filter: { date_geq: $dateFrom, date_leq: $dateTo }
orderBy: [datetimeHour_ASC, sum_egressBytes_DESC]
) {
dimensions {
datetimeHour
datacenterCity
datacenterCountry
}
sum {
egressBytes
ingressBytes
}
}
}
}
}応答の例:
{
"data": {
"viewer": {
"accounts": [
{
"callsTurnUsageAdaptiveGroups": [
{
"dimensions": {
"datacenterCity": "Chennai",
"datacenterCountry": "IN",
"datetimeHour": "2025-12-01T00:00:00Z"
},
"sum": {
"egressBytes": 3416216,
"ingressBytes": 498927214
}
},
{
"dimensions": {
"datacenterCity": "Mumbai",
"datacenterCountry": "IN",
"datetimeHour": "2025-12-01T00:00:00Z"
},
"sum": {
"egressBytes": 1267076,
"ingressBytes": 1140140
}
},
...
]
}
]
}
},
"errors": null
}帯域幅を最も使っているキーまたはカスタム識別子を探すには:
query {
viewer {
accounts(filter: { accountTag: $accountId }) {
callsTurnUsageAdaptiveGroups(
limit: 10
filter: { date_geq: $dateFrom, date_leq: $dateTo }
orderBy: [sum_egressBytes_DESC, sum_ingressBytes_DESC]
) {
dimensions {
keyId
customIdentifier
}
sum {
egressBytes
ingressBytes
}
avg {
concurrentConnectionsFiveMinutes
}
}
}
}
}応答の例:
{
"data": {
"viewer": {
"accounts": [
{
"callsTurnUsageAdaptiveGroups": [
{
"avg": {
"concurrentConnectionsFiveMinutes": 837305
},
"dimensions": {
"customIdentifier": "",
"keyId": "82a58d0aeabfa8f4a4e0c4a9efc9cda5"
},
"sum": {
"egressBytes": 160040068147,
"ingressBytes": 154955460564
}
}
]
}
]
}
},
"errors": null
}GraphQL Analytics API は自己記述的です。イントロスペクションを使って、callsTurnUsageAdaptiveGroups で利用できるフィールド、フィルター、機能をすべて確認できます。Altair や GraphiQL などの GraphQL クライアントでスキーマを対話的に閲覧し、用途に合う追加のディメンションやメトリクスを探せます。
GraphQL のイントロスペクションとスキーマ探索の詳細は、次を参照してください。