Pular para o conteúdo principal

Guia de Operações SMS-C

← Voltar ao Índice da Documentação | README Principal

Procedimentos operacionais diários, monitoramento e tarefas de manutenção para equipes de operações SMS-C.

Índice

Operações Diárias

Verificação de Saúde Matinal

Realize estas verificações no início de cada dia:

1. Verificar Status do Sistema

# Verificação de saúde da API
curl https://api.example.com:8443/api/status

# Resposta esperada:
# {"status":"ok","application":"OmniMessage","timestamp":"2025-10-30T08:00:00Z"}

2. Revisar Métricas do Prometheus

Acesse o painel do Prometheus e verifique:

  • Taxa de mensagens (últimas 24 horas)
  • Taxa de falhas de roteamento (deve ser < 1%)
  • Pendências na fila (deve ser < 1000 pendentes)
  • Taxa de sucesso de entrega (deve ser > 95%)
  • Status de conexão do frontend (todos os frontends esperados ativos)

3. Verificar Fila de Mensagens

Acesse a interface da Web: https://sms-admin.example.com/message_queue

Revise:

  • Total de mensagens pendentes (deve ser baixo)
  • Idade da mensagem mais antiga (deve ser < 5 minutos)
  • Mensagens com altas tentativas de entrega (investigar se > 3)
  • Mensagens de carta morta (investigar quaisquer presentes)

4. Revisar Status do Frontend

Acesse a interface da Web: https://sms-admin.example.com/frontend_status

Verifique:

  • Todos os frontends esperados estão ativos
  • Sem desconexões não expiradas
  • Sem erros de frontend nas últimas 24 horas

5. Verificar Logs da Aplicação

Acesse a interface da Web: https://sms-admin.example.com/logs ou verifique os arquivos de log

Procure por:

  • Mensagens de nível de erro
  • Falhas de roteamento
  • Falhas de cobrança
  • Problemas de conexão com o banco de dados
  • Problemas de nós do cluster

Monitoramento do Volume de Mensagens

Verificar Contagem de Mensagens Horárias:

Use a consulta do Prometheus:

# Mensagens recebidas por hora
increase(sms_c_message_received_count[1h])

# Mensagens entregues por hora
increase(sms_c_delivery_succeeded_count[1h])

# Calcular taxa de entrega
rate(sms_c_delivery_succeeded_count[1h]) / rate(sms_c_message_received_count[1h])

Padrões Esperados:

  • Horário comercial: Volume mais alto
  • Noites/fins de semana: Volume mais baixo
  • Taxa de entrega: Deve ser > 95%

Condições de Alerta:

  • Queda súbita nas mensagens ( > 50% de diminuição)
  • Aumento súbito nas mensagens ( > 200% de aumento)
  • Queda da taxa de entrega abaixo de 90%

Monitoramento

Métricas Chave a Observar

Métricas de Processamento de Mensagens

Contagem de Mensagens Recebidas (sms_c_message_received_count):

  • O que: Total de mensagens entrando no sistema
  • Alerta: Queda ou pico súbito
  • Consulta: rate(sms_c_message_received_count[5m])

Duração do Processamento de Mensagens (sms_c_message_processing_stop_duration):

  • O que: Tempo de processamento de ponta a ponta
  • Alerta: p95 > 1000ms
  • Consulta: histogram_quantile(0.95, sms_c_message_processing_stop_duration)

Métricas de Roteamento

Falhas de Roteamento (sms_c_routing_failed_count):

  • O que: Mensagens que não puderam ser roteadas
  • Alerta: Quaisquer falhas ( > 0)
  • Consulta: increase(sms_c_routing_failed_count[5m])

Rota Correspondida (sms_c_routing_route_matched_count):

  • O que: Quais rotas estão sendo usadas
  • Alerta: Rotas de alta prioridade não correspondendo
  • Consulta: sms_c_routing_route_matched_count

Métricas de Entrega

Taxa de Sucesso de Entrega:

  • O que: Percentual de entregas bem-sucedidas
  • Alerta: Taxa < 95%
  • Consulta: rate(sms_c_delivery_succeeded_count[5m]) / rate(sms_c_delivery_queued_count[5m])

Tentativas de Entrega (sms_c_delivery_succeeded_attempt_count):

  • O que: Retentativas necessárias para entrega
  • Alerta: p95 > 2 (muitas retentativas)
  • Consulta: histogram_quantile(0.95, sms_c_delivery_succeeded_attempt_count)

Métricas de Fila

Tamanho da Fila (sms_c_queue_size_size):

  • O que: Total de mensagens na fila
  • Alerta: Tamanho > 10.000
  • Consulta: sms_c_queue_size_size

Idade da Mensagem Mais Antiga (sms_c_queue_oldest_message_age_seconds):

  • O que: Idade da mensagem pendente mais antiga
  • Alerta: Idade > 300 segundos
  • Consulta: sms_c_queue_oldest_message_age_seconds

Configuração do Painel

Painéis do Painel Operacional:

  1. Taxa de Mensagens (Gráfico)

    • Mensagens recebidas (taxa de 5 minutos)
    • Mensagens entregues (taxa de 5 minutos)
    • Intervalo de tempo: Últimas 24 horas
  2. Status da Fila (Estatísticas Únicas)

    • Mensagens pendentes atuais
    • Idade da mensagem mais antiga
    • Contagem de mensagens falhadas
  3. Desempenho de Entrega (Gráfico)

    • Taxa de sucesso ao longo do tempo
    • Taxa de falha ao longo do tempo
    • Intervalo de tempo: Últimas 24 horas
  4. Status de Roteamento (Tabela)

    • ID da Rota
    • Contagem de correspondências (última hora)
    • SMSC de destino
    • Prioridade
  5. Status do Frontend (Tabela)

    • Nome do frontend
    • Status (ativo/expirado)
    • Última vez visto
    • Contagem de mensagens (última hora)
  6. Saúde do Sistema (Estatísticas Únicas)

    • Tempo de resposta da API (p95)
    • Tempo de consulta ao banco de dados (p95)
    • Tempo de consulta ENUM (p95)

Configuração de Alertas

Alertas Críticos (Resposta Imediata Necessária):

# Nenhuma rota encontrada - mensagens não podem ser entregues
- alert: RoutingFailures
expr: increase(sms_c_routing_failed_count[5m]) > 0
severity: critical
description: "{{ $value }} mensagens falharam no roteamento nos últimos 5 minutos"

# Fila acumulando - processamento ficando para trás
- alert: QueueBacklog
expr: sms_c_queue_size_pending > 10000
severity: critical
description: "A fila tem {{ $value }} mensagens pendentes"

# Mensagens envelhecendo - entrega travada
- alert: OldMessagesInQueue
expr: sms_c_queue_oldest_message_age_seconds > 300
severity: critical
description: "A mensagem mais antiga tem {{ $value }} segundos"

# Frontend desconectado - sem caminho de entrega
- alert: FrontendDisconnected
expr: sms_c_frontend_status_count{status="disconnected"} > 0
severity: critical
description: "{{ $value }} frontends desconectados"

Alertas de Aviso (Investigação Necessária):

# Taxa de sucesso de entrega caindo
- alert: LowDeliveryRate
expr: rate(sms_c_delivery_succeeded_count[10m]) / rate(sms_c_delivery_queued_count[10m]) < 0.90
severity: warning
description: "A taxa de sucesso de entrega é {{ $value }}"

# Muitas retentativas de entrega
- alert: HighRetryRate
expr: histogram_quantile(0.95, sms_c_delivery_succeeded_attempt_count) > 2
severity: warning
description: "Tentativas de entrega no 95º percentil: {{ $value }}"

# Consultas ENUM lentas ou falhando
- alert: SlowEnumLookups
expr: histogram_quantile(0.95, sms_c_enum_lookup_stop_duration) > 5000
severity: warning
description: "Consultas ENUM levando > 5 segundos"

# Baixa taxa de acerto de cache ENUM
- alert: LowEnumCacheHitRate
expr: rate(sms_c_enum_cache_hit_count[10m]) / (rate(sms_c_enum_cache_hit_count[10m]) + rate(sms_c_enum_cache_miss_count[10m])) < 0.70
severity: warning
description: "Taxa de acerto de cache ENUM: {{ $value }}"

Rastreamento de Mensagens

Encontrar Mensagem Específica

Por ID da Mensagem:

  1. Interface da Web: Navegue até /message_queue
  2. Insira o ID da mensagem na caixa de pesquisa
  3. Veja os detalhes completos e o histórico de eventos

Via API:

curl https://api.example.com:8443/api/messages/12345

Por Número de Telefone:

  1. Interface da Web: Navegue até /message_queue
  2. Insira o número de telefone na caixa de pesquisa
  3. Veja todas as mensagens para esse número

Rastrear Ciclo de Vida da Mensagem

Ver Histórico de Eventos:

  1. Interface da Web: Clique na mensagem na fila, veja a seção "Eventos"
  2. API: GET /api/events/12345

Sequência Comum de Eventos:

1. message_inserted - Mensagem criada

2. number_translated - Números normalizados (se configurado)

3. message_routed - Decisão de roteamento tomada

4. charging_attempted - Verificação de cobrança (se habilitada)

5. message_delivered - Entregue com sucesso

Sequência de Entrega Falhada:

1. message_inserted

2. message_routed

3. delivery_attempt_1 - Primeira tentativa falhou

4. delivery_attempt_2 - Segunda tentativa falhou (2min de atraso)

5. delivery_attempt_3 - Terceira tentativa falhou (4min de atraso)

6. message_dead_letter - Limite de retentativas excedido

Verificar Status de Entrega

Mensagens Pendentes:

  • Status: "pendente"
  • deliver_after: Timestamp futuro
  • delivery_attempts: 0 ou número baixo

Mensagens Entregues:

  • Status: "entregue"
  • deliver_time: Timestamp de entrega
  • dest_smsc: Frontend que entregou

Mensagens Falhadas:

  • Status: "pendente" com altas delivery_attempts
  • deadletter: true (se expirado)
  • Verifique o log de eventos para razões de falha

Roteamento de Mensagens Baseado em Localização

O SMS-C suporta a recuperação de mensagens baseada em localização, permitindo que frontends recebam automaticamente mensagens destinadas a assinantes registrados em sua localização.

Como Funciona:

Quando um frontend consulta por mensagens pendentes usando get_messages_for_smsc(smsc_name), o sistema retorna mensagens de duas maneiras:

  1. Roteamento Explícito - Mensagens onde dest_smsc corresponde explicitamente ao nome do frontend
  2. Roteamento Baseado em Localização - Mensagens onde:
    • dest_smsc é null (não roteado explicitamente)
    • destination_msisdn tem um registro de localização ativo
    • O campo location da localização corresponde ao nome do frontend
    • A localização não expirou

Cenário de Exemplo:

Um assinante com MSISDN +447700900123 se registra no frontend uk_gateway:

# Assinante se registra (cria registro de localização)
POST /api/locations
{
"msisdn": "+447700900123",
"imsi": "234150123456789",
"location": "uk_gateway",
"expires": "2025-11-01T12:00:00Z"
}

Quando uma mensagem chega para esse assinante sem roteamento explícito:

# Mensagem submetida sem dest_smsc
POST /api/messages
{
"source_msisdn": "+15551234567",
"destination_msisdn": "+447700900123",
"message_body": "Hello",
"source_smsc": "api"
# Nota: dest_smsc é null
}

O frontend uk_gateway receberá automaticamente essa mensagem quando fizer a consulta:

# Frontend consulta por mensagens
GET /api/messages/queue?smsc=uk_gateway

# Retorna a mensagem mesmo que dest_smsc seja null
# porque o assinante de destino está registrado em uk_gateway

Requisitos de Localização:

Para que o roteamento baseado em localiza��ão funcione:

  • A tabela locations deve ter uma entrada para o destination_msisdn
  • O campo location deve corresponder ao nome do SMSC consultado
  • O timestamp expires deve estar no futuro

Monitoramento do Roteamento Baseado em Localização:

Verifique os registros de localização:

# Via API
GET /api/locations/{msisdn}

# Verifique se a localização expirou
# o campo expires deve ser > hora atual

Problemas Comuns:

  • Mensagem não entregue: Verifique se a localização expirou
  • Frontend errado: Verifique se o campo location corresponde ao nome do frontend esperado
  • Localização não encontrada: O assinante pode precisar se registrar novamente

Intervenções Manuais

Tentar Novamente Mensagem Falhada:

# Redefinir delivery_attempts e deliver_after
curl -X PATCH https://api.example.com:8443/api/messages/12345 \
-H "Content-Type: application/json" \
-d '{
"delivery_attempts": 0,
"deliver_after": "2025-10-30T12:00:00Z"
}'

Alterar Destino:

# Roteamento para SMSC diferente
curl -X PATCH https://api.example.com:8443/api/messages/12345 \
-H "Content-Type: application/json" \
-d '{
"dest_smsc": "backup_gateway"
}'

Excluir Mensagem Travada:

curl -X DELETE https://api.example.com:8443/api/messages/12345

Gerenciamento de Rotas

Ver Rotas Atuais

Interface da Web: Navegue até /sms_routing

Via API:

# Listar todas as rotas
curl https://api.example.com:8443/api/routes

Verificar Uso da Rota:

Consulta do Prometheus:

# Mensagens roteadas por cada rota (última hora)
increase(sms_c_routing_route_matched_count[1h])

Adicionar Nova Rota

Interface da Web:

  1. Navegue até /sms_routing
  2. Clique em "Adicionar Nova Rota"
  3. Preencha os campos:
    • Prefixo de Chamada: Prefixo do número de origem (opcional)
    • Prefixo Chamado: Prefixo do número de destino (obrigatório para roteamento geográfico)
    • SMSC de Origem: Filtro do sistema de origem (opcional)
    • SMSC de Destino: Gateway de destino (obrigatório, a menos que seja resposta automática/descarte)
    • Prioridade: Prioridade da rota (1-255, menor = maior prioridade)
    • Peso: Peso de balanceamento de carga (1-100)
    • Descrição: Descrição legível por humanos
    • Habilitado: Marque para ativar imediatamente
  4. Clique em "Salvar Rota"

Exemplo: Rota Geográfica:

  • Prefixo Chamado: +44
  • SMSC de Destino: uk_gateway
  • Prioridade: 50
  • Peso: 100
  • Descrição: "Roteamento do Reino Unido"

Exemplo: Rota Balanceada:

Crie duas rotas com os mesmos critérios, mas pesos diferentes:

Rota 1:

  • Prefixo Chamado: +44
  • SMSC de Destino: uk_primary
  • Prioridade: 50
  • Peso: 70
  • Descrição: "Reino Unido primário (70%)"

Rota 2:

  • Prefixo Chamado: +44
  • SMSC de Destino: uk_backup
  • Prioridade: 50
  • Peso: 30
  • Descrição: "Reino Unido de backup (30%)"

Testar Rotas

Simulador de Roteamento:

  1. Navegue até /simulator
  2. Insira parâmetros de teste:
    • Número Chamador: +15551234567
    • Número Chamado: +447700900000
    • SMSC de Origem: (opcional)
    • Tipo de Origem: (opcional)
  3. Clique em "Simular Roteamento"
  4. Revise os resultados:
    • Rota Selecionada: Qual rota foi escolhida
    • Todas as Correspondências: Quais rotas corresponderam aos critérios
    • Avaliação: Por que cada rota correspondeu ou não correspondeu

Testar Antes da Produção:

  • Teste todas as novas rotas no simulador
  • Verifique se a rota correta é selecionada
  • Verifique a ordem de prioridade
  • Valide a distribuição de peso

Modificar Rota Existente

Interface da Web:

  1. Navegue até /sms_routing
  2. Encontre a rota na lista
  3. Clique em "Editar"
  4. Modifique os campos
  5. Clique em "Salvar Rota"

Modificações Comuns:

  • Desabilitar Rota: Desmarque "Habilitado" (remoção temporária)
  • Ajustar Peso: Alterar distribuição de balanceamento de carga
  • Alterar Prioridade: Reordenar avaliação da rota
  • Atualizar Destino: Mudar para SMSC diferente

Excluir Rota

Interface da Web:

  1. Navegue até /sms_routing
  2. Encontre a rota na lista
  3. Clique em "Excluir"
  4. Confirme a exclusão

Aviso: Excluir rotas é permanente. Considere desabilitar em vez disso.

Exportar/Importar Rotas

Exportar Rotas (Backup):

  1. Navegue até /sms_routing
  2. Clique em "Exportar Rotas"
  3. Salve o arquivo JSON

Importar Rotas:

  1. Navegue até /sms_routing
  2. Clique em "Importar Rotas"
  3. Selecione o arquivo JSON
  4. Escolha o modo de importação:
    • Mesclar: Adicionar às rotas existentes
    • Substituir: Excluir todas e importar

Casos de Uso:

  • Backup antes de grandes alterações
  • Copiar rotas entre ambientes
  • Recuperação de desastres
  • Versionamento de configuração

Gerenciamento de Frontend

Monitorar Conexões de Frontend

Interface da Web: Navegue até /frontend_status

Verifique:

  • Todos os frontends esperados estão "ativos"
  • Os horários da última visualização são recentes ( < 90 segundos)
  • Sem frontends expirados inesperados

Via API:

# Obter frontends ativos
curl https://api.example.com:8443/api/frontends/active

# Obter estatísticas
curl https://api.example.com:8443/api/frontends/stats

Investigar Desconexões

Frontend Expirado:

  1. Verifique os logs do frontend para erros
  2. Verifique a conectividade de rede com o SMS-C
  3. Confirme se o frontend está em execução
  4. Verifique a lógica de registro do frontend (deve se registrar a cada 60s)

Registro Não Aparecendo:

  1. Verifique se o frontend está chamando POST /api/frontends/register
  2. Verifique os logs da API para erros de registro
  3. Verifique o formato do payload JSON
  4. Teste o registro manualmente com curl

Exemplo de Registro Manual:

curl -X POST https://api.example.com:8443/api/frontends/register \
-H "Content-Type: application/json" \
-d '{
"frontend_name": "test_gateway",
"frontend_type": "smpp",
"ip_address": "10.0.1.50",
"hostname": "gateway.example.com"
}'

Ver Histórico do Frontend

Interface da Web:

  1. Navegue até /frontend_status
  2. Encontre o frontend na lista
  3. Clique em "Histórico"
  4. Revise registros de registros anteriores

Via API:

curl https://api.example.com:8443/api/frontends/history/uk_gateway

Casos de Uso:

  • Investigar a confiabilidade da conexão
  • Rastrear padrões de tempo de atividade do frontend
  • Identificar alterações de configuração

Gerenciamento de Tradução de Números

As regras de tradução de números são gerenciadas via config/runtime.exs. Alterações requerem reinício da aplicação.

Ver Regras de Tradução Ativas

Verifique o arquivo de configuração:

cat config/runtime.exs | grep -A 20 "translation_rules:"

Tarefas Comuns de Tradução

Adicionar Código de País a Números Locais:

Edite config/runtime.exs:

%{
calling_prefix: nil,
called_prefix: nil,
source_smsc: nil,
calling_match: "^(\d{10})$",
calling_replace: "+1\1",
called_match: "^(\d{10})$",
called_replace: "+1\1",
priority: 100,
description: "Adicionar +1 a números de 10 dígitos dos EUA",
enabled: true
}

Normalizar Formato Internacional:

%{
calling_prefix: nil,
called_prefix: nil,
source_smsc: nil,
calling_match: "^00(\d+)$",
calling_replace: "+\1",
called_match: "^00(\d+)$",
called_replace: "+\1",
priority: 10,
description: "Converter prefixo 00 para +",
enabled: true
}

Remoção de Código Específico do Transportador:

%{
calling_prefix: nil,
called_prefix: "101",
source_smsc: "carrier_a",
calling_match: nil,
calling_replace: nil,
called_match: "^101(\d+)$",
called_replace: "\1",
priority: 5,
description: "Remover código do transportador do transportador A",
enabled: true
}

Testar Regras de Tradução

Após alterações na configuração:

  1. Reinicie a aplicação para carregar novas regras
  2. Envie uma mensagem de teste com origem/destino que deve corresponder
  3. Verifique o log de eventos para o evento number_translated
  4. Verifique se os números foram transformados corretamente

Desabilitar Regra de Tradução

Defina enabled: false na regra:

%{
...
enabled: false
}

Reinicie a aplicação.

Manutenção do Sistema

Manutenção do Banco de Dados

Verificar Tamanho do Banco de Dados:

Use suas ferramentas de gerenciamento de banco de dados para monitorar o tamanho de armazenamento de CDR:

  • MySQL/MariaDB: Consulte information_schema.tables para o tamanho do banco de dados
  • PostgreSQL: Use a função pg_database_size() ou o comando \l+ no psql

Limpar Registros CDR Antigos:

Os registros CDR devem ser arquivados e purgados periodicamente com base na sua política de retenção:

  • Configure arquivamento automático com base nos requisitos de negócios (tipicamente 30-90 dias no banco de dados operacional)
  • Arquive registros mais antigos para um data warehouse ou armazenamento frio
  • Exclua registros arquivados do banco de dados operacional em lotes para evitar contenção de bloqueio

Otimizar Tabelas:

Periodicamente otimize as tabelas do banco de dados para manter o desempenho:

  • MySQL/MariaDB: Execute o comando OPTIMIZE TABLE durante períodos de baixo tráfego
  • PostgreSQL: Execute VACUUM ANALYZE regularmente (ou habilite autovacuum)

Executar Semanalmente durante período de baixo tráfego para manter desempenho ideal.

Manutenção do Banco de Dados Mnesia

Verificar Tamanho da Tabela Mnesia:

# No console IEx
:mnesia.table_info(:sms_route, :size)
:mnesia.table_info(:translation_rule, :size)

Backup das Tabelas Mnesia:

# Exportar rotas (Interface da Web)
# Navegue até /sms_routing
# Clique em "Exportar Rotas"

# Ou via backup do Mnesia
:mnesia.backup("/var/backups/sms_c/mnesia_backup.bup")

Restaurar Mnesia:

# Via importação da Interface da Web
# Ou restaurar backup:
:mnesia.restore("/var/backups/sms_c/mnesia_backup.bup", [])

Rotação de Logs

Configure logrotate para logs da aplicação:

# /etc/logrotate.d/sms_c
/var/log/sms_c/*.log {
daily
rotate 30
compress
delaycompress
notifempty
create 0644 sms_user sms_group
sharedscripts
postrotate
systemctl reload sms_c || true
endscript
}

Reiniciar a Aplicação

Reinício Gracioso (zero downtime em cluster):

# Reinicie um nó de cada vez
systemctl restart sms_c

# Aguarde o nó se juntar ao cluster
# Repita para cada nó

Reinício de Emergência (todos os nós):

systemctl restart sms_c

Após o Reinício:

  • Verifique se todos os frontends se reconectam
  • Verifique o Prometheus para continuidade de métricas
  • Monitore logs para erros
  • Verifique se o processamento de mensagens é retomado

Backup e Recuperação

O que Fazer Backup

  1. Arquivos de Configuração:

    • config/runtime.exs
    • config/config.exs
    • config/prod.exs (se existir)
  2. Tabelas de Roteamento (Mnesia):

    • Exportar via Interface da Web
    • Ou comando de backup do Mnesia
  3. Banco de Dados SQL CDR:

    • Backup completo diário
    • Backups de log de transações (contínuos)
  4. Certificados TLS:

    • priv/cert/*.crt
    • priv/cert/*.key

Procedimentos de Backup

Backup Diário de Configuração:

#!/bin/bash
# /opt/sms_c/scripts/backup_config.sh

BACKUP_DIR="/var/backups/sms_c/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR

# Backup de configuração
cp -r /opt/sms_c/config $BACKUP_DIR/

# Backup de certificados
cp -r /opt/sms_c/priv/cert $BACKUP_DIR/

# Definir permissões
chmod 600 $BACKUP_DIR/cert/*

echo "Backup de configuração concluído: $BACKUP_DIR"

Backup do Banco de Dados:

#!/bin/bash
# /opt/sms_c/scripts/backup_database.sh

BACKUP_DIR="/var/backups/sms_c/database"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p $BACKUP_DIR

# Backup do banco de dados SQL CDR
# MySQL/MariaDB: Use mysqldump com --single-transaction para consistência
# PostgreSQL: Use pg_dump -F c para formato personalizado

# Estrutura de exemplo (adapte ao seu banco de dados):
# - Use a ferramenta de backup apropriada (mysqldump, pg_dump)
# - Habilite backups seguros para consistência
# - Comprimir saída para economizar espaço
# - Configurar período de retenção (por exemplo, 30 dias)

# Remover backups antigos
find $BACKUP_DIR -name "sms_c_*.gz" -mtime +30 -delete

echo "Backup do banco de dados concluído: sms_c_${DATE}"

Backup da Tabela de Roteamento:

#!/bin/bash
# /opt/sms_c/scripts/backup_routes.sh

BACKUP_DIR="/var/backups/sms_c/routes"
DATE=$(date +%Y%m%d)

mkdir -p $BACKUP_DIR

# Exportar via API
curl https://api.example.com:8443/api/routes/export \
> $BACKUP_DIR/routes_${DATE}.json

echo "Backup das rotas concluído: routes_${DATE}.json"

Agendar Backups (crontab):

# Diário às 2 AM
0 2 * * * /opt/sms_c/scripts/backup_config.sh
0 2 * * * /opt/sms_c/scripts/backup_database.sh
0 2 * * * /opt/sms_c/scripts/backup_routes.sh

Procedimentos de Recuperação

Restaurar Configuração:

# Parar aplicação
systemctl stop sms_c

# Restaurar arquivos de configuração
cp -r /var/backups/sms_c/20251030/config/* /opt/sms_c/config/

# Restaurar certificados
cp -r /var/backups/sms_c/20251030/cert/* /opt/sms_c/priv/cert/

# Iniciar aplicação
systemctl start sms_c

Restaurar Banco de Dados SQL CDR:

Use as ferramentas de restauração apropriadas para seu banco de dados:

  • MySQL/MariaDB: Descompactar e canalizar para o cliente mysql
  • PostgreSQL: Use pg_restore com dumps de formato personalizado

Importante: Pare a aplicação SMS-C antes de restaurar o banco de dados para evitar conflitos de dados.

Restaurar Tabelas de Roteamento:

  1. Navegue até a Interface da Web /sms_routing
  2. Clique em "Importar Rotas"
  3. Selecione o arquivo JSON de backup
  4. Escolha o modo "Substituir"
  5. Confirme a importação

Planejamento de Capacidade

Monitorar Tendências de Crescimento

Tendência de Volume de Mensagens:

Consulta do Prometheus (média de 30 dias):

avg_over_time(sms_c_message_received_count[30d])

Taxa de Crescimento do Banco de Dados:

-- Crescimento de dados mensal
SELECT
DATE_FORMAT(inserted_at, '%Y-%m') AS month,
COUNT(*) AS message_count,
ROUND(SUM(LENGTH(message_body)) / 1024 / 1024, 2) AS data_mb
FROM message_queues
GROUP BY month
ORDER BY month DESC
LIMIT 12;

Indicadores de Capacidade

Uso de CPU:

  • Normal: < 50% em média
  • Alto: > 70% sustentado
  • Crítico: > 90%

Uso de Memória:

  • Normal: < 70% do disponível
  • Alto: > 80%
  • Crítico: > 90%

Uso de Disco:

  • Normal: < 60% cheio
  • Alto: > 75%
  • Crítico: > 85%

Profundidade da Fila:

  • Normal: < 1000 pendentes
  • Alto: > 5000 pendentes
  • Crítico: > 10.000 pendentes

Recomendações de Escalonamento

Quando Escalonar Verticalmente (Atualizar Recursos):

  • CPU consistentemente > 70%
  • Memória consistentemente > 80%
  • Gargalo em um único nó

Quando Escalonar Horizontalmente (Adicionar Nós):

  • CPU > 50% em todos os nós
  • Volume de mensagens > 5.000 msg/sec
  • Distribuição geográfica necessária
  • Alta disponibilidade requerida

Escalonamento do Banco de Dados:

  • Réplicas de leitura para consultas de relatórios
  • Otimização de pool de conexões
  • Otimização de índices
  • Particionar tabelas grandes por data

Resposta a Incidentes

Níveis de Severidade

Crítico (Resposta Imediata):

  • Nenhuma mensagem sendo entregue
  • Todos os frontends desconectados
  • Banco de dados indisponível
  • API completamente fora do ar

Alto (Resposta em até 1 hora):

  • Taxa de sucesso de entrega < 80%
  • Vários frontends desconectados
  • Falhas de roteamento > 10%
  • Fila de pendências crescendo

Médio (Resposta em até 4 horas):

  • Um único frontend desconectado
  • Taxa de sucesso de entrega 80-95%
  • Processamento de mensagens lento
  • Consultas ENUM falhando

Baixo (Resposta em até 24 horas):

  • Degradação de desempenho menor
  • Problema em uma única rota
  • Alertas de aviso não críticos

Checklist de Incidentes

1. Avaliar Severidade:

  • Verifique os alertas do Prometheus
  • Revise as métricas do painel
  • Verifique o status da fila de mensagens
  • Verifique as conexões do frontend

2. Coletar Informações:

  • Alterações recentes na configuração?
  • Implantações recentes?
  • Status de dependências externas (OCS, DNS)?
  • Mensagens de erro nos logs?

3. Ações Imediatas:

  • Pare as alterações em andamento
  • Reverta implantações recentes se suspeitar da causa
  • Habilite logs detalhados se necessário
  • Notifique as partes interessadas

4. Investigação:

  • Revise os logs da aplicação
  • Verifique o uso de recursos do sistema
  • Examine o desempenho do banco de dados
  • Teste dependências externas

5. Resolução:

  • Aplique a correção
  • Teste no simulador
  • Implante em produção
  • Monitore para melhorias

6. Pós-Incidente:

  • Documente a causa raiz
  • Atualize monitoramento/alertas
  • Implemente medidas preventivas
  • Atualize os runbooks

Incidentes Comuns

Alta Pendência na Fila:

  1. Verifique a taxa de sucesso de entrega
  2. Verifique se os frontends estão conectados e consultando
  3. Verifique o desempenho do banco de dados
  4. Revise o Prometheus em busca de gargalos
  5. Considere aumentar o tamanho do lote/intervalo

Falhas de Roteamento:

  1. Revise a configuração de roteamento
  2. Teste no simulador de roteamento
  3. Verifique se há rotas ausentes
  4. Verifique se a rota catch-all existe
  5. Verifique os logs de eventos para razões de falha

Desconexões de Frontend:

  1. Verifique o status do sistema do frontend
  2. Verifique a conectividade de rede
  3. Revise os logs do frontend
  4. Teste o registro manual da API
  5. Verifique as regras de firewall

Processamento de Mensagens Lento:

  1. Verifique o desempenho das consultas do banco de dados
  2. Revise a configuração do trabalhador de lotes
  3. Verifique se há recursos adequados (CPU/Memória)
  4. Verifique se há atrasos nas consultas ENUM
  5. Revise o desempenho do sistema de cobrança

Para procedimentos detalhados de solução de problemas, consulte o Guia de Solução de Problemas.