kubo/test/cli
Hector Sanjuan 4255cc3889
feat: telemetry plugin (#10866)
* Initial pass at Telemetry plugin

Currently, IP Shipyard, with the help of Probelab, monitor and extract
Amino/IPFS public network metrics with the use of DHT crawlers and
bootstrappers (via peerlog plugin). For example, we log all peer IDs seen and
their AgentVersion/Addresses obtained from the `identify` protocol, which
provides insights into protocol usage, total number of peers etc.

We would like to increase the ability to obtain more insights from the network
by collecting some more information in the future, but also to give users more
control over this collection (i.e. opt-out). The information collected will
not allow unique identification of anyone and is only used for aggregation.

Now, this PR explores a way of moving in this direction:

* A new "telemetry" fx plugin is in charge of dealing with telemetry
* The FX plugin allows to plug and make decisions / take actions during the setup phase:
  * We can inspect whether we are using Private Networks before the libp2p.Host has been initialized.
  * We can send telemetry after the libp2p Host is initialized.
  * Everything is self-contained. Custom builds can remove the plugin altogether without needing to surgically edit the code.

As for behaviour:

* The user can opt-in/out via EnvVar, file in the repo path or plugin configuration.
* Users on private networks or with custom bootstrappers are detected, offered a wall of text explaining why we need telemetry and invited to opt-in. Opt-out happens otherwise on a timeout (with no input). Their preferences are stored.
* Users on standard settings are opted-in by default. This is the status quo in Kubo already, except they don't get a chance to opt out.

The telemetry libp2p protocol is yet to be defined, but expect something similar to identify, with a protobuf being pushed to bootstrappers or to a specific telemetry node that we define. In the case of pnets, this will be done with a temporary peer.

* checkpoint

* telemetry plugin: second pass

* On first run it generates a UUID and shows a message to the user.
* UUID is persistend to "telemetry_uuid"
* Sends telemetry 1 minute after boot and every 24h
* LogEvent is the thing containing all the telemetry that is sent
* Opt-out possible via env-var or plugin configuration

* Telemetry: add changelog and environment variable documentation

* docs: improved daemon message

making it more obvious nothing was sent yet
and that user had 15m to out-out

plus some debug logs that confirm opt-out

* refactor: rename IPFS_TELEMETRY_MODE to IPFS_TELEMETRY

* fix: add User-Agent header to telemetry requests

---------

Co-authored-by: Andrew Gillis <11790789+gammazero@users.noreply.github.com>
Co-authored-by: Marcin Rataj <lidel@lidel.org>
2025-08-18 20:46:05 +02:00
..
fixtures feat(ipns): records with V2-only signatures (#9932) 2023-06-20 14:24:31 +02:00
harness fix: Provide according to Reprovider.Strategy (#10886) 2025-08-08 10:56:44 +02:00
testutils chore: replace random test utils with equivalents in go-test/random (#10915) 2025-08-14 10:37:55 -07:00
add_test.go feat(add): add support for naming pinned CIDs (#10877) 2025-08-06 02:16:16 +02:00
backup_bootstrap_test.go feat(bootstrap): save connected peers as backup bootstrap peers (#8856) 2023-05-25 14:39:49 +02:00
basic_commands_test.go Upgrade to go1.24 (#10726) 2025-02-24 14:46:20 -08:00
bitswap_config_test.go chore: replace random test utils with equivalents in go-test/random (#10915) 2025-08-14 10:37:55 -07:00
cid_test.go fix(cmd): exit 1 on error (#10903) 2025-08-08 17:25:05 -07:00
cli_https_test.go fix(cli): support HTTPS in ipfs --api (#10659) 2025-01-10 22:34:56 +01:00
commands_without_repo_test.go fix: ipfs cid without repo (#10897) 2025-08-08 16:39:34 +02:00
completion_test.go feat: add zsh completions (#10040) 2023-08-17 16:43:27 +02:00
content_blocking_test.go fix typos in docs and comments (#10920) 2025-08-18 08:43:25 -07:00
content_routing_http_test.go chore: replace random test utils with equivalents in go-test/random (#10915) 2025-08-14 10:37:55 -07:00
daemon_test.go refactor: remove goprocess (#10872) 2025-08-06 00:33:45 +02:00
dag_test.go docs: fix some typos (#10377) 2024-03-25 09:59:47 +01:00
delegated_routing_v1_http_client_test.go feat(gateway): expose /routing/v1 server (opt-in) (#9877) 2023-08-25 17:30:04 +02:00
delegated_routing_v1_http_proxy_test.go chore: replace random test utils with equivalents in go-test/random (#10915) 2025-08-14 10:37:55 -07:00
delegated_routing_v1_http_server_test.go feat: Better self-service commands for DHT providing (#10677) 2025-01-31 16:33:11 +01:00
dht_autoclient_test.go chore: replace random test utils with equivalents in go-test/random (#10915) 2025-08-14 10:37:55 -07:00
dht_opt_prov_test.go chore: replace random test utils with equivalents in go-test/random (#10915) 2025-08-14 10:37:55 -07:00
files_test.go Nonfunctional (#10753) 2025-03-11 14:04:16 -07:00
fuse_test.go refactor: remove goprocess (#10872) 2025-08-06 00:33:45 +02:00
gateway_limits_test.go feat(config): Gateway.RetrievalTimeout|MaxConcurrentRequests (#10905) 2025-08-15 02:36:33 +02:00
gateway_range_test.go feat(gateway): update gateway api, no multi-range support 2023-10-02 16:43:52 +02:00
gateway_test.go chore: use go-log/v2 (#10801) 2025-05-19 13:04:05 -07:00
http_gateway_over_libp2p_test.go chore: update dependencies (#10462)(#10466) 2024-07-30 16:42:18 +02:00
http_retrieval_client_test.go chore: replace random test utils with equivalents in go-test/random (#10915) 2025-08-14 10:37:55 -07:00
init_test.go style: gofumpt and godot [skip changelog] (#10081) 2023-08-17 14:02:08 +02:00
log_level_test.go feat: add query functionality to log level command (#10885) 2025-08-11 12:43:48 -07:00
must.go test: port remote pinning tests to Go (#9720) 2023-03-30 07:46:35 -04:00
name_test.go feat(ipns): support passing custom sequence number during publishing (#10851) 2025-08-13 04:15:45 +02:00
peering_test.go feat: add identify option to swarm peers command 2023-03-30 04:34:57 +00:00
ping_test.go chore: update go-libp2p-kad-dht 2023-09-21 20:14:21 +02:00
pinning_remote_test.go chore: replace random test utils with equivalents in go-test/random (#10915) 2025-08-14 10:37:55 -07:00
pins_test.go chore: replace random test utils with equivalents in go-test/random (#10915) 2025-08-14 10:37:55 -07:00
provider_test.go chore: replace random test utils with equivalents in go-test/random (#10915) 2025-08-14 10:37:55 -07:00
rcmgr_test.go fix: future proof with > rcmgr.DefaultLimit for new enum rcmgr values 2023-03-16 13:41:24 +01:00
routing_dht_test.go feat: Better self-service commands for DHT providing (#10677) 2025-01-31 16:33:11 +01:00
rpc_auth_test.go feat(rpc): Opt-in HTTP RPC API Authorization (#10218) 2023-11-17 01:29:29 +01:00
rpc_unixsocket_test.go Cleanup commented imports 2024-08-19 19:55:11 -07:00
stats_test.go fix: stats dht command when Routing.Type=auto (#9538) 2023-01-13 00:38:38 +01:00
swarm_test.go feat(ci): reusable spellcheck from unified CI (#10873) 2025-08-14 00:35:35 +00:00
telemetry_test.go feat: telemetry plugin (#10866) 2025-08-18 20:46:05 +02:00
tracing_test.go style: gofumpt and godot [skip changelog] (#10081) 2023-08-17 14:02:08 +02:00
transports_test.go chore: replace random test utils with equivalents in go-test/random (#10915) 2025-08-14 10:37:55 -07:00