upstream: an unnamed connect errno fails over, local-resource exchanges are counted, doh faults carry the http status

This commit is contained in:
2026-10-20 10:11:34 +02:00
parent 2697adfa27
commit 8efe504c51
8 changed files with 191 additions and 15 deletions
+30
View File
@@ -186,6 +186,9 @@ pub const Sample = struct {
/// label and cannot live in `UpstreamSample`. Absent while no pool is
/// wired, like every other collaborator.
upstream_budget_exhausted_total: ?u64 = null,
/// Exchanges the pool ended on this process's own resources. Pool-wide for
/// the same reason as `upstream_budget_exhausted_total`.
upstream_local_resource_total: ?u64 = null,
peaks: PeakSample = .{},
};
@@ -300,6 +303,7 @@ pub fn collect(state: *server.WebState, io: std.Io, arena: Allocator) Allocator.
if (generation.pool) |pool| {
sample.upstreams = try upstreams(pool, io, arena);
sample.upstream_budget_exhausted_total = pool.budgetExhaustedTotal();
sample.upstream_local_resource_total = pool.localResourceTotal();
}
}
@@ -512,6 +516,15 @@ pub fn render(w: *std.Io.Writer, sample: Sample) std.Io.Writer.Error!void {
);
try w.print("nxdns_upstream_budget_exhausted_total {d}\n", .{total});
}
if (sample.upstream_local_resource_total) |total| {
try labeledHead(
w,
"nxdns_upstream_local_resource_total",
"Exchanges this process ended on its own resources (memory, descriptors, an unnamed system error) before any upstream answered.",
"counter",
);
try w.print("nxdns_upstream_local_resource_total {d}\n", .{total});
}
}
fn renderPeaks(w: *std.Io.Writer, peaks: PeakSample) std.Io.Writer.Error!void {
@@ -1788,3 +1801,20 @@ test "the budget-exhausted counter renders pool-wide, without a url label" {
defer testing.allocator.free(absent);
try testing.expect(!std.mem.containsAtLeast(u8, absent, 1, "nxdns_upstream_budget_exhausted_total"));
}
test "the local-resource counter renders pool-wide, without a url label" {
const text = try renderToString(testing.allocator, .{ .upstream_local_resource_total = 4 });
defer testing.allocator.free(text);
try testing.expect(std.mem.containsAtLeast(
u8,
text,
1,
"# TYPE nxdns_upstream_local_resource_total counter\n",
));
try testing.expect(std.mem.containsAtLeast(u8, text, 1, "nxdns_upstream_local_resource_total 4\n"));
const absent = try renderToString(testing.allocator, .{});
defer testing.allocator.free(absent);
try testing.expect(!std.mem.containsAtLeast(u8, absent, 1, "nxdns_upstream_local_resource_total"));
}