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

Feat/add resource builder #2322

Merged
merged 36 commits into from
Dec 13, 2024

Conversation

pitoniak32
Copy link
Contributor

@pitoniak32 pitoniak32 commented Nov 22, 2024

fixes #2320

Migration Guide

Creating a Resource with default detectors:

// old
let resource = Resource::default()
    .with_attributes([
        KeyValue::new("service.name", "example_service"),
        KeyValue::new("test1", "test_value"),
        KeyValue::new("test1", "test_value1"),
        KeyValue::new("test2", "test_value2"),
    ]);

// new
let resource = Resource::builder()
    .with_service_name("example_service")
    .with_attributes([
        KeyValue::new("test1", "test_value")
        KeyValue::new("test1", "test_value1"),
        KeyValue::new("test2", "test_value2"),
    ])
    .build();

Creating an empty Resource:

// old
let resource = Resource::empty();

// new
let resource = Resource::builder_empty().build();

Changes

  • Add ResourceBuilder to more easily create resources.

example usage:

let resource = Resource::builder()
    .with_service_name("gifting_service")
    .with_detector(Box::new(EnvResourceDetector::new()))
    .with_attribute(KeyValue::new("test1", "test_value"))
    .with_attributes([
        KeyValue::new("test1", "test_value1"),
        KeyValue::new("test2", "test_value2"),
    ])
    .build();

Merge requirement checklist

  • CONTRIBUTING guidelines followed
  • Unit tests added/updated (if applicable)
  • Appropriate CHANGELOG.md files updated for non-trivial, user-facing changes
  • Changes in public API reviewed (if applicable)

@pitoniak32 pitoniak32 requested a review from a team as a code owner November 22, 2024 01:30
Copy link

codecov bot commented Nov 22, 2024

Codecov Report

Attention: Patch coverage is 93.65079% with 16 lines in your changes missing coverage. Please review.

Project coverage is 79.4%. Comparing base (15d69b1) to head (c020eec).
Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
opentelemetry-zipkin/src/exporter/mod.rs 0.0% 13 Missing ⚠️
opentelemetry-sdk/src/resource/env.rs 97.2% 1 Missing ⚠️
opentelemetry-stdout/src/logs/exporter.rs 0.0% 1 Missing ⚠️
opentelemetry-stdout/src/trace/exporter.rs 0.0% 1 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##            main   #2322     +/-   ##
=======================================
+ Coverage   79.3%   79.4%   +0.1%     
=======================================
  Files        122     122             
  Lines      21588   21708    +120     
=======================================
+ Hits       17138   17255    +117     
- Misses      4450    4453      +3     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@pitoniak32 pitoniak32 force-pushed the feat/add-resource-builder branch from fdd9fd1 to b0bbed5 Compare November 22, 2024 01:40
@pitoniak32
Copy link
Contributor Author

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 :)

@utpilla
Copy link
Contributor

utpilla commented Nov 23, 2024

@pitoniak32 Could you split this into two PRs? Have one PR just for removing the timeout argument and one for resource builder. That way we can merge the timeout related PR while we review the builder related changes.

@pitoniak32
Copy link
Contributor Author

@pitoniak32 Could you split this into two PRs? Have one PR just for removing the timeout argument and one for resource builder. That way we can merge the timeout related PR while we review the builder related changes.

split those changes into: #2332

@pitoniak32 pitoniak32 force-pushed the feat/add-resource-builder branch from f08a237 to afb8ba4 Compare November 23, 2024 23:46
}

/// Add a [KeyValue] to the resource.
pub fn with_key_value(self, kv: KeyValue) -> Self {
Copy link
Member

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...

Copy link
Contributor Author

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 😅

Copy link
Member

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.

@pitoniak32
Copy link
Contributor Author

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])
}

@pitoniak32 pitoniak32 force-pushed the feat/add-resource-builder branch 2 times, most recently from 5976ef0 to e501d4f Compare November 24, 2024 16:02
hdost
hdost previously requested changes Nov 26, 2024
Copy link
Contributor

@hdost hdost left a 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 😊

opentelemetry-sdk/src/resource/builder.rs Outdated Show resolved Hide resolved
opentelemetry-sdk/src/resource/builder.rs Outdated Show resolved Hide resolved
@lalitb lalitb added this to the 0.27.1 milestone Nov 26, 2024
@pitoniak32 pitoniak32 force-pushed the feat/add-resource-builder branch from 9fca93a to 155f875 Compare December 1, 2024 20:29
}

/// Add multiple [KeyValue]s to the resource.
pub fn with_key_values<T: IntoIterator<Item = KeyValue>>(mut self, kvs: T) -> Self {
Copy link
Member

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.

Copy link
Member

Choose a reason for hiding this comment

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

+1

Copy link
Contributor Author

Choose a reason for hiding this comment

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

fixed this

self.resource = self.resource.merge(&Resource::new(kvs));
self
}

Copy link
Member

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 ?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

How would we like the behavior of the with_schema_url to act? Do we want to follow the rules that from_schema_url has? Or override the current one with the specified one, or maybe use TypeState pattern to only allow the schema_url to be set once?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

added this, would love to hear feedback on the implementation!

@lalitb
Copy link
Member

lalitb commented Dec 2, 2024

/// Add a [KeyValue] to the resource.
pub fn with_key_value<K, V>(self, key: K, value: V) -> Self
where
K: Into,
V: Into,
{
self.with_key_values(vec![KeyValue::new(key, value)])
}

I vote for this, it's similar to what is followed for LogRecord::add_attribute:

fn add_attribute<K, V>(&mut self, key: K, value: V)
where
K: Into<Key>,
V: Into<AnyValue>,
{

@cijothomas cijothomas removed this from the 0.27.1 milestone Dec 2, 2024
@cijothomas cijothomas dismissed hdost’s stale review December 9, 2024 23:36

Changes done. Please re-review.

Copy link
Member

@cijothomas cijothomas left a comment

Choose a reason for hiding this comment

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

LGTM.
I think we can keep few methods on Resource like new() as pub(mod) to reduce the amount of internal changes.

Please update changelog to callout the breaking change/migration snippets.

Thanks for patiently working through this!

@cijothomas cijothomas added the integration tests Run integration tests label Dec 13, 2024
@pitoniak32 pitoniak32 force-pushed the feat/add-resource-builder branch from c510398 to 9f86898 Compare December 13, 2024 03:46
Copy link
Contributor

@utpilla utpilla left a comment

Choose a reason for hiding this comment

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

Looks good overall! I left some non-blocking suggestions.

Thanks @pitoniak32 for helping with this refactoring!

Copy link
Member

@lalitb lalitb left a comment

Choose a reason for hiding this comment

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

LGTM! This looks great. Thank you for making all the updates and for your patience in addressing the comments

ps. Integration test is failing.

@pitoniak32
Copy link
Contributor Author

LGTM! This looks great. Thank you for making all the updates and for your patience in addressing the comments

ps. Integration test is failing.

does it make sense to keep using an empty resource for integration tests, or should it get updated to have the default detectors?

@cijothomas
Copy link
Member

LGTM! This looks great. Thank you for making all the updates and for your patience in addressing the comments
ps. Integration test is failing.

does it make sense to keep using an empty resource for integration tests, or should it get updated to have the default detectors?

either is fine! Do what is easiest for this PR.

@cijothomas cijothomas merged commit 9aeae0f into open-telemetry:main Dec 13, 2024
21 checks passed
@pitoniak32 pitoniak32 deleted the feat/add-resource-builder branch December 13, 2024 23:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
integration tests Run integration tests
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Improve Resource related public APIs
6 participants