// Generated by moonp8s metrics from orders.mbt. Edit those files, not this one.

///|
let orders_total : @moonp8s.Counter = @moonp8s.Counter::new()

///|
let orders_refused_total : @moonp8s.Counter = @moonp8s.Counter::new()

///|
let order_seconds : @moonp8s.Histogram = try {
  @moonp8s.Histogram::new(buckets=[0.5, 1.0, 5.0])
} catch{
  _ => abort("order_seconds")
}

///|
fn register_metrics(registry : @moonp8s.Registry) -> Unit raise @metric.Refused {
  registry.register("orders_total", "Orders asked for.", orders_total)
  registry.register(
    "orders_refused_total",
    "Orders refused.",
    orders_refused_total,
  )
  registry.register(
    "order_seconds",
    "Seconds to place an order.",
    order_seconds,
  )
}

///|
fn place_metered(item : String, now~ : () -> Double) -> Int32 raise Sold {
  let started = now()
  try {
    orders_total.inc()
  } catch{
    _ => ()
  }
  errdefer {
    try {
      orders_refused_total.inc()
    } catch{
      _ => ()
    }
    order_seconds.observe(now() - started)
  }
  let result = place(item)
  order_seconds.observe(now() - started)
  result
}