Skip to content

Commit 0845d88

Browse files
committed
Add search duration metric
1 parent e9c5bf8 commit 0845d88

File tree

3 files changed

+26
-8
lines changed

3 files changed

+26
-8
lines changed

src/IndexReader.zig

-6
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,6 @@ pub fn search(self: *Self, hashes: []const u32, allocator: std.mem.Allocator, de
3939

4040
results.sort();
4141

42-
if (results.count() == 0) {
43-
metrics.searchMiss();
44-
} else {
45-
metrics.searchHit();
46-
}
47-
4842
return results;
4943
}
5044

src/metrics.zig

+17-2
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,19 @@ const std = @import("std");
22
const m = @import("metrics");
33

44
var metrics = m.initializeNoop(Metrics);
5+
var arena: ?std.heap.ArenaAllocator = null;
56

67
const WithIndex = struct { index: []const u8 };
78

9+
const SearchDuration = m.Histogram(
10+
f64,
11+
&.{ 0.005, 0.01, 0.05, 0.1, 0.5, 1, 5, 10 },
12+
);
13+
814
const Metrics = struct {
915
search_hits: m.Counter(u64),
1016
search_misses: m.Counter(u64),
17+
search_duration: SearchDuration,
1118
searches: m.Counter(u64),
1219
updates: m.Counter(u64),
1320
checkpoints: m.Counter(u64),
@@ -28,6 +35,10 @@ pub fn searchMiss() void {
2835
metrics.search_misses.incr();
2936
}
3037

38+
pub fn searchDuration(duration_ms: i64) void {
39+
metrics.search_duration.observe(@as(f64, @floatFromInt(duration_ms)) / 1000.0);
40+
}
41+
3142
pub fn update(count: usize) void {
3243
metrics.updates.incrBy(@intCast(count));
3344
}
@@ -49,20 +60,24 @@ pub fn docs(index_name: []const u8, value: u32) void {
4960
}
5061

5162
pub fn initializeMetrics(allocator: std.mem.Allocator, comptime opts: m.RegistryOpts) !void {
63+
arena = std.heap.ArenaAllocator.init(allocator);
64+
const alloc = arena.?.allocator();
65+
5266
metrics = .{
5367
.search_hits = m.Counter(u64).init("search_hits_total", .{}, opts),
5468
.search_misses = m.Counter(u64).init("search_misses_total", .{}, opts),
69+
.search_duration = SearchDuration.init("search_duration_seconds", .{}, opts),
5570
.searches = m.Counter(u64).init("searches_total", .{}, opts),
5671
.updates = m.Counter(u64).init("updates_total", .{}, opts),
5772
.checkpoints = m.Counter(u64).init("checkpoints_total", .{}, opts),
5873
.memory_segment_merges = m.Counter(u64).init("memory_segment_merges_total", .{}, opts),
5974
.file_segment_merges = m.Counter(u64).init("file_segment_merges_total", .{}, opts),
60-
.docs = try m.GaugeVec(u32, WithIndex).init(allocator, "docs", .{}, opts),
75+
.docs = try m.GaugeVec(u32, WithIndex).init(alloc, "docs", .{}, opts),
6176
};
6277
}
6378

6479
pub fn deinitMetrics() void {
65-
metrics.docs.deinit();
80+
arena.?.deinit();
6681
}
6782

6883
pub fn writeMetrics(writer: anytype) !void {

src/server.zig

+9
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,9 @@ fn getRequestBody(comptime T: type, req: *httpz.Request, res: *httpz.Response) !
288288
}
289289

290290
fn handleSearch(ctx: *Context, req: *httpz.Request, res: *httpz.Response) !void {
291+
const start_time = std.time.milliTimestamp();
292+
defer metrics.searchDuration(std.time.milliTimestamp() - start_time);
293+
291294
const body = try getRequestBody(SearchRequestJSON, req, res) orelse return;
292295

293296
const index = try getIndex(ctx, req, res, true) orelse return;
@@ -306,6 +309,12 @@ fn handleSearch(ctx: *Context, req: *httpz.Request, res: *httpz.Response) !void
306309

307310
const results = try index.search(body.query, req.arena, deadline);
308311

312+
if (results.count() == 0) {
313+
metrics.searchMiss();
314+
} else {
315+
metrics.searchHit();
316+
}
317+
309318
var results_json = SearchResultsJSON{
310319
.results = try req.arena.alloc(SearchResultJSON, results.count()),
311320
};

0 commit comments

Comments
 (0)