Skip to content

Commit 8d309af

Browse files
owaisocelotl
andauthoredFeb 3, 2022
Logging: Defensively access provider resource (#890)
Now service name is extracted from the provider defensively and lazily. This accounts for an SDK that does not provide access to "resource" via TracerProviders and for lazy initialization of TracerProviders. Fixes #810 Co-authored-by: Diego Hurtado <[email protected]>
1 parent 0431d7b commit 8d309af

File tree

3 files changed

+59
-6
lines changed

3 files changed

+59
-6
lines changed
 

‎CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased](https://github.com/open-telemetry/opentelemetry-python/compare/v1.9.1-0.28b1...HEAD)
99

10+
### Fixed
11+
12+
- `opentelemetry-instrumentation-logging` retrieves service name defensively.
13+
([#890](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/890))
14+
1015
## [1.9.1-0.28b1](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.9.1-0.28b1) - 2022-01-29
1116

1217

‎instrumentation/opentelemetry-instrumentation-logging/src/opentelemetry/instrumentation/logging/__init__.py

+14-5
Original file line numberDiff line numberDiff line change
@@ -76,20 +76,29 @@ def instrumentation_dependencies(self) -> Collection[str]:
7676
return _instruments
7777

7878
def _instrument(self, **kwargs):
79-
service_name = ""
80-
provider = kwargs.get("tracer_provider", None) or get_tracer_provider()
81-
resource = provider.resource if provider else None
82-
if resource:
83-
service_name = resource.attributes.get("service.name")
8479

80+
provider = kwargs.get("tracer_provider", None) or get_tracer_provider()
8581
old_factory = logging.getLogRecordFactory()
8682
LoggingInstrumentor._old_factory = old_factory
8783

84+
service_name = None
85+
8886
def record_factory(*args, **kwargs):
8987
record = old_factory(*args, **kwargs)
9088

9189
record.otelSpanID = "0"
9290
record.otelTraceID = "0"
91+
92+
nonlocal service_name
93+
if service_name is None:
94+
resource = getattr(provider, "resource", None)
95+
if resource:
96+
service_name = (
97+
resource.attributes.get("service.name") or ""
98+
)
99+
else:
100+
service_name = ""
101+
93102
record.otelServiceName = service_name
94103

95104
span = get_current_span()

‎instrumentation/opentelemetry-instrumentation-logging/tests/test_logging.py

+40-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# limitations under the License.
1414

1515
import logging
16+
from typing import Optional
1617
from unittest import mock
1718

1819
import pytest
@@ -22,7 +23,45 @@
2223
LoggingInstrumentor,
2324
)
2425
from opentelemetry.test.test_base import TestBase
25-
from opentelemetry.trace import get_tracer
26+
from opentelemetry.trace import ProxyTracer, get_tracer
27+
28+
29+
class FakeTracerProvider:
30+
def get_tracer( # pylint: disable=no-self-use
31+
self,
32+
instrumenting_module_name: str,
33+
instrumenting_library_version: Optional[str] = None,
34+
schema_url: Optional[str] = None,
35+
) -> ProxyTracer:
36+
return ProxyTracer(
37+
instrumenting_module_name,
38+
instrumenting_library_version,
39+
schema_url,
40+
)
41+
42+
43+
class TestLoggingInstrumentorProxyTracerProvider(TestBase):
44+
@pytest.fixture(autouse=True)
45+
def inject_fixtures(self, caplog):
46+
self.caplog = caplog # pylint: disable=attribute-defined-outside-init
47+
48+
def setUp(self):
49+
super().setUp()
50+
LoggingInstrumentor().instrument(tracer_provider=FakeTracerProvider())
51+
52+
def tearDown(self):
53+
super().tearDown()
54+
LoggingInstrumentor().uninstrument()
55+
56+
def test_trace_context_injection(self):
57+
with self.caplog.at_level(level=logging.INFO):
58+
logger = logging.getLogger("test logger")
59+
logger.info("hello")
60+
self.assertEqual(len(self.caplog.records), 1)
61+
record = self.caplog.records[0]
62+
self.assertEqual(record.otelSpanID, "0")
63+
self.assertEqual(record.otelTraceID, "0")
64+
self.assertEqual(record.otelServiceName, "")
2665

2766

2867
class TestLoggingInstrumentor(TestBase):

0 commit comments

Comments
 (0)
Please sign in to comment.