Right-sizing Integration Services
Optimizing Resource Utilization
Introduction
Right-sizing ensures you use exactly the resources needed—no more, no less. Azure integration services like Functions, Logic Apps, Service Bus, and API Management offer various tiers and configurations. Understanding how to match resources to actual workload requirements prevents both over-provisioning (wasted money) and under-provisioning (poor performance). This guide covers systematic right-sizing for integration workloads.
This comprehensive guide covers:
- Right-sizing principles — Understanding resource matching
- Azure service tiers — Choosing appropriate levels
- Measurement approaches — Gathering utilization data
- Optimization strategies — Rightsizing actions
- Automation — Continuous optimization
Understanding Resource Requirements
Integration Workload Patterns
┌─────────────────────────────────────────────────────────────────────┐
│ WORKLOAD PATTERN CATEGORIES │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ STEADY STATE │
│ ──────────── │
│ Consistent, predictable load │
│ Example: Nightly batch processing, hourly sync │
│ Right-sizing: Baseline capacity + buffer │
│ │
│ VARIABLE │
│ ──────── │
│ Predictable peaks and valleys │
│ Example: E-commerce during sales events │
│ Right-sizing: Auto-scaling with defined limits │
│ │
│ SPIKY │
│ ───── │
│ Short, intense bursts │
│ Example: Webhook processing, notifications │
│ Right-sizing: Pay-per-use with concurrency limits │
│ │
│ GROWTH │
│ ────── │
│ Gradually increasing over time │
│ Example: New feature rollout, user growth │
│ Right-sizing: Regular review, gradual scaling │
│ │
└─────────────────────────────────────────────────────────────────────┘
Azure Service Tiers
{
"serviceTiers": {
"azureFunctions": {
"consumption": {
"description": "Pay per execution, scales to zero",
"bestFor": "Spiky, infrequent workloads",
"cost": "$0.20/1M executions + GB-s"
},
"premium": {
"description": "Vnets, longer execution, warm instances",
"bestFor": "Variable, needs pre-warming",
"cost": "$0.016/vCPU-second"
},
"dedicated": {
"description": "App Service plan, predictable",
"bestFor": "Steady state, predictable"
}
},
"serviceBus": {
"basic": {
"description": "Queues only, no sessions",
"bestFor": "Simple point-to-point",
"cost": "$0.05/10K operations"
},
"standard": {
"description": "Queues, topics, sessions",
"bestFor": "Most integration scenarios",
"cost": "$0.013/10K operations + namespace hour"
},
"premium": {
"description": "High throughput, geo-DR",
"bestFor": "Enterprise, high throughput",
"cost": "$150/namespace/month + messaging units"
}
},
"apiManagement": {
"consumption": {
"description": "Serverless, pay per call",
"bestFor": "Low traffic APIs",
"cost": "$0.003/call"
},
"developer": {
"description": "Single instance, dev/test",
"bestFor": "Development environments",
"cost": "$50/developer"
},
"standard": {
"description": "Multi-region, caching",
"bestFor": "Production APIs",
"cost": "$250/unit/hour"
}
}
}
}
Measuring Utilization
Key Metrics
# Function App metrics
az monitor metrics list \
--resource-group rg-integration \
--resource-type Microsoft.Web/sites \
--metric-name "FunctionExecutionCount,AverageMemoryWorkingSet,Duration"
# Service Bus metrics
az monitor metrics list \
--resource-type Microsoft.ServiceBus/namespaces \
--metric-name "ActiveMessages,DeadLetteredMessages,IncomingMessages"
# API Management metrics
az monitor metrics list \
--resource-type Microsoft.ApiManagement/service \
--metric-name "Requests,BackendDuration,GatewayDuration"
Utilization Analysis
public class RightSizingAnalyzer
{
public async Task<RightSizingRecommendation> AnalyzeAsync(
string resourceId,
TimeRange range)
{
var metrics = await GetMetricsAsync(resourceId, range);
var analysis = new RightSizingRecommendation
{
ResourceId = resourceId,
CurrentTier = GetCurrentTier(resourceId),
// Analyze utilization
AvgCpuUtilization = metrics.AvgCpu,
AvgMemoryUtilization = metrics.AvgMemory,
P99Latency = metrics.P99Latency,
// Recommendations
RecommendedTier = CalculateRecommendedTier(metrics),
EstimatedSavings = CalculateSavings(metrics),
Confidence = DetermineConfidence(metrics)
};
return analysis;
}
private string CalculateRecommendedTier(Metrics metrics)
{
// If consistently < 20% utilization on premium, suggest standard
if (metrics.AvgCpu < 20 && metrics.AvgMemory < 30)
{
// Check if standard tier supports the features needed
return "Standard";
}
return "Keep current tier";
}
}
Optimization Strategies
Functions Right-Sizing
{
"functionsOptimization": {
"fromPremiumToConsumption": {
"condition": "Utilization < 20%, no VNET needed",
"action": "Migrate to consumption plan",
"savings": "50-70%"
},
"reduceInstanceCount": {
"condition": "Auto-scale always at minimum",
"action": "Lower minimum instances",
"savings": "Variable"
},
"memoryOptimization": {
"condition": "Memory consistently < 50%",
"action": "Reduce memory allocation",
"savings": "30%"
},
"timeoutOptimization": {
"condition": "Functions rarely hit timeout",
"action": "Lower timeout value",
"savings": "Cost per execution"
}
}
}
Auto-Scaling Configuration
{
"autoScaleSettings": {
"enabled": true,
"profiles": [
{
"name": "default",
"capacity": {
"minimum": 1,
"maximum": 10,
"default": 2
},
"rules": [
{
"metric": "CpuPercentage",
"operator": "GreaterThan",
"threshold": 70,
"direction": "Increase",
"action": {
"type": "ChangeCount",
"value": 1
}
},
{
"metric": "CpuPercentage",
"operator": "LessThan",
"threshold": 30,
"direction": "Decrease",
"action": {
"type": "ChangeCount",
"value": 1
}
}
]
}
]
}
}
Continuous Optimization
Scheduled Review Process
┌─────────────────────────────────────────────────────────────────────┐
│ RIGHT-SIZING REVIEW CYCLE │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ WEEKLY │
│ ───── │
│ • Review utilization dashboards │
│ • Flag resources > 80% or < 20% utilization │
│ • Check for capacity events │
│ │
│ MONTHLY │
│ ───── │
│ • Deep dive into flagged resources │
│ • Review auto-scale effectiveness │
│ • Analyze cost trends │
│ • Plan capacity changes │
│ │
│ QUARTERLY │
│ ───── │
│ • Comprehensive rightsizing review │
│ • Evaluate tier changes │
│ • Review reserved capacity coverage │
│ • Update baselines │
│ │
└─────────────────────────────────────────────────────────────────────┘
Automated Optimization
# Azure Automation runbook for right-sizing
name: Right-Size-Functions
schedule: Weekly
trigger:
- condition: "AvgCPU < 20% AND AvgMemory < 30%"
- action: "Suggest downgrade from Premium to Consumption"
- condition: "Always at minimum instances"
- action: "Reduce minimum instances by 50%"
- condition: "Scaling always at maximum"
- action: "Alert for capacity review"
Best Practices
Implementation Checklist
| Practice | Description |
|---|---|
| Baseline first | Establish baseline before making changes |
| Small changes | Make incremental adjustments |
| Monitor post-change | Verify no performance degradation |
| Auto-scale properly | Configure appropriate min/max |
| Consider committed use | Reserved for steady workloads |
| Review regularly | Monthly at minimum |
Common Mistakes
┌─────────────────────────────────────────────────────────────────────┐
│ RIGHTSIZING MISTAKES │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ✗ Rightsizing based on peak instead of average │
│ ✗ Ignoring growth trends │
│ ✗ Not considering features needed (VNET, etc.) │
│ ✗ Changing too aggressively │
│ ✗ Not monitoring after changes │
│ ✗ Ignoring auto-scaling costs │
│ │
└─────────────────────────────────────────────────────────────────────┘
Related Topics
- FinOps Framework — Cost management culture
- Reserved Instances — Commitment discounts
- Cost Management — Budget and alerts
Azure Integration Hub - Architect Level Cost Architecture & FinOps