Содержание

GlitchTip: чтение событий после выпуска

Назначение: наблюдение известных issue после выпуска без повторного чтения всей истории. Проверено 22.10.2026 на https://glitchtip.olvery.ru, GlitchTip 6.1.6. Это сервисный рецепт, не изменение collector или сервера.

Поддержка установленного API

У следующих списков нет серверных фильтров release и времени:

Параметры release, query, start, end здесь не применяются. HTTP200, пустая выборка, наличие параметров в следующей Link-ссылке или совместимость SDK с Sentry не доказывают поддержку фильтра.

Рабочий путь — limit и штатный cursor из Link, локальные проверки release/времени. Не конструировать курсор самостоятельно. Для запроса достаточно существующего glitchtip-olv3729 через штатный helper; токен и полный ответ не выводить и не сохранять.

Короткий пример одного GET

Пример читает одну запись известной issue, выводит только HTTP-код, release, времена и наличие следующей страницы. Это не полный observation и не доказательство исправности приложения.

/home/olvr/bin/olvr-secret run glitchtip-olv3729 -- python3 - <<'PY'
import json, os, urllib.parse, urllib.request
url = "https://glitchtip.olvery.ru/api/0/issues/29879/events/"
url += "?" + urllib.parse.urlencode({"limit": 1})
req = urllib.request.Request(url, headers={
    "Authorization": "Bearer " + os.environ["OLVR_SECRET"]})
with urllib.request.urlopen(req, timeout=25) as r:
    rows = json.load(r)
    link = r.headers.get("Link", "")
    print("http", r.status, "rows", len(rows))
    for e in rows:
        tags = e.get("tags") or {}
        if isinstance(tags, list):
            tags = {t.get("key"): t.get("value") for t in tags}
        release = tags.get("release") or e.get("release")
        if isinstance(release, dict):
            release = release.get("version")
        print({"release": release,
               "dateReceived": e.get("dateReceived") or e.get("date_received"),
               "dateCreated": e.get("dateCreated") or e.get("date_created")})
    print("has_next", any('rel="next"' in p and 'results="true"' in p
                          for p in link.split(",")))
PY

Для обычного обхода используется ?limit=100. urllib.parse.urlencode кодирует query-значения; литеральный плюс в 4.6.5+9716 должен стать %2B, а не пробелом. Это правило encoding, не обещание наличия release-фильтра.

Минимальный штатный обход

Отсутствие событий с ошибкой не доказывает успешные сессии. List endpoint читает свой queryset; полноценность cold-storage-истории этим рецептом не обещается.

Почему фильтрам нельзя доверять

Минимальный read-only control на issue 29879, 22.10.2026 16:20:17Z:

Идентичность сравнивалась в памяти; идентификаторы и пользовательский payload не сохранялись. В отличие от пустого ответа, непустой контрпример показывает игнорирование переданных ограничений; точный набор поддержанных параметров установлен исходником.

Версия, evidence и пересмотр

Фактический target: srv-glitchtip.olvr, glitchtip-web-1, glitchtip/glitchtip:6, running. GLITCHTIP_VERSION=6.1.6.

GET /api/0/ возвращает API version 0, не версию приложения.

Evidence: Card jfVY, receipts OvtbEO, 0r9VZC, XEu7hX, 4XP9Pe. Безопасные artifacts: /home/BVNq/work/jfVY/installed-api-contract.txt, filter-controls-safe.json и соответствующие диагностические скрипты. Источник исходного observation — 3kfw/0dgUUT; его collector и принятое observation не менялись и не переаттестовывались.

После смены GlitchTip image/version сверять затронутый API-контракт заново. Доработка сервера, новый collector, runner или общий механизм фильтрации в этот рецепт не входят.