BoundaryML/baml · error

log event omitted call

Error message

log event omitted call

What it means

LogEventV1 carries its associated TraceCallKey in an optional 'call' field; when it is unset (proto3 optional absent / None), the TryFrom conversion to LogEventRecord cannot build a record and returns InvalidData with this message. Every log event must be attributable to a trace call.

Source

Thrown at baml_language/crates/bex_events/src/value/record.rs:328

            file_path: value.file_path.clone(),
            file_id: value.file_id,
            line: value.line,
            column: value.column,
            end_line: value.end_line,
            end_column: value.end_column,
            start_offset: value.start_offset,
            end_offset: value.end_offset,
        }
    }
}

impl TryFrom<crate::value::pb::LogEventV1> for LogEventRecord {
    type Error = io::Error;

    fn try_from(value: crate::value::pb::LogEventV1) -> Result<Self, Self::Error> {
        let call = value
            .call
            .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidData, "log event omitted call"))?;
        Ok(Self {
            call: call.try_into()?,
            level: value.level,
            source: value.source.map(TryInto::try_into).transpose()?,
            timestamp_ms: value.timestamp_ms,
            message_preview: value.message_preview,
        })
    }
}

impl From<&LogEventRecord> for crate::value::pb::LogEventV1 {
    fn from(value: &LogEventRecord) -> Self {
        Self {
            call: Some(value.call.into()),
            level: value.level.clone(),
            source: value.source.as_ref().map(Into::into),
            timestamp_ms: value.timestamp_ms,
            message_preview: value.message_preview.clone(),

View on GitHub (pinned to bd85ce9dee)

Solutions

  1. Fix the producer to always set call (a valid TraceCallKeyV1) before emitting LogEventV1
  2. At ingest, either drop events lacking a call or attach them to a synthetic 'unknown' call key
  3. Check writer version skew and migrate old streams that predate the required call field
  4. When building protos manually, remember call is an optional field and must be explicitly set

Example fix

// before
let ev = pb::LogEventV1 { level, message_preview: ..., ..Default::default() };
// after
let ev = pb::LogEventV1 { call: Some(pb::TraceCallKeyV1{..}), level, message_preview: ..., ..Default::default() };
Defensive patterns

Strategy: validation

Validate before calling

fn log_event_complete(ev: &pb::LogEventV1) -> bool { ev.call.is_some() }

Type guard

fn has_call(ev: &pb::LogEventV1) -> bool { matches!(&ev.call, Some(k) if k.process_id.len() == 16) }

Try / catch

LogEventRecord::try_from(ev).or_else(|e| if e.to_string().contains("omitted call") { attach_unknown_call(ev) } else { Err(e) })

Prevention

When it happens

Trigger: Decoding a LogEventV1 message written without setting the call field — e.g. an old writer version, a producer bug in fire-and-forget logging paths, or a manually constructed proto in tests.

Common situations: Telemetry emitted before a call was registered (race in producer), schema migration where 'call' was newly added, tools that rebuild protos and drop oneof/optional fields.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


AI-assisted analysis of BoundaryML/baml@bd85ce9dee (2026-09-12). Data as JSON: /api/errors/76b1f3ae7542ead1. Report an issue: GitHub.