наблюдаемость: завершить базовый контур Community
Добавить структурированные журналы, метрики, трассировку и безопасный канал критических ошибок. Усилить границы рантайма, тесты, проверку зависимостей и сценарии развёртывания.
This commit is contained in:
+21
-2
@@ -22,6 +22,8 @@ admin-api -> PostgreSQL
|
||||
mcp-server -> PostgreSQL
|
||||
admin-api -> Valkey/Redis, опционально
|
||||
mcp-server -> Valkey/Redis, опционально
|
||||
admin-api -> внешний OTLP endpoint, опционально
|
||||
mcp-server -> внешний OTLP endpoint, опционально
|
||||
```
|
||||
|
||||
## Файлы запуска
|
||||
@@ -152,6 +154,8 @@ docker compose up -d
|
||||
```bash
|
||||
curl http://127.0.0.1:3001/health
|
||||
curl http://127.0.0.1:3002/health
|
||||
curl http://127.0.0.1:3001/ready
|
||||
curl http://127.0.0.1:3002/ready
|
||||
```
|
||||
|
||||
Ожидаемые ответы:
|
||||
@@ -169,7 +173,22 @@ curl -I http://127.0.0.1:3000/
|
||||
|
||||
## Эксплуатация
|
||||
|
||||
- Делайте регулярные бэкапы PostgreSQL.
|
||||
- `/health` проверяет, что процесс жив; `/ready` дополнительно проверяет доступность PostgreSQL и используется Docker Compose.
|
||||
- CD перед каждым обновлением создаёт согласованный комплект в `backups/<UTC-время>`: дамп PostgreSQL, том артефактов, окружение, Compose и контрольные суммы. Хранятся последние пять локальных комплектов.
|
||||
- Копируйте комплекты резервных копий на отдельный хост или в объектное хранилище.
|
||||
- Проверенное восстановление выполняется только с явным подтверждением:
|
||||
|
||||
```bash
|
||||
CRANK_RESTORE_CONFIRM=restore ./scripts/restore-community.sh /opt/crank /opt/crank/backups/20260721T120000Z
|
||||
```
|
||||
|
||||
- Обновления схемы выполняются под блокировкой, одной транзакцией и фиксируются в `__crank_core_migrations`. Миграции Community должны оставаться обратно совместимыми с предыдущей версией приложения.
|
||||
- Не храните реальные секреты в Git.
|
||||
- Для rollback используйте конкретные image tags, а не только `main`.
|
||||
- CD использует неизменяемые теги коммитов и автоматически возвращает прежнюю конфигурацию и образы при провале readiness.
|
||||
- `CRANK_PUBLISH_BIND=0.0.0.0` нужен только если reverse proxy работает на другом host.
|
||||
- OTLP Collector и хранилище трасс не входят в Community Compose. Для
|
||||
внешнего приёмника задайте `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT`; секретные
|
||||
headers передавайте через OpenBao, а не через файлы репозитория.
|
||||
- GlitchTip и другие Sentry-совместимые приёмники также не входят в Community
|
||||
Compose. Для отправки только критических ошибок передайте
|
||||
`CRANK_SENTRY_DSN` через OpenBao; пустое значение отключает канал.
|
||||
|
||||
+288
-3
@@ -1,6 +1,286 @@
|
||||
# Журналы и использование
|
||||
# Наблюдаемость
|
||||
|
||||
Crank сохраняет данные о тестовых запусках и вызовах опубликованных MCP-инструментов.
|
||||
## Эксплуатационные журналы stdout
|
||||
|
||||
`admin-api` и `mcp-server` используют один жизненный цикл наблюдаемости и
|
||||
одинаковую однострочную JSON-схему:
|
||||
|
||||
```json
|
||||
{
|
||||
"timestamp": "2026-07-26T12:34:56.789Z",
|
||||
"level": "INFO",
|
||||
"service": "admin-api",
|
||||
"version": "0.3.1",
|
||||
"environment": "production",
|
||||
"target": "admin_api::request_context",
|
||||
"event": "admin.request.completed",
|
||||
"request_id": "019...",
|
||||
"fields": {
|
||||
"method": "GET",
|
||||
"route": "/api/operations",
|
||||
"status": 200
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Обязательны `timestamp`, `level`, `service`, `version`, `environment`,
|
||||
`target`, `event` и объект `fields`. Поля `request_id` и `trace_id` независимы
|
||||
и появляются только при наличии соответствующего контекста. Имена событий
|
||||
статичны и имеют вид `<компонент>.<объект>.<исход>`.
|
||||
|
||||
Форматирование не использует ANSI. Одна строка stdout всегда соответствует
|
||||
одному JSON-объекту.
|
||||
|
||||
### Сквозная корреляция
|
||||
|
||||
Admin API и MCP принимают `x-request-id` как непрозрачный идентификатор.
|
||||
Допустимое входное значение сохраняется без изменений. Если заголовок
|
||||
отсутствует или содержит пробелы, управляющие символы, `,`, `;`, не-ASCII
|
||||
символы либо больше 128 байт, Crank создаёт UUIDv7.
|
||||
|
||||
Один идентификатор:
|
||||
|
||||
- возвращается в `x-request-id` успешного или ошибочного ответа;
|
||||
- записывается в корневой span входного запроса;
|
||||
- передаётся в runtime;
|
||||
- заменяет статические или полученные из mapping значения
|
||||
`x-request-id` и `x-correlation-id` перед исходящим REST-запросом;
|
||||
- сохраняется в прикладной истории вызова.
|
||||
|
||||
`request id` не является `trace id` и не подменяет распределённую
|
||||
трассировку.
|
||||
|
||||
### Очистка
|
||||
|
||||
Перед сериализацией рекурсивно очищаются пароли, секреты, токены, ключи
|
||||
доступа, authorization, cookie, query, полные payload, body, arguments,
|
||||
result и response. Составные имена полей проверяются по тем же правилам.
|
||||
Из URL удаляются учётные данные, query и fragment.
|
||||
|
||||
Пределы одного события:
|
||||
|
||||
- строка: 1024 байта;
|
||||
- массив: 32 элемента;
|
||||
- объект: 64 поля;
|
||||
- вложенность: 8 уровней;
|
||||
- вся строка JSON вместе с завершающим переводом строки: 16 КиБ.
|
||||
|
||||
Усечение сохраняет корректный UTF-8 и JSON. Секрет заменяется целиком на
|
||||
`[REDACTED]`; его часть, длина или хеш не выводятся. Если после очистки
|
||||
событие превышает 16 КиБ, `fields` заменяется ограниченным признаком
|
||||
усечения. Произвольное представление `Debug` не считается безопасным
|
||||
структурированным значением: для вложенных данных используется
|
||||
предварительно очищенный JSON.
|
||||
|
||||
Уровень и окружение задаются через `CRANK_LOG_LEVEL` и
|
||||
`CRANK_ENVIRONMENT`. Для stdout не требуются внешние службы, фоновые очереди
|
||||
или сетевые endpoint. Их отсутствие не влияет на readiness.
|
||||
|
||||
## Критические ошибки
|
||||
|
||||
Необязательный Sentry-совместимый канал включается одним значением:
|
||||
|
||||
```env
|
||||
CRANK_SENTRY_DSN=https://public-key@errors.example.com/1
|
||||
```
|
||||
|
||||
Пустой или отсутствующий `CRANK_SENTRY_DSN` полностью отключает канал.
|
||||
Неверное непустое значение останавливает запуск до приёма запросов, при этом
|
||||
само значение не попадает в ошибку. Стандартная переменная `SENTRY_DSN` не
|
||||
используется.
|
||||
|
||||
Канал получает только необработанные panic и явно классифицированные
|
||||
критические ошибки. Ожидаемые ошибки HTTP, MCP, runtime и внешних API остаются
|
||||
в обычных журналах, показателях и трассах. Для критического события допустимы
|
||||
только:
|
||||
|
||||
- закрытая категория `panic`, `startup`, `internal` или `data_integrity`;
|
||||
- `service`, `release` и `environment`;
|
||||
- доступные `request_id` и `trace_id`;
|
||||
- статическое сообщение без исходного текста ошибки.
|
||||
|
||||
До отправки удаляются request, user, breadcrumbs, URL, query, cookie,
|
||||
authorization, payload, произвольные contexts и extra, а также исходный текст
|
||||
panic или ошибки. Performance tracing, журналы, показатели и отслеживание
|
||||
сессий Sentry SDK отключены. Отказ внешнего приёмника не меняет результат
|
||||
продуктового запроса и не создаёт рекурсивное событие.
|
||||
|
||||
GlitchTip и другие Sentry-совместимые приёмники не входят в Community Compose.
|
||||
Их доступность не участвует в `/health` и `/ready`.
|
||||
|
||||
## Показатели Prometheus
|
||||
|
||||
`admin-api` и `mcp-server` создают отдельные поверхности показателей. Они не
|
||||
смешиваются с продуктовыми маршрутами:
|
||||
|
||||
| Сервис | Значение по умолчанию |
|
||||
|---|---|
|
||||
| `admin-api` | `127.0.0.1:9464` |
|
||||
| `mcp-server` | `127.0.0.1:9465` |
|
||||
|
||||
На каждом адресе существуют только:
|
||||
|
||||
- `/metrics` — показатели Prometheus;
|
||||
- `/health` — статическая проверка самого listener-а.
|
||||
|
||||
Любой другой путь возвращает `404`. `/health` этой поверхности не заменяет
|
||||
`/ready` рабочего сервиса. Ошибка запуска listener-а останавливает процесс до
|
||||
приёма рабочих запросов.
|
||||
|
||||
Loopback доступен без авторизации. Для любого non-loopback адреса обязателен
|
||||
отдельный `CRANK_METRICS_BEARER_TOKEN`; без него конфигурация отклоняется при
|
||||
старте. Токен не переиспользует сессию администратора или ключ MCP. Оба
|
||||
маршрута внешней поверхности требуют `Authorization: Bearer ...`.
|
||||
|
||||
Community Compose не содержит Prometheus или Grafana и не публикует порты
|
||||
9464/9465 на host. Для сетевого сборщика необходимо явно:
|
||||
|
||||
1. задать `CRANK_ADMIN_METRICS_BIND=0.0.0.0:9464` и
|
||||
`CRANK_MCP_METRICS_BIND=0.0.0.0:9465`;
|
||||
2. передать непустой `CRANK_METRICS_BEARER_TOKEN`;
|
||||
3. подключить сборщик к внутренней сети Compose либо отдельно опубликовать
|
||||
нужные порты с ограничением firewall.
|
||||
|
||||
Токен сборщика хранится в файле, а не в `prometheus.yml`. Актуальная
|
||||
конфигурация Prometheus использует `authorization.credentials_file`:
|
||||
|
||||
```yaml
|
||||
scrape_configs:
|
||||
- job_name: crank-admin
|
||||
static_configs:
|
||||
- targets: ["admin-api:9464"]
|
||||
authorization:
|
||||
type: Bearer
|
||||
credentials_file: /run/secrets/crank_metrics_token
|
||||
|
||||
- job_name: crank-mcp
|
||||
static_configs:
|
||||
- targets: ["mcp-server:9465"]
|
||||
authorization:
|
||||
type: Bearer
|
||||
credentials_file: /run/secrets/crank_metrics_token
|
||||
```
|
||||
|
||||
Семейства первой версии:
|
||||
|
||||
- `crank_http_requests_total`, `crank_http_request_duration_seconds`,
|
||||
`crank_http_inflight`;
|
||||
- `crank_mcp_requests_total`, `crank_mcp_active_sessions`;
|
||||
- `crank_tool_invocations_total`, `crank_tool_invocation_duration_seconds`;
|
||||
- `crank_upstream_requests_total`,
|
||||
`crank_upstream_request_duration_seconds`;
|
||||
- `crank_runtime_inflight`, `crank_runtime_limit_rejections_total`;
|
||||
- `crank_db_pool_connections`;
|
||||
- `crank_catalog_tools`, `crank_catalog_estimated_context_tokens`,
|
||||
`crank_catalog_warnings`;
|
||||
- `crank_invocation_history_lost_total`,
|
||||
`crank_telemetry_export_failures_total`.
|
||||
|
||||
Recorder добавляет к рядам проверенные статические labels `service`,
|
||||
`version`, `environment`. Остальные labels имеют закрытый набор значений.
|
||||
Запрещено использовать workspace, идентификаторы агента, операции или
|
||||
запроса, фактический URL, текст ошибки, payload и пользовательский текст.
|
||||
HTTP route берётся только из шаблона Axum; неизвестные маршруты и методы
|
||||
сворачиваются в `unmatched` и `OTHER`.
|
||||
|
||||
Buckets длительности фиксированы кодом:
|
||||
`0.005`, `0.01`, `0.025`, `0.05`, `0.1`, `0.25`, `0.5`, `1`, `2.5`, `5`,
|
||||
`10`, `30`, `60` секунд. Это пока техническая шкала, а не SLO. Фактические
|
||||
series и расход памяти измеряются в истории 1.8; произвольный численный
|
||||
бюджет до замеров не назначается.
|
||||
|
||||
## Распределённые трассы
|
||||
|
||||
Crank принимает и передаёт стандартный W3C `traceparent` на границах Admin
|
||||
API, MCP и исходящих REST-вызовов. `x-request-id` остаётся отдельным
|
||||
идентификатором запроса. Baggage не извлекается и не передаётся.
|
||||
|
||||
Экспорт отключён по умолчанию: при пустых
|
||||
`OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` и `OTEL_EXPORTER_OTLP_ENDPOINT`
|
||||
provider, batch processor и фоновый поток не создаются. После включения
|
||||
используется только OTLP/HTTP binary protobuf. Community Compose не включает
|
||||
Collector или хранилище трасс: оператор подключает внешний совместимый
|
||||
приёмник.
|
||||
|
||||
Уровень эксплуатационных журналов не отключает трассы. В OTLP попадают
|
||||
только явно отмеченные spans с внутренней целью `crank::trace`; события
|
||||
`tracing` не экспортируются, чтобы их поля не обходили очистку JSON-журналов.
|
||||
Новые экспортируемые spans должны использовать ту же цель и содержать только
|
||||
ограниченные безопасные атрибуты.
|
||||
|
||||
Очередь экспорта конечна. Экспорт выполняется вне обработки продуктового
|
||||
запроса, поэтому недоступность приёмника не меняет HTTP, MCP или runtime
|
||||
результат. Ошибки доставки учитываются в
|
||||
`crank_telemetry_export_failures_total{signal_type="trace",exporter="otlp"}`
|
||||
без журналирования endpoint, headers и без создания новой OTLP-трассы.
|
||||
|
||||
Входящий корректный `traceparent` становится родителем корневого span.
|
||||
Некорректный заголовок трактуется как отсутствующий: запрос продолжается с
|
||||
новой трассой, а исходное значение не возвращается и не журналируется.
|
||||
Перед исходящим REST-запросом доверенный текущий контекст заменяет любой
|
||||
`traceparent`, заданный в настройках операции.
|
||||
|
||||
### Стадии выполнения инструмента
|
||||
|
||||
Crank создаёт дочерний span только тогда, когда соответствующая стадия
|
||||
фактически выполняется:
|
||||
|
||||
| Span | Значение |
|
||||
|---|---|
|
||||
| `mcp.rate_limit` | проверка ограничения частоты MCP-запроса |
|
||||
| `mcp.access.check` | машинная проверка доступа |
|
||||
| `mcp.catalog.load` | получение опубликованного каталога |
|
||||
| `mcp.tools.resolve` | разрешение конкретного инструмента |
|
||||
| `approval.check` | применимая проверка подтверждения |
|
||||
| `runtime.execute` | выполнение инструмента в runtime |
|
||||
| `runtime.arguments.map` | проверка схемы и отображение аргументов |
|
||||
| `runtime.idempotency` | применимая проверка идемпотентности |
|
||||
| `upstream.http` | фактический HTTP-вызов внешней системы |
|
||||
| `runtime.response.transform` | отображение и проверка ответа |
|
||||
| `auth.resolve` | применимое разрешение профиля авторизации и секретов |
|
||||
| `approval.recovery` | фоновое восстановление подтверждённого вызова |
|
||||
| `history.write` | запись прикладной истории |
|
||||
| `db.query` | значимая операция PostgreSQL |
|
||||
|
||||
Например, ответ из кэша или повтор идемпотентного результата не создаёт
|
||||
`upstream.http`. Операция без подтверждения и идемпотентности не создаёт
|
||||
соответствующие spans. Отсутствующая стадия никогда не изображается успешной.
|
||||
|
||||
Атрибуты стадий имеют закрытый словарь: `outcome`, `error.category`,
|
||||
`db.system` и `db.operation`. Значения задаются перечислениями из
|
||||
`crank-trace`; пользовательские идентификаторы, URL, заголовки, query,
|
||||
аргументы, ответы и текст ошибок туда передать нельзя. Ошибка содержит только
|
||||
категорию, достаточную для локализации стадии. `request_id` присутствует
|
||||
только в проверенном корневом span и сопоставляется с записью прикладной
|
||||
истории.
|
||||
|
||||
Перед OTLP-сериализацией экспортёр повторно применяет разрешительный список
|
||||
имён и атрибутов, удаляет события и ссылки span и очищает текстовое описание
|
||||
статуса ошибки. Эта последняя граница действует независимо от очистки
|
||||
эксплуатационных JSON-журналов и не позволяет новому инструментированию
|
||||
случайно экспортировать пользовательские данные.
|
||||
|
||||
Точный список переменных и правила OpenBao приведены в
|
||||
[описании runtime-конфигурации](runtime-config.md).
|
||||
|
||||
## Прикладные журналы и использование
|
||||
|
||||
Crank сохраняет в PostgreSQL данные о тестовых запусках и вызовах
|
||||
опубликованных MCP-инструментов. Это отдельная прикладная история, а не
|
||||
копия stdout.
|
||||
|
||||
Если внешнее действие завершилось, но PostgreSQL отклонил запись истории,
|
||||
Crank не меняет фактический результат и не повторяет действие. Вместо
|
||||
синтетической записи создаётся эксплуатационный инцидент `DC-08`:
|
||||
|
||||
- `admin.invocation_history.lost` или `mcp.invocation_history.lost` в stdout;
|
||||
- внутренний монотонный счётчик без пользовательских меток;
|
||||
- `crank_invocation_history_lost_total` и закрытый показатель потери
|
||||
экспорта;
|
||||
- только закрытые поля `source`, `invocation_status` и `error_category`.
|
||||
|
||||
Текст ошибки PostgreSQL, payload и секреты в событие не передаются. Внешняя
|
||||
публикация не влияет на результат уже завершённого действия.
|
||||
|
||||
## Журналы
|
||||
|
||||
@@ -15,7 +295,12 @@ Crank сохраняет данные о тестовых запусках и в
|
||||
- краткий preview запроса и ответа;
|
||||
- категория ошибки, если вызов завершился ошибкой.
|
||||
|
||||
При обновлении опубликованного MCP-каталога отдельное событие `published agent catalog analyzed` содержит `tool_count`, `serialized_bytes`, `estimated_context_tokens`, `largest_tool_estimated_context_tokens`, `recommended_context_tokens`, `exceeds_recommended_budget` и число предупреждений качества. По этим полям можно заметить рост цены `tools/list` до того, как он ухудшит выбор инструментов моделью.
|
||||
При обновлении опубликованного MCP-каталога событие `mcp.catalog.analyzed`
|
||||
содержит `tool_count`, `serialized_bytes`, `estimated_context_tokens`,
|
||||
`largest_tool_estimated_context_tokens`, `recommended_context_tokens`,
|
||||
`exceeds_recommended_budget` и число предупреждений качества. По этим полям
|
||||
можно заметить рост цены `tools/list` до того, как он ухудшит выбор
|
||||
инструментов моделью.
|
||||
|
||||
## Использование
|
||||
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
- Сгенерирован сильный `CRANK_PASSWORD_PEPPER`.
|
||||
- Задан надежный `CRANK_BOOTSTRAP_ADMIN_PASSWORD`.
|
||||
- `CRANK_BASE_URL` указывает на публичный HTTPS URL.
|
||||
- `CRANK_ENVIRONMENT=production`.
|
||||
- Если используется внешний приёмник критических ошибок, задан корректный
|
||||
`CRANK_SENTRY_DSN`; иначе значение оставлено пустым.
|
||||
- PostgreSQL доступен с host, где запускаются контейнеры.
|
||||
- Для PostgreSQL настроены бэкапы.
|
||||
- Reverse proxy проксирует `/`, `/api/admin/` и `/mcp/`.
|
||||
@@ -19,11 +22,16 @@
|
||||
|
||||
- `curl /health` для `admin-api` возвращает `ok`.
|
||||
- `curl /health` для `mcp-server` возвращает `ok`.
|
||||
- `curl /ready` для `admin-api` и `mcp-server` возвращает `ready`.
|
||||
- UI открывается по публичному домену.
|
||||
- Вход под bootstrap admin работает.
|
||||
- Demo seed создал Frankfurter-пример, если `CRANK_DEMO_SEED=true`.
|
||||
- Тест операции `frankfurter_latest_rate` проходит.
|
||||
- MCP-клиент видит инструмент через агента `currency-rates`.
|
||||
- Каждая непустая строка stdout `admin-api` и `mcp-server` является
|
||||
корректным JSON и содержит `service`, `environment` и `event`.
|
||||
- При включённом канале контрольная критическая ошибка появляется у приёмника
|
||||
без исходного текста ошибки, request, user, payload и секретов.
|
||||
|
||||
## Безопасность
|
||||
|
||||
@@ -39,7 +47,7 @@
|
||||
- Включите мониторинг контейнеров.
|
||||
- Следите за свободным местом на диске.
|
||||
- Проверяйте размер PostgreSQL и директории artifact storage.
|
||||
- Храните бэкапы PostgreSQL отдельно от application host.
|
||||
- Храните полные комплекты PostgreSQL + artifact storage отдельно от application host.
|
||||
- Регулярно выполняйте контрольное восстановление через `scripts/restore-community.sh` на чистом стенде.
|
||||
- Перед обновлением фиксируйте текущие image tags.
|
||||
- После обновления проверяйте UI, Admin API и MCP endpoint.
|
||||
|
||||
|
||||
+93
-4
@@ -131,14 +131,103 @@ CRANK_CACHE_DEFAULT_TTL_MS=60000
|
||||
|
||||
## Логи
|
||||
|
||||
- `CRANK_LOG_LEVEL` - уровень логирования, например `info`, `debug`, `warn`.
|
||||
- `CRANK_ENVIRONMENT` - короткая метка окружения. При локальном запуске по
|
||||
умолчанию используется `development`, Community deployment явно передаёт
|
||||
`production`.
|
||||
- `CRANK_LOG_LEVEL` - фильтр `tracing`, например `info`, `debug`, `warn` или
|
||||
`admin_api=debug,tower_http=info`.
|
||||
|
||||
Поля с паролями, токенами, ключами и заголовками авторизации удаляются из снимков
|
||||
запросов и ответов. Один снимок ограничен 16 КиБ; более крупное значение хранится в
|
||||
усечённом виде с исходным размером.
|
||||
`admin-api` и `mcp-server` пишут в stdout по одному JSON-объекту на строку.
|
||||
Поля с паролями, токенами, ключами, cookie, authorization, query, полным телом
|
||||
или результатом очищаются до сериализации.
|
||||
|
||||
Пример:
|
||||
|
||||
```env
|
||||
CRANK_ENVIRONMENT=development
|
||||
CRANK_LOG_LEVEL=info
|
||||
```
|
||||
|
||||
Внешний сборщик журналов не обязателен. Его отсутствие не влияет на `/health`
|
||||
и `/ready`.
|
||||
|
||||
## Критические ошибки
|
||||
|
||||
- `CRANK_SENTRY_DSN` — DSN внешнего Sentry-совместимого приёмника.
|
||||
|
||||
Пустое или отсутствующее значение отключает канал. Неверное непустое значение
|
||||
останавливает запуск безопасной ошибкой без вывода DSN. Оба сервиса используют
|
||||
одно значение, но передают собственные `service`, `release` и `environment`.
|
||||
|
||||
```env
|
||||
CRANK_SENTRY_DSN=
|
||||
```
|
||||
|
||||
Community не разворачивает GlitchTip или другой приёмник. Подробный состав
|
||||
события и правила очистки приведены в
|
||||
[документе о наблюдаемости](observability.md).
|
||||
|
||||
## Prometheus
|
||||
|
||||
- `CRANK_METRICS_ENABLED` — включает отдельные listener-ы, по умолчанию
|
||||
`true`;
|
||||
- `CRANK_ADMIN_METRICS_BIND` — адрес показателей `admin-api`, по умолчанию
|
||||
`127.0.0.1:9464`;
|
||||
- `CRANK_MCP_METRICS_BIND` — адрес показателей `mcp-server`, по умолчанию
|
||||
`127.0.0.1:9465`;
|
||||
- `CRANK_METRICS_BEARER_TOKEN` — отдельный токен, обязательный для любого
|
||||
non-loopback bind.
|
||||
|
||||
Значения проверяются до запуска рабочих listener-ов. Для отключения
|
||||
поверхности:
|
||||
|
||||
```env
|
||||
CRANK_METRICS_ENABLED=false
|
||||
```
|
||||
|
||||
Подробная модель доступа, список показателей и пример настройки сборщика
|
||||
приведены в [документе о наблюдаемости](observability.md).
|
||||
|
||||
## Распределённые трассы OTLP
|
||||
|
||||
Crank экспортирует через OTLP только трассы. Метрики остаются в Prometheus,
|
||||
а эксплуатационные журналы — в stdout. Если оба endpoint пусты, tracer
|
||||
provider и фоновый экспортёр не создаются.
|
||||
|
||||
- `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` — полный HTTP endpoint трасс; имеет
|
||||
приоритет;
|
||||
- `OTEL_EXPORTER_OTLP_ENDPOINT` — общий endpoint, к которому Crank добавляет
|
||||
`/v1/traces`;
|
||||
- `OTEL_EXPORTER_OTLP_TRACES_PROTOCOL` и резервный
|
||||
`OTEL_EXPORTER_OTLP_PROTOCOL` — только `http/protobuf`;
|
||||
- `OTEL_EXPORTER_OTLP_TRACES_TIMEOUT` и резервный
|
||||
`OTEL_EXPORTER_OTLP_TIMEOUT` — предел HTTP-запроса экспорта в миллисекундах;
|
||||
- `OTEL_EXPORTER_OTLP_TRACES_HEADERS` — заголовки только для трасс;
|
||||
- `OTEL_EXPORTER_OTLP_HEADERS` — резервные общие заголовки;
|
||||
- `OTEL_BSP_MAX_QUEUE_SIZE` — конечная очередь spans, по умолчанию `2048`;
|
||||
- `OTEL_BSP_MAX_EXPORT_BATCH_SIZE` — пакет, по умолчанию `512`, не больше
|
||||
очереди;
|
||||
- `OTEL_BSP_SCHEDULE_DELAY` — период отправки в миллисекундах, по умолчанию
|
||||
`5000`;
|
||||
- `OTEL_BSP_EXPORT_TIMEOUT` — совместимый предел пакетного экспортёра в
|
||||
миллисекундах, по умолчанию `30000`.
|
||||
|
||||
Фактический HTTP-запрос экспорта ограничивается более строгим из
|
||||
`OTEL_EXPORTER_OTLP_TRACES_TIMEOUT`/`OTEL_EXPORTER_OTLP_TIMEOUT` и
|
||||
`OTEL_BSP_EXPORT_TIMEOUT`. Это сохраняет оба верхних предела при работе
|
||||
стабильного потокового `BatchSpanProcessor`.
|
||||
|
||||
Допустимы только HTTP/HTTPS URL без учётных данных, query и fragment.
|
||||
Некорректная явно заданная конфигурация останавливает запуск безопасной
|
||||
типизированной ошибкой, не содержащей значений окружения.
|
||||
|
||||
```env
|
||||
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=https://otel.example.com/v1/traces
|
||||
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
|
||||
OTEL_EXPORTER_OTLP_TIMEOUT=10000
|
||||
```
|
||||
|
||||
Заголовки обычно содержат токен приёмника. В production их следует хранить в
|
||||
OpenBao как `OTEL_EXPORTER_OTLP_TRACES_HEADERS`; CD передаёт значение в
|
||||
runtime `.env`, но не выводит его в журнал. Не записывайте токен в
|
||||
репозиторий или Compose.
|
||||
|
||||
@@ -23,14 +23,25 @@
|
||||
- `scripts/check-rust-code-health.sh` — локальный repo-level gate для размера Rust-файлов.
|
||||
- `scripts/check-rust-boundaries.sh` — crate-level dependency direction и module-level import rules.
|
||||
- `scripts/check-rust-module-boundaries.sh` — запрет на опасные imports внутри слоев.
|
||||
- `cargo deny --locked check advisories bans licenses sources` — обязательная проверка лицензий, известных уязвимостей и источников зависимостей.
|
||||
- `scripts/check-dependencies.sh` — единая локальная проверка Rust- и npm-зависимостей.
|
||||
|
||||
Что можно добавить позже:
|
||||
|
||||
- `cargo-deny` для лицензий, security advisories и duplicate dependencies.
|
||||
- `cargo-machete` для поиска неиспользуемых зависимостей.
|
||||
- `cargo-udeps` для более строгой проверки зависимостей, если nightly допустим в отдельной job.
|
||||
- `cargo-modules` или `cargo-guppy` для анализа графа модулей и зависимостей между crate-ами.
|
||||
|
||||
## Политика лицензий зависимостей
|
||||
|
||||
По умолчанию разрешены `MIT`, `BSD-2-Clause`, `BSD-3-Clause`, `Apache-2.0`, `ISC` и `0BSD`.
|
||||
|
||||
`MPL-2.0`, `LGPL`, `EPL` и `CDDL` требуют отдельного технического и юридического рассмотрения до добавления зависимости.
|
||||
|
||||
`GPL`, `AGPL`, `SSPL`, `Commons Clause`, `BUSL` и зависимости с неизвестной лицензией запрещены без юридического согласования. Лицензия самого Community-продукта не считается внешней зависимостью и проверяется отдельно.
|
||||
|
||||
Точечные исключения для обязательных транзитивных зависимостей фиксируются в `deny.toml` по имени пакета и конкретной лицензии. Безымянные или глобальные исключения запрещены.
|
||||
|
||||
## Правила размера
|
||||
|
||||
Новые Rust-файлы не должны быть больше `1000` строк.
|
||||
|
||||
Reference in New Issue
Block a user