# Observability Review — 2026-06-11

**Tool:** SigNoz  
**Period:** последние 7 дней (168 ч)

## Key Metrics

| Metric | Value | vs yesterday |
|---|---|---|
| Error rate | 0.36% (619 / 170 865) | нет baseline |
| p99 latency (MCP SSE) | 4 759 281 мс (ожидаемо — SSE keep-alive) | — |
| p99 latency (threads_publish_thread) | 9 977 мс | — |
| p99 latency (OpenRouter credits) | 6 505 мс | — |
| p99 latency (Google OAuth callback) | 1 314 мс | — |
| Slow queries (> 100ms) | 0 (данные от Prisma недоступны) | — |
| Request volume | 170 865 спанов за 7 дней | нет baseline |

## Findings

### Errors

- **459 ошибок 400 от `GET graph.facebook.com`** — доминирует 74% всех ошибок. Вероятно OAuthTokenError (Meta коды 190/102), но объём ~66/день значителен → issue #109.
- 4–3 ошибок 404 на `.js.map` файлы — source map'ы не поставляются в production. Незначительно.
- 4 ошибки 400 на `[blocked-action]` — middleware блокирует запросы, ожидаемо.

### Security

- **КРИТИЧНО: OAuth access_token Threads в именах OTel-спанов** — авто-инструментация создаёт спаны вида `fetch POST https://graph.threads.net/v1.0/me/threads?access_token=THAAXGXKf...`. Реальные токены пользователей видны в SigNoz → issue #108 (critical).

### Latency

- `GET /api/mcp/[apiKey]` p99 = 4 759 с — SSE endpoint, keep-alive соединения. Ожидаемо.
- `GET` (unnamed) p99 = 1 035 с — вероятно, другой SSE/streaming спан.
- `mcp.tool threads_publish_thread` p99 = 9 977 мс — Threads API медленный (6–7 с), инструмент накапливает overhead.
- `fetch GET openrouter.ai/api/v1/credits` p99 = 6 505 мс — внешний API без кэша → issue #110 (medium).
- `GET /api/oauth/google/callback` p99 = 1 314 мс — пограничное значение; код токен-обмена не оптимизирован.

### DB

- Prisma InstrumentedQueries не вернули данных — возможно, `slow_db_queries` пуст из-за фильтра > 100 мс или Prisma spans ещё не коррелируют с сервисом.

### Integrations

- Threads API: 3 спана с реальными URL+токеном + `service-fetch threads` p99 5 460 мс. Сеть работает, но медленна.
- LinkedIn: `mcp.tool linkedin_create_post` p99 1 675 мс — приемлемо.
- OpenRouter: p99 6.5 с — нужен кэш.

## Recurring Issues

- **Ошибки от Meta/Graph API** — фигурировали в снапшотах с мая 2026 (issue #75 OAuth refresh circuit breaker, issue #107 tcp/tls failures). Третий снапшот подряд с Meta-ошибками.

## Hypotheses

- Google OAuth callback (p99 1 314 мс) — пограничный, но может стать проблемой при нагрузке. Следить.
- `GET` unnamed span (p99 1 035 с) — скорее всего второй SSE endpoint или long-polling. Нет критичности, но стоит убедиться что имя спана корректно проставляется.
- Source map 404 — Next.js не публикует `.js.map` в standalone output. Браузерные DevTools запрашивают их. Не критично.

## Recommendations

1. **#108 (critical)** — Немедленно добавить SpanProcessor для редактирования `access_token` из `http.url` / span name. Рассмотреть ротацию токенов Threads, чьи значения уже попали в SigNoz.
2. **#109 (high)** — Разобрать коды ошибок Meta (190 vs 102 vs другие). Если преобладает 190 (токен истёк) — улучшить proactive refresh или добавить circuit breaker.
3. **#110 (medium)** — Добавить in-memory кэш TTL 5 мин для OpenRouter credits. Снизит p99 до < 100 мс.
4. Убедиться что `Prisma InstrumentedQueries` действительно отправляют спаны — в `instrumentation.node.ts` проверить что `PrismaInstrumentation` подключена и `db.system` атрибут присутствует в трейсах.
