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

Merge OTELResourceDetector result when creating resources #1096

Merged
merged 6 commits into from
Sep 18, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions opentelemetry-sdk/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
([#1053](https://github.com/open-telemetry/opentelemetry-python/pull/1053))
- Rename Resource labels to attributes
([#1082](https://github.com/open-telemetry/opentelemetry-python/pull/1082))
- Merge `OTELResourceDetector` result when creating resources
([#1096](https://github.com/open-telemetry/opentelemetry-python/pull/1096))

## Version 0.12b0

Expand Down
11 changes: 7 additions & 4 deletions opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,17 +33,20 @@
OPENTELEMETRY_SDK_VERSION = pkg_resources.get_distribution(
"opentelemetry-sdk"
).version
OTEL_RESOURCE_ATTRIBUTES = "OTEL_RESOURCE_ATTRIBUTES"


class Resource:
def __init__(self, attributes: Attributes):
self._attributes = attributes.copy()

@staticmethod
def create(attributes: Attributes) -> "Resource":
def create(attributes: typing.Optional[Attributes]) -> "Resource":
aabmass marked this conversation as resolved.
Show resolved Hide resolved
if not attributes:
return _DEFAULT_RESOURCE
return _DEFAULT_RESOURCE.merge(Resource(attributes))
resource = _DEFAULT_RESOURCE
else:
resource = _DEFAULT_RESOURCE.merge(Resource(attributes))
return resource.merge(OTELResourceDetector().detect())

@staticmethod
def create_empty() -> "Resource":
Expand Down Expand Up @@ -92,7 +95,7 @@ def detect(self) -> "Resource":
class OTELResourceDetector(ResourceDetector):
# pylint: disable=no-self-use
def detect(self) -> "Resource":
env_resources_items = os.environ.get("OTEL_RESOURCE_ATTRIBUTES")
env_resources_items = os.environ.get(OTEL_RESOURCE_ATTRIBUTES)
env_resource_map = {}
if env_resources_items:
env_resource_map = {
Expand Down
2 changes: 1 addition & 1 deletion opentelemetry-sdk/tests/metrics/test_metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def test_resource_empty(self):
meter_provider = metrics.MeterProvider()
meter = meter_provider.get_meter(__name__)
# pylint: disable=protected-access
self.assertIs(meter.resource, resources._DEFAULT_RESOURCE)
self.assertEqual(meter.resource, resources._DEFAULT_RESOURCE)

def test_start_pipeline(self):
exporter = mock.Mock()
Expand Down
36 changes: 26 additions & 10 deletions opentelemetry-sdk/tests/resources/test_resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@


class TestResources(unittest.TestCase):
def setUp(self) -> None:
os.environ[resources.OTEL_RESOURCE_ATTRIBUTES] = ""

def tearDown(self) -> None:
os.environ.pop(resources.OTEL_RESOURCE_ATTRIBUTES)

def test_create(self):
attributes = {
"service": "ui",
Expand All @@ -44,14 +50,22 @@ def test_create(self):
self.assertIsInstance(resource, resources.Resource)
self.assertEqual(resource.attributes, expected_attributes)

os.environ[resources.OTEL_RESOURCE_ATTRIBUTES] = "key=value"
resource = resources.Resource.create(attributes)
self.assertIsInstance(resource, resources.Resource)
expected_with_envar = expected_attributes.copy()
expected_with_envar["key"] = "value"
self.assertEqual(resource.attributes, expected_with_envar)
os.environ[resources.OTEL_RESOURCE_ATTRIBUTES] = ""

resource = resources.Resource.create_empty()
self.assertIs(resource, resources._EMPTY_RESOURCE)
self.assertEqual(resource, resources._EMPTY_RESOURCE)

resource = resources.Resource.create(None)
self.assertIs(resource, resources._DEFAULT_RESOURCE)
self.assertEqual(resource, resources._DEFAULT_RESOURCE)

resource = resources.Resource.create({})
self.assertIs(resource, resources._DEFAULT_RESOURCE)
self.assertEqual(resource, resources._DEFAULT_RESOURCE)

def test_resource_merge(self):
left = resources.Resource({"service": "ui"})
Expand Down Expand Up @@ -184,36 +198,38 @@ def test_resource_detector_raise_error(self):

class TestOTELResourceDetector(unittest.TestCase):
def setUp(self) -> None:
os.environ["OTEL_RESOURCE_ATTRIBUTES"] = ""
os.environ[resources.OTEL_RESOURCE_ATTRIBUTES] = ""

def tearDown(self) -> None:
os.environ.pop("OTEL_RESOURCE_ATTRIBUTES")
os.environ.pop(resources.OTEL_RESOURCE_ATTRIBUTES)

def test_empty(self):
detector = resources.OTELResourceDetector()
os.environ["OTEL_RESOURCE_ATTRIBUTES"] = ""
os.environ[resources.OTEL_RESOURCE_ATTRIBUTES] = ""
self.assertEqual(detector.detect(), resources.Resource.create_empty())

def test_one(self):
detector = resources.OTELResourceDetector()
os.environ["OTEL_RESOURCE_ATTRIBUTES"] = "k=v"
os.environ[resources.OTEL_RESOURCE_ATTRIBUTES] = "k=v"
self.assertEqual(detector.detect(), resources.Resource({"k": "v"}))

def test_one_with_whitespace(self):
detector = resources.OTELResourceDetector()
os.environ["OTEL_RESOURCE_ATTRIBUTES"] = " k = v "
os.environ[resources.OTEL_RESOURCE_ATTRIBUTES] = " k = v "
self.assertEqual(detector.detect(), resources.Resource({"k": "v"}))

def test_multiple(self):
detector = resources.OTELResourceDetector()
os.environ["OTEL_RESOURCE_ATTRIBUTES"] = "k=v,k2=v2"
os.environ[resources.OTEL_RESOURCE_ATTRIBUTES] = "k=v,k2=v2"
self.assertEqual(
detector.detect(), resources.Resource({"k": "v", "k2": "v2"})
)

def test_multiple_with_whitespace(self):
detector = resources.OTELResourceDetector()
os.environ["OTEL_RESOURCE_ATTRIBUTES"] = " k = v , k2 = v2 "
os.environ[
resources.OTEL_RESOURCE_ATTRIBUTES
] = " k = v , k2 = v2 "
self.assertEqual(
detector.detect(), resources.Resource({"k": "v", "k2": "v2"})
)
2 changes: 1 addition & 1 deletion opentelemetry-sdk/tests/trace/test_trace.py
Original file line number Diff line number Diff line change
Expand Up @@ -396,7 +396,7 @@ def test_default_span_resource(self):
tracer = tracer_provider.get_tracer(__name__)
span = tracer.start_span("root")
# pylint: disable=protected-access
self.assertIs(span.resource, resources._DEFAULT_RESOURCE)
self.assertEqual(span.resource, resources._DEFAULT_RESOURCE)

def test_span_context_remote_flag(self):
tracer = new_tracer()
Expand Down