GLQL API
GitLab v19.5Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
요약
이 API를 사용하면 GitLab Query Language(GLQL) 쿼리를 프로그래밍 방식으로 실행할 수 있습니다. GLQL 쿼리를 실행하여 GitLab 리소스를 검색하고 필터링합니다. 이 엔드포인트는 쿼리 SHA를 기준으로 쿼리 속도를 제한합니다.
히스토리
- GitLab 18.7에서 도입되었습니다.
이 API를 사용하면 GitLab Query Language(GLQL) 쿼리를 프로그래밍 방식으로 실행할 수 있습니다. GLQL은 프로젝트와 그룹 전반에서 이슈, 머지 리퀘스트, 에픽 같은 GitLab 리소스를 검색하고 필터링하기 위한 단순한 쿼리 언어를 제공합니다.
사전 요구 사항:
- 그룹 또는 프로젝트가 자신의 데이터에 대한 액세스를 허용해야 합니다.
- 비공개 그룹과 프로젝트에서는 적절한 권한을 가진 개인 액세스 토큰을 사용해야 합니다.
GLQL 쿼리 실행#
GLQL 쿼리를 실행하여 GitLab 리소스를 검색하고 필터링합니다.
POST /glql
이 엔드포인트는 쿼리 SHA를 기준으로 쿼리 속도를 제한합니다. 타임아웃이 발생한 동일한 쿼리는 추적되며, 너무 자주 실행되면 일시적으로 차단될 수 있습니다.
지원되는 속성:
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
glql_yaml |
string | Yes | YAML 구성을 선택적으로 포함하는 GLQL 쿼리입니다. 최대 크기: 10,000바이트(10KB). 자세한 내용은 쿼리 형식을 참고합니다. |
after |
string | No | 페이지네이션 커서입니다. 이전 쿼리의 data.pageInfo.endCursor 값을 사용하여 다음 결과 페이지를 가져옵니다. |
쿼리 형식#
glql_yaml 파라미터는 query 키를 포함하는 YAML 형식을 허용합니다.
fields: id,title,author
group: my-group
limit: 10
sort: created desc
query: state = opened
구성 옵션#
YAML에 다음 구성 옵션을 포함할 수 있습니다.
| 옵션 | 유형 | 필수 | 설명 |
|---|---|---|---|
fields |
string | No | 반환할 필드를 쉼표로 구분한 목록입니다. 기본값: title. 사용 가능한 필드를 참고합니다. |
group |
string | No | 쿼리 범위를 특정 그룹으로 지정합니다. project와 함께 사용할 수 없습니다. 쿼리에도 group 이 지정된 경우 쿼리 값이 우선합니다. |
limit |
integer | No | 반환할 최대 결과 수입니다. 1에서 100 사이여야 합니다. 기본값: 100. |
project |
string | No | 쿼리 범위를 특정 프로젝트로 지정합니다. 형식: group/project. 쿼리에도 project가 지정된 경우 쿼리 값이 우선합니다. |
sort |
string | No | 결과의 정렬 순서입니다. 형식: field direction(예: created asc 또는 created desc). |
사용 가능한 필드#
fields 구성 옵션에 사용 가능한 GLQL 필드를 쉼표로 구분한 목록으로 설정합니다.
GLQL 쿼리 구문#
쿼리 구문은 GLQL에 정의되어 있습니다.
응답 속성#
요청이 성공하면 200 OK와 다음 응답 속성을
반환합니다.
| 속성 | 유형 | 설명 |
|---|---|---|
data |
object | 쿼리 결과를 포함합니다. |
data.count |
integer | 일치하는 결과의 전체 개수입니다. |
data.nodes |
array | 요청한 필드를 포함하는, 일치하는 리소스의 배열입니다. |
data.pageInfo |
object | 페이지네이션 정보입니다. |
data.pageInfo.endCursor |
string | 다음 결과 페이지를 가져오기 위한 커서입니다. |
data.pageInfo.hasNextPage |
boolean | 추가 결과가 있는지 나타냅니다. |
data.pageInfo.hasPreviousPage |
boolean | 이전 결과가 있는지 나타냅니다. |
data.pageInfo.startCursor |
string | 이전 결과 페이지를 가져오기 위한 커서입니다. |
error |
string | 쿼리가 실패한 경우의 오류 메시지입니다. |
fields |
array | 필드 정의의 배열입니다. |
fields[].field |
string | 기본 필드 이름입니다. 별칭이 지정된 파라미터 필드에서는 기저 필드 이름(예: durationQuantile)이고, key가 별칭(예: p50)입니다. 표준 필드에서는 key와 같습니다. |
fields[].key |
string | 고유한 필드 식별자입니다. |
fields[].label |
string | 사람이 읽을 수 있는 필드 이름입니다. |
fields[].name |
string | 유사한 필드를 하나로 묶는 공통 필드 이름입니다. 예를 들어 created와 createdAt 키의 이름은 createdAt 입니다. 별칭이 지정된 파라미터 필드에서는 공통 이름이 아니라 생성된 응답 키(예: durationQuantile_quantile_0_d5)입니다. |
fields[].parameters |
object | 파라미터 필드에 대해 확정된 파라미터 메타데이터입니다. 필드에 파라미터가 없으면 존재하지 않습니다. 값은 문자열이거나, 목록 파라미터의 경우 문자열 배열입니다. 예를 들어 {"granularity": "weekly"}, {"quantile": "0.5"}, 또는 {"thresholds": ["4", "25", "100"]} 입니다. |
fields[].type |
string | 필드 분류로, 분석 모드 필드의 경우 dimension 또는 metric 입니다. 표준 필드에는 존재하지 않습니다. |
success |
boolean | 쿼리 성공 여부를 나타냅니다. |
예시: 기본 쿼리#
그룹에서 열린 이슈를 검색합니다.
curl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--header "Content-Type: application/json" \
--data '{
"glql_yaml": "query: group = \"my-group\" AND state = opened"
}' \
--url "https://gitlab.example.com/api/v4/glql"
응답 예시:
{
"data": {
"count": 1,
"nodes": [
{
"id": "gid://gitlab/Issue/123",
"iid": "123",
"reference": "#123",
"state": "OPEN",
"title": "Add an example of GoLang HTTP server",
"webUrl": "https://gitlab.example.com/my-group/my-project/-/issues/123",
"widgets": null
}
],
"pageInfo": {
"endCursor": "eyJpZCI6IjEyMyJ9",
"hasNextPage": false,
"hasPreviousPage": false,
"startCursor": "eyJpZCI6IjEyMyJ9"
}
},
"error": null,
"fields": [
{
"field": "title",
"key": "title",
"label": "Title",
"name": "title"
}
],
"success": true
}
예시: front matter 구성을 포함한 쿼리#
사용자 지정 필드와 정렬을 사용하여 검색합니다.
curl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--header "Content-Type: application/json" \
--data '{
"glql_yaml": "fields: id,title,author,state\ngroup: my-group\nlimit: 5\nsort: created desc\nquery: state = opened"
}' \
--url "https://gitlab.example.com/api/v4/glql"
응답 예시:
{
"data": {
"count": 2,
"nodes": [
{
"author": {
"avatarUrl": "https://www.gravatar.com/avatar/4a17cff4a15e98966063bd203d88aceac682c623e74943a08cdbe0cce87c6d7c?s=80&d=identicon",
"id": "gid://gitlab/User/123",
"name": "John Doe",
"username": "johndoe",
"webUrl": "https://gitlab.example.com/johndoe"
},
"id": "gid://gitlab/Issue/123",
"iid": "123",
"reference": "#123",
"state": "OPEN",
"title": "Add an example of GoLang HTTP server",
"webUrl": "https://gitlab.example.com/my-group/my-project/-/issues/123",
"widgets": null
},
{
"author": {
"avatarUrl": "https://www.gravatar.com/avatar/4a17cff4a15e98966063bd203d88aceac682c623e74943a08cdbe0cce87c6d7c?s=80&d=identicon",
"id": "gid://gitlab/User/122",
"name": "Jane Doe",
"username": "janedoe",
"webUrl": "https://gitlab.example.com/janedoe"
},
"id": "gid://gitlab/Issue/122",
"iid": "122",
"reference": "#122",
"state": "OPEN",
"title": "HTTP server examples for all programming languages",
"webUrl": "https://gitlab.example.com/groups/my-group/-/issues/122",
"widgets": null
}
],
"pageInfo": {
"endCursor": "eyJpZCI6IjEyMyJ9",
"hasNextPage": false,
"hasPreviousPage": false,
"startCursor": "eyJpZCI6IjEyMyJ9"
}
},
"error": null,
"fields": [
{
"field": "id",
"key": "id",
"label": "ID",
"name": "id"
},
{
"field": "title",
"key": "title",
"label": "Title",
"name": "title"
},
{
"field": "author",
"key": "author",
"label": "Author",
"name": "author"
},
{
"field": "state",
"key": "state",
"label": "State",
"name": "state"
}
],
"success": true
}
예시: 프로젝트 범위를 지정한 쿼리#
특정 프로젝트에서 검색합니다.
curl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--header "Content-Type: application/json" \
--data '{
"glql_yaml": "query: project = \"my-group/my-project\" AND state = opened"
}' \
--url "https://gitlab.example.com/api/v4/glql"
예시: currentUser() 함수를 사용한 쿼리#
현재 사용자에게 할당된 이슈를 검색합니다.
curl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--header "Content-Type: application/json" \
--data '{
"glql_yaml": "fields: id,title,assignees\nquery: group = \"my-group\" AND assignee = currentUser()"
}' \
--url "https://gitlab.example.com/api/v4/glql"
응답 예시:
{
"data": {
"count": 1,
"nodes": [
{
"assignees": {
"nodes": [
{
"avatarUrl": "https://www.gravatar.com/avatar/4a17cff4a15e98966063bd203d88aceac682c623e74943a08cdbe0cce87c6d7c?s=80&d=identicon",
"id": "gid://gitlab/User/123",
"name": "John Doe",
"username": "johndoe",
"webUrl": "https://gitlab.example.com/johndoe"
}
]
},
"id": "gid://gitlab/Issue/123",
"iid": "123",
"reference": "#123",
"state": "OPEN",
"title": "Add an example of GoLang HTTP server",
"webUrl": "https://gitlab.example.com/my-group/my-project/-/issues/123",
"widgets": null
}
],
"pageInfo": {
"endCursor": "eyJpZCI6IjEyMyJ9",
"hasNextPage": false,
"hasPreviousPage": false,
"startCursor": "eyJpZCI6IjEyMyJ9"
}
},
"error": null,
"fields": [
{
"field": "id",
"key": "id",
"label": "ID",
"name": "id"
},
{
"field": "title",
"key": "title",
"label": "Title",
"name": "title"
},
{
"field": "assignees",
"key": "assignees",
"label": "Assignees",
"name": "assignees"
}
],
"success": true
}
예시: 제한과 페이지네이션을 사용한 쿼리#
제한된 개수의 결과를 조회하고 페이지 단위로 이동합니다.
curl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--header "Content-Type: application/json" \
--data '{
"glql_yaml": "limit: 2\nquery: group = \"my-group\" AND state = opened"
}' \
--url "https://gitlab.example.com/api/v4/glql"
응답 예시:
{
"data": {
"count": 68,
"nodes": [
{
"id": "gid://gitlab/Issue/321",
"iid": "321",
"reference": "#321",
"state": "OPEN",
"title": "Corrupti consectetur impedit non blanditiis hic vitae minus.",
"webUrl": "https://gitlab.example.com/my-group/my-project/-/issues/321",
"widgets": null
},
{
"id": "gid://gitlab/WorkItem/322",
"iid": "322",
"reference": "#322",
"state": "OPEN",
"title": "Ipsa cupiditate corrupti vel maxime quasi at assumenda repellat quod.",
"webUrl": "https://gitlab.example.com/my-group/my-project/-/issues/322",
"widgets": null
}
],
"pageInfo": {
"endCursor": "eyJpZCI6IjIifQ==",
"hasNextPage": true,
"hasPreviousPage": false,
"startCursor": "eyJpZCI6IjEyMyJ9"
}
},
"error": null,
"fields": [
{
"field": "title",
"key": "title",
"label": "Title",
"name": "title"
}
],
"success": true
}
다음 페이지를 가져오려면 이전 응답의 endCursor 값을 사용합니다.
curl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--header "Content-Type: application/json" \
--data '{
"glql_yaml": "limit: 2\nquery: group = \"my-group\" AND state = opened",
"after": "eyJpZCI6IjIifQ=="
}' \
--url "https://gitlab.example.com/api/v4/glql"
예시: 분석 모드 쿼리#
파이프라인 지표를 차원별로 집계합니다.
분석 모드에서는 fields 배열에 각 필드의 type 속성이 포함되며,
파라미터 필드에는 parameters 속성이 포함됩니다.
curl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--header "Content-Type: application/json" \
--data '{
"glql_yaml": "mode: analytics\ndimensions: ref\nmetrics: durationQuantile(0.5) as \"p50\"\nquery: type = Pipeline AND project = \"my-group/my-project\" AND finished >= -30d"
}' \
--url "https://gitlab.example.com/api/v4/glql"
응답 예시:
{
"data": {
"count": 2,
"nodes": [
{
"durationQuantile_quantile_0_d5": 245.5,
"p50": 245.5,
"ref": "main"
},
{
"durationQuantile_quantile_0_d5": 312.0,
"p50": 312.0,
"ref": "feature-branch"
}
],
"pageInfo": {
"endCursor": "eyJpZCI6IjIifQ==",
"hasNextPage": false,
"hasPreviousPage": false,
"startCursor": "eyJpZCI6IjEifQ=="
}
},
"error": null,
"fields": [
{
"field": "ref",
"key": "ref",
"label": "Ref",
"name": "ref",
"type": "dimension"
},
{
"field": "durationQuantile",
"key": "p50",
"label": "p50",
"name": "durationQuantile_quantile_0_d5",
"parameters": {
"quantile": "0.5"
},
"type": "metric"
}
],
"success": true
}
GLQL 스키마 조회#
히스토리
GLQL 스키마를 조회합니다. 스키마에는 사용 가능한 데이터 소스와 각 소스의 필터·표시·정렬 필드, 연산자·값 종류·참조 유형 어휘, 사용 가능한 함수, 그리고 쿼리를 렌더링할 수 있는 표시 유형이 포함됩니다.
이 문서는 쿼리 언어를 설명합니다. 사용자에게 제공되지 않는 데이터 소스를 대상으로 하는 쿼리는
POST /glql에서 실패합니다.
이 문서는 GitLab을 업그레이드할 때만 변경됩니다. ETag와 함께 제공되므로 If-None-Match를
보내 재검증하면 전체 문서 대신 304 Not Modified를 받을 수 있습니다.
GET /glql/schema
이 엔드포인트는 파라미터를 받지 않으며 모든 사용자에게 동일한 문서를 반환합니다.
요청이 성공하면 200 OK와 다음 응답 속성을
반환합니다.
| 속성 | 유형 | 설명 |
|---|---|---|
display_types |
object array | 쿼리를 렌더링하는 방식과 각 방식에 필요한 조건입니다. display:를 생략하면 목록으로 렌더링됩니다. 아래를 참고합니다. |
functions |
object array | 사용 가능한 함수이며, 각각 name, kind(쿼리에서 사용하면 value, fields에서 사용하면 field), description, args, returns를 가집니다. |
operators |
object array | 비교 연산자이며, 각각 symbol, name, label을 가집니다. |
reference_types |
object array | 참조 접두사이며, 각각 name, symbol, example을 가집니다. 예를 들어 레이블에는 ~를 사용합니다. |
sources |
object array | 데이터 소스입니다. 아래를 참고합니다. |
value_kinds |
object array | 필터 또는 필드 함수 파라미터가 허용하는 값의 종류이며, 각각 name과 description을 가집니다. |
version |
string | 이 문서가 포함된 GLQL gem의 버전입니다. |
display_types[]의 응답 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
description |
string | 해당 표시 유형이 렌더링하는 대상입니다. |
name |
string | GLQL 블록의 display: 옵션에 사용할 값입니다. |
selections |
object array | 해당 유형이 허용하는 차원과 지표의 조합입니다. 쿼리는 이 중 하나와 일치해야 합니다. 집계를 수행하는 유형에만 존재하며, 그래서 이러한 유형에는 mode: analytics가 필요합니다. 아래를 참고합니다. |
display_types[].selections[]의 응답 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
dimensions |
integer | 이 조합이 취하는 정확한 차원 수입니다. |
metrics |
object | 이 조합이 취하는 지표 수이며, min과 선택적 max로 표현됩니다. max가 없으면 제한이 없습니다. |
sources[]의 응답 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
label |
string | 사람이 읽을 수 있는 이름입니다. |
modes |
object array | 해당 소스가 지원하는 쿼리 모드입니다. 아래를 참고합니다. |
name |
string | 표준 소스 이름입니다. 예를 들어 WorkItems 입니다. |
sources[].modes[]의 응답 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
allowed_scopes |
string array | 해당 소스를 쿼리할 수 있는 범위입니다. 예를 들어 project 입니다. |
dimensions |
string array | 분석 모드에만 해당합니다. 그룹화 기준이 되는 필드입니다. |
display_fields |
object array | 표준 모드에만 해당합니다. fields에 사용할 수 있는 필드이며, 각각 name과 선택적 aliases를 가집니다. 분석 모드에는 이 속성이 없고 대신 dimensions와 metrics를 사용합니다. |
filter_fields |
object array | query에 사용할 수 있는 필드이며, 각각 name, 선택적 aliases, value_types를 가집니다. |
metrics |
string array | 분석 모드에만 해당합니다. 계산할 집계입니다. |
mode |
string | Standard 또는 Analytics 입니다. 여기서는 대문자로 시작하지만 GLQL 블록의 mode 옵션은 소문자입니다. 예를 들어 mode: analytics 입니다. |
multi_scope |
boolean | 쿼리의 group과 project가 전체 경로 목록을 허용하는지 여부를 나타냅니다. 여러 그룹 및 프로젝트를 참고합니다. |
parameterized_fields |
object array | 인수를 허용하는 필드이며, 각각 name과 parameters를 가집니다. 지원되는 경우에만 존재합니다. 아래를 참고합니다. |
sort_fields |
string array | sort에 사용할 수 있는 필드입니다. |
sort_restrictions |
object array | 한 방향만 허용하는 정렬 필드이며, 각각 name과 허용하는 directions를 가집니다. 이 목록에 없는 필드는 asc와 desc를 모두 허용합니다. 제한이 적용되는 경우에만 존재합니다. |
wildcard_filter_fields |
object array | 인수를 받는 필터이며, 각각 name, syntax 문자열, value_types를 가집니다. 예를 들어 customField("Name") 입니다. 지원되는 경우에만 존재합니다. |
sources[].modes[].filter_fields[].value_types[]의 응답 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
items |
object array | List 에만 해당합니다. 목록 안에서 허용되는 값 유형입니다. |
kind |
string | value_kinds 이름 중 하나입니다. |
operators |
string array | 해당 종류에 허용되는 연산자입니다. |
references |
string | Reference 에만 해당합니다. reference_types 이름 중 하나입니다. |
values |
string array | Enum과 StringEnum 에만 해당합니다. 허용되는 토큰입니다. type 필터에서 나열된 토큰은 해당 데이터 소스를 선택하는 토큰입니다. 둘 이상을 허용하는 것은 WorkItems 뿐인데, 작업 항목에서는 type 이 결과를 작업 항목 유형으로 좁히는 역할도 하기 때문입니다. |
sources[].modes[].parameterized_fields[].parameters[]의 응답 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
default |
string, number, or array | 인수를 생략했을 때 사용되는 값입니다. 파라미터가 required 또는 optional이면 존재하지 않습니다. |
items |
object array | List 에만 해당합니다. 목록 안에서 허용되는 값 유형이며, 각각 kind를 가지고, Number는 min과 max, Enum은 values를 가집니다. String 항목에는 추가 속성이 없습니다. |
kind |
string | Enum, Number, List, Granularity, Timestamp 중 하나입니다. |
max |
number | Number 에만 해당합니다. 허용되는 최댓값입니다. |
max_days |
number | Granularity 에만 해당합니다. 고정 일수의 최댓값이며 <max_days>d 형식으로 표기합니다. |
max_length |
number | List 에만 해당합니다. 허용되는 최대 항목 수입니다. |
min |
number | Number 에만 해당합니다. 허용되는 최솟값입니다. |
min_days |
number | Granularity 에만 해당합니다. 고정 일수의 최솟값입니다. |
min_length |
number | List 에만 해당합니다. 허용되는 최소 항목 수입니다. |
name |
string | 인수 이름입니다. 예를 들어 granularity 입니다. |
optional |
boolean | 인수를 생략할 수 있고 생략하면 전송되지 않을 때 true입니다. 이러한 파라미터에는 default가 없습니다. |
required |
boolean | 쿼리가 인수를 반드시 제공해야 할 때 true입니다. |
requires |
object | 인수가 같은 수준의 다른 파라미터의 특정 값과 함께일 때만 유효한 경우에 존재합니다. parameter(같은 수준 파라미터의 이름)와 value(허용되는 값에 대한 설명)를 가집니다. |
strictly_ascending |
boolean | List 에만 해당합니다. 각 항목이 이전 항목보다 커야 하면 true입니다. |
values |
string array | Enum과 Granularity 에 해당합니다. 허용되는 토큰입니다. Granularity의 경우 고정 일수 형식 외에 허용되는 달력 값입니다. |
요청 예시:
curl --request GET \
--header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/glql/schema"
응답 예시(일부 생략):
{
"sources": [
{
"name": "WorkItems",
"label": "work items",
"modes": [
{
"mode": "Standard",
"allowed_scopes": ["project", "group"],
"filter_fields": [
{
"name": "label",
"aliases": ["labels"],
"value_types": [
{ "kind": "String", "operators": ["=", "!="] },
{
"kind": "List",
"operators": ["in", "=", "!="],
"items": [{ "kind": "String" }, { "kind": "Reference", "references": "LabelRef" }]
}
]
}
],
"wildcard_filter_fields": [
{
"name": "customField",
"syntax": "customField(\"Name\")",
"value_types": [{ "kind": "String", "operators": ["="] }]
}
],
"display_fields": [
{ "name": "title" },
{ "name": "assignee", "aliases": ["assignees"] }
],
"sort_fields": ["created", "updated", "due"]
}
]
}
],
"operators": [{ "symbol": "=", "name": "Equal", "label": "equals" }],
"value_kinds": [{ "name": "String", "description": "A quoted string, for example \"my title\"." }],
"reference_types": [{ "name": "LabelRef", "symbol": "~", "example": "~frontend" }],
"display_types": [
{ "name": "list", "description": "A bulleted list of items." },
{
"name": "barChart",
"description": "Horizontal bars, one per dimension value.",
"selections": [
{ "dimensions": 1, "metrics": { "min": 1 } },
{ "dimensions": 2, "metrics": { "min": 1, "max": 1 } }
]
}
],
"functions": [
{ "name": "today", "kind": "value", "description": "Today's date at 00:00 UTC.", "args": [], "returns": "Date" }
],
"version": "0.41.0"
}
분석 모드는 차원과 지표가 허용하는 인수를 함께 제공하므로, 쿼리에서 기본값에 의존하지 않고 인수를 명시적으로 설정할 수 있습니다.
"parameterized_fields": [
{
"name": "finished",
"parameters": [
{ "name": "granularity", "kind": "Granularity", "values": ["daily", "weekly", "monthly"], "min_days": 1, "max_days": 399, "default": "weekly" },
{ "name": "origin", "kind": "Timestamp", "optional": true, "requires": { "parameter": "granularity", "value": "a fixed-day granularity such as `30d`, not a calendar bucket (`daily`, `weekly`, `monthly`)" } }
]
},
{
"name": "durationQuantile",
"parameters": [{ "name": "quantile", "kind": "Number", "min": 0.01, "max": 0.99, "default": 0.95 }]
},
{
"name": "userTier",
"parameters": [
{ "name": "thresholds", "kind": "List", "items": [{ "kind": "Number", "min": 1, "max": 2147483647 }], "min_length": 1, "max_length": 9, "strictly_ascending": true, "required": true }
]
}
]
속도 제한#
GLQL API는 쿼리의 SHA-256 해시를 기준으로 속도 제한을 적용합니다. 타임아웃이 발생한 쿼리는 추적됩니다. 타임아웃이 발생하는 특정 쿼리가 너무 자주 실행되면 일시적으로 차단됩니다.
속도 제한이 적용되면 API는 429 Too Many Requests 상태 코드와 오류 메시지를 반환합니다.
{
"error": "Query temporarily blocked due to repeated timeouts. Please try again later or narrow your search scope."
}
오류 처리#
API는 다음 HTTP 상태 코드를 반환합니다.
| 상태 코드 | 설명 |
|---|---|
200 Success |
쿼리가 성공적으로 실행되었습니다. |
400 Bad Request |
쿼리 구문이 잘못되었거나, 필수 파라미터가 없거나, 입력이 크기 제한을 초과했습니다. |
401 Unauthorized |
인증이 필요하거나 자격 증명이 올바르지 않습니다. |
403 Forbidden |
권한이 부족하거나 필요한 OAuth 스코프가 없습니다. |
429 Too Many Requests |
쿼리 속도 제한을 초과했습니다. |
500 Internal Server Error |
쿼리 실행 중 서버 오류가 발생했습니다. |
오류 응답 예시#
-
필수 파라미터 누락:
{ "error": "glql_yaml is missing, glql_yaml is empty" } -
잘못된 GLQL 구문:
{ "error": "400 Bad request - Error: Unexpected `invalid syntax @@@ ###`, expected operator (one of IN, =, !=, >, or <)" } -
입력 크기 초과:
{ "error": "400 Bad request - Input exceeds maximum size" } -
존재하지 않는 프로젝트:
{ "error": "400 Bad request - Error: Project does not exist or you do not have access to it" } -
존재하지 않는 그룹:
{ "error": "400 Bad request - Error: Group does not exist or you do not have access to it" } -
속도 제한 초과:
{ "error": "Query temporarily blocked due to repeated timeouts. Please try again later or narrow your search scope." } -
잘못된 필드
{ "error": "Field 'title' doesn't exist on type 'WorkItem' (Did you mean `title`?)" }
GraphQL의 잘못된 요청 오류는 해당하는 경우 400 오류 코드와 함께 API의 error 필드로
그대로 전달됩니다.
제한과 제약 사항#
GLQL API에는 다음 제한이 있습니다.
- 최대 입력 크기:
glql_yaml파라미터에 대해 10,000바이트(10KB). - 최대 쿼리 제한: 요청당 100건.
- 기본 제한: 지정하지 않으면 100건.
- 페이지네이션: 이전 응답의
endCursor값을after속성에 사용하는 정방향 페이지네이션만 지원합니다. - 속도 제한: 쿼리는 쿼리 SHA-256 해시를 기준으로 속도가 제한됩니다.