Состав телеметрии
Время журналов 1С - местное время сервера, в OpenTelemetry оно передается в UTC по часовому поясу из настройки otel.v8-logs.timezone.
Ресурс
Данные журналов отправляются с отдельным ресурсом, не с ресурсом коллектора:
| Атрибут ресурса | Значение |
|---|---|
service.name | otel.v8-logs.service.name или service-name источника |
v8.infobase.name | информационная база: для журнала регистрации - infobase источника; для технологического журнала - свойство события p:processName, а если оно пустое - infobase источника |
атрибуты из otel.v8-logs.resource.attributes | как заданы |
Loki делает индексируемыми метками только атрибуты ресурса из своего списка (service.name и другие, см. документацию Loki), остальные сохраняются как структурированные метаданные. Чтобы база стала меткой v8_infobase_name, добавьте v8.infobase.name в limits_config.otlp_config Loki - пример в demo/loki-config.yaml.
В технологическом журнале p:processName бывает и не базой: в журнале файловой базы на macOS (8.3.27) у событий отладчика оно равно RemoteDebugger и DebugControlCenter, и эти значения тоже попадают в v8.infobase.name.
Технологический журнал
Логи
Каждое событие - запись лога (область инструментирования opentelemetry-v8-logs.techlog).
| Поле | Значение |
|---|---|
| Время | время окончания события |
| Тело | исходный текст события |
| Серьезность | из свойства события level: TRACE, DEBUG, INFO, WARNING - WARN, ERROR; без него или при другом значении - по имени события: ERROR для EXCP; WARN для ATTN, TDEADLOCK, TTIMEOUT; иначе INFO |
v8.techlog.event.name | имя события (CALL, DBMSSQL...) |
v8.techlog.duration | длительность, мкс |
v8.techlog.depth | уровень вложенности |
v8.techlog.<свойство> | свойства события как есть: v8.techlog.Usr, v8.techlog.t:clientID, v8.techlog.Sql...; повторяющиеся свойства - массивом |
process.executable.name, process.pid | процесс и PID из имени каталога или файла |
log.file.path | путь к файлу журнала |
Метрики
| Метрика | Тип | Атрибуты |
|---|---|---|
v8.techlog.event.duration, с | гистограмма | v8.techlog.event.name, process.executable.name, v8.infobase.name |
Трассы
Трасса - верхнеуровневое событие потока выполнения (процесс, OSThread и t:clientID, если он есть) со всеми событиями, вложенными в него по уровню и времени. Платформа пишет событие по окончании, поэтому вложенные события появляются в журнале раньше родителя. Сборщик исходит из того, что события одного уровня в одном потоке по времени не пересекаются, и тогда охват интервала [окончание - длительность, окончание] событием меньшего уровня означает, что событие - предок. В журналах автономного сервера ibsrv и файловой базы (macOS, 8.3.27) это выполняется.
Трассы собираются в одном из двух режимов (настройка otel.v8-logs.traces.mode).
Потоковый (streaming). Спан каждого события отправляется сразу при чтении. Корень трассы - событие вызова (CALL, настройка otel.v8-logs.traces.root-events) или событие уровня 0: ниже уровня 0 стека нет, и предка у такого события быть не может. Идентификатор родителя выдается заранее: событие уровня d ссылается на «слот» уровня d-1, а слот копит объединение интервалов своих потомков. Событие уровня d-1 занимает слот, только если его интервал охватывает всех потомков слота. Если уровень не пишется в журнал или следующее событие этого уровня не охватывает потомков, слот отправляется синтетическим спаном UNLOGGED с атрибутом v8.techlog.synthetic. Корень закрывает трассу потока; ожидавшие события, которые он не охватывает, закрываются отдельной трассой с синтетическим корнем. Трасса, в потоке которой больше часа не было событий, закрывается синтетическим корнем.
В журнале ibsrv код пользователя - например, запись документа - выполняется внутри CALL,0 (ib::worker::IInfoBaseWorkingContextCall.execute) того же потока, без t:clientID у вызова и его событий.
Накопление (buffered). В журнале файловой базы код пользователя выполняется в процессе клиента (1cv8c, 1cv8) без событий CALL, и верхнеуровневое событие становится известно, только когда записан его предок или стало ясно, что предка не будет. События потока копятся в памяти деревьями и отправляются: когда в потоке записано событие уровня 0 (охватить накопленные события после него не может ничто), после минуты без событий потока (по времени журнала, а после прохода, дочитавшего журналы, - по часам), при накоплении 10000 событий потока и при завершении работы. Каждое верхнеуровневое событие - например, SDBL Func=HoldConnection с транзакцией внутри или отдельный запрос - становится отдельной трассой. Записи лога отправляются сразу и со спаном не связаны: спан и его запись лога находятся по log.file.path и времени.
Режим по умолчанию auto: накопление для процессов 1cv8 и 1cv8c, потоковый для остальных. Так выбрано по наблюдению: клиент, подключенный к серверу, событий SDBL не пишет, а клиент файловой базы пишет. Режим можно задать явно для всех журналов или для источника (traces-mode).
Имена спанов
Имя спана состоит из имени события, операции и места вызова из последней непустой строки собственного Context. Кадр Модуль : строка : выражение сокращается до Модуль:строка, кадр без модуля — до <dynamic>:строка. Другой формат контекста сохраняется как текст. Контекст дочернего события не заменяет имя родительского вызова.
| Событие | Имя | Пример |
|---|---|---|
CALL фонового задания | Module.Method, если Func=Background job и оба поля заполнены | CALL Jobs.Run |
CALL с собственным Context | место вызова | CALL ОбщийМодуль.Обмен.Модуль:42 |
CALL, SCALL | интерфейс и метод (IName, MName или Method), иначе Func | SCALL ILogMngrData.writeLogEntryData, CALL Dynamic list search |
CALL, SCALL без метода и контекста | Func и, если доступны, Form.FormItem | CALL Dynamic list search · Документ.Заказ.Форма.ФормаДокумента.Список |
SDBL | Func, иначе вид запроса и таблица | SDBL HoldConnection, SDBL UPDATE Document54 |
DBMSSQL, DBPOSTGRS, DBORACLE, DB2 | вид запроса и таблица; для ODBC {call ...} — EXEC и имя процедуры; без запроса — Func | DBMSSQL INSERT _Document54, DBMSSQL EXEC sp_executesql |
TLOCK | пространства блокировок (Regions) | TLOCK Document54.REFLOCK |
EXCP | тип исключения и место вызова; без Context — первый кадр {Модуль(строка)} из Descr | EXCP RuntimeException · ОбщийМодуль.Test.Модуль:42 |
| синтетический | UNLOGGED |
У событий, кроме CALL с собственным контекстом и фоновых заданий, место вызова добавляется после операции через ·: DBMSSQL SELECT _Document54 · ОбщийМодуль.Test.Модуль:42. Операция ограничена 100 символами, модуль — 120 (сохраняется конец имени и номер строки), контекст неизвестного формата — 160. Исходные свойства остаются в атрибутах события. Значения SQL-параметров в имя из запроса не включаются.
Правила именования одинаковы для streaming, buffered и auto. В потоковом режиме спан отправляется сразу: отдельное событие Context, записанное после вызова, не меняет его имя. Для этих правил нужен Context в свойствах самого события.
| Событие | Спан |
|---|---|
CALL | вид SERVER |
DBMSSQL, DBPOSTGRS, DBORACLE, DB2 | вид CLIENT, db.system.name |
EXCP | вид INTERNAL, статус ERROR, событие exception (exception.type, exception.message) |
| остальные | вид INTERNAL |
Атрибуты спанов - те же, что у записей лога. В потоковом режиме каждая запись лога события содержит trace_id и span_id спана этого события: из Loki можно перейти в трассу в Tempo и обратно.
Состояние трасс хранится в памяти. Если приложение перезапустится посреди вызова, в потоковом режиме вложенные события, отправленные до перезапуска, сошлются на родителя, который не придет; в режиме накопления при аварийном завершении накопленные спаны теряются (при штатном - отправляются).
Для трасс в журнал нужно писать свойство OSThread, а для места вызова в именах спанов — Context.
Время спана - время события в журнале. Tempo записывает в метаданные блока время поступления данных, если время спанов отстоит от него больше, чем на ingestion_time_range_slack (по умолчанию 2 минуты), а поиск по интервалу времени выбирает блоки по метаданным. Поэтому спаны, выгруженные при первом запуске по накопленным журналам или при догоне после простоя, с настройками Tempo по умолчанию поиском по своему времени не находятся; по идентификатору трассы, в том числе из записи лога в Loki, они открываются. В demo/tempo-config.yaml запас увеличен до срока хранения блоков (336h) в разделах storage.trace.wal, live_store.wal и block_builder.wal (Tempo 3).
Журнал регистрации
Логи
Каждая запись - запись лога (область инструментирования opentelemetry-v8-logs.eventlog). Пустые поля не передаются.
| Поле | Значение |
|---|---|
| Время | время записи |
| Тело | строка как в просмотре журнала, части через |: представление события (v8.eventlog.event.presentation); у событий с объектом метаданных или данными - объект, представление данных (без него - данные) и пользователь, у остальных - приложение, пользователь и session=<номер>, значения как в журнале. Пустые части пропускаются, комментарий - с новой строки. Например, Данные. Проведение | Document.Document | Document 000000001 dated 10/20/2026 12:56:10 PM, Сеанс. Начало | 1CV8C | session=2 |
| Серьезность | E - ERROR, W - WARN, I - INFO, N (примечание) - DEBUG |
v8.eventlog.event | идентификатор события (_$Session$_.Start, _$Data$_.Post...) |
v8.eventlog.event.presentation | представление события, как в просмотре журнала, на языке из настройки otel.v8-logs.language: «Данные. Проведение» или «Data. Posting». У событий без представления (события пользователя, события, которых нет в платформе 8.3.27) - идентификатор события, поэтому атрибут заполнен у всех записей |
user.name, user.id | имя и идентификатор пользователя |
v8.eventlog.computer, v8.eventlog.application | компьютер и приложение |
v8.eventlog.connection, v8.eventlog.session | соединение и сеанс |
v8.eventlog.transaction.status | committed (код C), rolled_back (код R): в журналах с этими кодами записаны события _$Transaction$_.Commit и Rollback |
v8.eventlog.transaction.status_code | код статуса транзакции как есть: C, R, U (у изменений данных внутри транзакции; значение не расшифровывается) |
v8.eventlog.transaction.id | номер транзакции |
v8.eventlog.metadata, v8.eventlog.metadata.uuid | объект метаданных |
v8.eventlog.data | Структурированный OTLP-атрибут с полями известной формы Data; для неизвестной формы — строка JSON с исходным деревом, для скаляра — текстовое значение. Подробнее о разборе Data. |
v8.eventlog.data.presentation | представление данных |
v8.eventlog.server, v8.eventlog.port, v8.eventlog.sync_port | рабочий сервер и порты |
v8.eventlog.data_separation.<разделитель> | значения разделителей сеанса |
log.file.path | путь к файлу журнала |
Метрики
| Метрика | Тип | Атрибуты |
|---|---|---|
v8.eventlog.records | счетчик | v8.eventlog.event, v8.eventlog.severity, v8.infobase.name, v8.eventlog.application |
