MindsDB 25.1.2.1__py3-none-any.whl → 25.1.3.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of MindsDB might be problematic. Click here for more details.
- {MindsDB-25.1.2.1.dist-info → MindsDB-25.1.3.0.dist-info}/METADATA +251 -250
- {MindsDB-25.1.2.1.dist-info → MindsDB-25.1.3.0.dist-info}/RECORD +33 -27
- mindsdb/__about__.py +1 -1
- mindsdb/__main__.py +5 -3
- mindsdb/api/executor/sql_query/result_set.py +36 -21
- mindsdb/api/executor/sql_query/steps/apply_predictor_step.py +1 -1
- mindsdb/api/executor/sql_query/steps/join_step.py +4 -4
- mindsdb/api/executor/utilities/sql.py +2 -10
- mindsdb/api/mysql/mysql_proxy/mysql_proxy.py +7 -0
- mindsdb/integrations/handlers/file_handler/file_handler.py +1 -1
- mindsdb/integrations/handlers/langchain_embedding_handler/fastapi_embeddings.py +82 -0
- mindsdb/integrations/handlers/langchain_embedding_handler/langchain_embedding_handler.py +8 -1
- mindsdb/integrations/handlers/pgvector_handler/pgvector_handler.py +48 -16
- mindsdb/integrations/handlers/postgres_handler/postgres_handler.py +3 -3
- mindsdb/integrations/utilities/rag/loaders/vector_store_loader/pgvector.py +76 -27
- mindsdb/integrations/utilities/rag/loaders/vector_store_loader/vector_store_loader.py +18 -1
- mindsdb/integrations/utilities/rag/retrievers/sql_retriever.py +6 -2
- mindsdb/integrations/utilities/rag/settings.py +2 -0
- mindsdb/integrations/utilities/sql_utils.py +1 -1
- mindsdb/interfaces/knowledge_base/controller.py +33 -14
- mindsdb/interfaces/skills/retrieval_tool.py +10 -3
- mindsdb/utilities/cache.py +7 -4
- mindsdb/utilities/context.py +9 -0
- mindsdb/utilities/log.py +20 -2
- mindsdb/utilities/otel/__init__.py +206 -0
- mindsdb/utilities/otel/logger.py +25 -0
- mindsdb/utilities/otel/meter.py +19 -0
- mindsdb/utilities/otel/metric_handlers/__init__.py +25 -0
- mindsdb/utilities/otel/tracer.py +16 -0
- mindsdb/utilities/utils.py +34 -0
- mindsdb/utilities/otel.py +0 -72
- {MindsDB-25.1.2.1.dist-info → MindsDB-25.1.3.0.dist-info}/LICENSE +0 -0
- {MindsDB-25.1.2.1.dist-info → MindsDB-25.1.3.0.dist-info}/WHEEL +0 -0
- {MindsDB-25.1.2.1.dist-info → MindsDB-25.1.3.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from opentelemetry._logs import set_logger_provider
|
|
4
|
+
from opentelemetry.sdk._logs._internal.export import LogExporter
|
|
5
|
+
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
|
|
6
|
+
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
|
|
7
|
+
from opentelemetry.sdk.resources import Resource
|
|
8
|
+
|
|
9
|
+
from mindsdb.utilities.log import get_mindsdb_log_level
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def setup_logger(resource: Resource, exporter: LogExporter) -> None:
|
|
13
|
+
"""
|
|
14
|
+
Setup OpenTelemetry logging
|
|
15
|
+
"""
|
|
16
|
+
mindsdb_log_level = get_mindsdb_log_level()
|
|
17
|
+
|
|
18
|
+
logger_provider = LoggerProvider(resource=resource)
|
|
19
|
+
set_logger_provider(logger_provider)
|
|
20
|
+
|
|
21
|
+
logger_provider.add_log_record_processor(BatchLogRecordProcessor(exporter))
|
|
22
|
+
handler = LoggingHandler(level=mindsdb_log_level, logger_provider=logger_provider)
|
|
23
|
+
|
|
24
|
+
# Attach OTLP handler to root logger
|
|
25
|
+
logging.getLogger().addHandler(handler)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from opentelemetry import metrics
|
|
2
|
+
from opentelemetry.sdk.metrics import MeterProvider
|
|
3
|
+
from opentelemetry.sdk.resources import Resource
|
|
4
|
+
from opentelemetry.sdk.metrics.export import (
|
|
5
|
+
MetricExporter,
|
|
6
|
+
PeriodicExportingMetricReader,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def setup_meter(resource: Resource, exporter: MetricExporter) -> None:
|
|
11
|
+
"""
|
|
12
|
+
Setup OpenTelemetry metrics
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
metric_reader = PeriodicExportingMetricReader(exporter=exporter)
|
|
16
|
+
provider = MeterProvider(resource=resource, metric_readers=[metric_reader])
|
|
17
|
+
|
|
18
|
+
# Sets the global default meter provider
|
|
19
|
+
metrics.set_meter_provider(provider)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from mindsdb.utilities.otel import metrics, OTEL_SERVICE_NAME
|
|
2
|
+
|
|
3
|
+
_query_request_counter = None
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def get_query_request_counter():
|
|
7
|
+
"""
|
|
8
|
+
Get the query request counter
|
|
9
|
+
"""
|
|
10
|
+
global _query_request_counter
|
|
11
|
+
|
|
12
|
+
# Create the counter if it does not exist
|
|
13
|
+
if _query_request_counter is None:
|
|
14
|
+
meter_name = f"{OTEL_SERVICE_NAME}.query_service_meter"
|
|
15
|
+
|
|
16
|
+
# Get the meter from the main metrics object
|
|
17
|
+
meter = metrics.get_meter(meter_name)
|
|
18
|
+
|
|
19
|
+
_query_request_counter = meter.create_counter(
|
|
20
|
+
name="query_request_count",
|
|
21
|
+
description="Counts the number of times the SQL query is called",
|
|
22
|
+
unit="1",
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
return _query_request_counter
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from opentelemetry import trace
|
|
2
|
+
from opentelemetry.sdk.resources import Resource
|
|
3
|
+
from opentelemetry.sdk.trace import TracerProvider
|
|
4
|
+
from opentelemetry.sdk.trace.export import BatchSpanProcessor, SpanExporter
|
|
5
|
+
from opentelemetry.sdk.trace.sampling import Sampler
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def setup_tracer(resource: Resource, sampler: Sampler, exporter: SpanExporter) -> None:
|
|
9
|
+
"""
|
|
10
|
+
Setup OpenTelemetry tracing
|
|
11
|
+
"""
|
|
12
|
+
# Set the tracer provider with the custom resource
|
|
13
|
+
trace.set_tracer_provider(TracerProvider(resource=resource, sampler=sampler))
|
|
14
|
+
|
|
15
|
+
# Replace the default span processor with the custom one
|
|
16
|
+
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(exporter))
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import csv
|
|
2
|
+
import re
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def parse_csv_attributes(csv_attributes: typing.Optional[str] = "") -> typing.Dict[str, str]:
|
|
7
|
+
"""
|
|
8
|
+
Parse the raw_attributes variable, which uses the CSV format:
|
|
9
|
+
key=value,another=something_else
|
|
10
|
+
|
|
11
|
+
Returns:
|
|
12
|
+
dict: Parsed key-value pairs as a dictionary.
|
|
13
|
+
"""
|
|
14
|
+
attributes = {}
|
|
15
|
+
|
|
16
|
+
if not csv_attributes:
|
|
17
|
+
return attributes # Return empty dictionary if the variable is not set
|
|
18
|
+
|
|
19
|
+
try:
|
|
20
|
+
# Use CSV reader to handle parsing the input
|
|
21
|
+
reader = csv.reader([csv_attributes])
|
|
22
|
+
for row in reader:
|
|
23
|
+
for pair in row:
|
|
24
|
+
# Match key=value pattern
|
|
25
|
+
match = re.match(r'^\s*([^=]+?)\s*=\s*(.+?)\s*$', pair)
|
|
26
|
+
if match:
|
|
27
|
+
key, value = match.groups()
|
|
28
|
+
attributes[key.strip()] = value.strip()
|
|
29
|
+
else:
|
|
30
|
+
raise ValueError(f"Invalid attribute format: {pair}")
|
|
31
|
+
except Exception as e:
|
|
32
|
+
raise ValueError(f"Failed to parse csv_attributes='{csv_attributes}': {e}")
|
|
33
|
+
|
|
34
|
+
return attributes
|
mindsdb/utilities/otel.py
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
|
|
3
|
-
from opentelemetry import trace
|
|
4
|
-
from opentelemetry.sdk.resources import Resource
|
|
5
|
-
from opentelemetry.sdk.trace import TracerProvider, Span
|
|
6
|
-
from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter
|
|
7
|
-
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
|
|
8
|
-
|
|
9
|
-
from mindsdb.utilities import log
|
|
10
|
-
logger = log.getLogger(__name__)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
# Check OpenTelemetry exporter type
|
|
14
|
-
OTEL_EXPORTER_TYPE = os.getenv("OTEL_EXPORTER_TYPE", "console") # console or otlp
|
|
15
|
-
|
|
16
|
-
# Define OTLP endpoint. If not set, the default OTLP endpoint will be used
|
|
17
|
-
OTEL_OTLP_ENDPOINT = os.getenv("OTEL_OTLP_ENDPOINT", "http://localhost:4317")
|
|
18
|
-
|
|
19
|
-
# Define service name
|
|
20
|
-
OTEL_SERVICE_NAME = os.getenv("OTEL_SERVICE_NAME", "mindsdb")
|
|
21
|
-
|
|
22
|
-
# The name of the environment we"re on, by default local for development, this is set differently per-env in our Helm chart values files
|
|
23
|
-
OTEL_SERVICE_ENVIRONMENT = os.getenv("OTEL_SERVICE_ENVIRONMENT", "local").lower()
|
|
24
|
-
|
|
25
|
-
# Define service release
|
|
26
|
-
OTEL_SERVICE_RELEASE = os.getenv("OTEL_SERVICE_RELEASE", "local").lower()
|
|
27
|
-
|
|
28
|
-
# By default we have Open Telemetry SDK enabled on all envs, except for local which is disabled by default
|
|
29
|
-
# If you want to enable Open Telemetry on local for some reason please set OTEL_SDK_FORCE_RUN to true
|
|
30
|
-
OTEL_SDK_DISABLED = os.getenv("OTEL_SDK_DISABLED", "false").lower() == "true" or os.getenv("OTEL_SERVICE_ENVIRONMENT", "local").lower() == "local"
|
|
31
|
-
OTEL_SDK_FORCE_RUN = os.getenv("OTEL_SDK_FORCE_RUN", "false").lower() == "true"
|
|
32
|
-
|
|
33
|
-
# Custom span processor to add global tags to spans
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
class GlobalTaggingSpanProcessor(BatchSpanProcessor):
|
|
37
|
-
def on_start(self, span: Span, parent_context):
|
|
38
|
-
# Add environment and release to every span
|
|
39
|
-
span.set_attribute("environment", OTEL_SERVICE_ENVIRONMENT)
|
|
40
|
-
span.set_attribute("release", OTEL_SERVICE_RELEASE)
|
|
41
|
-
super().on_start(span, parent_context)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if not OTEL_SDK_DISABLED or OTEL_SDK_FORCE_RUN:
|
|
45
|
-
logger.info("OpenTelemetry enabled")
|
|
46
|
-
logger.info(f"OpenTelemetry exporter type: {OTEL_EXPORTER_TYPE}")
|
|
47
|
-
logger.info(f"OpenTelemetry service name: {OTEL_SERVICE_NAME}")
|
|
48
|
-
logger.info(f"OpenTelemetry service environment: {OTEL_SERVICE_ENVIRONMENT}")
|
|
49
|
-
logger.info(f"OpenTelemetry service release: {OTEL_SERVICE_RELEASE}")
|
|
50
|
-
|
|
51
|
-
# Define OpenTelemetry resources (e.g., service name)
|
|
52
|
-
resource = Resource(attributes={"service.name": OTEL_SERVICE_NAME})
|
|
53
|
-
|
|
54
|
-
# Set the tracer provider with the custom resource
|
|
55
|
-
trace.set_tracer_provider(TracerProvider(resource=resource))
|
|
56
|
-
|
|
57
|
-
# Configure the appropriate exporter based on the environment variable
|
|
58
|
-
if OTEL_EXPORTER_TYPE == "otlp":
|
|
59
|
-
logger.info("OpenTelemetry is using OTLP exporter")
|
|
60
|
-
|
|
61
|
-
exporter = OTLPSpanExporter(
|
|
62
|
-
endpoint=OTEL_OTLP_ENDPOINT, # Default OTLP endpoint
|
|
63
|
-
insecure=True # Disable TLS for local testing
|
|
64
|
-
)
|
|
65
|
-
|
|
66
|
-
else:
|
|
67
|
-
logger.info("OpenTelemetry is using Console exporter")
|
|
68
|
-
|
|
69
|
-
exporter = ConsoleSpanExporter()
|
|
70
|
-
|
|
71
|
-
# Replace the default span processor with the custom one
|
|
72
|
-
trace.get_tracer_provider().add_span_processor(GlobalTaggingSpanProcessor(exporter))
|
|
File without changes
|
|
File without changes
|
|
File without changes
|