vitessio/vitess · error

no app indicated

Error message

no app indicated

What it means

This error comes from CheckApp in the throttler package when Check is invoked without a valid app name. The throttler evaluates metrics per application, so an empty appName cannot be matched against configured app rules (throttler's app-configured metric thresholds). Rather than silently treating it as the default app, the throttler returns CheckThrottlerResponseCode_APP_DENIED with this error.

Source

Thrown at go/vt/vttablet/tabletserver/throttle/check.go:101

// NewThrottlerCheck creates a ThrottlerCheck
func NewThrottlerCheck(throttler *Throttler) *ThrottlerCheck {
	return &ThrottlerCheck{
		throttler: throttler,
	}
}

// checkAppMetricResult allows an app to check on a metric
func (check *ThrottlerCheck) checkAppMetricResult(ctx context.Context, appName string, metricResultFunc base.MetricResultFunc, flags *CheckFlags) (checkResult *CheckResult) {
	// Handle deprioritized app logic
	denyApp := false
	//
	metricResult, threshold, matchedApp := check.throttler.AppRequestMetricResult(ctx, appName, metricResultFunc, denyApp)
	if flags.OverrideThreshold > 0 {
		threshold = flags.OverrideThreshold
	}
	value, err := metricResult.Get()
	if appName == "" {
		return NewCheckResult(tabletmanagerdatapb.CheckThrottlerResponseCode_APP_DENIED, value, threshold, "", errors.New("no app indicated"))
	}

	var responseCode tabletmanagerdatapb.CheckThrottlerResponseCode
	switch {
	case err == base.ErrAppDenied:
		// app specifically not allowed to get metrics
		responseCode = tabletmanagerdatapb.CheckThrottlerResponseCode_APP_DENIED
	case err == base.ErrNoSuchMetric:
		// not collected yet, or metric does not exist
		responseCode = tabletmanagerdatapb.CheckThrottlerResponseCode_UNKNOWN_METRIC
	case err != nil:
		// any error
		responseCode = tabletmanagerdatapb.CheckThrottlerResponseCode_INTERNAL_ERROR
	case value > threshold:
		// casual throttling
		responseCode = tabletmanagerdatapb.CheckThrottlerResponseCode_THRESHOLD_EXCEEDED
		err = base.ErrThresholdExceeded
	default:

View on GitHub (pinned to 01a25a7d17)

Solutions

  1. Set the app name in the throttler check request (CheckRequest.app_name) before calling Check.
  2. If writing Go code, ensure the app name is a non-empty string passed to Check; default to a known app like "vreplication" or "onlineddl" only when intentional.
  3. Check the client/tool version: upgrade callers that predate mandatory app names in throttler requests.

Example fix

// before
resp := throttlerApp.Check(ctx, tabletmanagerdatapb.ThrottlerAction_CheckTablet, nil) // app name empty
// after
resp := throttlerApp.Check(ctx, tabletmanagerdatapb.ThrottlerAction_CheckTablet, &throttle.BaseFlags{AppName: "my-app"})
Defensive patterns

Strategy: validation

Validate before calling

if appName == "" { return fmt.Errorf("app name must be set before calling throttler Check") }

Type guard

func hasAppName(app string) bool { return strings.TrimSpace(app) != "" }

Prevention

When it happens

Trigger: Calling Check (via checkAppMetricResult/Check) with flags or request context whose appName resolves to "" — e.g. a throttler check RPC that omits the app name, or a caller constructing CheckRequest without setting AppName.

Common situations: Custom scripts hitting the throttler HTTP/gRPC endpoint directly without the app parameter; older clients calling throttler APIs before app-name fields were mandatory; copy-pasted throttler check code dropping the app name.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


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