fix(telemetry): dedupe plugin_loaded event to once per UTC day

The plugin_loaded event was emitted on every plugin reload, generating
high event volume on PostHog (proportional to opencode restarts per
user per day). With MAU > 60K and active power users restarting
frequently, this drove unnecessary event spend.

Add a separate daily dedup state field (lastPluginLoadedDayUTC) so the
plugin_loaded capture only fires once per UTC day per machine. The
existing daily activity dedup (lastActiveDayUTC, used by
omo_daily_active) is preserved as an independent gate so the two
dimensions cannot overwrite each other in the activity state file.
This commit is contained in:
YeonGyu-Kim
2026-04-28 15:01:40 +09:00
parent 58e4b8f519
commit 669e0667be
4 changed files with 207 additions and 11 deletions
+27 -1
View File
@@ -8,6 +8,7 @@ import { writeFileAtomically } from "./write-file-atomically"
type PostHogActivityState = {
lastActiveDayUTC?: string
lastPluginLoadedDayUTC?: string
}
type PostHogActivityCaptureState = {
@@ -15,6 +16,11 @@ type PostHogActivityCaptureState = {
captureDaily: boolean
}
type PluginLoadedCaptureState = {
dayUTC: string
capturePluginLoaded: boolean
}
const POSTHOG_ACTIVITY_STATE_FILE = "posthog-activity.json"
function getPostHogActivityStateFilePath(): string {
@@ -73,7 +79,8 @@ export function getPostHogActivityCaptureState(now: Date = new Date()): PostHogA
if (captureDaily) {
writePostHogActivityState({
lastActiveDayUTC: captureDaily ? dayUTC : state.lastActiveDayUTC,
...state,
lastActiveDayUTC: dayUTC,
})
}
@@ -82,3 +89,22 @@ export function getPostHogActivityCaptureState(now: Date = new Date()): PostHogA
captureDaily,
}
}
export function getPluginLoadedCaptureState(now: Date = new Date()): PluginLoadedCaptureState {
const state = readPostHogActivityState()
const dayUTC = getUtcDayString(now)
const capturePluginLoaded = state.lastPluginLoadedDayUTC !== dayUTC
if (capturePluginLoaded) {
writePostHogActivityState({
...state,
lastPluginLoadedDayUTC: dayUTC,
})
}
return {
dayUTC,
capturePluginLoaded,
}
}