Skip to content

Commit fbcd8cc

Browse files
committed
flatten events, include aarch + os, remove eid
1 parent 12cad8a commit fbcd8cc

File tree

6 files changed

+76
-78
lines changed

6 files changed

+76
-78
lines changed

src/app.zig

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,26 @@ const Loop = @import("jsruntime").Loop;
44
const Allocator = std.mem.Allocator;
55
const Telemetry = @import("telemetry/telemetry.zig").Telemetry;
66

7+
pub const RunMode = enum {
8+
serve,
9+
fetch,
10+
};
11+
712
// Container for global state / objects that various parts of the system
813
// might need.
914
pub const App = struct {
1015
loop: *Loop,
1116
allocator: Allocator,
1217
telemetry: Telemetry,
1318

14-
pub fn init(allocator: Allocator) !App {
19+
pub fn init(allocator: Allocator, run_mode: RunMode) !App {
1520
const loop = try allocator.create(Loop);
1621
errdefer allocator.destroy(loop);
1722

1823
loop.* = try Loop.init(allocator);
1924
errdefer loop.deinit();
2025

21-
const telemetry = Telemetry.init(allocator, loop);
26+
const telemetry = Telemetry.init(allocator, loop, run_mode);
2227
errdefer telemetry.deinit();
2328

2429
return .{

src/cdp/testing.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ const TestContext = struct {
168168

169169
pub fn context() TestContext {
170170
return .{
171-
.app = App.init(std.testing.allocator) catch unreachable,
171+
.app = App.init(std.testing.allocator, .serve) catch unreachable,
172172
.arena = std.heap.ArenaAllocator.init(std.testing.allocator),
173173
};
174174
}

src/main.zig

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,9 @@ pub fn main() !void {
7070
return args.printUsageAndExit(false);
7171
};
7272

73-
var app = try @import("app.zig").App.init(alloc);
73+
var app = try @import("app.zig").App.init(alloc, .serve);
7474
defer app.deinit();
75-
app.telemetry.record(.{ .run = .{ .mode = .serve, .version = version } });
75+
app.telemetry.record(.{ .run = {} });
7676

7777
const timeout = std.time.ns_per_s * @as(u64, opts.timeout);
7878
server.run(&app, address, timeout) catch |err| {
@@ -83,9 +83,9 @@ pub fn main() !void {
8383
.fetch => |opts| {
8484
log.debug("Fetch mode: url {s}, dump {any}", .{ opts.url, opts.dump });
8585

86-
var app = try @import("app.zig").App.init(alloc);
86+
var app = try @import("app.zig").App.init(alloc, .fetch);
8787
defer app.deinit();
88-
app.telemetry.record(.{ .run = .{ .mode = .fetch, .version = version } });
88+
app.telemetry.record(.{ .run = {} });
8989

9090
// vm
9191
const vm = jsruntime.VM.init();

src/telemetry/lightpanda.zig

Lines changed: 43 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@ const ArenAallocator = std.heap.ArenaAllocator;
44

55
const Loop = @import("jsruntime").Loop;
66
const Client = @import("asyncio").Client;
7+
const Event = @import("telemetry.zig").Event;
8+
const RunMode = @import("../app.zig").RunMode;
79

810
const log = std.log.scoped(.telemetry);
911

10-
const URL = "https://httpbin.io/post";
12+
const DATA_VERSION = 1;
13+
const URL = "https://1df7a24e33.endpoints.dev";
1114

1215
pub const LightPanda = struct {
1316
uri: std.Uri,
@@ -34,15 +37,15 @@ pub const LightPanda = struct {
3437
self.client_context_pool.deinit();
3538
}
3639

37-
pub fn send(self: *LightPanda, iid: ?[]const u8, eid: []const u8, event: anytype) !void {
40+
pub fn send(self: *LightPanda, iid: ?[]const u8, run_mode: RunMode, event: *const Event) !void {
3841
var arena = std.heap.ArenaAllocator.init(self.allocator);
3942
errdefer arena.deinit();
4043

4144
const resp_header_buffer = try arena.allocator().alloc(u8, 4096);
42-
const body = try std.json.stringifyAlloc(arena.allocator(), .{
45+
const body = try std.json.stringifyAlloc(arena.allocator(), EventWrap{
4346
.iid = iid,
44-
.eid = eid,
4547
.event = event,
48+
.run_mode = run_mode,
4649
}, .{});
4750

4851
const sending = try self.sending_pool.create();
@@ -159,38 +162,39 @@ const Sending = struct {
159162
}
160163
};
161164

162-
// // wraps a telemetry event so that we can serialize it to plausible's event endpoint
163-
// const EventWrap = struct {
164-
// iid: ?[]const u8,
165-
// eid: []const u8,
166-
// event: *const Event,
167-
168-
// pub fn jsonStringify(self: *const EventWrap, jws: anytype) !void {
169-
// try jws.beginObject();
170-
// try jws.objectField("iid");
171-
// try jws.write(self.iid);
172-
// try jws.objectField("eid");
173-
// try jws.write(self.eid);
174-
// try jws.objectField("event");
175-
// try jws.write(@tagName(self.event.*));
176-
// try jws.objectField("props");
177-
// switch (self.event) {
178-
// inline else => |props| try jws.write(props),
179-
// }
180-
// try jws.endObject();
181-
// }
182-
// };
183-
184-
// const testing = std.testing;
185-
// test "telemetry: lightpanda json event" {
186-
// const json = try std.json.stringifyAlloc(testing.allocator, EventWrap{
187-
// .iid = "1234",
188-
// .eid = "abc!",
189-
// .event = .{ .run = .{ .mode = .serve, .version = "over 9000!" } }
190-
// }, .{});
191-
// defer testing.allocator.free(json);
192-
193-
// try testing.expectEqualStrings(
194-
// \\{"event":"run","iid""1234","eid":"abc!","props":{"version":"over 9000!","mode":"serve"}}
195-
// , json);
196-
// }
165+
// wraps a telemetry event so that we can serialize it to plausible's event endpoint
166+
const EventWrap = struct {
167+
iid: ?[]const u8,
168+
event: *const Event,
169+
run_mode: RunMode,
170+
171+
const builtin = @import("builtin");
172+
const build_info = @import("build_info");
173+
174+
pub fn jsonStringify(self: *const EventWrap, jws: anytype) !void {
175+
try jws.beginObject();
176+
try jws.objectField("iid");
177+
try jws.write(self.iid);
178+
try jws.objectField("event");
179+
try jws.write(@tagName(self.event.*));
180+
try jws.objectField("mode");
181+
try jws.write(self.run_mode);
182+
try jws.objectField("version");
183+
try jws.write(DATA_VERSION);
184+
try jws.objectField("os");
185+
try jws.write(builtin.os.tag);
186+
try jws.objectField("version");
187+
try jws.write(build_info.git_commit);
188+
try jws.objectField("arch");
189+
try jws.write(builtin.cpu.arch);
190+
switch (self.event.*) {
191+
.run => {},
192+
.navigate => {},
193+
.flag => |f| {
194+
try jws.objectField("flag");
195+
try jws.write(f);
196+
},
197+
}
198+
try jws.endObject();
199+
}
200+
};

src/telemetry/telemetry.zig

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const Allocator = std.mem.Allocator;
55

66
const Loop = @import("jsruntime").Loop;
77
const uuidv4 = @import("../id.zig").uuidv4;
8+
const RunMode = @import("../app.zig").RunMode;
89

910
const log = std.log.scoped(.telemetry);
1011
const ID_FILE = "lightpanda.id";
@@ -20,24 +21,21 @@ fn TelemetryT(comptime P: type) type {
2021
// null on IO error
2122
iid: ?[36]u8,
2223

23-
// a "execution" id is an id that represents this specific run
24-
eid: [36]u8,
2524
provider: P,
2625

2726
disabled: bool,
2827

28+
run_mode: RunMode,
29+
2930
const Self = @This();
3031

31-
pub fn init(allocator: Allocator, loop: *Loop) Self {
32+
pub fn init(allocator: Allocator, loop: *Loop, run_mode: RunMode) Self {
3233
const disabled = std.process.hasEnvVarConstant("LIGHTPANDA_DISABLE_TELEMETRY");
3334

34-
var eid: [36]u8 = undefined;
35-
uuidv4(&eid);
36-
3735
return .{
38-
.iid = if (disabled) null else getOrCreateId(),
39-
.eid = eid,
4036
.disabled = disabled,
37+
.run_mode = run_mode,
38+
.iid = if (disabled) null else getOrCreateId(),
4139
.provider = try P.init(allocator, loop),
4240
};
4341
}
@@ -51,7 +49,7 @@ fn TelemetryT(comptime P: type) type {
5149
return;
5250
}
5351
const iid: ?[]const u8 = if (self.iid) |*iid| iid else null;
54-
self.provider.send(iid, &self.eid, &event) catch |err| {
52+
self.provider.send(iid, self.run_mode, &event) catch |err| {
5553
log.warn("failed to record event: {}", .{err});
5654
};
5755
}
@@ -83,31 +81,22 @@ fn getOrCreateId() ?[36]u8 {
8381
}
8482

8583
pub const Event = union(enum) {
86-
run: Run,
84+
run: void,
8785
navigate: void,
8886
flag: []const u8, // used for testing
89-
90-
const Run = struct {
91-
version: []const u8,
92-
mode: RunMode,
93-
94-
const RunMode = enum {
95-
fetch,
96-
serve,
97-
};
98-
};
9987
};
10088

10189
const NoopProvider = struct {
10290
fn init(_: Allocator, _: *Loop) !NoopProvider {
10391
return .{};
10492
}
10593
fn deinit(_: NoopProvider) void {}
106-
pub fn send(_: NoopProvider, _: ?[]const u8, _: []const u8, _: anytype) !void {}
94+
pub fn send(_: NoopProvider, _: ?[]const u8, _: RunMode, _: *const Event) !void {}
10795
};
10896

10997
extern fn setenv(name: [*:0]u8, value: [*:0]u8, override: c_int) c_int;
11098
extern fn unsetenv(name: [*:0]u8) c_int;
99+
111100
const testing = std.testing;
112101
test "telemetry: disabled by environment" {
113102
_ = setenv(@constCast("LIGHTPANDA_DISABLE_TELEMETRY"), @constCast(""), 0);
@@ -118,14 +107,14 @@ test "telemetry: disabled by environment" {
118107
return .{};
119108
}
120109
fn deinit(_: @This()) void {}
121-
pub fn send(_: @This(), _: ?[]const u8, _: []const u8, _: anytype) !void {
110+
pub fn send(_: @This(), _: ?[]const u8, _: RunMode, _: *const Event) !void {
122111
unreachable;
123112
}
124113
};
125114

126-
var telemetry = TelemetryT(FailingProvider).init(testing.allocator, undefined);
115+
var telemetry = TelemetryT(FailingProvider).init(testing.allocator, undefined, .serve);
127116
defer telemetry.deinit();
128-
telemetry.record(.{ .run = .{ .mode = .serve, .version = "123" } });
117+
telemetry.record(.{ .run = {} });
129118
}
130119

131120
test "telemetry: getOrCreateId" {
@@ -146,7 +135,7 @@ test "telemetry: sends event to provider" {
146135
defer std.fs.cwd().deleteFile(ID_FILE) catch {};
147136
std.fs.cwd().deleteFile(ID_FILE) catch {};
148137

149-
var telemetry = TelemetryT(MockProvider).init(testing.allocator, undefined);
138+
var telemetry = TelemetryT(MockProvider).init(testing.allocator, undefined, .serve);
150139
defer telemetry.deinit();
151140
const mock = &telemetry.provider;
152141

@@ -162,29 +151,29 @@ test "telemetry: sends event to provider" {
162151

163152
const MockProvider = struct {
164153
iid: ?[]const u8,
165-
eid: ?[]const u8,
154+
run_mode: ?RunMode,
166155
allocator: Allocator,
167156
events: std.ArrayListUnmanaged(Event),
168157

169158
fn init(allocator: Allocator, _: *Loop) !@This() {
170159
return .{
171160
.iid = null,
172-
.eid = null,
161+
.run_mode = null,
173162
.events = .{},
174163
.allocator = allocator,
175164
};
176165
}
177166
fn deinit(self: *MockProvider) void {
178167
self.events.deinit(self.allocator);
179168
}
180-
pub fn send(self: *MockProvider, iid: ?[]const u8, eid: []const u8, events: *const Event) !void {
169+
pub fn send(self: *MockProvider, iid: ?[]const u8, run_mode: RunMode, events: *const Event) !void {
181170
if (self.iid == null) {
182-
try testing.expectEqual(null, self.eid);
171+
try testing.expectEqual(null, self.run_mode);
183172
self.iid = iid.?;
184-
self.eid = eid;
173+
self.run_mode = run_mode;
185174
} else {
186175
try testing.expectEqualStrings(self.iid.?, iid.?);
187-
try testing.expectEqualStrings(self.eid.?, eid);
176+
try testing.expectEqual(self.run_mode.?, run_mode);
188177
}
189178
try self.events.append(self.allocator, events.*);
190179
}

src/unit_tests.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ pub fn main() !void {
4545
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
4646
const allocator = gpa.allocator();
4747

48-
var app = try App.init(allocator);
48+
var app = try App.init(allocator, .serve);
4949
defer app.deinit();
5050

5151
const env = Env.init(allocator);

0 commit comments

Comments
 (0)