Perfis

Um registro do uso de recursos no nível do código.

Status: Em desenvolvimento

Um perfil é uma coleção de amostras e metadados associados que mostra onde as aplicações consomem recursos durante a execução. Uma amostra registra valores encontrados em algum contexto de programa (tipicamente um stack trace), opcionalmente enriquecida com informações auxiliares, como o ID do rastro correspondente a uma solicitação de nível mais alto.

O momento de captura de uma amostra é conhecido como um evento de amostra e consiste não apenas no ponto de observação dos dados, mas também no momento em que foi capturado.

Por exemplo, um perfil On-CPU contém amostras (stack traces agregados) de código que estava sendo executado na CPU quando as amostras foram capturadas, junto com os timestamps e o número de vezes que cada stack trace foi observado.

Visão geral dos perfis

Os perfis estão emergindo como o quarto sinal essencial de observabilidade, junto com logs, métricas e rastros. Eles oferecem insights incomparáveis sobre o comportamento do sistema e da aplicação, frequentemente revelando gargalos de desempenho ignorados por outros sinais.

Os perfis fornecem visões granulares e baseadas em tempo do consumo de recursos e da execução de código, abrangendo:

  • Perfilamento no nível da aplicação: Revela como as funções do software consomem CPU, memória e outros recursos, destacando código lento ou ineficiente.

  • Perfilamento no nível do sistema: Oferece uma visão holística da infraestrutura, identificando problemas em chamadas do sistema operacional, operações do kernel e I/O.

Essa visão de desempenho pode levar a:

  • Análise de causa raiz mais rápida: Identifica rapidamente a causa exata da degradação de desempenho.
  • Otimização proativa: Identifica possíveis problemas antes do impacto ao usuário.
  • Melhor utilização de recursos: Otimiza a infraestrutura para economia de custos e eficiência.
  • Maior produtividade do desenvolvedor: Ajuda os desenvolvedores a validar o desempenho do código e prevenir regressões.

Como os perfis complementam outros sinais

Cada sinal do OpenTelemetry responde a uma pergunta diferente:

SinalPergunta
LogsQuais eventos discretos ocorreram? (informações sobre o comportamento do sistema)
MétricasO que está acontecendo no nível do sistema? (ex.: uso de CPU em 90%)
RastrosComo uma solicitação percorre um sistema distribuído?
PerfisQual código é responsável pelo consumo de recursos?

Os perfis do OpenTelemetry suportam vínculos bidirecionais com outros sinais. Essas correlações funcionam em duas dimensões:

  • Correlação de contexto de solicitação: Vincula dados de perfilamento a um rastro ou trecho específico para que você possa ver qual código estava em execução durante uma solicitação específica.

  • Correlação de contexto de recurso: Vincula dados de perfilamento ao mesmo recurso que emitiu as métricas, logs ou rastros associados, como a mesma instância da aplicação.

Os perfis se tornam especialmente poderosos quando correlacionados com outros sinais:

  • Logs para perfis: A partir de um registro de log de falta de memória, encontre os caminhos de código responsáveis pela pressão de memória.
  • Métricas para perfis: A partir de um pico de uso de CPU ou memória, salte diretamente para as funções que estão consumindo esses recursos.
  • Rastros para perfis: A partir de um trecho lento em um rastro, veja o perfil correspondente para identificar o código responsável pela latência.

Tipos de perfis

O perfilamento pode capturar muitos tipos diferentes de uso de recursos. Alguns tipos comuns de perfis incluem:

  • On-CPU: Quais funções estão consumindo tempo de processador?
  • Off-CPU: Onde as threads estão bloqueadas ou esperando (ex.: locks, I/O) em vez de executar?
  • Heap (memória): Quais funções alocaram memória que ainda está em uso?
  • Alocações (memória): Quais caminhos de código são responsáveis pela maioria das alocações de memória (independentemente de a memória ter sido liberada)?

O sinal de perfis do OpenTelemetry é flexível o suficiente para acomodar todos esses tipos. No entanto, os tipos de perfis específicos disponíveis dependem do runtime da linguagem e do perfilador sendo utilizado.

Como funciona o perfilamento

Existem múltiplas abordagens para coletar perfis e projetamos os perfis do OpenTelemetry para suportar todas elas:

  • Perfilamento baseado em amostragem: Um perfilador interrompe periodicamente o programa, por exemplo usando interrupções baseadas em temporizador, e registra o stack trace atual. Essa é a abordagem mais comum para perfilamento de CPU. No Linux, perfiladores podem utilizar eBPF para capturar stack traces do kernel sem modificar aplicações em userspace. Essa abordagem permite perfilamento de todo o sistema sem instrumentação (incluindo código produzido por linguagens compiladas sem suporte a runtime) e é projetada para uso contínuo em produção com baixa sobrecarga.
  • Perfilamento baseado em instrumentação: Ganchos de runtime ou instrumentação de bytecode reportam eventos como alocações de memória, aquisições de locks ou coletas de lixo junto com seus stack traces associados.

Independentemente do método de coleta, os dados resultantes são serializados no modelo de dados comum de perfis do OpenTelemetry e exportados via OTLP.

Coletando perfis

O OpenTelemetry fornece um agente de perfilamento baseado em eBPF para Linux, capaz de perfilar a maioria das linguagens sem nenhuma alteração no código.

Integrações adicionais de perfilamento específicas por linguagem que utilizam frameworks de perfilamento nativos do runtime, como JFR para Java ou pprof para Go, também se tornarão disponíveis à medida que o sinal amadurecer.

Você pode exportar perfis através do OTLP para o OpenTelemetry Collector ou diretamente para qualquer backend compatível.

Especificação

Para saber mais sobre perfis no OpenTelemetry, consulte a especificação de perfis.