1. Giới thiệu

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ợ:

  • Java
  • Go

2. Java

2.1. Tương thích

  • Java 8+
  • Spring boot 3

2.2. Tích hợp giám sát

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();
        }
    }
}