GraphQL のセットアップ
GraphQL は API のための照会言語です。 単一の /graphql
エンドポイント上で照会を実行できます。 GraphiQL は、標準装備のイントロスペクション・システムを使用することによりスキーマを介して情報を公開します。
GraphQL アナリティクス API エンドポイントは、エンタープライズ・レベルのプランでのみ使用可能です。
前提条件
続行するには、以下の権限が必要です。
- インスタンス・レベルまたはゾーン・レベルのいずれかでのビューアーの権限が必要です。
- ゾーン・レベルでのリーダーの権限が必要です。
GraphiQL ツール
GraphiQL を使用して、スキーマを検討し、GraphQL エンドポイント用の照会をテストすることができます。
- ダウンロードとインストールGraphiQL。
- GraphiQL アプリケーションを開き、許可する HTTP ヘッダーを入力します。
- **「GraphQl エンドポイント (GraphQl Endpoint)」**フィールドに正しいエンドポイントを入力します。 使用
https://api.cis.cloud.ibm.com/v1/<crn>/zones/<zoneid>/graphql
ウィンドウは照会ペインと応答ペインに分割されています。 照会ペインで、照会に挿入される照会変数を定義できます。
照会を構築するには、以下の手順に従います。
POST
「メソッド」**リスト・メニューで ** を選択します。- **「HTTP ヘッダーの編集 (Edit HTTP Headers)」**をクリックします。
X-Auth-User-Token
または許可トークンを入力し、Content-Type をapplication/json
に設定します。 それらを保存してください。
照会ペインで照会の構築を開始します。 Document Explorer を使用して、スキーマと文書を検討します。 Document Explorer には、データ・セット、ディメンション、運用、および関数についての使用可能なさまざまなオプションが表示されます。 Document Explorer で、「ゾーン」と「ドメイン」という語は同義語です。
以下のテスト・スニペットを照会ペインに貼り付け、応答ペインでの応答を監視します。datetime
は必要に合わせて調整してください。
query {
viewer {
zones(filter: {zoneTag: "<your domain ID>"}) {
httpRequests1hGroups(limit: 5, filter: { datetime_gt: "2020-08-30T04:00:00Z", datetime_lt: "2020-08-31T06:00:00Z"}) {
sum {
countryMap {
bytes
clientCountryName
}
}
dimensions {
date
datetime
}
}
firewallEventsAdaptiveGroups(limit: 10, filter: { datetime_gt: "2020-08-30T04:00:00Z", datetime_lt: "2020-08-31T06:00:00Z"}) {
count
dimensions {
clientCountryName
clientAsn
datetimeHour
}
}
}
}
}
照会の基本
GraphQL はデータをグラフとして構造化します。 必要なデータを取得するために、グラフのエッジを検討できます。 照会フォーマットの例を以下に示します。
viewer {
zones(filter:...) {
requests(filter:...) {
date, time, bytes,...
}
}
}
照会を実行しているユーザーの初期ノードは viewer
です。 ビューアーは、1 つ以上のドメイン (ゾーン) にアクセスできます。 各ゾーンには、ゾーンのファイアウォール・イベントなど、異なるデータ・セットが含まれています。
集合データを表すノードには、groups
サフィックスが含まれます (例: firewallEventsAdaptiveGroups
)。 以下の例に示されているように、各グループは特定の構造に従います。
type ExampleGroup {
count # No subfields, it is just the group size.
sum {
# fields that support summing (numbers, maps of numbers)
}
avg {
# fields that support averaging (numbers)
}
uniq {
# fields that support uniqueing (numbers, strings, enums, IPs, dates, etc.)
}
}
以下の例は、有効なグループを示しています。
httpRequests1mGroups {
sum {
bytes
}
uniq {
uniques # unique IPs
}
dimensions {
datetimeMinute
}
}
データ・セット
以下は、よく利用されるデータセットのリストである。 データセットの詳細については、GraphQLイントロスペクション・メカニズムを使用できます。
データ・セット | Node |
---|---|
ブラウザー・インサイト | browserInsightsAdaptiveGroups |
ファイアウォール・アクティビティー・ログ | firewallEventsAdaptive firewallEventsAdaptiveByTimeGroups |
ファイアウォール・アナリティクス | firewallEventsAdaptiveGroups |
ヘルス・チェック・アナリティクス | healthCheckEvents healthCheckEventsGroups |
HTTP リクエスト | httpRequests1mGroups httpRequests1hGroups httpRequests1dGroups httpRequestsAdaptiveGroups |
画像サイズ変更アナリティクス | imageResizingRequests1mGroups |
ロード・バランシング・アナリティクス | loadBalancingRequests loadBalancingRequestsGroups |
SYN 攻撃 (DoS 攻撃) | synAvgPps1mGroups |
エッジ機能メトリック | workersInvocationsAdaptive |
エラー
GraphQL Analytics API は、HTTPS 要求と JSON 応答に基づく RESTful API であり、使い慣れた HTTP 状況コード ( 404
、 500
、 504
など) を返します。 GraphQL 仕様に従うと、 200
応答にエラーが含まれる可能性があります。これは、一般的な REST アプローチとは対照的です。
すべての応答にはエラー配列が含まれます。エラーがない場合、それはヌルとなります。 ヌル以外のエラーには、message
、path
、および timestamp
が含まれます。
以下のコードは、エラー応答の例です。
{
"data": null,
"errors": [
{
"message": "cannot request data older than 2678400s",
"path": [
"viewer",
"zones",
"0",
"firewallEventsAdaptiveGroups"
],
"extensions": {
"timestamp": "2019-12-09T21:27:19.195060142Z"
}
}
]
}
制限
履歴データの保存限度は、以下の表に規定されています。
データ・ノード | Enterprise |
---|---|
browserInsightsAdaptiveGroups |
30 日間 |
firewallEventsAdaptiveByTimeGroups |
30 日間 |
firewallEventsAdaptiveGroups |
30 日間 |
healthCheckEventsGroups |
90 日間 |
healthCheckEvents |
90 日間 |
httpRequestsAdaptiveGroups |
30 日間 |
httpRequests1dGroups |
365 日間 |
httpRequests1hGroups |
90 日間 |
httpRequests1mGroups |
7 日間 |
loadBalancingRequestsGroups |
30 日間 |
loadBalancingRequests |
30 日間 |
synAvgPps1mGroups |
7 日間 |
アカウント制限のための照会設定
データ・ノードの制限に関する特定の情報を取得するには、settings
ノードを使用します。
フィールド | 説明 |
---|---|
enabled |
現在のプランでデータ・セット (ノード) が使用可能な場合、true を戻します。 |
maxDuration |
1 つの照会で要求できる最大期間 (秒数) を規定します (データ・ノードによって異なります)。 |
maxNumberOfFields |
1 つの照会で要求できるフィールドの最大数を規定します (データ・ノードによって異なります)。 |
maxPageSize |
1 つの照会で戻すことのできるレコードの最大数を規定します (データ・ノードによって異なります)。 |
notOlderThan |
照会で検索できるレコードの古さを制限します (秒数、データ・ノードとプランによって異なります)。 |
照会の例を以下に示します。
{
viewer {
zones(filter: { zoneTag: $zoneTag }) {
settings {
browserInsightsAdaptiveGroups {
maxDuration
maxNumberOfFields
maxPageSize
enabled
notOlderThan
}
}
}
}
}
照会応答は以下のとおりです。
{
"data": {
"viewer": {
"zones": [
{
"settings": {
"browserInsightsAdaptiveGroups": {
"enabled": true,
"maxDuration": 2592000,
"maxNumberOfFields": 30,
"maxPageSize": 10000,
"notOlderThan": 2595600
}
}
}
]
}
},
"errors": null
}
照会の制限
1 つの照会で戻すことのできるデータのボリュームは制限されており、ユーザーの日次のデータ・ボリュームには制限があります。 API によって適用される一般的なレート制限に加えて、以下の制限が適用されます。
- ゾーンを範囲とする照会には、最大 10 のゾーンを含めることができます。
maxNumberOfFields
のsettings
に示されているように、照会は最大 30 のフィールドを要求できます。- 応答は最大 10,000 のレコードを戻すことができます。 この制限は、
maxPageSize
のsettings
に示されています。
照会で戻すレコードの上限は、limit
引数を使用して明示的に指定する必要があります。
ソート
orderBy
引数を使用して、照会結果の要素の順序をソートすることができます。 デフォルトで、結果はデータ・セット (テーブル) の 1 次キーによってソートされます。 ソート基準に別のフィールドを指定した場合、ページネーションのために一貫性のある結果を維持するために、1 次キーがソート・キーに組み込まれます。
ネストされた構造内での順序付けはサポートされていません。
ソートの例
生データのソート
firewallEventsAdaptive (orderBy: [clientCountryName_ASC]) {
clientCountryName
}
複数のフィールドを使用した生データのソート
firewallEventsAdaptive (orderBy: [clientCountryName_ASC, datetime_DESC]) {
clientCountryName
datetime
}
集約関数によるグループ・ソート
httpRequests1hGroups (orderBy: [sum_bytes_DESC]){
sum {
bytes
requests
}
dimensions {
datetime
}
}
ページネーション
ページ編集 (照会結果をより小さな部分に分割) は、 limit
、 orderBy
、およびフィルター・パラメーターを使用して行うことができます。 GraphQL Analytics API は、ページネーションのカーソルをサポートしていません。
limit
(整数) は、戻すレコードの数を規定します。orderBy
(ストリング) は、データのソート順を規定します。
カーソルのない照会ページ
以下の例では、date
と clientCountryName
の関係が一意であると想定しています。
照会の最初の N 件の結果を取得します。
結果の数を制限するには、limit
パラメーターを追加します。 例えば、最初の 2 つのレコードを照会することができます。
firewallEventsAdaptive (limit: 2, orderBy: [datetime_ASC, clientCountryName_ASC]) {
datetime
clientCountryName
}
日付によるソート順を指定する場合は、日付と国の両方によるソート順を指定する場合よりも、戻される結果が明確ではなくなります。
照会応答は以下のとおりです。
{
"firewallEventsAdaptive" : [
{
"datetime": "2018-11-12T00:00:00Z",
"clientCountryName": "UM"
},
{
"datetime": "2018-11-12T00:00:00Z",
"clientCountryName": "US"
}
]
}
フィルターを使用した次のページの照会
次の N 件の結果を取得するには、前の照会の最後の結果を除外するフィルターを指定します。 前の例を使用し、「より大」の演算子 (_gt
) を clientCountryName
フィールドに付加し、「以上」の演算子を datetime
フィールドに付加することができます。 具体的に指定することにより、最適な結果を取得することができます。
firewallEventsAdaptive (limit: 2, orderBy: [datetime_ASC, clientCountryName_ASC], filter: {date_geq: "2018-11-12T00:00:00Z", clientCounterName_gt: "US"}) {
date
clientCountryName
}
照会応答は以下のとおりです。
{
"firewallEventsAdaptive" : [
{
"datetime": "2018-11-12T00:00:00Z",
"clientCountryName": "UY"
},
{
"datetime": "2018-11-12T00:00:00Z",
"clientCountryName": "UZ"
}
]
}
前のページの照会
以前の N 件の結果を取得するには、フィルターとソート順を逆にします。
firewallEventsAdaptive (limit: 2, orderBy: [datetime_DESC, clientCountryName_DESC, filter: {date_leq: "2018-11-12T00:00:00Z", clientCountryName_lt: "UY"}]) {
datetime
clientCountryName
}
照会応答は以下のとおりです。
{
"firewallEventsAdaptive" : [
{
"datetime": "2018-11-12T00:00:00Z",
"clientCountryName": "US"
},
{
"datetime": "2018-11-12T00:00:00Z",
"clientCountryName": "UM"
}
]
}
フィルタリング
フィルターは、照会を、特定のアカウントや一連のゾーン (ドメイン)、日付における要求、または特定の照会エージェントに制約します。 フィルターを使用しないと、パフォーマンスは低下し、重要ではないデータが結果に含まれる可能性があります。
構造
GraphQL フィルタは、 GraphQL 入力オブジェクトによって表されます。
以下のリソースでは、フィルターを引数として使用できます。
- ゾーン (ドメイン)
- テーブル (データ・セット)
- アカウント
ゾーン (ドメイン) フィルター
ゾーン・フィルターを使用すると、ゾーンに関連したデータをゾーン (ドメイン) ID (zoneTag
) によって照会できます。
zones(filter: {zoneTag: "your domain (zone) ID"}) {
...
}
ゾーン・フィルターは、以下の文法に準拠している必要があります。
filter
{ zoneTag: t }
{ zoneTag_gt: t }
{ zoneTag_in: [t, ...] }
複合フィルター (コンマ区切り、AND
、OR
) はサポートされていません。 ゾーンは常に英数字に基づいてソートされます。
テーブル (データ・セット) フィルター
テーブル・フィルターでは、少なくとも 1 つのノードを照会することが必要です。 AND
演算子を使用して、マルチノード・フィルターを作成し、結合することができます。
アカウント・フィルター
アカウント・レベルのフィルタリングがサポートされています。必須のフィルター・パラメーターがあります。 以下に例を示します。
accounts(filter: {accountTag: $accountTag}) {
...
}
オペレーター
演算子のサポートは、ノード・タイプとノード名に応じてさまざまです。 以下の演算子は、すべてのタイプでサポートされています。
オペレーター | 比較 |
---|---|
gt |
より大きい |
lt |
より小さい |
geq |
以上 |
leq |
以下 |
neq |
等しくない |
in |
in |
例
一般的な例:
{
myQuery(
filter: {
clientCountry: "UK" # all objects having client country equal to "UK"
datetime_gt: "2020-01-01 10:00:00" # all object having datetime greater than "2020-01-01 10:00:00"
}
)
}
特定のノードのフィルタリング:
httpRequests1hGroups(filter: {datetime: "2020-01-01 10:00:00"}) {
...
}
複数のフィールドでのフィルタリング:
httpRequests1hGroups(filter: {datetime_gt: "2018-01-01 10:00:00", datetime_lt: "2018-01-01 11:00:00"}) {
...
}
OR
演算子を使用したフィルタリング:
httpRequests1hGroups(filter: {
datetime: "2020-01-01 10:00:00",
OR:[{clientCountryName: "US"}, {clientCountryName: "UK"}]) {
...
}