Coverage for mindsdb / utilities / otel / prepare.py: 0%
85 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-21 00:36 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-21 00:36 +0000
1import os
2import typing
4from opentelemetry import trace # noqa: F401
5from opentelemetry import metrics # noqa: F401
6from opentelemetry.exporter.otlp.proto.grpc._log_exporter import OTLPLogExporter as OTLPLogExporterGRPC
7from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter as OTLPLogExporterHTTP
8from opentelemetry.sdk._logs._internal.export import LogExporter
9from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter as OTLPMetricExporterGRPC
10from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter as OTLPMetricExporterHTTP
11from opentelemetry.sdk.metrics.export import MetricExporter, ConsoleMetricExporter
12from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter as OTLPSpanExporterGRPC
13from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter as OTLPSpanExporterHTTP
14from opentelemetry.sdk.trace.export import SpanExporter, ConsoleSpanExporter
15from opentelemetry.sdk.resources import Resource
16from opentelemetry.sdk.trace.sampling import TraceIdRatioBased
18from mindsdb.utilities.otel.logger import setup_logger
19from mindsdb.utilities.otel.meter import setup_meter
20from mindsdb.utilities.otel.tracer import setup_tracer
21from mindsdb.utilities.utils import parse_csv_attributes
22from mindsdb.utilities import log
24logger = log.getLogger(__name__)
26# Check OpenTelemetry exporter type
27OTEL_EXPORTER_TYPE = os.getenv("OTEL_EXPORTER_TYPE", "console") # console or otlp
29# Define OpenTelemetry exporter protocol
30OTEL_EXPORTER_PROTOCOL = os.getenv("OTEL_EXPORTER_PROTOCOL", "grpc") # grpc or http
32# Define OTLP endpoint. If not set, the default OTLP endpoint will be used
33OTEL_OTLP_ENDPOINT = os.getenv("OTEL_OTLP_ENDPOINT", "http://localhost:4317")
35# Define OTLP logging endpoint. If not set, the default OTLP logging endpoint will be used
36OTEL_OTLP_LOGGING_ENDPOINT = os.getenv("OTEL_OTLP_LOGGING_ENDPOINT", OTEL_OTLP_ENDPOINT)
38# Define OTLP tracing endpoint. If not set, the default OTLP tracing endpoint will be used
39OTEL_OTLP_TRACING_ENDPOINT = os.getenv("OTEL_OTLP_TRACING_ENDPOINT", OTEL_OTLP_ENDPOINT)
41# Define OTLP metrics endpoint. If not set, the default OTLP metrics endpoint will be used
42OTEL_OTLP_METRICS_ENDPOINT = os.getenv("OTEL_OTLP_METRICS_ENDPOINT", OTEL_OTLP_ENDPOINT)
44# Define service name
45OTEL_SERVICE_NAME = os.getenv("OTEL_SERVICE_NAME", "mindsdb")
47# Define service instace ID
48OTEL_SERVICE_INSTANCE_ID = os.getenv("OTEL_SERVICE_INSTANCE_ID", "mindsdb-instance")
50# The name of the environment we"re on, by default local for development, this is set differently per-env in our Helm
51# chart values files
52OTEL_SERVICE_ENVIRONMENT = os.getenv("OTEL_SERVICE_ENVIRONMENT", "local").lower()
54# Define service release
55OTEL_SERVICE_RELEASE = os.getenv("OTEL_SERVICE_RELEASE", "local").lower()
57# Define how often to capture traces
58OTEL_TRACE_SAMPLE_RATE = float(os.getenv("OTEL_TRACE_SAMPLE_RATE", "1.0"))
60# Define extra attributes
61OTEL_EXTRA_ATTRIBUTES = os.getenv("OTEL_EXTRA_ATTRIBUTES", "")
63# Define if OpenTelemetry logging is disabled. By default, it is disabled.
64OTEL_LOGGING_DISABLED = os.getenv("OTEL_LOGGING_DISABLED", "true").lower() == "true"
66# Define if OpenTelemetry tracing is disabled. By default, it is enabled.
67OTEL_TRACING_DISABLED = os.getenv("OTEL_TRACING_DISABLED", "false").lower() == "true"
69# Define if OpenTelemetry metrics is disabled. By default, it is disabled.
70OTEL_METRICS_DISABLED = os.getenv("OTEL_METRICS_DISABLED", "true").lower() == "true"
73def get_otel_attributes() -> dict:
74 """
75 Get OpenTelemetry attributes
77 Returns:
78 dict: OpenTelemetry attributes
79 """
81 base_attributes = {
82 "service.name": OTEL_SERVICE_NAME,
83 "service.instance.id": OTEL_SERVICE_INSTANCE_ID,
84 "environment": OTEL_SERVICE_ENVIRONMENT,
85 "release": OTEL_SERVICE_RELEASE,
86 }
88 extra_attributes = {}
89 try:
90 extra_attributes = parse_csv_attributes(OTEL_EXTRA_ATTRIBUTES)
91 except Exception as e:
92 logger.error(f"Failed to parse OTEL_EXTRA_ATTRIBUTES: {e}")
94 attributes = {**extra_attributes, **base_attributes} # Base attributes take precedence over extra attributes
96 return attributes
99def get_logging_exporter() -> typing.Optional[LogExporter]:
100 """
101 Get OpenTelemetry logging exporter.
103 Returns:
104 OTLPLogExporter: OpenTelemetry logging exporter
105 """
107 if OTEL_EXPORTER_TYPE == "otlp":
109 if OTEL_EXPORTER_PROTOCOL == "grpc":
110 return OTLPLogExporterGRPC(
111 endpoint=OTEL_OTLP_LOGGING_ENDPOINT,
112 insecure=True
113 )
115 elif OTEL_EXPORTER_PROTOCOL == "http":
116 return OTLPLogExporterHTTP(
117 endpoint=OTEL_OTLP_LOGGING_ENDPOINT
118 )
120 return None
123def get_span_exporter() -> SpanExporter:
124 """
125 Get OpenTelemetry span exporter
127 Returns:
128 OTLPSpanExporter: OpenTelemetry span exporter
129 """
131 if OTEL_EXPORTER_TYPE == "otlp":
133 if OTEL_EXPORTER_PROTOCOL == "grpc":
134 return OTLPSpanExporterGRPC(
135 endpoint=OTEL_OTLP_TRACING_ENDPOINT,
136 insecure=True
137 )
139 elif OTEL_EXPORTER_PROTOCOL == "http":
140 return OTLPSpanExporterHTTP(
141 endpoint=OTEL_OTLP_TRACING_ENDPOINT
142 )
144 return ConsoleSpanExporter()
147def get_metrics_exporter() -> typing.Optional[MetricExporter]:
148 """
149 Get OpenTelemetry metrics exporter
151 Returns:
152 OTLPLogExporter: OpenTelemetry metrics exporter
153 """
155 if OTEL_EXPORTER_TYPE == "otlp":
157 if OTEL_EXPORTER_PROTOCOL == "grpc":
158 return OTLPMetricExporterGRPC(
159 endpoint=OTEL_OTLP_METRICS_ENDPOINT,
160 insecure=True
161 )
163 elif OTEL_EXPORTER_PROTOCOL == "http":
164 return OTLPMetricExporterHTTP(
165 endpoint=OTEL_OTLP_METRICS_ENDPOINT
166 )
168 return ConsoleMetricExporter()
171logger.info("OpenTelemetry enabled")
172logger.info(f"OpenTelemetry exporter type: {OTEL_EXPORTER_TYPE}")
173logger.info(f"OpenTelemetry service name: {OTEL_SERVICE_NAME}")
174logger.info(f"OpenTelemetry service environment: {OTEL_SERVICE_ENVIRONMENT}")
175logger.info(f"OpenTelemetry service release: {OTEL_SERVICE_RELEASE}")
176logger.info(f"OpenTelemetry trace sample rate: {OTEL_TRACE_SAMPLE_RATE}")
177logger.info(f"OpenTelemetry extra attributes: {OTEL_EXTRA_ATTRIBUTES}")
179# Define OpenTelemetry resources (e.g., service name)
180attributes = get_otel_attributes()
182# Define OpenTelemetry sampler
183sampler = TraceIdRatioBased(OTEL_TRACE_SAMPLE_RATE)
185# Define OpenTelemetry resources (e.g., service name)
186resource = Resource(attributes=attributes)
188if not OTEL_LOGGING_DISABLED:
189 logger.info("OpenTelemetry Logging is enabled")
190 setup_logger(resource, get_logging_exporter())
192if not OTEL_TRACING_DISABLED:
193 logger.info("OpenTelemetry Tracing is enabled")
194 setup_tracer(resource, sampler, get_span_exporter())
196if not OTEL_METRICS_DISABLED:
197 logger.info("OpenTelemetry Metrics is enabled")
198 setup_meter(resource, get_metrics_exporter())