awesome-everything EN
↑ Обратно к восхождению

Наблюдаемость

OTel Logs Data Model и audit-логи как подсистема

Суть OTel Logs Data Model — точка схождения cross-vendor схемы 2026. Audit-логи разделяют JSON-формат, но отличаются по retention, immutability и access — смешивание с операционными логами — compliance failure.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Команда проходит SOC 2 аудит. На следующий год они меняют log-backend. Переписывают log-схему, передеплоивают collector и ломают audit-log-запросы, от которых зависит compliance-команда. Log-схема была vendor-proprietary, не OTel. Разделение audit-логов никогда не было формализовано. Следуют два месяца remediation.

OTel Logs Data Model

OpenTelemetry Logs specification (API стабилен: конец 2023; SDK стабилен в большинстве языков: конец 2024) определяет log-запись как типизированную структуру со следующими полями:

  • Timestamp: когда событие произошло (выставляется приложением).
  • ObservedTimestamp: когда collector наблюдал запись. При clock skew или backpressure collector’а они расходятся — senior-команды алертят на (ObservedTimestamp - Timestamp) p99 > 60s как pipeline-health-метрику.
  • SeverityNumber: числовая лестница (TRACE=1-4, DEBUG=5-8, INFO=9-12, WARN=13-16, ERROR=17-20, FATAL=21-24) для сравнения severity между библиотеками с разными text-label (DEBUG vs Debug vs debug vs trace).
  • SeverityText: human-readable label (например "INFO", "ERROR").
  • Body: human-readable log-message.
  • Resource: per-emitter атрибуты, выставляемые один раз при старте сервиса — service.name, host.name, cloud.region, service.version, deployment.environment. Это OTel Resource-концепция, не per-event поля.
  • Attributes: flat key-value-карта event-specific данных с OTel Semantic Conventions — http.route, http.response.status_code, db.system, error.type, exception.type.
  • TraceId, SpanId, TraceFlags: наследуются от активного span’а на emit-time (рассмотрено в уроке 06).

Wire-формат — OTLP/Logs: protobuf поверх gRPC или HTTP/1.1. Compressed OTLP на 30-50% меньше эквивалентного JSON, что важно в масштабе парка.

Группа полейПоляВыставляется
ВремяTimestamp, ObservedTimestampПриложение / Collector
SeveritySeverityNumber, SeverityTextПриложение
СодержимоеBody, AttributesПриложение (event-specific)
Resourceservice.name, host.name, cloud.region, …SDK при старте (один раз per emitter)
Trace-контекстTraceId, SpanId, TraceFlagsOTel SDK (из активного span’а)

Почему vendor portability важна

Принятие OTel Logs Data Model сегодня означает, что смена backend — изменение конфига collector’а, не переписывание инструментации. Сервис, эмитирующий OTel-shaped логи сегодня, может направить OTel Collector на Honeycomb, ClickHouse, Loki, Datadog (через OTLP-receiver) или Splunk (через OTel-ingest path), изменив один exporter-блок. Никаких изменений application-кода.

Обратное — эмиссия в vendor-proprietary схему — залочивает каждый log-call-site на field-names и ingest-формат этого вендора. Cost миграции — по сути реинструментация каждого сервиса.

Комбинация «дёшево принять» (каждый современный logger SDK OTel-compatible или имеет тонкий адаптер) и «дорого отложить» — определение no-regret архитектурного выбора.

Почему это работает

Двухтimestamp-дизайн (Timestamp vs ObservedTimestamp) стоит понять. Timestamp отражает, когда приложение решило, что событие произошло — может быть выставлен в прошлое для late-arriving событий. ObservedTimestamp выставляется collector’ом в момент получения записи. Когда в collector-pipeline backpressure, ObservedTimestamp расходится с ingest-time на backend’е. Мониторинг p99 (ObservedTimestamp - Timestamp) обнаруживает одновременно backpressure collector’а и clock skew. Если ниже 60 секунд — pipeline здоров.

Audit-логи как подсистема первого порядка

Операционные логи отвечают «почему сервис медленный?» Audit-логи — «кто, что, когда, с каким ресурсом?»

Они разделяют JSON-схему и trace_id. Но отличаются по трём осям, делающим их смешивание compliance failure:

Retention: операционные логи хранятся 7-90 дней (hot/warm/cold tier’ы). Audit-логи хранятся 1-7 лет (SOC 2: 1 год; HIPAA / PCI DSS: 7 лет). Единый индекс с 30-дневным retention тихо удаляет audit-события, которые compliance требует хранить годами.

Immutability: операционные логи можно удалять (retention policies, right-to-erasure, cost control). Audit-логи обязаны быть append-only — hash-chained или криптографически подписанными — чтобы tampering было обнаружимым. Многие compliance-фреймворки явно требуют верифицируемой целостности audit-логов.

Access: операционные логи читаемы dev- и on-call-командой. Audit-логи читаемы узкой ролью (platform security team + внешние аудиторы) с audit-of-audits: доступ к audit-log-индексу сам логируется.

Архитектурный паттерн: эмитировать audit-события через тот же logger SDK, что и операционные, но с атрибутом category: "audit". Collector маршрутизирует строки category=audit через отдельный pipeline в dedicated backend-индекс с более строгими свойствами retention, immutability и access. Всё остальное идёт в операционный pipeline. Маршрутизация прозрачна для приложения — оно просто выставляет поле.

Что принадлежит audit-логам: auth-события (login, logout, failed login), изменения авторизации (role grants, permission changes), доступ к данным на регулируемых записях (чтение health или financial data клиента), изменения конфигурации (ротация secrets, изменения access control list). Схема уже, чем у операционных логов: типично who, what, when, resource, outcome, trace_id.

Викторина

Какая спецификация определяет enumeration SeverityNumber (1-24), отображающую log-level'ы между библиотеками и backend'ами в сравнимую числовую severity?

Викторина

Команда хранит операционные логи и audit-логи в одном индексе с 30-дневным retention. В чём compliance failure?

Расставь шаги по порядку

Упорядочь шаги для внедрения compliance-ready audit-log подсистемы наряду с операционным логированием:

  1. 1 Определить типы audit-событий: auth, role change, data access, config change
  2. 2 Добавить атрибут category='audit' ко всем audit-event log-вызовам в application-коде
  3. 3 Настроить routing-правило collector'а: category=audit идёт в audit-pipeline, остальное в операционный
  4. 4 Создать dedicated audit backend-индекс с append-only хранением, минимум 1-летним retention
  5. 5 Ограничить доступ к audit-индексу platform security team и аудиторам; настроить audit-of-audits (доступ к audit-индексу сам логируется)
  6. 6 Добавить CI-проверку, отправляющую тестовое auth-событие и верифицирующую, что оно попадает в audit-индекс, а не в операционный
Вспомните перед уходом
  1. 01
    Почему OTel Logs Data Model — правильный выбор даже для команды, ещё не использующей ни одного OTel-aware backend?
  2. 02
    В чём смысл двухtimestamp-дизайна (Timestamp vs ObservedTimestamp) в OTel Logs Data Model?
  3. 03
    Назови три оси, по которым audit-логи обязаны отличаться от операционных, и почему каждая важна для compliance.
Итог

OTel Logs Data Model (API стабилен конец 2023, SDK стабилен конец 2024) определяет cross-vendor log-schema: Timestamp (приложение), ObservedTimestamp (collector), SeverityNumber 1-24 для cross-library severity-сравнения, SeverityText, Body, Resource-атрибуты один раз per emitter, event Attributes по OTel Semantic Conventions, TraceId/SpanId/TraceFlags из активного span’а. Двухtimestamp-дизайн обнаруживает backpressure pipeline и clock skew: алерт при (ObservedTimestamp - Timestamp) p99 свыше 60 секунд. Принятие этой схемы сегодня делает смену backend изменением конфига collector’а, не реинструментацией. Audit-логи разделяют JSON-схему, но требуют разделения: dedicated pipeline и backend-индекс с 1-7 лет retention (SOC 2/HIPAA/PCI), append-only immutability и узким access с audit-of-audits. Маршрутизация через атрибут category=audit на collector’е — приложение просто выставляет поле. Смешивание audit и операционных логов в одном индексе тихо нарушает retention, immutability и требования к access.

Связанные уроки
встречается в268
Продолжить восхождение ↑Структурное логирование: тест с выбором ответа
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.