Отправка телеметрии
pipeline.Main устанавливает OpenTelemetry и Temporal instrumentation. Код
пользователя добавляет доменную информацию через pkg/obs, но не настраивает
exporters.
Логи
obs.Info(ctx, "package installed", obs.Str("name", pkg), obs.Int("attempt", n))
obs.Warn(ctx, "retrying", obs.Err(err))
Доступны Debug, Info, Warn и Error. Атрибуты создают Str, Int и
Err. Worker автоматически добавляет корреляцию run, pipeline, activity и
entity.
obs.RunTail(ctx, cmd, bytes) стримит stdout/stderr и сохраняет ограниченный
хвост для возвращаемой ошибки. Используйте его вокруг внешних команд, чтобы
причина сбоя дошла до логов записи.
Метрики и spans
obs.Count(ctx, "packages.installed", 1, obs.Str("manager", "dnf"))
obs.Gauge(ctx, "queue.depth", depth)
obs.Measure(ctx, "download.seconds", elapsed)
ctx, span := obs.Span(ctx, "download", obs.Str("source", source))
defer span.End()
Count добавляет к целочисленному counter, Gauge записывает значение,
Measure — вещественное измерение. Имена должны описывать стабильные сигналы
продукта, а не функции Go.
Durable events
err := obs.EventFor(ctx, "docker/db", "schema-migrated", payload)
Event — durable доменная веха в workflow history записи, а не строка лога.
Используйте события редко: каждое занимает history. В activity ресурса
obs.Event берёт entity из контекста; при явной работе с другой записью нужен
EventFor.
Все измерения читаются через graphenectl observe или Studio. Бекенды настраиваются в конфигурации сервера.