diff --git a/examples/experimental/otel_exporter.ipynb b/examples/experimental/otel_exporter.ipynb index bb75e1d03..a3a145b3e 100644 --- a/examples/experimental/otel_exporter.ipynb +++ b/examples/experimental/otel_exporter.ipynb @@ -1,153 +1,14 @@ { - "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, - "metadata": {}, - "outputs": [], - "source": [ - "from pathlib import Path\n", - "import sys\n", - "\n", - "# Add base dir to path to be able to access test folder.\n", - "base_dir = Path().cwd().parent.parent.resolve()\n", - "if str(base_dir) not in sys.path:\n", - " print(f\"Adding {base_dir} to sys.path\")\n", - " sys.path.append(str(base_dir))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "\n", - "root = logging.getLogger()\n", - "root.setLevel(logging.DEBUG)\n", - "handler = logging.StreamHandler(sys.stdout)\n", - "handler.setLevel(logging.DEBUG)\n", - "handler.addFilter(logging.Filter(\"trulens\"))\n", - "formatter = logging.Formatter(\n", - " \"%(asctime)s - %(name)s - %(levelname)s - %(message)s\"\n", - ")\n", - "handler.setFormatter(formatter)\n", - "root.addHandler(handler)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from trulens.experimental.otel_tracing.core.instrument import instrument\n", - "\n", - "\n", - "class TestApp:\n", - " @instrument()\n", - " def respond_to_query(self, query: str) -> str:\n", - " return f\"answer: {self.nested(query)}\"\n", - "\n", - " @instrument(attributes={\"nested_attr1\": \"value1\"})\n", - " def nested(self, query: str) -> str:\n", - " return f\"nested: {self.nested2(query)}\"\n", - "\n", - " @instrument(\n", - " attributes=lambda ret, exception, *args, **kwargs: {\n", - " \"nested2_ret\": ret,\n", - " \"nested2_args[0]\": args[0],\n", - " }\n", - " )\n", - " def nested2(self, query: str) -> str:\n", - " nested_result = \"\"\n", - "\n", - " try:\n", - " nested_result = self.nested3(query)\n", - " except Exception:\n", - " pass\n", - "\n", - " return f\"nested2: {nested_result}\"\n", - "\n", - " @instrument(\n", - " attributes=lambda ret, exception, *args, **kwargs: {\n", - " \"nested3_ex\": exception.args if exception else None,\n", - " \"nested3_ret\": ret,\n", - " \"selector_name\": \"special\",\n", - " \"cows\": \"moo\",\n", - " }\n", - " )\n", - " def nested3(self, query: str) -> str:\n", - " if query == \"throw\":\n", - " raise ValueError(\"nested3 exception\")\n", - " return \"nested3\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import dotenv\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", - "init(session, debug=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from trulens.apps.custom import TruCustomApp\n", - "\n", - "test_app = TestApp()\n", - "custom_app = TruCustomApp(test_app)\n", - "\n", - "with custom_app as recording:\n", - " test_app.respond_to_query(\"test\")\n", - "\n", - "with custom_app as recording:\n", - " test_app.respond_to_query(\"throw\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "trulens", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# !pip install opentelemetry-api\n", + "# !pip install opentelemetry-sdk" + ] }, { "cell_type": "code", @@ -204,13 +65,33 @@ " return f\"nested: {self.nested2(query)}\"\n", "\n", " @instrument(\n", - " attributes=lambda ret, *args, **kwargs: {\n", + " attributes=lambda ret, exception, *args, **kwargs: {\n", " \"nested2_ret\": ret,\n", " \"nested2_args[0]\": args[0],\n", " }\n", " )\n", " def nested2(self, query: str) -> str:\n", - " return f\"nested2: {query}\"" + " nested_result = \"\"\n", + "\n", + " try:\n", + " nested_result = self.nested3(query)\n", + " except Exception:\n", + " pass\n", + "\n", + " return f\"nested2: {nested_result}\"\n", + "\n", + " @instrument(\n", + " attributes=lambda ret, exception, *args, **kwargs: {\n", + " \"nested3_ex\": exception.args if exception else None,\n", + " \"nested3_ret\": ret,\n", + " \"selector_name\": \"special\",\n", + " \"cows\": \"moo\",\n", + " }\n", + " )\n", + " def nested3(self, query: str) -> str:\n", + " if query == \"throw\":\n", + " raise ValueError(\"nested3 exception\")\n", + " return \"nested3\"" ] }, { @@ -243,7 +124,10 @@ "custom_app = TruCustomApp(test_app)\n", "\n", "with custom_app as recording:\n", - " test_app.respond_to_query(\"test\")" + " test_app.respond_to_query(\"test\")\n", + "\n", + "with custom_app as recording:\n", + " test_app.respond_to_query(\"throw\")" ] } ], diff --git a/src/core/trulens/experimental/otel_tracing/core/instrument.py b/src/core/trulens/experimental/otel_tracing/core/instrument.py index 18f758b1c..e5e7d33cc 100644 --- a/src/core/trulens/experimental/otel_tracing/core/instrument.py +++ b/src/core/trulens/experimental/otel_tracing/core/instrument.py @@ -1,11 +1,7 @@ from functools import wraps import logging -<<<<<<< HEAD from typing import Any, Callable, Dict, Optional, Union -======= -from typing import Any, Callable, Optional, Union import uuid ->>>>>>> ae0e4d895 (draft) from opentelemetry import trace from opentelemetry.baggage import get_baggage @@ -14,12 +10,6 @@ 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 -<<<<<<< HEAD -======= -from trulens.experimental.otel_tracing.core.semantic import ( - TRULENS_SELECTOR_NAME, -) ->>>>>>> 41ef4d524 (draft) from trulens.otel.semconv.trace import SpanAttributes logger = logging.getLogger(__name__) @@ -93,21 +83,17 @@ def wrapper(*args, **kwargs): func_exception: Optional[Exception] = None attributes_exception: Optional[Exception] = None -<<<<<<< HEAD try: ret = func(*args, **kwargs) except Exception as e: # We want to get into the next clause to allow the users to still add attributes. # It's on the user to deal with None as a return value. -<<<<<<< HEAD func_exception = e -======= - exception = e -======= + span.set_attribute("name", func.__name__) span.set_attribute("kind", "SPAN_KIND_TRULENS") span.set_attribute( - "parent_span_id", parent_span.get_span_context().span_id + "parent_span_id", span.get_span_context().span_id ) span.set_attribute( SpanAttributes.RECORD_ID, @@ -115,8 +101,6 @@ def wrapper(*args, **kwargs): ) ret = func(*args, **kwargs) ->>>>>>> 41ef4d524 (draft) ->>>>>>> ae0e4d895 (draft) try: attributes_to_add = {}