
Cập nhật lần cuối: 23/01/2026 17:00
Sử dụng APIs & SDK giúp người dùng chủ động sửa code để giám sát được các nghiệp vụ cụ thể, cấu hình nâng cao trong code.
Các ngôn ngữ hiện đang được hỗ trợ:
Bước 1: Cập nhật file cấu hình
Import BOMs với Maven
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-instrumentation-bom</artifactId>
<version>2.24.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Nếu sử dụng Gradle
import org.springframework.boot.gradle.plugin.SpringBootPlugin
plugins {
id("java")
id("org.springframework.boot") version "3.2.O"
}
dependencies {
implementation(platform(SpringBootPlugin.BOM_COORDINATES))
implementation(platform("io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom:2.24.0"))
}
Hoặc sử dụng io.spring.dependency-management và import BOM
plugins {
id("java")
id("org.springframework.boot") version "3.2.O"
id("io.spring.dependency-management") version "1.1.0"
}
dependencyManagement {
imports {
mavenBom("io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom:2.24.0")
}
}
Bước 2: Cấu hình tới collector
public class OpenTelemetrySupport{
static {
Resource resource = Resource.getDefault()
.merge(Resource.create(Attributes.of(
ResourceAttributes.SERVICE_NAME, "<logical-service-name>",
ResourceAttributes.HOST_NAME, "<host-name>"
)));
SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()
.addSpanProcessor(BatchSpanProcessor.builder(OtlpGrpcSpanExporter.builder()
.setEndpoint("<endpoint>")
.addHeader("Authentication", "<token>")
.build()).build())
.setResource(resource)
.build();
OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
.setTracerProvider(sdkTracerProvider)
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
.buildAndRegisterGlobal();
tracer = openTelemetry.getTracer("<tracer_name>", "1.0.0");
}
private static Tracer tracer;
public static Tracer getTracer() {
return tracer;
}
}
Bước 3: Cập nhật code
@RestController
@RequestMapping("/user")
public class UserController {
private ExecutorService es = Executors.newFixedThreadPool(5);
@GetMapping("/{id}")
public String getUser(@PathVariable("id") Integer id) throws InterruptedException {
findUser(id);
return "User with id = " + id;
}
@WithSpan
private void findUser(@SpanAttribute("user.id") Integer id) throws InterruptedException {
Tracer tracer = GlobalOpenTelemetry.get().getTracer("tracer");
Span span = tracer.spanBuilder("new span (manual)")
.setParent(Context.current().with(Span.current()))
.startSpan();
try (Scope scope = span.makeCurrent()) {
span.setAttribute("trace-id", "123");
es.submit(new Runnable() {
@Override
public void run() {
Span asyncSpan = tracer.spanBuilder("async")
.setParent(Context.current().with(span))
.startSpan();
try {
Thread.sleep(1000L);
} catch (Throwable e) {
}
asyncSpan.end();
}
});
Thread.sleep(1000);
OpenTelemetry openTelemetry = GlobalOpenTelemetry.get();
openTelemetry.getPropagators();
} catch (Throwable t) {
span.setStatus(StatusCode.ERROR, "find error");
} finally {
span.end();
}
}
}