Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/introduction/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ OTEL_EXPERIMENTAL_RESOURCE_DETECTORS=process,os
`OTEL_RESOURCE_ATTRIBUTES` is honoured as well.

The attributes lite-bootstrap sets (`service.name`, `service.namespace`, `service.version`,
`container.name`) are merged last and override anything a detector or environment variable supplies.
`container.name`, and `deployment.environment.name` from `service_environment`) are merged last and override anything a detector or environment variable supplies.
`service_name` defaults to `"micro-service"`, so `OTEL_SERVICE_NAME` is overridden unless `service_name`
is empty: set `opentelemetry_service_name` or `service_name` instead.

Expand Down
1 change: 1 addition & 0 deletions lite_bootstrap/instruments/opentelemetry_instrument.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ def _build_resource(self) -> "resources.Resource":
resources.SERVICE_NAMESPACE: config.opentelemetry_namespace,
resources.SERVICE_VERSION: config.service_version,
resources.CONTAINER_NAME: config.opentelemetry_container_name,
"deployment.environment.name": config.service_environment,
}
return resources.Resource.create(attributes={k: v for k, v in attributes.items() if v})

Expand Down
20 changes: 19 additions & 1 deletion tests/instruments/test_opentelemetry_instrument.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,21 @@ def test_opentelemetry_configured_service_name_wins_over_env(
instrument.teardown()


@pytest.mark.parametrize(("service_environment", "expected"), [("prod", "prod"), (None, None)])
def test_opentelemetry_resource_carries_deployment_environment(
service_environment: str | None, expected: str | None
) -> None:
instrument = OpenTelemetryInstrument(
bootstrap_config=OpenTelemetryConfig(service_environment=service_environment, opentelemetry_log_traces=True)
)
try:
instrument.bootstrap()
assert instrument._tracer_provider is not None # noqa: SLF001
assert instrument._tracer_provider.resource.attributes.get("deployment.environment.name") == expected # noqa: SLF001
finally:
instrument.teardown()


def test_opentelemetry_resource_detectors_enrich_resource(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setenv("OTEL_EXPERIMENTAL_RESOURCE_DETECTORS", "process")
monkeypatch.setenv("OTEL_RESOURCE_ATTRIBUTES", "deployment.environment=from-env")
Expand Down Expand Up @@ -504,7 +519,9 @@ def test_metrics_endpoint_installs_a_meter_provider_carrying_the_resource() -> N
"""The metrics pipeline is opt-in through its own endpoint and shares the trace resource."""
instrument = OpenTelemetryInstrument(
bootstrap_config=OpenTelemetryConfig(
service_name="metrics-svc", opentelemetry_metrics_endpoint="localhost:4317"
service_name="metrics-svc",
service_environment="prod",
opentelemetry_metrics_endpoint="localhost:4317",
)
)
try:
Expand All @@ -514,6 +531,7 @@ def test_metrics_endpoint_installs_a_meter_provider_carrying_the_resource() -> N
assert isinstance(meter_provider, SDKMeterProvider)
assert meter_provider is instrument._meter_provider # noqa: SLF001
assert meter_provider._sdk_config.resource.attributes["service.name"] == "metrics-svc" # noqa: SLF001
assert meter_provider._sdk_config.resource.attributes["deployment.environment.name"] == "prod" # noqa: SLF001
(reader,) = meter_provider._metric_readers # noqa: SLF001
assert isinstance(reader, PeriodicExportingMetricReader)
assert isinstance(reader._exporter, OTLPGrpcMetricExporter) # noqa: SLF001
Expand Down
Loading