milestone 28: query provenance — every logged query is exactly explainable
Gates / frontend (push) Successful in 1m36s
Gates / test (push) Successful in 1m56s
Gates / test-aarch64 (push) Successful in 7m37s
Gates / package (push) Successful in 9m12s
Gates / container (push) Successful in 13s
CI / gates (push) Successful in 19m4s
Gates / frontend (push) Successful in 1m36s
Gates / test (push) Successful in 1m56s
Gates / test-aarch64 (push) Successful in 7m37s
Gates / package (push) Successful in 9m12s
Gates / container (push) Successful in 13s
CI / gates (push) Successful in 19m4s
query rows gain qclass, rcode, group, policy action and reason, the matched rule or list entry with its source, cname and safe-search targets, route kind, forward zone, and the resolver that actually answered — the pool and local markers die. servfails are logged and name the resolver that lost; post-parse protocol refusals become rows. a detail page at /queries/:id renders the ordered explanation, and coverage watermarks distinguish an empty history from a missing one. the schema fingerprint changes: existing query history is recreated with the old file kept aside and the reset filed as a resolved diagnostic. fixes an oversized udp reply being rebuilt as noerror, which handed clients a truncated nxdomain as success.
This commit is contained in:
@@ -33,6 +33,7 @@ const handler = @import("handler.zig");
|
||||
const header = @import("../dns/header.zig");
|
||||
const local_tables = @import("local_tables.zig");
|
||||
const logger_mod = @import("../storage/logger.zig");
|
||||
const provenance = @import("../storage/provenance.zig");
|
||||
const manager = @import("../filter/manager.zig");
|
||||
const matcher = @import("../filter/matcher.zig");
|
||||
const migrations = @import("../storage/migrations.zig");
|
||||
@@ -183,8 +184,10 @@ const FakeUpstream = struct {
|
||||
io: std.Io,
|
||||
query: []const u8,
|
||||
response_buf: []u8,
|
||||
selected: *?[]const u8,
|
||||
) transport.ExchangeError![]u8 {
|
||||
_ = io;
|
||||
selected.* = "fake://phase7-upstream";
|
||||
const self: *FakeUpstream = @ptrCast(@alignCast(ptr));
|
||||
_ = self.calls.fetchAdd(1, .monotonic);
|
||||
|
||||
@@ -346,7 +349,8 @@ test "S7 case 1: a blocked domain is answered with the zero address and logged"
|
||||
try testing.expectEqual(@as(usize, 1), logged.len);
|
||||
try testing.expectEqual(true, logged[0].blocked);
|
||||
try testing.expectEqualStrings("ads.example.com", logged[0].domain());
|
||||
try testing.expectEqualStrings("rule_block_exact", logged[0].blockReason());
|
||||
try testing.expectEqual(provenance.PolicyAction.block, logged[0].policy_action);
|
||||
try testing.expectEqual(provenance.PolicyReason.rule_block_exact, logged[0].policy_reason);
|
||||
try testing.expectEqualStrings("127.0.0.1", logged[0].clientIp());
|
||||
}
|
||||
|
||||
@@ -593,7 +597,7 @@ test "S7 case 5: a cached answer comes back with a fresh id, an aged ttl and a l
|
||||
const logged = drainLog(&lg, io, &entries);
|
||||
try testing.expectEqual(@as(usize, 3), logged.len);
|
||||
try testing.expectEqual(@as(?bool, false), logged[0].cache_hit);
|
||||
try testing.expectEqualStrings("pool", logged[0].upstream());
|
||||
try testing.expectEqualStrings("fake://phase7-upstream", logged[0].upstream());
|
||||
try testing.expectEqual(@as(?bool, true), logged[1].cache_hit);
|
||||
try testing.expectEqualStrings("", logged[1].upstream());
|
||||
try testing.expectEqual(@as(?bool, true), logged[2].cache_hit);
|
||||
@@ -651,7 +655,9 @@ test "S7 case 6: a cname into a blocked target blocks the original question" {
|
||||
const logged = drainLog(&lg, io, &entries);
|
||||
try testing.expectEqual(@as(usize, 1), logged.len);
|
||||
try testing.expectEqual(true, logged[0].blocked);
|
||||
try testing.expectEqualStrings("cname:rule_block_exact", logged[0].blockReason());
|
||||
// The reason describes the target's own decision; milestone 28 S3 adds the
|
||||
// target name that says a CNAME chain was followed.
|
||||
try testing.expectEqual(provenance.PolicyReason.rule_block_exact, logged[0].policy_reason);
|
||||
try testing.expectEqualStrings("cdn.example.com", logged[0].domain());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user