// examples/observability_kit — runnable demonstration of the
// `src/infra_metrics` direction as a service-latency dashboard: record
// request latencies into an HDR histogram, read tail percentiles, merge
// per-shard DDSketches with bounded relative error, and profile a request
// with a span tracer (total vs self time).
//
// Run with:
//   moon run examples/observability_kit

///|
fn main {
  println("=== 1. HDR histogram latency percentiles ===")
  let hdr = @metrics.HdrHistogram::new(3)
  // simulate 1000 requests: mostly fast, a slow tail
  for i in 0..<1000 {
    let latency = if i % 100 == 0 {
      (900 + i / 10).to_int64() // 1% slow outliers
    } else {
      (10 + i % 40).to_int64() // 10-49 ms steady state
    }
    hdr.record(latency)
  }
  println("count : \{hdr.count()}, max: \{hdr.max_value()} ms")
  for p in [50.0, 90.0, 99.0, 99.9] {
    match hdr.value_at_percentile(p) {
      Some(v) => println("p\{p} : \{v} ms")
      None => println("p\{p} : n/a")
    }
  }
  println("")
  println("=== 2. mergeable DDSketch across shards ===")
  let shard_a = @metrics.DDSketch::new(0.01)
  let shard_b = @metrics.DDSketch::new(0.01)
  for i in 0..<500 {
    shard_a.add(10.0 + (i % 50).to_double())
    shard_b.add(200.0 + (i % 300).to_double())
  }
  shard_a.merge_with(shard_b)
  println(
    "merged count : \{shard_a.count()} (error bound \{shard_a.error_bound()})",
  )
  match shard_a.quantile(0.5) {
    Some(q) => println("merged p50   : \{q}")
    None => println("merged p50   : n/a")
  }
  match shard_a.quantile(0.99) {
    Some(q) => println("merged p99   : \{q}")
    None => println("merged p99   : n/a")
  }
  println("")
  println("=== 3. span tracer: total vs self time ===")
  let tracer = @metrics.SpanTracer::new()
  let root = tracer.start("handle_request", 0)
  let _db = tracer.start("db_query", 10)
  let _ = tracer.end(60) // db_query: 50ms
  let _render = tracer.start("render", 65)
  let _ = tracer.end(90) // render: 25ms
  let _ = tracer.end(100) // handle_request: 100ms total
  println("finished spans: \{tracer.finished_count()}")
  for name in tracer.stat_names() {
    match tracer.stat(name) {
      Some((calls, total, self_time)) =>
        println(
          "\{name}: calls=\{calls}, total=\{total}ms, self=\{self_time}ms",
        )
      None => ()
    }
  }
  let children = tracer.children_of(root)
  println("root has \{children.length()} child spans")
}