Wide Event Logger

Naseebullah Ahmadi  Senior Software Engineer, London

A tiny `createEvent(name, seed)` that accumulates fields over the life of a request via `.set()` and emits exactly one structured log line via `.emit()`, so a request that touches ten steps still produces one row instead of ten.

4 min read
#tooling

Most services log once per step, which means debugging one request means reassembling it from several unrelated lines. Building a single event object across the request's lifetime and logging it once, a "wide event" or canonical log line, means every field anyone set along the way lands on the same row.

@itsnas checkout.ts
codecheckout.ts
async function checkout(req: Request) {
  // @src/code/wide-event
  const event = createEvent('checkout', { requestId: req.id })
 
  try {
    const cart = await getCart(req.body.cartId)
    event.set({ userId: req.userId, cartId: cart.id, cartTotal: cart.total })
 
    const order = await placeOrder(cart)
    event.set({ orderId: order.id, outcome: 'success' })
 
    return json(200, { orderId: order.id })
  } catch (error) {
    event.set({
      outcome: 'error',
      errorType: error instanceof Error ? error.constructor.name : 'unknown',
    })
    throw error
  } finally {
    event.emit()
  }
}
main
Nas (@itsnas)