Концепции
Переменные окружения
Переменные и секреты рабочего пространства — уровни видимости, гарантия маскирования в логах и как тесты их используют
Обзор
Environment Variables (на странице Configurations) — реестр значений
рабочего пространства, от которых зависят тесты: API_BASE_URL, API-токены,
DSN, cookie-секреты. У реестра две задачи:
- Убрать значения из скриптов. Боковая панель редактора тестов показывает доступные переменные, поэтому скрипт ссылается на имя, а не на зашитое значение — и одна правка перенаправляет все тесты на staging или production.
- Убрать секреты из логов. У каждой переменной есть флаг видимости; значения, помеченные masked, вырезаются везде, где могли бы появиться в выводе.
Visible vs masked
- visible — обычные справочные значения (хосты, имена окружений). Показываются в UI, в логах не трогаются.
- masked — секреты. Прячутся за
•••в UI и заменяются на***на каждой лог-поверхности, которую контролирует платформа: живой поток прогона, сохранённый лог, который вы потом скачиваете, и сырые OTEL-чанки метрик в бакете логов.
Маскирование по значению, а не по имени: платформа вырезает секрет везде,
где он встретится, — внутри URL, DSN (postgres://user:SECRET@host/db
превращается в postgres://user:***@host/db), дампа заголовков или текста
ошибки. Значения от 4 символов вырезаются в любом вхождении; более короткие —
только как отдельные токены, чтобы короткое значение вроде abc не испортило
посторонние слова.
Одна честная граница: участники рабочего пространства всё ещё могут прочитать значения переменных через API — masked защищает логи и UI, но это не механизм контроля доступа. Воспринимайте реестр как удобство плюс гарантию вырезания из логов, а не как секрет-хранилище.
Как тесты используют переменные
Зарегистрируйте значение один раз и используйте где нужно — в блоке
variables: теста, заголовке, DSN. Если ровно это значение когда-либо
попадёт в строку лога, маска узнаёт его и вырежет. В этом контракт:
masked-значением можно пользоваться свободно — в логи оно не утечёт.
Для скриптов k6/JMeter/Locust верно то же самое: если скрипт печатает
зарегистрированное masked-значение (через __ENV или литерал), платформа
вырежет его до того, как лог будет отстримлен, сохранён или разбит на чанки.
Окружение на стороне машины (${{ env.* }})
Нативные perfscale-тесты умеют читать процессное окружение машины
напрямую через ${{ env.NAME }} — канал для секретов, которые должны жить
на генераторе нагрузки и больше нигде (переменная вообще не попадает в YAML
теста):
steps:
- use: std/http@v1
with:
url: https://api.example.com/me
headers:
authorization: "Bearer ${{ env.API_TOKEN }}"
Отсутствующая переменная падает шагом с понятной ошибкой вместо того, чтобы
молча отправить пустой креденшл. А движок записывает каждое значение,
разрешённое из env.*, в реестр прогона и автоматически маскирует его в
логе прогона — по тем же правилам ***, что выше, — так что даже секрет,
попавший в URL запроса или отладочное сообщение std/log@v1, не окажется в
выводе. Полный контракт интерполяции — в OSS-справочнике YAML.
Дальше
- Использование платформы — страница Configurations, где живут переменные.
- Стриминг живых метрик — что прогоны эмитят во время выполнения.
- Прогоны и живые метрики — жизненный цикл задачи.