Tüm Ürünler
Search
Belge Merkezi

Application Real-Time Monitoring Service:Java için OpenTelemetry ile özel enstrümantasyon ekleme

Son Güncelleme:Oct 05, 2026

Application Real-Time Monitoring Service (ARMS) aracı, kod değişikliği gerektirmeden izleme verilerini toplamak amacıyla yaygın Java çerçevelerini otomatik olarak enstrümanlar. Özel iş mantığınızı yansıtan izleme verilerini yakalamak için Java için OpenTelemetry SDK'yı kullanarak özel enstrümantasyon ekleyebilirsiniz. Bu konuda, Java için OpenTelemetry SDK'nın nasıl kullanılacağı, izleme bağlamına erişim sağlanması, özel Baggage tanımlanması ve özel niteliklerin ayarlanması açıklanmaktadır.

ARMS aracı tarafından desteklenen bileşenler ve çerçeveler hakkında bilgi edinmek için bkz. ARMS tarafından desteklenen Java bileşenleri ve çerçeveleri.

Ön koşullar

Bağımlılıkları ekleyin

Aşağıdaki Maven bağımlılıklarını projenize ekleyin. Daha fazla bilgi için resmi OpenTelemetry belgelerine bakın.

<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-sdk</artifactId>
    </dependency>
</dependencies>
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>io.opentelemetry</groupId>
      <artifactId>opentelemetry-bom</artifactId>
      <version>1.23.0</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

ARMS aracının OpenTelemetry enstrümantasyonu ile uyumluluğu

Temel kavramlar

Bu bölümde yalnızca yaygın terimler açıklanmaktadır. Diğer terimler hakkında daha fazla bilgi için OpenTelemetry Spesifikasyonuna bakın.

  • span: Bir istekteki belirli bir işlem; örneğin, uzak çağrı giriş noktası veya dahili bir yöntem çağrısı.

  • SpanContext: İzleme bağlamıdır; izleme kimliği ve span kimliği gibi bilgileri içerir.

  • attribute (nitelik): Span üzerinde anahtar bilgileri kaydeden ek bir alandır.

  • Baggage: Tüm izleme boyunca yayılan anahtar-değer çiftleridir.

Java için OpenTelemetry SDK'yı kullanma

OpenTelemetry SDK'yı aşağıdaki işlemleri gerçekleştirmek için kullanabilirsiniz:

  • Span'lar oluşturmak için enstrümantasyon ekleyin.

  • Span'lara nitelikler ekleyin.

  • İzleme bağlamında Baggage'i yayınlayın.

  • Mevcut izleme bağlamını alın ve izleme kimliği ile span kimliği gibi bilgileri yazdırın.

Aşağıdaki örnek kod, bu işlemlerin OpenTelemetry SDK kullanılarak nasıl gerçekleştirileceğini göstermektedir.

Önemli

Önemli: OpenTelemetry örneğini GlobalOpenTelemetry.get() çağrısıyla almanız gerekir. OpenTelemetry SDK ile manuel olarak oluşturduğunuz bir örneği kullanmayın. Aksi takdirde, ARMS aracı v4.x sürümünde SDK enstrümantasyonu tarafından oluşturulan span'lar görünmez.

@RestController
@RequestMapping("/ot")
public class OpenTelemetryController {
    private Tracer tracer;
    private ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
    @PostConstruct
    public void init() {
	    OpenTelemetrySdk.builder()
			.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
			.buildAndRegisterGlobal();
		tracer = GlobalOpenTelemetry.get().getTracer("manual-sdk", "1.0.0");
        ses.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                Span span = tracer.spanBuilder("schedule")
                        .setAttribute("schedule.time", System.currentTimeMillis())
                        .startSpan();
                try (Scope scope = span.makeCurrent()) {
                    System.out.println("scheduled!");
                    Thread.sleep(500L);
                    span.setAttribute("schedule.success", true);
                    System.out.println(Span.current().getSpanContext().getTraceId()); // Get the trace ID
                } catch (Throwable t) {
                    span.setStatus(StatusCode.ERROR, t.getMessage());
                } finally {
                    span.end();
                }
            }
        }, 10, 30, TimeUnit.SECONDS);
    }
    @ResponseBody
    @RequestMapping("/parent")
    public String parent() {
        Span span = tracer.spanBuilder("parent").setSpanKind(SpanKind.SERVER).startSpan();
        try (Scope scope = span.makeCurrent()) {
            // Use Baggage to propagate custom business tags.
            Baggage baggage =  Baggage.current().toBuilder()
                    .put("user.id", "1")
                    .put("user.name", "name")
                    .build();
            try (Scope baggageScope = baggage.storeInContext(Context.current()).makeCurrent()) {
                child();
            }
            span.setAttribute("http.method", "GET");
            span.setAttribute("http.uri", "/parent");
        } finally {
            span.end();
        }
        return "parent";
    }
    private void child() {
        Span span = tracer.spanBuilder("child").startSpan();
        try (Scope scope = span.makeCurrent()) {
            System.out.println("current traceId = " + Span.current().getSpanContext().getTraceId());
            System.out.println("userId in baggage = " + Baggage.current().getEntryValue("user.id"));
            Thread.sleep(1000);
        } catch (Throwable e) {
            span.setStatus(StatusCode.ERROR, e.getMessage());
        } finally {
            span.end();
        }
    }
}

Örnek adım adım açıklama:

  1. OpenTelemetryController sınıfının init yönteminde zamanlanmış bir görev başlatılır. Her çalıştırmanın başında bir span oluşturulur ve işlem tamamlandığında sonlandırılır.

  2. OpenTelemetryController sınıfının parent yönteminde birkaç OpenTelemetry SDK yöntemi çağrılır.

    1. Yöntem her çağrıldığında parent adlı bir span oluşturulur ve yöntem tamamlandığında sonlandırılır.

    2. Baggage SDK'sı kullanılarak user.id ve user.name olmak üzere iki Baggage öğesi eklenir. Bu öğeler aşağı akış uygulamalarına yayılır.

    3. Adım 2.a içinde oluşturulan span'a iki nitelik eklenir.

  3. OpenTelemetryController sınıfının child yöntemi aşağıdaki işlemleri gerçekleştirir:

    1. Yöntem her çağrıldığında child adlı bir span oluşturulur ve yöntem tamamlandığında sonlandırılır. Bu span, adım 2.a içinde oluşturulan span'ın alt öğesidir.

    2. İzleme bağlamından izleme kimliği alınır ve yazdırılır.

    3. Adım 2.b içinde eklenen Baggage alınır ve değeri yazdırılır.

ARMS aracı sürümleri arasındaki farklar

Önceki kodda yer alan işlemlere yönelik destek, ARMS aracı sürümlerine göre farklılık gösterir.


Adım


ARMS aracı v4.x ve sonrası


ARMS aracı v3.x ve öncesi


1


Desteklenir. Yeni bir span oluşturulur.


Desteklenir. Yeni bir span oluşturulur.


2.a


Desteklenir


Desteklenir


2.b


Desteklenir


Desteklenmez


2.c


Desteklenir


Desteklenir


3.a


Desteklenir


Desteklenir. Bu span, adım 2.a içinde oluşturulan span içinde bir yöntem yığını olarak görünür.


3.b


Desteklenir. Yazdırılan izleme kimliği, ARMS'teki izleme kimliğiyle aynıdır.


Desteklenmez. Yazdırılan izleme kimliği, ARMS aracındaki izleme kimliğinden farklıdır.


3.c


Desteklenir


Desteklenir

Enstrümantasyon sonuçları

v4.x ve sonrası

  • 1. Adımın enstrümantasyon sonucu:

    OpenTelemetry SDK tarafından oluşturulan span'ı görebilirsiniz.

    ARMS konsolunda bir izlemenin Span Ayrıntıları bölümünde uygulama adı (örneğin elastic-search-8), işlem adı (örneğin schedule), span türü (INTERNAL) ve süre gibi temel bilgileri görüntüleyebilirsiniz. Attributes sekmesinde otel.scope.name=manual-sdk ve otel.scope.version=1.0.0 gibi OpenTelemetry niteliklerini ve schedule.success=true gibi özel iş niteliklerini görüntüleyerek enstrümantasyonun çalıştığını doğrulayabilirsiniz.

  • 2.x ve 3.x Adımlarının enstrümantasyon sonuçları:

    OpenTelemetry SDK tarafından oluşturulan span'lar, aracı tarafından oluşturulan Tomcat span'larıyla aynı izleme içinde görünür. Ayrıca, SDK tarafından oluşturulan span'lar için ilgili nitelikler beklendiği şekilde ayarlanır.

    İzleme ayrıntılarında Tomcat aracı enstrümantasyonu tarafından oluşturulan span'ın işlem adı /opentelemetry/parent şeklindedir. OpenTelemetry SDK tarafından oluşturulan span'lar parent ve bunun alt span'ı child olarak adlandırılır. Span niteliklerinde http.method değeri GET, http.uri değeri /parent ve özel nitelik otel.scope.name değeri manual-sdk olarak görünür.

v3.x ve öncesi

  • 1. Adımın enstrümantasyon sonucu:

    ARMS konsolundaki izleme ayrıntıları sayfasında enstrümantasyon tarafından toplanan izleme verilerini görüntüleyebilirsiniz. Sol taraftaki su akışı şeması span çağrı ilişkilerini gösterir. Örneğin, elastic-search-9 uygulamasının schedule yöntemi, user_method bileşen türüne sahip ve toplam yanıt süresi 567 ms olan bir span olarak yakalanır. Sağ taraftaki Span Details panelinde uygulama adı, span adı, IP adresi, span kimliği ve durum kodu gibi temel bilgiler görüntülenir. Alt kısımdaki Attributes bölümünde ise HTTP Bilgileri (http.path, http.status_code), RPC Bilgileri (rpc.type) ve Yerleşik Bilgiler (component.name=user_method, slow=1) gibi gruplandırılmış ek nitelikler gösterilir.

  • 2.x ve 3.x Adımlarının enstrümantasyon sonuçları:

    child span'ı, parent span'ının yöntem yığını içinde görüntülenir. Ayrıca, SDK tarafından oluşturulan span'ların nitelikleri beklendiği şekilde ayarlanır.

    method stack görünümünde izleme hiyerarşisi, OpenTelemetry Entry Span öğesinin parent span'ını çağırdığını ve bunun da child span'ını çağırdığını gösterir. Bu üç iç içe çağrının her biri yaklaşık 1,01 saniye sürer. child yönteminin nitelikleri arasında line=-1 ve rpc.type=98 bulunur.

İlgili belgeler

İzleme kimliği bilgilerini uygulamanızın iş günlükleriyle ilişkilendirmek, bir sorun oluştuğunda sorun giderme amacıyla ilgili günlükleri hızlıca bulmanıza olanak tanır. Daha fazla bilgi için bkz. Java uygulamaları için izleme kimliklerini iş günlükleriyle ilişkilendirin.