Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

API hard limit – 10K visible items #13

Open
akimrx opened this issue Oct 11, 2023 · 2 comments
Open

API hard limit – 10K visible items #13

akimrx opened this issue Oct 11, 2023 · 2 comments

Comments

@akimrx
Copy link

akimrx commented Oct 11, 2023

Привет!

К моему большому сожалению, выяснилось, что не смотря на реализованную в вашей библиотеке пагинацию, ваш API жестко лимитирует количество любых отдаваемых объектов до 10000, независимо от того пагинируются они или нет.

Таким образом, когда есть необходимость, например выгрузить все задачи, мы упираемся в тот факт, что без костылей на своей стороне и придумывания какой-либо «оригинальной» логики, которая не всегда масштабируется, не обойтись.

Просто пример, что это действительно так:

from yandex_tracker_client import TrackerClient
from tracker_exporter.defaults import TRACKER_ORG_ID, TRACKER_TOKEN

tracker = TrackerClient(token=TRACKER_TOKEN, org_id=TRACKER_ORG_ID)


def main():
    searchstr = "Queue: !TEST"
    last_issue_seq_num = 0
    for i, _ in enumerate(tracker.issues.find(searchstr, per_page=1000)):
        last_issue_seq_num = i

    print(f"Last issue sequence number:", last_issue_seq_num)
    print(f"Returned type is:", type(tracker.issues.find(searchstr, per_page=1000)))
    print(f"Total issues by filter:", tracker.issues.find(searchstr, count_only=True))
# Out
Response from sdk, total items count from header: 10000
Response from sdk, total pages count from header: 10
Last issue sequence number: 9999
Returned type is: <class 'yandex_tracker_client.objects.SeekablePaginatedList'>
Total issues by filter: 102544

Большая просьба, пожалуйста, уберите «жесткий» лимит в 10к на общее количество «видимых» для API данных, а ограничение в 10000 (или меньше) оставим лишь на уровне одной страницы.

Вижу, что не я один такой, и уже ранее репортили C10K problem: #5

Ticket ID: RK574906

@shilovmaksim
Copy link

Привет. Тоже столкнулся с таким лимитом. Только не в python клиенте, а в запросах через powershell.
Если тело запроса содержит не прямое обращение к очереди, а через запрос по типу:

$body = @{
  query = "Queue: $queue"
}

причем в $queue может быть несколько очередей, перечисленных через запятую. То при выдаче с пагинацией ЯТ будет отдавать задачи до тех пор пока не упрется в лимит в 10000.

Я решил это следующим образом. Можно обращаться к апи ЯТ с телом запроса по типу:

$body = @{
  queue = $queue
}

в данном случае $queue это одна очередь. Получить все задачи очереди, если их больше 10000, можно через uri из ответа ЯТ, который содержит continuation token. Пример на powershell

$contentType = "application/json; charset=UTF-8"
$url = "https://api.tracker.yandex.net/v2/issues/_search?perPage=2000"
$headers = @{
    "X-Org-ID" = $TRACKER_ORG_ID
    Authorization = "OAuth $trackerToken"
}
$TRACKER_QUEUES = "QUEUE1,QUEUE2"
$issues = @()
$queues = $TRACKER_QUEUES -split(",")
Write-Host "Fetching issues"
foreach ($queue in $queues) {
    Write-Host "Processing queue $queue"
    $body = @{
        queue = $queue
    } | ConvertTo-Json
    $queueIssues = @()
    $request = Invoke-WebRequest -Method Post -Uri $url -ContentType $contentType -Headers $headers -Body $body -UseBasicParsing
    $queueIssues += $request.Content | ConvertFrom-Json
    while ($request.RelationLink.next) {
        $request = Invoke-WebRequest -Method Post -Uri $request.RelationLink.next -ContentType $contentType -Headers $headers -Body $body -UseBasicParsing
        $queueIssues += $request.Content | ConvertFrom-Json
    }
    Write-Host "Total number of issues in queue $queue : $($queueIssues.count)"
    $issues += $queueIssues
}

@akimrx
Copy link
Author

akimrx commented Oct 26, 2023

Вообще API трекера поддерживает механизм прокрутки, если задач более 10000 тысяч, в остальных случаях приходится как-то додумывать логику за API и библиотеку, как это можно поделить на чанки менее 10К. Например у нас в компании очереди содержат больше 10К задач и это проблема в ETL и прочих историях.

Вот из документации про механизм прокрутки: https://cloud.yandex.ru/docs/tracker/concepts/issues/search-issues#scroll

Issue тут скорее для того, чтобы SeekablePaginatedList или его аналог, а короче говоря — библиотека, поддерживали этот новый механизм, без необходимости добавлять своей логики, иначе теряется смысл использования библиотеки.
А без нового механизма пагинация можно сказать не работает.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants