Add sampled command telemetry#13191
Merged
Merged
Conversation
Contributor
There was a problem hiding this comment.
Pull request overview
Introduces best-effort, pseudoanonymous client-side telemetry for gh command invocations (sampled), with support for logging payloads locally and a hidden subprocess-based sender.
Changes:
- Add a telemetry service (
internal/telemetry) with device ID persistence, common dimensions, sampling, and subprocess flushing. - Instrument Cobra commands to record command path + set flags, with opt-outs for sensitive/irrelevant commands.
- Add hidden
gh send-telemetrycommand and Twirp client/server bindings, plus config/env plumbing and acceptance coverage.
Show a summary per file
| File | Description |
|---|---|
| pkg/cmdutil/telemetry.go | Adds Cobra RunE instrumentation to record command invocation telemetry. |
| pkg/cmdutil/telemetry_test.go | Unit tests for command instrumentation behavior (flags, sorting, disabled commands). |
| pkg/cmd/version/version.go | Switches version to RunE to work with telemetry instrumentation. |
| pkg/cmd/send-telemetry/send_telemetry.go | Adds hidden send-telemetry command that posts payload batches to the telemetry endpoint. |
| pkg/cmd/send-telemetry/send_telemetry_test.go | Unit tests for send-telemetry option parsing and request formation. |
| pkg/cmd/root/root.go | Wires telemetry recorder into root command subcommands; registers send-telemetry command. |
| pkg/cmd/root/help_topic.go | Documents telemetry-related environment variables in help topics. |
| pkg/cmd/root/help_test.go | Updates root construction in tests to pass a no-op telemetry service. |
| pkg/cmd/root/extension_registration_test.go | Updates root construction in tests to pass a no-op telemetry service. |
| pkg/cmd/root/extension.go | Disables telemetry for extensions and uses cmdutil.DisableAuthCheck. |
| pkg/cmd/config/list/list_test.go | Updates config list expectations to include telemetry setting. |
| pkg/cmd/completion/completion.go | Disables telemetry for completion generation command. |
| pkg/cmd/auth/auth.go | Disables telemetry for auth subcommands. |
| internal/telemetry/telemetry.go | Implements telemetry service, sampling, payload building, and detached subprocess flush. |
| internal/telemetry/telemetry_test.go | Comprehensive tests for device ID persistence, state parsing, flush behavior, and sampling. |
| internal/telemetry/fake.go | Test spy for recording telemetry events. |
| internal/telemetry/detach_unix.go | Unix process detachment implementation for telemetry subprocess. |
| internal/telemetry/detach_windows.go | Windows process detachment implementation for telemetry subprocess. |
| internal/ghcmd/cmd.go | Creates telemetry service based on env/config and injects it into root command creation. |
| internal/gh/ghtelemetry/telemetry.go | Defines shared telemetry interfaces and event types used across packages. |
| internal/gh/gh.go | Extends gh.Config interface with Telemetry() accessor. |
| internal/gh/mock/config.go | Extends config mock to support Telemetry() calls. |
| internal/config/config.go | Adds telemetry config key, accessor, and config option registration. |
| internal/config/config_test.go | Tests telemetry config defaulting and user-provided values. |
| internal/config/stub.go | Wires stub config mock to underlying telemetry config implementation. |
| internal/barista/observability/telemetry.pb.go | Adds generated protobuf types for telemetry ingestion API. |
| internal/barista/observability/telemetry.twirp.go | Adds generated Twirp client/server bindings for telemetry ingestion API. |
| cmd/gen-docs/main.go | Updates docs generator to pass a no-op telemetry service to root. |
| acceptance/acceptance_test.go | Adds telemetry acceptance test suite + disables telemetry by default in shared setup. |
| acceptance/testdata/telemetry/command-invocation.txtar | Acceptance coverage for log-mode command invocation event output. |
| acceptance/testdata/telemetry/no-telemetry-for-completion.txtar | Ensures completion command does not emit telemetry. |
| acceptance/testdata/telemetry/no-telemetry-for-extension.txtar | Ensures extensions do not emit telemetry. |
| acceptance/testdata/telemetry/no-telemetry-for-send-telemetry.txtar | Ensures the sender command does not emit telemetry. |
| acceptance/testdata/telemetry/telemetry-failure-does-not-break-command.txtar | Ensures unreachable endpoint does not break command execution. |
| go.mod | Adds direct dependencies for uuid + twirp used by telemetry implementation. |
| go.sum | Adds checksum entries for new dependencies. |
| Makefile | Adds lint phony target. |
| .gitignore | Ignores test coverage output artifacts. |
Copilot's findings
Tip
Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Files reviewed: 36/38 changed files
- Comments generated: 5
BagToad
approved these changes
Apr 16, 2026
ef7f77f to
89a7951
Compare
89a7951 to
e83eb09
Compare
2a84595 to
be6af56
Compare
babakks
approved these changes
Apr 17, 2026
- Harden SpawnSendTelemetry against relative executable paths - Use io.Copy for telemetry subprocess stdin write - Clean up GH_TELEMETRY/DO_NOT_TRACK help text - Fall back to built-in defaults (NoOp telemetry) on config load failure Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
be6af56 to
17776ca
Compare
tmeijn
pushed a commit
to tmeijn/dotfiles
that referenced
this pull request
May 8, 2026
This MR contains the following updates: | Package | Update | Change | |---|---|---| | [cli/cli](https://github.com/cli/cli) | minor | `v2.90.0` → `v2.92.0` | MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot). **Proposed changes to behavior should be submitted there as MRs.** --- ### Release Notes <details> <summary>cli/cli (cli/cli)</summary> ### [`v2.92.0`](https://github.com/cli/cli/releases/tag/v2.92.0): GitHub CLI 2.92.0 [Compare Source](cli/cli@v2.91.0...v2.92.0) #### Support GitHub Enterprise Cloud (GHEC) in `skill` commandset Now `gh skill` subcommands (`install`, `preview`, `publish`, `search`, `update`) are able to work with [GHEC](https://docs.github.com/en/enterprise-cloud@latest/admin/overview/about-github-enterprise-cloud) hosts with data residency. #### Add `--allow-hidden-dirs` flag to `skill preview` Following the addition of `--allow-hidden-dirs` to `skill install` in the previous release, now the flag is also supported in `skill preview`, allowing users to preview skills located in hidden (dot-prefixed) directories such as `.claude/skills/`, `.agents/skills/`, and `.github/skills/`. #### What's Changed ##### ✨ Features - feat(skills): add --allow-hidden-dirs flag to preview command by [@​SamMorrowDrums](https://github.com/SamMorrowDrums) in [#​13265](cli/cli#13265) - feat(skills): support GHEC with data residency hosts by [@​SamMorrowDrums](https://github.com/SamMorrowDrums) in [#​13264](cli/cli#13264) ##### 🐛 Fixes - Fix SetSampleRate not updating sample\_rate dimension by [@​williammartin](https://github.com/williammartin) in [#​13259](cli/cli#13259) - Fix log terminal injection by [@​williammartin](https://github.com/williammartin) in [#​13272](cli/cli#13272) - Add "Resource not accessible" to ProjectsV2IgnorableError by [@​maxbeizer](https://github.com/maxbeizer) in [#​13281](cli/cli#13281) ##### 📚 Docs & Chores - fix: using variable interpolation \`${{ in deployment.yml... by [@​orbisai0security](https://github.com/orbisai0security) in [#​13258](cli/cli#13258) - docs: correct typo in Linux Homebrew copy by [@​cassidyjames](https://github.com/cassidyjames) in [#​13273](cli/cli#13273) - Install skills flat by Name, not namespaced InstallName by [@​SamMorrowDrums](https://github.com/SamMorrowDrums) in [#​13266](cli/cli#13266) - chore: fix zsh completion on debian by [@​babakks](https://github.com/babakks) in [#​13274](cli/cli#13274) - Add trust disclaimer to extension help text by [@​travellertales](https://github.com/travellertales) in [#​13296](cli/cli#13296) - Bump Go to 1.26.2 by [@​github-actions](https://github.com/github-actions)\[bot] in [#​13301](cli/cli#13301) #####Dependencies - chore(deps): bump github.com/mattn/go-isatty from 0.0.20 to 0.0.21 by [@​dependabot](https://github.com/dependabot)\[bot] in [#​13161](cli/cli#13161) - chore(deps): bump github.com/google/go-containerregistry from 0.21.4 to 0.21.5 by [@​dependabot](https://github.com/dependabot)\[bot] in [#​13162](cli/cli#13162) - chore(deps): bump charm.land/lipgloss/v2 from 2.0.2 to 2.0.3 by [@​dependabot](https://github.com/dependabot)\[bot] in [#​13163](cli/cli#13163) - chore(deps): bump charm.land/bubbletea/v2 from 2.0.2 to 2.0.6 by [@​dependabot](https://github.com/dependabot)\[bot] in [#​13206](cli/cli#13206) - chore(deps): bump github.com/gdamore/tcell/v2 from 2.13.8 to 2.13.9 by [@​dependabot](https://github.com/dependabot)\[bot] in [#​13241](cli/cli#13241) - chore(deps): bump github.com/mattn/go-isatty from 0.0.21 to 0.0.22 by [@​dependabot](https://github.com/dependabot)\[bot] in [#​13298](cli/cli#13298) #### New Contributors - [@​orbisai0security](https://github.com/orbisai0security) made their first contribution in [#​13258](cli/cli#13258) - [@​cassidyjames](https://github.com/cassidyjames) made their first contribution in [#​13273](cli/cli#13273) - [@​travellertales](https://github.com/travellertales) made their first contribution in [#​13296](cli/cli#13296) **Full Changelog**: <cli/cli@v2.91.0...v2.92.0> ### [`v2.91.0`](https://github.com/cli/cli/releases/tag/v2.91.0): GitHub CLI 2.91.0 [Compare Source](cli/cli@v2.90.0...v2.91.0) #### GitHub CLI now collects pseudonymous telemetry To better understand how features are used in practice, especially as agentic adoption grows, GitHub CLI now sends pseudonymous telemetry. See [Telemetry](https://cli.github.com/telemetry) for more details on what's collected, why, and how to opt out. #### Support more agents in `gh skill` Thanks to community feedback, `gh` now supports a large number of agent hosts. Run `gh skill install --help` for the list of available agents. #### Improve skill discovery `gh skill install` now adds the `--allow-hidden-dirs` flag to support discovering skills in hidden (dot-prefixed) directories such as `.claude/skills/`, `.agents/skills/`, and `.github/skills/`. #### Detect skills re-published from other sources GitHut CLI now detects if the skill to be installed is re-published from an upstream source and offers the option to install it from there. The `--upstream` flag is also added for non-interactive use cases. #### What's Changed ##### ✨ Features - Add support for installation in multiple agent hosts in `gh skills install` by [@​tommaso-moro](https://github.com/tommaso-moro) in [#​13209](cli/cli#13209) - Add --allow-hidden-dirs flag to gh skill install by [@​SamMorrowDrums](https://github.com/SamMorrowDrums) in [#​13213](cli/cli#13213) - Make skill discovery less strict: support nested `skills/` directories by [@​SamMorrowDrums](https://github.com/SamMorrowDrums) in [#​13235](cli/cli#13235) - feat(skills): detect re-published skills and offer upstream install by [@​SamMorrowDrums](https://github.com/SamMorrowDrums) in [#​13236](cli/cli#13236) ##### 🐛 Fixes - Fix `skills publish --fix` to not publish by [@​SamMorrowDrums](https://github.com/SamMorrowDrums) in [#​13237](cli/cli#13237) - fix(skills): match skills by install name in preview command by [@​SamMorrowDrums](https://github.com/SamMorrowDrums) in [#​13249](cli/cli#13249) ##### 📚 Docs & Chores - Remove misleading text by [@​tommaso-moro](https://github.com/tommaso-moro) in [#​13203](cli/cli#13203) - Add sampled command telemetry by [@​williammartin](https://github.com/williammartin) in [#​13191](cli/cli#13191) - Do not send telemetry for aliases by [@​williammartin](https://github.com/williammartin) in [#​13192](cli/cli#13192) - Add skills specific telemetry by [@​williammartin](https://github.com/williammartin) in [#​13204](cli/cli#13204) - Record CI context in telemetry by [@​williammartin](https://github.com/williammartin) in [#​13210](cli/cli#13210) - Record official extension telemetry by [@​williammartin](https://github.com/williammartin) in [#​13205](cli/cli#13205) - Add telemetry command by [@​williammartin](https://github.com/williammartin) in [#​13253](cli/cli#13253) - Log when there is no telemetry by [@​williammartin](https://github.com/williammartin) in [#​13255](cli/cli#13255) - docs(skills): add gh and gh-skill agent skills by [@​BagToad](https://github.com/BagToad) in [#​13244](cli/cli#13244) - Enable telemetry without env var by [@​williammartin](https://github.com/williammartin) in [#​13254](cli/cli#13254) **Full Changelog**: <cli/cli@v2.90.0...v2.91.0> </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this MR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box --- This MR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNjkuNCIsInVwZGF0ZWRJblZlciI6IjQzLjE2OS40IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiLCJhdXRvbWF0aW9uOmJvdC1hdXRob3JlZCIsImRlcGVuZGVuY3ktdHlwZTo6bWlub3IiXX0=-->
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
As per upcoming docs update, changelog and release notes, we're going to start collecting pseudoanonymous client side telemetry. Agents love
gh, and we're experiencing massive growth in usage. We need more insight into usage to make better, faster decisions.Telemetry can be viewed on stderr without being sent by setting
GH_TELEMETRY=logorgh config set telemetry log. It can be disabled usingGH_TELEMETRY=false,DO_NOT_TRACK=trueorgh config set telemetry disabled.The telemetry is best-effort, spawning a detached subprocess at the end of an invocation. It sampled at
1%across all commands.This PR requires
GH_PRIVATE_ENABLE_TELEMETRYto be set for any telemetry to be sent. This is because we need to communicate through other channels before turning it on.