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

pantsbuild / pants / 26751910360

01 Jun 2026 11:24AM UTC coverage: 52.046% (-40.7%) from 92.792%
26751910360

Pull #23395

github

web-flow
Merge 41608d741 into c8127c1f4
Pull Request #23395: Bump the gha-deps group with 8 updates

31994 of 61473 relevant lines covered (52.05%)

1.04 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

4
from __future__ import annotations
×
5

6
import datetime
×
7
import logging
×
8

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

32
logger = logging.getLogger(__name__)
×
33

34

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

38

39
@rule
×
40
async def telemetry_workunits_callback_factory_request(
×
41
    _: TelemetryWorkunitsCallbackFactoryRequest,
42
    telemetry: TelemetrySubsystem,
43
    build_root: BuildRoot,
44
) -> WorkunitsCallbackFactory:
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

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

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

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

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

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

94
        processor.initialize()
×
95

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

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

107

108
def rules():
×
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