Skip to content

Open Telemetry

Observability adalah kemampuan untuk memahami kondisi dalam dari sebuah sistem dengan menganalisa hasil keluaran sistem seperti logs, metrics, dan traces.

Satu

Dimulai dari Spring Boot 4, OpenTelemetry (otel) memiliki depedency starter, sehingga penggunaanya jauh lebih mudah. Ada 3 depedency yang dibutuhkan.

  1. spring-boot-starter-opentelemetry
  2. spring-boot-starter-opentelemetry-test
  3. opentelemetry-logback-appender-1.0 for logging

Dua

Ada 3 cara untuk menggunakan open telemetry

  1. Menggunakan java agent
    • 🟩 mudah dalam penerapannya.
    • 🟥 ada issue jika ada perbedaan versi.
  2. Menggunakan third otel starter
    • 🟥 kompleks dalam penerapannya.
  3. Spring boot starter
    • 🟩 easy setup, without possibility issue due to incomptible version, and sedikit perubahan kode.

Step by Step

Install depedency

Warning

Wajib menggunakan Spring boot 4.x.x >

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-opentelemetry</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webmvc</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-opentelemetry-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webmvc-test</artifactId>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>io.opentelemetry.instrumentation</groupId>
    <artifactId>opentelemetry-logback-appender-1.0</artifactId>
    <version>2.21.0-alpha</version>
</dependency>
Yang dibutuhkan sebenarnya hanya 3, namun gua menambahkan Rest untuk testing logging-nya.

Tambahkan konfigurasi pada application properties

management:
  tracing:
    sampling:
      probability: 1.0
  otlp:
    metrics:
      export:
        enabled: false
        url: http://localhost:5080/api/vensys/v1/metrics
        headers:
          Authorization: "Basic bWFydWZmYXJyYXNAZ21haWwuY29tOmFkbWlu"
  opentelemetry:
    tracing:
      export:
        otlp:
          endpoint: http://localhost:5080/api/vensys/v1/traces
          headers:
            Authorization: "Basic bWFydWZmYXJyYXNAZ21haWwuY29tOmFkbWlu"
    logging:
      export:
        otlp:
          endpoint: http://localhost:5080/api/vensys/v1/logs
          headers:
            Authorization: "Basic bWFydWZmYXJyYXNAZ21haWwuY29tOmFkbWlu"


server:
  shutdown: immediate
logging:
  level:
    '[ai.ada.mfm]': INFO
    '[org.springframework.boot.actuator.autoconfigure.opentelemetry]': DEBUG
    '[io.opentelemetry.exporter.internal.http]': DEBUG
    '[io.opentelemetry.sdk.trace]': DEBUG

Tambahkan konfigurasi diatas. Kalau bingung mengapa menggunakan properties diatas, kita dapat liat di website resmi application properties milik spring boot.

-https://docs.spring.io/spring-boot/appendix/application-properties/index.html

Kita bisa menggunakan provider lain seperti Grafana, DataDog dan lain-lain. Sehingga spesifikasi endpoint pada URL diatas bisa berbeda-beda.

Setup Logging

OPSIONAL jika tidak memerulkan store logging maka bagian ini bisa di skip.

Install OpenTelemtry Appender dengan membuat class java

import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
// import io.opentelemetry;

import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender;

@Component
class InstallOpenTelemetryAppender implements InitializingBean {

    private final OpenTelemetry openTelemetry;

    InstallOpenTelemetryAppender(OpenTelemetry openTelemetry) {
        this.openTelemetry = openTelemetry;
    }

    @Override
    public void afterPropertiesSet() {
        OpenTelemetryAppender.install(this.openTelemetry);
    }
}

Buat config XML dengan nama logback-spring.xml pada folder resources

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>

    <appender name="OTEL" class="io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender">
    </appender>

    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="OTEL"/>
    </root>
</configuration>

Done

Bagian system yang ingin di observe sudah disetup, selanjutnya observability platforms atau monitoring tools sebagai pusat informasi kondisi sistem. Gua mengunakan OpenObserver.

Setup dan jalankan OpenObserver

Gua pakai docker untuk membuat container openobserver.

services:
  openobserve:
    image: o2cr.ai/openobserve/openobserve-enterprise:latest
    container_name: openobserve
    environment:
      - ZO_ROOT_USER_EMAIL=maruffarras@gmail.com
      - ZO_ROOT_USER_PASSWORD=admin
      - ZO_DATA_DIR=/data
    ports:
      - "5080:5080"
    volumes:
      - oo_data:/data
volumes:
  oo_data: {}

Jalankan perintah docker compose up -d

Jalankan springboot

Jalankan spring dengan mvn spring-boot:run

Lalu hit endpoint

GET http://localhost:8080

Done all

Alhamdulillah, berikut catatan ringkas semoga bisa digunakan dan diimplementasi. Kita juga dapat membuat alert system jika terjadi error pada sistem dengan memberikan notifikasi misalnya ke Discord atau platform lainnya. Coba eksplore lebih lanjut masing-masing observeability platforms.