Skip to content
Closed
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 @@ -73,7 +73,7 @@ Additional parameters:
- `opentelemetry_namespace`
- `opentelemetry_insecure`
- `opentelemetry_instrumentors`
- `opentelemetry_span_exporter`
- `opentelemetry_log_traces`

Additional parameters for Litestar and FastAPI:

Expand Down
31 changes: 17 additions & 14 deletions lite_bootstrap/instruments/opentelemetry_instrument.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand All @@ -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:
Expand All @@ -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(
Expand Down
3 changes: 1 addition & 2 deletions tests/instruments/test_logging_instrument.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand Down
6 changes: 2 additions & 4 deletions tests/instruments/test_opentelemetry_instrument.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from opentelemetry.sdk.trace.export import ConsoleSpanExporter

from lite_bootstrap.instruments.opentelemetry_instrument import (
InstrumentorWithParams,
OpentelemetryConfig,
Expand All @@ -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:
Expand All @@ -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:
Expand Down
6 changes: 2 additions & 4 deletions tests/test_config.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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,
Expand All @@ -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,
Expand Down
3 changes: 1 addition & 2 deletions tests/test_fastapi_bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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,
Expand Down
3 changes: 1 addition & 2 deletions tests/test_faststream_bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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,
Expand Down
5 changes: 2 additions & 3 deletions tests/test_free_bootstrap.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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,
)
Expand All @@ -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,
),
Expand Down
3 changes: 1 addition & 2 deletions tests/test_litestar_bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
Expand Down
Loading