Capacity Planner
O Capacity Planner analisa tendências históricas de uso de CPU e memória para prever quando os recursos de um cluster ou namespace serão esgotados — permitindo ação proativa antes que incidentes ocorram.Algoritmo de Regressão Linear
O Capacity Planner utiliza regressão linear por mínimos quadrados (least-squares) para projetar a data de esgotamento de recursos.O algoritmo requer ao menos 3 pontos de dados para gerar uma projeção confiável. Com menos de 3 pontos, o planner retorna
trend: insufficient_data.Estruturas de Dados
ResourceUsage
ResourceUsage
Representa um ponto de uso de recurso no tempo.
| Campo | Tipo | Descrição |
|---|---|---|
Timestamp | time.Time | Momento da coleta |
CPUPercent | float64 | Uso de CPU em porcentagem (0-100) |
MemoryPercent | float64 | Uso de memória em porcentagem (0-100) |
CPUCores | float64 | Uso absoluto em cores |
MemoryBytes | int64 | Uso absoluto em bytes |
Namespace | string | Namespace de origem |
Resource | string | Nome do recurso (deployment, node) |
ResourceTrend
ResourceTrend
Resultado da regressão linear para um recurso.
| Campo | Tipo | Descrição |
|---|---|---|
Resource | string | Nome do recurso |
Namespace | string | Namespace |
CPUSlope | float64 | Taxa de crescimento de CPU (%/hora) |
MemorySlope | float64 | Taxa de crescimento de memória (%/hora) |
CPUIntercept | float64 | Intercepto da regressão para CPU |
MemoryIntercept | float64 | Intercepto da regressão para memória |
DataPoints | int | Número de pontos usados na regressão |
R2Score | float64 | Coeficiente de determinação (qualidade do fit) |
ForecastResult
ForecastResult
Projeção de esgotamento com recomendações.
| Campo | Tipo | Descrição |
|---|---|---|
Resource | string | Nome do recurso |
Namespace | string | Namespace |
CPUExhaustionDate | *time.Time | Data projetada de esgotamento de CPU (nil se estável) |
MemoryExhaustionDate | *time.Time | Data projetada de esgotamento de memória (nil se estável) |
CPUCurrentPercent | float64 | Uso atual de CPU |
MemoryCurrentPercent | float64 | Uso atual de memória |
CPUGrowthRate | float64 | Taxa de crescimento de CPU (%/hora) |
MemoryGrowthRate | float64 | Taxa de crescimento de memória (%/hora) |
Urgency | string | Classificação: urgent, plan, stable |
Recommendations | []string | Lista de recomendações |
IsBottleneck | bool | Se o recurso é gargalo em incidentes ativos |
Correlação com Incidentes
O métodoResourceIsBottleneck verifica se um recurso está relacionado a incidentes ativos:
IsBottleneck = true, a recomendação de capacidade é automaticamente priorizada e inclui referência ao incidente ativo.
Geração de Recomendações
O Capacity Planner gera recomendações baseadas na urgência da projeção:| Condição | Urgência | Recomendação |
|---|---|---|
| Esgotamento em menos de 7 dias | urgent | ”URGENTE: {recurso} em {namespace} projetado para esgotar {tipo} em {data}. Ação imediata necessária: escalar horizontalmente ou aumentar limits.” |
| Esgotamento entre 7 e 30 dias | plan | ”PLANEJAMENTO: {recurso} em {namespace} projetado para esgotar {tipo} em {data}. Planeje aumento de capacidade nas próximas semanas.” |
| Esgotamento em mais de 30 dias ou slope negativo/estável | stable | ”Estável: {recurso} em {namespace} não apresenta tendência de esgotamento no horizonte de 30 dias.” |
Como Usar
O Capacity Planner coleta dados a cada ciclo de reconciliação (30 segundos) e armazena histórico em um ConfigMap (
chatcli-capacity-history). A regressão é recalculada a cada 5 minutos.Noise Reducer
O Noise Reducer implementa quatro estratégias de supressão de alertas para reduzir a fadiga de alerta (alert fatigue) e melhorar a relação sinal/ruído.Estratégia 1: Supressão de Repetitivos
Suprime alertas idênticos quando há acúmulo sem mudança de estado.Estratégia 2: Padrões Sazonais
Identifica e suprime alertas que ocorrem em horários previsíveis (ex: jobs de limpeza, deploys agendados). SeasonalPattern struct:| Campo | Tipo | Descrição |
|---|---|---|
SignalType | string | Tipo do sinal (ex: pod_restart) |
Resource | string | Nome do recurso |
Namespace | string | Namespace |
DayOfWeek | time.Weekday | Dia da semana (0=domingo) |
HourOfDay | int | Hora do dia (0-23) |
MinuteWindow | int | Janela de tolerância em minutos |
Occurrences | int | Número de ocorrências confirmadas |
Confidence | float64 | Confiança do padrão (0-1) |
LastSeen | time.Time | Última ocorrência |
- ConfigMap update job roda toda segunda às 03:00
- Gera alerta
pod_restartno namespacejobs - Após 4 semanas: padrão identificado (segunda, 03:00, confidence 0.75)
- A partir da 5a semana: alerta suprimido automaticamente
chatcli-seasonal-patterns.
Estratégia 3: Detecção de Flap
Detecta recursos que oscilam entre estados (resolved -> detected -> resolved) repetidamente.Estratégia 4: Alert Fatigue Scoring
Calcula uma pontuação de fadiga de alerta (0-100) para determinar se o volume de alertas está excessivo.| Score | Classificação | Ação |
|---|---|---|
| 0-25 | low | Nenhuma ação. Volume saudável. |
| 26-50 | moderate | Log de aviso. Monitorar tendência. |
| 51-75 | high | Ativa supressão agressiva. Consolida alertas similares. |
| 76-100 | critical | Suprime tudo exceto critical severity. Gera meta-alerta para SRE. |
Cost Tracker
O Cost Tracker rastreia custos operacionais (LLM + downtime) e calcula o ROI da automação AIOps.Custos de LLM por Provedor
O custo de cada chamada LLM é calculado com base nos tokens consumidos e nos preços configurados por provedor:| Provedor | Custo Input (por 1M tokens) | Custo Output (por 1M tokens) | Modelo de Referência |
|---|---|---|---|
claude | $3.00 | $15.00 | Claude Sonnet |
gpt-4 | $10.00 | $30.00 | GPT-4 Turbo |
default | $1.00 | $3.00 | Qualquer outro |
Configuração de Custos
Os preços são configuráveis via ConfigMapchatcli-cost-config:
Se o ConfigMap não existir, os valores padrão são usados. A atualização do ConfigMap é refletida em tempo real (watch no ConfigMap).
IncidentCost
Custo total de um incidente, decomposto em componentes:| Campo | Tipo | Descrição |
|---|---|---|
IncidentName | string | Nome do incidente |
Namespace | string | Namespace |
LLMCost | CostBreakdown | Custo das chamadas LLM |
DowntimeCost | float64 | Custo do downtime (minutos * custo/minuto) |
TotalCost | float64 | LLMCost.Total + DowntimeCost |
Provider | string | Provedor LLM usado |
Model | string | Modelo LLM usado |
Duration | time.Duration | Duração total do incidente |
AutoRemediated | bool | Se foi resolvido automaticamente |
| Campo | Tipo | Descrição |
|---|---|---|
InputTokens | int64 | Total de tokens de input |
OutputTokens | int64 | Total de tokens de output |
InputCost | float64 | Custo dos tokens de input |
OutputCost | float64 | Custo dos tokens de output |
Total | float64 | InputCost + OutputCost |
Calls | int | Número de chamadas LLM |
CostSummary
Agregação de custos para um período:| Campo | Tipo | Descrição |
|---|---|---|
Period | string | Período de agregação (ex: 30d) |
TotalLLMCost | float64 | Soma de todos os custos LLM |
TotalDowntimeCost | float64 | Soma de todos os custos de downtime |
TotalCost | float64 | TotalLLMCost + TotalDowntimeCost |
IncidentCount | int | Total de incidentes no período |
AutoRemediatedCount | int | Incidentes resolvidos automaticamente |
AvgCostPerIncident | float64 | TotalCost / IncidentCount |
TopCostlyIncidents | []IncidentCost | Top 5 incidentes mais caros |
CostByProvider | map[string]float64 | Custo agregado por provedor LLM |
CostByNamespace | map[string]float64 | Custo agregado por namespace |
ROI | ROICalculation | Cálculo de retorno sobre investimento |
Cálculo de ROI
O ROI é calculado comparando o custo da automação com o custo estimado de resolução manual:| Campo | Tipo | Descrição |
|---|---|---|
EngineerHoursSaved | float64 | Horas de engenheiro economizadas |
LaborSavings | float64 | Economia com mão de obra ($) |
DowntimePrevented | float64 | Minutos de downtime prevenidos |
DowntimeSavings | float64 | Economia com downtime ($) |
TotalSavings | float64 | Economia total ($) |
TotalLLMCost | float64 | Custo total com LLM ($) |
ROIPercent | float64 | Retorno sobre investimento (%) |
O ROI tipicamente excede 100,000% porque o custo de chamadas LLM ($0.03-0.10 por incidente) é ordens de magnitude menor que o custo de resolução manual (2h de engenheiro + downtime).
Arquitetura de Armazenamento (ConfigMaps)
Todos os dados do Capacity Planner, Noise Reducer e Cost Tracker são persistidos em ConfigMaps no namespace do operator:| ConfigMap | Dados | Retenção |
|---|---|---|
chatcli-capacity-history | Histórico de uso de CPU/memória por recurso. Série temporal compactada em JSON. | 7 dias (rolling window) |
chatcli-pattern-store | Hashes de dedup do Noise Reducer, contadores de supressão, flags de flap. | 24 horas (pruning automático) |
chatcli-seasonal-patterns | Padrões sazonais aprendidos (SeasonalPattern structs em JSON). | Indefinido (padrões com Confidence < 0.3 e LastSeen > 30 dias são removidos) |
chatcli-cost-ledger | Registro de custos por incidente (IncidentCost em JSON). Usado para agregação. | 90 dias (rolling window) |
chatcli-cost-config | Configuração de preços por provedor, custo de downtime, taxa de engenheiro. | Indefinido (gerenciado pelo usuário) |
Formato de Armazenamento
Integrações
API REST
Endpoints
/api/v1/analytics/remediation-stats e /api/v1/analytics/summary expõem dados de custo e capacidade.Web Dashboard
A view Overview do dashboard exibe métricas de ROI e projeções de capacidade em tempo real.
Grafana
O dashboard
remediation-stats.json inclui painéis de custo e ROI.AIOps Platform
Arquitetura completa do pipeline AIOps e como estes subsistemas se integram.