vectordotdev/vector · error

UNSUPPORTED_PROVIDER

Error message

UNSUPPORTED_PROVIDER

What it means

from_config rejects FeatureConfig files that set the top-level `provider` key with the UNSUPPORTED_PROVIDER message. Configuration providers are not supported when computing the feature set, because provider-generated config cannot be statically resolved to a list of cargo features.

Solutions

  1. Remove the `provider` section from the config before running feature extraction
  2. Generate/expand the provider-based config into a plain static config first, then feed that to the tool
  3. Use a different config file without provider sections for feature computation

Example fix

// before
provider:
  type: vault
  url: http://127.0.0.1:8200
api:
  enabled: true
// after
api:
  enabled: true
Defensive patterns

Strategy: validation

Validate before calling

fn has_provider(cfg: &serde_yaml::Value) -> bool {
    cfg.get("provider").is_some()
}
// reject before calling the tool
if has_provider(&cfg) { panic!("config uses a provider; expand to static config first"); }

Prevention

When it happens

Trigger: Calling load_and_extract (or from_config via the features command) on a config whose top level contains a `provider:` section (e.g. `provider: {type: vault, ...}`).

Common situations: Reusing an existing Vector config that loads secrets/sections from a config provider as input to the feature-extraction tooling; testing a provider-based setup with the vdev features command.

Related errors


AI-assisted analysis of vectordotdev/vector@bdb87aeaa4 (2026-09-16). Data as JSON: /api/errors/4834f66c3532a611. Report an issue: GitHub.

Appendix: source

Thrown at vdev/src/utils/features.rs:155

        .collect();

    from_config(&config, &declared_features)
}

fn contains_yaml_merge_key(value: &serde_yaml::Value) -> bool {
    match value {
        serde_yaml::Value::Sequence(values) => values.iter().any(contains_yaml_merge_key),
        serde_yaml::Value::Mapping(mapping) => mapping
            .iter()
            .any(|(key, value)| key.as_str() == Some("<<") || contains_yaml_merge_key(value)),
        serde_yaml::Value::Tagged(tagged) => contains_yaml_merge_key(&tagged.value),
        _ => false,
    }
}

fn from_config(config: &FeatureConfig, declared_features: &FeatureSet) -> Result<Vec<String>> {
    if config.provider.is_some() {
        bail!(UNSUPPORTED_PROVIDER);
    }
    if [
        &config.enrichment_tables,
        &config.secret,
        &config.sources,
        &config.transforms,
        &config.sinks,
    ]
    .into_iter()
    .flat_map(|section| section.values())
    .any(|component| has_dynamic_reference(&component.r#type))
    {
        bail!(UNSUPPORTED_DYNAMIC_FEATURE_SELECTOR);
    }
    let mut features = FeatureSet::default();
    add_option(&mut features, "api", config.api.as_ref());

    get_features(

View on GitHub (pinned to bdb87aeaa4)