Todos os produtos
Search
Central de documentação

Application Real-Time Monitoring Service:Reportar dados de rastreamento de aplicações Java usando OpenTelemetry

Última atualização: Jul 05, 2026

O Managed Service for OpenTelemetry coleta dados de rastreamento de aplicações Java e fornece topologia de aplicação, traces, análise de transações anômalas e lentas, além de análise de SQL. Estão disponíveis três abordagens de instrumentação, desde a configuração de agente sem código até o controle total via SDK.

Abordagem

Esforço

Quando usar

Agente Java do OpenTelemetry (recomendado)

Mínimo — anexe um JAR, sem alterações de código

Para a maioria das aplicações. Comece por aqui.

SDK do OpenTelemetry para Java

Moderado — escreva código de instrumentação

Spans personalizados, atributos específicos ou frameworks não suportados

Combinação de Agente + SDK

Moderado — o agente cuida do básico, o SDK adiciona spans personalizados

Cobertura automática combinada com instrumentação personalizada direcionada

Código de exemplo

Clone ou navegue pelo projeto de exemplo para obter uma referência funcional:

git clone https://github.com/alibabacloud-observability/java-demo.git
cd java-demo/opentelemetry-demo

Método 1: Instrumentação automática com o agente Java do OpenTelemetry

O agente Java do OpenTelemetry se anexa à JVM na inicialização e instrumenta centenas de bibliotecas e frameworks sem exigir alterações no código. Este é o ponto de partida recomendado para a maioria das aplicações.

Etapa 1: Baixe o agente

Baixe o JAR do agente mais recente em GitHub Releases:

# wget
wget -O opentelemetry-javaagent.jar \
  https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar

# or curl
curl -Lo opentelemetry-javaagent.jar \
  https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar

Etapa 2: Configure parâmetros da JVM e execute a aplicação

Adicione a flag -javaagent antes do argumento -jar. Escolha o protocolo HTTP ou gRPC.

HTTP

java -javaagent:/path/to/opentelemetry-javaagent.jar \
  -Dotel.resource.attributes=service.name=<your-service-name>,service.version=<your-version>,deployment.environment=<your-env> \
  -Dotel.exporter.otlp.protocol=http/protobuf \
  -Dotel.exporter.otlp.traces.endpoint=<traces-endpoint> \
  -Dotel.exporter.otlp.metrics.endpoint=<metrics-endpoint> \
  -Dotel.logs.exporter=none \
  -jar /path/to/your/app.jar

Substitua os placeholders pelos valores reais:

Placeholder

Descrição

Exemplo

<your-service-name>

Nome que identifica sua aplicação

order-service

<your-version>

Versão da aplicação

1.0.0

<your-env>

Ambiente de implantação

production

<traces-endpoint>

Endpoint de rastreamento da seção Pré-requisitos

http://tracing-analysis-dc-hz-internal.aliyuncs.com/adapt_ggxw4l****@7323a5caae3****_ggxw4l****@53df7ad2afe****/api/otlp/traces

<metrics-endpoint>

Endpoint de métricas da seção Pré-requisitos

http://tracing-analysis-dc-hz-internal.aliyuncs.com/adapt_ggxw4l****@7323a5caae3****_ggxw4l****@53df7ad2afe****/api/otlp/metrics

Exemplo:

java -javaagent:/path/to/opentelemetry-javaagent.jar \
  -Dotel.resource.attributes=service.name=order-service,service.version=1.0.0,deployment.environment=production \
  -Dotel.exporter.otlp.protocol=http/protobuf \
  -Dotel.exporter.otlp.traces.endpoint=http://tracing-analysis-dc-hz-internal.aliyuncs.com/adapt_ggxw4l****@7323a5caae3****_ggxw4l****@53df7ad2afe****/api/otlp/traces \
  -Dotel.exporter.otlp.metrics.endpoint=http://tracing-analysis-dc-hz-internal.aliyuncs.com/adapt_ggxw4l****@7323a5caae3****_ggxw4l****@53df7ad2afe****/api/otlp/metrics \
  -Dotel.logs.exporter=none \
  -jar /path/to/your/app.jar

gRPC

java -javaagent:/path/to/opentelemetry-javaagent.jar \
  -Dotel.resource.attributes=service.name=<your-service-name>,service.version=<your-version>,deployment.environment=<your-env> \
  -Dotel.exporter.otlp.protocol=grpc \
  -Dotel.exporter.otlp.headers=Authentication=<token> \
  -Dotel.exporter.otlp.endpoint=<endpoint> \
  -Dotel.logs.exporter=none \
  -jar /path/to/your/app.jar

Substitua os placeholders pelos valores reais:

Placeholder

Descrição

Exemplo

<token>

Token de autenticação da seção Pré-requisitos

ggxw4l****@7323a5caae3****_ggxw4l****@53df7ad2afe****

<endpoint>

Endpoint gRPC da seção Pré-requisitos

http://tracing-analysis-dc-hz-internal.aliyuncs.com:8090

Exemplo:

java -javaagent:/path/to/opentelemetry-javaagent.jar \
  -Dotel.resource.attributes=service.name=order-service,service.version=1.0.0,deployment.environment=production \
  -Dotel.exporter.otlp.protocol=grpc \
  -Dotel.exporter.otlp.headers=Authentication=ggxw4l****@7323a5caae3****_ggxw4l****@53df7ad2afe**** \
  -Dotel.exporter.otlp.endpoint=http://tracing-analysis-dc-hz-internal.aliyuncs.com:8090 \
  -Dotel.logs.exporter=none \
  -jar /path/to/your/app.jar
Para encaminhar dados de rastreamento por meio de um OpenTelemetry Collector, remova -Dotel.exporter.otlp.headers=Authentication=<token> e defina <endpoint> como o endereço do Collector na máquina local.

Etapa 3: Verifique dados de rastreamento

  1. Abra o console do Managed Service for OpenTelemetry.

  2. Na página Applications, clique em nome da aplicação.

  3. Confirme se os traces aparecem na página de detalhes da aplicação.

Solução de problemas:

  • Se nenhum dado aparecer, verifique se o endpoint e o token estão corretos.

  • Ative o log de depuração para inspecionar o comportamento do agente:

      -Dotel.javaagent.debug=true
  • Desative temporariamente o agente sem removê-lo do comando de inicialização:

      -Dotel.javaagent.enabled=false

Método 2: Instrumentação manual com o SDK do OpenTelemetry para Java

Use o SDK do OpenTelemetry para Java quando precisar de controle total sobre quais operações geram spans, quais atributos eles carregam ou quando o agente automático não cobrir seu framework.

Etapa 1: Adicionar dependências Maven

Adicione o seguinte ao seu pom.xml:

<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-exporter-otlp</artifactId>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-sdk</artifactId>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-semconv</artifactId>
        <version>1.30.0-alpha</version>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>io.opentelemetry</groupId>
            <artifactId>opentelemetry-bom</artifactId>
            <version>1.30.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Etapa 2: Inicializar o tracer

Crie uma classe auxiliar para configurar o exporter, os atributos de resource e o tracer. Selecione o protocolo correspondente ao seu ambiente.

HTTP

import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;

public class OpenTelemetrySupport {

    static {
        // Define the resource that describes this service
        Resource resource = Resource.getDefault()
                .merge(Resource.create(Attributes.of(
                        ResourceAttributes.SERVICE_NAME, "<your-service-name>",
                        ResourceAttributes.SERVICE_VERSION, "<your-version>",
                        ResourceAttributes.DEPLOYMENT_ENVIRONMENT, "<your-env>",
                        ResourceAttributes.HOST_NAME, "<your-host-name>"
                )));

        // Build a tracer provider with the OTLP HTTP exporter
        SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()
                .addSpanProcessor(BatchSpanProcessor.builder(OtlpHttpSpanExporter.builder()
                        .setEndpoint("<endpoint>")  // Trace endpoint from the Prerequisites section
                        .build()).build())
                .setResource(resource)
                .build();

        // Register the SDK globally
        OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
                .setTracerProvider(sdkTracerProvider)
                .setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
                .buildAndRegisterGlobal();

        tracer = openTelemetry.getTracer("OpenTelemetry Tracer", "1.0.0");
    }

    private static Tracer tracer;

    public static Tracer getTracer() {
        return tracer;
    }
}

gRPC

import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;

public class OpenTelemetrySupport {

    static {
        // Define the resource that describes this service
        Resource resource = Resource.getDefault()
                .merge(Resource.create(Attributes.of(
                        ResourceAttributes.SERVICE_NAME, "<your-service-name>",
                        ResourceAttributes.SERVICE_VERSION, "<your-version>",
                        ResourceAttributes.DEPLOYMENT_ENVIRONMENT, "<your-env>",
                        ResourceAttributes.HOST_NAME, "<your-host-name>"
                )));

        // Build a tracer provider with the OTLP gRPC exporter
        SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()
                .addSpanProcessor(BatchSpanProcessor.builder(OtlpGrpcSpanExporter.builder()
                        .setEndpoint("<endpoint>")         // gRPC endpoint from the Prerequisites section
                        .addHeader("Authentication", "<token>")  // Authentication token from the Prerequisites section
                        .build()).build())
                .setResource(resource)
                .build();

        // Register the SDK globally
        OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
                .setTracerProvider(sdkTracerProvider)
                .setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
                .buildAndRegisterGlobal();

        tracer = openTelemetry.getTracer("OpenTelemetry Tracer", "1.0.0");
    }

    private static Tracer tracer;

    public static Tracer getTracer() {
        return tracer;
    }
}

Etapa 3: Crie spans

Use o tracer para criar spans pai e filho. Cada span captura uma unidade de trabalho, juntamente com atributos e status de erro.

import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.StatusCode;
import io.opentelemetry.context.Scope;

public class Main {

    public static void parentMethod() {
        // Start a parent span
        Span span = OpenTelemetrySupport.getTracer().spanBuilder("parent span").startSpan();
        try (Scope scope = span.makeCurrent()) {
            span.setAttribute("good", "job");
            childMethod();
        } catch (Throwable t) {
            span.setStatus(StatusCode.ERROR, "handle parent span error");
        } finally {
            span.end();
        }
    }

    public static void childMethod() {
        // Start a child span -- automatically linked to the parent through Context
        Span span = OpenTelemetrySupport.getTracer().spanBuilder("child span").startSpan();
        try (Scope scope = span.makeCurrent()) {
            span.setAttribute("hello", "world");
        } catch (Throwable t) {
            span.setStatus(StatusCode.ERROR, "handle child span error");
        } finally {
            span.end();
        }
    }

    public static void main(String[] args) {
        parentMethod();
    }
}

Etapa 4: Execute a aplicação e verifique

Execute a aplicação e abra o console do Managed Service for OpenTelemetry. Na página Applications, clique em nome da aplicação e confirme se os traces aparecem.

Método 3: Combinar o agente Java com o SDK

Use o agente para ampla cobertura automática e o SDK para spans personalizados direcionados. O agente configura automaticamente o SDK na inicialização por meio da dependência opentelemetry-sdk-extension-autoconfigure, eliminando a necessidade da classe auxiliar OpenTelemetrySupport do Método 2.

Etapa 1: Baixe o agente

Baixe o agente Java do OpenTelemetry conforme descrito na Etapa 1 do Método 1.

Etapa 2: Adicionar dependências Maven

Além das dependências listadas na Etapa 1 do Método 2, adicione as seguintes:

<dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-extension-annotations</artifactId>
</dependency>
<dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-sdk-extension-autoconfigure</artifactId>
    <version>1.23.0-alpha</version>
</dependency>
A dependência opentelemetry-sdk-extension-autoconfigure transfere as configurações do agente para o SDK automaticamente, dispensando a configuração do exporter ou dos atributos de resource no código.

Dependências completas do pom.xml

<dependencies>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.3</version>
    </dependency>
    <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-extension-annotations</artifactId>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-exporter-otlp</artifactId>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-sdk</artifactId>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-semconv</artifactId>
        <version>1.30.0-alpha</version>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-sdk-extension-autoconfigure</artifactId>
        <version>1.23.0-alpha</version>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>io.opentelemetry</groupId>
            <artifactId>opentelemetry-bom</artifactId>
            <version>1.30.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Etapa 3: Obter um tracer

Como o agente gerencia a inicialização do SDK, obtenha o tracer global diretamente:

OpenTelemetry openTelemetry = GlobalOpenTelemetry.get();
Tracer tracer = openTelemetry.getTracer("instrumentation-library-name", "1.0.0");

Etapa 4: Adicionar instrumentação personalizada

Existem três técnicas para adicionar instrumentação complementar ao agente:

Técnica 1: Adicionar atributos a um span criado automaticamente

Chame Span.current() dentro de um método já instrumentado para anexar atributos de negócio:

@RequestMapping("/async")
public String async() {
    Span span = Span.current();
    span.setAttribute("user.id", "123456");
    userService.async();
    child("vip");
    return "async";
}

Técnica 2: Usar @WithSpan para instrumentação baseada em anotações

Anote um método com @WithSpan para criar um span automaticamente. Use @SpanAttribute para registrar parâmetros:

@WithSpan
private void child(@SpanAttribute("user.type") String userType) {
    System.out.println(userType);
    biz();
}

Técnica 3: Criar spans manualmente com um tracer

Para controle total, construa spans com a API do tracer. Este exemplo também propaga o contexto para uma thread assíncrona:

private void biz() {
    Tracer tracer = GlobalOpenTelemetry.get().getTracer("tracer");
    Span span = tracer.spanBuilder("biz (manual)")
        .setParent(Context.current().with(Span.current()))  // optional -- set automatically
        .startSpan();

    try (Scope scope = span.makeCurrent()) {
        span.setAttribute("biz-id", "111");

        // Propagate context into an async task
        es.submit(() -> {
            Span asyncSpan = tracer.spanBuilder("async")
                .setParent(Context.current().with(span))
                .startSpan();
            try {
                Thread.sleep(1000L);  // simulate async work
            } catch (Throwable e) {
                // handle error
            }
            asyncSpan.end();
        });

        Thread.sleep(1000);  // simulate business logic
    } catch (Throwable t) {
        span.setStatus(StatusCode.ERROR, "handle biz error");
    } finally {
        span.end();
    }
}

Código completo do controller e service

Controller (com.alibaba.arms.brightroar.console.controller):

package com.alibaba.arms.brightroar.console.controller;

import com.alibaba.arms.brightroar.console.service.UserService;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.StatusCode;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope;
import io.opentelemetry.extension.annotations.SpanAttribute;
import io.opentelemetry.extension.annotations.WithSpan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    private ExecutorService es = Executors.newFixedThreadPool(5);

    // Technique 1: Add attributes to an auto-created span
    @RequestMapping("/async")
    public String async() {
        System.out.println("UserController.async -- " + Thread.currentThread().getId());
        Span span = Span.current();
        span.setAttribute("user.id", "123456");
        userService.async();
        child("vip");
        return "async";
    }

    // Technique 2: Annotation-based instrumentation
    @WithSpan
    private void child(@SpanAttribute("user.type") String userType) {
        System.out.println(userType);
        biz();
    }

    // Technique 3: Manual span creation
    private void biz() {
        Tracer tracer = GlobalOpenTelemetry.get().getTracer("tracer");
        Span span = tracer.spanBuilder("biz (manual)")
            .setParent(Context.current().with(Span.current()))
            .startSpan();

        try (Scope scope = span.makeCurrent()) {
            span.setAttribute("biz-id", "111");

            es.submit(new Runnable() {
                @Override
                public void run() {
                    Span asyncSpan = tracer.spanBuilder("async")
                        .setParent(Context.current().with(span))
                        .startSpan();
                    try {
                        Thread.sleep(1000L); // simulate async work
                    } catch (Throwable e) {
                    }
                    asyncSpan.end();
                }
            });

            Thread.sleep(1000); // simulate business logic
            System.out.println("biz done");
            OpenTelemetry openTelemetry = GlobalOpenTelemetry.get();
            openTelemetry.getPropagators();
        } catch (Throwable t) {
            span.setStatus(StatusCode.ERROR, "handle biz error");
        } finally {
            span.end();
        }
    }

}

Service (com.alibaba.arms.brightroar.console.service):

package com.alibaba.arms.brightroar.console.service;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Async
    public void async() {
        System.out.println("UserService.async -- " + Thread.currentThread().getId());
        System.out.println("my name is async");
        System.out.println("UserService.async -- ");
    }
}

Etapa 5: Configure parâmetros da JVM e execute a aplicação

java -javaagent:/path/to/opentelemetry-javaagent.jar \
  -Dotel.resource.attributes=service.name=<your-service-name> \
  -Dotel.exporter.otlp.headers=Authentication=<token> \
  -Dotel.exporter.otlp.endpoint=<endpoint> \
  -jar /path/to/your/app.jar

Exemplo:

java -javaagent:/path/to/opentelemetry-javaagent.jar \
  -Dotel.resource.attributes=service.name=ot-java-agent-sample \
  -Dotel.exporter.otlp.headers=Authentication=b590xxxxuqs@3a75d95xxxxx9b_b59xxxxguqs@53dxxxx2afe8301 \
  -Dotel.exporter.otlp.endpoint=http://tracing-analysis-dc-bj:8090 \
  -jar /path/to/your/app.jar
Para encaminhar dados de rastreamento por meio de um OpenTelemetry Collector, remova -Dotel.exporter.otlp.headers=Authentication=<token> e defina <endpoint> como o endereço do Collector na máquina local.

Abra o console do Managed Service for OpenTelemetry. Na página Applications, clique em nome da aplicação e confirme se os traces aparecem.

Frameworks Java suportados

O agente Java do OpenTelemetry instrumenta automaticamente os frameworks listados abaixo. Para obter a lista completa e atualizada, consulte Bibliotecas, frameworks, servidores de aplicação e JVMs suportados.

Frameworks Java suportados

Framework

Versão

Akka Actors

2,5 ou superior

Akka HTTP

10,0 ou superior

Apache Axis2

1,6 ou superior

Apache Camel

2,20 ou superior (exceto 3.x)

Apache DBCP

2,0 ou superior

Apache CXF JAX-RS

3,2 ou superior

Apache CXF JAX-WS

3,0 ou superior

Apache Dubbo

2,7 ou superior

Apache HttpAsyncClient

4,1 ou superior

Apache HttpClient

2,0 ou superior

API Producer/Consumer do Apache Kafka

0,11 ou superior

API Streams do Apache Kafka

0,11 ou superior

Apache MyFaces

1,2 ou superior (exceto 3.x)

Apache Pulsar

2,8 ou superior

Cliente baseado em gRPC/Protobuf do Apache RocketMQ

5,0 ou superior

Cliente baseado em Remoting do Apache RocketMQ

4,8 ou superior

Apache Struts 2

2,3 ou superior

Apache Tapestry

5,4 ou superior

Apache Wicket

8,0 ou superior

Armeria

1,3 ou superior

AsyncHttpClient

1,9 ou superior

AWS Lambda

1,0 ou superior

AWS SDK

1.11.x e 2,2 ou superior

Azure Core

1,14 ou superior

Driver Cassandra

3,0 ou superior

Cliente Couchbase

2,0 ou superior e 3,1 ou superior

c3p0

0.9.2 ou superior

Dropwizard Metrics

4,0 ou superior (desativado por padrão)

Dropwizard Views

0,7 ou superior

Eclipse Grizzly

2,3 ou superior

Eclipse Jersey

2,0 ou superior (exceto 3.x)

Cliente HTTP Eclipse Jetty

9,2 ou superior (exceto 10 ou superior)

Eclipse Metro

2,2 ou superior

Eclipse Mojarra

1,2 ou superior (exceto 3.x)

Cliente API Elasticsearch

7,16 ou superior e 8,0 ou superior

Cliente REST Elasticsearch

5,0 ou superior

Cliente Transport Elasticsearch

5,0 ou superior

Finatra

2,9 ou superior

Cliente Geode

1,4 ou superior

Cliente HTTP Google

1,19 ou superior

Grails

3,0 ou superior

GraphQL Java

12,0 ou superior

gRPC

1,6 ou superior

Guava ListenableFuture

10,0 ou superior

GWT

2,0 ou superior

Hibernate

3,3 ou superior

Hibernate Reactive

1,0 ou superior

HikariCP

3,0 ou superior

HttpURLConnection

Java 8 ou superior

Hystrix

1,4 ou superior

Executores Java

Java 8 ou superior

Cliente HTTP Java

Java 11 ou superior

java.util.logging

Java 8 ou superior

Plataforma Java

Java 8 ou superior

JAX-RS

0,5 ou superior

Cliente JAX-RS

1,1 ou superior

JAX-WS

2,0 ou superior (exceto 3.x)

JBoss Log Manager

1,1 ou superior

JDBC

Java 8 ou superior

Jedis

1,4 ou superior

JMS

1,1 ou superior

Jodd Http

4,2 ou superior

JSP

2,3 ou superior

Corrotinas Kotlin

1,0 ou superior

Ktor

1,0 ou superior

Cliente Kubernetes

7,0 ou superior

Lettuce

4,0 ou superior

Log4j 1

1,2 ou superior

Log4j 2

2,11 ou superior

Logback

1,0 ou superior

Micrometer

1,5 ou superior

Driver MongoDB

3,1 ou superior

Netty

3,8 ou superior

OkHttp

2,2 ou superior

Oracle UCP

11,2 ou superior

OSHI

5.3.1 ou superior

Play

2,4 ou superior

Play WS

1,0 ou superior

Quartz

2,0 ou superior

R2DBC

1,0 ou superior

Cliente RabbitMQ

2,7 ou superior

Ratpack

1,4 ou superior

Reactor

3,1 ou superior

Reactor Netty

0,9 ou superior

Rediscala

1,8 ou superior

Redisson

3,0 ou superior

RESTEasy

3,0 ou superior

Restlet

1,0 ou superior

RMI

Java 8 ou superior

RxJava

1,0 ou superior

Scala ForkJoinPool

2,8 ou superior

Servlet

2,2 ou superior

Spark Web Framework

2,3 ou superior

Spring Boot

N/A

Spring Batch

3,0 ou superior (exceto 5,0 ou superior)

Spring Cloud Gateway

2,0 ou superior

Spring Data

1,8 ou superior

Spring Integration

4,1 ou superior (exceto 6,0 ou superior)

Spring JMS

2,0 ou superior

Spring Kafka

2,7 ou superior

Spring RabbitMQ

1,0 ou superior

Spring Scheduling

3,1 ou superior

Spring RestTemplate

3,1 ou superior

Spring Web MVC

3,1 ou superior

Spring Web Services

2,0 ou superior

Spring WebFlux

5,3 ou superior

Spymemcached

2,12 ou superior

Tomcat JDBC Pool

8,5 ou superior

Twilio

6,6 ou superior (exceto 8.x)

Undertow

1,4 ou superior

Vaadin

14,2 ou superior

Vert.x Web

3,0 ou superior

Vert.x HttpClient

3,0 ou superior

Cliente Kafka Vert.x

3,6 ou superior

Vert.x RxJava2

3,5 ou superior

Cliente SQL Vert.x

4,0 ou superior

Vibur DBCP

11,0 ou superior

ZIO

2,0 ou superior