Skip to content

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

Open
marandaneto wants to merge 17 commits into
masterfrom
sdk/kmp-usage-report
Open

feat(sdk): add SDK aliases and separate AI usage metrics#93911
marandaneto wants to merge 17 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 and Node 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 metric.
  • 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)

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

❌ This pull request could not start testing because there was a merge conflict. See more details here.

  • To merge this pull request, check the box to the left or comment /trunk merge below.

After your PR is submitted to the merge queue, this comment will be automatically updated with its status. If the PR fails, failure details will also be posted here

@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 failed

🎭 Playwright report · View test results →

1 failed test:

  • edits and deletes a check from Data Ops (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

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

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

Labels

None yet

Projects

Status: Approved

Development

Successfully merging this pull request may close these issues.

5 participants