authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-06-30 18:44:57 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-06-30 18:44:57 -07:00
logb40045e5dd6e7c9e7c0f173d33b0b878ebf55c2b
treed0e52b86636ce65532cc36d0945796072e9c8d80
parent04c3ad0fbdfb57dea27da0c8cbb75e2539837c92
signaturebadge-check Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

disable if traces_endpoint isn't passed


1 files changed, 6 insertions(+), 4 deletions(-)

src/otel.zig+6-4
...@@ -51,7 +51,7 @@ pub fn deinit() void {...@@ -51,7 +51,7 @@ pub fn deinit() void {
51}51}
5252
53threadlocal var allocator: std.mem.Allocator = undefined;53threadlocal var allocator: std.mem.Allocator = undefined;
54threadlocal var traces_endpoint: std.Uri = undefined;54threadlocal var traces_endpoint: ?std.Uri = null;
55pub threadlocal var trace_id: [16]u8 = undefined;55pub threadlocal var trace_id: [16]u8 = undefined;
56threadlocal var prev_span_id: ?[8]u8 = undefined;56threadlocal var prev_span_id: ?[8]u8 = undefined;
57threadlocal var spans: std.ArrayListUnmanaged([]const u8) = .empty;57threadlocal var spans: std.ArrayListUnmanaged([]const u8) = .empty;
...@@ -66,7 +66,7 @@ pub threadlocal var @"http.route": ?[]const u8 = null;...@@ -66,7 +66,7 @@ pub threadlocal var @"http.route": ?[]const u8 = null;
66pub threadlocal var @"url.path": ?[]const u8 = null;66pub threadlocal var @"url.path": ?[]const u8 = null;
67pub threadlocal var @"url.query": ?[]const u8 = null;67pub threadlocal var @"url.query": ?[]const u8 = null;
6868
69pub fn init_thread(args: struct { std.mem.Allocator, std.Uri }) !void {69pub fn init_thread(args: struct { std.mem.Allocator, ?std.Uri }) !void {
70 allocator, traces_endpoint = args;70 allocator, traces_endpoint = args;
71 trace_id = nio.randomBytes(16);71 trace_id = nio.randomBytes(16);
72 prev_span_id = null;72 prev_span_id = null;
...@@ -77,6 +77,7 @@ pub fn deinit_thread() void {...@@ -77,6 +77,7 @@ pub fn deinit_thread() void {
77 spans.clearAndFree(allocator);77 spans.clearAndFree(allocator);
78}78}
79fn deinit_thread_inner() !void {79fn deinit_thread_inner() !void {
80 if (traces_endpoint == null) return;
80 var instrumentation_scope: nio.AllocatingWriter = .init(allocator);81 var instrumentation_scope: nio.AllocatingWriter = .init(allocator);
81 defer instrumentation_scope.deinit();82 defer instrumentation_scope.deinit();
82 {83 {
...@@ -142,7 +143,7 @@ fn deinit_thread_inner() !void {...@@ -142,7 +143,7 @@ fn deinit_thread_inner() !void {
142 const io = root.io;143 const io = root.io;
143 var client: std.http.Client = .{ .allocator = allocator, .io = io };144 var client: std.http.Client = .{ .allocator = allocator, .io = io };
144 defer client.deinit();145 defer client.deinit();
145 var req = try client.request(.POST, traces_endpoint, .{146 var req = try client.request(.POST, traces_endpoint.?, .{
146 .headers = .{147 .headers = .{
147 .content_type = .{ .override = "application/x-protobuf" },148 .content_type = .{ .override = "application/x-protobuf" },
148 },149 },
...@@ -161,7 +162,7 @@ pub fn trace_begin(src: std.builtin.SourceLocation, comptime ifmt: []const u8, i...@@ -161,7 +162,7 @@ pub fn trace_begin(src: std.builtin.SourceLocation, comptime ifmt: []const u8, i
161 prev_span_id = span_id;162 prev_span_id = span_id;
162 const fmt = "{s}:{d}:{d} ({s})" ++ ifmt;163 const fmt = "{s}:{d}:{d} ({s})" ++ ifmt;
163 const args = .{ src.file, src.line, src.column, src.fn_name } ++ iargs;164 const args = .{ src.file, src.line, src.column, src.fn_name } ++ iargs;
164 const name = std.fmt.allocPrint(allocator, fmt, args) catch "";165 const name = if (traces_endpoint == null) "" else std.fmt.allocPrint(allocator, fmt, args) catch "";
165 const time_start_ns: u64 = @intCast(time.nanoTimestamp()); // this will overflow 2554 July 21 23:34:33.709 Z166 const time_start_ns: u64 = @intCast(time.nanoTimestamp()); // this will overflow 2554 July 21 23:34:33.709 Z
166167
167 return .{168 return .{
...@@ -177,6 +178,7 @@ pub fn trace_end(ctx: tracer.Ctx) void {...@@ -177,6 +178,7 @@ pub fn trace_end(ctx: tracer.Ctx) void {
177 prev_span_id = ctx.data.parent_id;178 prev_span_id = ctx.data.parent_id;
178}179}
179fn trace_end_inner(ctx: tracer.Ctx) !void {180fn trace_end_inner(ctx: tracer.Ctx) !void {
181 if (traces_endpoint == null) return;
180 var temp: nio.AllocatingWriter = .init(allocator);182 var temp: nio.AllocatingWriter = .init(allocator);
181 const w = &temp;183 const w = &temp;
182 defer if (ctx.data.name.len > 0) allocator.free(ctx.data.name);184 defer if (ctx.data.name.len > 0) allocator.free(ctx.data.name);