alibaba/Sentinel · error · IllegalArgumentException

Invalid request

Error message

Invalid request

What it means

ClusterConfigService.modifyClusterClientConfig (Sentinel dashboard) pushes a token-client config to a selected machine. It validates that the embedded ClusterClientConfig has a non-empty serverHost and positive serverPort/requestTimeout; otherwise it throws IllegalArgumentException('Invalid request') before any network call.

Source

Thrown at sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java:58

import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerTransportConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author Eric Zhao
 * @since 1.4.0
 */
@Service
public class ClusterConfigService {

    @Autowired
    private SentinelApiClient sentinelApiClient;
    @Autowired
    private AppManagement appManagement;

    public CompletableFuture<Void> modifyClusterClientConfig(ClusterClientModifyRequest request) {
        if (notClientRequestValid(request)) {
            throw new IllegalArgumentException("Invalid request");
        }
        String app = request.getApp();
        String ip = request.getIp();
        int port = request.getPort();
        return sentinelApiClient.modifyClusterClientConfig(app, ip, port, request.getClientConfig())
            .thenCompose(v -> sentinelApiClient.modifyClusterMode(ip, port, ClusterStateManager.CLUSTER_CLIENT));
    }

    private boolean notClientRequestValid(/*@NonNull */ ClusterClientModifyRequest request) {
        ClusterClientConfig config = request.getClientConfig();
        return config == null || StringUtil.isEmpty(config.getServerHost())
            || config.getServerPort() == null || config.getServerPort() <= 0
            || config.getRequestTimeout() == null || config.getRequestTimeout() <= 0;
    }

    public CompletableFuture<Void> modifyClusterServerConfig(ClusterServerModifyRequest request) {
        ServerTransportConfig transportConfig = request.getTransportConfig();
        ServerFlowConfig flowConfig = request.getFlowConfig();

View on GitHub (pinned to a3f40ba8e9)

Solutions

  1. Fill in the token server host, port (>0), and request timeout (>0) in the cluster client assignment form/payload.
  2. Verify the JSON body actually contains clientConfig with serverHost, serverPort, requestTimeout — check for typos or wrong casing.
  3. If driving the API programmatically, build ClusterClientConfig with all three fields before calling modifyClusterClientConfig.

Example fix

// before
ClusterClientModifyRequest req = new ClusterClientModifyRequest();
req.setClientConfig(new ClusterClientConfig()); // host/port unset
clusterConfigService.modifyClusterClientConfig(req);

// after
ClusterClientConfig cfg = new ClusterClientConfig();
cfg.setServerHost("10.0.0.1");
cfg.setServerPort(18730);
cfg.setRequestTimeout(10);
req.setClientConfig(cfg);
clusterConfigService.modifyClusterClientConfig(req);
Defensive patterns

Strategy: validation

Validate before calling

ClusterClientConfig cfg = request.getClientConfig();
boolean valid = cfg != null
    && !StringUtil.isEmpty(cfg.getServerHost())
    && cfg.getServerPort() != null && cfg.getServerPort() > 0
    && cfg.getRequestTimeout() != null && cfg.getRequestTimeout() > 0;
if (!valid) {
    return ResponseEntity.badRequest().body("clientConfig requires serverHost, serverPort>0, requestTimeout>0");
}
clusterConfigService.modifyClusterClientConfig(request);

Type guard

boolean isClientRequestValid(ClusterClientModifyRequest r) {
    ClusterClientConfig c = r.getClientConfig();
    return c != null && StringUtil.isNotBlank(c.getServerHost())
        && c.getServerPort() != null && c.getServerPort() > 0
        && c.getRequestTimeout() != null && c.getRequestTimeout() > 0;
}

Prevention

When it happens

Trigger: POST to the dashboard cluster client config endpoint where request.clientConfig is null, serverHost is blank, or serverPort/requestTimeout is null or <= 0.

Common situations: Dashboard 'Token Client' form submitted with empty server host/port; API callers posting a ClusterClientModifyRequest JSON with missing clientConfig block; reverse-proxy stripping request body fields.

Related errors


AI-assisted analysis of alibaba/Sentinel@a3f40ba8e9 (2026-08-14). Data as JSON: /api/errors/27913820dcb46098. Report an issue: GitHub.