コンテンツにスキップ

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
先週ipFlows1dGroupsdate
先月ipFlows1dGroupsdate
24時間ipFlows1mGroupsdatetimeFifteenMinutes
12時間ipFlows1mGroupsdatetimeFifteenMinutes
6時間ipFlows1mGroupsdatetimeFiveMinutes
30分ipFlows1mGroupsdatetimeMinute
カスタム範囲選択した範囲に依存選択した範囲に依存

以下の表は、異なる時間範囲を表すクエリノードに対して有効な開始時間および終了時間属性を示しています。

クエリノード開始日/時間フィルタ終了日/時間フィルタ
ipFlows1mGroupsdatetimeMinute_geqdatetimeMinute_leq
ipFlows1mAttacksGroupsdate_geqdate_leq
ipFlows1hGroupsdatetimeHour_geqdatetimeHour_leq
ipFlows1dGroupsdate_geqdate_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
}
}
}
}
}

トップNカード - ソース

このクエリは、トップソースIPに関するデータを返します。 limitパラメータは、各ノードに返されるレコードの量を制御します。以下のコードでは、強調表示された行がlimitを設定する場所を示しています。

トップNカードクエリ
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
}
}
}
}
}

トップNカード - 宛先

このクエリは、トップ宛先IPに関するデータを返します。limitパラメータは、返されるレコードの量を制御します。以下のコードでは、強調表示された行がクエリが5つの最高の結果を返すことを示しています。

トップNカード - 宛先
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
}
}
}
}
}

TCPフラグ

このクエリは、IPフローの分単位の集計からTCPパケットの数を抽出し、TCPフラグ値で結果をグループ化します。limit: 8を使用して、上位8つの結果を表示し、降順で提示します。

TCPデータを表示するために、フィルタに以下の行を追加します:

{ ipProtocol: 'TCP' }
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を時間間隔に使用します。

GetPreviousAttacksクエリ - 過去の攻撃を取得
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値がリストされます。

GetOngoingAttackIdsクエリ - 進行中の攻撃を確認
query GetOngoingAttackIds($accountTag: string, $filter: filter) {
viewer {
accounts(filter: { accountTag: $accountTag }) {
ipFlows1mGroups(limit: 1000, filter: $filter) {
dimensions {
attackId
}
}
}
}
}

進行中の攻撃がある場合、ipFlows1mAttacksGroupsノードにクエリを作成し、前のクエリからのattackID値でフィルタリングします。以下のクエリは、最大ビットおよびパケットレートを返します。

GetOngoingAttacksクエリ - 進行中の攻撃のデータを取得
query GetOngoingAttacks($accountTag: string, $filter: filter) {
viewer {
accounts(filter: { accountTag: $accountTag }) {
ipFlows1mAttacksGroups(limit: 1000, filter: $filter) {
dimensions {
attackId
}
max {
bitsPerSecond
packetsPerSecond
}
}
}
}
}

進行中の攻撃がない場合、GetPreviousAttacksクエリを使用して、絶対的な時間間隔内の攻撃のデータを表示します。