You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Ниже — скриншоты из поднятого стека (`docker compose up -d`): Prometheus и Grafana (**Explore → Metrics**, источник Prometheus). Файлы лежат в [`docs/screenshots/`](docs/screenshots/).
282
+
283
+
#### 1. Prometheus: цели сбора (`/targets`)
284
+
285
+
Два job’а в статусе **UP**: API отдаёт метрики на `http://api:8080/metrics`, worker — на `http://worker:9464/metrics`. Это базовая проверка, что экспортёры доступны и scrape проходит без ошибок.
286
+
287
+

Встроенный режим **Metrics** в Grafana (данные с Prometheus) без ручного PromQL: маршрутизация ASP.NET Core (`aspnetcore_routing_match_attempts_total`), DNS-клиент, счётчик сборок (`dotnet_assembly_count`), отсутствие исключений (`dotnet_exceptions_total` на нуле), активность GC и аллокаций на куче. Два кадра — соседние страницы/масштаб того же типа дашборда.
292
+
293
+

Панели GC (размер кучи после сборки, паузы JIT, объём скомпилированного IL, методы), блокировки монитора, CPU процесса, working set, очередь thread pool. По графикам видно старт приложения (всплеск JIT) и затем устойчивое состояние под нагрузкой DemoTraffic.
Метрики клиента: открытые соединения, длительность запросов, время в очереди, распределения по bucket’ам. Для этого API характерен цикл вызовов к самому себе (DemoTraffic через `127.0.0.1:8080`), поэтому видны стабильные исходящие запросы и один долгоживущий коннект.
306
+
307
+

308
+
309
+
#### 6. Входящий HTTP (Kestrel) и продуктовые счётчики
310
+
311
+
Серверная часть: активные запросы, длительность обработки, соединения Kestrel, очередь соединений. Внизу — кастомные счётчики домена (`order_tracking_catalog_orders_list_requests_total`, `order_tracking_catalog_order_detail_views_total`), которые считаются в коде и попадают в Prometheus через OTEL meter.
#### 7. Метаданные scrape и здоровье цели в Grafana
316
+
317
+
Показатели самого процесса scraping’а: `scrape_duration_seconds`, число сэмплов, серии, а также **otel_scope_info**, **target_info** и **`up` = 1** для выбранного таргета. Подтверждает, что Grafana читает те же данные, что видит Prometheus, и что цель считается доступной.
Цепочка **OTLP → collector → Loki / VictoriaLogs** и типичные запросы разобраны в [**docs/logs-query-languages.md**](docs/logs-query-languages.md). Ниже — три скрина из поднятого стека; файлы в [`docs/screenshots/`](docs/screenshots/).
324
+
325
+
#### 1. Grafana → Loki: доставка статуса в UI (Broadcasted)
326
+
327
+
**Explore** или панель **Logs**, datasource **Loki**, режим **Code**, запрос:
328
+
329
+
```logql
330
+
{job=~"order-tracking.*"} |= "Broadcasted"
331
+
```
332
+
333
+
На скрине: гистограмма **Logs volume** и строки **Information** из **`OrderStatusKafkaConsumerHostedService`**: сообщение **Broadcasted status update**, переходы статусов заказа (**Old** / **New**), в теле OTLP — **`traceid`** и **`spanid`** (удобно искать ту же трассу в Jaeger).
334
+
335
+

336
+
337
+
#### 2. Grafana → VictoriaLogs: outbox и EF в потоке логов
338
+
339
+
Тот же стек, datasource **VictoriaLogs**, широкий селектор по сервисам, например `{service.name=~"order-tracking.*"}`. В потоке видны структурированные записи **Entity Framework**: выполнение **`DbCommand`** с запросом к **`outbox_messages`** (`FOR UPDATE SKIP LOCKED`) — это фоновый **worker**, который по паттерну **transactional outbox** забирает сообщения перед публикацией в Kafka. Дополнительно могут проходить строки про scrape **`GET …/metrics`** — это нормальная фоновая активность наблюдаемости.
#### 3. VictoriaLogs VMUI (`:9428`): worker и outbox «как в логах целиком»
344
+
345
+
Нативный UI по адресу **http://localhost:9428**: запрос **`{service.name=~"order-tracking.*"}`** за последние минуты. На скрине явно выделен поток **`order-tracking-worker`**: периодический **`SELECT * FROM outbox_messages … FOR UPDATE SKIP LOCKED`**, ответы **`HTTP/1.1 GET http://worker:9464/metrics`** со статусом **200** — видно и бизнес-цикл outbox, и успешный scrape Prometheus с worker.
Подробный разбор UI, тегов и типичных имён операций — [**docs/traces-jaeger.md**](docs/traces-jaeger.md). Ниже три кадра **экрана поиска** (**http://localhost:16686**): два для **`order-tracking-api`** (диаграмма + список), один для **`order-tracking-worker`**. Имеет смысл приложить к отчёту вместе с [**деталью трассы**](docs/traces-jaeger.md) (`jaeger-trace-detail.png`), когда в дереве видны нужные спаны.
352
+
353
+
#### 1. API: диаграмма и список трасс
354
+
355
+
Сервис **`order-tracking-api`**, lookback **Last Hour**. Видны быстрые **`HEAD /health`**, **`GET`** и серии **`order_tracking`** — смешение HTTP и коротких трасс, связанных с инфраструктурой запросов к БД.
356
+
357
+

358
+
359
+
#### 2. API: фрагмент списка (недавние трассы)
360
+
361
+
Тот же сервис: удобно показать в отчёте «живой» поток операций и пометку **1 Span** в строке — напоминание открыть трассу целиком или использовать **Tags** для поиска по Kafka / доменным полям.
Сервис **`order-tracking-worker`**: регулярные короткие трассы с операцией вроде **`order_tracking`** соответствуют циклу работы воркера с базой и **outbox**; детали спанов **`Outbox.Dispatch`** / **`Kafka.Produce`** — после перехода внутрь выбранной трассы.
[logs-query-languages.md](logs-query-languages.md) — OTLP → collector → Loki, OpenSearch, VictoriaLogs; LogQL, LogsQL, Lucene, DQL. Иллюстрации: `screenshots/logs-grafana-loki-broadcasted.png`, `logs-grafana-victorialogs-outbox.png`, `logs-victorialogs-vmui-worker.png`, также `loki-explore.png`, `victorialogs-query.png`, `opensearch-discover.png`. Краткий блок с теми же скринами — в корневом [README.md](../README.md#наблюдаемость).
21
21
22
22
## Трейсы
23
23
24
-
[traces-jaeger.md](traces-jaeger.md) — OTLP, Jaeger UI, теги поиска, связь с логами. Иллюстрации: `screenshots/jaeger-search.png`, `jaeger-trace-detail.png`.
24
+
[traces-jaeger.md](traces-jaeger.md) — OTLP, Jaeger UI, теги поиска, связь с логами. Иллюстрации: `screenshots/traces-jaeger-search-api-scatter.png`, `traces-jaeger-search-api-list.png`, `traces-jaeger-search-worker.png`, также `jaeger-search.png`, `jaeger-trace-detail.png`. Краткий блок — в корневом [README.md](../README.md#наблюдаемость).

124
130
131
+
**Пример из Grafana (VictoriaLogs datasource):** широкий селектор `{service.name=~"order-tracking.*"}` — в ленте видны **`DbCommand`** Entity Framework с **`SELECT * FROM outbox_messages … FOR UPDATE SKIP LOCKED`** (worker, transactional outbox), а также служебные строки про scrape **`/metrics`**.
Помимо Grafana, у сервиса **`victorialogs`** есть свой UI: **`http://localhost:9428`**. Запрос **`{service.name=~"order-tracking.*"}`** за короткий интервал показывает поток **`order-tracking-worker`**: периодический опрос **outbox** и успешные **`GET http://worker:9464/metrics`** (ответ **200**) — то есть одновременно видно бизнес-цикл и доступность экспортёра метрик.
-**`GET`** с усечённым в UI именем — входящие HTTP-запросы к API (список заказов, карточка и т.д.);
48
+
-**`order_tracking`** (или похожее имя из инструментирования **EF Core** / БД) — отдельные короткие трассы, связанные с доступом к PostgreSQL и именем базы **`order_tracking`**.
49
+
50
+
В сводной строке Jaeger часто показывают **«1 Span»**: это значит, что в данной трассировке на момент записи виден один корневой спан (или одна «ветка» без дочерних в экспорте). Вложенные спаны **`Kafka.Consume`** / **`SignalR.Broadcast`** ищите **внутри конкретной трассы** (клик по строке → timeline / дерево) или через фильтр **Tags**, например `messaging.system=kafka`.
51
+
52
+

53
+
54
+
Тот же сервис, акцент на последних трассах и смешении операций (**`order_tracking`**, **`GET`**, **`HEAD /health`**):
55
+
56
+

57
+
58
+
#### Поиск по сервису `order-tracking-worker`
59
+
60
+
Для worker выберите **Service → `order-tracking-worker`**. Часто доминируют короткие трассы с операцией вроде **`order_tracking`** — это периодический фон **опроса БД** и работы с **outbox** (в связке с доменным кодом и EF). Спаны **`Outbox.Dispatch`** и **`Kafka.Produce`** смотрите в **детальном виде** выбранной трассы; при пустом дереве проверьте нагрузку (DemoTraffic / смена статусов) и фильтры по тегам.
0 commit comments