GraphQL 설정
GraphQL은 API를 위한 조회 언어입니다. 단일 /graphql 엔드포인트에서 조회를 실행할 수 있습니다. GraphiQL은 기본 제공 인트로스펙션 시스템을 사용하여 스키마를 통해 정보를 노출합니다.
GraphQL 분석 API 엔드포인트는 엔터프라이즈 레벨 플랜에서만 사용할 수 있습니다.
전제조건
계속하려면 다음 권한이 있어야 합니다.
- 인스턴스 레벨 또는 구역 레벨에서 뷰어 권한이 있어야 합니다.
- 구역 레벨에서 독자 권한이 있어야 합니다.
GraphiQL 도구
GraphiQL을 사용하여 GraphQL 엔드포인트에 대한 스키마 및 테스트 조회를 탐색할 수 있습니다.
- 다운로드 및 설치 GraphiQL.
- GraphiQL 애플리케이션을 열고 권한을 부여할 HTTP 헤더를 입력하십시오.
- GraphQ1 엔드포인트 필드에 올바른 엔드포인트를 입력하십시오.
https://api.cis.cloud.ibm.com/v1/<crn>/zones/<zoneid>/graphql을(를) 사용하십시오.
창은 조회 분할창과 응답 분할창으로 나뉩니다. 조회 분할창에서 조회에 보간되는 조회 변수를 정의할 수 있습니다.
조회를 빌드하려면 다음 단계를 수행하십시오.
POST메소드** 목록 메뉴에서 **를 선택하십시오.- HTTP 헤더 편집을 클릭하십시오.
X-Auth-User-Token또는 Authorization 토큰을 입력하고 Content-Type:application/json을 설정하십시오. 저장하십시오.
조회 분할창에서 조회 빌드를 시작하십시오. 문서 탐색기를 사용하여 스키마 및 문서를 탐색하십시오. 문서 탐색기는 데이터 세트, 차원, 오퍼레이션 및 함수에 대해 사용 가능한 여러 옵션을 표시합니다. "구역"과 "도메인"이라는 단어는 문서 탐색기에서 동의어입니다.
다음 테스트 스니펫을 조회 분할창에 붙여넣고 응답 분할창에서 응답을 관찰하고 필요에 따라 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입니다. 뷰어는 하나 이상의 도메인(구역)에 액세스할 수 있습니다. 각 구역에는 구역에 대한 방화벽 이벤트와 같은 다른 데이터 세트가 포함됩니다.
집계된 데이터를 나타내는 노드에는 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 |
| Edge Functions 메트릭 | workersInvocationsAdaptive |
오류
GraphQL Analytics API는 HTTPS 요청 및 JSON 응답을 기반으로 하는 RESTful API이며 친숙한 HTTP 상태 코드(예: 404, 500, 504)를 리턴합니다. GraphQL 사양에 따라 200 응답에 오류가 포함될 수 있으며 이는 일반적인 REST 접근 방식과 대조됩니다.
모든 응답에는 오류 배열이 포함되며 오류가 없으면 널(null)입니다. 널이 아닌 오류에는 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 |
한 조회에서 요청할 수 있는 최대 기간(초)을 정의합니다(데이터 노드에 따라 다름). |
maxNumberOfFields |
한 조회에서 요청할 수 있는 최대 필드 수를 정의합니다(데이터 노드에 따라 다름). |
maxPageSize |
한 조회에서 리턴할 수 있는 최대 레코드 수를 정의합니다(데이터 노드에 따라 다름). |
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
}
조회 한계
조회가 리턴할 수 있는 데이터 볼륨은 제한되어 있으며 일일 데이터 볼륨에는 사용자 한계가 있습니다. API에서 적용하는 일반 속도 제한에 추가로 다음 한계가 적용됩니다.
- 구역 범위 조회에는 최대 10개의 구역이 포함될 수 있습니다.
- 조회는
maxNumberOfFields에서settings에 표시된 대로 최대 30개의 필드를 요청할 수 있습니다. - 응답은 최대 10,000개의 레코드를 리턴할 수 있습니다. 이 한계는
maxPageSize에서settings로 표시됩니다.
쿼리에서는 limit 인수를 사용하여 반환할 레코드의 최대 개수를 명시적으로 지정해야 합니다.
정렬
orderBy 인수를 사용하여 조회 결과 요소의 순서를 정렬할 수 있습니다. 기본적으로 결과는 데이터 세트(테이블)의 기본 키를 기준으로 정렬됩니다. 정렬할 다른 필드를 지정하는 경우 페이지 매김에 대한 일관된 결과를 유지하기 위해 기본 키가 정렬 키에 포함됩니다.
중첩된 구조 내에서의 정렬은 지원되지 않습니다.
정렬 예
원시 데이터 정렬:
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 매개변수를 추가하십시오. 예를 들어, 처음 두 개의 레코드를 조회합니다.
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)는 지원되지 않습니다. 구역은 항상 영숫자 순으로 정렬됩니다.
테이블 (데이터 세트) 필터
테이블 필터를 사용하려면 하나 이상의 노드를 조회해야 합니다. 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"}]) {
...
}