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
- Fix the producer to always set call (a valid TraceCallKeyV1) before emitting LogEventV1
- At ingest, either drop events lacking a call or attach them to a synthetic 'unknown' call key
- Check writer version skew and migrate old streams that predate the required call field
- 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
- Construct LogEventV1 only after the trace call key is available
- Make 'call' a required-by-contract field with a producer-side assert
- Drop or quarantine call-less events at ingest
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
- body record omitted log metadata
- value metadata omitted codec
- value metadata omitted availability
- original size does not fit usize
- retained size does not fit usize
AI-assisted analysis of BoundaryML/baml@bd85ce9dee (2026-09-12).
Data as JSON: /api/errors/76b1f3ae7542ead1.
Report an issue: GitHub.