[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-infra\u002Fdeploy\u002Fmetrics":3,"docs-tabs-infra\u002Fdeploy\u002Fmetrics":6},{"content":4,"lastmod":5},"\n## Метрики туннеля\n\n`GET \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Fmetrics`\n\nВозвращает данные активности сервера из Black Hole Gateway в реальном времени: время подключения агента, последние HTTP и SSH запросы, количество активных соединений. Используйте для мониторинга «живо ли приложение», отладки таймаутов, проверки авто-сна. Работает только для BLACKHOLE-серверов. Если Gateway временно недоступен — ответ всё равно придёт со статусом 200, но поле `available: false`.\n\n## Параметры\n\n| Параметр | В | Тип | Обяз. | Описание |\n|----------|---|-----|:-----:|----------|\n| `id` | path | string (UUID) | да | ID BLACKHOLE-сервера |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -H \"X-Api-Key: YOUR_API_KEY\" \\\n  https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Fmetrics\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Fmetrics\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch(\n  `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}\u002Fmetrics`,\n  { headers: { 'X-Api-Key': 'YOUR_API_KEY' } }\n)\nconst { data } = await res.json()\n\nif (data.available) {\n  console.log(`Подключён: ${data.connectedAt}`)\n  console.log(`Последний HTTP: ${data.lastRequestAt ?? 'никогда'}`)\n  console.log(`HTTP-соединений: ${data.httpConnections}`)\n} else {\n  console.log('Gateway недоступен, туннель может работать')\n}\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch(\n  `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}\u002Fmetrics`,\n  {\n    headers: {\n      'X-Api-Key': 'YOUR_APP_KEY',\n      'Authorization': 'Bearer USER_SESSION_TOKEN',\n    },\n  }\n)\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|----------|\n| `success` | boolean | Всегда `true` — даже когда Gateway недоступен, эндпоинт возвращает 200 с `available: false` |\n| `data.available` | boolean | `true` — данные получены от Gateway. `false` — Gateway не отвечает (но туннель мог работать) |\n| `data.subdomain` | string | Субдомен приложения (всегда присутствует) |\n| `data.appUrl` | string | HTTPS-адрес приложения (только при `available: true`) |\n| `data.connectedAt` | string (ISO 8601) \\| null | Момент, когда агент подключился к Gateway. `null` — агент ни разу не был подключён |\n| `data.lastRequestAt` | string (ISO 8601) \\| null | Момент последнего HTTP-запроса к приложению. `null` — ни одного запроса не было |\n| `data.lastSshActivityAt` | string (ISO 8601) \\| null | Момент последней SSH-активности. Для современных BLACKHOLE-серверов всегда `null` (SSH-relay отключён) |\n| `data.httpConnections` | number | Количество активных HTTP-соединений через туннель |\n| `data.sshConnections` | number | Количество активных SSH-соединений. Всегда `0` для современных серверов |\n\n## Пример ответа\n\nGateway доступен:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"available\": true,\n    \"subdomain\": \"app-5ec02c7e\",\n    \"appUrl\": \"https:\u002F\u002Fapp-5ec02c7e.vibecode.bitrix24.tech\",\n    \"lastRequestAt\": null,\n    \"lastSshActivityAt\": null,\n    \"connectedAt\": \"2026-04-22T11:16:32Z\",\n    \"httpConnections\": 0,\n    \"sshConnections\": 0\n  }\n}\n```\n\nGateway недоступен (штатное поведение при временной недоступности):\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"available\": false,\n    \"subdomain\": \"app-5ec02c7e\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — не BLACKHOLE-сервер:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"BLACKHOLE server not found\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный или просроченный API-ключ |\n| 404 | `NOT_FOUND` | Сервер не в режиме BLACKHOLE, удалён или принадлежит другому API-ключу. Для OPEN-сервера эндпоинт возвращает 404 (метрики туннеля не применимы) |\n| 429 | `RATE_LIMITED` | Превышен общий лимит запросов платформы |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- **HTTP 200 + `available: false` — это не ошибка, а штатное поведение при временной недоступности Gateway.** Gateway временно не отвечает (перезапуск, сетевые проблемы внутри платформы), но приложение при этом **может** работать — туннель восстановится сам. В UI показывайте «метрики недоступны», а не «сервер мёртв».\n- **`connectedAt` сбрасывается при перезапуске Gateway.** Если Gateway перезапустили (редкое событие), `connectedAt` покажет момент нового подключения агента. Это не значит, что агент переподключался — Gateway просто «забыл» историю.\n- **`lastRequestAt: null` при запущенном сервере — норма.** Означает, что никто не обращался к HTTPS-субдомену приложения. Авто-сон может скоро усыпить такой сервер (если настроен через [`PATCH \u002Fsleep`](\u002Fdocs\u002Finfra\u002Flifecycle\u002Fsleep)).\n- **`available: true` ≠ «приложение работает».** Это означает лишь, что Gateway отдал данные. Агент подключён, туннель готов — но приложение может не слушать порт 3000 и отдавать 503. Для проверки работоспособности делайте HTTP-запрос на `appUrl`.\n\n## Смотрите также\n\n- [Настроить авто-сон](\u002Fdocs\u002Finfra\u002Flifecycle\u002Fsleep) — использует `lastRequestAt`\u002F`lastSshActivityAt` для определения простоя.\n- [Получить сервер](\u002Fdocs\u002Finfra\u002Fservers\u002Fget) — `blackholeStatus: CONNECTED` подтверждает, что туннель открыт.\n- [Восстановить туннель](\u002Fdocs\u002Finfra\u002Flifecycle\u002Frepair) — если `connectedAt` давно и `blackholeStatus` в `DISCONNECTED`.\n- [Логи сервиса](.\u002Flogs.md) — если `available: false` сохраняется — проверить `vibe-agent` в логах.\n","2026-06-29",{}]