Skip to content

feat(sdk): add SDK aliases and separate AI usage metrics - #93911

Merged
trunk-io[bot] merged 21 commits into
masterfrom
sdk/kmp-usage-report
Sep 4, 2026
Merged

feat(sdk): add SDK aliases and separate AI usage metrics#93911
trunk-io[bot] merged 21 commits into
masterfrom
sdk/kmp-usage-report

Conversation

@marandaneto

@marandaneto marandaneto commented Sep 3, 2026

Copy link
Copy Markdown
Member

Problem

SDK maintainers cannot distinguish several SDKs, aliases, and language-specific PostHog AI integrations in usage reports.

Feature flag analytics also classified newer package-specific SDK identifiers as unknown.

Changes

  • Usage reports now expose separate KMP, Node MCP, and Python MCP event counts.
  • OpenCode events now have a separate sub-SDK count and no longer inflate the general Node count.
  • Python and .NET PostHog AI events now use language-specific metrics instead of the Node PostHog AI metric.
  • posthog-rails contributes to the existing Ruby metric.
  • posthog-aspnetcore contributes to the existing .NET and .NET PostHog AI metrics.
  • The sub-SDK query groups by $lib and $ai_lib, then subtracts each sub-SDK from its correct parent SDK.
  • Both the Celery and Temporal report paths expose the new metrics.
  • Feature flag analytics now recognize KMP, Unity, Node MCP, Python MCP, Edge, Convex, Rails, and ASP.NET Core request identities.
  • The Rust and Python feature flag registries now contain the same identifiers, including posthog-server.

How did you test this code?

  • Extended usage classification and sub-SDK coverage for every new metric and alias.
  • Ran TestQueryUsageReportSQL and the Temporal usage-report query registry tests.
  • Ran the targeted feature flag Rust parser, library, runtime, and client-label tests.
  • Ran Rust formatting and Clippy for the feature flags crate.
  • Ran Ruff lint, Ruff formatting, hogli ci:preflight --fix, and the repository-wide mypy check.
  • A static parity check matched all 24 Python SDK names against Rust Library::as_str() values.
  • Database-backed coverage could not run because the local Postgres hostname was unavailable.
  • Updated the affected query snapshots mechanically.

Automatic notifications

  • Publish to changelog?

Docs update

None. This adds internal usage-report and feature flag analytics classification.

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

Skills: writing-tests, writing-dataclasses, writing-code-comments, writing-pr-descriptions, writing-ui-components, debugging-ci-failures, fixing-flaky-tests, and running-ci-preflight.

Pi implemented and validated the change under human direction. No customer or private source material was used.

@marandaneto marandaneto self-assigned this Sep 3, 2026
@trunk-io

trunk-io Bot commented Sep 3, 2026

Copy link
Copy Markdown

😎 Merged successfully - details.

@marandaneto
marandaneto marked this pull request as ready for review September 3, 2026 06:33
@marandaneto
marandaneto requested review from a team September 3, 2026 06:33
@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

🤖 CI report

⚠️ Trunk lane — backend Python lane

This PR is assigned to the backend Python lane. It runs backend Python tests and may merge in parallel with PRs in other lanes.

Complexity (TypeScript) — clean

Cyclomatic complexity above the limit in changed typescript files (10 for production files, 15 for test files). Warn only: worth simplifying when you next touch these functions.

⚠️ Bundle size — 🔺 +19 B (+0.0%)

Uncompressed size of every built .js bundle, compared against the base branch.

Total: 68.38 MiB · 🔺 +19 B (+0.0%)

No file changed by more than 1000 B.

Posted automatically by build-bundle-size-report · uncompressed bytes from dist-report

Eager graph — within budget

How much code each root ships on the eager path — downloaded and parsed before the surface is interactive. Measured from the esbuild output chunks (post-tree-shake, static imports only); lazy import() / React.lazy chunks are not counted.

Root Eager (shipped) Δ vs base Budget
entry (logged-out pages, app bootstrap)
src/index.tsx
1.45 MiB · 22 files no change ███░░░░░░░ 32.3% of 4.51 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
8.88 MiB · 3,265 files no change █████████░ 91.4% of 9.71 MiB

🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx

Largest files eagerly shipped from src/index.tsx
Size File
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
24.6 KiB ../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js
6.3 KiB ../node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js
4.5 KiB ../node_modules/.pnpm/@jspm+core@2.1.0/node_modules/@jspm/core/nodelibs/browser/process.js
3.9 KiB ../node_modules/.pnpm/scheduler@0.23.2/node_modules/scheduler/cjs/scheduler.production.min.js
1.4 KiB ../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js
1.3 KiB src/RootErrorBoundary.tsx
912 B ../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js
789 B src/scenes/ChunkLoadErrorBoundary.tsx
762 B src/index.tsx
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
Size File
307.0 KiB ../node_modules/.pnpm/posthog-js@1.422.5_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/rrweb.js
267.7 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
263.5 KiB ../node_modules/.pnpm/posthog-js@1.422.5_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.js
255.1 KiB src/taxonomy/core-filter-definitions-by-group.json
154.2 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
104.5 KiB src/lib/api.ts
95.8 KiB ../packages/quill/packages/quill/dist/index.js
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
90.6 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js

Posted automatically by check-eager-graph · sizes are eager output bytes (shipped, post-tree-shake) from the esbuild metafile · part of #32479

Toolbar bundle — eager 2.27 MiB within budget

What the toolbar ships to customer pages, measured from the esbuild output (minified, post-tree-shake). The eager set is the entry plus everything statically imported from it — fetched before any feature runs; deferred chunks load lazily. The eager guardrail is 5.72 MiB. Each output file must also stay below 10 MB, where CloudFront stops compressing it. The module boundary is enforced separately by check-toolbar-graph.

Metric Size Δ vs base Budget
Eager (shipped)
entry + static imports
2.27 MiB · 18 files no change ████░░░░░░ 39.6% of 5.72 MiB
Deferred (lazy) 2.11 MiB · 45 files no change n/a — loads on demand
Loader dist/toolbar.js 1.1 KiB no change █░░░░░░░░░ 5.8% of 19.5 KiB
Largest eagerly-shipped chunks
Size File
754.1 KiB dist/toolbar/toolbar-app-YBL7L6MV.css
590.5 KiB dist/toolbar/chunk-chunk-CQHMOG33.js
484.7 KiB dist/toolbar/chunk-chunk-RFL5H2T4.js
135.6 KiB dist/toolbar/chunk-chunk-XEL6EY25.js
131.8 KiB dist/toolbar/chunk-chunk-FDH2IBXT.js
71.3 KiB dist/toolbar/toolbar-app-BFD7RWNC.js
69.0 KiB dist/toolbar/chunk-chunk-TSAL54PB.js
35.6 KiB dist/toolbar/chunk-chunk-SGFE3VEH.js
21.0 KiB dist/toolbar/chunk-chunk-7WCJ3CHT.js
6.8 KiB dist/toolbar/chunk-chunk-DV7IWQNF.js

Posted automatically by check-toolbar-size · sizes are toolbar output bytes (shipped, post-tree-shake) from the esbuild metafile

Dist folder size — 🔺 +205 B (+0.0%)

Total size of the built frontend/dist folder (all assets), compared against the base branch.

Total: 1459.57 MiB · 🔺 +205 B (+0.0%)

⚠️ Playwright — 1 flaky

🎭 Playwright report · View test results →

⚠️ 1 flaky test:

  • Can create a new dashboard with an insight (chromium)

These issues are not necessarily caused by your changes.
Annoyed by this section? Help fix flakies and failures and it will go green!

@greptile-apps

greptile-apps Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Reviews (1): Last reviewed commit: "feat(sdk): add KMP usage reporting" | Re-trigger Greptile

@marandaneto marandaneto changed the title feat(sdk): add KMP usage reporting feat(sdk): add KMP and Node MCP usage reporting Sep 3, 2026
@trunk-io

trunk-io Bot commented Sep 3, 2026

Copy link
Copy Markdown

Static BadgeStatic BadgeStatic Badge

Failed Test Failure Summary Logs
edits and deletes a check from Data Ops The test failed because an expected element was not visible or could not be found within the timeout period. Logs ↗︎

View Full Report ↗︎Docs

@marandaneto marandaneto changed the title feat(sdk): add KMP and Node MCP usage reporting feat(sdk): add KMP, Node MCP, and OpenCode usage reporting Sep 3, 2026
@marandaneto marandaneto changed the title feat(sdk): add KMP, Node MCP, and OpenCode usage reporting feat(sdk): add KMP, Node MCP, OpenCode, and Python AI reporting Sep 3, 2026
@marandaneto

Copy link
Copy Markdown
Member Author

needs PostHog/posthog-python#917 but not a blocker, metrics will be zeroed until merged and thats fine

@marandaneto marandaneto changed the title feat(sdk): add KMP, Node MCP, OpenCode, and Python AI reporting feat(sdk): add SDK aliases and separate AI usage metrics Sep 3, 2026

@pawel-cebula pawel-cebula left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Usage report side looks good - haven't reviewed the flags part.

@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

🦔 Hogbox preview · ❌ build failed

The preview didn't come up for commit ba1e5aa. See the build log for the failing step. It'll retry on the next push.

Previews are optional and never block merging. A failure here is often a hogland or tailnet hiccup rather than anything in your PR, so the check stays green and this comment is the status.

@marandaneto
marandaneto requested a review from a team September 3, 2026 12:23
@posthog-project-board-bot posthog-project-board-bot Bot moved this to In Review in Feature Flags Sep 3, 2026
@github-project-automation github-project-automation Bot moved this from In Review to Approved in Feature Flags Sep 3, 2026
Comment on lines +271 to +279
jest.useFakeTimers()
try {
jest.setSystemTime(new Date('2026-08-28T12:00:00Z'))
logic.actions.loadScoutRunsSuccess([
makeRun({ skill_name: 'signals-scout-busy', emitted_report_ids: ['r-1'] }),
])
} finally {
jest.useRealTimers()
}

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not related but its flaky in this pr

@dustinbyrne dustinbyrne left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

seems likely that SDK health (formerly SDK doctor) would need updating as well

@arnohillen

Copy link
Copy Markdown
Contributor

posthog/tasks/usage_report.py:958 adds posthog-node-mcp but has no posthog-python-mcp entry, while PostHog/posthog-python#917 sends exactly that $lib from posthog/mcp/constants.py:36, so once both land MCP-instrumented Python events drop out of the per-SDK breakdown instead of counting as python_events.

# Conflicts:
#	products/product_analytics/frontend/insights/trends/shared/magnitudeAxisIds.ts
#	products/signals/frontend/inbox/logics/scoutFleetLogic.test.ts
@marandaneto

Copy link
Copy Markdown
Member Author

seems likely that SDK health (formerly SDK doctor) would need updating as well

can do a follow up

@marandaneto

Copy link
Copy Markdown
Member Author

Fixed in 0e60ae2. Python MCP now has a dedicated usage metric in both report paths and stays separate from Python SDK usage.

@marandaneto

Copy link
Copy Markdown
Member Author

Updated in 33418fe. Both posthog-dotnet and posthog-aspnetcore with $ai_lib = posthog-ai now sum into posthog_dotnet_ai_events_count_in_period.

@trunk-io
trunk-io Bot merged commit b36fc48 into master Sep 4, 2026
263 of 267 checks passed
@trunk-io
trunk-io Bot deleted the sdk/kmp-usage-report branch September 4, 2026 14:09
@github-project-automation github-project-automation Bot moved this from Approved to Done in Feature Flags Sep 4, 2026
@deployment-status-posthog

deployment-status-posthog Bot commented Sep 4, 2026

Copy link
Copy Markdown

Deploy status

Environment Status Deployed At Workflow
dev ✅ Deployed 2026-09-04 14:39 UTC Run
prod-us ✅ Deployed 2026-09-04 14:57 UTC Run
prod-eu ✅ Deployed 2026-09-04 14:57 UTC Run

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

6 participants