ipfs/kubo · warning

telemetry endpoint returned HTTP %d

Error message

telemetry endpoint returned HTTP %d

What it means

sendTelemetry posts the node's telemetry report to the configured collector endpoint and, when the response status is >= 400, returns 'telemetry endpoint returned HTTP <code>' (after logging at debug level). The endpoint rejected the payload or the request, so this cycle's telemetry was not accepted. Status 410 is special-cased as errEndpointRetired.

Source

Thrown at plugin/plugins/telemetry/telemetry.go:808

	// so HTTP_PROXY, HTTPS_PROXY and NO_PROXY are respected.
	client := &http.Client{
		Timeout: httpTimeout,
	}
	resp, err := client.Do(req)
	if err != nil {
		log.Debugf("failed to send telemetry: %s", err)
		return err
	}
	defer resp.Body.Close()

	// A collector says it is permanently out of service with 410 Gone, which
	// stops this node for good. See retire.
	if resp.StatusCode == http.StatusGone {
		return errEndpointRetired
	}

	if resp.StatusCode >= 400 {
		err := fmt.Errorf("telemetry endpoint returned HTTP %d", resp.StatusCode)
		log.Debug(err)
		return err
	}
	log.Debugf("telemetry sent successfully (%d)", resp.StatusCode)
	return nil
}

View on GitHub (pinned to 329838acdf)

Solutions

  1. Check the status code: 410 means the endpoint is retired — stop sending (kubo handles this via errEndpointRetired) or upgrade kubo
  2. Verify the collector URL in config (Telemetry settings) is current and reachable
  3. Check IPFS_TELEMETRY=off / DO_NOT_TRACK if you simply want to silence telemetry entirely
  4. Retry later for 429/5xx; failures are non-fatal and logged at debug level

Example fix

// before
collector := "https://old-collector.example.com/v1"
// after
collector := "https://current-collector.example.com/v2" // or disable:
IPFS_TELEMETRY=off ipfs daemon
Defensive patterns

Strategy: retry

Validate before calling

resp, err := http.Head(collectorURL)
if err == nil && resp.StatusCode == http.StatusGone {
    // endpoint retired; disable telemetry or update collector
}

Try / catch

if err := sendTelemetry(ctx, payload); err != nil {
    if errors.Is(err, errEndpointRetired) { disableTelemetry() }
    // otherwise: log and retry on next cycle; non-fatal
    log.Debug(err)
}

Prevention

When it happens

Trigger: Collector returns 400 (malformed payload/schema mismatch), 401/403 (auth/token invalid), 404/410 (endpoint moved or retired), or 429/5xx (rate limit, collector outage).

Common situations: A kubo version posting a schema the collector no longer accepts, misconfigured collector URL, retired endpoint pinned in an old binary, or the collector temporarily down.

Related errors


AI-assisted analysis of ipfs/kubo@329838acdf (2026-09-03). Data as JSON: /api/errors/9165f885c8821c43. Report an issue: GitHub.