## Changes
This PR adds a synchronous telemetry logger for the CLI with a max
timeout of 3 seconds. Due to the 3-second timeout configuration, this is
only meant to be used in long-running commands.
This is a short-term solution. Eventually, we'd like to transition to a
daemon process to upload the telemetry logs to amortise the costs of
configuring authentication and maintaining a warm pool of HTTP
connections, as well as a better UX for the end user.
Note that users can set the `DATABRICKS_CLI_DISABLE_TELEMETRY`
environment variable to disable telemetry collection.
## Why
To collect telemetry, which was previously inaccessible to us, and
answer questions like which templates customers like to use and which
DABs features would be safe to deprecate.
## Tests
Unit and acceptance tests.
Also manually verified that the telemetry upload works:
```
(artifact-playground) ➜ cli git:(sync-logger) cli selftest send-telemetry --debug
15:58:20 Info: start pid=40386 version=0.0.0-dev+a2825ca89a23 args="cli, selftest, send-telemetry, --debug"
15:58:20 Debug: Loading DEFAULT profile from /Users/shreyas.goenka/.databrickscfg pid=40386 sdk=true
15:58:20 Info: completed execution pid=40386 exit_code=0
15:58:21 Debug: POST /telemetry-ext
> {
> "items": null,
> "protoLogs": [
> "{\"frontend_log_event_id\":\"82d29b3a-d5ff-48f3-8a21-dae6e08d2999\",\"entry\":{\"databricks_cli_log\":{\"... (232 more bytes)",
> "{\"frontend_log_event_id\":\"d6be8220-7db8-45d9-97d6-4c09c25e2664\",\"entry\":{\"databricks_cli_log\":{\"... (232 more bytes)"
> ],
> "uploadTime": 1741186700967
> }
< HTTP/2.0 200 OK
< {
< "errors": null,
< "numProtoSuccess": 2,
< "numSuccess": 0
< } pid=40386 sdk=true
```
## Changes
- New library to patch existing whl with dynamic version. The version is
based on mtime of original wheel.
- New hidden command "selftest patchwhl" (for acceptance test).
## Why
Part of the project to deprecate dynamic version in setup.py template
(#1034). This would enable switching default-python to pyproject.toml
without dependency on setuptools-specific sections.
The dynamic version is needed to ensure that wheels are picked up by the
users code when doing development.
## Tests
- New unit tests that use uv to create envs on various versions and
install (and re-install) patched wheels there.
- New acceptance test that patches prebuilt whl and records the result
fully unzipped.
- New acceptance test helper setmtime.py to set mtime with nanosecond
precision cross-platform.