elastic/elasticsearch · error · IllegalArgumentException

{thisSettingKey} ({value}) must be greater than {otherSettin

Error message

{thisSettingKey} ({value}) must be greater than {otherSetting.getKey()} ({otherValue})

What it means

GreaterThanTimeValueValidator is a Setting.Validator<TimeValue> that enforces a strict ordering between two time-value settings: this setting's value must be strictly greater (compareTo > 0) than the referenced other setting's value. If value <= otherValue, throws IllegalArgumentException naming both keys and their resolved values. Used for paired OTel export timeouts (e.g. send_timeout must exceed connect_timeout).

Source

Thrown at modules/apm/src/main/java/org/elasticsearch/telemetry/apm/internal/export/otelsdk/OtelSdkSettings.java:368

    private static final class GreaterThanTimeValueValidator implements Setting.Validator<TimeValue> {

        private final String thisSettingKey;
        private final Setting<TimeValue> otherSetting;

        private GreaterThanTimeValueValidator(String thisSettingKey, Setting<TimeValue> otherSetting) {
            this.thisSettingKey = thisSettingKey;
            this.otherSetting = otherSetting;
        }

        @Override
        public void validate(TimeValue value) {}

        @Override
        public void validate(TimeValue value, Map<Setting<?>, Object> settings) {
            var otherValue = (TimeValue) settings.get(otherSetting);
            if (value.compareTo(otherValue) <= 0) {
                throw new IllegalArgumentException(
                    thisSettingKey + " (" + value + ") must be greater than " + otherSetting.getKey() + " (" + otherValue + ")"
                );
            }
        }

        @Override
        public Iterator<Setting<?>> settings() {
            return List.<Setting<?>>of(otherSetting).iterator();
        }
    }
}

View on GitHub (pinned to db6a809a66)

Solutions

  1. Make the guarded setting strictly greater than the referenced one (e.g. send_timeout > connect_timeout).
  2. If you intend them to be equal, raise the guarded one by at least 1ms.
  3. Read the error message — it names both keys and both resolved values for quick correction.

Example fix

// before
telemetry.export.connect_timeout: 10s
telemetry.export.send_timeout: 5s
// after
telemetry.export.connect_timeout: 5s
telemetry.export.send_timeout: 10s
Defensive patterns

Strategy: validation

Validate before calling

// Generic check for any guarded > reference pair
static String checkGT(String thisKey, org.elasticsearch.common.unit.TimeValue thisVal,
                     String otherKey, org.elasticsearch.common.unit.TimeValue otherVal) {
  if (thisVal.compareTo(otherVal) <= 0)
    return thisKey + " (" + thisVal + ") must be greater than " + otherKey + " (" + otherVal + ")";
  return null;
}

Prevention

When it happens

Trigger: Setting a guarded timeout to a value equal to or smaller than its reference: e.g. send_timeout=5s when connect_timeout=10s, or making them equal.

Common situations: Tightening connect_timeout without re-tuning send_timeout; setting both to the same value during testing; importing a config from another deployment with different defaults.

Related errors


AI-assisted analysis of elastic/elasticsearch@db6a809a66 (2026-08-12). Data as JSON: /api/errors/5e6a49cdccfdd2e5. Report an issue: GitHub.