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
- Remove the `provider` section from the config before running feature extraction
- Generate/expand the provider-based config into a plain static config first, then feed that to the tool
- 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
- Keep provider-based configs separate from configs used for static feature analysis
- Pre-render provider configs into plain configs in the pipeline
- Grep configs for a top-level `provider:` key before running vdev features
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
- UNSUPPORTED_DYNAMIC_FEATURE_SELECTOR
- UNSUPPORTED_YAML_MERGE_KEY
- completing more than 2^16 data files at a time is obviously…
- {}
- component name must be non-empty
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)