-
Notifications
You must be signed in to change notification settings - Fork 445
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
Feat/add resource builder #2322
base: main
Are you sure you want to change the base?
Feat/add resource builder #2322
Conversation
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #2322 +/- ##
=====================================
Coverage 79.5% 79.5%
=====================================
Files 123 124 +1
Lines 21492 21560 +68
=====================================
+ Hits 17096 17156 +60
- Misses 4396 4404 +8 ☔ View full report in Codecov by Sentry. |
fdd9fd1
to
b0bbed5
Compare
I still need to expose the new builder to the API, and would like feedback on #2324 before going further since the changes are related :) |
@pitoniak32 Could you split this into two PRs? Have one PR just for removing the |
split those changes into: #2332 |
f08a237
to
afb8ba4
Compare
} | ||
|
||
/// Add a [KeyValue] to the resource. | ||
pub fn with_key_value(self, kv: KeyValue) -> Self { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
interesting why this does not need mut self
...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It might be since the with_detectors consumes the builder and its not a &mut
reference? That's just a guess I'm actually not sure about that 😅
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
with_key_value
doesn’t need mut self
because it doesn’t directly modify the builder; it delegates to with_key_values
, which takes mut self to perform the actual mutation.
I was also thinking of doing something like this for with_key_value, I'm wondering what others think? let resource = Resource::builder()
.with_key_value(KeyValue::new("test1", "test_value"))
.build();
// vs
let resource = Resource::builder()
.with_key_value("test1", "test_value")
.build(); /// Add a [KeyValue] to the resource.
pub fn with_key_value<K, V>(self, key: K, value: V) -> Self
where
K: Into<Key>,
V: Into<Value>,
{
self.with_key_values(vec![KeyValue::new(key, value)])
} currently its: /// Add a [KeyValue] to the resource.
pub fn with_key_value(self, kv: KeyValue) -> Self {
self.with_key_values(vec![kv])
} |
5976ef0
to
e501d4f
Compare
"service.name", | ||
"metrics-advanced-example", | ||
)])) | ||
.with_resource(resource) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
wondering if we can do with_servicename_resource("metrics-advanced-example")
? This will be the most common use case.
Or just Resource::builder().with_servicename("metrics-advanced-example")......build()
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I like that, I was using the go implementation for Resource builder this weekend and they had something similar to this and it felt pretty nice
sResource, err := resource.New(
ctx,
resource.WithTelemetrySDK(),
resource.WithAttributes(semconv.ServiceName("trace-export-service")),
)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
added the option of .with_service_name("name")
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm should we give special treatment to service name? I feel like it will open a can of worms that which attributes should get dedicate builder method. I think we should keep the API lean for now.
On the long term we can use dedicate trait to enrich the builder. Image something like
pub trait SemCov {
fn with_service_name(&str);
fn with_service_version(&str);
...
// those method can probably generated in sem cov crate
}
impl SemCov for ResourceBuilder {
fn with_service_name(&str) {
...
// again we can generated those code in sem cov crate
}
}
// main.rs
import {ResourceBuilder, SemCov}
let builder = ResourceBuilder::new().with_service_name("test")
So for people don't care about build size, they can opt in method for all attributes on resource builder by importing SemCov
trait.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sounds reasonable to me, I was kind of wondering the same thing where we would want to use the key from sem conv instead of the hardcoded one in the sdk. I will remove this, and it can become another discussion
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should we give special treatment to service name? I feel like it will open a can of worms that which attributes should get dedicate builder method. I think we should keep the API lean for now.
Yes. As spec gives special treatment for service name, with a dedicated env variable just for that. No other Resource attribute has that treatment.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you for the contribution 😊
} | ||
|
||
/// Create ResourceBuilder with a default [Resource]. | ||
pub fn new_default() -> Self { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
pub fn new_default() -> Self { | |
pub fn default() -> Self { |
Probably should be done as an impl Default for ResourceBuilder
to make it more generally compatible.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
updated
|
||
impl ResourceBuilder { | ||
/// Create ResourceBuilder with an empty [Resource]. | ||
pub fn new_empty() -> Self { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
pub fn new_empty() -> Self { | |
pub fn new() -> Self { |
This makes it easier to reason about. Since on Resource
the new is the same as empty but it accepts key values. Since this is a builder most would assume it's empty.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
updated
9fca93a
to
155f875
Compare
} | ||
|
||
/// Add multiple [KeyValue]s to the resource. | ||
pub fn with_key_values<T: IntoIterator<Item = KeyValue>>(mut self, kvs: T) -> Self { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should the method be named with_attribute
and with_attributes
- Just that the spec uses the term "attribute" consistently when describing resource data.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+1
self.resource = self.resource.merge(&Resource::new(kvs)); | ||
self | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should there also be a method with_schema_url
to add schema url ?
I vote for this, it's similar to what is followed for opentelemetry-rust/opentelemetry-sdk/src/logs/record.rs Lines 98 to 102 in a3c469b
|
} | ||
|
||
impl Default for ResourceBuilder { | ||
/// Create ResourceBuilder with [Resource::default()]. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can we mention what the default would be here also? i.e it'll contain the telemetry,env etc.?
} | ||
|
||
/// Create a [Resource] with the options provided to the [ResourceBuilder]. | ||
pub fn build(self) -> Resource { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we implement Into<Resource>
for ResourceBuilder
to make it easier to use ResourceBuilder
as Resource
in parameters
fixes #2320
Changes
ResourceBuilder
to more easily create resources.example usage:
Merge requirement checklist
CHANGELOG.md
files updated for non-trivial, user-facing changes