Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
0db71e9
add host resource detector
oliver-zhang Sep 7, 2024
55d984d
add host resource detector
oliver-zhang Sep 7, 2024
3f2277e
update changelog
oliver-zhang Sep 7, 2024
e7f5bba
code format
oliver-zhang Sep 11, 2024
e30e79e
Update opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py
oliver-zhang Sep 12, 2024
ac2a828
resolve conversation
oliver-zhang Sep 12, 2024
5ddc94a
Merge branch 'main' into resource-detector-host
oliver-zhang Sep 12, 2024
6093e34
check setup pre-commit
oliver-zhang Sep 13, 2024
c0e5856
Merge remote-tracking branch 'origin/resource-detector-host' into res…
oliver-zhang Sep 13, 2024
d162529
remove error import
oliver-zhang Sep 13, 2024
1e9e9c2
remove error import
oliver-zhang Sep 13, 2024
96f31d7
change get resources
oliver-zhang Sep 13, 2024
c1a87de
Merge branch 'main' into resource-detector-host
oliver-zhang Sep 18, 2024
13d6cbe
add this resource detector to the list of entry points
oliver-zhang Sep 18, 2024
0361ee5
Merge remote-tracking branch 'origin/resource-detector-host' into res…
oliver-zhang Sep 18, 2024
5d27915
add test_resource_detector_entry_points_host and code reformat
oliver-zhang Sep 19, 2024
ca63ce8
Merge branch 'main' into resource-detector-host
lzchen Sep 19, 2024
d4e4952
Add an underscore _ in front of the resource detector
oliver-zhang Sep 20, 2024
bb1740a
Merge remote-tracking branch 'origin/resource-detector-host' into res…
oliver-zhang Sep 20, 2024
0ea2c14
Merge branch 'main' into resource-detector-host
oliver-zhang Sep 20, 2024
bd6263e
Add an underscore _ in front of the resource detector
oliver-zhang Sep 21, 2024
0685f3b
Merge remote-tracking branch 'origin/resource-detector-host' into res…
oliver-zhang Sep 21, 2024
f31da4b
Add an underscore _ in front of the resource detector
oliver-zhang Sep 24, 2024
a058cb2
Merge branch 'main' into resource-detector-host
pmcollins Oct 1, 2024
a28026b
Merge branch 'main' into resource-detector-host
emdneto Oct 3, 2024
0d9a6d3
Update opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py
oliver-zhang Oct 8, 2024
e57c902
Remove unnecessary variable declarations
oliver-zhang Oct 8, 2024
260792b
Merge branch 'main' into resource-detector-host
emdneto Oct 8, 2024
73b2ea4
Merge branch 'main' into resource-detector-host
emdneto Oct 10, 2024
484f25a
Merge branch 'main' into resource-detector-host
lzchen Oct 14, 2024
ebc3f2c
Merge branch 'main' into resource-detector-host
lzchen Oct 14, 2024
bae33a3
Merge branch 'main' into resource-detector-host
lzchen Oct 15, 2024
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 CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
([#4154](https://github.com/open-telemetry/opentelemetry-python/pull/4154))
- sdk: Add support for log formatting
([#4137](https://github.com/open-telemetry/opentelemetry-python/pull/4166))
- sdk: Add Host resource detector
([#4182](https://github.com/open-telemetry/opentelemetry-python/pull/4182))

## Version 1.27.0/0.48b0 (2024-08-28)

Expand Down
50 changes: 39 additions & 11 deletions opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
import logging
import os
import platform
import socket
import sys
import typing
from json import dumps
Expand Down Expand Up @@ -105,6 +106,7 @@
FAAS_VERSION = ResourceAttributes.FAAS_VERSION
FAAS_INSTANCE = ResourceAttributes.FAAS_INSTANCE
HOST_NAME = ResourceAttributes.HOST_NAME
HOST_ARCH = ResourceAttributes.HOST_ARCH
HOST_TYPE = ResourceAttributes.HOST_TYPE
HOST_IMAGE_NAME = ResourceAttributes.HOST_IMAGE_NAME
HOST_IMAGE_ID = ResourceAttributes.HOST_IMAGE_ID
Expand Down Expand Up @@ -159,7 +161,7 @@ class Resource:
_schema_url: str

def __init__(
self, attributes: Attributes, schema_url: typing.Optional[str] = None
self, attributes: Attributes, schema_url: typing.Optional[str] = None
):
self._attributes = BoundedAttributes(attributes=attributes)
if schema_url is None:
Expand All @@ -168,8 +170,8 @@ def __init__(

@staticmethod
def create(
attributes: typing.Optional[Attributes] = None,
schema_url: typing.Optional[str] = None,
attributes: typing.Optional[Attributes] = None,
schema_url: typing.Optional[str] = None,
) -> "Resource":
"""Creates a new `Resource` from attributes.

Expand All @@ -188,8 +190,8 @@ def create(
{
otel_experimental_resource_detector.strip()
for otel_experimental_resource_detector in environ.get(
OTEL_EXPERIMENTAL_RESOURCE_DETECTORS, ""
).split(",")
OTEL_EXPERIMENTAL_RESOURCE_DETECTORS, ""
).split(",")
if otel_experimental_resource_detector
}
)
Expand Down Expand Up @@ -276,8 +278,8 @@ def __eq__(self, other: object) -> bool:
if not isinstance(other, Resource):
return False
return (
self._attributes == other._attributes
and self._schema_url == other._schema_url
self._attributes == other._attributes
and self._schema_url == other._schema_url
)

def __hash__(self) -> int:
Expand Down Expand Up @@ -353,7 +355,7 @@ def detect(self) -> "Resource":
(
sys.version_info[:3]
if sys.version_info.releaselevel == "final"
and not sys.version_info.serial
and not sys.version_info.serial
else sys.version_info
),
)
Expand Down Expand Up @@ -471,10 +473,36 @@ def detect(self) -> "Resource":
)


class HostResourceDetector(ResourceDetector):
"""
The HostResourceDetector detects host resources using OpenTelemetry.
"""

def detect(self) -> "Resource":
try:
resource = Resource.get_empty()
host_name = socket.gethostname()
if host_name:
resource = resource.merge(Resource({HOST_NAME: host_name}))
host_arch = platform.machine()
if host_arch:
resource = resource.merge(Resource({HOST_ARCH: host_arch}))
return resource
except Exception as e:
logger.warning(
"%s Resource Detection failed silently: %s",
self.__class__.__name__,
e,
)
if self.raise_on_error:
raise e
return Resource.get_empty()


def get_aggregated_resources(
detectors: typing.List["ResourceDetector"],
initial_resource: typing.Optional[Resource] = None,
timeout: int = 5,
detectors: typing.List["ResourceDetector"],
initial_resource: typing.Optional[Resource] = None,
timeout: int = 5,
) -> "Resource":
"""Retrieves resources from detectors in the order that they were passed

Expand Down
31 changes: 30 additions & 1 deletion opentelemetry-sdk/tests/resources/test_resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@
from os import environ
from unittest.mock import Mock, patch
from urllib import parse

from opentelemetry import trace as trace_api
from opentelemetry.exporter.otlp.proto.grpc import exporter
from opentelemetry.resource.detector.host import HostResourceDetector
from opentelemetry.sdk.environment_variables import (
OTEL_EXPERIMENTAL_RESOURCE_DETECTORS,
)
Expand Down Expand Up @@ -54,6 +56,9 @@
ResourceDetector,
get_aggregated_resources,
)
from opentelemetry.sdk.trace import TracerProvider, export
from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter
from opentelemetry.semconv.resource import ResourceAttributes

try:
import psutil
Expand Down Expand Up @@ -777,3 +782,27 @@ def test_os_detector_solaris(self):

self.assertEqual(resource.attributes[OS_TYPE], "solaris")
self.assertEqual(resource.attributes[OS_VERSION], "666.4.0.15.0")
class TestHostResourceDetector(unittest.TestCase):
def test_host_resource_detector(self):
detector = HostResourceDetector()
actual = detector.detect()
self.assertTrue(actual.attributes.get(ResourceAttributes.HOST_NAME))
self.assertTrue(actual.attributes.get(ResourceAttributes.HOST_ARCH))

def test_host_resource_as_span_attribute(self):

tracer_provider = TracerProvider(resource=get_aggregated_resources([HostResourceDetector()]))
memory_exporter = InMemorySpanExporter()
span_processor = export.SimpleSpanProcessor(memory_exporter)
tracer_provider.add_span_processor(span_processor)
tracer = tracer_provider.get_tracer(__name__)

with tracer.start_as_current_span(
"test", kind=trace_api.SpanKind.SERVER
) as _:
pass

span_list = memory_exporter.get_finished_spans()
self.assertTrue(span_list[0].resource.attributes.get(ResourceAttributes.HOST_NAME))
self.assertTrue(span_list[0].resource.attributes.get(ResourceAttributes.HOST_ARCH))