O agente do Application Real-Time Monitoring Service (ARMS) instrumenta automaticamente frameworks Java comuns para coletar dados de rastreamento sem alterações no código. Para capturar dados de rastreamento que reflitam sua lógica de negócios específica, adicione instrumentação personalizada usando o sdk do OpenTelemetry para Java. Este tópico descreve como usar o sdk do OpenTelemetry para Java para adicionar instrumentação personalizada, acessar o contexto de rastreamento, definir Baggage personalizado e configurar atributos personalizados.
Para obter informações sobre componentes e frameworks compatíveis com o agente ARMS, consulte Componentes e frameworks Java compatíveis com o ARMS.
Pré-requisitos
Conecte sua aplicação ao Application Real-Time Monitoring Service (ARMS). Para mais informações, consulte Visão geral da integração do Application Monitoring.
Atualize o agente ARMS para a versão 2.9.1.2 ou posterior. Para atualizar o agente, consulte Atualizar o agente ARMS.
Adicionar dependências
Adicione as seguintes dependências Maven ao seu projeto. Para mais informações, consulte a documentação oficial do OpenTelemetry.
<dependencies>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk-trace</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-bom</artifactId>
<version>1.23.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Compatibilidade do agente ARMS com instrumentação OpenTelemetry
Conceitos principais
Esta seção descreve apenas termos comuns. Para mais informações sobre outros termos, consulte a Especificação do OpenTelemetry.
span: uma operação específica em uma requisição, como um ponto de entrada de chamada remota ou uma chamada de método interno.
SpanContext: o contexto de um rastreamento, incluindo informações como o id do rastreamento e o id do span.
atributo: um campo adicional em um span que registra informações-chave.
Baggage: pares chave-valor propagados por todo o rastreamento.
Usar o sdk do OpenTelemetry para Java
Use o sdk do OpenTelemetry para realizar as seguintes operações:
Adicionar instrumentação para gerar spans.
Adicionar atributos aos spans.
Propagar Baggage no contexto de rastreamento.
Obter o contexto de rastreamento atual e imprimir informações como o id do rastreamento e o id do span.
O código de exemplo a seguir mostra como usar o sdk do OpenTelemetry para executar essas operações.
Importante: Obtenha a instância do OpenTelemetry chamando GlobalOpenTelemetry.get(). Não use uma instância criada manualmente com o sdk do OpenTelemetry. Caso contrário, no agente ARMS v4.x, os spans gerados pela instrumentação do sdk não ficarão visíveis.
@RestController
@RequestMapping("/ot")
public class OpenTelemetryController {
private Tracer tracer;
private ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
@PostConstruct
public void init() {
OpenTelemetrySdk.builder()
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
.buildAndRegisterGlobal();
tracer = GlobalOpenTelemetry.get().getTracer("manual-sdk", "1.0.0");
ses.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Span span = tracer.spanBuilder("schedule")
.setAttribute("schedule.time", System.currentTimeMillis())
.startSpan();
try (Scope scope = span.makeCurrent()) {
System.out.println("scheduled!");
Thread.sleep(500L);
span.setAttribute("schedule.success", true);
System.out.println(Span.current().getSpanContext().getTraceId()); // Get the trace ID
} catch (Throwable t) {
span.setStatus(StatusCode.ERROR, t.getMessage());
} finally {
span.end();
}
}
}, 10, 30, TimeUnit.SECONDS);
}
@ResponseBody
@RequestMapping("/parent")
public String parent() {
Span span = tracer.spanBuilder("parent").setSpanKind(SpanKind.SERVER).startSpan();
try (Scope scope = span.makeCurrent()) {
// Use Baggage to propagate custom business tags.
Baggage baggage = Baggage.current().toBuilder()
.put("user.id", "1")
.put("user.name", "name")
.build();
try (Scope baggageScope = baggage.storeInContext(Context.current()).makeCurrent()) {
child();
}
span.setAttribute("http.method", "GET");
span.setAttribute("http.uri", "/parent");
} finally {
span.end();
}
return "parent";
}
private void child() {
Span span = tracer.spanBuilder("child").startSpan();
try (Scope scope = span.makeCurrent()) {
System.out.println("current traceId = " + Span.current().getSpanContext().getTraceId());
System.out.println("userId in baggage = " + Baggage.current().getEntryValue("user.id"));
Thread.sleep(1000);
} catch (Throwable e) {
span.setStatus(StatusCode.ERROR, e.getMessage());
} finally {
span.end();
}
}
}
Exemplo detalhado:
No método
initda classeOpenTelemetryController, uma tarefa agendada é iniciada. Um span é criado no início de cada execução e finalizado ao término.-
No método
parentda classeOpenTelemetryController, vários métodos do sdk do OpenTelemetry são chamados.Sempre que o método é chamado, um span chamado
parenté criado e finalizado quando o método termina.O sdk de Baggage adiciona dois itens de Baggage:
user.ideuser.name. Esses itens se propagam para aplicações downstream.Dois atributos são adicionados ao span criado na etapa 2.a.
-
O método
childda classeOpenTelemetryControllerexecuta as seguintes operações:
Diferenças entre versões do agente ARMS
O suporte às operações no código anterior varia conforme a versão do agente ARMS.
|
Etapa |
Agente ARMS v4.x e posterior |
Agente ARMS v3.x e anterior |
|
1 |
Compatível. Um novo span é gerado. |
Compatível. Um novo span é gerado. |
|
2.a |
Compatível |
Compatível |
|
2.b |
Compatível |
Não compatível |
|
2.c |
Compatível |
Compatível |
|
3.a |
Compatível |
Compatível. Este span aparece como uma pilha de métodos dentro do span criado na etapa 2.a. |
|
3.b |
Compatível. O id de rastreamento impresso é igual ao id de rastreamento no ARMS. |
Não compatível. O id de rastreamento impresso difere do id de rastreamento no agente ARMS. |
|
3.c |
Compatível |
Compatível |
Resultados da instrumentação
v4.x e posterior
-
Resultado da instrumentação da Etapa 1:
Visualize o span gerado pelo sdk do OpenTelemetry.
Nos Detalhes do Span de um rastreamento no console ARMS, visualize informações básicas, como nome da aplicação (por exemplo,
elastic-search-8), nome da operação (por exemplo,schedule), tipo de span (INTERNAL) e duração. Na aba Attributes, visualize atributos do OpenTelemetry, comootel.scope.name=manual-sdkeotel.scope.version=1.0.0, além de atributos de negócios personalizados, comoschedule.success=true, confirmando que a instrumentação está funcionando. -
Resultados da instrumentação das Etapas 2.x e 3.x:
Os spans gerados pelo sdk do OpenTelemetry aparecem no mesmo rastreamento que os spans do Tomcat gerados pelo agente. Além disso, os atributos relacionados aos spans gerados pelo sdk são definidos conforme esperado.
Nos detalhes do rastreamento, o nome da operação do span gerado pela instrumentação do agente Tomcat é
/opentelemetry/parent. Os spans gerados pelo sdk do OpenTelemetry são nomeados comoparente seu span filho comochild. Nos atributos do span,http.methodéGET,http.urié/parente o atributo personalizadootel.scope.nameémanual-sdk.
v3.x e anterior
-
Resultado da instrumentação da Etapa 1:
Na página de detalhes do rastreamento no console ARMS, visualize os dados de rastreamento coletados pela instrumentação. O gráfico em cascata à esquerda mostra as relações de chamada dos spans. Por exemplo, o método
scheduleda aplicaçãoelastic-search-9é capturado como um span com tipo de componenteuser_methode tempo total de resposta de 567 ms. O painel Span Details à direita exibe informações básicas como nome da aplicação, nome do span, endereço ip, id do span e código de status. A seção Attributes abaixo exibe atributos adicionais agrupados, incluindo http Information (http.path,http.status_code), RPC Information (rpc.type) e Built-in Information (component.name=user_method,slow=1). -
Resultados da instrumentação das Etapas 2.x e 3.x:
O span
childé exibido dentro da pilha de métodos do spanparent. Além disso, os atributos dos spans gerados pelo sdk são definidos conforme esperado.Na visualização de method stack, a hierarquia de rastreamento mostra o OpenTelemetry Entry Span chamando o span parent, que por sua vez chama o span child. Essas três chamadas aninhadas levam cerca de 1,01 segundo cada. Os atributos do método child incluem
line=-1erpc.type=98.
Documentos relacionados
Correlacionar informações de id de rastreamento com os logs de negócios da sua aplicação permite encontrar rapidamente logs associados para solução de problemas quando ocorre uma falha. Para mais informações, consulte Associar ids de rastreamento a logs de negócios para aplicações Java.