diff --git a/docs/introduction/configuration.md b/docs/introduction/configuration.md index 5b6f0a2..7cca083 100644 --- a/docs/introduction/configuration.md +++ b/docs/introduction/configuration.md @@ -73,7 +73,7 @@ Additional parameters: - `opentelemetry_namespace` - `opentelemetry_insecure` - `opentelemetry_instrumentors` -- `opentelemetry_span_exporter` +- `opentelemetry_log_traces` Additional parameters for Litestar and FastAPI: diff --git a/lite_bootstrap/instruments/opentelemetry_instrument.py b/lite_bootstrap/instruments/opentelemetry_instrument.py index 080eb12..23ccbf9 100644 --- a/lite_bootstrap/instruments/opentelemetry_instrument.py +++ b/lite_bootstrap/instruments/opentelemetry_instrument.py @@ -7,14 +7,12 @@ if typing.TYPE_CHECKING: from opentelemetry.instrumentation.instrumentor import BaseInstrumentor # type: ignore[attr-defined] - from opentelemetry.sdk.trace.export import SpanExporter - if import_checker.is_opentelemetry_installed: from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter from opentelemetry.sdk import resources from opentelemetry.sdk.trace import TracerProvider - from opentelemetry.sdk.trace.export import BatchSpanProcessor + from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter, SimpleSpanProcessor from opentelemetry.trace import set_tracer_provider @@ -34,17 +32,20 @@ class OpentelemetryConfig(BaseConfig): opentelemetry_instrumentors: list[typing.Union[InstrumentorWithParams, "BaseInstrumentor"]] = dataclasses.field( default_factory=list ) - opentelemetry_span_exporter: typing.Optional["SpanExporter"] = None + opentelemetry_log_traces: bool = False @dataclasses.dataclass(kw_only=True, slots=True, frozen=True) class OpenTelemetryInstrument(BaseInstrument): bootstrap_config: OpentelemetryConfig - not_ready_message = "opentelemetry_endpoint is empty" + not_ready_message = "opentelemetry_endpoint is empty and opentelemetry_log_traces is False" missing_dependency_message = "opentelemetry is not installed" def is_ready(self) -> bool: - return bool(self.bootstrap_config.opentelemetry_endpoint) and import_checker.is_opentelemetry_installed + return ( + bool(self.bootstrap_config.opentelemetry_endpoint or self.bootstrap_config.opentelemetry_log_traces) + and import_checker.is_opentelemetry_installed + ) @staticmethod def check_dependencies() -> bool: @@ -63,15 +64,17 @@ def bootstrap(self) -> None: attributes={k: v for k, v in attributes.items() if v}, ) tracer_provider = TracerProvider(resource=resource) - tracer_provider.add_span_processor( - BatchSpanProcessor( - self.bootstrap_config.opentelemetry_span_exporter - or OTLPSpanExporter( - endpoint=self.bootstrap_config.opentelemetry_endpoint, - insecure=self.bootstrap_config.opentelemetry_insecure, + if self.bootstrap_config.opentelemetry_log_traces: + tracer_provider.add_span_processor(SimpleSpanProcessor(ConsoleSpanExporter())) + if self.bootstrap_config.opentelemetry_endpoint: + tracer_provider.add_span_processor( + BatchSpanProcessor( + OTLPSpanExporter( + endpoint=self.bootstrap_config.opentelemetry_endpoint, + insecure=self.bootstrap_config.opentelemetry_insecure, + ), ), - ), - ) + ) for one_instrumentor in self.bootstrap_config.opentelemetry_instrumentors: if isinstance(one_instrumentor, InstrumentorWithParams): one_instrumentor.instrumentor.instrument( diff --git a/tests/instruments/test_logging_instrument.py b/tests/instruments/test_logging_instrument.py index d42d688..044c597 100644 --- a/tests/instruments/test_logging_instrument.py +++ b/tests/instruments/test_logging_instrument.py @@ -2,7 +2,6 @@ from io import StringIO import structlog -from opentelemetry.sdk.trace.export import ConsoleSpanExporter from opentelemetry.trace import get_tracer from lite_bootstrap.instruments.logging_instrument import LoggingConfig, LoggingInstrument, MemoryLoggerFactory @@ -34,7 +33,7 @@ def test_logging_instrument_tracer_injection() -> None: opentelemetry_instrument = OpenTelemetryInstrument( bootstrap_config=OpentelemetryConfig( opentelemetry_endpoint="otl", - opentelemetry_span_exporter=ConsoleSpanExporter(), + opentelemetry_log_traces=True, ) ) try: diff --git a/tests/instruments/test_opentelemetry_instrument.py b/tests/instruments/test_opentelemetry_instrument.py index b17b151..6a06958 100644 --- a/tests/instruments/test_opentelemetry_instrument.py +++ b/tests/instruments/test_opentelemetry_instrument.py @@ -1,5 +1,3 @@ -from opentelemetry.sdk.trace.export import ConsoleSpanExporter - from lite_bootstrap.instruments.opentelemetry_instrument import ( InstrumentorWithParams, OpentelemetryConfig, @@ -16,7 +14,7 @@ def test_opentelemetry_instrument() -> None: InstrumentorWithParams(instrumentor=CustomInstrumentor(), additional_params={"key": "value"}), CustomInstrumentor(), ], - opentelemetry_span_exporter=ConsoleSpanExporter(), + opentelemetry_log_traces=True, ) ) try: @@ -29,7 +27,7 @@ def test_opentelemetry_instrument_empty_instruments() -> None: opentelemetry_instrument = OpenTelemetryInstrument( bootstrap_config=OpentelemetryConfig( opentelemetry_endpoint="otl", - opentelemetry_span_exporter=ConsoleSpanExporter(), + opentelemetry_log_traces=True, ) ) try: diff --git a/tests/test_config.py b/tests/test_config.py index c49871c..bffa7f8 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1,7 +1,5 @@ import dataclasses -from opentelemetry.sdk.trace.export import ConsoleSpanExporter - from lite_bootstrap import FastAPIConfig from lite_bootstrap.instruments.base import BaseConfig from tests.conftest import CustomInstrumentor @@ -17,8 +15,8 @@ def test_config_from_dict() -> None: "health_checks_path": "/custom-health/", "logging_buffer_capacity": 0, "opentelemetry_endpoint": "otl", + "opentelemetry_log_traces": True, "opentelemetry_instrumentors": [CustomInstrumentor()], - "opentelemetry_span_exporter": ConsoleSpanExporter(), "prometheus_metrics_path": "/custom-metrics/", "sentry_dsn": "https://testdsn@localhost/1", "swagger_offline_docs": True, @@ -42,7 +40,7 @@ def test_config_from_object() -> None: logging_buffer_capacity=0, opentelemetry_endpoint="otl", opentelemetry_instrumentors=[CustomInstrumentor()], - opentelemetry_span_exporter=ConsoleSpanExporter(), + opentelemetry_log_traces=True, prometheus_metrics_path="/custom-metrics/", sentry_dsn="https://testdsn@localhost/1", swagger_offline_docs=True, diff --git a/tests/test_fastapi_bootstrap.py b/tests/test_fastapi_bootstrap.py index 04720f0..9c24335 100644 --- a/tests/test_fastapi_bootstrap.py +++ b/tests/test_fastapi_bootstrap.py @@ -3,7 +3,6 @@ import fastapi import pytest import structlog -from opentelemetry.sdk.trace.export import ConsoleSpanExporter from starlette import status from starlette.testclient import TestClient @@ -26,7 +25,7 @@ def fastapi_config() -> FastAPIConfig: logging_buffer_capacity=0, opentelemetry_endpoint="otl", opentelemetry_instrumentors=[CustomInstrumentor()], - opentelemetry_span_exporter=ConsoleSpanExporter(), + opentelemetry_log_traces=True, prometheus_metrics_path="/custom-metrics/", sentry_dsn="https://testdsn@localhost/1", swagger_offline_docs=True, diff --git a/tests/test_faststream_bootstrap.py b/tests/test_faststream_bootstrap.py index 0e85005..b15747c 100644 --- a/tests/test_faststream_bootstrap.py +++ b/tests/test_faststream_bootstrap.py @@ -6,7 +6,6 @@ from faststream.redis import RedisBroker, TestRedisBroker from faststream.redis.opentelemetry import RedisTelemetryMiddleware from faststream.redis.prometheus import RedisPrometheusMiddleware -from opentelemetry.sdk.trace.export import ConsoleSpanExporter from starlette import status from starlette.testclient import TestClient @@ -30,7 +29,7 @@ def build_faststream_config(broker: BrokerUsecase[typing.Any, typing.Any] | None service_debug=False, opentelemetry_endpoint="otl", opentelemetry_instrumentors=[CustomInstrumentor()], - opentelemetry_span_exporter=ConsoleSpanExporter(), + opentelemetry_log_traces=True, opentelemetry_middleware_cls=RedisTelemetryMiddleware, prometheus_metrics_path="/custom-metrics/", prometheus_middleware_cls=RedisPrometheusMiddleware, diff --git a/tests/test_free_bootstrap.py b/tests/test_free_bootstrap.py index f627aa8..aa1bff8 100644 --- a/tests/test_free_bootstrap.py +++ b/tests/test_free_bootstrap.py @@ -1,6 +1,5 @@ import pytest import structlog -from opentelemetry.sdk.trace.export import ConsoleSpanExporter from structlog.typing import EventDict from lite_bootstrap import FreeBootstrapper, FreeBootstrapperConfig @@ -16,7 +15,7 @@ def free_bootstrapper_config() -> FreeBootstrapperConfig: service_debug=False, opentelemetry_endpoint="otl", opentelemetry_instrumentors=[CustomInstrumentor()], - opentelemetry_span_exporter=ConsoleSpanExporter(), + opentelemetry_log_traces=True, sentry_dsn="https://testdsn@localhost/1", logging_buffer_capacity=0, ) @@ -37,7 +36,7 @@ def test_free_bootstrap_logging_not_ready(log_output: list[EventDict]) -> None: service_debug=True, opentelemetry_endpoint="otl", opentelemetry_instrumentors=[CustomInstrumentor()], - opentelemetry_span_exporter=ConsoleSpanExporter(), + opentelemetry_log_traces=True, sentry_dsn="https://testdsn@localhost/1", logging_buffer_capacity=0, ), diff --git a/tests/test_litestar_bootstrap.py b/tests/test_litestar_bootstrap.py index 51db0f1..09e2e98 100644 --- a/tests/test_litestar_bootstrap.py +++ b/tests/test_litestar_bootstrap.py @@ -2,7 +2,6 @@ import structlog from litestar import status_codes from litestar.testing import TestClient -from opentelemetry.sdk.trace.export import ConsoleSpanExporter from lite_bootstrap import LitestarBootstrapper, LitestarConfig from tests.conftest import CustomInstrumentor, emulate_package_missing @@ -22,7 +21,7 @@ def litestar_config() -> LitestarConfig: health_checks_path="/custom-health/", opentelemetry_endpoint="otl", opentelemetry_instrumentors=[CustomInstrumentor()], - opentelemetry_span_exporter=ConsoleSpanExporter(), + opentelemetry_log_traces=True, prometheus_metrics_path="/custom-metrics/", sentry_dsn="https://testdsn@localhost/1", swagger_offline_docs=True,