Skip to content
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

Add public API to access environment resource #5554

Merged

Conversation

jack-berg
Copy link
Member

Related to #5464.

Implementation of my preferred solution to provide public access to resource configured from the environment, as discussed here.

Adds new public method ResourceConfiguration#createEnvironmentResource() to autoconfigure.

@codecov
Copy link

codecov bot commented Jun 20, 2023

Codecov Report

Patch coverage: 88.23% and no project coverage change.

Comparison is base (8f1a7b1) 91.39% compared to head (e4e6c40) 91.40%.

Additional details and impacted files
@@            Coverage Diff            @@
##               main    #5554   +/-   ##
=========================================
  Coverage     91.39%   91.40%           
- Complexity     4963     4966    +3     
=========================================
  Files           550      551    +1     
  Lines         14569    14571    +2     
  Branches       1358     1358           
=========================================
+ Hits          13316    13318    +2     
  Misses          866      866           
  Partials        387      387           
Impacted Files Coverage Δ
...metry/sdk/autoconfigure/ResourceConfiguration.java 94.73% <85.71%> (-0.14%) ⬇️
...onfigure/internal/EnvironmentResourceProvider.java 100.00% <100.00%> (ø)

☔ View full report in Codecov by Sentry.
📢 Do you have feedback about the report comment? Let us know in this issue.

import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.function.BiFunction;

/** Auto-configuration for the OpenTelemetry {@link Resource}. */
final class ResourceConfiguration {
public final class ResourceConfiguration {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is your thinking that if we have any other resources that we want to auto-configured in this module, that we could add more methods? Otherwise, it might make sense to name this "EnvironmentResource"?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My thinking is that this module should be reserved for interpreting the spec environment variables which do not have a natural home in a different module. For example, the zipkin, otlp, jaeger, env variables belong in those respective modules.

Users should be able to access components configured according to the environment with or without AutoConfiguredOpenTelemetrySdk. This means they can cherry pick their config - maybe they do programatic config everywhere except the environment resource (as you've done), or except span limits.

My first pass was to add an EnvironmentResource class, but on further consideration, that pattern doesn't scale when we get requests to access other components configured from the environment, like SpanLimits. It'd be more natural to add a public method TracerProviderConfiguration#createSpanLimits(ConfigProperties) than to add a dedicated EnvironmentSpanLimits class.

I don't anticipate any other types of resource configuration being done from environment variables, so I'd be surprised if we ever had to add more methods.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤔 If I, as an outside user, knew nothing of this discussion or how code was organized, would I be surprised that a class in the autoconfigure called "ResourceConfiguration" would be the place to go for a Resource instance configured from environment variables? I'm honestly not sure...just trying to think about the API surface we're giving to users before we are locked in.

Do you envision this class also being able to parse file-based configurations and return resources from it?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm honestly not sure...just trying to think about the API surface we're giving to users before we are locked in.

Yeah I'm not super confident either. I don't feel particularly strong about this.

Do you envision this class also being able to parse file-based configurations and return resources from it?

No. File based configuration is going to be an all or nothing thing. You'll be able to reference environment variables in the file using special syntax, but if you choose to use file configuration, the environment variable based config scheme will be ignored. This suggests that the code interpreting a file configuration model would be split out into its own package, and have a really small API where a file or ConfigurationModel is passed in, and a full configured OpenTelemetrySdk is returned.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cool. I don't know that I have a much better name at this point, so let's move forward with this and hopefully get some feedback from users!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants