Skip to content

Auto-configure EventLoggerProvider #11623

@swar8080

Description

@swar8080

Is your feature request related to a problem? Please describe.

We're looking to use the Events API but currently have to build an EventLogger manually. It's error-prone getting the manual set-up to use all the auto-configuration that we're used to the java agent doing for us. For example, our attempt is:

  <dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-api-incubator</artifactId>
  </dependency>
  <dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-sdk-extension-autoconfigure</artifactId>
    <version>${opentelemetry.version}</version>
  </dependency>
  <dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-sdk-extension-autoconfigure-spi</artifactId>
    <version>${opentelemetry.version}</version>
  </dependency>
  <dependency>
    <groupId>io.opentelemetry.instrumentation</groupId>
    <artifactId>opentelemetry-resources</artifactId>
    <version>${opentelemetry.javaagent.version}-alpha</version>
  </dependency>
  <dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-exporter-otlp</artifactId>
    <version>${opentelemetry.version}</version>
  </dependency>
...
  @Bean
  EventLogger otelEventLogger() {
    var autoOtelSdk = AutoConfiguredOpenTelemetrySdk.builder().build();
    var otelConfig = AutoConfigureUtil.getConfig(autoOtelSdk);
    if (otelConfig == null) {
      logger.info(
          "No OTEL ConfigProperties available for EventLogger. Using empty configuration instead");
      otelConfig = DefaultConfigProperties.create(new HashMap<>());
    }

    Resource resource = Resource.getDefault();
    ServiceLoader<ResourceProvider> serviceLoader = ServiceLoader.load(ResourceProvider.class);
    for (ResourceProvider provider : serviceLoader) {
      Resource provided = provider.createResource(otelConfig);
      resource = resource.merge(provided);
    }

    OtlpGrpcLogRecordExporter exporter =
        OtlpGrpcLogRecordExporter.builder()
            .setRetryPolicy(
                RetryPolicy.builder()
                    .setMaxAttempts(5)
                    .setMaxBackoff(Duration.ofSeconds(3L))
                    .build())
            .build();
    BatchLogRecordProcessor processor =
        BatchLogRecordProcessor.builder(exporter)
            .setMeterProvider(GlobalOpenTelemetry.getMeterProvider())
            .build();
    SdkLoggerProvider loggerProvider =
        SdkLoggerProvider.builder().setResource(resource).addLogRecordProcessor(processor).build();

    EventLoggerProvider eventLoggerProvider = SdkEventLoggerProvider.create(loggerProvider);
    return eventLoggerProvider.eventLoggerBuilder("com.demo").build();
  }

Describe the solution you'd like

Have the javaagent auto-configure the EventLoggerProvider and expose it for applications.

@jack-berg had a suggestion for how to do this: https://cloud-native.slack.com/archives/C014L2KCTE3/p1718657558881159?thread_ts=1718293157.542669&cid=C014L2KCTE3

Describe alternatives you've considered

  • Agent extension?
  • Manual set-up

Additional context

Any guesses if packaging our manual set-up in an agent extension would work as a temporary solution? Or would the call GlobalEventLoggerProvider.set happen using a different class loader than what's available to the application?

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions