#grpc-java #open-telemetry #otlp-grpc
Вопрос:
Я получил метрики и трассировки, необходимые для успешного открытия сборщика телеметрии из моего java-приложения с настройкой
System.setProperty("otel.resource.attributes", "service.name=OtlpExporterExample");
System.setProperty("otel.metrics.exporter", "otlp");
OpenTelemetry openTelemetry = initOpenTelemetry();
MeterProvider meterProvider = initOpenTelemetryMetrics();
tracer = openTelemetry.getTracer("io.opentelemetry.example");
Meter meter = meterProvider.get("io.opentelemetry.example");
// custom logs here
LongHistogram recorder = meter.histogramBuilder("super_timer").ofLongs().setUnit("ms").build();
// sleep for a bit to let everything settle
Thread.sleep(2000);
и вспомогательными методами являются
static OpenTelemetry initOpenTelemetry() {
OtlpGrpcSpanExporter spanExporter =
OtlpGrpcSpanExporter.builder().setTimeout(2, TimeUnit.SECONDS)
.build();
BatchSpanProcessor spanProcessor =
BatchSpanProcessor.builder(spanExporter)
.setScheduleDelay(100, TimeUnit.MILLISECONDS)
.build();
SdkTracerProvider tracerProvider =
SdkTracerProvider.builder()
.addSpanProcessor(spanProcessor)
.setResource(OpenTelemetryResourceAutoConfiguration.configureResource())
.build();
OpenTelemetrySdk openTelemetrySdk =
OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).buildAndRegisterGlobal();
Runtime.getRuntime().addShutdownHook(new Thread(tracerProvider::shutdown));
return openTelemetrySdk;
}
/**
* Initializes a Metrics SDK with a OtlpGrpcMetricExporter and an IntervalMetricReader.
*
* @return a ready-to-use {@link MeterProvider} instance
*/
static MeterProvider initOpenTelemetryMetrics() {
// set up the metric exporter and wire it into the SDK and a timed reader.
OtlpGrpcMetricExporter metricExporter = OtlpGrpcMetricExporter.getDefault();
MetricReaderFactory periodicReaderFactory =
PeriodicMetricReader.create(metricExporter, Duration.ofMillis(1000));
SdkMeterProvider sdkMeterProvider =
SdkMeterProvider.builder()
.registerMetricReader(periodicReaderFactory)
.buildAndRegisterGlobal();
Runtime.getRuntime().addShutdownHook(new Thread(sdkMeterProvider::shutdown));
return sdkMeterProvider;
}
(Я скопировал этот фрагмент кода из репозитория github)
Теперь я пытаюсь переместить существующую оболочку ведения журнала в область вывода с наименьшими изменениями
@WithSpan("important")
public void info(@SpanAttribute("class") Class classObj, @SpanAttribute("message") CustomClass message) {
System.out.println("Trace id " Span.current().getSpanContext().getTraceId());
System.out.println("span id " Span.current().getSpanContext().getSpanId());
info(classObj, JsonUtils.mapToJson(message));
}
но никакие промежутки не генерируются. Существует ли ограничение на то, какие методы withSpan
могут быть использованы?
Выходные данные вышеуказанных систем являются
Trace id 00000000000000000000000000000000
span id 0000000000000000
Конфигурация Gradle
implementation('io.opentelemetry:opentelemetry-api:1.6.0')
implementation('io.opentelemetry:opentelemetry-sdk:1.6.0')
//pull in the autoconfigure extension so we parse the `otel.resource.attributes` system property used in the example.
implementation('io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.7.0-alpha')
implementation('io.opentelemetry:opentelemetry-extension-annotations:1.7.0')
implementation("io.opentelemetry:opentelemetry-api-metrics:1.7.0-alpha")
implementation('io.opentelemetry:opentelemetry-sdk-metrics:1.7.0-alpha')
implementation("io.opentelemetry:opentelemetry-exporter-otlp-metrics:1.7.0-alpha")
Редактировать:
Если вместо @WithSpan
этого я получу трассировщик и начну/закончу пролет, то пролеты окажутся в коллекторе
Комментарии:
1. Вы можете добавить экспортера журналов, чтобы проверить, не сгенерирован ли промежуток или не возникла проблема при отправке промежутка github.com/open-telemetry/opentelemetry-java/tree/main/examples/…
2. Пытаясь понять, как им пользоваться , Вместо
OtlpGrpcSpanExporter spanExporter
того, чтобы я заменил егоnew LoggingSpanExporter()
. Также замененоOtlpGrpcMetricExporter
наnew LoggingMetricExporter()
. Я получаю бесконечное количествоINFO: Received a collection of 2 metrics for export.
и ничего, связанного с промежутками. Также нет «считывателя периодических промежутков»
Ответ №1:
Согласно java doc @WithSpan
работает только с автоматическим инструментарием java — приложения с использованием агента.
То, что вы пытаетесь сделать, — это ручное инструментирование приложения. если вы хотите использовать @WithSpan
, используйте java-агент OpenTelemetry