-
Notifications
You must be signed in to change notification settings - Fork 40.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Consolidate OpenTelemetry support in Spring #37278
Comments
Thanks for the work of summarizing the OTel support in Spring Boot! Regarding Issue M.1: This is definitely a bug, I'm going to open an issue for that and fix it for the next release: #37284 |
For issue M.2, i think we should set the |
Issue M.3: This is not in Spring Boot's control and needs to be tackled in micrometer. I'll let the Micrometer team know. |
@mhalbritter thanks a lot for your answer and for fixing those two issues so quickly! |
Thanks for the issue! My two cents: Issue M.3
I'm not 100% sure what you mean by this,
There are 3 transports available based on the OTel specs. Since SDKs (or components that are emitting OTLP) are not enforced to support all 3 (e.g.: The OTEL Java SDK only supports 2), the OTel Collectors (where you send the data) are enforced to support all 3. Because of this, it should not matter which transport is used, this should be transparent to the users. We also haven't got any user requests to add anything else other than HTTP yet. Is there a shortcoming you bumped into with HTTP that can be fixed using gRPC and not with HTTP? Fyi, there are known issues with gRPC if you also want to use it for other purposes as well: spring-projects-experimental/spring-cloud-sleuth-otel#39 and open-telemetry/opentelemetry-java#3123
With M2 being fixed, is there any other particular config that you are missing? Please see my points above about resource attributes and the SDK.
I think this was answered above by both you and me too ("module is lightweight and doesn't need any dependency on the OpenTelemetry SDK", OTLP is not part of the SDK, loose coupling) but I would not bring in any extra dependencies to Micrometer if it is easy to produce OTLP without them.
The Micrometer-OTel bridge you linked is exactly this, isn't it? (fyi: it is not stable yet)
I'm not sure I get this, as far as I know the agent does not care, it instruments things on its own (ignores Spring's own instrumentation) and it can also setup the bridge.
I think that would mean that there would be another shim/bridge in Micrometer that seems unnecessary. Btw there is also an OTel -> Micrometer shim/bridge in OTel (other than the Micrometer -> OTel bridge) Issue T1 - Exporting traces via gRPCPlease see my points about the transports and gRPC above (especially the issues you can face with using it). Right now using gRPC is quite simple (creating a bean) and maybe with the url it should be simplified even further but I would be curious about the justification: is there a shortcoming you bumped into with HTTP that can be fixed using gRPC and not with HTTP? Minimal proposed changesMicrometer: Your proposal for Micrometer to depend on the OTel SDK is not minimal. It is huge and right now seems unnecessary to me. Initializr:
I'm not sure you are aware but OTel is not stable yet so I would be careful with this. Btw we are planning to add more OTel integrations once those bits stabilize and have a GA release. Additional changes to extend OpenTelemetry support in Spring to logsOTel Logging isn't stable yet either, IIRC the API+SDK are stable but the appenders are not, see |
Many thanks for the explanations, @jonatan-ivanov! I've just created another issue to add support for OpenTelemetry's logging. With that, I think we have everything actionable from that issue on Boot side in smaller issues:
|
I'm going to close this issue in favor of the smaller ones. Thanks again for that write-up, @ThomasVitale! |
Thanks a lot @jonatan-ivanov for the detailed answer, it helped clarified a few things. And thanks @mhalbritter for creating the issues to address this. |
Hi @ThomasVitale , I was playing with this Grafana has a library that exports everything(logs, traces and metrics) to OpenTelemetry and works quite well, have a look on this https://grafana.com/docs/opentelemetry/instrumentation/java/spring-starter/ just remove the dependencies from spring boot and use this one, small config change that worked for me.
|
@rodrigorodrigues You might want to be careful if you want to use it in prod:
See more details: spring-io/start.spring.io#1161 |
Thanks @jonatan-ivanov I'm just playing around for an article that I'm writing using OpenTelemetry for multiple services using different languages, will put a notice on that on the Spring Boot part. |
I was about to open a few issues related to the OpenTelemetry support in Spring/Micrometer and volunteer to implement some of the existing ones, but I thought that it might help gathering here what's the current status so to put each issue within the right context and perspective. Looking at the bigger picture helps me explain some of those issues without pointing the reader to too many different GitHub issues. And I hope it will help everyone who joins the conversation. If this is not the right place to share such information, please let me know and I'll fix it accordingly.
I'll be happy to discuss this topic further and contribute pull requests as needed.
TL;DR; I go through a few issues and suggestions to consolidate OpenTelemetry support in Spring and unifying the configuration for metrics and traces (and enabling doing the same for logs in the future).
Metrics
Spring Boot Actuator provides dependency management and autoconfiguration for Micrometer, which offers a convenient facade over many different monitoring systems. One of them is OpenTelemetry.
Spring Boot developers can enable their applications to export metrics via the OTLP protocol to an OpenTelemetry backend by adding Spring Boot Actuator and the dedicated OpenTelemetry dependency from Micrometer to their projects.
The exporter provided by the Micrometer Registry OTLP is an HTTP exporter and can be configured via properties thanks to the autoconfiguration for OpenTelemetry.
OpenTelemetry supports additional key/value pairs (called
resource attributes
) to be included in the telemetry data. Spring Boot Actuator provides autoconfiguration for those and makes it possible to add new resource attributes via properties.I made a demo application to showcase this setup.
Issue M.1 - Wrong autoconfiguration in Spring Boot 3.2
In this pull request delivered to spring Boot 3.2.0, some OpenTelemetry configuration regarding resource attributes has been consolidated to be able to share it between metrics and traces implementations (which is really great and useful, thanks for that!).
That works fine when using OpenTelemetry for tracing, but when it's used only for metrics the autoconfiguration doesn't work. The
OpenTelemetryProperties
bean which is now autowired in theOtlpMetricsExportAutoConfiguration
requires the OpenTelemetry SDK to be in the classpath. However, the Micrometer Registry OTLP library doesn't include the OpenTelemetry SDK, causing the autoconfiguration to fail.A workaround for now is to add an explicit dependency to OpenTelemetry SDK and rely on the Spring Boot dependency management to resolve the correct version.
Possible solutions:
Issue M.2 - Service Name resource attribute is set to "unknown_service"
By default, Micrometer Registry OTLP includes a few resource attributes to the exported metrics (see the full list). One of them is the standard
service.name
OpenTelemetry attribute. The default value for this attribute isunknown_service
since the library can't know the name of the application being instrumented.Relying on the Spring Boot Actuator autoconfiguration for OpenTelemetry resource attributes, developers can overwrite the value of
service.name
with the actual name of the application as configured in Spring Boot (spring.application.name
).Since Spring Boot can tell if an application name has been configured, it would be nice if some autoconfiguration existed to do that out-of-the-box. Such autoconfiguration already exists in Spring Boot Actuator (see OpenTelemetryAutoConfiguration). However, that is only actually used for traces.
Possible solutions:
service.name
resource attribute;Issue M.3 - OTLP Metrics Exporter is HTTP-only and not configurable via OpenTelemetry
The Micrometer Registry OTLP module uses an OTLP-compatible HTTP client to export metrics to an OpenTelemetry backend. Internally, the
OtlpMeterRegistry
uses a privateHttpSender
object to configure the HTTP client. The benefit of this approach is that the module is lightweight and doesn't need any dependency on the OpenTelemetry SDK. It only uses theio.opentelemetry.proto
library which provides the protobuf configuration for OpenTelemetry.On the other hand, such an approach means that:
The new generic
OpenTelemetryAutoConfiguration
in Spring Boot 3.2 autoconfigures anOpenTelemetry
bean and makes it possible to configure anSdkMeterProvider
bean. What if Micrometer could use that for setting up the OpenTelemetry metrics exporter?Possible solutions:
MeterRegistry
that accepts anOpenTelemetry
object for configuration (similar to theOpenTelemetryMeterRegistry
used by the OpenTelemetry Java Instrumentation library). If backward compatibility is necessary, the new implementation would need to co-exist with the existing one (maybe a feature flag could switch between the two?);Building (or updating) such a module would make it possible to re-use the same
OpenTelemetryAutoConfiguration
introduced in Spring Boot 3.2 for both metrics and traces (and, in the future, for logs as well).Resource
object from OpenTelemetry to add resource attributes to the metrics.SdkMeterProvider
bean and, in general, for using metrics with OpenTelemetry. But we are missing Micrometer support before that is doable.OtlpHttpMetricExporter
orOtlpGrpcMetricExporter
).For more context about the current challenges, refer to this issue on the Spring Boot project.
Traces
Spring Boot Actuator provides dependency management and autoconfiguration for Micrometer Tracing, which offers a convenient facade over a few different distributed tracing backends. One of them is OpenTelemetry.
Spring Boot developers can enable their applications to export traces via the OTLP protocol to an OpenTelemetry backend by adding Spring Boot Actuator, Micrometer Tracing and the dedicated OpenTelemetry dependency from Micrometer to their projects.
The exporter provided by the Spring Boot Actuator autoconfiguration is an HTTP exporter (an
OtlpHttpSpanExporter
bean) and can be configured via properties thanks to the tracing configuration inOtlpAutoConfiguration
.OpenTelemetry supports additional key/value pairs (called
resource attributes
) to be included in the telemetry data. Spring Boot Actuator provides autoconfiguration for those and makes it possible to add new resource attributes via properties. The standard OpenTelemetryservice.name
resource attribute is configured automatically to the value ofspring.application.name
(if defined) or else to a defaultapplication
value.I made a demo application to showcase this setup.
Issue T1 - Exporting traces via gRPC
In this issue on the Spring Boot project, autoconfiguration for an
OtlpHttpSpanExporter
bean has been added to export traces via HTTP.A common requirement is to export traces via gRPC (the most used approach in OpenTelemetry). Currently, developers can configure an
OtlpGrpcSpanExporter
bean by themselves. It would be nice if Spring Boot Actuator would provide autoconfiguration for that, enhancing the existingOtlpAutoConfiguration
.There is already an issue on the Spring Boot project to add such autoconfiguration.
Summary
Overall, these are the issues and suggestions I've been describing so far.
Current bugs in Spring Boot 3.2
service.name
to be set tounkown_service
rather than to the value ofspring.application.name
.Minimal proposed changes to consolidate OpenTelemetry support in Spring for metrics and traces
Micrometer
MeterRegistry
implementation built on top of OpenTelemetry and configurable via its standard approaches, so that it's possible to share configuration between metrics and traces.Spring Boot Actuator
OpenTelemetry
andResource
beans can be reused from the existing OpenTelemetry configuration. Besides that, the autoconfiguration should define defaults forSdkMeterProvider
,OtlpHttpMetricExporter
andOtlpGrpcMetricExporter
.OtlpGrpcSpanExporter
bean.Spring Initializr
Additional changes to extend OpenTelemetry support in Spring to logs
Spring Boot Actuator
OpenTelemetry
andResource
beans can be reused from the existing OpenTelemetry configuration. Besides that, the autoconfiguration should define defaults forSdkLoggerProvider
,OtlpHttpLogRecordExporter
andOtlpGrpcLogRecordExporter
.Further improvements
OpenTelemetryAutoConfiguration
(this issue might be considered for the globalOpenTelemetryAutoConfiguration
once the tracing specific one gets deleted).The text was updated successfully, but these errors were encountered: