Skip to content

Commit c5ea1f6

Browse files
committedFeb 1, 2022
Logging: Defensively access provider resource
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
1 parent 2189e81 commit c5ea1f6

File tree

3 files changed

+56
-7
lines changed

3 files changed

+56
-7
lines changed
 

Diff for: ‎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

Diff for: ‎instrumentation/opentelemetry-instrumentation-logging/src/opentelemetry/instrumentation/logging/__init__.py

+15-6
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
import logging # pylint: disable=import-self
1818
from os import environ
19-
from typing import Collection
19+
from typing import Collection, Optional
2020

2121
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
2222
from opentelemetry.instrumentation.logging.constants import (
@@ -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()

Diff for: ‎instrumentation/opentelemetry-instrumentation-logging/tests/test_logging.py

+36-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,41 @@
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(
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+
38+
39+
class TestLoggingInstrumentorProxyTracerProvider(TestBase):
40+
@pytest.fixture(autouse=True)
41+
def inject_fixtures(self, caplog):
42+
self.caplog = caplog # pylint: disable=attribute-defined-outside-init
43+
44+
def setUp(self):
45+
super().setUp()
46+
LoggingInstrumentor().instrument(tracer_provider=FakeTracerProvider())
47+
48+
def tearDown(self):
49+
super().tearDown()
50+
LoggingInstrumentor().uninstrument()
51+
52+
def test_trace_context_injection(self):
53+
with self.caplog.at_level(level=logging.INFO):
54+
logger = logging.getLogger("test logger")
55+
logger.info("hello")
56+
self.assertEqual(len(self.caplog.records), 1)
57+
record = self.caplog.records[0]
58+
self.assertEqual(record.otelSpanID, "0")
59+
self.assertEqual(record.otelTraceID, "0")
60+
self.assertEqual(record.otelServiceName, "")
2661

2762

2863
class TestLoggingInstrumentor(TestBase):

0 commit comments

Comments
 (0)