xai-org/x-algorithm · error · ConfigFailure

invalid seekStrage ${config.seekStrategy}

Error message

invalid seekStrage ${config.seekStrategy}

What it means

ConfigFailure thrown when constructing the botmaker KafkaConsumer because config.seekStrategy is not one of BEGINNING, RESUME, REWIND, END. The value is matched literally (case-sensitive) before building the Finatra KafkaConsumerConfig.

Source

Thrown at botmaker/botmaker_eventbus/src/main/scala/com/twitter/botmaker/runtime/KafkaConsumer.scala:38

abstract class KafkaConsumerRegistry(val config: KafkaConsumerConfig)
    extends ServiceRegistry[KafkaConsumerConfig] {

  override val name: String = config.eventType
}

trait KafkaConsumerFactory extends TwitterRuntime with EventProcessor with KafkaSerdes {

  def build(config: KafkaConsumerConfig, scoped: StatsReceiver): KafkaConsumerRegistry = {
    val keyDeser = getKeyDeserializer(config.keyType)
    val valueDeser = getValueDeserializer(config.valueThriftClass)

    val seekStrage = config.seekStrategy match {
      case "BEGINNING" => SeekStrategy.BEGINNING
      case "RESUME" => SeekStrategy.RESUME
      case "REWIND" => SeekStrategy.REWIND
      case "END" => SeekStrategy.END
      case _ => throw ConfigFailure(s"invalid seekStrage ${config.seekStrategy}")
    }

    val kafkaConsumerConfig = com.twitter.finatra.kafka.consumers
      .KafkaConsumerConfig()
      .fromConfigMap(
        TwitterKafkaConsumerConfig().configMap ++
          config.configMap.asScala.toMap ++
          TwitterKafkaUtil.k8sTlsConfigOverrides(config.dest, enableTlsAndKerberos()))

    val finagleKafkaConsumerConfig = FinagleKafkaConsumerConfig[AnyRef, AnyRef](kafkaConsumerConfig)
    var builder = FinagleKafkaConsumerBuilder[AnyRef, AnyRef](finagleKafkaConsumerConfig)
      .dest(TwitterKafkaUtil.normalizeDest(config.dest, enableTlsAndKerberos()))
      .keyDeserializer(keyDeser)
      .valueDeserializer(valueDeser)
      .groupId(KafkaGroupId(config.groupId))
      .seekStrategy(seekStrage)
      .includeNodeMetrics(config.includeNodeMetrics)
      .clientId(config.clientId)

View on GitHub (pinned to 24c60942c5)

Solutions

  1. Set seekStrategy to exactly one of BEGINNING, RESUME, REWIND, END (uppercase)
  2. Check for trailing whitespace/typos in the config value
  3. Map auto.offset.reset semantics: earliest->BEGINNING, latest->END

Example fix

# before
seek_strategy: beginning
# after
seek_strategy: BEGINNING
Defensive patterns

Strategy: validation

Validate before calling

val allowed = Set("BEGINNING","RESUME","REWIND","END")
require(allowed(config.seekStrategy), s"seekStrategy must be one of $allowed")

Try / catch

catch { case e: ConfigFailure => fail fast at startup with the allowed values listed }

Prevention

When it happens

Trigger: Setting seek_strategy to an unsupported or misspelled value — e.g. "beginning" (lowercase), "LATEST", "FROM_START", or leaving a typo like "RESUME " with whitespace.

Common situations: Copying example YAML with different casing; migrating configs from another Kafka client that uses different offset-reset semantics names (auto.offset.reset earliest/latest).

Related errors


AI-assisted analysis of xai-org/x-algorithm@24c60942c5 (2026-08-28). Data as JSON: /api/errors/2dde8313809e7132. Report an issue: GitHub.