GraphQLを使用してウィジェットを作成する
この記事では、自分のダッシュボードを埋めるために使用できるクエリの例を示します。
このワークフローを使用してクエリを構築およびテストします:
- GraphiQL ↗アプリをインストールして構成し、Cloudflare Analytics GraphQL APIに認証します。Cloudflareはトークン認証を推奨しています。詳細については、Analytics APIトークンの構成を参照してください。
- GraphiQLでクエリを構築します。GraphQLクライアントのイントロスペクティブドキュメントを使用して、利用可能なノードを探索できます。クエリに関する詳細については、クエリの基本を参照してください。
- GraphiQLからクエリを実行するか、cURLリクエストのペイロードとしてGraphQL APIエンドポイントに渡して、クエリをテストします。
- アプリケーションでクエリを使用して、ダッシュボードウィジェットにデータを提供します。
これらの例では、クエリを実行しているCloudflareアカウントのアカウントIDを使用します。これを変数(accountTag)として定義し、クエリ内で参照できます。
クエリでは、クエリしたい時間間隔を指定するためにフィルタも使用します。フィルタは、開始時間と終了時間を使用して時間間隔を定義します。クエリしたい時間の期間に応じて、開始時間と終了時間を指定するために異なる属性を使用します。フィルタに関する詳細については、フィルタリングを参照してください。
以下の例は、date_geq以上およびdate_leq以下の日付のデータをクエリします:
{ "accountTag": "{account-id}", "filter": { "AND":[ {"date_geq": "2020-01-19"}, {"date_leq": "2020-01-20"} ] }}この表は、特定の時間選択に対してデータをクエリする際に使用すべきNetwork Analyticsデータセット(ノード)とdatetimeDimensionを示しています。
データの集約ビューが必要な場合は、Groupsクエリノードを使用します。たとえば、ipFlows1mAttacksGroupsデータセットは、攻撃活動の分単位の集計レポートを表します。詳細については、データセットを参照してください。
| 時間選択 | クエリノード | datetimeDimension |
|---|---|---|
| 先週 | ipFlows1dGroups | date |
| 先月 | ipFlows1dGroups | date |
| 24時間 | ipFlows1mGroups | datetimeFifteenMinutes |
| 12時間 | ipFlows1mGroups | datetimeFifteenMinutes |
| 6時間 | ipFlows1mGroups | datetimeFiveMinutes |
| 30分 | ipFlows1mGroups | datetimeMinute |
| カスタム範囲 | 選択した範囲に依存 | 選択した範囲に依存 |
以下の表は、異なる時間範囲を表すクエリノードに対して有効な開始時間および終了時間属性を示しています。
| クエリノード | 開始日/時間フィルタ | 終了日/時間フィルタ |
|---|---|---|
| ipFlows1mGroups | datetimeMinute_geq | datetimeMinute_leq |
| ipFlows1mAttacksGroups | date_geq | date_leq |
| ipFlows1hGroups | datetimeHour_geq | datetimeHour_leq |
| ipFlows1dGroups | date_geq | date_leq |
ネットワーク分析でタイムシリーズグラフを構築するには、以下のクエリを使用します:
query ipFlowTimeseries( $accountTag: string $filter: AccountIpFlows1mGroupsFilter_InputObject ) { viewer { accounts(filter: { accountTag: $accountTag }) { ipFlows1mGroups( limit: 1000 filter: $filter orderBy: datetimeMinute_ASC ) { dimensions { timestamp: datetimeMinute attackMitigationType attackId } sum { bits packets } } } } }このクエリは、IPフローにおける攻撃トラフィックの分単位の集計を要約したアクティビティログを返します。クエリは、dimensionsオブジェクトにリストされたフィールドでデータをグループ化します。
query ipFlowEventLog( $accountTag: string $filter: AccountIpFlows1mAttacksGroupsFilter_InputObject ) { viewer { accounts(filter: { accountTag: $accountTag }) { ipFlows1mAttacksGroups( limit: 10 filter: $filter orderBy: [min_datetimeMinute_ASC] ) { dimensions { attackId attackDestinationIP attackDestinationPort attackMitigationType attackSourcePort attackType } avg { bitsPerSecond packetsPerSecond } min { datetimeMinute bitsPerSecond packetsPerSecond } max { datetimeMinute bitsPerSecond packetsPerSecond } sum { bits packets } } } } }このクエリは、トップソースIPに関するデータを返します。
limitパラメータは、各ノードに返されるレコードの量を制御します。以下のコードでは、強調表示された行がlimitを設定する場所を示しています。
query GetTopNBySource( $accountTag: string $filter: AccountIpFlows1mGroupsFilter_InputObject $portFilter: AccountIpFlows1mGroupsFilter_InputObject ) { viewer { accounts(filter: { accountTag: $accountTag }) { topNPorts: ipFlows1mGroups( limit: 5 filter: $portFilter orderBy: [sum_(bits/packets)_DESC] ) { sum { count: (bits/packets) } dimensions { metric: sourcePort ipProtocol } } topNASN: ipFlows1mGroups( limit: 5 filter: $filter orderBy: [sum_(bits/packets)_DESC] ) { sum { count: (bits/packets) } dimensions { metric: sourceIPAsn description: sourceIPASNDescription } } topNIPs: ipFlows1mGroups( limit: 5 filter: $filter orderBy: [sum_(bits/packets)_DESC] ) { sum { count: (bits/packets) } dimensions { metric: sourceIP } } topNColos: ipFlows1mGroups( limit: 10 filter: $filter orderBy: [sum_(bits/packets)_DESC] ) { sum { count: (bits/packets) } dimensions { metric: coloCity coloCode } } topNCountries: ipFlows1mGroups( limit: 10 filter: $filter orderBy: [sum_(bits/packets)_DESC] ) { sum { count: (bits/packets) } dimensions { metric: coloCountry } } topNIPVersions: ipFlows1mGroups( limit: 2 filter: $filter orderBy: [sum_(bits/packets)_DESC] ) { sum { count: (bits/packets) } dimensions { metric: ipVersion } } } } }このクエリは、トップ宛先IPに関するデータを返します。limitパラメータは、返されるレコードの量を制御します。以下のコードでは、強調表示された行がクエリが5つの最高の結果を返すことを示しています。
query GetTopNByDestination( $accountTag: string $filter: AccountIpFlows1mGroupsFilter_InputObject $portFilter: AccountIpFlows1mGroupsFilter_InputObject ) { viewer { accounts(filter: { accountTag: $accountTag }) { topNIPs: ipFlows1mGroups( filter: $filter limit: 5 orderBy: [sum_(bits/packets)_DESC] ) { sum { count: (bits/packets) } dimensions { metric: destinationIP } } topNPorts: ipFlows1mGroups( filter: $portFilter limit: 5 orderBy: [sum_(bits/packets)_DESC] ) { sum { count: (bits/packets) } dimensions { metric: destinationPort ipProtocol } } } } }このクエリは、IPフローの分単位の集計からTCPパケットの数を抽出し、TCPフラグ値で結果をグループ化します。limit: 8を使用して、上位8つの結果を表示し、降順で提示します。
TCPデータを表示するために、フィルタに以下の行を追加します:
{ ipProtocol: 'TCP' }query GetTCPFlags( $accountTag: string $filter: AccountIpFlows1mGroupsFilter_InputObject ) { viewer { accounts(filter: { accountTag: $accountTag }) { tcpFlags: ipFlows1mGroups( filter: $filter limit: 8 orderBy: [sum_(bits/packets)_DESC] ) { sum { count: (bits/packets) } dimensions { tcpFlags } } } } }エグゼクティブサマリークエリは、全体的な活動を要約するため、選択した時間間隔でのみフィルタリングし、分析に適用されたすべてのフィルタを無視します。 調査したい時間間隔やアカウントが見ているトラフィックの種類に応じて、異なるクエリを使用します。
時間間隔が絶対的な場合、たとえば3月25日09:00から3月25日17:00までの場合、その時間内の攻撃に関するクエリを実行します。適切なクエリノードを使用、たとえばipFlows1dGroupsを時間間隔に使用します。
query GetPreviousAttacks($accountTag: string, $filter: filter) { viewer { accounts(filter: {accountTag: $accountTag}) { ${queryNode}(limit: 1000, filter: $filter) { dimensions { attackId } sum { packets bits } } } }}時間間隔が現在の時間に対して相対的な場合、たとえば過去24時間または過去30分の場合、ipFlows1mGroupノードにクエリを作成して、過去5分間に攻撃があったかどうかを確認します。過去5分間の攻撃は進行中と見なされ、アクティビティログには「現在」と表示されます。
クエリの応答には、進行中の攻撃のattackID値がリストされます。
query GetOngoingAttackIds($accountTag: string, $filter: filter) { viewer { accounts(filter: { accountTag: $accountTag }) { ipFlows1mGroups(limit: 1000, filter: $filter) { dimensions { attackId } } } } }進行中の攻撃がある場合、ipFlows1mAttacksGroupsノードにクエリを作成し、前のクエリからのattackID値でフィルタリングします。以下のクエリは、最大ビットおよびパケットレートを返します。
query GetOngoingAttacks($accountTag: string, $filter: filter) { viewer { accounts(filter: { accountTag: $accountTag }) { ipFlows1mAttacksGroups(limit: 1000, filter: $filter) { dimensions { attackId } max { bitsPerSecond packetsPerSecond } } } } }進行中の攻撃がない場合、GetPreviousAttacksクエリを使用して、絶対的な時間間隔内の攻撃のデータを表示します。