@WithSpan не генерирует журналы

#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 — приложения с использованием агента.

https://javadoc.io/static/io.opentelemetry/opentelemetry-contrib-auto-annotations/0.5.0/io/opentelemetry/contrib/auto/annotations/WithSpan.html

То, что вы пытаетесь сделать, — это ручное инструментирование приложения. если вы хотите использовать @WithSpan , используйте java-агент OpenTelemetry