• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pantsbuild / pants / 26260209689

21 May 2026 11:59PM UTC coverage: 75.453% (-15.7%) from 91.156%
26260209689

Pull #23365

github

web-flow
Merge 5fe873b58 into 7ea655ba0
Pull Request #23365: uv.lock -> pex optimization

5 of 16 new or added lines in 1 file covered. (31.25%)

10118 existing lines in 378 files now uncovered.

54669 of 72454 relevant lines covered (75.45%)

2.31 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/python/pants/backend/observability/opentelemetry/register.py
1
# Copyright 2026 Pants project contributors (see CONTRIBUTORS.md).
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
3

UNCOV
4
from __future__ import annotations
×
5

UNCOV
6
import datetime
×
UNCOV
7
import logging
×
8

UNCOV
9
from pants.backend.observability.opentelemetry.exception_logging_processor import (
×
10
    ExceptionLoggingProcessor,
11
)
UNCOV
12
from pants.backend.observability.opentelemetry.opentelemetry_config import OtlpParameters
×
UNCOV
13
from pants.backend.observability.opentelemetry.opentelemetry_processor import get_processor
×
UNCOV
14
from pants.backend.observability.opentelemetry.single_threaded_processor import (
×
15
    SingleThreadedProcessor,
16
)
UNCOV
17
from pants.backend.observability.opentelemetry.subsystem import TelemetrySubsystem
×
UNCOV
18
from pants.backend.observability.opentelemetry.workunit_handler import TelemetryWorkunitsCallback
×
UNCOV
19
from pants.base.build_root import BuildRoot
×
UNCOV
20
from pants.core.util_rules.env_vars import (
×
21
    environment_vars_subset,
22
)
UNCOV
23
from pants.engine.env_vars import EnvironmentVarsRequest
×
UNCOV
24
from pants.engine.rules import collect_rules, implicitly, rule
×
UNCOV
25
from pants.engine.streaming_workunit_handler import (
×
26
    WorkunitsCallback,
27
    WorkunitsCallbackFactory,
28
    WorkunitsCallbackFactoryRequest,
29
)
UNCOV
30
from pants.engine.unions import UnionRule
×
31

UNCOV
32
logger = logging.getLogger(__name__)
×
33

34

UNCOV
35
class TelemetryWorkunitsCallbackFactoryRequest(WorkunitsCallbackFactoryRequest):
×
UNCOV
36
    pass
×
37

38

UNCOV
39
@rule
×
UNCOV
40
async def telemetry_workunits_callback_factory_request(
×
41
    _: TelemetryWorkunitsCallbackFactoryRequest,
42
    telemetry: TelemetrySubsystem,
43
    build_root: BuildRoot,
44
) -> WorkunitsCallbackFactory:
UNCOV
45
    logger.debug(
×
46
        f"telemetry_workunits_callback_factory_request: telemetry.enabled={telemetry.enabled}; telemetry.exporter={telemetry.exporter}; "
47
        f"bool(telemetry.exporter)={bool(telemetry.exporter)}"
48
    )
49

UNCOV
50
    traceparent_env_var: str | None = None
×
UNCOV
51
    otel_resource_attributes: str | None = None
×
UNCOV
52
    if telemetry.enabled and telemetry.exporter:
×
UNCOV
53
        env_vars = await environment_vars_subset(
×
54
            EnvironmentVarsRequest(["TRACEPARENT", "OTEL_RESOURCE_ATTRIBUTES"]), **implicitly()
55
        )  # type: ignore[arg-type,unused-ignore]
UNCOV
56
        if telemetry.parse_traceparent:
×
UNCOV
57
            traceparent_env_var = env_vars.get("TRACEPARENT")
×
UNCOV
58
            logger.debug(f"Found TRACEPARENT: {traceparent_env_var}")
×
UNCOV
59
        otel_resource_attributes = env_vars.get("OTEL_RESOURCE_ATTRIBUTES")
×
UNCOV
60
        logger.debug(f"Found OTEL_RESOURCE_ATTRIBUTES: {otel_resource_attributes}")
×
61

UNCOV
62
    def workunits_callback_factory() -> WorkunitsCallback | None:
×
UNCOV
63
        if not telemetry.enabled or not telemetry.exporter:
×
64
            logger.debug("Skipping enabling OpenTelemetry work unit handler.")
×
65
            return None
×
66

UNCOV
67
        logger.debug("Enabling OpenTelemetry work unit handler.")
×
68

UNCOV
69
        otel_processor = get_processor(
×
70
            span_exporter_name=telemetry.exporter,
71
            otlp_parameters=OtlpParameters(
72
                endpoint=telemetry.exporter_endpoint,
73
                traces_endpoint=telemetry.exporter_traces_endpoint,
74
                certificate_file=telemetry.exporter_certificate_file,
75
                client_key_file=telemetry.exporter_client_key_file,
76
                client_certificate_file=telemetry.exporter_client_certificate_file,
77
                headers=telemetry.exporter_headers,
78
                timeout=telemetry.exporter_timeout,
79
                compression=(
80
                    telemetry.exporter_compression.value if telemetry.exporter_compression else None
81
                ),
82
            ),
83
            build_root=build_root.pathlib_path,
84
            traceparent_env_var=traceparent_env_var,
85
            otel_resource_attributes=otel_resource_attributes,
86
            json_file=telemetry.json_file,
87
            trace_link_template=telemetry.trace_link_template,
88
        )
89

UNCOV
90
        processor = SingleThreadedProcessor(
×
91
            ExceptionLoggingProcessor(otel_processor, name="OpenTelemetry")
92
        )
93

UNCOV
94
        processor.initialize()
×
95

UNCOV
96
        return TelemetryWorkunitsCallback(
×
97
            processor=processor,
98
            finish_timeout=finish_timeout,
99
            async_completion=telemetry.async_completion,
100
        )
101

UNCOV
102
    finish_timeout = datetime.timedelta(seconds=telemetry.finish_timeout)
×
UNCOV
103
    return WorkunitsCallbackFactory(
×
104
        callback_factory=workunits_callback_factory,
105
    )
106

107

UNCOV
108
def rules():
×
UNCOV
109
    return (
×
110
        *collect_rules(),
111
        UnionRule(WorkunitsCallbackFactoryRequest, TelemetryWorkunitsCallbackFactoryRequest),
112
    )
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc