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
Uygulamanızı Application Real-Time Monitoring Service (ARMS) hizmetine bağladınız. Daha fazla bilgi için bkz. Uygulama İzleme entegrasyonuna genel bakış.
ARMS aracınızın sürümü 2.9.1.2 veya üzeridir. Aracı yükseltmek için bkz. ARMS aracını yükseltin.
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: 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:
OpenTelemetryControllersınıfınıninityö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.-
OpenTelemetryControllersınıfınınparentyönteminde birkaç OpenTelemetry SDK yöntemi çağrılır.Yöntem her çağrıldığında
parentadlı bir span oluşturulur ve yöntem tamamlandığında sonlandırılır.Baggage SDK'sı kullanılarak
user.idveuser.nameolmak üzere iki Baggage öğesi eklenir. Bu öğeler aşağı akış uygulamalarına yayılır.Adım 2.a içinde oluşturulan span'a iki nitelik eklenir.
-
OpenTelemetryControllersınıfınınchildyöntemi aşağıdaki işlemleri gerçekleştirir:
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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ğinschedule), span türü (INTERNAL) ve süre gibi temel bilgileri görüntüleyebilirsiniz. Attributes sekmesindeotel.scope.name=manual-sdkveotel.scope.version=1.0.0gibi OpenTelemetry niteliklerini veschedule.success=truegibi ö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'larparentve bunun alt span'ıchildolarak adlandırılır. Span niteliklerindehttp.methoddeğeriGET,http.urideğeri/parentve özel nitelikotel.scope.namedeğerimanual-sdkolarak 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-9uygulamasınınscheduleyöntemi,user_methodbileş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ı:
childspan'ı,parentspan'ı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=-1verpc.type=98bulunur.
İ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.