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.

Files changed (34) hide show
  1. {MindsDB-25.1.2.1.dist-info → MindsDB-25.1.3.0.dist-info}/METADATA +251 -250
  2. {MindsDB-25.1.2.1.dist-info → MindsDB-25.1.3.0.dist-info}/RECORD +33 -27
  3. mindsdb/__about__.py +1 -1
  4. mindsdb/__main__.py +5 -3
  5. mindsdb/api/executor/sql_query/result_set.py +36 -21
  6. mindsdb/api/executor/sql_query/steps/apply_predictor_step.py +1 -1
  7. mindsdb/api/executor/sql_query/steps/join_step.py +4 -4
  8. mindsdb/api/executor/utilities/sql.py +2 -10
  9. mindsdb/api/mysql/mysql_proxy/mysql_proxy.py +7 -0
  10. mindsdb/integrations/handlers/file_handler/file_handler.py +1 -1
  11. mindsdb/integrations/handlers/langchain_embedding_handler/fastapi_embeddings.py +82 -0
  12. mindsdb/integrations/handlers/langchain_embedding_handler/langchain_embedding_handler.py +8 -1
  13. mindsdb/integrations/handlers/pgvector_handler/pgvector_handler.py +48 -16
  14. mindsdb/integrations/handlers/postgres_handler/postgres_handler.py +3 -3
  15. mindsdb/integrations/utilities/rag/loaders/vector_store_loader/pgvector.py +76 -27
  16. mindsdb/integrations/utilities/rag/loaders/vector_store_loader/vector_store_loader.py +18 -1
  17. mindsdb/integrations/utilities/rag/retrievers/sql_retriever.py +6 -2
  18. mindsdb/integrations/utilities/rag/settings.py +2 -0
  19. mindsdb/integrations/utilities/sql_utils.py +1 -1
  20. mindsdb/interfaces/knowledge_base/controller.py +33 -14
  21. mindsdb/interfaces/skills/retrieval_tool.py +10 -3
  22. mindsdb/utilities/cache.py +7 -4
  23. mindsdb/utilities/context.py +9 -0
  24. mindsdb/utilities/log.py +20 -2
  25. mindsdb/utilities/otel/__init__.py +206 -0
  26. mindsdb/utilities/otel/logger.py +25 -0
  27. mindsdb/utilities/otel/meter.py +19 -0
  28. mindsdb/utilities/otel/metric_handlers/__init__.py +25 -0
  29. mindsdb/utilities/otel/tracer.py +16 -0
  30. mindsdb/utilities/utils.py +34 -0
  31. mindsdb/utilities/otel.py +0 -72
  32. {MindsDB-25.1.2.1.dist-info → MindsDB-25.1.3.0.dist-info}/LICENSE +0 -0
  33. {MindsDB-25.1.2.1.dist-info → MindsDB-25.1.3.0.dist-info}/WHEEL +0 -0
  34. {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))