import { describe, expect, test } from "bun:test"; import { configurePerf, countD1, countDo, countDoRows, setPerfReporter, withJobPerf, withPerf } from "./perf"; const HEAVY_UNIT_QUERIES = 30; describe("perf accounting", () => { test("counts the unit's own D1 and object calls and always reports expensive ones", async () => { const events: Array<[string, Record]> = []; setPerfReporter((event, properties) => events.push([event, properties])); configurePerf("0.000001"); await withPerf( () => ({ event: "server_request", properties: { route: "/:owner/:repo" } }), async () => { for (let index = 0; index < HEAVY_UNIT_QUERIES; index++) countD1(1); countDo(2); countDoRows(7, 1); await withJobPerf("nested", async () => countD1(5)); }, ); const request = events.find(([event]) => event === "server_request")?.[1]; expect(request).toMatchObject({ route: "/:owner/:repo", d1_queries: HEAVY_UNIT_QUERIES, do_calls: 1, do_rows_read: 7, do_rows_written: 1, expensive: true, sample_weight: 1, }); }); test("cheap units are sampled with a weight; failures are always reported", async () => { const events: Array> = []; setPerfReporter((_event, properties) => events.push(properties)); configurePerf("1"); await withJobPerf("cheap", async () => undefined); expect(events[0]).toMatchObject({ job: "cheap", expensive: false, sample_weight: 1 }); configurePerf("0.000001"); await withJobPerf("boom", async () => { throw new Error("x"); }).catch(() => undefined); expect(events.at(-1)).toMatchObject({ job: "boom", failed: true }); }); });