☕ Um Café no Bellacosa Mainframe
Gostou do conteúdo? Ajude a manter o café quente, o COBOL compilando e o mainframe acordado. 😄
☕ Pague um café ao Bellacosa

Translate

Mostrar mensagens com a etiqueta métricas. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta métricas. Mostrar todas as mensagens

sexta-feira, 10 de maio de 2024

Logging, Tracing & Metrics — O Caso dos Sinais Ocultos no Sistema

 

Bellacosa Mainframe e o caso dos sinais ocultos do sistema logging tracing e metrics

☕ Um Café no Bellacosa Mainframe

Logging, Tracing & Metrics — O Caso dos Sinais Ocultos no Sistema

A chuva caía sobre o CPD como se alguém tivesse submetido um JOB com TYPRUN=HOLD para o próprio céu.

Na sala de operações, monitores exibiam gráficos, mensagens, filas, tempos de resposta e alguns alertas vermelhos que ninguém queria encarar por muito tempo. O relógio marcava 02h17 da manhã quando o telefone tocou.

— Bellacosa, temos um problema.

Do outro lado da linha, um programador COBOL iniciante tentava controlar a ansiedade.

— Qual é o erro?

— Ainda não sabemos.

— O sistema caiu?

— Não exatamente.

— O CICS está fora?

— Não.

— O Db2 parou?

— Também não.

— Então qual é o problema?

Houve alguns segundos de silêncio.

— Os clientes estão reclamando que o sistema está lento.

Essa é uma das frases mais perigosas de qualquer ambiente de produção.

“Está lento” não é diagnóstico.

“Está lento” é uma pista.

Pode ser CPU, memória, rede, fila, programa COBOL, consulta SQL, contenção de recurso, timeout, deadlock, chamada externa, API, excesso de logging, problema em disco, indisponibilidade parcial ou até uma combinação de vários elementos.

Foi então que uma figura surgiu na porta do CPD usando um sobretudo escuro, segurando uma lupa em uma mão e uma caneca de café na outra.

— Elementar, meu caro Padawan — disse o investigador. — O sistema já contou o que aconteceu. O problema é que vocês ainda não aprenderam a ouvi-lo.

Assim começa nossa investigação sobre Logging, Tracing, Metrics e Observabilidade.

Para um programador COBOL iniciante, esses conceitos podem parecer assuntos exclusivos de Cloud, DevOps, Kubernetes ou microsserviços. Mas isso é um engano digno de um suspeito tentando desviar a atenção do detetive.

Observabilidade também pertence ao mundo do mainframe.

Ela está no DISPLAY do COBOL, nas mensagens do CICS, nos registros SMF, no SYSLOG, no JES, nas estatísticas do Db2, nas filas MQ, nos tempos de resposta e nos caminhos percorridos por uma transação.

O mainframe sempre produziu evidências.

Agora precisamos aprender a investigá-las.


O mistério central: o sistema está tentando falar

A frase que inspira esta investigação é:

What if the hidden signals in your system are screaming for attention?

Em português:

E se os sinais ocultos do seu sistema estiverem gritando por atenção?

Sistemas raramente falham sem aviso.

Antes de um incidente, normalmente surgem pequenos sintomas:

  • aumento de tempo de resposta;

  • crescimento de filas;

  • elevação da CPU;

  • redução do throughput;

  • aumento de erros intermitentes;

  • mensagens de timeout;

  • conexões abertas por tempo excessivo;

  • SQLCODEs incomuns;

  • maior consumo de memória;

  • crescimento anormal de logs;

  • transações aguardando recursos;

  • chamadas externas cada vez mais lentas.

Separadamente, esses sinais podem parecer irrelevantes.

Juntos, eles formam uma cena do crime.

O grande objetivo da observabilidade é transformar sinais isolados em uma narrativa compreensível.

Em outras palavras, observabilidade é a capacidade de olhar para o comportamento externo de um sistema e deduzir o que está acontecendo dentro dele.

É exatamente o que Sherlock Holmes faria.

Ele não precisava ter visto o crime acontecer. Analisava pegadas, cinzas de cigarro, marcas no chão, horários, testemunhos e objetos fora de lugar.

Na engenharia de software, fazemos algo parecido com:

  • logs;

  • métricas;

  • traces;

  • alertas;

  • eventos;

  • identificadores de correlação.

Cada um desses elementos revela uma parte da história.



Capítulo 1 — Logging: o diário secreto do sistema

Logs são registros de acontecimentos.

Eles respondem perguntas como:

  • O que aconteceu?

  • Quando aconteceu?

  • Onde aconteceu?

  • Qual módulo estava sendo executado?

  • Qual usuário iniciou a operação?

  • Qual foi o código de retorno?

  • Qual dado estava sendo processado?

  • Qual transação estava ativa?

Imagine um programa COBOL responsável por consultar o saldo de um cliente.

Um log simples poderia ser:

CONSULTA DE SALDO INICIADA

Isso é melhor do que nada, mas ajuda pouco.

Qual cliente?

Qual horário?

Qual transação?

Qual programa?

Qual resultado?

Um log mais útil seria:

2026-08-03 02:17:54
PROGRAMA=BCSALDO
TRANSACAO=BS01
CLIENTE=000123456
EVENTO=INICIO-CONSULTA

Depois:

2026-08-03 02:17:55
PROGRAMA=BCSALDO
TRANSACAO=BS01
CLIENTE=000123456
SQLCODE=0
TEMPO-DB2=245MS
EVENTO=CONSULTA-CONCLUIDA

Agora existe uma narrativa.

Sabemos quando começou, quando terminou, qual cliente foi consultado e quanto tempo o Db2 levou.

Se ocorrer um erro:

2026-08-03 02:17:56
PROGRAMA=BCSALDO
TRANSACAO=BS01
CLIENTE=000123456
SQLCODE=-911
EVENTO=ROLLBACK
MENSAGEM=DEADLOCK-OU-TIMEOUT

Esse registro se transforma em evidência.

O erro clássico: escrever logs inúteis

Programadores iniciantes frequentemente usam mensagens assim:

DISPLAY 'DEU ERRO'.

O problema é que “deu erro” não diz absolutamente nada.

Seria como Sherlock Holmes encontrar uma testemunha que afirma:

— Aconteceu alguma coisa.

E se recusa a explicar o quê.

Um log de qualidade precisa fornecer contexto.

Exemplo:

DISPLAY 'ERRO NO PROGRAMA BCPAGTO'
DISPLAY 'CLIENTE: ' WS-CLIENTE
DISPLAY 'CONTA: ' WS-CONTA
DISPLAY 'SQLCODE: ' SQLCODE
DISPLAY 'ETAPA: CONSULTA-SALDO'

Melhor ainda seria construir uma mensagem estruturada:

LEVEL=ERROR
PROGRAM=BCPAGTO
STEP=CONSULTA-SALDO
CLIENT=000123456
SQLCODE=-911
TRACE-ID=ABC987654

Esse formato é fácil de pesquisar e processar automaticamente.


Logs estruturados

Sistemas modernos preferem logs estruturados, frequentemente no formato JSON:

{
  "timestamp": "2026-08-03T02:17:56",
  "level": "ERROR",
  "program": "BCPAGTO",
  "transaction": "PG01",
  "customer": "000123456",
  "sqlcode": -911,
  "traceId": "ABC987654",
  "message": "Rollback após deadlock"
}

Um programa COBOL tradicional pode não gerar JSON diretamente, mas isso não impede o uso do conceito.

O importante é manter um padrão previsível.

Por exemplo:

TIMESTAMP=20260803021756|LEVEL=ERROR|PGM=BCPAGTO|SQLCODE=-911

Depois, ferramentas de integração podem transformar esse conteúdo em formatos modernos.


Logging no mundo mainframe

No ecossistema IBM Z, os logs estão espalhados por vários lugares:

  • SYSOUT do JES;

  • spool;

  • mensagens do programa COBOL;

  • registros SMF;

  • CICS transient data queues;

  • CICS logs;

  • mensagens de Db2;

  • logs do MQ;

  • SYSLOG;

  • arquivos sequenciais;

  • datasets de auditoria;

  • mensagens RACF;

  • registros de middleware;

  • logs do z/OS Connect;

  • relatórios de ferramentas de monitoramento.

Para um iniciante, isso pode parecer fragmentado.

Mas o mainframe trabalha assim porque cada subsistema tem responsabilidades específicas.

O desafio moderno é correlacionar essas fontes.



Capítulo 2 — Metrics: os números que denunciam o comportamento

Se logs contam histórias, métricas contam números.

Uma métrica é uma medida quantitativa coletada ao longo do tempo.

Exemplos:

CPU = 78%
MEMORIA = 64%
TPS = 1.250
LATENCIA-MEDIA = 220MS
ERROS-POR-MINUTO = 35
FILA-MQ = 4.820

Métricas respondem perguntas como:

  • O sistema está mais lento que ontem?

  • A quantidade de erros está crescendo?

  • A CPU está próxima do limite?

  • A fila está acumulando mensagens?

  • O número de transações aumentou?

  • Qual é o tempo médio de resposta?

  • O comportamento atual é normal?

A grande vantagem das métricas é a capacidade de agregação.

Você não precisa guardar todos os detalhes de cada requisição para saber que a média de latência aumentou de 200 milissegundos para 3 segundos.


Média pode enganar

Vamos investigar dois cenários.

Cenário A

Cinco requisições:

100ms
110ms
120ms
130ms
140ms

Média:

120ms

Tudo parece normal.

Cenário B

Cinco requisições:

50ms
50ms
50ms
50ms
4000ms

Média:

840ms

A média revela um problema, mas não explica que apenas uma requisição foi extremamente lenta.

Agora imagine mil requisições.

A média pode esconder comportamentos importantes.

Por isso usamos percentis.


Percentis: P50, P95 e P99

O percentil indica o valor abaixo do qual determinada porcentagem das observações se encontra.

P50

Metade das requisições foi mais rápida que esse valor.

Também é conhecido como mediana.

P95

95% das requisições foram concluídas abaixo desse tempo.

Os 5% restantes foram mais lentos.

P99

99% das requisições ficaram abaixo desse valor.

O 1% restante representa os casos extremos.

Exemplo:

P50 = 180ms
P95 = 950ms
P99 = 4200ms

A média poderia ser 300 milissegundos, dando a impressão de que tudo está saudável.

Mas o P99 mostra que alguns usuários estão esperando mais de quatro segundos.

Para o negócio, esse detalhe pode ser crítico.


Métricas importantes para COBOL e mainframe

Um programador COBOL deveria começar a conhecer:

  • quantidade de registros processados;

  • tempo de execução do JOB;

  • quantidade de commits;

  • quantidade de rollbacks;

  • leituras de arquivos;

  • gravações;

  • registros rejeitados;

  • SQLCODEs diferentes de zero;

  • tempo gasto em Db2;

  • tempo gasto em VSAM;

  • número de transações CICS;

  • tempo médio de resposta;

  • uso de CPU;

  • consumo de zIIP;

  • filas MQ;

  • abends;

  • quantidade de retries;

  • taxa de sucesso;

  • taxa de erro.

Em um programa batch, métricas podem ser exibidas no final:

REGISTROS-LIDOS......: 001000000
REGISTROS-VALIDOS....: 000998500
REGISTROS-REJEITADOS.: 000001500
COMMITS..............: 000001000
TEMPO-TOTAL..........: 00:08:32

Isso é observabilidade.

Talvez não esteja em um dashboard sofisticado, mas o princípio é o mesmo.



Capítulo 3 — Tracing: seguindo as pegadas da requisição

Tracing é o acompanhamento completo de uma solicitação através de vários componentes.

Imagine uma compra realizada por aplicativo:

Usuário
↓
Aplicativo Mobile
↓
API Gateway
↓
Serviço de Pedido
↓
Serviço de Pagamento
↓
z/OS Connect
↓
CICS
↓
Programa COBOL
↓
Db2
↓
MQ
↓
Resposta

O usuário reclama:

— Minha compra levou oito segundos.

Onde o tempo foi consumido?

Sem tracing, cada equipe olha apenas para sua parte.

A equipe do aplicativo diz:

— O mobile enviou a requisição corretamente.

A equipe da API diz:

— Recebemos e encaminhamos.

A equipe do CICS diz:

— A transação terminou.

A equipe do Db2 diz:

— A consulta executou.

Todos parecem inocentes.

Mas o usuário esperou oito segundos.

O tracing conecta as etapas.


Trace e Span

Um trace representa toda a jornada de uma requisição.

Um span representa uma etapa dessa jornada.

Exemplo:

TRACE ABC123
├── SPAN 01: Mobile App............. 50ms
├── SPAN 02: API Gateway............ 40ms
├── SPAN 03: Serviço Pagamento...... 90ms
├── SPAN 04: z/OS Connect........... 45ms
├── SPAN 05: CICS................... 80ms
├── SPAN 06: Programa COBOL......... 70ms
├── SPAN 07: Db2.................. 7200ms
└── SPAN 08: Resposta............... 60ms

Pronto.

O culpado apareceu.

O Db2 consumiu 7,2 segundos.

Mas o caso ainda não terminou.

Por que o Db2 demorou?

Pode ter sido:

  • lock;

  • deadlock;

  • índice ausente;

  • estatísticas desatualizadas;

  • plano de acesso ruim;

  • tabela muito grande;

  • contenção;

  • excesso de concorrência;

  • I/O;

  • consulta mal construída.

O trace localiza a região do problema.

Os logs fornecem detalhes.

As métricas mostram se é um caso isolado ou uma tendência.

É por isso que os três pilares precisam trabalhar juntos.


Capítulo 4 — A grande correlação

O segredo mais importante da observabilidade moderna é a correlação.

Sem correlação, você possui milhares de logs, métricas e traces desconectados.

Com correlação, cada evidência aponta para o mesmo caso.

Para isso usamos identificadores como:

  • Trace ID;

  • Span ID;

  • Request ID;

  • Correlation ID;

  • Transaction ID;

  • Session ID.

Exemplo:

TRACE-ID=ABC123

Esse mesmo valor aparece:

No API Gateway
No serviço Java
No z/OS Connect
No CICS
No programa COBOL
No log do Db2
Na resposta ao cliente

Agora o investigador pode pesquisar ABC123 e reconstruir toda a operação.


Como levar um Correlation ID até o COBOL

Um possível fluxo seria:

Aplicativo cria Request ID
↓
API Gateway recebe o ID
↓
Cabeçalho HTTP transporta o valor
↓
z/OS Connect encaminha
↓
CICS recebe
↓
COMMAREA ou Channel/Container armazena
↓
Programa COBOL lê
↓
Programa grava o ID nos logs

Exemplo conceitual de campo COBOL:

01  WS-CORRELATION-ID     PIC X(36).

Durante o processamento:

DISPLAY 'TRACE-ID=' WS-CORRELATION-ID
        ' PROGRAMA=BCPAGTO'
        ' ETAPA=VALIDACAO'.

Assim, o programa COBOL deixa de ser uma caixa isolada dentro da arquitetura.

Ele passa a participar da observabilidade ponta a ponta.


Capítulo 5 — OpenTelemetry: o tradutor universal

Na imagem aparece o OpenTelemetry, frequentemente abreviado como OTel.

O OpenTelemetry é um conjunto de padrões, bibliotecas, APIs, SDKs e componentes para coletar telemetria.

Telemetria é o conjunto de sinais produzidos pelo sistema:

  • métricas;

  • traces;

  • logs.

Uma das grandes vantagens do OpenTelemetry é evitar dependência excessiva de um único fornecedor.

A aplicação gera dados em um padrão conhecido.

Depois, esses dados podem ser enviados para diferentes plataformas.



Auto instrumentation

A imagem mostra:

OTel auto instrumentation
OTel API
OTel SDK

Auto instrumentation

Instrumentação automática.

A ferramenta observa bibliotecas, frameworks e chamadas comuns sem exigir muitas alterações no código.

É útil em Java, .NET, Python, Node.js e outras plataformas.

OTel API

A API define como a aplicação cria spans, métricas e eventos.

OTel SDK

O SDK implementa a coleta, processamento e exportação dos dados.

No mundo COBOL, a instrumentação pode depender mais da arquitetura, do middleware e das ferramentas disponíveis.

Mesmo assim, a aplicação COBOL pode participar fornecendo:

  • IDs de correlação;

  • timestamps;

  • códigos de retorno;

  • métricas do processamento;

  • eventos relevantes;

  • contexto de negócio.



OpenTelemetry Collector

O Collector funciona como uma central de triagem.

Imagine a Scotland Yard da telemetria.

Ele recebe sinais de vários serviços, processa, filtra e encaminha.

Fluxo:

Aplicação
↓
OpenTelemetry Collector
↓
Grafana / Jaeger / Elastic / Backend APM

O Collector pode:

  • receber dados;

  • remover informações sensíveis;

  • adicionar metadados;

  • agrupar registros;

  • aplicar filtros;

  • controlar volume;

  • encaminhar para vários destinos;

  • reduzir dependência de agentes proprietários.



Capítulo 6 — Prometheus, Grafana, Elasticsearch, Kibana e Jaeger

A imagem apresenta várias ferramentas.

Vamos colocar cada suspeito na sala de interrogatório.


Prometheus

Prometheus é amplamente utilizado para coletar e armazenar métricas em séries temporais.

Uma série temporal é um conjunto de valores registrados ao longo do tempo.

Exemplo:

10:00 CPU=45%
10:01 CPU=48%
10:02 CPU=60%
10:03 CPU=82%
10:04 CPU=94%

O valor isolado de 94% é importante.

Mas a evolução também é importante.

Se a CPU subiu continuamente durante quatro minutos, existe uma tendência.

Prometheus trabalha muito bem com esse tipo de dado.


Grafana

Grafana é uma plataforma de visualização.

Ele transforma números em dashboards.

Um dashboard pode exibir:

  • TPS;

  • erros por minuto;

  • latência;

  • uso de CPU;

  • consumo de memória;

  • volume de transações;

  • filas;

  • disponibilidade;

  • P95;

  • P99;

  • status de serviços.

Uma curiosidade importante:

Grafana não é necessariamente o local onde os dados são coletados.

Ele normalmente consulta outras fontes.

É o painel do detetive, não o local do crime.


Alertmanager

Alertmanager gerencia alertas.

Exemplo:

Se erro > 5% durante 10 minutos:
    enviar mensagem para equipe
    abrir incidente
    registrar severidade

Um bom alerta precisa evitar dois extremos:

Silêncio excessivo

O problema acontece e ninguém é avisado.

Tempestade de alertas

A equipe recebe centenas de mensagens e deixa de prestar atenção.

Esse fenômeno é chamado de alert fatigue, ou fadiga de alertas.

Um alerta útil deve ser:

  • acionável;

  • contextualizado;

  • relevante;

  • direcionado à equipe correta;

  • baseado em condição persistente;

  • vinculado a um procedimento.


Elasticsearch

Elasticsearch é usado para indexação e pesquisa de grandes volumes de dados, especialmente logs.

Com ele, podemos pesquisar:

SQLCODE=-911

ou:

PROGRAM=BCPAGTO AND LEVEL=ERROR

ou:

TRACE-ID=ABC123

Ele permite encontrar rapidamente eventos em enormes conjuntos de registros.


Kibana

Kibana é muito usado para visualizar e explorar dados armazenados no Elasticsearch.

Com ele, podemos criar:

  • dashboards;

  • filtros;

  • gráficos;

  • pesquisas;

  • análises;

  • painéis de erros.

A dupla Elasticsearch e Kibana tornou-se famosa em arquiteturas de logging centralizado.


Jaeger

Jaeger é uma plataforma voltada para tracing distribuído.

Ela mostra visualmente o caminho de uma requisição.

Em vez de apenas saber que o sistema demorou quatro segundos, você enxerga onde cada milissegundo foi consumido.

Para um ambiente híbrido envolvendo Cloud e IBM Z, essa visão é extremamente valiosa.


Capítulo 7 — Observabilidade não é apenas monitoramento

Monitoramento e observabilidade são relacionados, mas não são idênticos.

Monitoramento

Pergunta:

O sistema está funcionando?

Exemplos:

  • servidor disponível;

  • CPU abaixo de 80%;

  • serviço respondendo;

  • disco com espaço;

  • CICS ativo.

Observabilidade

Pergunta:

Por que o sistema está se comportando dessa maneira?

A observabilidade permite investigar situações desconhecidas.

O monitoramento costuma trabalhar com problemas previamente imaginados.

Exemplo:

Se CPU > 90%, alertar.

Mas e se a CPU estiver em 40% e o sistema estiver lento?

O alerta não dispara.

A observabilidade permite explorar os dados e descobrir que:

  • uma API externa está demorando;

  • uma fila está crescendo;

  • um lock está bloqueando transações;

  • um plano SQL mudou;

  • o logging síncrono está atrasando o processamento.

A observabilidade não elimina o monitoramento.

Ela o amplia.


Capítulo 8 — Caso prático: o PIX fantasma

Vamos investigar um cenário completo.

Um cliente tenta realizar um PIX.

Arquitetura:

Aplicativo
↓
API Gateway
↓
Serviço de Autenticação
↓
Serviço Antifraude
↓
z/OS Connect
↓
CICS
↓
COBOL
↓
Db2
↓
MQ
↓
Resposta

O cliente recebe timeout.

Primeira pista: métrica

O dashboard mostra:

Latência P95:
Antes: 800ms
Agora: 6.500ms

A taxa de erro aumentou para 8%.

A métrica confirma que não é um caso isolado.

Segunda pista: trace

O trace mostra:

API Gateway.............. 30ms
Autenticação............. 70ms
Antifraude............... 90ms
z/OS Connect............. 40ms
CICS..................... 60ms
COBOL.................... 50ms
MQ..................... 5800ms

O gargalo está no MQ.

Terceira pista: logs

Os logs mostram:

MQRC=2053
REASON=QUEUE-FULL
QUEUE=PIX.OUTBOUND

Agora temos a causa provável.

A fila atingiu sua capacidade.

Quarta pista: investigação operacional

Por que a fila encheu?

Outro log mostra que o consumidor externo estava indisponível.

Conclusão:

Consumidor externo indisponível
↓
Mensagens acumuladas
↓
Fila MQ cheia
↓
Programa COBOL aguardando ou falhando
↓
Transações mais lentas
↓
Timeout no aplicativo

Sem observabilidade, cada equipe poderia culpar a outra.

Com métricas, traces e logs correlacionados, a investigação torna-se objetiva.



Capítulo 9 — Passo a passo para começar

Um programador COBOL iniciante não precisa implementar uma plataforma inteira no primeiro dia.

O caminho deve ser gradual.


Passo 1 — Identifique operações importantes

Liste as etapas críticas do programa.

Exemplo:

INICIO
VALIDACAO
LEITURA-ARQUIVO
CONSULTA-DB2
ATUALIZACAO
COMMIT
FIM

Esses pontos serão usados como marcos.


Passo 2 — Padronize os logs

Evite mensagens aleatórias.

Use um formato consistente:

DATA-HORA
PROGRAMA
ETAPA
NIVEL
CORRELATION-ID
CODIGO-RETORNO
MENSAGEM

Exemplo:

20260803-021754|INFO|BCPAGTO|INICIO|TRACE=ABC123|RC=0000

Passo 3 — Registre apenas o necessário

Não transforme o programa em uma metralhadora de DISPLAY.

Logging excessivo pode:

  • consumir CPU;

  • aumentar I/O;

  • encher spool;

  • dificultar pesquisa;

  • expor dados sensíveis;

  • aumentar custos;

  • esconder mensagens importantes.

Registre eventos relevantes.


Passo 4 — Crie métricas de negócio

Não monitore apenas infraestrutura.

Inclua indicadores do processo.

Exemplos:

  • pagamentos processados;

  • pagamentos recusados;

  • clientes validados;

  • registros rejeitados;

  • transações concluídas;

  • fraudes detectadas.

Uma CPU saudável não significa que o negócio está funcionando.

O sistema pode estar disponível e, ainda assim, rejeitar todos os pagamentos.


Passo 5 — Meça duração

Registre horário de início e fim.

Exemplo conceitual:

INICIO=02:17:54.100
FIM=02:17:54.850
DURACAO=750MS

Faça isso para etapas críticas.

Assim você poderá descobrir onde o tempo está sendo consumido.


Passo 6 — Adote um identificador de correlação

Cada requisição deve possuir um identificador único.

Exemplo:

TRACE-ID=PX202608030000123456

Propague esse valor entre as camadas.


Passo 7 — Defina alertas úteis

Exemplo ruim:

Alertar quando ocorrer um erro.

Isso pode gerar milhares de alertas.

Exemplo melhor:

Alertar quando a taxa de erro ultrapassar 5%
durante 10 minutos.

Outro exemplo:

Alertar quando o P95 superar 2 segundos
por 5 minutos consecutivos.

Passo 8 — Crie um runbook

Um runbook é um roteiro operacional.

Exemplo:

ALERTA: FILA MQ ACIMA DE 80%

1. Verificar profundidade da fila.
2. Verificar consumidor.
3. Verificar mensagens presas.
4. Confirmar conectividade.
5. Avaliar expansão temporária.
6. Acionar equipe responsável.

Um alerta sem orientação apenas transfere o problema para outra pessoa.


Passo 9 — Revise depois do incidente

Após resolver, pergunte:

  • O alerta chegou cedo?

  • Os logs eram suficientes?

  • O Trace ID estava disponível?

  • A métrica correta existia?

  • Houve excesso de ruído?

  • O runbook ajudou?

  • Poderíamos detectar antes?

Observabilidade é melhoria contínua.



Capítulo 10 — Boas práticas fundamentais

Nunca registre senhas

Nem em testes.

Nem temporariamente.

Nem “só para depurar”.

Também evite registrar:

  • CPF completo;

  • cartão;

  • CVV;

  • tokens;

  • segredos;

  • chaves;

  • dados médicos;

  • informações bancárias sensíveis.

Use mascaramento:

CPF=***.***.***-45
CARTAO=****-****-****-1234

Use níveis de log

Um modelo comum:

DEBUG

Detalhes para investigação técnica.

INFO

Eventos normais importantes.

WARN

Situação incomum, mas não fatal.

ERROR

Falha que afetou uma operação.

FATAL

Problema grave que impede continuidade.

Nem todo evento deve ser ERROR.

Caso contrário, ninguém saberá diferenciar uma falha crítica de uma condição comum.


Evite mensagens ambíguas

Ruim:

ERRO NA TABELA

Bom:

ERRO AO ATUALIZAR TABELA CLIENTE
SQLCODE=-803
CHAVE=000123456
TRACE-ID=ABC123

Inclua contexto de negócio

Um log puramente técnico pode ser insuficiente.

Exemplo técnico:

SQLCODE=-803

Exemplo enriquecido:

OPERACAO=CADASTRO-CLIENTE
RESULTADO=DUPLICIDADE
SQLCODE=-803
CLIENTE=000123456

Agora a equipe de negócio também entende o impacto.


Curiosidades do arquivo secreto

Curiosidade 1 — O mainframe já praticava observabilidade antes do termo ficar famoso

Muito antes de OpenTelemetry e microsserviços, ambientes mainframe já utilizavam:

  • SMF;

  • RMF;

  • SYSLOG;

  • dumps;

  • traces;

  • estatísticas de subsistemas;

  • relatórios de performance;

  • mensagens JES;

  • monitoramento CICS;

  • auditoria RACF.

O nome moderno mudou, mas a necessidade sempre existiu.


Curiosidade 2 — Um log pode causar o problema que tenta investigar

Logging excessivo pode aumentar:

  • I/O;

  • CPU;

  • armazenamento;

  • latência;

  • contenção.

Em alguns incidentes, ativar logging detalhado em produção piora o desempenho.

É como acender tantas luzes na cena do crime que o gerador elétrico entra em colapso.


Curiosidade 3 — Tracing completo pode ser caro

Registrar cada requisição em sistemas de altíssimo volume produz enormes quantidades de dados.

Por isso usamos sampling.

Sampling significa coletar apenas uma amostra.

Exemplo:

Coletar 1% dos traces normais.
Coletar 100% dos traces com erro.
Coletar 100% dos traces acima de 2 segundos.

Essa estratégia reduz custo sem perder sinais importantes.


Curiosidade 4 — O usuário percebe o P99

A equipe técnica pode comemorar uma média de 200 milissegundos.

Mas o cliente que recebeu uma resposta em oito segundos não se importa com a média.

Para ele, o sistema foi lento.

É por isso que percentis são tão importantes.


Easter eggs para o Padawan

Primeiro easter egg:

Quando um sistema apresenta erros intermitentes, lembre-se do cão que não latiu.

Em uma famosa investigação de Sherlock Holmes, a ausência de uma reação foi a pista principal.

Na observabilidade também precisamos analisar o que não aconteceu.

Exemplo:

  • o programa iniciou, mas não registrou o fim;

  • a mensagem entrou na fila, mas não saiu;

  • houve chamada ao Db2, mas não houve commit;

  • o serviço recebeu a requisição, mas não retornou resposta.

A ausência de um evento esperado pode ser mais importante do que um erro explícito.

Segundo easter egg:

Se encontrar a identificação 221B em algum exemplo de Trace ID, não é coincidência.

TRACE-ID=221B-BAKER-STREET

Terceiro easter egg:

Todo investigador de sistemas deveria desconfiar da frase:

“Não mudamos nada.”

Quase sempre alguma coisa mudou:

  • volume;

  • configuração;

  • dependência;

  • certificado;

  • plano SQL;

  • estatística;

  • carga;

  • rede;

  • comportamento do usuário;

  • versão externa;

  • horário de processamento.

Mesmo quando o código não mudou, o ambiente pode ter mudado.


O método Sherlock Holmes aplicado à produção

Podemos adaptar o método investigativo em sete etapas.

1. Observar

Colete evidências sem tirar conclusões prematuras.

2. Estabelecer a linha do tempo

Descubra quando o comportamento começou.

3. Correlacionar

Relacione logs, métricas, traces e mudanças recentes.

4. Formular hipóteses

Exemplo:

A lentidão pode estar sendo causada pela fila MQ.

5. Testar

Verifique profundidade da fila, consumidor e tempo de espera.

6. Eliminar hipóteses impossíveis

Se o Db2 respondeu em 20 milissegundos, provavelmente não é o gargalo principal.

7. Confirmar causa raiz

Não pare no primeiro sintoma.

Fila cheia é sintoma.

Consumidor indisponível pode ser a causa.

Certificado expirado no consumidor pode ser a causa raiz.


Conclusão — O sistema sempre deixa pegadas

Quando entramos no CPD, tínhamos apenas uma reclamação:

“O sistema está lento.”

Depois da investigação, descobrimos que essa frase escondia uma cadeia de evidências.

As métricas mostraram que a latência aumentava.

Os traces revelaram em qual componente o tempo era consumido.

Os logs explicaram o erro.

O identificador de correlação conectou todas as etapas.

O alerta chamou a equipe.

O runbook orientou a resposta.

E a revisão posterior transformou o incidente em aprendizado.

Esse é o verdadeiro valor da observabilidade.

Logging, tracing e metrics não são três tecnologias isoladas.

São três testemunhas.

Cada uma viu uma parte do caso.

O log afirma:

“Eu sei o que aconteceu.”

A métrica declara:

“Eu sei com que frequência e intensidade aconteceu.”

O trace completa:

“Eu sei por onde a requisição passou.”

Quando as três testemunhas são interrogadas juntas, o sistema deixa de ser uma caixa-preta.

Para o programador COBOL iniciante, a grande lição é simples: não escreva programas que apenas processem dados. Escreva programas capazes de explicar o próprio comportamento.

Registre o início.

Registre o fim.

Registre a etapa.

Registre o código de retorno.

Meça o tempo.

Conte os registros.

Propague um identificador.

Proteja dados sensíveis.

Produza evidências úteis.

Porque, quando o incidente acontecer às 02h17 da manhã — e algum dia ele acontecerá — você não desejará encontrar apenas um DISPLAY 'DEU ERRO' abandonado no spool.

Você desejará encontrar uma trilha completa de pegadas digitais.

Sherlock Holmes fechou o relatório, tomou o último gole de café e olhou para o jovem programador COBOL.

— Agora entende?

— Acho que sim. Observabilidade é descobrir o que o sistema está tentando nos contar.

O investigador sorriu.

— Não exatamente.

— Então o que é?

— É garantir que, quando o sistema falar, ele tenha algo útil a dizer.

No monitor principal, a transação voltou ao tempo normal.

O alerta vermelho desapareceu.

E, em algum lugar entre o CICS, o Db2 e uma fila MQ, um pequeno Trace ID chamado 221B-BAKER-STREET continuou seguindo silenciosamente as pegadas da próxima requisição.

sábado, 22 de abril de 2023

🔭 ALAN TURING E O SDSF DOS AGENTES — O QUE DIABOS A INTELIGÊNCIA ARTIFICIAL ESTÁ FAZENDO AGORA?

 

Bellacosa Mainframe monitorando a ia

☕ UM CAFÉ NO BELLACOSA MAINFRAME

🔭 ALAN TURING E O SDSF DOS AGENTES — O QUE DIABOS A INTELIGÊNCIA ARTIFICIAL ESTÁ FAZENDO AGORA?

Observabilidade, logs, métricas, traces, spans, OpenTelemetry, tokens, custos, latência, estados, workflows, auditoria, SDSF, JES2, SMF, RMF, CICS — e o dia em que Alan Turing descobriu que “AGENT RUNNING...” era quase tão informativo quanto um operador responder “sei lá, está processando”.



🎬 PRÓLOGO — O ROBÔ ESTAVA “TRABALHANDO”

Alan Turing entrou novamente no CPD.

O pequeno agente de IA estava diante de um terminal.

Na tela:

AGENT STATUS
============

RUNNING...

Turing esperou.

Um minuto.

Dois minutos.

Cinco minutos.

Continuava:

RUNNING...

O jovem programador COBOL apareceu carregando café.

— Bom dia, professor.

Turing apontou para a tela.

— O que ele está fazendo?

— Trabalhando.

— Em quê?

— Não sei.

— Em qual etapa?

— Também não sei.

— Encontrou algum erro?

— Acho que não.

— Quanto já gastou?

— Não faço ideia.

— Está esperando alguma coisa?

— Talvez.

Turing olhou novamente para:

RUNNING...

e sentenciou:

— Então vocês construíram uma máquina capaz de tomar decisões, utilizar ferramentas e executar ações... mas colocaram nela a mesma lâmpada de “ocupado” de uma impressora de 1987?

Silêncio.

No fundo do CPD alguém apertou Enter tentando não rir.

Turing puxou uma cadeira.

— Abra o SDSF.

E assim começou nossa terceira aventura.



🏛️ CAPÍTULO 1 — NO MAINFRAME, “ESTÁ RODANDO” NUNCA FOI RESPOSTA SUFICIENTE

Imagine que você submeta:

//PAYROLL JOB ...
//STEP01  EXEC PGM=PAYCALC
//STEP02  EXEC PGM=REPORT
//STEP03  EXEC PGM=ARCHIVE

Você pergunta ao operador:

Como está o PAYROLL?

E ele responde:

Está fazendo coisas.

Provavelmente essa resposta não sobreviveria muitos minutos no CPD.

Queremos saber:

JOBNAME
JOBID
OWNER
STATUS
QUEUE
STEP
RETURN CODE
OUTPUT

O SDSF existe justamente nesse universo de monitorar e controlar processamento z/OS. A documentação da IBM descreve painéis capazes de acompanhar jobs desde a fila de entrada do JES, passando pelo processamento, até as filas de saída; o painel ST, por exemplo, é central para gerenciamento de jobs e output.

Podemos encontrar algo como:

JOBNAME   JOBID      OWNER      ST      CC
PAYROLL   JOB12345   BELLACOSA  OUTPUT  0000
FATURAM   JOB12346   FINANCE    OUTPUT  0008
BACKUP    JOB12347   OPERADOR   EXEC
REPORT    JOB12348   BELLACOSA  ABEND   S0C7

Isso muda tudo.

Não sabemos apenas:

“O computador está ocupado.”

Sabemos quem, o quê, onde e em qual estado.

É exatamente esse salto que precisamos fazer com agentes.



🤖 CAPÍTULO 2 — O AGENTE PRECISA DE UM JOBNAME

Imagine vários agentes corporativos:

AGENT-PAYROLL
AGENT-REPORT
AGENT-SUPPORT
AGENT-COBOL
AGENT-AUDIT

Agora imagine dezenas de execuções simultâneas.

Dizer:

AGENT RUNNING

é quase inútil.

Precisamos de identidade para a execução.

Por exemplo:

AGENT        RUN-ID       OWNER       STATUS
REPORT       A000471      VAGNER      RUNNING
COBOLSCAN    A000472      DEVTEAM     WAITING
SUPPORT      A000473      SERVICE     APPROVAL
PAYROLL      A000474      FINANCE     FAILED

Perceba a analogia:

JOBNAME  → AGENT/WORKFLOW
JOBID    → RUN-ID
OWNER    → USUÁRIO/SERVIÇO
STATUS   → ESTADO DO WORKFLOW

Não são equivalências técnicas perfeitas.

São equivalências conceituais.

E são extremamente úteis para pensar UX.

Porque quando alguém disser:

O agente fez besteira!

a primeira pergunta deveria ser:

Qual execução?



🚦 CAPÍTULO 3 — “RUNNING” NÃO É UM ESTADO SUFICIENTE

Um agente pode estar em situações completamente diferentes enquanto a interface simplesmente mostra:

RUNNING

Ele pode estar:

PLANNING
READING
WAITING_TOOL
EXECUTING_TOOL
RETRYING
WAITING_APPROVAL
PAUSED
ROLLING_BACK
COMPLETED
FAILED
CANCELLED

Isso importa muito.

Compare:

AGENT: REPORT
STATUS: RUNNING

com:

AGENT: REPORT
RUN-ID: A000471

OBJECTIVE:
Consolidar relatórios de setembro

CURRENT STATE:
WAITING_APPROVAL

CURRENT STEP:
5/7 - Enviar relatório financeiro

WAITING FOR:
Aprovação humana

WAIT TIME:
00:03:42

Agora sabemos o que está acontecendo.

Talvez o agente nem esteja consumindo processamento significativo.

Está simplesmente esperando alguém.

Uma boa interface precisa diferenciar:

TRABALHANDO

de:

ESPERANDO

e de:

TRAVADO

Parece óbvio.

Até você encontrar sistemas que tratam os três como:

PROCESSING...


🪵 CAPÍTULO 4 — LOG: O DIÁRIO DE BORDO

Primeiro instrumento da nossa caixa de observabilidade:

LOG.

Log é basicamente o registro de eventos ocorridos.

O OpenTelemetry define logs como registros de eventos e suporta informações estruturadas como timestamp, severidade, corpo, atributos e também identificadores de trace e span, permitindo correlação com outros sinais.

Um log simples:

10:01:03 Agent started
10:01:04 Reading report
10:01:12 Report loaded
10:01:13 Calling model
10:01:18 Analysis completed

Já ajuda.

Mas podemos fazer melhor.

timestamp=10:01:03
agent=REPORT
run_id=A000471
event=workflow.started
owner=VAGNER

Depois:

timestamp=10:01:12
agent=REPORT
run_id=A000471
event=file.read
file=REPORT-09
status=success
duration_ms=284

Agora temos structured logging.

Em vez de texto para seres humanos lerem manualmente, possuímos campos que sistemas podem consultar.

Podemos perguntar:

event = tool.error

ou:

run_id = A000471

ou:

duration_ms > 5000

Isso é tremendamente mais poderoso.


📜 CAPÍTULO 5 — O SYSOUT DO ROBÔ

Aqui o programador COBOL começa a sorrir.

Porque o conceito não é estranho.

Quando um job termina, frequentemente vamos investigar sua saída.

SDSF permite navegar pelos outputs de jobs e pelas informações de processamento; historicamente, muito output destinado ao JES sequer precisava ser fisicamente impresso — podia ser inspecionado no SDSF.

Nosso agente também deveria deixar evidências.

Algo como:

RUN A000471

AGENT........ REPORT
START........ 10:01:03
END.......... 10:02:44
DURATION..... 00:01:41

MODEL CALLS.. 4
TOOL CALLS... 7
FILES READ... 12
FILES WRITE.. 1
WARNINGS..... 2
ERRORS....... 0

RESULT........ COMPLETED_WITH_WARNINGS

Não precisamos literalmente transformar agentes em JES.

Mas precisamos abandonar a filosofia:

“Ele respondeu, então provavelmente deu tudo certo.”


📊 CAPÍTULO 6 — MÉTRICA NÃO É LOG

Turing escreve:

LOG
≠
METRIC

Log responde muito bem a:

O que aconteceu?

Métrica responde melhor a:

Quanto está acontecendo?

Por exemplo:

agent_runs_total = 15420
agent_failures_total = 327
average_duration = 18.4 s
tool_calls_total = 92481
approval_wait_time = 47.2 s
input_tokens = ...
output_tokens = ...

OpenTelemetry é hoje um framework vendor-neutral para instrumentar, gerar, coletar e exportar telemetria, incluindo traces, metrics e logs.

Para aplicações GenAI, suas convenções incluem atributos relacionados ao uso de tokens e identificação de workflows/agentes; essas convenções específicas continuam evoluindo, portanto não devemos tratá-las como uma pedra gravada para toda a eternidade.


💰 CAPÍTULO 7 — AGORA A TELEMETRIA TEM CONTA PARA PAGAR

No mainframe sempre aprendemos que recurso computacional custa.

CPU.

I/O.

Storage.

Elapsed time.

Consumo não é abstração filosófica.

Com IA, aparece outro recurso:

TOKENS

Uma execução pode fazer:

CALL 1 → modelo
CALL 2 → modelo
CALL 3 → ferramenta
CALL 4 → modelo
CALL 5 → ferramenta
CALL 6 → modelo

Talvez obtenha a resposta correta.

Mas quanto custou?

Um dashboard poderia mostrar:

RUN-ID............ A000471
MODEL CALLS....... 8
INPUT TOKENS...... 34,812
OUTPUT TOKENS..... 8,401
TOOL CALLS........ 14
DURATION.......... 01:47
ESTIMATED COST.... ...

As convenções de GenAI do OpenTelemetry contemplam métricas e atributos de uso de tokens; a observabilidade pode então ajudar a detectar prompts excessivamente grandes, regressões de latência e padrões de consumo.

E aqui aparece um velho fantasma mainframe:

EFICIÊNCIA.

Um agente que consegue resolver uma tarefa em:

3 chamadas

pode ser operacionalmente preferível a outro que precisa:

37 chamadas

mesmo que ambos terminem corretamente.


⏱️ CAPÍTULO 8 — LATÊNCIA: O AGENTE DEMOROU, MAS ONDE?

Imagine:

TOTAL = 18 segundos

Isso não nos diz muita coisa.

Talvez:

LLM............. 2 s
DATABASE........ 1 s
API............. 1 s
FILE............ 1 s

Então onde foram parar os outros 13 segundos?

Precisamos decompor.

É aí que entramos no mundo do distributed tracing.


🧵 CAPÍTULO 9 — TRACE: SIGA O FIO DE ARIADNE

Imagine uma execução completa:

Usuário
  ↓
Agente
  ↓
LLM
  ↓
Busca
  ↓
Db2
  ↓
LLM
  ↓
API
  ↓
Resultado

Um trace acompanha a operação através dessas etapas.

Dentro dele encontramos spans.

Podemos imaginar:

TRACE A000471
│
├─ SPAN 1 invoke_agent ........ 18.2s
│
├─ SPAN 2 plan ................  1.1s
│
├─ SPAN 3 model_call ..........  2.4s
│
├─ SPAN 4 search_documents ....  4.8s
│
│   ├─ SPAN 5 api_call ........  3.9s
│   └─ SPAN 6 parse ...........  0.7s
│
├─ SPAN 7 analyze .............  5.2s
│
└─ SPAN 8 write_report ........  1.4s

Agora descobrimos:

Ahá!

A busca documental está custando quase cinco segundos.

Um span representa uma execução individual de uma operação significativa dentro de um trace; as convenções do OpenTelemetry padronizam atributos para facilitar correlação entre tecnologias diferentes.


🔬 CAPÍTULO 10 — TRACE É O “QUAL STEP ESTÁ DEMORANDO?” DO MUNDO DISTRIBUÍDO

Um programador batch entende isso rapidamente.

Imagine:

STEP01  00:00:01
STEP02  00:00:02
STEP03  00:14:37
STEP04  00:00:01

Onde investigar?

Não precisa chamar Sherlock Holmes.

STEP03

Tracing faz algo conceitualmente semelhante em sistemas distribuídos.

Mas existe uma complicação.

Um agente pode decidir dinamicamente qual ferramenta chamar.

Portanto duas execuções do mesmo objetivo podem seguir caminhos diferentes.

RUN A
Agent
 ├─ LLM
 ├─ Search
 ├─ Db2
 └─ Report

enquanto:

RUN B
Agent
 ├─ LLM
 ├─ Search
 ├─ API
 ├─ Search novamente
 ├─ LLM
 └─ Report

Agora tracing deixa de ser luxo.

Torna-se instrumento para entender o caminho realmente escolhido.


🧠 CAPÍTULO 11 — O AGENTE POSSUI UM “STEP” QUE NÃO EXISTIA NO JCL

No JCL tradicional, normalmente declaramos etapas.

//STEP01 EXEC PGM=A
//STEP02 EXEC PGM=B
//STEP03 EXEC PGM=C

O agente pode raciocinar:

Talvez A.

Não.

Preciso consultar B.

Resultado incompleto.

Vou tentar C.

Agora preciso voltar para A.

Isso é poderoso.

Mas torna a execução menos previsível.

Portanto precisamos registrar:

OBJETIVO
↓
DECISÃO
↓
FERRAMENTA ESCOLHIDA
↓
RESULTADO
↓
PRÓXIMA DECISÃO

Não precisamos — nem devemos — exigir exposição irrestrita de raciocínio interno privado do modelo.

Precisamos registrar decisões e eventos operacionalmente relevantes.

Por exemplo:

STEP 4
ACTION: customer_lookup
REASON: Dados insuficientes para validar pedido
RESULT: 1 customer found
NEXT: order_lookup

Isso é auditável e útil sem transformar telemetria em uma descarga indiscriminada de conteúdo interno.


🔗 CAPÍTULO 12 — TRACE ID: O CPF DA EXECUÇÃO

Imagine receber:

ERROR 500

Fantástico.

Onde?

Quando?

Para quem?

Em qual execução?

Precisamos de correlação.

Um identificador como:

trace_id = 7A91...

pode acompanhar uma operação através de vários componentes.

E então um log pode carregar:

TraceId
SpanId

O modelo de logs do OpenTelemetry prevê justamente essa correlação, permitindo conectar registros a traces e spans.

Assim podemos sair de:

ERROR: timeout

para:

RUN A000471
TRACE 7A91
SPAN DB2_QUERY
ERROR timeout

Agora temos pista.


🚨 CAPÍTULO 13 — MÉDIA É O MIMIC DA OBSERVABILIDADE

Você olha o dashboard:

Average latency = 2 seconds

Maravilhoso.

Só que alguns usuários esperam 40 segundos.

A média esconde caudas.

Por isso sistemas modernos frequentemente observam percentis:

p50
p95
p99

Exemplo:

p50 = 1.4 s
p95 = 5.8 s
p99 = 21.7 s

Agora percebemos que uma pequena parcela das execuções sofre muito.

Isso vale especialmente para agentes porque workflows podem variar enormemente.

Uma execução consulta duas ferramentas.

Outra consulta vinte.

A média olha para ambas e diz:

Está tudo razoável.

O p99 começa a gritar no corredor.


❤️ CAPÍTULO 14 — MÉTRICAS DO AGENTE NÃO DEVEM SER APENAS TÉCNICAS

Imagine este dashboard:

CPU........ OK
MEMORY..... OK
LATENCY.... OK
ERRORS..... 0

Excelente.

Mas o agente resolveu o problema?

Precisamos também de métricas funcionais.

Por exemplo:

TASK SUCCESS RATE
HUMAN ESCALATION RATE
ROLLBACK RATE
APPROVAL REJECTION RATE
RETRY RATE
TOOL FAILURE RATE
AVERAGE STEPS PER TASK
COST PER SUCCESSFUL TASK

E aqui aparece uma métrica especialmente interessante:

TASK COMPLETED

não deveria significar apenas:

O workflow chegou ao último nó.

Deveria significar:

O critério de sucesso foi realmente atingido.

É a diferença entre:

MAXCC=0000

e:

O relatório contém os números corretos.

Velho problema.

Roupa nova.


🧾 CAPÍTULO 15 — OBSERVABILIDADE NÃO É AUDITORIA

Turing escreve no quadro:

OBSERVABILIDADE
≠
AUDITORIA

Observabilidade pergunta:

O que está acontecendo com o sistema?

Auditoria pergunta:

Quem fez o quê, quando, com qual autoridade e qual foi o resultado?

Exemplo operacional:

tool_call duration=840ms

Isso é ótimo para observabilidade.

Mas uma trilha de auditoria pode precisar:

AGENT........ AGENT-CREDIT
RUN-ID....... A001991
REQUESTER.... USER471
ACTION....... CREDIT_LIMIT_CHANGE
CUSTOMER..... 98127
OLD_VALUE.... 10000
NEW_VALUE.... 15000
APPROVER..... MANAGER08
TIMESTAMP.... 14:32:11
RESULT....... SUCCESS

Agora podemos reconstruir o evento.

Auditoria é particularmente importante quando o agente age em vez de apenas responder.


🔐 CAPÍTULO 16 — CUIDADO: OBSERVABILIDADE TAMBÉM PODE VAZAR SEGREDOS

Aqui aparece uma armadilha enorme.

Você decide:

Quero registrar tudo!

Prompt.

Resposta.

Documentos.

Argumentos das ferramentas.

Resultados.

Fantástico para debugging.

Talvez terrível para segurança.

Logs podem acabar contendo:

dados pessoais
segredos comerciais
credenciais
tokens
informação financeira
código proprietário
documentos confidenciais

A própria documentação de observabilidade GenAI chama atenção para o fato de que conteúdo de mensagens e tool calls pode ser capturado quando habilitado, enquanto implementações podem permitir desativar a exportação desse conteúdo.

Portanto:

Observabilidade não significa registrar tudo indiscriminadamente.

Precisamos pensar em:

REDACTION
MASKING
SAMPLING
RETENTION
ACCESS CONTROL
ENCRYPTION

O log também é dado.

E dado precisa de governança.


🧹 CAPÍTULO 17 — NÃO TRANSFORME O LOG NUM DEPÓSITO DE LIXO

Outro clássico.

DEBUG 1
DEBUG 2
ENTROU AQUI
PASSOU AQUI
TESTE
XYZ
AAAA

😂

Todo programador já encontrou algum parente dessa criatura.

Logs úteis precisam responder perguntas.

Uma boa estrutura pode incluir:

timestamp
severity
service
agent
run_id
trace_id
span_id
event
tool
duration
status
error_type

E usar níveis coerentes:

DEBUG
INFO
WARN
ERROR

Não transforme tudo em:

ERROR

senão o erro perde significado.

É o equivalente moderno de um painel inteiro piscando vermelho.

Depois de quinze minutos ninguém mais olha.


🌉 CAPÍTULO 18 — OPENTELEMETRY: UMA LÍNGUA COMUM

Em sistemas distribuídos temos:

Java
Python
Node
API Gateway
Kubernetes
Db2
MQ
CICS
Cloud
Mainframe
LLM
Agent

Cada componente poderia produzir telemetria de maneira completamente diferente.

Correlação viraria pesadelo.

OpenTelemetry tenta fornecer uma linguagem e arquitetura vendor-neutral para sinais de observabilidade, especialmente traces, metrics e logs.

Podemos imaginar:

APLICAÇÕES
     ↓
INSTRUMENTAÇÃO
     ↓
OpenTelemetry
     ↓
COLLECTOR
     ↓
BACKEND DE OBSERVABILIDADE

O Collector pode receber, processar e exportar telemetria.

O objetivo não é:

“Comprar um dashboard bonito.”

É:

Padronizar a forma de produzir e transportar evidência operacional.


🏷️ CAPÍTULO 19 — CONVENÇÕES SEMÂNTICAS: CHAME A MESMA COISA PELO MESMO NOME

Imagine:

Sistema A:

duration

Sistema B:

elapsed

Sistema C:

execution_time

Sistema D:

how_long_this_thing_took

😂

Agora tente construir um dashboard corporativo.

Convenções semânticas procuram padronizar nomes e significados para operações e dados observáveis. O OpenTelemetry mantém convenções para traces, métricas, logs, profiles e resources.

No universo GenAI isso é especialmente importante.

Queremos poder falar de conceitos como:

agent
model
operation
tool
token usage
workflow

de maneira consistente.

As convenções GenAI ainda estão evoluindo, o que é natural numa área que também está mudando rapidamente.


🧬 CAPÍTULO 20 — SDSF + SMF + RMF + OTEL: NÃO SÃO A MESMA COISA

Aqui precisamos evitar uma simplificação perigosa.

Não podemos dizer:

SDSF = OpenTelemetry

Não é.

Nem:

SMF = logs
RMF = metrics

como equivalências técnicas exatas.

São tecnologias com histórias, escopos e arquiteturas diferentes.

Mas podemos construir uma ponte didática.

SDSF

Ajuda o operador a ver e controlar execução.

SMF

Produz enorme quantidade de registros operacionais e de accounting sobre atividades do sistema.

RMF

Historicamente fornece medição e análise de performance e recursos.

OpenTelemetry

Padroniza instrumentação e transporte de sinais modernos de observabilidade.

Então, pedagogicamente:

MAINFRAME
                     MUNDO DISTRIBUÍDO

SDSF        ←→       Operational UI
SMF         ←→       Telemetry records
RMF         ←→       Performance metrics
Job/Step    ←→       Trace/Span
JobID       ←→       Run/Trace correlation
SYSOUT      ←→       Logs / execution evidence

A seta significa:

“pense na função conceitual”

e não:

“são a mesma tecnologia”.

Essa diferença é importantíssima.


🖥️ CAPÍTULO 21 — COMO SERIA O “SDSF DOS AGENTES”?

Agora podemos desenhar.

Imagine:

AGENT OPERATIONS FACILITY
────────────────────────────────────────────────────

AGENT       RUN-ID    OWNER     STATE       TIME
REPORT      A00471    VAGNER    EXECUTING   00:01:47
COBOLSCAN   A00472    DEV       COMPLETE    00:00:38
PAYROLL     A00473    FINANCE   APPROVAL    00:03:12
SUPPORT     A00474    CRM       FAILED      00:00:09
BACKUP      A00475    OPS       RETRYING    00:00:41

Coloque:

S

ao lado de REPORT.

Abre:

OBJECTIVE
Consolidar relatórios mensais

CURRENT STEP
4/7 Analyze financial data

MODEL CALLS
5

TOOL CALLS
8

TOKENS
18,471 / 4,901

ELAPSED
00:01:47

WARNINGS
2

STATUS
EXECUTING

Agora:

L

para logs.

T

para trace.

M

para metrics.

P

para pause.

C

para cancel.

A

para approvals.

Meu Deus.

Acabamos de reinventar uma workstation operacional para agentes.

O barbudo do mainframe começa a sorrir.


🧰 CAPÍTULO 22 — PASSO A PASSO: INSTRUMENTANDO MENTALMENTE UM AGENTE

Mesmo que você seja um COBOL iniciante e não vá implementar OpenTelemetry amanhã, aprenda o raciocínio.

PASSO 1 — IDENTIFIQUE A EXECUÇÃO

Nunca dependa apenas de:

agent_name

Tenha algo equivalente a:

run_id
trace_id

PASSO 2 — DEFINA OS ESTADOS

Por exemplo:

QUEUED
PLANNING
RUNNING
WAITING_TOOL
WAITING_HUMAN
PAUSED
COMPLETED
FAILED
CANCELLED

PASSO 3 — REGISTRE EVENTOS IMPORTANTES

Não cada suspiro eletrônico.

Mas:

workflow.started
tool.called
tool.failed
approval.requested
approval.received
checkpoint.created
rollback.started
workflow.completed

PASSO 4 — MEÇA

latência
tokens
tool calls
retries
erros
tempo aguardando humano
custo

PASSO 5 — TRACE AS DEPENDÊNCIAS

Quando a execução atravessar:

agent → API → Db2 → MQ → CICS

preserve correlação.

PASSO 6 — PROTEJA A TELEMETRIA

Não registre segredos simplesmente porque são úteis para debugging.

PASSO 7 — DEFINA SUCESSO

Não use apenas:

DONE

Use critérios de negócio.

PASSO 8 — CONSTRUA ALERTAS ÚTEIS

Não alerte para tudo.

Alerte quando algo realmente exigir atenção.


🚨 CAPÍTULO 23 — O ALERTA QUE TOCA ÀS 3 DA MANHÃ

Todo sistema de observabilidade eventualmente encontra seu verdadeiro teste:

03:17.

Telefone toca.

ALERT:
AGENT FAILURE RATE > 25%

Você abre o painel.

Descobre:

Tool: CUSTOMER-API
p99 latency: 31s
Timeout rate: 38%
Retries: 4.2 per run

Agora existe hipótese.

Sem observabilidade:

A IA ficou burra.

Com observabilidade:

A API de clientes está degradada; o agente está repetindo chamadas e acumulando timeout.

Essa diferença é gigantesca.

Modelos inteligentes introduzem novas fontes de incerteza.

Não devemos atribuir todo problema ao modelo.

Pode ser:

modelo
prompt
tool
API
rede
Db2
MQ
permissão
rate limit
dados
timeout
bug

Observabilidade separa fantasmas de evidências.


🧙 CAPÍTULO 24 — TURING DESENHA AS QUATRO PERGUNTAS

Turing pega o giz.

Escreve:

1. O QUE ESTÁ ACONTECENDO?

Estado + logs.

2. QUANTO ESTÁ ACONTECENDO?

Métricas.

3. POR ONDE PASSOU?

Trace.

4. QUEM AUTORIZOU?

Auditoria.

O jovem COBOL acrescenta uma quinta:

5. QUANTO CUSTOU?

Turing olha.

— Muito bem.

O administrador do CPD acrescenta:

6. POSSO PARAR?

E o administrador RACF:

7. ELE PODIA FAZER ISSO?

Agora temos praticamente toda a série:

PF3
↓
POSSO PARAR?

MAXCC
↓
FUNCIONOU?

RACF
↓
PODIA FAZER?

SDSF
↓
O QUE ESTÁ FAZENDO?

🥚 EASTER EGG — S A00471

São 02:58.

O jovem operador vê:

AGENT       RUN-ID    STATE
REPORT      A00471    RUNNING

Digite:

S A00471

A tela abre.

CURRENT ACTION:
Searching documentation

ELAPSED:
02:47:31

FILES FOUND:
4,281,771

CURRENT DIRECTORY:
/

Silêncio.

Turing olha para o programador.

O programador olha para Turing.

O administrador de segurança derruba o café.

Alguém pergunta:

— Quem deu acesso ao filesystem inteiro?

Do fundo da sala vem uma voz:

— Foi para facilitar o protótipo.

O administrador RACF levanta lentamente da cadeira.

ICH408I

Fim do easter egg.


☕ EPÍLOGO — NÃO QUERO UMA IA TRANSPARENTE; QUERO UMA IA OPERÁVEL

Existe uma diferença importante.

Quando falamos em observabilidade, não estamos necessariamente exigindo enxergar todos os mecanismos internos de um modelo.

Queremos algo muito mais prático.

Queremos saber:

qual tarefa
qual execução
qual estado
qual etapa
qual ferramenta
quanto tempo
quanto recurso
qual erro
qual resultado
qual aprovação

Em outras palavras:

OPERABILIDADE.

Um agente corporativo precisa ser operável.

Precisa ser possível colocar alguém diante dele e perguntar:

O que está acontecendo?

E obter resposta melhor que:

RUNNING...

Isso parece uma discussão sobre inteligência artificial.

Mas também é uma discussão profundamente antiga sobre sistemas.

O mainframe aprendeu há décadas que executar trabalho empresarial significa deixar evidência.

Jobs possuem identidade.

Execuções possuem estados.

Etapas possuem resultados.

Output pode ser examinado.

Falhas precisam ser investigadas.

Recursos precisam ser medidos.

A IBM descreve SDSF justamente como um meio seguro de monitorar e gerenciar sistemas z/OS, jobs, output, recursos e mensagens operacionais.

O mundo distribuído acrescentou novos desafios.

Microsserviços.

APIs.

Cloud.

Containers.

Mensageria.

Agora adicionamos:

LLMs.

Tools.

RAG.

Copilotos.

Agentes.

Mas a pergunta do operador continua assustadoramente parecida.

O que diabos está acontecendo agora?

OpenTelemetry nos oferece uma linguagem moderna para parte dessa investigação, reunindo logs, métricas e traces e permitindo correlação entre componentes.

E os agentes tornam essa disciplina ainda mais importante.

Porque não estamos observando apenas software executando um caminho predeterminado.

Podemos estar observando software escolhendo dinamicamente qual caminho executar.

Quanto maior a autonomia...

maior a necessidade de evidência.

Quanto mais ferramentas disponíveis...

mais importante a correlação.

Quanto mais passos dinâmicos...

mais necessário o tracing.

Quanto maior o custo variável...

mais importantes as métricas.

Quanto maior o poder de ação...

mais importante a auditoria.

Alan Turing volta ao terminal.

A tela agora mostra:

AGENT: REPORT
RUN-ID: A00471

STATUS........ WAITING_APPROVAL
STEP.......... 6/7
ELAPSED....... 00:01:48
MODEL CALLS... 5
TOOL CALLS.... 8
WARNINGS...... 2
ERRORS........ 0

ACTION........ SEND REPORT
RISK.......... EXTERNAL ACTION
APPROVAL...... REQUIRED

[P] PAUSE
[C] CANCEL
[L] LOG
[T] TRACE
[M] METRICS
[A] APPROVE

Turing toma um gole de café.

— Melhor.

O programador pergunta:

— Agora sabemos tudo?

Turing sorri.

— Claro que não.

— Então o que sabemos?

Ele aponta para a tela.

— Sabemos onde procurar.

Para um operador, um SRE, um programador COBOL ou qualquer pessoa que já tenha passado algumas horas tentando descobrir por que um sistema parou às três da manhã...

isso já é uma diferença gigantesca.

Porque o futuro talvez esteja cheio de agentes inteligentes.

Mas quando alguma coisa der errado, alguém ainda precisará abrir uma tela e perguntar:

ST

Qual é o status?

Algumas perguntas sobrevivem a todas as revoluções tecnológicas.

READY

E, naturalmente...

há outro agente na fila.

☕ UM CAFÉ NO BELLACOSA MAINFRAME

🤖 Alan Turing entra no CPD

O mapa dos agentes de IA explicado por um mainframer

Esta série acompanha a evolução de uma ideia: compreender os problemas modernos dos agentes de inteligência artificial usando conceitos conhecidos por quem trabalha com mainframe, IBM Z e sistemas corporativos.

A viagem começa pelas pessoas e pela experiência de uso, passa por observabilidade, priorização e execução, chega às transações, estado e mensageria e termina na organização hierárquica do contexto.

01
FEV / 2023

🧠 O currículo invisível da inteligência artificial

Antes de construir agentes inteligentes precisamos preparar as pessoas que trabalharão com eles. Técnica, pensamento crítico, conhecimento de negócio, segurança, ética e responsabilidade formam o currículo que nem sempre aparece no certificado.

02
MAR / 2023

🤖 A UX dos agentes

Quando uma IA deixa de apenas responder e começa a executar ações, sua interface precisa mostrar objetivos, progresso, permissões e resultados. PF3, MAXCC e RACF tornam-se excelentes analogias para controle, retorno e privilégio mínimo.

04
MAI / 2023

⚖️ O WLM dos agentes

CPU, GPU, tokens, APIs e bancos de dados são recursos finitos. O Workload Manager inspira uma discussão sobre prioridades, objetivos de serviço, importância do trabalho e distribuição dinâmica de recursos entre agentes.

06
JUL / 2023

⚡ O CICS dos agentes

Uma coisa é uma IA produzir texto. Outra é permitir que ela execute operações reais de negócio. CICS introduz a conversa sobre processamento transacional, concorrência, segurança e integridade.

07
AGO / 2023

🗄️ O Db2 dos agentes

Agentes precisam manter estado, checkpoints, decisões e resultados. O Db2 fornece o ponto de partida para discutir unidade de trabalho, consistência, COMMIT, ROLLBACK e recuperação.

10
SET / 2026

☕ Alan Turing entra no CPD — O mapa completo

O artigo-âncora reúne toda a evolução da ideia: pessoas, UX, observabilidade, prioridade, orquestração, transações, estado, mensageria e contexto transformam artigos independentes em uma arquitetura conceitual para agentes de IA.

🖥️ Leitor da série

Selecione qualquer capítulo acima para abri-lo normalmente. O painel abaixo é apenas um recurso adicional de navegação.

Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988
GitHub LinkedIn
Inicializando conteúdo...