diff --git a/examples/experimental/otel_exporter.ipynb b/examples/experimental/otel_exporter.ipynb index 77f6c54a8..116f61fdc 100644 --- a/examples/experimental/otel_exporter.ipynb +++ b/examples/experimental/otel_exporter.ipynb @@ -1,15 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# !pip install opentelemetry-api\n", - "# !pip install opentelemetry-sdk" - ] - }, { "cell_type": "code", "execution_count": null, @@ -41,6 +31,7 @@ "formatter = logging.Formatter(\n", " \"%(asctime)s - %(name)s - %(levelname)s - %(message)s\"\n", ")\n", + "handler.addFilter(logging.Filter(\"trulens\"))\n", "handler.setFormatter(formatter)\n", "root.addHandler(handler)" ] @@ -67,7 +58,7 @@ " @instrument(\n", " attributes=lambda ret, exception, *args, **kwargs: {\n", " \"nested2_ret\": ret,\n", - " \"nested2_args[0]\": args[0],\n", + " \"nested2_args[1]\": args[1],\n", " }\n", " )\n", " def nested2(self, query: str) -> str:\n", @@ -100,17 +91,15 @@ "metadata": {}, "outputs": [], "source": [ + "import os\n", + "\n", "import dotenv\n", + "from trulens.core.experimental import Feature\n", "from trulens.core.session import TruSession\n", - "from trulens.experimental.otel_tracing.core.init import init\n", "\n", "dotenv.load_dotenv()\n", - "\n", - "session = TruSession()\n", - "session.experimental_enable_feature(\"otel_tracing\")\n", - "session.reset_database()\n", - "\n", - "init(session, debug=True)" + "os.environ[\"TRULENS_OTEL_TRACING\"] = \"1\"\n", + "session = TruSession(experimental_feature_flags={Feature.OTEL_TRACING: True})" ] }, { @@ -122,14 +111,28 @@ "from trulens.apps.custom import TruCustomApp\n", "\n", "test_app = TestApp()\n", - "custom_app = TruCustomApp(test_app)\n", + "custom_app = TruCustomApp(\n", + " test_app,\n", + " app_name=\"database.schema.app\",\n", + " app_version=\"1.0.0\",\n", + " session=session,\n", + ")\n", "\n", - "with custom_app as recording:\n", + "with custom_app(run_name=\"test run\", input_id=\"456\") as recording:\n", " test_app.respond_to_query(\"test\")\n", "\n", - "with custom_app as recording:\n", + "with custom_app() as recording:\n", " test_app.respond_to_query(\"throw\")" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "session.experimental_force_flush()" + ] } ], "metadata": { diff --git a/src/core/trulens/core/app.py b/src/core/trulens/core/app.py index 0e1409843..a655d3c53 100644 --- a/src/core/trulens/core/app.py +++ b/src/core/trulens/core/app.py @@ -3,7 +3,6 @@ from abc import ABC from abc import ABCMeta from abc import abstractmethod -import contextlib import contextvars import datetime import inspect @@ -423,18 +422,6 @@ def tru(self) -> core_connector.DBConnector: pydantic.PrivateAttr(default_factory=dict) ) - tokens: List[object] = [] - """ - OTEL context tokens for the current context manager. These tokens are how the OTEL - context api keeps track of what is changed in the context, and used to undo the changes. - """ - - span_context: Optional[contextlib.AbstractContextManager] = None - """ - Span context manager. Required to help keep track of the appropriate span context - to enter/exit. - """ - def __init__( self, connector: Optional[core_connector.DBConnector] = None, @@ -889,20 +876,18 @@ def model_dump(self, *args, redact_keys: bool = False, **kwargs): **kwargs, ) - # For use as a context manager. - def __enter__(self): - if not core_instruments.Instrument._have_context(): - raise RuntimeError(core_endpoint._NO_CONTEXT_WARNING) - + def _prevent_invalid_otel_syntax(self): if self.session.experimental_feature( core_experimental.Feature.OTEL_TRACING ): - from trulens.experimental.otel_tracing.core.instrument import ( - App as OTELApp, - ) + raise RuntimeError("Invalid TruLens OTEL Tracing syntax.") - return OTELApp.__enter__(self) + # For use as a context manager. + def __enter__(self): + if not core_instruments.Instrument._have_context(): + raise RuntimeError(core_endpoint._NO_CONTEXT_WARNING) + self._prevent_invalid_otel_syntax() ctx = core_instruments._RecordingContext(app=self) token = self.recording_contexts.set(ctx) @@ -912,20 +897,11 @@ def __enter__(self): # For use as a context manager. def __exit__(self, exc_type, exc_value, exc_tb): - if self.session.experimental_feature( - core_experimental.Feature.OTEL_TRACING - ): - from trulens.experimental.otel_tracing.core.instrument import ( - App as OTELApp, - ) - - return OTELApp.__exit__(self, exc_type, exc_value, exc_tb) + self._prevent_invalid_otel_syntax() ctx = self.recording_contexts.get() self.recording_contexts.reset(ctx.token) - # self._reset_context_vars() - if exc_type is not None: raise exc_value @@ -933,14 +909,7 @@ def __exit__(self, exc_type, exc_value, exc_tb): # For use as a context manager. async def __aenter__(self): - if self.session.experimental_feature( - core_experimental.Feature.OTEL_TRACING - ): - from trulens.experimental.otel_tracing.core.instrument import ( - App as OTELApp, - ) - - return OTELApp.__enter__(self) + self._prevent_invalid_otel_syntax() ctx = core_instruments._RecordingContext(app=self) @@ -953,14 +922,7 @@ async def __aenter__(self): # For use as a context manager. async def __aexit__(self, exc_type, exc_value, exc_tb): - if self.session.experimental_feature( - core_experimental.Feature.OTEL_TRACING - ): - from trulens.experimental.otel_tracing.core.instrument import ( - App as OTELApp, - ) - - return OTELApp.__exit__(self, exc_type, exc_value, exc_tb) + self._prevent_invalid_otel_syntax() ctx = self.recording_contexts.get() self.recording_contexts.reset(ctx.token) @@ -972,6 +934,20 @@ async def __aexit__(self, exc_type, exc_value, exc_tb): return + def __call__(self, *, run_name: str = "", input_id: str = ""): + if not self.session.experimental_feature( + core_experimental.Feature.OTEL_TRACING + ): + raise RuntimeError("OTEL Tracing is not enabled for this session.") + + from trulens.experimental.otel_tracing.core.instrument import ( + OTELRecordingContext as OTELApp, + ) + + # Pylance shows an error here, but it is likely a false positive. due to the overriden + # model dump returning json instead of a dict. + return OTELApp(app=self, run_name=run_name, input_id=input_id) + def _set_context_vars(self): # HACK: For debugging purposes, try setting/resetting all context vars # used in trulens around the app context managers due to bugs in trying diff --git a/src/core/trulens/core/session.py b/src/core/trulens/core/session.py index e7b9fcfbf..3d4562661 100644 --- a/src/core/trulens/core/session.py +++ b/src/core/trulens/core/session.py @@ -45,6 +45,8 @@ from trulens.experimental.otel_tracing import _feature as otel_tracing_feature if TYPE_CHECKING: + from opentelemetry.sdk.trace import TracerProvider + from opentelemetry.sdk.trace.export import SpanExporter from trulens.core import app as base_app tqdm = None @@ -157,16 +159,18 @@ class TruSession( """Database Connector to use. If not provided, a default is created and used.""" - _experimental_otel_exporter: Optional[ - Any - ] = ( # Any = otel_export_sdk.SpanExporter + _experimental_otel_exporter: Optional[SpanExporter] = pydantic.PrivateAttr( + None + ) + + _experimental_tracer_provider: Optional[TracerProvider] = ( pydantic.PrivateAttr(None) ) @property def experimental_otel_exporter( self, - ) -> Any: # Any = Optional[otel_export_sdk.SpanExporter] + ) -> Optional[SpanExporter]: """EXPERIMENTAL(otel_tracing): OpenTelemetry SpanExporter to send spans to. @@ -176,15 +180,27 @@ def experimental_otel_exporter( return self._experimental_otel_exporter - @experimental_otel_exporter.setter - def experimental_otel_exporter( - self, value: Optional[Any] - ): # Any = otel_export_sdk.SpanExporter - otel_tracing_feature._FeatureSetup.assert_optionals_installed() + def experimental_force_flush(self, timeout_millis: int = 300000) -> bool: + """ + Force flush the OpenTelemetry exporters. + + Args: + timeout_millis: The maximum amount of time to wait for spans to be + processed. + + Returns: + False if the timeout is exceeded, feature is not enabled, or the provider doesn't exist, True otherwise. + """ - from trulens.experimental.otel_tracing.core.session import _TruSession + if ( + not self.experimental_feature( + core_experimental.Feature.OTEL_TRACING + ) + or self._experimental_tracer_provider is None + ): + return False - _TruSession._setup_otel_exporter(self, value) + return self._experimental_tracer_provider.force_flush(timeout_millis) def __str__(self) -> str: return f"TruSession({self.connector})" @@ -205,9 +221,7 @@ def __init__( Iterable[core_experimental.Feature], ] ] = None, - _experimental_otel_exporter: Optional[ - Any - ] = None, # Any = otel_export_sdk.SpanExporter + _experimental_otel_exporter: Optional[SpanExporter] = None, **kwargs, ): if python_utils.safe_hasattr(self, "connector"): @@ -236,9 +250,12 @@ def __init__( f"Cannot provide both `connector` and connector argument(s) {extra_keys}." ) + connector = connector or core_connector.DefaultDBConnector( + **connector_args + ) + super().__init__( - connector=connector - or core_connector.DefaultDBConnector(**connector_args), + connector=connector, **self_args, ) @@ -246,14 +263,18 @@ def __init__( if experimental_feature_flags is not None: self.experimental_set_features(experimental_feature_flags) - if _experimental_otel_exporter is not None: - otel_tracing_feature.assert_optionals_installed() + if _experimental_otel_exporter is not None or self.experimental_feature( + core_experimental.Feature.OTEL_TRACING + ): + otel_tracing_feature._FeatureSetup.assert_optionals_installed() from trulens.experimental.otel_tracing.core.session import ( _TruSession, ) - _TruSession._setup_otel_exporter(self, _experimental_otel_exporter) + _TruSession._setup_otel_exporter( + self, connector, _experimental_otel_exporter + ) def App(self, *args, app: Optional[Any] = None, **kwargs) -> base_app.App: """Create an App from the given App constructor arguments by guessing diff --git a/src/core/trulens/experimental/otel_tracing/core/app.py b/src/core/trulens/experimental/otel_tracing/core/app.py deleted file mode 100644 index ca378808f..000000000 --- a/src/core/trulens/experimental/otel_tracing/core/app.py +++ /dev/null @@ -1,178 +0,0 @@ -from __future__ import annotations - -import contextvars -import time -from typing import ( - Iterable, -) - -from trulens.core import app as core_app -from trulens.core import instruments as core_instruments -from trulens.core.schema import feedback as feedback_schema -from trulens.core.schema import record as record_schema -from trulens.core.utils import python as python_utils -from trulens.core.utils import text as text_utils -from trulens.experimental.otel_tracing.core import trace as core_otel -from trulens.experimental.otel_tracing.core import trace as core_trace - - -class _App(core_app.App): - # TODO(otel_tracing): Roll into core_app.App once no longer experimental. - - # WithInstrumentCallbacks requirement - def get_active_contexts( - self, - ) -> Iterable[core_instruments._RecordingContext]: - """Get all active recording contexts.""" - - recording = self.recording_contexts.get(contextvars.Token.MISSING) - - while recording is not contextvars.Token.MISSING: - yield recording - recording = recording.token.old_value - - # WithInstrumentCallbacks requirement - def _on_new_recording_span( - self, - recording_span: core_trace.Span, - ): - if self.session._experimental_otel_exporter is not None: - # Export to otel exporter if exporter was set in workspace. - to_export = [] - for span in recording_span.iter_family(include_phantom=True): - if isinstance(span, core_otel.Span): - e_span = span.otel_freeze() - to_export.append(e_span) - else: - print(f"Warning, span {span.name} is not exportable.") - - print( - f"{text_utils.UNICODE_CHECK} Exporting {len(to_export)} spans to {python_utils.class_name(self.session._experimental_otel_exporter)}." - ) - self.session._experimental_otel_exporter.export(to_export) - - # WithInstrumentCallbacks requirement - def _on_new_root_span( - self, - recording: core_instruments._RecordingContext, - root_span: core_trace.Span, - ) -> record_schema.Record: - tracer = root_span.context.tracer - - record = tracer.record_of_root_span( - root_span=root_span, recording=recording - ) - recording.records.append(record) - # need to jsonify? - - error = root_span.error - - if error is not None: - # May block on DB. - self._handle_error(record=record, error=error) - raise error - - # Will block on DB, but not on feedback evaluation, depending on - # FeedbackMode: - record.feedback_and_future_results = self._handle_record(record=record) - if record.feedback_and_future_results is not None: - record.feedback_results = [ - tup[1] for tup in record.feedback_and_future_results - ] - - if record.feedback_and_future_results is None: - return record - - if self.feedback_mode == feedback_schema.FeedbackMode.WITH_APP_THREAD: - # Add the record to ones with pending feedback. - - self.records_with_pending_feedback_results.add(record) - - elif self.feedback_mode == feedback_schema.FeedbackMode.WITH_APP: - # If in blocking mode ("WITH_APP"), wait for feedbacks to finished - # evaluating before returning the record. - - record.wait_for_feedback_results() - - return record - - # For use as a context manager. - def __enter__(self): - # EXPERIMENTAL(otel_tracing): replacement to recording context manager. - - tracer: core_trace.Tracer = core_trace.trulens_tracer() - - recording_span_ctx = tracer.recording() - recording_span: core_trace.PhantomSpanRecordingContext = ( - recording_span_ctx.__enter__() - ) - recording = core_trace._RecordingContext( - app=self, - tracer=tracer, - span=recording_span, - span_ctx=recording_span_ctx, - ) - recording_span.recording = recording - recording_span._start_timestamp = time.time_ns() # move to trace - - # recording.ctx = ctx - - token = self.recording_contexts.set(recording) - recording.token = token - - return recording - - # For use as a context manager. - def __exit__(self, exc_type, exc_value, exc_tb): - # EXPERIMENTAL(otel_tracing): replacement to recording context manager. - - recording: core_trace._RecordingContext = self.recording_contexts.get() - - assert recording is not None, "Not in a tracing context." - assert recording.tracer is not None, "Not in a tracing context." - assert recording.span is not None, "Not in a tracing context." - - recording.span._end_timestamp = time.time_ns() # move to trace - - self.recording_contexts.reset(recording.token) - return recording.span_ctx.__exit__(exc_type, exc_value, exc_tb) - - # For use as an async context manager. - async def __aenter__(self): - # EXPERIMENTAL(otel_tracing) - - tracer: core_trace.Tracer = core_trace.trulens_tracer() - - recording_span_ctx = await tracer.arecording() - recording_span: core_trace.PhantomSpanRecordingContext = ( - await recording_span_ctx.__aenter__() - ) - recording = core_trace._RecordingContext( - app=self, - tracer=tracer, - span=recording_span, - span_ctx=recording_span_ctx, - ) - recording_span.recording = recording - recording_span.start_timestamp = time.time_ns() - - # recording.ctx = ctx - - token = self.recording_contexts.set(recording) - recording.token = token - - return recording - - # For use as a context manager. - async def __aexit__(self, exc_type, exc_value, exc_tb): - # EXPERIMENTAL(otel_tracing) - - recording: core_trace._RecordingContext = self.recording_contexts.get() - - assert recording is not None, "Not in a tracing context." - assert recording.tracer is not None, "Not in a tracing context." - - recording.span.end_timestamp = time.time_ns() - - self.recording_contexts.reset(recording.token) - return await recording.span_ctx.__aexit__(exc_type, exc_value, exc_tb) diff --git a/src/core/trulens/experimental/otel_tracing/core/exporter/connector.py b/src/core/trulens/experimental/otel_tracing/core/exporter/connector.py new file mode 100644 index 000000000..6ff82fcad --- /dev/null +++ b/src/core/trulens/experimental/otel_tracing/core/exporter/connector.py @@ -0,0 +1,44 @@ +import logging +from typing import Sequence + +from opentelemetry.sdk.trace import ReadableSpan +from opentelemetry.sdk.trace.export import SpanExporter +from opentelemetry.sdk.trace.export import SpanExportResult +from trulens.core.database import connector as core_connector +from trulens.experimental.otel_tracing.core.exporter.utils import ( + check_if_trulens_span, +) +from trulens.experimental.otel_tracing.core.exporter.utils import ( + construct_event, +) + +logger = logging.getLogger(__name__) + + +class TruLensOTELSpanExporter(SpanExporter): + """ + Implementation of `SpanExporter` that flushes the spans in the TruLens session to the connector. + """ + + connector: core_connector.DBConnector + """ + The database connector used to export the spans. + """ + + def __init__(self, connector: core_connector.DBConnector): + self.connector = connector + + def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult: + trulens_spans = list(filter(check_if_trulens_span, spans)) + + try: + events = list(map(construct_event, trulens_spans)) + self.connector.add_events(events) + + except Exception as e: + logger.error( + f"Error exporting spans to the database: {e}", + ) + return SpanExportResult.FAILURE + + return SpanExportResult.SUCCESS diff --git a/src/core/trulens/experimental/otel_tracing/core/exporter/snowflake.py b/src/core/trulens/experimental/otel_tracing/core/exporter/snowflake.py new file mode 100644 index 000000000..567717ce7 --- /dev/null +++ b/src/core/trulens/experimental/otel_tracing/core/exporter/snowflake.py @@ -0,0 +1,107 @@ +import logging +import os +import tempfile +from typing import Sequence + +from opentelemetry.sdk.trace import ReadableSpan +from opentelemetry.sdk.trace.export import SpanExporter +from opentelemetry.sdk.trace.export import SpanExportResult +from trulens.connectors.snowflake import SnowflakeConnector +from trulens.core.database import connector as core_connector +from trulens.experimental.otel_tracing.core.exporter.utils import ( + check_if_trulens_span, +) +from trulens.experimental.otel_tracing.core.exporter.utils import ( + convert_readable_span_to_proto, +) + +logger = logging.getLogger(__name__) + + +class TruLensSnowflakeSpanExporter(SpanExporter): + """ + Implementation of `SpanExporter` that flushes the spans in the TruLens session to a Snowflake Stage. + """ + + connector: core_connector.DBConnector + """ + The database connector used to export the spans. + """ + + def __init__(self, connector: core_connector.DBConnector): + self.connector = connector + + def _export_to_snowflake_stage( + self, spans: Sequence[ReadableSpan] + ) -> SpanExportResult: + """ + Exports a list of spans to a Snowflake stage as a protobuf file. + This function performs the following steps: + 1. Writes the provided spans to a temporary protobuf file. + 2. Creates a Snowflake stage if it does not already exist. + 3. Uploads the temporary protobuf file to the Snowflake stage. + 4. Removes the temporary protobuf file. + Args: + spans (Sequence[ReadableSpan]): A sequence of spans to be exported. + Returns: + SpanExportResult: The result of the export operation, either SUCCESS or FAILURE. + """ + if not isinstance(self.connector, SnowflakeConnector): + return SpanExportResult.FAILURE + + # Avoid uploading empty files to the stage + if not spans: + return SpanExportResult.SUCCESS + + snowpark_session = self.connector.snowpark_session + tmp_file_path = "" + + try: + with tempfile.NamedTemporaryFile( + delete=False, suffix=".pb", mode="wb" + ) as tmp_file: + tmp_file_path = tmp_file.name + logger.debug( + f"Writing spans to the protobuf file: {tmp_file_path}" + ) + + for span in spans: + span_proto = convert_readable_span_to_proto(span) + tmp_file.write(span_proto.SerializeToString()) + logger.debug( + f"Spans written to the protobuf file: {tmp_file_path}" + ) + except Exception as e: + logger.error(f"Error writing spans to the protobuf file: {e}") + return SpanExportResult.FAILURE + + try: + logger.debug("Uploading file to Snowflake stage") + + logger.debug("Creating Snowflake stage if it does not exist") + snowpark_session.sql( + "CREATE TEMP STAGE IF NOT EXISTS trulens_spans" + ).collect() + + logger.debug("Uploading the protobuf file to the stage") + snowpark_session.sql( + f"PUT file://{tmp_file_path} @trulens_spans" + ).collect() + + except Exception as e: + logger.error(f"Error uploading the protobuf file to the stage: {e}") + return SpanExportResult.FAILURE + + try: + logger.debug("Removing the temporary protobuf file") + os.remove(tmp_file_path) + except Exception as e: + # Not returning failure here since the export was technically a success + logger.error(f"Error removing the temporary protobuf file: {e}") + + return SpanExportResult.SUCCESS + + def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult: + trulens_spans = list(filter(check_if_trulens_span, spans)) + + return self._export_to_snowflake_stage(trulens_spans) diff --git a/src/core/trulens/experimental/otel_tracing/core/exporter.py b/src/core/trulens/experimental/otel_tracing/core/exporter/utils.py similarity index 84% rename from src/core/trulens/experimental/otel_tracing/core/exporter.py rename to src/core/trulens/experimental/otel_tracing/core/exporter/utils.py index 02d1b81ae..c534aa978 100644 --- a/src/core/trulens/experimental/otel_tracing/core/exporter.py +++ b/src/core/trulens/experimental/otel_tracing/core/exporter/utils.py @@ -1,6 +1,6 @@ from datetime import datetime import logging -from typing import Any, Optional, Sequence +from typing import Any, Optional from opentelemetry.proto.common.v1.common_pb2 import AnyValue from opentelemetry.proto.common.v1.common_pb2 import ArrayValue @@ -8,10 +8,7 @@ from opentelemetry.proto.common.v1.common_pb2 import KeyValueList from opentelemetry.proto.trace.v1.trace_pb2 import Span as SpanProto from opentelemetry.sdk.trace import ReadableSpan -from opentelemetry.sdk.trace.export import SpanExporter -from opentelemetry.sdk.trace.export import SpanExportResult from opentelemetry.trace import StatusCode -from trulens.core.database import connector as core_connector from trulens.core.schema import event as event_schema from trulens.otel.semconv.trace import SpanAttributes @@ -110,7 +107,6 @@ def check_if_trulens_span(span: ReadableSpan) -> bool: Returns: bool: True if the span contains the TruLens-specific attribute, False otherwise. """ - if not span.attributes: return False @@ -145,28 +141,3 @@ def construct_event(span: ReadableSpan) -> event_schema.Event: "parent_id": str(parent.span_id if parent else ""), }, ) - - -class TruLensDBSpanExporter(SpanExporter): - """ - Implementation of `SpanExporter` that flushes the spans in the TruLens session to the connector. - """ - - connector: core_connector.DBConnector - """ - The database connector used to export the spans. - """ - - def __init__(self, connector: core_connector.DBConnector): - self.connector = connector - - def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult: - try: - events = list(map(construct_event, spans)) - self.connector.add_events(events) - - except Exception as e: - logger.error("Error exporting spans to the database: %s", e) - return SpanExportResult.FAILURE - - return SpanExportResult.SUCCESS diff --git a/src/core/trulens/experimental/otel_tracing/core/init.py b/src/core/trulens/experimental/otel_tracing/core/init.py deleted file mode 100644 index aa6f0f67e..000000000 --- a/src/core/trulens/experimental/otel_tracing/core/init.py +++ /dev/null @@ -1,54 +0,0 @@ -import logging - -from opentelemetry import trace -from opentelemetry.sdk.resources import Resource -from opentelemetry.sdk.trace import TracerProvider -from opentelemetry.sdk.trace.export import ConsoleSpanExporter -from opentelemetry.sdk.trace.export import SimpleSpanProcessor -from trulens.core.session import TruSession -from trulens.experimental.otel_tracing.core.exporter import ( - TruLensDBSpanExporter, -) - -TRULENS_SERVICE_NAME = "trulens" - - -logger = logging.getLogger(__name__) - - -def init(session: TruSession, debug: bool = False): - """Initialize the OpenTelemetry SDK with TruLens configuration.""" - resource = Resource.create({"service.name": TRULENS_SERVICE_NAME}) - provider = TracerProvider(resource=resource) - trace.set_tracer_provider(provider) - - if debug: - logging.debug( - "Initializing OpenTelemetry with TruLens configuration for console debugging" - ) - # Add a console exporter for debugging purposes - console_exporter = ConsoleSpanExporter() - console_processor = SimpleSpanProcessor(console_exporter) - provider.add_span_processor(console_processor) - - if session.connector: - logging.debug("Exporting traces to the TruLens database") - - # Check the database revision - try: - db_revision = session.connector.db.get_db_revision() - if db_revision is None: - raise ValueError( - "Database revision is not set. Please run the migrations." - ) - if int(db_revision) < 10: - raise ValueError( - "Database revision is too low. Please run the migrations." - ) - except Exception: - raise ValueError("Error checking the database revision.") - - # Add the TruLens database exporter - db_exporter = TruLensDBSpanExporter(session.connector) - db_processor = SimpleSpanProcessor(db_exporter) - provider.add_span_processor(db_processor) diff --git a/src/core/trulens/experimental/otel_tracing/core/instrument.py b/src/core/trulens/experimental/otel_tracing/core/instrument.py index 4864d2887..c51417b7e 100644 --- a/src/core/trulens/experimental/otel_tracing/core/instrument.py +++ b/src/core/trulens/experimental/otel_tracing/core/instrument.py @@ -1,14 +1,15 @@ from functools import wraps import logging -from typing import Callable, Optional +from typing import Callable, List, Optional import uuid from opentelemetry import trace +from opentelemetry.baggage import get_baggage from opentelemetry.baggage import remove_baggage from opentelemetry.baggage import set_baggage import opentelemetry.context as context_api from trulens.core import app as core_app -from trulens.experimental.otel_tracing.core.init import TRULENS_SERVICE_NAME +from trulens.experimental.otel_tracing.core.session import TRULENS_SERVICE_NAME from trulens.experimental.otel_tracing.core.span import Attributes from trulens.experimental.otel_tracing.core.span import ( set_general_span_attributes, @@ -93,27 +94,59 @@ def wrapper(*args, **kwargs): return inner_decorator -class App(core_app.App): +class OTELRecordingContext: + run_name: str + """ + The name of the run that the recording context is currently processing. + """ + + input_id: str + """ + The ID of the input that the recording context is currently processing. + """ + + tokens: List[object] = [] + """ + OTEL context tokens for the current context manager. These tokens are how the OTEL + context api keeps track of what is changed in the context, and used to undo the changes. + """ + + context_keys_added: List[str] = [] + """ + Keys added to the OTEL context. + """ + + def __init__(self, *, app: core_app.App, run_name: str, input_id: str): + self.app = app + self.run_name = run_name + self.input_id = input_id + self.tokens = [] + self.context_keys_added = [] + self.span_context = None + + # Calling set_baggage does not actually add the baggage to the current context, but returns a new one + # To avoid issues with remembering to add/remove the baggage, we attach it to the runtime context. + def attach_to_context(self, key: str, value: object): + if get_baggage(key) or value is None: + return + + self.tokens.append(context_api.attach(set_baggage(key, value))) + self.context_keys_added.append(key) + # For use as a context manager. def __enter__(self): - logger.debug("Entering the OTEL app context.") - # Note: This is not the same as the record_id in the core app since the OTEL # tracing is currently separate from the old records behavior otel_record_id = str(uuid.uuid4()) tracer = trace.get_tracer_provider().get_tracer(TRULENS_SERVICE_NAME) - # Calling set_baggage does not actually add the baggage to the current context, but returns a new one - # To avoid issues with remembering to add/remove the baggage, we attach it to the runtime context. - self.tokens.append( - context_api.attach( - set_baggage(SpanAttributes.RECORD_ID, otel_record_id) - ) - ) - self.tokens.append( - context_api.attach(set_baggage(SpanAttributes.APP_ID, self.app_id)) - ) + self.attach_to_context(SpanAttributes.RECORD_ID, otel_record_id) + self.attach_to_context(SpanAttributes.APP_NAME, self.app.app_name) + self.attach_to_context(SpanAttributes.APP_VERSION, self.app.app_version) + + self.attach_to_context(SpanAttributes.RUN_NAME, self.run_name) + self.attach_to_context(SpanAttributes.INPUT_ID, self.input_id) # Use start_as_current_span as a context manager self.span_context = tracer.start_as_current_span("root") @@ -127,12 +160,11 @@ def __enter__(self): # Set record root specific attributes root_span.set_attribute( - SpanAttributes.RECORD_ROOT.APP_NAME, self.app_name + SpanAttributes.RECORD_ROOT.APP_NAME, self.app.app_name ) root_span.set_attribute( - SpanAttributes.RECORD_ROOT.APP_VERSION, self.app_version + SpanAttributes.RECORD_ROOT.APP_VERSION, self.app.app_version ) - root_span.set_attribute(SpanAttributes.RECORD_ROOT.APP_ID, self.app_id) root_span.set_attribute( SpanAttributes.RECORD_ROOT.RECORD_ID, otel_record_id ) @@ -140,16 +172,19 @@ def __enter__(self): return root_span def __exit__(self, exc_type, exc_value, exc_tb): - remove_baggage(SpanAttributes.RECORD_ID) - remove_baggage(SpanAttributes.APP_ID) + # Exiting the span context before updating the context to ensure nothing + # carries over unintentionally + if self.span_context: + # TODO[SNOW-1854360]: Add in feature function spans. + self.span_context.__exit__(exc_type, exc_value, exc_tb) logger.debug("Exiting the OTEL app context.") + # Clearing the context / baggage added. + while self.context_keys_added: + remove_baggage(self.context_keys_added.pop()) + while self.tokens: # Clearing the context once we're done with this root span. # See https://github.com/open-telemetry/opentelemetry-python/issues/2432#issuecomment-1593458684 context_api.detach(self.tokens.pop()) - - if self.span_context: - # TODO[SNOW-1854360]: Add in feature function spans. - self.span_context.__exit__(exc_type, exc_value, exc_tb) diff --git a/src/core/trulens/experimental/otel_tracing/core/instruments.py b/src/core/trulens/experimental/otel_tracing/core/instruments.py deleted file mode 100644 index 180147655..000000000 --- a/src/core/trulens/experimental/otel_tracing/core/instruments.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import annotations - -import logging -from typing import Callable, TypeVar -import weakref - -from trulens.core import instruments as core_instruments -from trulens.core.utils import python as python_utils -from trulens.core.utils import serial as serial_utils -from trulens.experimental.otel_tracing.core import trace as mod_trace -from trulens.experimental.otel_tracing.core._utils import wrap as wrap_utils - -logger = logging.getLogger(__name__) - -T = TypeVar("T") - - -def deproxy(proxy: weakref.ProxyType[T]) -> T: - """Return the object being proxied.""" - - return proxy.__init__.__self__ - - -class _Instrument(core_instruments.Instrument): - def tracked_method_wrapper( - self, - query: serial_utils.Lens, - func: Callable, - method_name: str, - cls: type, - obj: object, - ): - """Wrap a method to capture its inputs/outputs/errors.""" - - if self.app is None: - raise ValueError("Instrumentation requires an app but is None.") - - if python_utils.safe_hasattr(func, "__func__"): - raise ValueError("Function expected but method received.") - - if python_utils.safe_hasattr(func, mod_trace.INSTRUMENT): - logger.debug("\t\t\t%s: %s is already instrumented", query, func) - - # Notify the app instrumenting this method where it is located: - self.app.on_method_instrumented(obj, func, path=query) - - logger.debug("\t\t\t%s: instrumenting %s=%s", query, method_name, func) - - return wrap_utils.wrap_callable( - func=func, - callback_class=mod_trace.AppTracingCallbacks, - func_name=method_name, - app=deproxy(self.app), - ) diff --git a/src/core/trulens/experimental/otel_tracing/core/session.py b/src/core/trulens/experimental/otel_tracing/core/session.py index a87116742..46e1f9579 100644 --- a/src/core/trulens/experimental/otel_tracing/core/session.py +++ b/src/core/trulens/experimental/otel_tracing/core/session.py @@ -1,37 +1,60 @@ -from typing import Any, Optional +import logging +from typing import Optional +from opentelemetry import trace +from opentelemetry.sdk.resources import Resource +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace import export as otel_export_sdk from trulens.core import experimental as core_experimental from trulens.core import session as core_session +from trulens.core.database.connector import DBConnector from trulens.core.utils import python as python_utils from trulens.core.utils import text as text_utils +from trulens.experimental.otel_tracing.core.exporter.connector import ( + TruLensOTELSpanExporter, +) +TRULENS_SERVICE_NAME = "trulens" -class _TruSession(core_session.TruSession): - def _setup_otel_exporter( - self, val: Optional[Any] - ): # any actually otel_export_sdk.SpanExporter - if val is None: - self._experimental_otel_exporter = None - return - - # from opentelemetry import sdk as otel_sdk - try: - from opentelemetry.sdk.trace import export as otel_export_sdk - except ImportError: - raise ImportError( - "OpenTelemetry SDK not found. Please install OpenTelemetry SDK to use OpenTelemetry tracing." - ) +logger = logging.getLogger(__name__) - assert isinstance( - val, otel_export_sdk.SpanExporter - ), "otel_exporter must be an OpenTelemetry SpanExporter." +class _TruSession(core_session.TruSession): + def _setup_otel_exporter( + self, + connector: DBConnector, + exporter: Optional[otel_export_sdk.SpanExporter], + ): self._experimental_feature( flag=core_experimental.Feature.OTEL_TRACING, value=True, freeze=True ) - print( - f"{text_utils.UNICODE_CHECK} OpenTelemetry exporter set: {python_utils.class_name(val.__class__)}" + logger.info( + f"{text_utils.UNICODE_CHECK} OpenTelemetry exporter set: {python_utils.class_name(exporter.__class__)}" ) - self._experimental_otel_exporter = val + self._experimental_otel_exporter = exporter + + """Initialize the OpenTelemetry SDK with TruLens configuration.""" + resource = Resource.create({"service.name": TRULENS_SERVICE_NAME}) + provider = TracerProvider(resource=resource) + trace.set_tracer_provider(provider) + + global_trace_provider = trace.get_tracer_provider() + if not isinstance(global_trace_provider, TracerProvider): + raise ValueError("Received a TracerProvider of an unexpected type!") + + tracer_provider: TracerProvider = global_trace_provider + + # Setting it here for easy access without having to assert the type every time + self._experimental_tracer_provider = tracer_provider + + if exporter and not isinstance(exporter, otel_export_sdk.SpanExporter): + raise ValueError( + "Provided exporter must be an OpenTelemetry SpanExporter" + ) + + db_processor = otel_export_sdk.BatchSpanProcessor( + exporter if exporter else TruLensOTELSpanExporter(connector) + ) + tracer_provider.add_span_processor(db_processor) diff --git a/src/core/trulens/experimental/otel_tracing/core/span.py b/src/core/trulens/experimental/otel_tracing/core/span.py index 22b881c40..6a49b6f62 100644 --- a/src/core/trulens/experimental/otel_tracing/core/span.py +++ b/src/core/trulens/experimental/otel_tracing/core/span.py @@ -86,15 +86,27 @@ def validate_attributes(attributes: Dict[str, Any]) -> Dict[str, Any]: def set_general_span_attributes( span: Span, /, span_type: SpanAttributes.SpanType ) -> Span: - span.set_attribute("kind", "SPAN_KIND_TRULENS") span.set_attribute(SpanAttributes.SPAN_TYPE, span_type) + + span.set_attribute( + SpanAttributes.APP_NAME, str(get_baggage(SpanAttributes.APP_NAME)) + ) span.set_attribute( - SpanAttributes.APP_ID, str(get_baggage(SpanAttributes.APP_ID)) + SpanAttributes.APP_VERSION, str(get_baggage(SpanAttributes.APP_VERSION)) ) span.set_attribute( SpanAttributes.RECORD_ID, str(get_baggage(SpanAttributes.RECORD_ID)) ) + run_name_baggage = get_baggage(SpanAttributes.RUN_NAME) + input_id_baggage = get_baggage(SpanAttributes.INPUT_ID) + + if run_name_baggage: + span.set_attribute(SpanAttributes.RUN_NAME, str(run_name_baggage)) + + if input_id_baggage: + span.set_attribute(SpanAttributes.INPUT_ID, str(input_id_baggage)) + return span @@ -121,7 +133,7 @@ def set_user_defined_attributes( final_attributes = validate_attributes(attributes_to_add) - prefix = f"trulens.{span_type.value}." + prefix = f"{SpanAttributes.BASE}{span_type.value}." for key, value in final_attributes.items(): span.set_attribute(prefix + key, value) @@ -131,7 +143,7 @@ def set_user_defined_attributes( and SpanAttributes.SELECTOR_NAME_KEY in final_attributes ): span.set_attribute( - f"trulens.{final_attributes[SpanAttributes.SELECTOR_NAME_KEY]}.{key}", + f"{SpanAttributes.BASE}{final_attributes[SpanAttributes.SELECTOR_NAME_KEY]}.{key}", value, ) diff --git a/src/otel/semconv/trulens/otel/semconv/trace.py b/src/otel/semconv/trulens/otel/semconv/trace.py index 3cbd2621a..0eb46de52 100644 --- a/src/otel/semconv/trulens/otel/semconv/trace.py +++ b/src/otel/semconv/trulens/otel/semconv/trace.py @@ -59,12 +59,21 @@ class SpanAttributes: RECORD_ID = BASE + "record_id" """ID of the record that the span belongs to.""" - APP_ID = BASE + "app_id" - """ID of the app that the span belongs to.""" + APP_NAME = BASE + "app_name" + """Fully qualified name of the app that the span belongs to.""" + + APP_VERSION = BASE + "app_version" + """Name of the version that the span belongs to.""" ROOT_SPAN_ID = BASE + "root_span_id" """ID of the root span of the record that the span belongs to.""" + RUN_NAME = BASE + "run_name" + """Name of the run that the span belongs to.""" + + INPUT_ID = BASE + "input_id" + """ID of the input that the span belongs to.""" + class SpanType(str, Enum): """Span type attribute values. @@ -202,8 +211,6 @@ class RECORD_ROOT: APP_VERSION = base + ".app_version" """Version of the app for whom this is the root.""" - APP_ID = base + ".app_id" - RECORD_ID = base + ".record_id" TOTAL_COST = base + ".total_cost" diff --git a/tests/unit/static/golden/api.trulens.3.11.yaml b/tests/unit/static/golden/api.trulens.3.11.yaml index a3c97c56f..f87980dd9 100644 --- a/tests/unit/static/golden/api.trulens.3.11.yaml +++ b/tests/unit/static/golden/api.trulens.3.11.yaml @@ -4,7 +4,7 @@ trulens: lows: {} trulens.benchmark: __class__: builtins.module - __version__: 1.3.1 + __version__: 1.3.2 highs: {} lows: __version__: builtins.str @@ -60,7 +60,7 @@ trulens.benchmark.test_cases: generate_summeval_groundedness_golden_set: builtins.function trulens.core: __class__: builtins.module - __version__: 1.3.1 + __version__: 1.3.2 highs: Feedback: pydantic._internal._model_construction.ModelMetaclass FeedbackMode: enum.EnumType @@ -141,9 +141,7 @@ trulens.core.app.App: selector_check_warning: builtins.bool selector_nocheck: builtins.bool session: trulens.core.session.TruSession - span_context: typing.Optional[contextlib.AbstractContextManager, builtins.NoneType] tags: builtins.str - tokens: typing.List[builtins.object] tru: builtins.property tru_class_info: trulens.core.utils.pyschema.Class wait_for_feedback_results: builtins.function @@ -1727,7 +1725,7 @@ trulens.core.utils.trulens.Other: attributes: {} trulens.dashboard: __class__: builtins.module - __version__: 1.3.1 + __version__: 1.3.2 highs: run_dashboard: builtins.function run_dashboard_sis: builtins.function @@ -2015,7 +2013,7 @@ trulens.dashboard.ux.styles.ResultCategoryType: value: enum.property trulens.feedback: __class__: builtins.module - __version__: 1.3.1 + __version__: 1.3.2 highs: Embeddings: pydantic._internal._model_construction.ModelMetaclass GroundTruthAggregator: pydantic._internal._model_construction.ModelMetaclass diff --git a/tests/unit/static/golden/api.trulens_eval.3.11.yaml b/tests/unit/static/golden/api.trulens_eval.3.11.yaml index d39f87dae..59d3c1441 100644 --- a/tests/unit/static/golden/api.trulens_eval.3.11.yaml +++ b/tests/unit/static/golden/api.trulens_eval.3.11.yaml @@ -78,7 +78,7 @@ trulens_eval.AzureOpenAI: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -86,7 +86,7 @@ trulens_eval.AzureOpenAI: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -170,7 +170,7 @@ trulens_eval.Bedrock: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -178,7 +178,7 @@ trulens_eval.Bedrock: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_id: builtins.str model_json_schema: builtins.classmethod @@ -256,7 +256,7 @@ trulens_eval.Cortex: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -264,7 +264,7 @@ trulens_eval.Cortex: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -332,14 +332,14 @@ trulens_eval.Feedback: load: builtins.staticmethod max_score_val: typing.Optional[builtins.int, builtins.NoneType] min_score_val: typing.Optional[builtins.int, builtins.NoneType] - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -407,14 +407,14 @@ trulens_eval.Huggingface: json: builtins.function language_match: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -457,14 +457,14 @@ trulens_eval.HuggingfaceLocal: json: builtins.function language_match: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -533,7 +533,7 @@ trulens_eval.Langchain: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -541,7 +541,7 @@ trulens_eval.Langchain: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -624,7 +624,7 @@ trulens_eval.LiteLLM: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -632,7 +632,7 @@ trulens_eval.LiteLLM: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -707,7 +707,7 @@ trulens_eval.OpenAI: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -715,7 +715,7 @@ trulens_eval.OpenAI: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -769,14 +769,14 @@ trulens_eval.Provider: get_class: builtins.staticmethod json: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -869,14 +869,14 @@ trulens_eval.Tru: get_records_and_feedback: builtins.function json: builtins.function migrate_database: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -947,14 +947,14 @@ trulens_eval.TruBasicApp: manage_pending_feedback_results_thread: typing.Optional[trulens.core.utils.threading.Thread, builtins.NoneType] metadata: typing.Dict - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -989,9 +989,7 @@ trulens_eval.TruBasicApp: selector_check_warning: builtins.bool selector_nocheck: builtins.bool session: trulens.core.session.TruSession - span_context: typing.Optional[contextlib.AbstractContextManager, builtins.NoneType] tags: builtins.str - tokens: typing.List[builtins.object] tru: builtins.property tru_class_info: trulens.core.utils.pyschema.Class update: builtins.function @@ -1048,14 +1046,14 @@ trulens_eval.TruChain: manage_pending_feedback_results_thread: typing.Optional[trulens.core.utils.threading.Thread, builtins.NoneType] metadata: typing.Dict - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -1090,9 +1088,7 @@ trulens_eval.TruChain: selector_check_warning: builtins.bool selector_nocheck: builtins.bool session: trulens.core.session.TruSession - span_context: typing.Optional[contextlib.AbstractContextManager, builtins.NoneType] tags: builtins.str - tokens: typing.List[builtins.object] tru: builtins.property tru_class_info: trulens.core.utils.pyschema.Class update: builtins.function @@ -1150,14 +1146,14 @@ trulens_eval.TruCustomApp: manage_pending_feedback_results_thread: typing.Optional[trulens.core.utils.threading.Thread, builtins.NoneType] metadata: typing.Dict - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -1192,9 +1188,7 @@ trulens_eval.TruCustomApp: selector_check_warning: builtins.bool selector_nocheck: builtins.bool session: trulens.core.session.TruSession - span_context: typing.Optional[contextlib.AbstractContextManager, builtins.NoneType] tags: builtins.str - tokens: typing.List[builtins.object] tru: builtins.property tru_class_info: trulens.core.utils.pyschema.Class update: builtins.function @@ -1249,14 +1243,14 @@ trulens_eval.TruLlama: manage_pending_feedback_results_thread: typing.Optional[trulens.core.utils.threading.Thread, builtins.NoneType] metadata: typing.Dict - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -1292,9 +1286,7 @@ trulens_eval.TruLlama: selector_check_warning: builtins.bool selector_nocheck: builtins.bool session: trulens.core.session.TruSession - span_context: typing.Optional[contextlib.AbstractContextManager, builtins.NoneType] tags: builtins.str - tokens: typing.List[builtins.object] tru: builtins.property tru_class_info: trulens.core.utils.pyschema.Class update: builtins.function @@ -1349,14 +1341,14 @@ trulens_eval.TruRails: manage_pending_feedback_results_thread: typing.Optional[trulens.core.utils.threading.Thread, builtins.NoneType] metadata: typing.Dict - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -1391,9 +1383,7 @@ trulens_eval.TruRails: selector_check_warning: builtins.bool selector_nocheck: builtins.bool session: trulens.core.session.TruSession - span_context: typing.Optional[contextlib.AbstractContextManager, builtins.NoneType] tags: builtins.str - tokens: typing.List[builtins.object] tru: builtins.property tru_class_info: trulens.core.utils.pyschema.Class update: builtins.function @@ -1450,14 +1440,14 @@ trulens_eval.TruVirtual: manage_pending_feedback_results_thread: typing.Optional[trulens.core.utils.threading.Thread, builtins.NoneType] metadata: typing.Dict - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -1492,9 +1482,7 @@ trulens_eval.TruVirtual: selector_check_warning: builtins.bool selector_nocheck: builtins.bool session: trulens.core.session.TruSession - span_context: typing.Optional[contextlib.AbstractContextManager, builtins.NoneType] tags: builtins.str - tokens: typing.List[builtins.object] tru: builtins.property tru_class_info: trulens.core.utils.pyschema.Class update: builtins.function @@ -1582,14 +1570,14 @@ trulens_eval.app.App: manage_pending_feedback_results_thread: typing.Optional[trulens.core.utils.threading.Thread, builtins.NoneType] metadata: typing.Dict - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -1623,9 +1611,7 @@ trulens_eval.app.App: selector_check_warning: builtins.bool selector_nocheck: builtins.bool session: trulens.core.session.TruSession - span_context: typing.Optional[contextlib.AbstractContextManager, builtins.NoneType] tags: builtins.str - tokens: typing.List[builtins.object] tru: builtins.property tru_class_info: trulens.core.utils.pyschema.Class update: builtins.function @@ -1846,14 +1832,14 @@ trulens_eval.database.base.DB: insert_record: builtins.function json: builtins.function migrate_database: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -2005,14 +1991,14 @@ trulens_eval.database.sqlalchemy.SQLAlchemyDB: insert_record: builtins.function json: builtins.function migrate_database: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -2117,7 +2103,7 @@ trulens_eval.feedback.AzureOpenAI: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -2125,7 +2111,7 @@ trulens_eval.feedback.AzureOpenAI: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -2209,7 +2195,7 @@ trulens_eval.feedback.Bedrock: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -2217,7 +2203,7 @@ trulens_eval.feedback.Bedrock: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_id: builtins.str model_json_schema: builtins.classmethod @@ -2295,7 +2281,7 @@ trulens_eval.feedback.Cortex: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -2303,7 +2289,7 @@ trulens_eval.feedback.Cortex: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -2351,14 +2337,14 @@ trulens_eval.feedback.Embeddings: json: builtins.function load: builtins.staticmethod manhattan_distance: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -2416,14 +2402,14 @@ trulens_eval.feedback.Feedback: load: builtins.staticmethod max_score_val: typing.Optional[builtins.int, builtins.NoneType] min_score_val: typing.Optional[builtins.int, builtins.NoneType] - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -2485,14 +2471,14 @@ trulens_eval.feedback.GroundTruthAgreement: json: builtins.function load: builtins.staticmethod mae: builtins.property - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -2537,14 +2523,14 @@ trulens_eval.feedback.Huggingface: json: builtins.function language_match: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -2587,14 +2573,14 @@ trulens_eval.feedback.HuggingfaceLocal: json: builtins.function language_match: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -2663,7 +2649,7 @@ trulens_eval.feedback.Langchain: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -2671,7 +2657,7 @@ trulens_eval.feedback.Langchain: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -2747,7 +2733,7 @@ trulens_eval.feedback.LiteLLM: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -2755,7 +2741,7 @@ trulens_eval.feedback.LiteLLM: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -2830,7 +2816,7 @@ trulens_eval.feedback.OpenAI: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -2838,7 +2824,7 @@ trulens_eval.feedback.OpenAI: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -2900,14 +2886,14 @@ trulens_eval.feedback.embeddings.Embeddings: json: builtins.function load: builtins.staticmethod manhattan_distance: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -2974,14 +2960,14 @@ trulens_eval.feedback.feedback.Feedback: load: builtins.staticmethod max_score_val: typing.Optional[builtins.int, builtins.NoneType] min_score_val: typing.Optional[builtins.int, builtins.NoneType] - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -3059,14 +3045,14 @@ trulens_eval.feedback.groundtruth.GroundTruthAgreement: json: builtins.function load: builtins.staticmethod mae: builtins.property - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -3197,7 +3183,7 @@ trulens_eval.feedback.provider.AzureOpenAI: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -3205,7 +3191,7 @@ trulens_eval.feedback.provider.AzureOpenAI: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -3289,7 +3275,7 @@ trulens_eval.feedback.provider.Bedrock: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -3297,7 +3283,7 @@ trulens_eval.feedback.provider.Bedrock: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_id: builtins.str model_json_schema: builtins.classmethod @@ -3375,7 +3361,7 @@ trulens_eval.feedback.provider.Cortex: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -3383,7 +3369,7 @@ trulens_eval.feedback.provider.Cortex: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -3432,14 +3418,14 @@ trulens_eval.feedback.provider.Huggingface: json: builtins.function language_match: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -3482,14 +3468,14 @@ trulens_eval.feedback.provider.HuggingfaceLocal: json: builtins.function language_match: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -3558,7 +3544,7 @@ trulens_eval.feedback.provider.Langchain: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -3566,7 +3552,7 @@ trulens_eval.feedback.provider.Langchain: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -3642,7 +3628,7 @@ trulens_eval.feedback.provider.LiteLLM: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -3650,7 +3636,7 @@ trulens_eval.feedback.provider.LiteLLM: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -3725,7 +3711,7 @@ trulens_eval.feedback.provider.OpenAI: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -3733,7 +3719,7 @@ trulens_eval.feedback.provider.OpenAI: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -3787,14 +3773,14 @@ trulens_eval.feedback.provider.Provider: get_class: builtins.staticmethod json: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -3866,7 +3852,7 @@ trulens_eval.feedback.provider.base.LLMProvider: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -3874,7 +3860,7 @@ trulens_eval.feedback.provider.base.LLMProvider: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -3919,14 +3905,14 @@ trulens_eval.feedback.provider.base.Provider: get_class: builtins.staticmethod json: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -3998,7 +3984,7 @@ trulens_eval.feedback.provider.bedrock.Bedrock: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -4006,7 +3992,7 @@ trulens_eval.feedback.provider.bedrock.Bedrock: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_id: builtins.str model_json_schema: builtins.classmethod @@ -4090,7 +4076,7 @@ trulens_eval.feedback.provider.cortex.Cortex: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -4098,7 +4084,7 @@ trulens_eval.feedback.provider.cortex.Cortex: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -4171,14 +4157,14 @@ trulens_eval.feedback.provider.endpoint.BedrockEndpoint: instrumented_methods: collections.defaultdict json: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -4237,14 +4223,14 @@ trulens_eval.feedback.provider.endpoint.CortexEndpoint: instrumented_methods: collections.defaultdict json: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -4312,14 +4298,14 @@ trulens_eval.feedback.provider.endpoint.DummyEndpoint: load: builtins.staticmethod loading_prob: builtins.property loading_time: builtins.property - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -4382,14 +4368,14 @@ trulens_eval.feedback.provider.endpoint.Endpoint: instrumented_methods: collections.defaultdict json: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -4450,14 +4436,14 @@ trulens_eval.feedback.provider.endpoint.HuggingfaceEndpoint: instrumented_methods: collections.defaultdict json: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -4518,14 +4504,14 @@ trulens_eval.feedback.provider.endpoint.LangchainEndpoint: instrumented_methods: collections.defaultdict json: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -4584,14 +4570,14 @@ trulens_eval.feedback.provider.endpoint.LiteLLMEndpoint: json: builtins.function litellm_provider: builtins.str load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -4640,14 +4626,14 @@ trulens_eval.feedback.provider.endpoint.OpenAIClient: formatted_objects: _contextvars.ContextVar from_orm: builtins.classmethod json: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -4690,14 +4676,14 @@ trulens_eval.feedback.provider.endpoint.OpenAIEndpoint: instrumented_methods: collections.defaultdict json: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -4776,14 +4762,14 @@ trulens_eval.feedback.provider.endpoint.base.DummyEndpoint: load: builtins.staticmethod loading_prob: builtins.property loading_time: builtins.property - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -4846,14 +4832,14 @@ trulens_eval.feedback.provider.endpoint.base.Endpoint: instrumented_methods: collections.defaultdict json: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -4906,14 +4892,14 @@ trulens_eval.feedback.provider.endpoint.base.EndpointCallback: handle_generation: builtins.function handle_generation_chunk: builtins.function json: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -4957,14 +4943,14 @@ trulens_eval.feedback.provider.endpoint.bedrock.BedrockCallback: handle_generation: builtins.function handle_generation_chunk: builtins.function json: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -5007,14 +4993,14 @@ trulens_eval.feedback.provider.endpoint.bedrock.BedrockEndpoint: instrumented_methods: collections.defaultdict json: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -5075,14 +5061,14 @@ trulens_eval.feedback.provider.endpoint.cortex.CortexCallback: handle_generation: builtins.function handle_generation_chunk: builtins.function json: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -5124,14 +5110,14 @@ trulens_eval.feedback.provider.endpoint.cortex.CortexEndpoint: instrumented_methods: collections.defaultdict json: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -5191,14 +5177,14 @@ trulens_eval.feedback.provider.endpoint.hugs.HuggingfaceCallback: handle_generation: builtins.function handle_generation_chunk: builtins.function json: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -5243,14 +5229,14 @@ trulens_eval.feedback.provider.endpoint.hugs.HuggingfaceEndpoint: instrumented_methods: collections.defaultdict json: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -5312,14 +5298,14 @@ trulens_eval.feedback.provider.endpoint.langchain.LangchainCallback: handle_generation: builtins.function handle_generation_chunk: builtins.function json: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -5362,14 +5348,14 @@ trulens_eval.feedback.provider.endpoint.langchain.LangchainEndpoint: instrumented_methods: collections.defaultdict json: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -5429,14 +5415,14 @@ trulens_eval.feedback.provider.endpoint.litellm.LiteLLMCallback: handle_generation: builtins.function handle_generation_chunk: builtins.function json: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -5479,14 +5465,14 @@ trulens_eval.feedback.provider.endpoint.litellm.LiteLLMEndpoint: json: builtins.function litellm_provider: builtins.str load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -5549,14 +5535,14 @@ trulens_eval.feedback.provider.endpoint.openai.OpenAICallback: handle_generation_chunk: builtins.function json: builtins.function langchain_handler: langchain_community.callbacks.openai_info.OpenAICallbackHandler - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -5589,14 +5575,14 @@ trulens_eval.feedback.provider.endpoint.openai.OpenAIClient: formatted_objects: _contextvars.ContextVar from_orm: builtins.classmethod json: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -5639,14 +5625,14 @@ trulens_eval.feedback.provider.endpoint.openai.OpenAIEndpoint: instrumented_methods: collections.defaultdict json: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -5716,14 +5702,14 @@ trulens_eval.feedback.provider.hugs.Dummy: json: builtins.function language_match: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -5766,14 +5752,14 @@ trulens_eval.feedback.provider.hugs.Huggingface: json: builtins.function language_match: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -5816,14 +5802,14 @@ trulens_eval.feedback.provider.hugs.HuggingfaceBase: json: builtins.function language_match: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -5866,14 +5852,14 @@ trulens_eval.feedback.provider.hugs.HuggingfaceLocal: json: builtins.function language_match: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -5948,7 +5934,7 @@ trulens_eval.feedback.provider.langchain.Langchain: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -5956,7 +5942,7 @@ trulens_eval.feedback.provider.langchain.Langchain: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -6038,7 +6024,7 @@ trulens_eval.feedback.provider.litellm.LiteLLM: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -6046,7 +6032,7 @@ trulens_eval.feedback.provider.litellm.LiteLLM: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -6129,7 +6115,7 @@ trulens_eval.feedback.provider.openai.AzureOpenAI: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -6137,7 +6123,7 @@ trulens_eval.feedback.provider.openai.AzureOpenAI: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -6221,7 +6207,7 @@ trulens_eval.feedback.provider.openai.OpenAI: misogyny: builtins.function misogyny_with_cot_reasons: builtins.function model_agreement: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function @@ -6229,7 +6215,7 @@ trulens_eval.feedback.provider.openai.OpenAI: model_dump_json: builtins.function model_engine: builtins.str model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -6459,14 +6445,14 @@ trulens_eval.schema.app.AppDefinition: jsonify_extra: builtins.function load: builtins.staticmethod metadata: typing.Dict - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -6569,14 +6555,14 @@ trulens_eval.schema.feedback.FeedbackCall: from_orm: builtins.classmethod json: builtins.function meta: typing.Dict[builtins.str, typing.Any] - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -6634,14 +6620,14 @@ trulens_eval.schema.feedback.FeedbackDefinition: builtins.NoneType] json: builtins.function load: builtins.staticmethod - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -6707,14 +6693,14 @@ trulens_eval.schema.feedback.FeedbackResult: from_orm: builtins.classmethod json: builtins.function last_ts: datetime.datetime - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -6814,14 +6800,14 @@ trulens_eval.schema.record.Record: builtins.NoneType, typing.Sequence[typing.Any], typing.Dict[builtins.str, typing.Any]] meta: typing.Union[builtins.str, builtins.int, builtins.float, builtins.bytes, builtins.NoneType, typing.Sequence[typing.Any], typing.Dict[builtins.str, typing.Any]] - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -6860,14 +6846,14 @@ trulens_eval.schema.record.RecordAppCall: from_orm: builtins.classmethod json: builtins.function method: builtins.property - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -6904,14 +6890,14 @@ trulens_eval.schema.record.RecordAppCallMethod: from_orm: builtins.classmethod json: builtins.function method: trulens.core.utils.pyschema.Method - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -7001,14 +6987,14 @@ trulens_eval.tru.Tru: get_records_and_feedback: builtins.function json: builtins.function migrate_database: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -7087,14 +7073,14 @@ trulens_eval.tru_basic_app.TruBasicApp: manage_pending_feedback_results_thread: typing.Optional[trulens.core.utils.threading.Thread, builtins.NoneType] metadata: typing.Dict - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -7129,9 +7115,7 @@ trulens_eval.tru_basic_app.TruBasicApp: selector_check_warning: builtins.bool selector_nocheck: builtins.bool session: trulens.core.session.TruSession - span_context: typing.Optional[contextlib.AbstractContextManager, builtins.NoneType] tags: builtins.str - tokens: typing.List[builtins.object] tru: builtins.property tru_class_info: trulens.core.utils.pyschema.Class update: builtins.function @@ -7232,14 +7216,14 @@ trulens_eval.tru_chain.TruChain: manage_pending_feedback_results_thread: typing.Optional[trulens.core.utils.threading.Thread, builtins.NoneType] metadata: typing.Dict - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -7274,9 +7258,7 @@ trulens_eval.tru_chain.TruChain: selector_check_warning: builtins.bool selector_nocheck: builtins.bool session: trulens.core.session.TruSession - span_context: typing.Optional[contextlib.AbstractContextManager, builtins.NoneType] tags: builtins.str - tokens: typing.List[builtins.object] tru: builtins.property tru_class_info: trulens.core.utils.pyschema.Class update: builtins.function @@ -7342,14 +7324,14 @@ trulens_eval.tru_custom_app.TruCustomApp: manage_pending_feedback_results_thread: typing.Optional[trulens.core.utils.threading.Thread, builtins.NoneType] metadata: typing.Dict - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -7384,9 +7366,7 @@ trulens_eval.tru_custom_app.TruCustomApp: selector_check_warning: builtins.bool selector_nocheck: builtins.bool session: trulens.core.session.TruSession - span_context: typing.Optional[contextlib.AbstractContextManager, builtins.NoneType] tags: builtins.str - tokens: typing.List[builtins.object] tru: builtins.property tru_class_info: trulens.core.utils.pyschema.Class update: builtins.function @@ -7472,14 +7452,14 @@ trulens_eval.tru_llama.TruLlama: manage_pending_feedback_results_thread: typing.Optional[trulens.core.utils.threading.Thread, builtins.NoneType] metadata: typing.Dict - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -7515,9 +7495,7 @@ trulens_eval.tru_llama.TruLlama: selector_check_warning: builtins.bool selector_nocheck: builtins.bool session: trulens.core.session.TruSession - span_context: typing.Optional[contextlib.AbstractContextManager, builtins.NoneType] tags: builtins.str - tokens: typing.List[builtins.object] tru: builtins.property tru_class_info: trulens.core.utils.pyschema.Class update: builtins.function @@ -7640,14 +7618,14 @@ trulens_eval.tru_rails.TruRails: manage_pending_feedback_results_thread: typing.Optional[trulens.core.utils.threading.Thread, builtins.NoneType] metadata: typing.Dict - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -7682,9 +7660,7 @@ trulens_eval.tru_rails.TruRails: selector_check_warning: builtins.bool selector_nocheck: builtins.bool session: trulens.core.session.TruSession - span_context: typing.Optional[contextlib.AbstractContextManager, builtins.NoneType] tags: builtins.str - tokens: typing.List[builtins.object] tru: builtins.property tru_class_info: trulens.core.utils.pyschema.Class update: builtins.function @@ -7749,14 +7725,14 @@ trulens_eval.tru_virtual.TruVirtual: manage_pending_feedback_results_thread: typing.Optional[trulens.core.utils.threading.Thread, builtins.NoneType] metadata: typing.Dict - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -7791,9 +7767,7 @@ trulens_eval.tru_virtual.TruVirtual: selector_check_warning: builtins.bool selector_nocheck: builtins.bool session: trulens.core.session.TruSession - span_context: typing.Optional[contextlib.AbstractContextManager, builtins.NoneType] tags: builtins.str - tokens: typing.List[builtins.object] tru: builtins.property tru_class_info: trulens.core.utils.pyschema.Class update: builtins.function @@ -7840,14 +7814,14 @@ trulens_eval.tru_virtual.VirtualRecord: builtins.NoneType, typing.Sequence[typing.Any], typing.Dict[builtins.str, typing.Any]] meta: typing.Union[builtins.str, builtins.int, builtins.float, builtins.bytes, builtins.NoneType, typing.Sequence[typing.Any], typing.Dict[builtins.str, typing.Any]] - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -8181,14 +8155,14 @@ trulens_eval.utils.pyschema.Bindings: json: builtins.function kwargs: typing.Dict[builtins.str, typing.Any] load: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -8221,14 +8195,14 @@ trulens_eval.utils.pyschema.Class: from_orm: builtins.classmethod json: builtins.function load: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -8265,14 +8239,14 @@ trulens_eval.utils.pyschema.Function: from_orm: builtins.classmethod json: builtins.function load: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -8306,14 +8280,14 @@ trulens_eval.utils.pyschema.FunctionOrMethod: from_orm: builtins.classmethod json: builtins.function load: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -8344,14 +8318,14 @@ trulens_eval.utils.pyschema.Method: from_orm: builtins.classmethod json: builtins.function load: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -8385,14 +8359,14 @@ trulens_eval.utils.pyschema.Module: from_orm: builtins.classmethod json: builtins.function load: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -8429,14 +8403,14 @@ trulens_eval.utils.pyschema.Obj: init_bindings: typing.Optional[trulens.core.utils.pyschema.Bindings, builtins.NoneType] json: builtins.function load: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -8589,14 +8563,14 @@ trulens_eval.utils.serial.Collect: get: builtins.function get_sole_item: builtins.function json: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -8627,14 +8601,14 @@ trulens_eval.utils.serial.GetAttribute: get_item_or_attribute: builtins.function get_sole_item: builtins.function json: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -8664,14 +8638,14 @@ trulens_eval.utils.serial.GetIndex: get_sole_item: builtins.function index: builtins.int json: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -8701,14 +8675,14 @@ trulens_eval.utils.serial.GetIndices: get_sole_item: builtins.function indices: typing.Tuple[builtins.int, ...] json: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -8739,14 +8713,14 @@ trulens_eval.utils.serial.GetItem: get_sole_item: builtins.function item: builtins.str json: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -8777,14 +8751,14 @@ trulens_eval.utils.serial.GetItemOrAttribute: get_sole_item: builtins.function item_or_attribute: builtins.str json: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -8814,14 +8788,14 @@ trulens_eval.utils.serial.GetItems: get_sole_item: builtins.function items: typing.Tuple[builtins.str, ...] json: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -8850,14 +8824,14 @@ trulens_eval.utils.serial.GetSlice: get: builtins.function get_sole_item: builtins.function json: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod @@ -8939,14 +8913,14 @@ trulens_eval.utils.serial.StepItemOrAttribute: get_item_or_attribute: builtins.function get_sole_item: builtins.function json: builtins.function - model_computed_fields: builtins.property + model_computed_fields: builtins.dict model_config: builtins.dict model_construct: builtins.classmethod model_copy: builtins.function model_dump: builtins.function model_dump_json: builtins.function model_extra: builtins.property - model_fields: builtins.property + model_fields: builtins.dict model_fields_set: builtins.property model_json_schema: builtins.classmethod model_parametrized_name: builtins.classmethod diff --git a/tests/unit/static/golden/test_otel_instrument__test_instrument_decorator.csv b/tests/unit/static/golden/test_otel_instrument__test_instrument_decorator.csv index 079c0fcae..9b44edf4d 100644 --- a/tests/unit/static/golden/test_otel_instrument__test_instrument_decorator.csv +++ b/tests/unit/static/golden/test_otel_instrument__test_instrument_decorator.csv @@ -1,11 +1,11 @@ ,record,event_id,record_attributes,record_type,resource_attributes,start_timestamp,timestamp,trace -0,"{'name': 'root', 'kind': 1, 'parent_span_id': '', 'status': 'STATUS_CODE_UNSET'}",10171214145140022378,"{'name': 'root', 'kind': 'SPAN_KIND_TRULENS', 'trulens.span_type': 'record_root', 'trulens.app_id': 'app_hash_baf7b2cb6402e84fa3b0b3a028d4bf65', 'trulens.record_id': 'b6708522-36c0-4229-bb99-8cb6ce034ae6', 'trulens.record_root.app_name': 'default_app', 'trulens.record_root.app_version': 'base', 'trulens.record_root.app_id': 'app_hash_baf7b2cb6402e84fa3b0b3a028d4bf65', 'trulens.record_root.record_id': 'b6708522-36c0-4229-bb99-8cb6ce034ae6'}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-11 16:45:54.479061,2025-01-11 16:45:54.482640,"{'trace_id': '183708988068224948480846288953380522832', 'parent_id': '', 'span_id': '10171214145140022378'}" -1,"{'name': 'respond_to_query', 'kind': 1, 'parent_span_id': '10171214145140022378', 'status': 'STATUS_CODE_UNSET'}",12693686145818269980,"{'name': 'respond_to_query', 'kind': 'SPAN_KIND_TRULENS', 'trulens.span_type': 'main', 'trulens.app_id': 'app_hash_baf7b2cb6402e84fa3b0b3a028d4bf65', 'trulens.record_id': 'b6708522-36c0-4229-bb99-8cb6ce034ae6', 'trulens.main.main_input': 'test', 'trulens.main.main_output': 'answer: nested: nested2: nested3'}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-11 16:45:54.479105,2025-01-11 16:45:54.481937,"{'trace_id': '183708988068224948480846288953380522832', 'parent_id': '10171214145140022378', 'span_id': '12693686145818269980'}" -2,"{'name': 'nested', 'kind': 1, 'parent_span_id': '12693686145818269980', 'status': 'STATUS_CODE_UNSET'}",14126750786796684516,"{'name': 'nested', 'kind': 'SPAN_KIND_TRULENS', 'trulens.span_type': 'unknown', 'trulens.app_id': 'app_hash_baf7b2cb6402e84fa3b0b3a028d4bf65', 'trulens.record_id': 'b6708522-36c0-4229-bb99-8cb6ce034ae6', 'trulens.unknown.nested_attr1': 'value1'}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-11 16:45:54.479125,2025-01-11 16:45:54.481128,"{'trace_id': '183708988068224948480846288953380522832', 'parent_id': '12693686145818269980', 'span_id': '14126750786796684516'}" -3,"{'name': 'nested2', 'kind': 1, 'parent_span_id': '14126750786796684516', 'status': 'STATUS_CODE_UNSET'}",16913326535362873820,"{'name': 'nested2', 'kind': 'SPAN_KIND_TRULENS', 'trulens.span_type': 'unknown', 'trulens.app_id': 'app_hash_baf7b2cb6402e84fa3b0b3a028d4bf65', 'trulens.record_id': 'b6708522-36c0-4229-bb99-8cb6ce034ae6', 'trulens.unknown.nested2_ret': 'nested2: nested3', 'trulens.unknown.nested2_args[1]': 'test'}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-11 16:45:54.479143,2025-01-11 16:45:54.480371,"{'trace_id': '183708988068224948480846288953380522832', 'parent_id': '14126750786796684516', 'span_id': '16913326535362873820'}" -4,"{'name': 'nested3', 'kind': 1, 'parent_span_id': '16913326535362873820', 'status': 'STATUS_CODE_UNSET'}",13095442553143098739,"{'name': 'nested3', 'kind': 'SPAN_KIND_TRULENS', 'trulens.span_type': 'unknown', 'trulens.app_id': 'app_hash_baf7b2cb6402e84fa3b0b3a028d4bf65', 'trulens.record_id': 'b6708522-36c0-4229-bb99-8cb6ce034ae6', 'trulens.unknown.nested3_ret': 'nested3', 'trulens.special.nested3_ret': 'nested3', 'trulens.unknown.selector_name': 'special', 'trulens.unknown.cows': 'moo', 'trulens.special.cows': 'moo'}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-11 16:45:54.479158,2025-01-11 16:45:54.479189,"{'trace_id': '183708988068224948480846288953380522832', 'parent_id': '16913326535362873820', 'span_id': '13095442553143098739'}" -5,"{'name': 'root', 'kind': 1, 'parent_span_id': '', 'status': 'STATUS_CODE_UNSET'}",10313173348376832091,"{'name': 'root', 'kind': 'SPAN_KIND_TRULENS', 'trulens.span_type': 'record_root', 'trulens.app_id': 'app_hash_baf7b2cb6402e84fa3b0b3a028d4bf65', 'trulens.record_id': '853f86c3-e3ff-4bc7-bf84-3ea2a4652235', 'trulens.record_root.app_name': 'default_app', 'trulens.record_root.app_version': 'base', 'trulens.record_root.app_id': 'app_hash_baf7b2cb6402e84fa3b0b3a028d4bf65', 'trulens.record_root.record_id': '853f86c3-e3ff-4bc7-bf84-3ea2a4652235'}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-11 16:45:54.483449,2025-01-11 16:45:54.488175,"{'trace_id': '291242587496290935239848857119532985705', 'parent_id': '', 'span_id': '10313173348376832091'}" -6,"{'name': 'respond_to_query', 'kind': 1, 'parent_span_id': '10313173348376832091', 'status': 'STATUS_CODE_UNSET'}",2117052901681467046,"{'name': 'respond_to_query', 'kind': 'SPAN_KIND_TRULENS', 'trulens.span_type': 'main', 'trulens.app_id': 'app_hash_baf7b2cb6402e84fa3b0b3a028d4bf65', 'trulens.record_id': '853f86c3-e3ff-4bc7-bf84-3ea2a4652235', 'trulens.main.main_input': 'throw', 'trulens.main.main_output': 'answer: nested: nested2: '}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-11 16:45:54.483479,2025-01-11 16:45:54.487525,"{'trace_id': '291242587496290935239848857119532985705', 'parent_id': '10313173348376832091', 'span_id': '2117052901681467046'}" -7,"{'name': 'nested', 'kind': 1, 'parent_span_id': '2117052901681467046', 'status': 'STATUS_CODE_UNSET'}",8161924188318385316,"{'name': 'nested', 'kind': 'SPAN_KIND_TRULENS', 'trulens.span_type': 'unknown', 'trulens.app_id': 'app_hash_baf7b2cb6402e84fa3b0b3a028d4bf65', 'trulens.record_id': '853f86c3-e3ff-4bc7-bf84-3ea2a4652235', 'trulens.unknown.nested_attr1': 'value1'}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-11 16:45:54.483509,2025-01-11 16:45:54.486739,"{'trace_id': '291242587496290935239848857119532985705', 'parent_id': '2117052901681467046', 'span_id': '8161924188318385316'}" -8,"{'name': 'nested2', 'kind': 1, 'parent_span_id': '8161924188318385316', 'status': 'STATUS_CODE_UNSET'}",14428269894233492734,"{'name': 'nested2', 'kind': 'SPAN_KIND_TRULENS', 'trulens.span_type': 'unknown', 'trulens.app_id': 'app_hash_baf7b2cb6402e84fa3b0b3a028d4bf65', 'trulens.record_id': '853f86c3-e3ff-4bc7-bf84-3ea2a4652235', 'trulens.unknown.nested2_ret': 'nested2: ', 'trulens.unknown.nested2_args[1]': 'throw'}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-11 16:45:54.483526,2025-01-11 16:45:54.485951,"{'trace_id': '291242587496290935239848857119532985705', 'parent_id': '8161924188318385316', 'span_id': '14428269894233492734'}" -9,"{'name': 'nested3', 'kind': 1, 'parent_span_id': '14428269894233492734', 'status': 'STATUS_CODE_ERROR'}",10885632621132130757,"{'name': 'nested3', 'kind': 'SPAN_KIND_TRULENS', 'trulens.span_type': 'unknown', 'trulens.app_id': 'app_hash_baf7b2cb6402e84fa3b0b3a028d4bf65', 'trulens.record_id': '853f86c3-e3ff-4bc7-bf84-3ea2a4652235', 'trulens.unknown.nested3_ex': ['nested3 exception'], 'trulens.special.nested3_ex': ['nested3 exception'], 'trulens.unknown.selector_name': 'special', 'trulens.unknown.cows': 'moo', 'trulens.special.cows': 'moo'}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-11 16:45:54.483544,2025-01-11 16:45:54.484929,"{'trace_id': '291242587496290935239848857119532985705', 'parent_id': '14428269894233492734', 'span_id': '10885632621132130757'}" +0,"{'name': 'root', 'kind': 1, 'parent_span_id': '', 'status': 'STATUS_CODE_UNSET'}",885011916882347755,"{'name': 'root', 'trulens.span_type': 'record_root', 'trulens.app_name': 'default_app', 'trulens.app_version': 'base', 'trulens.record_id': 'f9435ad0-0aa8-4912-8577-1841c3fb9a3b', 'trulens.run_name': 'test run', 'trulens.input_id': '456', 'trulens.record_root.app_name': 'default_app', 'trulens.record_root.app_version': 'base', 'trulens.record_root.record_id': 'f9435ad0-0aa8-4912-8577-1841c3fb9a3b'}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-17 09:15:29.511397,2025-01-17 09:15:29.511639,"{'trace_id': '229793490399270739278186354077987963789', 'parent_id': '', 'span_id': '885011916882347755'}" +1,"{'name': 'respond_to_query', 'kind': 1, 'parent_span_id': '885011916882347755', 'status': 'STATUS_CODE_UNSET'}",13011168907639666049,"{'name': 'respond_to_query', 'trulens.span_type': 'main', 'trulens.app_name': 'default_app', 'trulens.app_version': 'base', 'trulens.record_id': 'f9435ad0-0aa8-4912-8577-1841c3fb9a3b', 'trulens.run_name': 'test run', 'trulens.input_id': '456', 'trulens.main.main_input': 'test', 'trulens.main.main_output': 'answer: nested: nested2: nested3'}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-17 09:15:29.511447,2025-01-17 09:15:29.511634,"{'trace_id': '229793490399270739278186354077987963789', 'parent_id': '885011916882347755', 'span_id': '13011168907639666049'}" +2,"{'name': 'nested', 'kind': 1, 'parent_span_id': '13011168907639666049', 'status': 'STATUS_CODE_UNSET'}",9906100531505755695,"{'name': 'nested', 'trulens.span_type': 'unknown', 'trulens.app_name': 'default_app', 'trulens.app_version': 'base', 'trulens.record_id': 'f9435ad0-0aa8-4912-8577-1841c3fb9a3b', 'trulens.run_name': 'test run', 'trulens.input_id': '456', 'trulens.unknown.nested_attr1': 'value1'}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-17 09:15:29.511469,2025-01-17 09:15:29.511589,"{'trace_id': '229793490399270739278186354077987963789', 'parent_id': '13011168907639666049', 'span_id': '9906100531505755695'}" +3,"{'name': 'nested2', 'kind': 1, 'parent_span_id': '9906100531505755695', 'status': 'STATUS_CODE_UNSET'}",16110296682980220575,"{'name': 'nested2', 'trulens.span_type': 'unknown', 'trulens.app_name': 'default_app', 'trulens.app_version': 'base', 'trulens.record_id': 'f9435ad0-0aa8-4912-8577-1841c3fb9a3b', 'trulens.run_name': 'test run', 'trulens.input_id': '456', 'trulens.unknown.nested2_ret': 'nested2: nested3', 'trulens.unknown.nested2_args[1]': 'test'}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-17 09:15:29.511496,2025-01-17 09:15:29.511575,"{'trace_id': '229793490399270739278186354077987963789', 'parent_id': '9906100531505755695', 'span_id': '16110296682980220575'}" +4,"{'name': 'nested3', 'kind': 1, 'parent_span_id': '16110296682980220575', 'status': 'STATUS_CODE_UNSET'}",3442080712927737532,"{'name': 'nested3', 'trulens.span_type': 'unknown', 'trulens.app_name': 'default_app', 'trulens.app_version': 'base', 'trulens.record_id': 'f9435ad0-0aa8-4912-8577-1841c3fb9a3b', 'trulens.run_name': 'test run', 'trulens.input_id': '456', 'trulens.unknown.nested3_ret': 'nested3', 'trulens.special.nested3_ret': 'nested3', 'trulens.unknown.selector_name': 'special', 'trulens.unknown.cows': 'moo', 'trulens.special.cows': 'moo'}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-17 09:15:29.511518,2025-01-17 09:15:29.511549,"{'trace_id': '229793490399270739278186354077987963789', 'parent_id': '16110296682980220575', 'span_id': '3442080712927737532'}" +5,"{'name': 'root', 'kind': 1, 'parent_span_id': '', 'status': 'STATUS_CODE_UNSET'}",15303401343977328208,"{'name': 'root', 'trulens.span_type': 'record_root', 'trulens.app_name': 'default_app', 'trulens.app_version': 'base', 'trulens.record_id': 'de41b86d-1d0a-4eff-b8d2-54dfed057c9c', 'trulens.record_root.app_name': 'default_app', 'trulens.record_root.app_version': 'base', 'trulens.record_root.record_id': 'de41b86d-1d0a-4eff-b8d2-54dfed057c9c'}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-17 09:15:29.511689,2025-01-17 09:15:29.513703,"{'trace_id': '45900063213956915984249090167208037512', 'parent_id': '', 'span_id': '15303401343977328208'}" +6,"{'name': 'respond_to_query', 'kind': 1, 'parent_span_id': '15303401343977328208', 'status': 'STATUS_CODE_UNSET'}",547417776814034864,"{'name': 'respond_to_query', 'trulens.span_type': 'main', 'trulens.app_name': 'default_app', 'trulens.app_version': 'base', 'trulens.record_id': 'de41b86d-1d0a-4eff-b8d2-54dfed057c9c', 'trulens.main.main_input': 'throw', 'trulens.main.main_output': 'answer: nested: nested2: '}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-17 09:15:29.511724,2025-01-17 09:15:29.513694,"{'trace_id': '45900063213956915984249090167208037512', 'parent_id': '15303401343977328208', 'span_id': '547417776814034864'}" +7,"{'name': 'nested', 'kind': 1, 'parent_span_id': '547417776814034864', 'status': 'STATUS_CODE_UNSET'}",11517410471449394114,"{'name': 'nested', 'trulens.span_type': 'unknown', 'trulens.app_name': 'default_app', 'trulens.app_version': 'base', 'trulens.record_id': 'de41b86d-1d0a-4eff-b8d2-54dfed057c9c', 'trulens.unknown.nested_attr1': 'value1'}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-17 09:15:29.511818,2025-01-17 09:15:29.513600,"{'trace_id': '45900063213956915984249090167208037512', 'parent_id': '547417776814034864', 'span_id': '11517410471449394114'}" +8,"{'name': 'nested2', 'kind': 1, 'parent_span_id': '11517410471449394114', 'status': 'STATUS_CODE_UNSET'}",16753019682932711026,"{'name': 'nested2', 'trulens.span_type': 'unknown', 'trulens.app_name': 'default_app', 'trulens.app_version': 'base', 'trulens.record_id': 'de41b86d-1d0a-4eff-b8d2-54dfed057c9c', 'trulens.unknown.nested2_ret': 'nested2: ', 'trulens.unknown.nested2_args[1]': 'throw'}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-17 09:15:29.511848,2025-01-17 09:15:29.513581,"{'trace_id': '45900063213956915984249090167208037512', 'parent_id': '11517410471449394114', 'span_id': '16753019682932711026'}" +9,"{'name': 'nested3', 'kind': 1, 'parent_span_id': '16753019682932711026', 'status': 'STATUS_CODE_ERROR'}",11872166416056529822,"{'name': 'nested3', 'trulens.span_type': 'unknown', 'trulens.app_name': 'default_app', 'trulens.app_version': 'base', 'trulens.record_id': 'de41b86d-1d0a-4eff-b8d2-54dfed057c9c', 'trulens.unknown.nested3_ex': ['nested3 exception'], 'trulens.special.nested3_ex': ['nested3 exception'], 'trulens.unknown.selector_name': 'special', 'trulens.unknown.cows': 'moo', 'trulens.special.cows': 'moo'}",EventRecordType.SPAN,"{'telemetry.sdk.language': 'python', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.29.0', 'service.name': 'trulens'}",2025-01-17 09:15:29.511866,2025-01-17 09:15:29.513523,"{'trace_id': '45900063213956915984249090167208037512', 'parent_id': '16753019682932711026', 'span_id': '11872166416056529822'}" diff --git a/tests/unit/test_exporter.py b/tests/unit/test_exporter.py index 0f011f751..e0eaf423d 100644 --- a/tests/unit/test_exporter.py +++ b/tests/unit/test_exporter.py @@ -4,7 +4,9 @@ from opentelemetry.proto.common.v1.common_pb2 import ArrayValue from opentelemetry.proto.common.v1.common_pb2 import KeyValue from opentelemetry.proto.common.v1.common_pb2 import KeyValueList -from trulens.experimental.otel_tracing.core.exporter import convert_to_any_value +from trulens.experimental.otel_tracing.core.exporter.utils import ( + convert_to_any_value, +) class TestExporterUtils(unittest.TestCase): diff --git a/tests/unit/test_otel_instrument.py b/tests/unit/test_otel_instrument.py index d2e746f69..d70621a99 100644 --- a/tests/unit/test_otel_instrument.py +++ b/tests/unit/test_otel_instrument.py @@ -8,9 +8,9 @@ import pandas as pd import sqlalchemy as sa from trulens.apps.custom import TruCustomApp +from trulens.core.experimental import Feature from trulens.core.schema.event import EventRecordType from trulens.core.session import TruSession -from trulens.experimental.otel_tracing.core.init import init from trulens.experimental.otel_tracing.core.instrument import instrument from trulens.otel.semconv.trace import SpanAttributes @@ -75,7 +75,9 @@ def clear_TruSession_singleton(cls) -> None: def setUpClass(cls) -> None: os.environ["TRULENS_OTEL_TRACING"] = "1" cls.clear_TruSession_singleton() - tru_session = TruSession() + tru_session = TruSession( + experimental_feature_flags=[Feature.OTEL_TRACING] + ) tru_session.experimental_enable_feature("otel_tracing") return super().setUpClass() @@ -114,19 +116,24 @@ def _convert_column_types(df: pd.DataFrame) -> None: def test_instrument_decorator(self) -> None: # Set up. - tru_session = TruSession() + tru_session = TruSession( + experimental_feature_flags=[Feature.OTEL_TRACING] + ) tru_session.reset_database() - init(tru_session, debug=True) + # Create and run app. test_app = _TestApp() custom_app = TruCustomApp(test_app) - with custom_app: + with custom_app(run_name="test run", input_id="456"): test_app.respond_to_query("test") - with custom_app: + with custom_app(): test_app.respond_to_query("throw") # Compare results to expected. GOLDEN_FILENAME = "tests/unit/static/golden/test_otel_instrument__test_instrument_decorator.csv" + + tru_session.experimental_force_flush() actual = self._get_events() + self.assertEqual(len(actual), 10) self.write_golden(GOLDEN_FILENAME, actual) expected = self.load_golden(GOLDEN_FILENAME)