Topik ini menjelaskan cara menggunakan Managed Service for OpenTelemetry untuk memfilter rentang tertentu pada aplikasi Java dan Node.js.
Aplikasi Java
Anda dapat menggunakan pengambil sampel Managed Service for OpenTelemetry untuk memfilter rentang. Jika Anda tidak ingin memodifikasi kode aplikasi atau menggunakan Agen Java Managed Service for OpenTelemetry untuk melaporkan data aplikasi secara otomatis, Anda dapat membuat ekstensi untuk agen tersebut. Dengan menulis pengambil sampel OpenTelemetry kustom dan mendefinisikan aturan filter, Anda dapat memfilter rentang tertentu tanpa perlu memodifikasi kode aplikasi. Untuk informasi lebih lanjut, lihat Metode 1. Jika Anda menggunakan SDK Java Managed Service for OpenTelemetry untuk melaporkan data aplikasi secara manual, Anda dapat menulis pengambil sampel kustom dalam kode aplikasi. Untuk informasi lebih lanjut, lihat Metode 2.
Metode 1: Buat ekstensi untuk Agen Java Managed Service for OpenTelemetry
Prasyarat
Aplikasi diinstrumen secara otomatis menggunakan OpenTelemetry Java Agent. Untuk informasi lebih lanjut, lihat Gunakan OpenTelemetry untuk Melaporkan Data Jejak Aplikasi Java.
Buat sebuah proyek.
Buat sebuah proyek Maven. Proyek ini digunakan untuk membuat dan membangun ekstensi.
Tambahkan dependensi ke file pom.xml.
PentingUntuk memastikan bahwa dependensi kompatibel, pastikan semua dependensi terkait Managed Service for OpenTelemetry memiliki versi yang sama dengan versi OpenTelemetry Java Agent yang Anda gunakan.
<dependency> <groupId>com.google.auto.service</groupId> <artifactId>auto-service</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>io.opentelemetry.javaagent</groupId> <artifactId>opentelemetry-javaagent</artifactId> <version>1.28.0</version> <!--Set nilai field scope menjadi compile.--> <scope>compile</scope> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk-trace</artifactId> <version>1.28.0</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk-extension-autoconfigure</artifactId> <version>1.28.0</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-semconv</artifactId> <version>1.28.0-alpha</version> </dependency>Buat kelas SpanFilterSampler. Anda juga dapat menggunakan nama kelas kustom.
Kelas ini harus mengimplementasikan antarmuka io.opentelemetry.sdk.trace.samplers.Sampler dan metode shouldSample serta getDescription.
shouldSample
Anda dapat mendefinisikan aturan filter kustom dalam metode ini. Untuk rentang yang ingin Anda filter,
SamplingResult.create(SamplingDecision.DROP)dikembalikan. Untuk rentang yang ingin Anda pertahankan dan laporkan,SamplingResult.create(SamplingDecision.RECORD_AND_SAMPLE)dikembalikan.
getDescription
Metode ini mengembalikan nama pengambil sampel kustom.
Dalam contoh berikut, pengambil sampel SpanFilterSampler memfilter rentang dengan nama
spanName1atauspanName2dan rentang dengan attributes.http.target adalah/api/checkHealthatau/health/checks.package org.example; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.samplers.Sampler; import io.opentelemetry.sdk.trace.samplers.SamplingDecision; import io.opentelemetry.sdk.trace.samplers.SamplingResult; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import java.util.*; public class SpanFilterSampler implements Sampler { /* * Filter rentang dengan nama dalam EXCLUDED_SPAN_NAMES. */ private static List<String> EXCLUDED_SPAN_NAMES = Collections.unmodifiableList( Arrays.asList("spanName1", "spanName2") ); /* * Filter rentang dengan attributes.http.target dalam EXCLUDED_HTTP_REQUEST_TARGETS. */ private static List<String> EXCLUDED_HTTP_REQUEST_TARGETS = Collections.unmodifiableList( Arrays.asList("/api/checkHealth", "/health/checks") ); @Override public SamplingResult shouldSample(Context parentContext, String traceId, String name, SpanKind spanKind, Attributes attributes, List<LinkData> parentLinks) { String httpTarget = attributes.get(SemanticAttributes.HTTP_TARGET) != null ? attributes.get(SemanticAttributes.HTTP_TARGET) : ""; if (EXCLUDED_SPAN_NAMES.contains(name) || EXCLUDED_HTTP_REQUEST_TARGETS.contains(httpTarget)) { // Filter rentang berdasarkan aturan. return SamplingResult.create(SamplingDecision.DROP); } else { return SamplingResult.create(SamplingDecision.RECORD_AND_SAMPLE); } } @Override public String getDescription() { return "SpanFilterSampler"; // Anda dapat mengganti SpanFilterSampler dengan nama kustom. } }Buat kelas SpanFilterSamplerProvider. Anda juga dapat menggunakan nama kelas kustom.
Kelas ini harus mengimplementasikan antarmuka io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSamplerProvider dan metode createSampler serta getName.
createSampler
Metode ini membuat dan mengembalikan instance pengambil sampel kustom.
getName
Metode ini mengembalikan nama pengambil sampel kustom. OpenTelemetry Java Agent menemukan pengambil sampel ini berdasarkan nama.
package org.example; import com.google.auto.service.AutoService; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSamplerProvider; import io.opentelemetry.sdk.trace.samplers.Sampler; @AutoService(ConfigurableSamplerProvider.class) public class SpanFilterSamplerProvider implements ConfigurableSamplerProvider { @Override public Sampler createSampler(ConfigProperties configProperties) { return new SpanFilterSampler(); } @Override public String getName() { return "SpanFilterSampler"; // Anda dapat mengganti SpanFilterSampler dengan nama kustom. } }Bangun pengambil sampel.
Kemas proyek menjadi file Java archive (JAR) dan simpan file JAR di direktori target.
mvn clean packageMuat ekstensi OpenTelemetry Java Agent saat aplikasi dimulai.
Metode 1: Tambahkan parameter otel.traces.sampler ke parameter VM asli.
-Dotel.traces.sampler=<your-sampler-name> // Ganti <your-sampler-name> dengan nama pengambil sampel kustom, yaitu nilai balik dari metode getName.Metode 2: Konfigurasikan variabel lingkungan OTEL_TRACES_SAMPLER.
export OTEL_TRACES_SAMPLER="<your-sampler-name>" // Ganti <your-sampler-name> dengan nama pengambil sampel kustom, yaitu nilai balik dari metode getName.
Metode 2: Gunakan SDK Java Managed Service for OpenTelemetry
Prasyarat
Aplikasi diinstrumen secara manual menggunakan SDK Java Managed Service for OpenTelemetry. Untuk informasi lebih lanjut, lihat Gunakan OpenTelemetry untuk Melaporkan Data Jejak Aplikasi Java.
Buat kelas pengambil sampel kustom dalam kode aplikasi Anda.
Kelas ini harus mengimplementasikan antarmuka io.opentelemetry.sdk.trace.samplers.Sampler dan metode shouldSample serta getDescription.
shouldSample
Anda dapat mendefinisikan aturan filter kustom dalam metode ini. Untuk rentang yang ingin Anda filter,
SamplingResult.create(SamplingDecision.DROP)dikembalikan. Untuk rentang yang ingin Anda pertahankan dan laporkan,SamplingResult.create(SamplingDecision.RECORD_AND_SAMPLE)dikembalikan.
getDescription
Metode ini mengembalikan nama pengambil sampel kustom.
Dalam contoh berikut, pengambil sampel SpanFilterSampler memfilter rentang dengan nama
spanName1atauspanName2dan rentang dengan attributes.http.target adalah/api/checkHealthatau/health/check.package org.example; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.samplers.Sampler; import io.opentelemetry.sdk.trace.samplers.SamplingDecision; import io.opentelemetry.sdk.trace.samplers.SamplingResult; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import java.util.*; public class SpanFilterSampler implements Sampler { /* * Filter rentang dengan nama dalam EXCLUDED_SPAN_NAMES. */ private static List<String> EXCLUDED_SPAN_NAMES = Collections.unmodifiableList( Arrays.asList("spanName1", "spanName2") ); /* * Filter rentang dengan attributes.http.target dalam EXCLUDED_HTTP_REQUEST_TARGETS. */ private static List<String> EXCLUDED_HTTP_REQUEST_TARGETS = Collections.unmodifiableList( Arrays.asList("/api/checkHealth", "/health/checks") ); @Override public SamplingResult shouldSample(Context parentContext, String traceId, String name, SpanKind spanKind, Attributes attributes, List<LinkData> parentLinks) { String httpTarget = attributes.get(SemanticAttributes.HTTP_TARGET) != null ? attributes.get(SemanticAttributes.HTTP_TARGET) : ""; if (EXCLUDED_SPAN_NAMES.contains(name) || EXCLUDED_HTTP_REQUEST_TARGETS.contains(httpTarget)) { // Filter rentang berdasarkan aturan. return SamplingResult.create(SamplingDecision.DROP); } else { return SamplingResult.create(SamplingDecision.RECORD_AND_SAMPLE); } } @Override public String getDescription() { return "SpanFilterSampler"; // Anda dapat mengganti SpanFilterSampler dengan nama kustom. } }Atur pengambil sampel kustom saat Anda membuat instance SdkTracerProvider.
Saat Anda membuat instance SdkTracerProvider, panggil metode
setSampler(new SpanFilterSampler())untuk mengatur pengambil sampel kustom.... SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder() . setSampler(new MySampler()) // Tambahkan baris ini. .addSpanProcessor(BatchSpanProcessor.builder(OtlpGrpcSpanExporter.builder() .setEndpoint("<endpoint>") .addHeader("Authentication", "<token>") .build()).build()) .setResource(resource) .build(); ...Mulai aplikasi.
Aplikasi Node.js
Demo: opentelemetry-nodejs-demo.
Prasyarat
Aplikasi diinstrumen menggunakan API Managed Service for OpenTelemetry untuk JavaScript. Untuk informasi lebih lanjut, lihat Gunakan Managed Service for OpenTelemetry untuk Mengirimkan Data Jejak Aplikasi Node.js.
Metode 1: Filter rentang saat rentang dibuat
Konfigurasikan parameter ignoreIncomingRequestHook saat Anda membuat HttpInstrumentation.
Saat Anda membuat HttpInstrumentation, Anda dapat mengonfigurasi parameter HttpInstrumentationConfig, yang mencakup parameter ignoreIncomingRequestHook. Parameter ignoreIncomingRequestHook memungkinkan Anda menentukan metode kustom untuk menentukan apakah akan menginstrumen aplikasi sebelum permintaan diproses. Metode kustom hanya menentukan bahwa rentang tidak dibuat. Permintaan diproses seperti yang diharapkan.
Dalam contoh berikut, permintaan dengan request.url /api/checkHealth diabaikan untuk instrumen.
... // Konten yang akan diganti. // registerInstrumentations({ // tracerProvider: provider, // instrumentations: [new HttpInstrumentation(), ExpressInstrumentation], // }); const httpInstrumentation = new HttpInstrumentation({ // Tentukan metode kustom dalam parameter ignoreIncomingRequestHook. ignoreIncomingRequestHook: (request) => { // Abaikan permintaan dengan request.url /api/checkHealth. if (request.url === '/api/checkHealth') { return true; } return false; }, }); registerInstrumentations({ tracerProvider: provider, instrumentations: [httpInstrumentation, ExpressInstrumentation], }); ...Mulai aplikasi.
Metode 2: Filter rentang saat rentang dilaporkan
Buat kelas pengambil sampel kustom.
Buat kelas pengambil sampel kustom yang mengimplementasikan antarmuka Sampler. Antarmuka ini mendefinisikan aturan sampling. Contoh:
const opentelemetry = require('@opentelemetry/api'); class SpanFilterSampler { shouldSample(spanContext, parentContext) { // Implementasikan logika sampling kustom Anda di sini. } }Atur pengambil sampel kustom saat Anda membuat instance NodeTracerProvider.
... const provider = new NodeTracerProvider({ sampler: new SpanFilterSampler(), // Tambahkan baris kode ini untuk mengatur pengambil sampel kustom. resource: new Resource({ [SemanticResourceAttributes.HOST_NAME]: require("os").hostname(), // nama host Anda [SemanticResourceAttributes.SERVICE_NAME]: "<your-service-name>", }), }); ...