Instrumentação automática baseada em OpenTelemetry do Azure Monitor para aplicativos Java
Este artigo descreve como habilitar e configurar a oferta do Azure Monitor para Java baseada em OpenTelemetry. Ele pode ser usado para qualquer ambiente, incluindo o local. Depois de concluir as instruções deste artigo, você poderá usar o Application Insights do Azure Monitor para monitorar o seu aplicativo.
Observação
Em 31 de março de 31, 2025, o suporte à ingestão de chave de instrumentação será encerrado. A ingestão de chave de instrumentação continuará funcionando, mas não forneceremos mais atualizações ou suporte para o recurso. Faça a transição para cadeias de conexão para aproveitar as novas funcionalidades.
Introdução
A instrumentação automática do Java é habilitada por meio de alterações de configuração; nenhuma alteração de código é necessária.
Pré-requisitos
- Aplicativo Java usando o Java 8+
- Assinatura do Azure: crie uma assinatura do Azure gratuitamente
- Recurso do Application Insights: criar um recurso do Application Insights
Habilitar o Application Insights do Azure Monitor
Esta seção mostra como baixar o arquivo jar de instrumentação automática.
Baixar o arquivo jar
Baixe o arquivo applicationinsights-agent-3.4.7.jar.
Aviso
Se você estiver atualizando de uma versão anterior do 3.x,
Começando com 3.4.0:
- A amostragem limitada por taxa agora é padrão (se você não tiver configurado um percentual fixo anteriormente). Por padrão, ela capturará no máximo cinco solicitações por segundo (juntamente com suas dependências, rastreamentos e eventos personalizados). Confira a amostragem de percentual fixo se você quiser reverter para o comportamento anterior de capturar 100% das solicitações.
Começando com 3.3.0:
LoggingLevel
não é capturado por padrão como parte da dimensão personalizada de Rastreamentos, pois esses dados já são capturados no campoSeverityLevel
. Para obter detalhes sobre como reabilitar isso se necessário, confira as opções de configuração- Os registros de exceção não são mais registrados para dependências com falha, eles são registrados apenas para solicitações com falha.
Começando com 3.2.0:
- As dependências "InProc" do controlador não são mais capturadas por padrão. Para obter detalhes sobre como reabilitar isso, confira as opções de configuração.
- Os nomes de dependência do banco de dados agora são mais concisos, com a consulta completa (sanitizada) ainda presente no campo
data
. Agora os nomes de dependência HTTP estão mais descritivos. Essa alteração pode afetar os painéis ou alertas personalizados se eles dependiam dos valores anteriores. Para obter detalhes, confira as Notas sobre a versão 3.2.0.
Começando com 3.1.0:
- Agora os nomes de operação e de telemetria de solicitação são prefixados pelo método HTTP, como
GET
ePOST
. Essa alteração pode afetar os painéis ou alertas personalizados se eles dependiam dos valores anteriores. Para obter detalhes, confira as Notas sobre a versão 3.1.0.
Apontar a JVM (Máquina Virtual Java) para o arquivo jar
Adicione -javaagent:"path/to/applicationinsights-agent-3.4.7.jar"
aos argumentos da JVM de seu aplicativo.
Dica
Para obter ajuda com a configuração dos argumentos da JVM do aplicativo, confira Dicas para atualizar os argumentos da JVM.
Dica
Se você desenvolver um aplicativo Spring Boot, poderá substituir o argumento JVM por uma configuração programática. Mais aqui.
Definir a cadeia de conexão do Application Insights
Há duas maneiras de apontar o arquivo jar para o recurso do Application Insights:
Defina uma variável de ambiente:
APPLICATIONINSIGHTS_CONNECTION_STRING=<Copy connection string from Application Insights Resource Overview>
Você também pode criar um arquivo de configuração chamado
applicationinsights.json
. Insira-o no mesmo diretório deapplicationinsights-agent-3.4.7.jar
com o conteúdo a seguir:{ "connectionString": "Copy connection string from Application Insights Resource Overview" }
Encontre a cadeia de conexão no seu recurso do Application Insights.
Confirmar se os dados estão fluindo
Execute o aplicativo e abra a guia Recurso do Application Insights no portal do Azure. Pode levar alguns minutos para os dados aparecerem no portal.
Observação
Se você não conseguir executar o aplicativo ou não receber dados conforme o esperado, confira a seção Solução de problemas.
Importante
Se você tiver dois ou mais serviços que emitem telemetria para o mesmo recurso do Application Insights, será necessário definir nomes de função de nuvem para representá-los corretamente no mapa do aplicativo.
Como parte do uso da instrumentação do Application Insights, coletamos e enviamos dados de diagnóstico para a Microsoft. Esses dados nos ajudam a executar e a aprimorar o Application Insights. É possível desabilitar a coleta de dados não essenciais. Para saber mais, confira Statsbeat no Azure Application Insights.
Opções de configuração
No arquivo applicationinsights.json
, você também pode definir essas configurações:
- Nome da função de nuvem
- Instância de função de nuvem
- amostragem
- Métricas JMX
- Dimensões Personalizadas
- Processadores de Telemetria (pré-visualização)
- Registro em log coletado automaticamente
- Métricas de micrométricas coletadas automaticamente, que incluem métricas do atuador do Spring Boot
- Pulsação
- Proxy HTTP
- Autodiagnóstico
Para mais informações, confira Opções de configuração.
Instrumentação Automática
O Java 3.x inclui a instrumentação automática a seguir.
Solicitações coletadas automaticamente
- Consumidores JMS
- Consumidores do Kafka
- Netty
- Quartz
- Servlets
- Agendamento do Spring
Observação
A instrumentação automática do Servlet e do Netty abrange a maioria dos serviços HTTP Java, incluindo Java EE, Jakarta EE, Spring Boot, Quarkus e Micronaut.
Dependências coletadas automaticamente
Dependências coletadas automaticamente, mais propagação de rastreamento distribuído downstream:
- Apache HttpClient
- Apache HttpAsyncClient
- AsyncHttpClient
- Google HttpClient
- gRPC
- java.net.HttpURLConnection
- Java 11 HttpClient
- Cliente JAX-RS
- Jetty HttpClient
- JMS
- Kafka
- Cliente Netty
- OkHttp
Dependências coletadas automaticamente sem propagação de rastreamento distribuído downstream:
- Cassandra
- JDBC
- MongoDB (assíncrono e síncrono)
- Redis (Lettuce e Jedis)
Logs coletados automaticamente
- Logback (incluindo propriedades de MDC)
- Log4j (incluindo propriedades de Contexto de MDC/Thread)
- JBoss Logging (incluindo propriedades de MDC)
- java.util.logging
Métricas coletadas automaticamente
- Micrometer, que inclui métricas do atuador do Spring Boot
- Métricas JMX
SDKs do Azure
A telemetria emitida por esses SDKs do Azure é coletada automaticamente por padrão:
- Configuração de Aplicativos do Azure 1.1.10 e posterior
- Azure Cognitive Search 11.3.0 e posterior
- Chat de comunicação do Azure 1.0.0 e posterior
- Comunicação do Azure comum 1.0.0 e posterior
- Identidade de comunicação do Azure 1.0.0 e posterior
- Números de telefone de comunicação do Azure 1.0.0 e posterior
- SMS de comunicação do Azure 1.0.0 e posterior
- Azure Cosmos DB 4.22.0+
- Gêmeos Digitais do Azure – Básico 1.1.0 e posterior
- Grade de Eventos do Azure 4.0.0 e posterior
- Hubs de Eventos do Azure 5.6.0 e posterior
- Hubs de Eventos do Azure – Repositório de pontos de verificação do Armazenamento de Blobs do Azure 1.5.1 e posterior
- Reconhecimento de Formulários do Azure 3.0.6 e posterior
- Identidade do Azure 1.2.4 e posterior
- Azure Key Vault – Certificados 4.1.6 e posterior
- Azure Key Vault – Chaves 4.2.6 e posterior
- Azure Key Vault – Segredos 4.2.6 e posterior
- Barramento de Serviço do Azure 7.1.0 e posterior
- Armazenamento do Microsoft Azure – Blobs 12.11.0 e posterior
- Armazenamento do Microsoft Azure – Lote de blobs 12.9.0 e posterior
- Armazenamento do Microsoft Azure – Criptografia de blobs 12.11.0 e posterior
- Armazenamento do Microsoft Azure – Comum 12.11.0 e posterior
- Armazenamento do Microsoft Azure – Data lake de arquivos 12.5.0 e posterior
- Armazenamento do Microsoft Azure – Compartilhamentos de Arquivos 12.9.0 e posterior
- Armazenamento do Microsoft Azure – Filas 12.9.0 e posterior
- Análise de Texto do Azure 5.0.4 e posterior
Modificar telemetria
Esta seção explica como modificar a telemetria.
Adicionar intervalos usando a anotação do OpenTelemetry
A maneira mais simples de adicionar os seus próprios intervalos é usando a anotação @WithSpan
do OpenTelemetry.
Os intervalos preenchem as tabelas requests
e dependencies
no Application Insights.
Observação
Esse recurso está disponível apenas da versão 3.2.0 em diante.
Adicione
opentelemetry-instrumentation-annotations-1.21.0.jar
(ou posterior) ao seu aplicativo:<dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-instrumentation-annotations</artifactId> <version>1.21.0</version> </dependency>
Use a anotação
@WithSpan
para emitir um intervalo sempre que o seu método for executado:import io.opentelemetry.instrumentation.annotations.WithSpan; @WithSpan(value = "your span name") public void yourMethod() { }
Por padrão, o intervalo acabará na tabela de dependências com o tipo de dependência InProc
.
Se o seu método representa um trabalho em segundo plano que ainda não foi capturado pela instrumentação automática, é recomendável aplicar o atributo kind = SpanKind.SERVER
à anotação @WithSpan
para que ele acabe na tabela requests
do Application Insights.
Adicionar intervalos usando a API do OpenTelemetry
Se a anotação @WithSpan
do OpenTelemetry acima não atender às suas necessidades, adicione seus intervalos usando a API do OpenTelemetry.
Observação
Esse recurso está disponível apenas da versão 3.2.0 em diante.
Adicione
opentelemetry-api-1.0.0.jar
(ou posterior) ao seu aplicativo:<dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-api</artifactId> <version>1.0.0</version> </dependency>
Usar a
GlobalOpenTelemetry
classe para criar umTracer
import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.trace.Tracer; static final Tracer tracer = GlobalOpenTelemetry.getTracer("com.example");
Crie um intervalo, torne-o atual e, em seguida, encerre-o:
Span span = tracer.spanBuilder("my first span").startSpan(); try (Scope ignored = span.makeCurrent()) { // do stuff within the context of this } catch (Throwable t) { span.recordException(t); } finally { span.end(); }
Adicionar eventos de intervalo
Você pode usar opentelemetry-api
para criar eventos de intervalo, que preenchem a tabela de rastreamentos no Application Insights. A cadeia de caracteres passada para addEvent()
é salva no campo de mensagem dentro do rastreamento.
Observação
Esse recurso está disponível apenas da versão 3.2.0 em diante.
Adicione
opentelemetry-api-1.0.0.jar
(ou posterior) ao seu aplicativo:<dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-api</artifactId> <version>1.0.0</version> </dependency>
Adicione eventos de intervalo no código:
import io.opentelemetry.api.trace.Span; Span.current().addEvent("eventName");
Adicionar atributos de intervalo
Você pode usar opentelemetry-api
para adicionar atributos a intervalos. Esses atributos podem incluir a adição de uma dimensão comercial personalizada a sua telemetria. Você também pode usar atributos para definir campos opcionais no esquema do Application Insights, como ID de usuário ou IP do cliente.
Adicionar um ou mais atributos de extensão preencherá o campo customDimensions na tabela de solicitações, dependências, rastreamentos ou exceções.
Observação
Esse recurso está disponível apenas da versão 3.2.0 em diante.
Adicione
opentelemetry-api-1.0.0.jar
(ou posterior) ao seu aplicativo:<dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-api</artifactId> <version>1.0.0</version> </dependency>
Adicione dimensões personalizadas ao seu código:
import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.common.AttributeKey; AttributeKey attributeKey = AttributeKey.stringKey("mycustomdimension"); Span.current().setAttribute(attributeKey, "myvalue1");
Atualizar o status de intervalo e registrar exceções
Você pode usar opentelemetry-api
para atualizar o status de um intervalo e registrar as exceções.
Observação
Esse recurso está disponível apenas da versão 3.2.0 em diante.
Adicione
opentelemetry-api-1.0.0.jar
(ou posterior) ao seu aplicativo:<dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-api</artifactId> <version>1.0.0</version> </dependency>
Defina o status como erro e registre uma exceção no código:
import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.StatusCode; Span span = Span.current(); span.setStatus(StatusCode.ERROR, "errorMessage"); span.recordException(e);
Definir a ID de usuário
Preencha o campo ID de usuário na tabela de solicitações, dependências ou exceções.
Importante
Veja as leis de privacidade aplicáveis antes de configurar a ID de usuário autenticado.
Observação
Esse recurso está disponível apenas da versão 3.2.0 em diante.
Adicione
opentelemetry-api-1.0.0.jar
(ou posterior) ao seu aplicativo:<dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-api</artifactId> <version>1.0.0</version> </dependency>
Defina
user_Id
no seu código:import io.opentelemetry.api.trace.Span; Span.current().setAttribute("enduser.id", "myuser");
Obter a ID de rastreamento ou a ID do intervalo
Você pode usar opentelemetry-api
para obter a ID de rastreamento ou a ID de intervalo. Essa ação pode ser feita para adicionar esses identificadores à telemetria de registro em log para aprimorar a correlação ao depurar e diagnosticar problemas.
Observação
Esse recurso está disponível apenas da versão 3.2.0 em diante.
Adicione
opentelemetry-api-1.0.0.jar
(ou posterior) ao seu aplicativo:<dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-api</artifactId> <version>1.0.0</version> </dependency>
Obtenha a ID de rastreamento de solicitação e a ID de intervalo em seu código:
import io.opentelemetry.api.trace.Span; Span span = Span.current(); String traceId = span.getSpanContext().getTraceId(); String spanId = span.getSpanContext().getSpanId();
Telemetria personalizada
Nossa meta no Application Insights Java 3.x é permitir que você envie a sua telemetria personalizada usando APIs padrão.
Atualmente damos suporte ao Micrometer, estruturas de log populares e ao SDK do Application Insights Java clássico. O Application Insights Java 3.x captura automaticamente a telemetria enviada por essas APIs e a correlaciona com a telemetria coletada automaticamente.
Telemetria personalizada compatível
A tabela a seguir representa os tipos de telemetria personalizados com suporte no momento, que você pode habilitar para complementar o agente do Java 3.x. Para resumir:
- Há suporte para métricas personalizadas por meio do micrometer.
- Há suporte para rastreamentos e exceções personalizadas por meio de estruturas de registro.
- Há suporte para solicitações personalizadas, dependências, métricas e exceções por meio da API do OpenTelemetry.
- Os tipos de telemetria restantes têm suporte por meio do SDK Clássico do Application Insights.
Tipos de telemetria personalizada | Micrometer | Logback, Log4j, JUL | API do OpenTelemetry | SDK clássico |
---|---|---|---|---|
Eventos personalizados | Sim | |||
Métricas personalizadas | Sim | Yes | Sim | |
Dependências | Sim | Yes | ||
Exceções | Sim | Sim | Yes | |
Visualizações de página | Yes | |||
Requests | Yes | Yes | ||
Rastreamentos | Sim | Sim |
Enviar métricas personalizadas usando o Micrometer
Adicione o Micrometer em seus aplicativos:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> <version>1.6.1</version> </dependency>
Use o registro global do Micrometer para criar um medidor:
static final Counter counter = Metrics.counter("test.counter");
Use o contador para registrar as métricas:
counter.increment();
As métricas serão ingeridas na tabela customMetrics, com marcas capturadas na coluna . Você também pode exibir as métricas no Metrics Explorer no namespace de métrica "Métricas baseadas em log".
Observação
O Java do Application Insights substitui todos os caracteres não alfanuméricos (exceto traços) no nome da métrica do Micrometer por sublinhados, portanto, a métrica
test.counter
acima aparecerá comotest_counter
.
Envie exceções e rastreamentos personalizados usando a estrutura de registros que você quiser
Logback, Log4j e java.util.logging são instrumentados automaticamente. O registro em log executado por meio dessas estruturas de registros é coletado automaticamente como telemetria de rastreamento e exceção.
Por padrão, o log só é coletado quando ele é executado no nível INFO ou superior. Para alterar esse nível, consulte as opções de configuração.
O registro estruturado de log (anexar dimensões personalizadas aos logs) pode ser realizado destas maneiras:
- Logback MDC
- Log4j 2 MapMessage (uma chave
MapMessage
de"message"
será capturada como a mensagem de log) - Contexto de Thread do Log4j 2
- Log4j 1.2 MDC
Enviar telemetria personalizada usando o SDK Clássico do Application Insights
Adicione o
applicationinsights-core
ao seu aplicativo:<dependency> <groupId>com.microsoft.azure</groupId> <artifactId>applicationinsights-core</artifactId> <version>3.4.7</version> </dependency>
Crie um TelemetryClient:
static final TelemetryClient telemetryClient = new TelemetryClient();
Use o cliente para enviar telemetria personalizada:
Eventos
telemetryClient.trackEvent("WinGame");
Métricas
telemetryClient.trackMetric("queueLength", 42.0);
Dependências
boolean success = false; long startTime = System.currentTimeMillis(); try { success = dependency.call(); } finally { long endTime = System.currentTimeMillis(); RemoteDependencyTelemetry telemetry = new RemoteDependencyTelemetry(); telemetry.setSuccess(success); telemetry.setTimestamp(new Date(startTime)); telemetry.setDuration(new Duration(endTime - startTime)); telemetryClient.trackDependency(telemetry); }
Logs
telemetryClient.trackTrace(message, SeverityLevel.Warning, properties);
Exceções
try { ... } catch (Exception e) { telemetryClient.trackException(e); }
Solução de problemas
Confira o artigo de solução de problemas dedicado.
Testar a conectividade entre o host do aplicativo e o serviço de ingestão
Os SDKs e agentes do Application Insights enviam telemetria para serem ingeridos como chamadas REST para nossos pontos de extremidade de ingestão. Você pode testar a conectividade do servidor Web ou do computador host do aplicativo para os pontos de extremidade do serviço de ingestão usando clientes REST brutos do PowerShell ou comandos curl. Confira Solucionar problemas de telemetria de aplicativo ausente no Application Insights do Azure Monitor.
Notas de versão
Confira as notas sobre a versão no GitHub.
Suporte
Para obter suporte:
- Para obter ajuda com a solução de problemas, revise as etapas da solução de problemas.
- Se você tiver problemas com o Suporte do Azure, abra um tíquete de suporte do Azure.
- Para problemas de OpenTelemetry, entre em contato diretamente com a comunidade do OpenTelemetry.
Comentários sobre o OpenTelemetry
Para fornecer comentários:
- Preencha a pesquisa de comentários do cliente da Comunidade do OpenTelemetry.
- Fale um pouco sobre você para a Microsoft: ingresse em nossa Comunidade de usuário pioneiro do OpenTelemetry.
- Entre em contato com outros usuários do Azure Monitor na Comunidade de tecnologia da Microsoft.
- Solicite um recurso no Fórum de comentários do Azure.
Próximas etapas
- Examine as opções de configuração de instrumentação automática do Java.
- Para examinar o código-fonte, confira o repositório GitHub de instrumentação automática do Azure Monitor para Java.
- Para saber mais sobre o OpenTelemetry e a comunidade dele, acesse o repositório GitHub do OpenTelemetry para Java.
- Para habilitar experiências de usuário, confira Habilitar o monitoramento de usuário de navegador/Web.