A SpaceTraders Agent

track request stats

altagos.dev 960c034f ca95640c

verified
+40 -2
+40 -2
src/st/http.zig
··· 198 198 199 199 http: HTTPClient, 200 200 201 + // Stats 202 + total_requests: std.atomic.Value(u64) = .init(0), 203 + successful_requests: std.atomic.Value(u64) = .init(0), 204 + total_latency: std.atomic.Value(u64) = .init(0), 205 + average_latency: std.atomic.Value(u64) = .init(0), 206 + 201 207 pub fn init( 202 208 allocator: std.mem.Allocator, 203 209 io: std.Io, ··· 274 280 275 281 log.debug("requesting: {s}", .{uri.path.percent_encoded}); 276 282 283 + const start: ?Io.Timestamp = Io.Clock.now(.real, client.io) catch null; 284 + 277 285 switch (opts.body) { 278 286 .empty => try req.sendBodiless(), 279 287 .buffer => |body| try req.sendBodyComplete(body), ··· 289 297 break :blk "\x1b[1m\x1b[91m"; 290 298 } 291 299 }; 300 + 301 + _ = client.total_requests.fetchAdd(1, .seq_cst); 302 + 303 + if (start) |s| blk: { 304 + const latency: u64 = @intCast(s.durationTo(Io.Clock.now(.real, client.io) catch break :blk).toMilliseconds()); 305 + const old_average = client.average_latency.load(.seq_cst); 306 + var new_average: u64 = 0; 307 + 308 + if (old_average == 0) { 309 + new_average = latency; 310 + } else { 311 + const total_reqs = client.total_requests.load(.seq_cst); 312 + new_average = old_average * (total_reqs - 1) / total_reqs + latency / total_reqs; 313 + } 314 + 315 + client.average_latency.store(new_average, .seq_cst); 316 + _ = client.total_latency.fetchAdd(latency, .seq_cst); 317 + 318 + log.debug("latency: {} ms - average: {}ms", .{ latency, new_average }); 319 + } 320 + 292 321 log.debug( 293 322 "\x1b[2m[path = {s}]\x1b[0m received {s}{d} {s}\x1b[0m", 294 323 .{ url[client.base_url.len..], colour, response.head.status, response.head.reason }, ··· 308 337 var json_reader: json.Reader = .init(client.allocator, decompressed_body_reader); 309 338 defer json_reader.deinit(); 310 339 311 - return json.parseFromTokenSource(T, client.allocator, &json_reader, .{ 340 + const result = json.parseFromTokenSource(T, client.allocator, &json_reader, .{ 312 341 .ignore_unknown_fields = true, 313 342 }) catch |err| { 314 - log.err("Error parsing response: {}", .{err}); 343 + const body_reader = response.readerDecompressing(&transfer_buffer, &decompress, &decompress_buffer); 344 + const body = body_reader.allocRemaining(client.allocator, .unlimited) catch return error.InvalidResponse; 345 + defer client.allocator.free(body); 346 + 347 + log.err("Error parsing response: {} - Body:\n{s}", .{ err, body }); 348 + 315 349 return RequestError.InvalidResponse; 316 350 }; 351 + 352 + _ = client.successful_requests.fetchAdd(1, .seq_cst); 353 + 354 + return result; 317 355 } 318 356 };