| name | finfocus-routing |
| description | Configure and debug FinFocus intelligent plugin routing. Use when setting up multi-plugin routing, configuring priority and fallback rules, writing pattern matching for resource types, testing route selection, or debugging why a plugin isn't receiving cost queries. Triggers on: "configure routing", "plugin priority", "fallback chain", "route test", "multi-region routing", "pattern matching", "config routes", "plugin selection", "routing config", or any task involving finfocus plugin routing configuration and debugging.
|
FinFocus Plugin Routing
Route cost queries to the right plugin based on provider, region, patterns,
and priority.
No Config = No Routing
Without a routing: section in config.yaml, the engine queries all plugins
for every resource. Add routing config only when you need control.
Config Format
routing:
plugins:
- name: aws-public
priority: 10
features:
- ProjectedCosts
patterns:
- type: glob
pattern: "aws:ec2:*"
fallback: true
Priority and Fallback
- Higher number = higher priority (sorted descending, stable sort)
- Equal priority (all 0) = plugins queried in parallel
- $0.00 is a VALID result — does NOT trigger fallback
- Only nil/empty results or errors trigger fallback to next plugin
InvalidArgument does NOT trigger fallback (plugin explicitly rejected)
Features
| Feature | gRPC Method | Capability |
|---|
ProjectedCosts | GetProjectedCost | PLUGIN_CAPABILITY_PROJECTED_COSTS |
ActualCosts | GetActualCost | PLUGIN_CAPABILITY_ACTUAL_COSTS |
Recommendations | GetRecommendations | PLUGIN_CAPABILITY_RECOMMENDATIONS |
Carbon | GetCarbonFootprint | PLUGIN_CAPABILITY_CARBON |
DryRun | PerformDryRun | PLUGIN_CAPABILITY_DRY_RUN |
Budgets | GetBudgetStatus + 3 others | PLUGIN_CAPABILITY_BUDGETS |
BatchCost | BatchCost | PLUGIN_CAPABILITY_BATCH_COST |
Empty features list = all features enabled. Feature names are case-sensitive.
Pattern Matching
Two types for declarative resource type matching:
- glob:
filepath.Match semantics, * matches across / boundaries.
Example: aws:ec2:* matches aws:ec2:Instance
- regex: RE2 syntax.
Example:
aws:(ec2|rds)/.* matches aws:ec2/instance:Instance
Patterns take highest precedence over automatic provider matching.
Matching Precedence
- Declarative patterns — glob/regex against resource type
- Automatic provider —
SupportedProviders from GetPluginInfo
- Global plugins — empty or
["*"] SupportedProviders
Internal Pulumi types (pulumi:*) skip automatic matching unless explicitly
matched by a pattern.
Region Matching
Region extracted from resource properties in order: region >
availabilityZone > availability_zone > location > ARN.
- AZs normalized:
us-west-2a → us-west-2, us-central1-a → us-central1
- Empty region on either side = wildcard (matches anything)
- Comparison is case-insensitive
CLI Commands
finfocus config routes list
finfocus config routes list --output json
finfocus config routes test aws:ec2:Instance
finfocus config routes test aws:ec2:Instance us-east-1
finfocus config routes test aws:ec2:Instance --output json
Common Scenarios
See references/routing-scenarios.md for
multi-region, feature-based, pattern-based, and multi-cloud configurations
with complete YAML examples.
Validation
- Errors: empty name, missing plugin, invalid regex, negative priority,
invalid pattern type, empty pattern
- Warnings: duplicate plugin config, unknown feature names