vitessio/vitess · info

throttler not found

Error message

throttler not found

What it means

throttlerlogzHandler checks slices.Contains(m.Throttlers(), name); if the requested throttler name is not registered in the manager, it returns 404 'throttler not found'. Each vitess process registers throttlers under specific names tied to their purpose (e.g. tablet throttlers, resharding workflows).

Source

Thrown at go/vt/throttler/throttlerlogz.go:127

func throttlerlogzHandler(w http.ResponseWriter, r *http.Request, m *managerImpl) {
	// Longest supported URL: /throttlerlogz/<name>
	parts := strings.SplitN(r.URL.Path, "/", 3)

	if len(parts) != 3 {
		http.Error(w, "invalid /throttlerlogz path", http.StatusNotFound)
		return
	}

	name := parts[2]
	if name == "" {
		// If no name is given, redirect to the list of throttlers at /throttlerz.
		http.Redirect(w, r, "/throttlerz", http.StatusTemporaryRedirect)
		return
	}

	if !slices.Contains(m.Throttlers(), name) {
		http.Error(w, "throttler not found", http.StatusNotFound)
		return
	}

	showThrottlerLog(w, m, name)
}

func showThrottlerLog(w http.ResponseWriter, m *managerImpl, name string) {
	results, err := m.log(name)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	logz.StartHTMLTable(w)

	if _, err := io.WriteString(w, logHeaderHTML); err != nil {
		panic(fmt.Sprintf("failed to execute logHeader template: %v", err))
	}

View on GitHub (pinned to 01a25a7d17)

Solutions

  1. GET /throttlerz to list the throttler names actually registered on this process and use one of those.
  2. Verify you are querying the correct tablet/port that owns the throttler.
  3. Check for typos or trailing whitespace in the name.
  4. If the throttler existed during a workflow, note it may have been unregistered once the workflow completed.

Example fix

// before
curl http://localhost:15000/throttlerlogz/reshard-demo1
// after
curl http://localhost:15000/throttlerz   # find valid name
curl http://localhost:15000/throttlerlogz/<name-from-list>
Defensive patterns

Strategy: fallback

Validate before calling

names, err := fetchJSON("http://localhost:15000/throttlerz")
if err != nil {
	return err
}
if !slices.Contains(names, target) {
	return fmt.Errorf("throttler %q not registered; available: %v", target, names)
}

Prevention

When it happens

Trigger: GET /throttlerlogz/<name> where <name> does not match any name in m.Throttlers() — wrong name, typo, or querying a process that never created that throttler.

Common situations: Querying a vttablet that has no active resharding workflow; using a throttler name from a different tablet; name changed after a workflow finished and its throttler was removed; copy-pasted name including whitespace.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01). Data as JSON: /api/errors/e543d1e618ab5b81. Report an issue: GitHub.