Artigo
· jan 10 5min de leitura

Traces de OpenTelemetry implementados por Serviços Web SOAP no IRIS

Um cliente perguntou recentemente se o IRIS era compatível com o OpenTelemetry, pois queria medir o tempo que os serviços SOAP implementados pelo IRIS levavam para serem concluídos. O cliente já tem diversas outras tecnologias compatíveis com o OpenTelemetry para o tracing de processos.  No momento, o InterSystems IRIS (IRIS) não oferece suporte nativo ao OpenTelemetry.  

É verdade que a plataforma de dados do IRIS tem várias maneiras de capturar, registrar e analisar o desempenho de uma instância em execução. Essas informações não saem do IRIS por outros componentes do OpenTelemetry, como Agentes ou Coletores, em uma arquitetura do OpenTelemetry implementada.  Várias tecnologias já são compatíveis com o OpenTelemetry, que parece estar se tornando um padrão para a Observabilidade.

Embora haja desenvolvimento contínuo para oferecer suporte nativo a esse recurso em versões futuras do IRIS, este artigo explica como, com a ajuda do Embedded Python e das bibliotecas correspondentes do Python,  os desenvolvedores de aplicativos IRIS podem começar a publicar eventos de Trace para seus back-ends do OpenTelemetry com pouco esforço.  Mais importantemente, meu cliente pode começar a adotar algo hoje mesmo. 

 

Observabilidade. 

A observabilidade geralmente é composta de três aspectos principais:

  • Captura de métricas, que é a captura de medidas quantitativas sobre o desempenho e o comportamento de um sistema, parecido com o que o IRIS publica pela /api/monitor/metrics api
  • Registros, que envolvem capturar e armazenar informações relevantes geradas por um aplicativo ou sistema, como o que aparece nas saídas de Logs do Sistema ou o arquivo messages.log gerado por instâncias do IRIS.
  • Tracing: que envolve o rastreamento do fluxo de uma transação ou solicitação de serviço enquanto se move por vários componentes de uma solução. O tracing distribuído permite que você siga o caminho de uma solicitação em vários serviços, oferecendo uma representação visual de todo o fluxo da transação.

Este artigo e o aplicativo complementar encontrado aqui focam apenas no Tracing dServiços SOAP.

Um Trace identifica uma operação dentro de uma solução que, de fato, pode ser atendida por várias tecnologias em uma arquitetura, como navegador, balanceador de carga, servidor web, servidor de banco de dados etc.
Um Span representa uma única unidade de trabalho, como uma atualização ou uma consulta de banco de dados. Um span é o componente essencial de um Trace, e um Trace começa com um Span raiz e spans irmãos ou opcionalmente aninhados.

Nessa implementação, que só usa o IRIS como a tecnologia para gerar telemetria, um trace e um Span raiz são iniciados com a inicialização do Serviço SOAP.

Abordagem de implementação:

Transforme a classe %SOAP.WebService do IRIS com a lógica de implementação do OpenTelemetry e as funções das bibliotecas Python em uma nova classe chamada SOAP.WebService. Inclua Macros que possam ser usados no código do usuário para contribuir mais com a observabilidade e o tracing. Devem ser necessárias mudanças mínimas na implementação do SOAP (troque o uso de %SOAP.WebService pelo SOAP.WebService como a superclasse de serviço web para implementar o SOAP.
O diagrama abaixo ilustra essa abordagem:

 

Recursos dessa implementação:

  • Por padrão, todo Serviço SOAP será rastreado e relatará informações de traces.
  • Quando um Serviço SOAP é usado pela primeira vez, a implementação inicializará um objeto Tracer do OpenTelemetry. Uma combinação do nome do servidor IRIS e instância é fornecida como a origem da telemetria, e a ação SOAP é usada como o nome do span raiz padrão que rastreia o serviço soap.
  • Os traces de telemetria e o span padrão serão encerrados automaticamente quando a chamada do método SOAP for finalizada
  • Depois da criação, os pares de chave/valor dos atributos podem ser adicionados ao span raiz padrão, como o ID da sessão do CSP ou o número do trabalho
  • Os usuários podem usar o $$$OTELLog(...), para adicionar registros manuais a um span, usando uma string simples ou um array de pares chave-valor 
  • Os usuários podem usar o $$$OTELPushChildSpan(...)/$$$OTELPopChildSpan(...) para criar spans não raiz em torno de seções do código que desejam identificar de maneira independente com sua lógica

 

Instalação e teste

  • Faça o git pull/clone do repositório em qualquer diretório local
$ git clone https://github.com/pisani/opentelemetry-trace-soap.git
  • Abra uma janela de terminal nesse diretório e digite o seguinte para criar as imagens IRIS com código de amostra:
$ docker-compose build
  • Depois de criar a imagem iris, no mesmo diretório, digite o seguinte para iniciar os contêineres Jaeger e IRIS:
$ docker-compose up -d

Isso iniciará dois contêineres: o contêiner back-end de destino do OpenTelemetry Jaeger (também expondo uma interface do usuário) e uma instância do IRIS que servirá como o endpoint do servidor dos serviços web SOAP.  Três serviços web simples foram desenvolvidos na instância do IRIS para testar a solução.

 

  • Usando seu navegador, acesse as informações SOAP e páginas de teste por esse URL. Faça login como um superusuário/SYS quando solicitado:
http://localhost:52773/csp/irisapp/SOAP.MyService.cls

(Observação: essas páginas não são ativadas por padrão, e a segurança na instância do IRIS em execução precisa ser relaxada para ativar esse recurso, facilitando o teste)

Selecione cada um dos métodos da web que você quer testar, para gerar a atividade SOAP.  Para ver essa implementação gerar um Erro nos traces observados, use zero (0) como o segundo número no método SOAP Divide(), forçando um erro <DIVDE>.

  • Abra outra guia do navegador e acesse a IU do Jaeger pelo seguinte URL
http://localhost:16686
  • A página de destino resultante mostra todos os serviços que contribuem para as leituras de telemetria e deve ser parecida com a captura de tela abaixo:  

 

Conclusão

Resumindo, este artigo mostra como o Embedded Python pode ser usado para adicionar mais recursos ao IRIS, no meu caso, implementar o tracing de Observabilidade para os serviços SOAP.  As opções disponíveis pelo Python e a capacidade do IRIS de aproveitar as bibliotecas Python são vastas.

Reconheço que é possível trabalhar para criar uma classe mais genérica de suporte ao OpenTelemetry que implemente o mesmo para os serviços REST, além de ampliar as assinaturas de Class Method para rastrear o timing de qualquer Class method por esse framework.

Discussão (0)1
Entre ou crie uma conta para continuar