fix(telemetry): guard PostHog init failures

This commit is contained in:
YeonGyu-Kim
2026-04-14 02:50:46 +09:00
parent 3419bbc4a5
commit b525055590
2 changed files with 68 additions and 5 deletions
+57
View File
@@ -0,0 +1,57 @@
import { afterEach, describe, expect, it, mock } from "bun:test"
async function importPostHogModule(): Promise<typeof import("./posthog")> {
return import(`./posthog?test=${Date.now()}-${Math.random()}`)
}
describe("posthog client creation", () => {
afterEach(() => {
mock.restore()
delete process.env.OMO_DISABLE_POSTHOG
delete process.env.OMO_SEND_ANONYMOUS_TELEMETRY
delete process.env.POSTHOG_API_KEY
delete process.env.POSTHOG_HOST
})
it("returns a no-op client when PostHog construction throws", async () => {
// given
process.env.OMO_DISABLE_POSTHOG = "0"
process.env.OMO_SEND_ANONYMOUS_TELEMETRY = "1"
process.env.POSTHOG_API_KEY = "test-api-key"
mock.module("posthog-node", () => ({
PostHog: class {
constructor() {
throw new Error("posthog init failed")
}
},
}))
const { createCliPostHog, createPluginPostHog } = await importPostHogModule()
// when
const cliPostHog = createCliPostHog()
const pluginPostHog = createPluginPostHog()
// then
expect(() =>
cliPostHog.capture({
distinctId: "cli",
event: "run_started",
}),
).not.toThrow()
expect(() => cliPostHog.captureException(new Error("cli failure"), "cli")).not.toThrow()
expect(() => cliPostHog.trackActive("cli", "run_started")).not.toThrow()
await expect(cliPostHog.shutdown()).resolves.toBeUndefined()
expect(() =>
pluginPostHog.capture({
distinctId: "plugin",
event: "plugin_loaded",
}),
).not.toThrow()
expect(() => pluginPostHog.captureException(new Error("plugin failure"), "plugin")).not.toThrow()
expect(() => pluginPostHog.trackActive("plugin", "plugin_loaded")).not.toThrow()
await expect(pluginPostHog.shutdown()).resolves.toBeUndefined()
})
})
+11 -5
View File
@@ -87,11 +87,17 @@ function createPostHogClient(
return NO_OP_POSTHOG
}
const configuredClient = new PostHog(getPostHogApiKey(), {
...options,
host: getPostHogHost(),
disableGeoip: false,
})
let configuredClient: PostHog
try {
configuredClient = new PostHog(getPostHogApiKey(), {
...options,
host: getPostHogHost(),
disableGeoip: false,
})
} catch {
return NO_OP_POSTHOG
}
const sharedProperties = getSharedProperties(source)
return {