Профилирование через Trino

English · Русский

Trino — отдельный read-only источник метаданных и агрегатов. В 1.6.0 сохранены JDBC-style endpoints без credentials, точные allowlists, ограниченные table-qualified wildcards и profile-query. Java и JDBC driver не нужны.

Перед запуском

Нужны extra trino, а для MCP — также mcp; проверенный HTTPS endpoint, read-only роль и явно согласованный catalog/schema/table/column scope. Секреты внедряются через runtime secret mechanism. Сетевое выполнение этого руководства не проверено.

Локальная проверка установки из активного окружения:

test-data-agent doctor --require-extra trino

Doctor проверяет клиент и SQL policy без обращения к координатору. Он не подтверждает аутентификацию или доступ к таблицам.

Настройте scope

Иллюстрация конфигурации для вымышленного endpoint; заменяйте её только согласованными параметрами:

export TRINO_HOST=trino.example.internal
export TRINO_PORT=8443
export TRINO_USER=test_data_agent
export TRINO_HTTP_SCHEME=https
export TRINO_ALLOWED_CATALOGS=warehouse
export TRINO_ALLOWED_SCHEMAS=analytics
export TRINO_ALLOWED_TABLE_COLUMNS='warehouse.analytics.orders.*'
export TRINO_DEPLOYMENT_PROFILE=shared-hardened
export TRINO_MAX_INVOCATION_ESTIMATED_SCAN_BYTES=1073741824

Catalog и schema — независимые allowlist-множества. Wildcard разрешён только для точной таблицы в restricted mode: ограниченные metadata разворачиваются в отсортированные явные столбцы до первого агрегата. Он не разрешает SQL *, literals, preserve или provider payload. Column selectors не являются общим ACL всех MCP tools; ограничения видимости задаются также правами БД.

Вместо компонентов endpoint допускается TRINO_JDBC_URL без credentials. Явные компоненты должны совпадать с URL. SSL=false, неизвестные свойства, токены, роли, proxies и headers в URL отклоняются. Basic/JWT/Kerberos/GSSAPI/OAuth2 и client certificates требуют своих настроек; см. оригинальный полный справочник подключения.

Получите профиль

MCP server запускается локальным клиентом через test-data-agent-mcp-trino. Default aggregate-only tools возвращают разрешённые metadata и агрегаты. Затем безопасный профиль передаётся generator plan_trino_dataset без исходных строк; spec проверяется до генерации. См. MCP.

Отдельный explicit opt-in run_safe_select по умолчанию отсутствует. Его ограниченные строки могут содержать исходные нестроковые значения; маскирование не делает их анонимными. Эти строки не передаются генератору или LLM.

Воспроизводимый инфраструктурный пример

В репозитории есть examples/local_trino/run.sh и варианты run-jdbc.sh, run-wildcard.sh, run-query.sh. Они используют синтетический TPC-H tiny в одноразовом контейнере, удаляют контейнер и сохраняют безопасный профиль, spec, новые данные и отчёты. В этом аудите инфраструктурные сценарии не запускались.

Query-source требует явного column scope, хранит fingerprint вместо текста SQL и результатов. Не обходите отказ через unrestricted/insecure flags. Успех проверяется по scope, коду завершения, профилю без строк и отчётам сгенерированного набора; ошибка авторизации требует исправления grants или сужения запроса.

MCP с логином и паролем

Для входа по логину и паролю явно выберите TRINO_AUTH_METHOD=basic. По умолчанию стоит none: один TRINO_USER не включает отправку пароля. TRINO_AUTH_SECRET_ENV содержит имя переменной с паролем, а не сам пароль. Basic требует HTTPS с проверкой сертификата, в том числе при локальном запуске.

1. Подготовьте окружение и доступ

python3 -m venv /ABSOLUTE/PATH/trino-env
/ABSOLUTE/PATH/trino-env/bin/python -m pip install 'agent-paranoid-android[mcp,trino]'
/ABSOLUTE/PATH/trino-env/bin/test-data-agent --version
/ABSOLUTE/PATH/trino-env/bin/test-data-agent doctor --require-extra trino

Замените /ABSOLUTE/PATH своим абсолютным путём. Doctor проверяет локальную установку, а не вход на сервер. У администратора Trino уточните HTTPS host/port, логин, разрешённые catalog/schema/table/column и права чтения метаданных и агрегатов. Из среды MCP должны быть доступны сервер, при необходимости VPN, и доверенная цепочка сертификата. Корпоративный CA должен быть доверенным в используемом Python/окружении; отключать проверку TLS не нужно.

2. Передайте пароль процессу

Если MCP-клиент умеет передавать секреты в окружение дочернего процесса через защищённое хранилище, создайте там MY_TRINO_PASSWORD. Не помещайте пароль в JSON, репозиторий, аргументы команды или переписку. Переменная из терминала не обязательно видна графическому приложению; файл .env автоматически не загружается. После изменения настроек перезапустите MCP-сервер.

Готовый вариант для macOS: в приложении «Связка ключей» создайте запись пароля с именем agent-paranoid-android-trino, учётной записью, совпадающей с TRINO_USER, и вашим паролем. Сохраните следующий скрипт как /ABSOLUTE/PATH/start-trino-mcp.sh, заменив путь к установленному серверу:

#!/bin/bash
# Пароль читается локально; stdout используется только протоколом MCP.
if ! MY_TRINO_PASSWORD=$(/usr/bin/security find-generic-password \
    -s agent-paranoid-android-trino -a "$TRINO_USER" -w 2>/dev/null); then
  printf '%s\n' 'Trino password is unavailable in Keychain' >&2
  exit 1
fi
export MY_TRINO_PASSWORD
exec /ABSOLUTE/PATH/trino-env/bin/test-data-agent-mcp-trino

Выполните chmod 700 /ABSOLUTE/PATH/start-trino-mcp.sh. Разрешите локальному запуску чтение нужной записи, если macOS запросит доступ. Не включайте set -x и не добавляйте печать пароля. Этот вариант получает секрет при запуске и не зависит от наследования окружения графическим приложением. Для другой ОС используйте защищённое хранилище клиента или локальный механизм секретов.

3. Добавьте сервер в MCP-клиент

Это распространённый формат mcpServers; точное место настройки зависит от клиента. Все адреса, логины и имена данных ниже вымышлены — замените их локально. Пример использует скрипт со Связкой ключей из предыдущего шага:

{
  "mcpServers": {
    "trino": {
      "command": "/ABSOLUTE/PATH/start-trino-mcp.sh",
      "env": {
        "TRINO_HOST": "trino.example.internal",
        "TRINO_PORT": "443",
        "TRINO_HTTP_SCHEME": "https",
        "TRINO_USER": "your_login",
        "TRINO_AUTH_METHOD": "basic",
        "TRINO_AUTH_SECRET_ENV": "MY_TRINO_PASSWORD",
        "TRINO_ALLOWED_CATALOGS": "warehouse",
        "TRINO_ALLOWED_SCHEMAS": "analytics",
        "TRINO_ALLOWED_TABLE_COLUMNS": "warehouse.analytics.orders.*",
        "TRINO_DEPLOYMENT_PROFILE": "shared-hardened",
        "TRINO_MAX_INVOCATION_ESTIMATED_SCAN_BYTES": "1073741824"
      }
    }
  }
}

При передаче MY_TRINO_PASSWORD защищённым механизмом клиента вместо Связки ключей задайте command напрямую: /ABSOLUTE/PATH/trino-env/bin/test-data-agent-mcp-trino. Синтаксис подстановки секретов зависит от клиента: ${MY_TRINO_PASSWORD} в JSON не является универсальной подстановкой.

TRINO_HOST — только имя сервера, без схемы URL и пути; порт должен совпадать с HTTPS endpoint. Catalog/schema — обязательные allowlists через запятую. Column scope необязателен для обычных таблиц, но обязателен для profile-query. Вместо warehouse.analytics.orders.* можно перечислить точные столбцы через запятую. Wildcard разрешает только ограниченное агрегатное профилирование, не выдаёт права на исходные строки и не заменяет grants в Trino.

Указанный cumulative scan budget — 1 ГиБ на вызов. По умолчанию действуют также request timeout 30 секунд, execution time 30 секунд, run time 45 секунд и scan budget 1 ГиБ на запрос. TRINO_CATALOG и TRINO_SCHEMA — необязательные значения по умолчанию внутри allowlists. Полный список — в справочнике конфигурации.

4. Проверьте запуск и разберите ошибку

Перезапустите сервер в MCP-клиенте и убедитесь, что появились Trino-инструменты. Сначала вызовите разрешённый инструмент метаданных, например list_catalogs, затем describe_table для согласованной таблицы. Успешный запуск процесса и Doctor не доказывают успешную аутентификацию. Эти инструкции проверены локально по конфигурационному контракту; вход на ваш сервер не проверен.

При 401 локально проверьте basic, доступность переменной, указанной в TRINO_AUTH_SECRET_ENV, правильность логина и перезапуск процесса. При 403 проверьте серверные права и политику доступа; сам статус не устанавливает точную причину. Ошибки TLS требуют проверки endpoint и доверия сертификату.

Для обращения за помощью достаточно версии пакета, способа запуска, TRINO_AUTH_METHOD, TRINO_HTTP_SCHEME, признаков «логин задан», «secret reference задан», «переменная с паролем доступна процессу» и результата входа другим клиентом. Не передавайте значения логина/пароля, полный .env, URL подключения, исходные строки или необработанные ответы драйвера.

Ошибки аутентификации

При сбое запишите локально версию пакета и выбранный TRINO_AUTH_METHOD. Для разбора достаточно этих сведений: не передавайте пароли, токены, адреса подключения и необработанные ответы драйвера. Один код HTTP 401 не позволяет установить причину сбоя настройки или совместимости.

Профилирование SQL-запроса преобразует нетипизированные ошибки HTTP 401/403 и TLS в фиксированную ошибку SQL query source profiling failed, не сохраняя исходное исключение в cause или context. CLI сохраняет категорию external_service и прежний выходной файл. MCP возвращает фиксированную ошибку Trino, а аудит не содержит значений источника или секретов. Эти проверки не подтверждают успешный вход на конкретный сервер.