Primeiros passos com exemplo
Esta página mostrará como começar a utilizar o OpenTelemetry em Java.
Você aprenderá como instrumentalizar automaticamente uma aplicação Java simples, de modo que rastros, métricas, e logs sejam emitidos para o console.
Pré-requisitos
Certifique-se de ter instalado localmente:
- Java JDK 17+ devido ao uso do Spring Boot 3; Java 8+ para outros casos
- Gradle
Exemplo de Aplicação
O exemplo a seguir utiliza uma aplicação básica Spring Boot. Você pode usar outros frameworks web, como Apache Wicket ou Play. Para uma lista completa das bibliotecas e frameworks suportados, consulte o registro.
Para exemplos mais elaborados, veja exemplos.
Dependências
Para começar, configure um ambiente em um novo diretório chamado java-simple
.
Dentro dele, crie um arquivo chamado build.gradle.kts
e adicione o seguinte
conteúdo ao arquivo:
plugins {
id("java")
id("org.springframework.boot") version "3.0.6"
id("io.spring.dependency-management") version "1.1.0"
}
sourceSets {
main {
java.setSrcDirs(setOf("."))
}
}
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
}
Criando e iniciando um servidor HTTP
No mesmo diretório, crie um arquivo chamado DiceApplication.java
e adicione o
seguinte código ao arquivo:
package otel;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DiceApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(DiceApplication.class);
app.setBannerMode(Banner.Mode.OFF);
app.run(args);
}
}
Crie outro arquivo chamado RollController.java
e adicione o seguinte código ao
arquivo:
package otel;
import java.util.Optional;
import java.util.concurrent.ThreadLocalRandom;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RollController {
private static final Logger logger = LoggerFactory.getLogger(RollController.class);
@GetMapping("/rolldice")
public String index(@RequestParam("player") Optional<String> player) {
int result = this.getRandomNumber(1, 6);
if (player.isPresent()) {
logger.info("{} is rolling the dice: {}", player.get(), result);
} else {
logger.info("Anonymous player is rolling the dice: {}", result);
}
return Integer.toString(result);
}
public int getRandomNumber(int min, int max) {
return ThreadLocalRandom.current().nextInt(min, max + 1);
}
}
Compile e execute a aplicação com o seguinte comando, e então abra http://localhost:8080/rolldice no seu navegador para ter certeza que está funcionando.
gradle assemble
java -jar ./build/libs/java-simple.jar
Instrumentação
Em seguida, você usará um agente Java para instrumentalizar automaticamente a aplicação durante sua inicialização. Embora seja possível configurar o agente Java de várias maneiras, os passos abaixo utilizam variáveis de ambiente.
Faça o download do opentelemetry-javaagent.jar na página de releases do repositório
opentelemetry-java-instrumentation
. O arquivo JAR contém o agente e todos os pacotes de instrumentação automática:curl -L -O https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
Take note of the path to the JAR file.
Configure e exporte as variáveis que especificam o JAR do agente Java e um exportador de console, utilizando a notação adequada para seu ambiente — aqui demonstramos a notação para shells do tipo bash:
export JAVA_TOOL_OPTIONS="-javaagent:PATH/TO/opentelemetry-javaagent.jar" \ OTEL_TRACES_EXPORTER=logging \ OTEL_METRICS_EXPORTER=logging \ OTEL_LOGS_EXPORTER=logging \ OTEL_METRIC_EXPORT_INTERVAL=15000
Important- Replace
PATH/TO
above, with your path to the JAR. - Set
OTEL_METRIC_EXPORT_INTERVAL
to a value well below the default, as we illustrate above, only during testing to help you more quickly ensure that metrics are properly generated.
- Replace
Execute a aplicação mais uma vez:
$ java -jar ./build/libs/java-simple.jar ...
Observe a saída do
otel.javaagent
.De outro terminal, envie uma requisição utilizando
curl
:curl localhost:8080/rolldice
Pare o processo do servidor.
No passo 4, você deve ter visto o rastro e log na saída do console do servidor e cliente que se parece com algo assim (a saída do rastro está quebrada em linhas para melhor visualização):
[otel.javaagent 2023-04-24 17:33:54:567 +0200] [http-nio-8080-exec-1] INFO io.opentelemetry.exporter.logging.LoggingSpanExporter - 'RollController.index' : 70c2f04ec863a956e9af975ba0d983ee 7fd145f5cda13625 INTERNAL [tracer: io.opentelemetry.spring-webmvc-6.0:1.25.0-alpha] AttributesMap{data= {thread.id=39, thread.name=http-nio-8080-exec-1}, capacity=128, totalAddedValues=2} [otel.javaagent 2023-04-24 17:33:54:568 +0200] [http-nio-8080-exec-1] INFO io.opentelemetry.exporter.logging.LoggingSpanExporter - 'GET /rolldice' : 70c2f04ec863a956e9af975ba0d983ee 647ad186ad53eccf SERVER [tracer: io.opentelemetry.tomcat-10.0:1.25.0-alpha] AttributesMap{ data={user_agent.original=curl/7.87.0, net.host.name=localhost, net.transport=ip_tcp, http.target=/rolldice, net.sock.peer.addr=127.0.0.1, thread.name=http-nio-8080-exec-1, net.sock.peer.port=53422, http.route=/rolldice, net.sock.host.addr=127.0.0.1, thread.id=39, net.protocol.name=http, http.status_code=200, http.scheme=http, net.protocol.version=1.1, http.response_content_length=1, net.host.port=8080, http.method=GET}, capacity=128, totalAddedValues=17}
No passo 5, ao parar o servidor, você verá uma saída com todas as métricas coletadas (a saída das métricas está quebrada em linhas e resumida para melhor visualização):
[otel.javaagent 2023-04-24 17:34:25:347 +0200] [PeriodicMetricReader-1] INFO io.opentelemetry.exporter.logging.LoggingMetricExporter - Received a collection of 19 metrics for export. [otel.javaagent 2023-04-24 17:34:25:347 +0200] [PeriodicMetricReader-1] INFO io.opentelemetry.exporter.logging.LoggingMetricExporter - metric: ImmutableMetricData{resource=Resource{schemaUrl= https://opentelemetry.io/schemas/1.19.0, attributes={host.arch="aarch64", host.name="OPENTELEMETRY", os.description="Mac OS X 13.3.1", os.type="darwin", process.command_args=[/bin/java, -jar, java-simple.jar], process.executable.path="/bin/java", process.pid=64497, process.runtime.description="Homebrew OpenJDK 64-Bit Server VM 20", process.runtime.name="OpenJDK Runtime Environment", process.runtime.version="20", service.name="java-simple", telemetry.auto.version="1.25.0", telemetry.sdk.language="java", telemetry.sdk.name="opentelemetry", telemetry.sdk.version="1.25.0"}}, instrumentationScopeInfo=InstrumentationScopeInfo{name=io.opentelemetry.runtime-metrics, version=1.25.0, schemaUrl=null, attributes={}}, name=process.runtime.jvm.buffer.limit, description=Total capacity of the buffers in this pool, unit=By, type=LONG_SUM, data=ImmutableSumData{points= [ImmutableLongPointData{startEpochNanos=1682350405319221000, epochNanos=1682350465326752000, attributes= {pool="mapped - 'non-volatile memory'"}, value=0, exemplars=[]}, ImmutableLongPointData{startEpochNanos=1682350405319221000, epochNanos=1682350465326752000, attributes={pool="mapped"}, value=0, exemplars=[]}, ImmutableLongPointData{startEpochNanos=1682350405319221000, epochNanos=1682350465326752000, attributes={pool="direct"}, value=8192, exemplars=[]}], monotonic=false, aggregationTemporality=CUMULATIVE}} ...
O que vem depois?
Para mais:
- Execute este exemplo com outro exportador para dados de telemetria.
- Experimente a instrumentação sem código em uma de suas próprias aplicações.
- Para telemetria levemente personalizada, experimente anotações.
- Aprenda sobre instrumentação manual e experimente mais exemplos.
- Dê uma olhada no OpenTelemetry Demo, que inclui o Serviço de Anúncios baseado em Java e o Serviço de Detecção de Fraude baseado em Kotlin
Feedback
Was this page helpful?
Thank you. Your feedback is appreciated!
Please let us know how we can improve this page. Your feedback is appreciated!