Primeiros Passos com Exemplos
Está página vai mostrar para você como iniciar com OpenTelemetry em Java.
Você aprenderá como você pode instrumentar uma aplicação simples em Java automaticamente, de forma que os traços, métricas, e registros sejam emitidos para o console.
Pré requisitos
Confirme que você possua os itens a seguir instalados localmente:
- Java JDK 17+, devido ao uso do Spring Boot 3; Java 8+ caso contrário
- Gradle
Aplicação de Exemplo
O exemplo a seguir usa uma aplicação básica de Spring Boot. Você pode usar outro framework web, como o Apache Wicket ou Play. Para uma lista completa de bibliotecas e frameworks suportados, consulte o registro.
Para exemplos mais elaborados, veja exemplos.
Dependencias
Para começar, crie um ambiente em um novo diretório chamado java-simple
.
Dentro do diretório, crie um arquivo chamado build.gradle.kts
com o seguinte
conteúdo:
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")
}
Crie e execute 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 os comandos a seguir, e então abra http://localhost:8080/rolldice no seu navegador para validar que está tudo funcionando.
gradle assemble
java -jar ./build/libs/java-simple.jar
Instrumentação
Próximo, vamos utilizar o Java agent para instrumentar automaticamente a aplicação em tempo de execução. Enquanto você pode configurar o Java agent de várias formas, os passos abaixo utilizam variáveis de ambiente.
Baixe opentelemetry-javaagent.jar de Releases no 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
Anote o caminho para o arquivo JAR.
Defina e exporte variáveis que especifiquem o JAR do agente Java e o exportador de console, usando a notação adequada para o seu ambiente de shell/terminal — nós demonstramos uma 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- Substitua
PATH/TO
acima, com o caminho para o arquivo JAR. - Defina
OTEL_METRIC_EXPORT_INTERVAL
para um valor bem abaixo do padrão, como nós demonstramos acima, somente durante os testes para ajudar você mais rapidamente na confirmação de que as métricas estão sendo geradas corretamente.
- Substitua
Execute sua aplicação novamente:
$ java -jar ./build/libs/java-simple.jar ...
Observe a saída do
otel.javaagent
.De outro terminal, envie uma requisição usando
curl
:curl localhost:8080/rolldice
Pare o processo do servidor.
No passo 4, você deve observar os traços e registros na saída do servidor e do cliente que se parecem com isso (a saída dos traços foi quebrada em linhas para facilitar a 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, quando parar o servidor, você deve observar uma saída com todas as métricas coletadas (a saída das métricas foi quebrada em linhas para facilitar a 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}} ...
Próximos passos?
Para mais:
- Execute este exemplo com outro [exportados] de dados de telemetria.
- Teste a instrumentação sem código em uma das suas aplicações.
- For light-weight telemetria customizada, tente annotations.
- Leia mais sobre instrumentação manual e tente mais alguns exemplos.
- Dê uma olhada na Demonstração do OpenTelemetry, que inclui o serviço de anúncios baseado em Java e o serviço de detecção de fraudes 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!