Ключи приёма
Каждый проект принимает телеметрию по DSN-ключу — публичной строке, которая одновременно называет проект и разрешает слать в него данные (см. Термины). У ключа есть тип: он ограничивает, какую телеметрию этим конкретным ключом можно прислать. Тип нужен потому, что не все ключи одинаково чувствительны: браузерный ключ публикуется намеренно — он лежит открытым текстом в коде страницы, который видит любой посетитель, — и раньше тот же самый ключ мог зарегистрировать хост или прислать деплой-маркер. Утёкший (а он и не «утекает» — он публикуется по замыслу) ключ браузера давал постороннему заполнить парк хостов проекта поддельными машинами вплоть до потолка в 1000 штук либо запостить фальшивый деплой.
Эта страница — единственное место, где расписан полный список допуска; остальные страницы документации на неё ссылаются.
Типы ключей
Новый проект получает сразу три ключа — по одному на класс источника, без общего «главного» ключа:
| Тип | Для чего | Допуск |
|---|---|---|
browser | браузерные SDK (Sentry JS и подобные) | события, транзакции, метрики, логи |
server | серверные SDK, CI, коллектор прикладных метрик | то же, что browser, плюс профили и деплой-маркеры |
agent | источники хостовых метрик | только метрики; единственный тип, которым регистрируется хост |
legacy | ключи, выпущенные до появления типов (см. ниже) | полный допуск: всё из server плюс регистрация хостов |
| (без типа) | — | ничего; такого быть не должно, см. ниже |
Тип ключа привязан к тому, откуда данные приходят технически, а не к тому,
кто их шлёт: разница между server и agent — не «сервер или агент», а
регистрирует ли источник хост. Ключ без указанного типа не даёт ничего —
это защита от забытой инициализации, а не рабочий режим: такое значение не
должно встречаться на живом ключе, только пустое поле по ошибке где-то в
коде.
agent — это любой источник хостовых метрик
Тип agent называется по своей главной роли, но означает не «только
собственный агент Gotcha», а источник хостовых метрик вообще. Ключом
agent пользуются оба способа подключить хост со страницы
«Хосты»:
- собственный агент
gotcha-agent; - сторонний
otelcol-contribс ресиверомhostmetricsи процессоромresourcedetection— конфиг с той же страницы «Хосты».
Оба шлют метрики с resource-атрибутом host.name, и именно поэтому оба
регистрируют хост — граница проходит по наличию resourcedetection в
конфиге, а не по тому, что это «коллектор» как таковой (у рецептов
мониторинга сервисов тоже коллектор, но другой — см. ниже).
Почему рецептам сервисов нужен server, а не agent
Рецепты мониторинга (PostgreSQL, MariaDB, nginx, Redis,
Docker) тоже подключаются через otelcol-contrib, но их сниппеты сознательно
не ставят resourcedetection — рецепт следит за самим сервисом, а не за
хостом, на котором он работает, и хост не регистрирует и никогда не
регистрировал. DSN, подставленный в конфиг рецепта, — ключ типа server.
Выдать рецепту agent-ключ значило бы дать источнику, которому регистрация
хоста не нужна, право её делать — то, ради чего типы и заводятся.
Какой ключ куда
| Источник | Тип |
|---|---|
| Sentry SDK в браузере | browser |
| Sentry SDK на сервере (PHP, Go, Python, Node на сервере) | server |
| Приём деплой-маркеров из CI | server |
| Прямой pprof-эндпойнт | server |
Агент gotcha-agent | agent |
Коллектор со страницы «Хосты» (hostmetrics + resourcedetection) | agent |
| Коллектор из рецепта мониторинга сервиса | server |
Подробности по каждому источнику — на его собственной странице: SDK и интеграции, Деплои, Профилирование, Логи, Хосты, Рецепты мониторинга.
Ключи без типа (legacy)
Ключи, выпущенные до появления типов, продолжают работать без изменений и без ограничения по времени — обновление ничего не ломает. В настройках проекта такой ключ помечен бейджем «Без типа» — это не авария, а описание факта: полный допуск сохраняется бессрочно, менять ключ не обязательно.
Развести источники по типам, не останавливая приём, можно так:
- выпустите в настройках проекта новые типизированные ключи
(
browser/server/agent) — старый ключ при этом продолжает работать; - переключите каждый источник на ключ нужного ему типа (см. таблицу выше) — по одному, без общего окна простоя: пока не переключены все источники, старый ключ обслуживает оставшиеся;
- когда все источники переехали, отзовите старый ключ без типа в настройках проекта.
Ключ без типа выпустить заново через интерфейс нельзя — форма создания ключа всегда требует выбрать один из трёх типов.
Тип ключа неизменяем
Сменить тип у существующего ключа нельзя. Единственный способ дать источнику другой набор допуска — выпустить новый ключ нужного типа и отозвать старый (шаги выше). Это осознанное ограничение: тип ключа кешируется вместе с самим ключом на 30 секунд, и невозможность смены типа снимает вопрос о том, что делать с уже закешированным правом доступа.
Что видно при отказе
Запрос ключом не того типа отклоняется с HTTP 403 (а не 401 — ключ опознан и принадлежит проекту, но не подходит по типу для этого конкретного эндпойнта). Если вы держите gotcha сами, это видно и в наблюдаемости — см. Мониторинг самого gotcha:
gotcha_ingest_rejected_total{reason="key_scope",signal="…"}— отказ по типу ключа, с меткой сигнала (event,transaction,metric,log,profile,deploy);gotcha_ingest_key_rejections_total{reason="scope"}— тот же отказ на этапе аутентификации по ключу;gotcha_host_registrations_scope_skipped_total— отдельный случай: метрики с ключом не типаagentнесут атрибутыhost.name. Экспорт при этом ПРИНИМАЕТСЯ и точки записываются — пропускается только регистрация хоста;- строка в логе с путём эндпойнта, на который пришёл запрос не тем ключом — для отказа по типу, как и для остальных отказов по ключу.
Отказы по ключу этого проекта — неверный/отозванный ключ, ключ чужого проекта, ключ не того типа — видны и на странице проекта: за последний час они показываются на пустом списке проблем и в чек-листе «Первые шаги», без похода в наблюдаемость.
Один запрос со смешанным содержимым (например, envelope браузерного SDK, куда SDK положил заодно и profile-элемент) отбраковывается поштучно: элемент, на который у ключа нет допуска, отбрасывается, а остальное содержимое запроса принимается как обычно.