Skip to content

Commit 109224a

Browse files
Use pytest functionality to lookup codebase name (#35)
Co-authored-by: Chris Guidry <chris@theguidrys.us>
1 parent 50a9a97 commit 109224a

File tree

3 files changed

+41
-13
lines changed

3 files changed

+41
-13
lines changed

src/pytest_opentelemetry/instrumentation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def pytest_configure(self, config: Config) -> None:
5959
OpenTelemetryContainerDistro().configure()
6060

6161
configurator = OpenTelemetryContainerConfigurator()
62-
configurator.resource_detectors.append(CodebaseResourceDetector())
62+
configurator.resource_detectors.append(CodebaseResourceDetector(config))
6363
configurator.resource_detectors.append(OTELResourceDetector())
6464
configurator.configure()
6565

src/pytest_opentelemetry/resource.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import os
21
import subprocess
32
from typing import Dict, Union
43

54
from opentelemetry.sdk.resources import Resource, ResourceDetector
65
from opentelemetry.semconv.resource import ResourceAttributes
6+
from pytest import Config
77

88
Attributes = Dict[str, Union[str, bool, int, float]]
99

@@ -12,11 +12,23 @@ class CodebaseResourceDetector(ResourceDetector):
1212
"""Detects OpenTelemetry Resource attributes for an operating system process,
1313
providing the `process.*` attributes"""
1414

15-
@staticmethod
16-
def get_codebase_name() -> str:
17-
# TODO: any better ways to guess the name of the codebase?
18-
# TODO: look into methods for locating packaging information
19-
return os.path.split(os.getcwd())[-1]
15+
def __init__(self, config: Config):
16+
self.config = config
17+
ResourceDetector.__init__(self)
18+
19+
def get_codebase_name(self) -> str:
20+
"""Get the name of the codebase.
21+
22+
In order of preference:
23+
junit_suite_name
24+
--junitprefix
25+
rootpath: Guaranteed to exist, the reference used to construct nodeid
26+
"""
27+
return str(
28+
self.config.inicfg.get('junit_suite_name')
29+
or self.config.getoption("--junitprefix", None)
30+
or self.config.rootpath.name
31+
)
2032

2133
@staticmethod
2234
def get_codebase_version() -> str:

tests/test_resource.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import subprocess
44
import tempfile
55
from typing import Generator
6-
from unittest.mock import patch
6+
from unittest.mock import MagicMock, Mock, patch
77

88
import pytest
99
from opentelemetry.sdk.resources import Resource
@@ -26,11 +26,27 @@ def bare_codebase() -> Generator[str, None, None]:
2626

2727
@pytest.fixture
2828
def resource() -> Resource:
29-
return CodebaseResourceDetector().detect()
29+
return CodebaseResourceDetector(Mock()).detect()
3030

3131

32-
def test_service_name_from_directory(bare_codebase: str, resource: Resource) -> None:
33-
assert resource.attributes['service.name'] == 'my-project'
32+
def test_get_codebase_name() -> None:
33+
config = MagicMock()
34+
config.inicfg = {'junit_suite_name': 'my-project'}
35+
config.rootpath.name = None
36+
config.getoption.return_value = None
37+
assert CodebaseResourceDetector(config).get_codebase_name() == 'my-project'
38+
39+
config = MagicMock()
40+
config.inicfg = {}
41+
config.rootpath.name = None
42+
config.getoption.return_value = 'my-project'
43+
assert CodebaseResourceDetector(config).get_codebase_name() == 'my-project'
44+
45+
config = MagicMock()
46+
config.inicfg = {}
47+
config.rootpath.name = 'my-project'
48+
config.getoption.return_value = None
49+
assert CodebaseResourceDetector(config).get_codebase_name() == 'my-project'
3450

3551

3652
def test_service_version_unknown(bare_codebase: str, resource: Resource) -> None:
@@ -45,15 +61,15 @@ def test_service_version_git_problems() -> None:
4561
subprocess.CalledProcessError(128, ['git', 'rev-parse', 'HEAD']),
4662
],
4763
):
48-
resource = CodebaseResourceDetector().detect()
64+
resource = CodebaseResourceDetector(Mock()).detect()
4965
assert resource.attributes['service.version'] == (
5066
"[unknown: Command '['git', 'rev-parse', 'HEAD']' "
5167
"returned non-zero exit status 128.]"
5268
)
5369
with patch(
5470
'pytest_opentelemetry.resource.subprocess.check_output', side_effect=[b'false']
5571
):
56-
resource = CodebaseResourceDetector().detect()
72+
resource = CodebaseResourceDetector(Mock()).detect()
5773
assert resource.attributes['service.version'] == (
5874
"[unknown: not a git repository]"
5975
)

0 commit comments

Comments
 (0)