aboutsummaryrefslogtreecommitdiff
path: root/src/analytics/analytics_thread.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/analytics/analytics_thread.zig')
-rw-r--r--src/analytics/analytics_thread.zig62
1 files changed, 44 insertions, 18 deletions
diff --git a/src/analytics/analytics_thread.zig b/src/analytics/analytics_thread.zig
index 2f4998c66..5484c3c0f 100644
--- a/src/analytics/analytics_thread.zig
+++ b/src/analytics/analytics_thread.zig
@@ -5,8 +5,8 @@ const std = @import("std");
const HTTPClient = @import("../http_client.zig");
const URL = @import("../query_string_map.zig").URL;
const Fs = @import("../fs.zig");
-const Analytics = @import("./analytics.zig").Analytics;
-const Writer = @import("./analytics.zig").Writer;
+const Analytics = @import("./analytics_schema.zig").analytics;
+const Writer = @import("./analytics_schema.zig").Writer;
const Headers = @import("../javascript/jsc/webcore/response.zig").Headers;
pub const EventName = enum(u8) {
@@ -18,6 +18,7 @@ pub const EventName = enum(u8) {
};
var random: std.rand.DefaultPrng = undefined;
+const DotEnv = @import("../env_loader.zig");
const platform_arch = if (Environment.isAarch64) Analytics.Architecture.arm else Analytics.Architecture.x64;
@@ -83,7 +84,7 @@ pub const GenerateHeader = struct {
pub fn forMac() Analytics.Platform {
std.mem.set(u8, std.mem.span(&osversion_name), 0);
- var platform = Analytics.Platform{ .os = Analytics.OperatingSystem.macos, .version = "", .arch = platform_arch };
+ var platform = Analytics.Platform{ .os = Analytics.OperatingSystem.macos, .version = &[_]u8{}, .arch = platform_arch };
var osversion_name_buf: [2]c_int = undefined;
var osversion_name_ptr = osversion_name.len - 1;
var len = osversion_name.len - 1;
@@ -169,31 +170,51 @@ pub fn enqueue(comptime name: EventName) void {
if (disabled) return;
if (!has_loaded) {
- defer has_loaded = true;
-
- event_queue = EventQueue.init(std.heap.c_allocator);
- spawn() catch |err| {
- if (comptime isDebug) {
- Output.prettyErrorln("[Analytics] error spawning thread {s}", .{@errorName(err)});
- Output.flush();
- }
-
- disabled = true;
- return;
- };
+ if (!start()) return;
}
- _ = event_queue.tryWriteItem(Event.init(name)) catch false;
+ var items = [_]Event{Event.init(name)};
+ _ = event_queue.write(&items) catch false;
+ std.Thread.Futex.wake(&counter, 1);
}
pub var thread: std.Thread = undefined;
+var counter: std.atomic.Atomic(u32) = undefined;
-pub fn spawn() !void {
+fn start() bool {
+ @setCold(true);
+
+ defer has_loaded = true;
+ counter = std.atomic.Atomic(u32).init(0);
+
+ event_queue = EventQueue.init(std.heap.c_allocator);
+ spawn() catch |err| {
+ if (comptime isDebug) {
+ Output.prettyErrorln("[Analytics] error spawning thread {s}", .{@errorName(err)});
+ Output.flush();
+ }
+
+ disabled = true;
+ return false;
+ };
+ return true;
+}
+
+fn spawn() !void {
@setCold(true);
has_loaded = true;
thread = try std.Thread.spawn(.{}, readloop, .{});
}
+const headers_buf: string = "Content-Type binary/peechy";
+const header_entry = Headers.Kv{
+ .name = .{ .offset = 0, .length = @intCast(u32, "Content-Type".len) },
+ .value = .{
+ .offset = std.mem.indexOf(u8, headers_buf, "binary/peechy").?,
+ .length = @intCast(u32, "binary/peechy".len),
+ },
+};
+
fn readloop() anyerror!void {
defer disabled = true;
Output.Source.configureThread();
@@ -201,8 +222,13 @@ fn readloop() anyerror!void {
thread.setName("Analytics") catch {};
var event_list = EventList.init();
+ event_list.client.verbose = FeatureFlags.verbose_analytics;
+ event_list.client.header_entries.append(default_allocator, header_entry) catch unreachable;
+ event_list.client.header_buf = headers_buf;
+
// everybody's random should be random
while (true) {
+ // Wait for the next event by blocking
while (event_queue.tryReadItem() catch null) |item| {
event_list.push(item);
}
@@ -211,7 +237,7 @@ fn readloop() anyerror!void {
event_list.flush();
}
- event_queue.getters.wait(&event_queue.mutex);
+ std.Thread.Futex.wait(&counter, counter.load(.Acquire), null) catch unreachable;
}
}