diff --git a/build.zig.zon b/build.zig.zon index 3f1b09f..983ac74 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -13,8 +13,8 @@ .hash = "websocket-0.1.10-ZPISdUowBQAXIl_X9VpZozIxBLVf_o5wYjOMMdobrXF5", }, .zio = .{ - .url = "https://tangled.org/zzstoatzz.io/zio/archive/385c825.tar.gz", - .hash = "zio-0.0.0-psl_OY50AgAwn7tuMS37El_wwvypd_c4IVq2AninAAFj", + .url = "https://tangled.org/zzstoatzz.io/zio/archive/880de37.tar.gz", + .hash = "zio-0.0.0-psl_OZ58AgBSlB6fxXZfwqRFlPcvrOGTeASVE7e2hVh5", }, .pg = .{ .url = "https://tangled.org/zzstoatzz.io/pg.zig/archive/c5a5607.tar.gz", diff --git a/src/main.zig b/src/main.zig index 32d9f83..34bf5aa 100644 --- a/src/main.zig +++ b/src/main.zig @@ -187,6 +187,8 @@ const MetricsServer = struct { \\zio_dns_spill{{kind="queued"}} {d} \\zio_dns_spill{{kind="workers"}} {d} \\zio_dns_spill{{kind="idle"}} {d} + \\# HELP zio_fiber_starts live fibers by the function they run (leak finder) + \\# TYPE zio_fiber_starts gauge \\ , .{ d.sched.switches, d.sched.live, d.sched.ready, @@ -194,11 +196,20 @@ const MetricsServer = struct { d.sched.inject_pending, d.sched.free_list, d.poller_registrations, d.dns_queued, d.dns_workers, d.dns_idle, }) catch ""; - if (base_body.len + extra.len <= metrics_buf.len) { - @memcpy(metrics_buf[base_body.len..][0..extra.len], extra); - break :blk metrics_buf[0 .. base_body.len + extra.len]; + var total = base_body.len; + if (total + extra.len <= metrics_buf.len) { + @memcpy(metrics_buf[total..][0..extra.len], extra); + total += extra.len; } - break :blk base_body; + var starts_buf: [512]u8 = undefined; + for (d.starts) |sc| { + if (sc.fn_addr == 0) continue; + const line = std.fmt.bufPrint(&starts_buf, "zio_fiber_starts{{fn=\"0x{x}\"}} {d}\n", .{ sc.fn_addr, sc.count }) catch continue; + if (total + line.len > metrics_buf.len) break; + @memcpy(metrics_buf[total..][0..line.len], line); + total += line.len; + } + break :blk metrics_buf[0..total]; } else base_body; request.respond(body, .{ .status = .ok, .keep_alive = false, .extra_headers = &.{