{transaction,span}.duration.us is unset if {transaction,span}.duration exists
{
"script": {
"if": "ctx[ctx.processor.event]?.duration == null",
"source": """def eventDuration = ctx.event?.duration ?: 0;
def rootObjectName = ctx.processor?.event;
def rootObject = ctx[rootObjectName];
if (rootObject == null) {
rootObject = [:];
ctx[rootObjectName] = rootObject;
}
rootObject.duration = ["us": (long)(eventDuration/1000)];
"""
}
}
The if condition here is too strict that it forbids any other fields under {transaction,span}.duration. By default we should never set {transaction,span}.duration, but it is still possible via ingest pipelines.
Do we know why duration is not set or in which cases we expect it not to be set? Setting it to 0 make sense (no duration = 0 duration), but is it expected to not be present in the document at all? I'm wondering if there is a bug somewhere else and this is a symptom.
Great question. I've update the description to mention user ingest pipelines.
We should probably move away from *.duration.us to event.duration. See https://github.com/elastic/apm-server/issues/5999