resolveAtEdge

Snapshot everything that must be sampled at the moment the line was logged onto event, for a queueing capture edge to hand to the drain.

This is the one call a capture edge makes, and it MUST run synchronously on the thread/coroutine that logged. It resolves all three emit-time-sensitive inputs:

Returns null when the event carries nothing to export — the edge should then drop it rather than queue it. That is either because capture would drop it anyway (below CaptureConfig.minLevel, or one of the exporter's own loggers — so the mapper is never paid for a line that produces no record), or because the configured CaptureConfig.attributeMapper threw. A throwing mapper drops just that record and never propagates into the application's logging call, exactly as it did when the mapper still ran on the drain behind the appender's best-effort guard.