monocle-apptrace 0.4.0b1__tar.gz → 0.4.0b3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of monocle-apptrace might be problematic. Click here for more details.
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/CHANGELOG.md +12 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/PKG-INFO +22 -18
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/pyproject.toml +22 -18
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/common/constants.py +4 -4
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/common/span_handler.py +54 -28
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/common/utils.py +28 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/common/wrapper.py +89 -73
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/common/wrapper_method.py +3 -1
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/flask/_helper.py +1 -1
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/haystack/_helper.py +1 -1
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/haystack/entities/inference.py +1 -1
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langchain/entities/inference.py +1 -1
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/entities/inference.py +1 -1
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/openai/_helper.py +26 -5
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/openai/entities/inference.py +11 -1
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/openai/methods.py +6 -6
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/teamsai/_helper.py +37 -5
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/teamsai/entities/inference/actionplanner_output_processor.py +12 -32
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/teamsai/entities/inference/teamsai_output_processor.py +14 -16
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/.gitignore +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/CODEOWNERS.md +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/CODE_OF_CONDUCT.md +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/CONTRIBUTING.md +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/COPYRIGHT.template +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/LICENSE +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/MAINTAINER.md +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/Monocle_User_Guide.md +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/Monocle_committer_guide.md +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/Monocle_contributor_guide.md +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/NOTICE +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/README.md +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/SECURITY.md +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/README.md +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/__main__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/exporters/aws/s3_exporter.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/exporters/aws/s3_exporter_opendal.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/exporters/azure/blob_exporter.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/exporters/azure/blob_exporter_opendal.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/exporters/base_exporter.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/exporters/exporter_processor.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/exporters/file_exporter.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/exporters/monocle_exporters.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/exporters/okahu/okahu_exporter.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/common/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/common/instrumentor.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/common/tracing.md +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/aiohttp/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/aiohttp/_helper.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/aiohttp/entities/http.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/aiohttp/methods.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/anthropic/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/anthropic/_helper.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/anthropic/entities/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/anthropic/entities/inference.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/anthropic/methods.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/botocore/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/botocore/_helper.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/botocore/entities/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/botocore/entities/inference.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/botocore/handlers/botocore_span_handler.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/botocore/methods.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/flask/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/flask/entities/http.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/flask/methods.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/haystack/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/haystack/entities/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/haystack/entities/retrieval.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/haystack/methods.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langchain/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langchain/_helper.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langchain/entities/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langchain/entities/retrieval.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langchain/methods.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langgraph/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langgraph/_helper.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langgraph/entities/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langgraph/entities/inference.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langgraph/methods.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/_helper.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/entities/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/entities/agent.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/entities/retrieval.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/methods.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/openai/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/openai/entities/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/openai/entities/retrieval.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/requests/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/requests/_helper.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/requests/entities/http.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/requests/methods.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/teamsai/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/teamsai/entities/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/teamsai/entities/inference/__init__.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/teamsai/methods.py +0 -0
- {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/tox.ini +0 -0
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
## Version 0.4.0b3 (2025-05-28)
|
|
2
|
+
|
|
3
|
+
- Record input and errors for inference.modelapi in case of error ([#193](https://github.com/monocle2ai/monocle/pull/193))
|
|
4
|
+
- Removed special handling for streaming in wrapper ([#192](https://github.com/monocle2ai/monocle/pull/192))
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
## Version 0.4.0b2 (2025-05-21)
|
|
8
|
+
|
|
9
|
+
- Add Span error handling ([#186](https://github.com/monocle2ai/monocle/pull/186))
|
|
10
|
+
- Add teams ai enhancements ([#184](https://github.com/monocle2ai/monocle/pull/184))
|
|
11
|
+
|
|
12
|
+
|
|
1
13
|
## Version 0.4.0b1 (2025-05-14)
|
|
2
14
|
|
|
3
15
|
- Added conversation id in scope for teams ai bot ([#180](https://github.com/monocle2ai/monocle/pull/180))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: monocle_apptrace
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.0b3
|
|
4
4
|
Summary: package with monocle genAI tracing
|
|
5
5
|
Project-URL: Homepage, https://github.com/monocle2ai/monocle
|
|
6
6
|
Project-URL: Issues, https://github.com/monocle2ai/monocle/issues
|
|
@@ -16,40 +16,44 @@ Requires-Dist: opentelemetry-sdk>=1.21.0
|
|
|
16
16
|
Requires-Dist: requests
|
|
17
17
|
Requires-Dist: wrapt>=1.14.0
|
|
18
18
|
Provides-Extra: aws
|
|
19
|
-
Requires-Dist: boto3==1.
|
|
19
|
+
Requires-Dist: boto3==1.37.24; extra == 'aws'
|
|
20
20
|
Provides-Extra: azure
|
|
21
21
|
Requires-Dist: azure-storage-blob==12.22.0; extra == 'azure'
|
|
22
22
|
Provides-Extra: dev
|
|
23
|
-
Requires-Dist: anthropic
|
|
23
|
+
Requires-Dist: anthropic-haystack; extra == 'dev'
|
|
24
|
+
Requires-Dist: anthropic==0.52.0; extra == 'dev'
|
|
24
25
|
Requires-Dist: azure-storage-blob==12.22.0; extra == 'dev'
|
|
25
|
-
Requires-Dist: boto3==1.
|
|
26
|
-
Requires-Dist: chromadb==0.
|
|
26
|
+
Requires-Dist: boto3==1.37.24; extra == 'dev'
|
|
27
|
+
Requires-Dist: chromadb==1.0.10; extra == 'dev'
|
|
27
28
|
Requires-Dist: datasets==2.20.0; extra == 'dev'
|
|
28
29
|
Requires-Dist: faiss-cpu==1.8.0; extra == 'dev'
|
|
29
30
|
Requires-Dist: flask; extra == 'dev'
|
|
30
31
|
Requires-Dist: haystack-ai==2.3.0; extra == 'dev'
|
|
31
32
|
Requires-Dist: instructorembedding==1.0.1; extra == 'dev'
|
|
32
|
-
Requires-Dist: langchain-
|
|
33
|
-
Requires-Dist: langchain-
|
|
34
|
-
Requires-Dist: langchain-
|
|
35
|
-
Requires-Dist: langchain-
|
|
36
|
-
Requires-Dist: langchain-
|
|
37
|
-
Requires-Dist: langchain==0.
|
|
33
|
+
Requires-Dist: langchain-anthropic==0.3.13; extra == 'dev'
|
|
34
|
+
Requires-Dist: langchain-aws==0.2.23; extra == 'dev'
|
|
35
|
+
Requires-Dist: langchain-chroma==0.2.4; extra == 'dev'
|
|
36
|
+
Requires-Dist: langchain-community==0.3.24; extra == 'dev'
|
|
37
|
+
Requires-Dist: langchain-mistralai==0.2.10; extra == 'dev'
|
|
38
|
+
Requires-Dist: langchain-openai==0.3.18; extra == 'dev'
|
|
39
|
+
Requires-Dist: langchain==0.3.25; extra == 'dev'
|
|
38
40
|
Requires-Dist: langchainhub==0.1.21; extra == 'dev'
|
|
39
41
|
Requires-Dist: langgraph==0.2.68; extra == 'dev'
|
|
40
|
-
Requires-Dist: llama-index-embeddings-huggingface==0.
|
|
41
|
-
Requires-Dist: llama-index-llms-
|
|
42
|
-
Requires-Dist: llama-index-llms-
|
|
43
|
-
Requires-Dist: llama-index-
|
|
44
|
-
Requires-Dist: llama-index-vector-stores-
|
|
45
|
-
Requires-Dist: llama-index==0.
|
|
42
|
+
Requires-Dist: llama-index-embeddings-huggingface==0.5.4; extra == 'dev'
|
|
43
|
+
Requires-Dist: llama-index-llms-anthropic==0.6.19; extra == 'dev'
|
|
44
|
+
Requires-Dist: llama-index-llms-azure-openai==0.3.2; extra == 'dev'
|
|
45
|
+
Requires-Dist: llama-index-llms-mistralai==0.4.0; extra == 'dev'
|
|
46
|
+
Requires-Dist: llama-index-vector-stores-chroma==0.4.1; extra == 'dev'
|
|
47
|
+
Requires-Dist: llama-index-vector-stores-opensearch==0.5.4; extra == 'dev'
|
|
48
|
+
Requires-Dist: llama-index==0.12.37; extra == 'dev'
|
|
46
49
|
Requires-Dist: mistral-haystack==0.0.2; extra == 'dev'
|
|
47
50
|
Requires-Dist: numpy==1.26.4; extra == 'dev'
|
|
48
51
|
Requires-Dist: opendal==0.45.14; extra == 'dev'
|
|
49
52
|
Requires-Dist: opensearch-haystack==1.2.0; extra == 'dev'
|
|
50
53
|
Requires-Dist: opentelemetry-instrumentation-flask; extra == 'dev'
|
|
51
54
|
Requires-Dist: parameterized==0.9.0; extra == 'dev'
|
|
52
|
-
Requires-Dist: pytest==
|
|
55
|
+
Requires-Dist: pytest-asyncio==0.26.0; extra == 'dev'
|
|
56
|
+
Requires-Dist: pytest==8.3.5; extra == 'dev'
|
|
53
57
|
Requires-Dist: requests-aws4auth==1.2.3; extra == 'dev'
|
|
54
58
|
Requires-Dist: sentence-transformers==2.6.1; extra == 'dev'
|
|
55
59
|
Requires-Dist: types-requests==2.31.0.20240106; extra == 'dev'
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "monocle_apptrace"
|
|
7
|
-
version = "0.4.
|
|
7
|
+
version = "0.4.0b3"
|
|
8
8
|
authors = []
|
|
9
9
|
description = "package with monocle genAI tracing"
|
|
10
10
|
readme = "README.md"
|
|
@@ -41,39 +41,43 @@ markers = [
|
|
|
41
41
|
|
|
42
42
|
[project.optional-dependencies]
|
|
43
43
|
dev = [
|
|
44
|
-
'langchain-openai==0.
|
|
45
|
-
'langchain-chroma==0.
|
|
46
|
-
'langchain-community==0.
|
|
47
|
-
'langchain==0.
|
|
44
|
+
'langchain-openai==0.3.18',
|
|
45
|
+
'langchain-chroma==0.2.4',
|
|
46
|
+
'langchain-community==0.3.24',
|
|
47
|
+
'langchain==0.3.25',
|
|
48
48
|
'datasets==2.20.0',
|
|
49
49
|
'numpy==1.26.4',
|
|
50
50
|
'types-requests==2.31.0.20240106',
|
|
51
51
|
'InstructorEmbedding==1.0.1',
|
|
52
52
|
'sentence-transformers==2.6.1',
|
|
53
53
|
'faiss-cpu==1.8.0',
|
|
54
|
-
'pytest==8.
|
|
55
|
-
'llama-index==0.
|
|
56
|
-
'llama-index-embeddings-huggingface==0.
|
|
57
|
-
'llama-index-vector-stores-chroma==0.1
|
|
54
|
+
'pytest==8.3.5',
|
|
55
|
+
'llama-index==0.12.37',
|
|
56
|
+
'llama-index-embeddings-huggingface==0.5.4',
|
|
57
|
+
'llama-index-vector-stores-chroma==0.4.1',
|
|
58
58
|
'parameterized==0.9.0',
|
|
59
|
-
'llama-index-llms-mistralai==0.
|
|
60
|
-
'langchain-mistralai==0.
|
|
59
|
+
'llama-index-llms-mistralai==0.4.0',
|
|
60
|
+
'langchain-mistralai==0.2.10',
|
|
61
61
|
'mistral-haystack==0.0.2',
|
|
62
|
-
'langchain-aws==0.
|
|
62
|
+
'langchain-aws==0.2.23',
|
|
63
63
|
'azure-storage-blob==12.22.0', # this is for blob exporter
|
|
64
|
-
'boto3==1.
|
|
65
|
-
'llama-index-vector-stores-opensearch==0.
|
|
64
|
+
'boto3==1.37.24', # this is for aws exporter
|
|
65
|
+
'llama-index-vector-stores-opensearch==0.5.4',
|
|
66
66
|
'haystack-ai==2.3.0',
|
|
67
|
-
'llama-index-llms-azure-openai==0.
|
|
67
|
+
'llama-index-llms-azure-openai==0.3.2',
|
|
68
68
|
'requests-aws4auth==1.2.3',
|
|
69
69
|
'opensearch-haystack==1.2.0',
|
|
70
70
|
'langchainhub==0.1.21',
|
|
71
|
-
'chromadb==0.
|
|
71
|
+
'chromadb==1.0.10',
|
|
72
72
|
'flask',
|
|
73
73
|
'opentelemetry-instrumentation-flask',
|
|
74
74
|
'langgraph==0.2.68',
|
|
75
75
|
'opendal==0.45.14',
|
|
76
|
-
'anthropic==0.
|
|
76
|
+
'anthropic==0.52.0',
|
|
77
|
+
'anthropic-haystack',
|
|
78
|
+
'pytest-asyncio==0.26.0',
|
|
79
|
+
'llama-index-llms-anthropic==0.6.19',
|
|
80
|
+
'langchain-anthropic==0.3.13'
|
|
77
81
|
]
|
|
78
82
|
|
|
79
83
|
azure = [
|
|
@@ -81,7 +85,7 @@ azure = [
|
|
|
81
85
|
]
|
|
82
86
|
|
|
83
87
|
aws = [
|
|
84
|
-
'boto3==1.
|
|
88
|
+
'boto3==1.37.24',
|
|
85
89
|
]
|
|
86
90
|
|
|
87
91
|
[project.urls]
|
|
@@ -14,10 +14,10 @@ GITHUB_CODESPACE_IDENTIFIER_ENV_NAME = "GITHUB_REPOSITORY"
|
|
|
14
14
|
# Azure naming reference can be found here
|
|
15
15
|
# https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations
|
|
16
16
|
# https://docs.aws.amazon.com/resource-explorer/latest/userguide/supported-resource-types.html#services-lookoutmetrics
|
|
17
|
-
AZURE_FUNCTION_NAME = "
|
|
18
|
-
AZURE_APP_SERVICE_NAME = "
|
|
19
|
-
AZURE_ML_SERVICE_NAME = "
|
|
20
|
-
AWS_LAMBDA_SERVICE_NAME = "
|
|
17
|
+
AZURE_FUNCTION_NAME = "azure_func"
|
|
18
|
+
AZURE_APP_SERVICE_NAME = "azure_webapp"
|
|
19
|
+
AZURE_ML_SERVICE_NAME = "azure_ml"
|
|
20
|
+
AWS_LAMBDA_SERVICE_NAME = "aws_lambda"
|
|
21
21
|
GITHUB_CODESPACE_SERVICE_NAME = "github_codespace"
|
|
22
22
|
|
|
23
23
|
# Env variables to identify infra service type
|
|
@@ -42,8 +42,17 @@ class SpanHandler:
|
|
|
42
42
|
def skip_span(self, to_wrap, wrapped, instance, args, kwargs) -> bool:
|
|
43
43
|
return False
|
|
44
44
|
|
|
45
|
-
def skip_processor(self, to_wrap, wrapped, instance, args, kwargs) ->
|
|
46
|
-
return
|
|
45
|
+
def skip_processor(self, to_wrap, wrapped, instance, span, args, kwargs) -> list[str]:
|
|
46
|
+
return []
|
|
47
|
+
|
|
48
|
+
def set_span_type(self, to_wrap, wrapped, instance, output_processor, span:Span, args, kwargs) -> str:
|
|
49
|
+
span_type:str = None
|
|
50
|
+
if 'type' in output_processor:
|
|
51
|
+
span_type = output_processor['type']
|
|
52
|
+
span.set_attribute("span.type", span_type)
|
|
53
|
+
else:
|
|
54
|
+
logger.warning("type of span not found or incorrect written in entity json")
|
|
55
|
+
return span_type
|
|
47
56
|
|
|
48
57
|
def pre_task_processing(self, to_wrap, wrapped, instance, args,kwargs, span):
|
|
49
58
|
if "pipeline" in to_wrap['package']:
|
|
@@ -69,30 +78,32 @@ class SpanHandler:
|
|
|
69
78
|
workflow_name = SpanHandler.get_workflow_name(span=span)
|
|
70
79
|
if workflow_name:
|
|
71
80
|
span.set_attribute("workflow.name", workflow_name)
|
|
81
|
+
span.set_attribute("span.type", "generic")
|
|
72
82
|
|
|
73
83
|
def post_task_processing(self, to_wrap, wrapped, instance, args, kwargs, result, span:Span):
|
|
74
|
-
|
|
75
|
-
span.set_status(StatusCode.OK)
|
|
84
|
+
pass
|
|
76
85
|
|
|
77
|
-
def hydrate_span(self, to_wrap, wrapped, instance, args, kwargs, result, span) -> bool:
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
86
|
+
def hydrate_span(self, to_wrap, wrapped, instance, args, kwargs, result, span, parent_span = None, ex:Exception = None) -> bool:
|
|
87
|
+
try:
|
|
88
|
+
detected_error_in_attribute = self.hydrate_attributes(to_wrap, wrapped, instance, args, kwargs, result, span)
|
|
89
|
+
detected_error_in_event = self.hydrate_events(to_wrap, wrapped, instance, args, kwargs, result, span, parent_span, ex)
|
|
90
|
+
if detected_error_in_attribute or detected_error_in_event:
|
|
91
|
+
span.set_attribute(MONOCLE_DETECTED_SPAN_ERROR, True)
|
|
92
|
+
finally:
|
|
93
|
+
if span.status.status_code == StatusCode.UNSET and ex is None:
|
|
94
|
+
span.set_status(StatusCode.OK)
|
|
82
95
|
|
|
83
96
|
def hydrate_attributes(self, to_wrap, wrapped, instance, args, kwargs, result, span:Span) -> bool:
|
|
84
97
|
detected_error:bool = False
|
|
85
98
|
span_index = 0
|
|
86
99
|
if SpanHandler.is_root_span(span):
|
|
87
100
|
span_index = 2 # root span will have workflow and hosting entities pre-populated
|
|
88
|
-
if
|
|
89
|
-
'output_processor' in to_wrap and to_wrap["output_processor"] is not None):
|
|
101
|
+
if 'output_processor' in to_wrap and to_wrap["output_processor"] is not None:
|
|
90
102
|
output_processor=to_wrap['output_processor']
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if 'attributes' in output_processor:
|
|
103
|
+
self.set_span_type(to_wrap, wrapped, instance, output_processor, span, args, kwargs)
|
|
104
|
+
skip_processors:list[str] = self.skip_processor(to_wrap, wrapped, instance, span, args, kwargs) or []
|
|
105
|
+
|
|
106
|
+
if 'attributes' in output_processor and 'attributes' not in skip_processors:
|
|
96
107
|
for processors in output_processor["attributes"]:
|
|
97
108
|
for processor in processors:
|
|
98
109
|
attribute = processor.get('attribute')
|
|
@@ -113,10 +124,6 @@ class SpanHandler:
|
|
|
113
124
|
else:
|
|
114
125
|
logger.debug(f"{' and '.join([key for key in ['attribute', 'accessor'] if not processor.get(key)])} not found or incorrect in entity JSON")
|
|
115
126
|
span_index += 1
|
|
116
|
-
else:
|
|
117
|
-
logger.debug("attributes not found or incorrect written in entity json")
|
|
118
|
-
else:
|
|
119
|
-
span.set_attribute("span.type", "generic")
|
|
120
127
|
|
|
121
128
|
# set scopes as attributes by calling get_scopes()
|
|
122
129
|
# scopes is a Mapping[str:object], iterate directly with .items()
|
|
@@ -127,16 +134,21 @@ class SpanHandler:
|
|
|
127
134
|
span.set_attribute("entity.count", span_index)
|
|
128
135
|
return detected_error
|
|
129
136
|
|
|
130
|
-
def hydrate_events(self, to_wrap, wrapped, instance, args, kwargs, ret_result, span) -> bool:
|
|
137
|
+
def hydrate_events(self, to_wrap, wrapped, instance, args, kwargs, ret_result, span, parent_span=None, ex:Exception=None) -> bool:
|
|
131
138
|
detected_error:bool = False
|
|
132
|
-
if
|
|
133
|
-
'output_processor' in to_wrap and to_wrap["output_processor"] is not None):
|
|
139
|
+
if 'output_processor' in to_wrap and to_wrap["output_processor"] is not None:
|
|
134
140
|
output_processor=to_wrap['output_processor']
|
|
135
|
-
|
|
136
|
-
|
|
141
|
+
skip_processors:list[str] = self.skip_processor(to_wrap, wrapped, instance, span, args, kwargs) or []
|
|
142
|
+
|
|
143
|
+
arguments = {"instance": instance, "args": args, "kwargs": kwargs, "result": ret_result, "exception":ex}
|
|
144
|
+
# Process events if they are defined in the output_processor.
|
|
145
|
+
# In case of inference.modelapi skip the event processing unless the span has an exception
|
|
146
|
+
if 'events' in output_processor and ('events' not in skip_processors or ex is not None):
|
|
137
147
|
events = output_processor['events']
|
|
138
148
|
for event in events:
|
|
139
149
|
event_name = event.get("name")
|
|
150
|
+
if 'events.'+event_name in skip_processors and ex is None:
|
|
151
|
+
continue
|
|
140
152
|
event_attributes = {}
|
|
141
153
|
attributes = event.get("attributes", [])
|
|
142
154
|
for attribute in attributes:
|
|
@@ -231,7 +243,7 @@ class SpanHandler:
|
|
|
231
243
|
|
|
232
244
|
@staticmethod
|
|
233
245
|
@contextmanager
|
|
234
|
-
def workflow_type(to_wrap=None):
|
|
246
|
+
def workflow_type(to_wrap=None, span:Span=None):
|
|
235
247
|
token = SpanHandler.attach_workflow_type(to_wrap)
|
|
236
248
|
try:
|
|
237
249
|
yield
|
|
@@ -241,6 +253,20 @@ class SpanHandler:
|
|
|
241
253
|
|
|
242
254
|
class NonFrameworkSpanHandler(SpanHandler):
|
|
243
255
|
|
|
256
|
+
def get_workflow_name_in_progress(self) -> str:
|
|
257
|
+
return get_value(WORKFLOW_TYPE_KEY)
|
|
258
|
+
|
|
259
|
+
def is_framework_span_in_progess(self) -> bool:
|
|
260
|
+
return self.get_workflow_name_in_progress() in WORKFLOW_TYPE_MAP.values()
|
|
261
|
+
|
|
244
262
|
# If the language framework is being executed, then skip generating direct openAI attributes and events
|
|
245
|
-
def skip_processor(self, to_wrap, wrapped, instance, args, kwargs) ->
|
|
246
|
-
|
|
263
|
+
def skip_processor(self, to_wrap, wrapped, instance, span, args, kwargs) -> list[str]:
|
|
264
|
+
if self.is_framework_span_in_progess():
|
|
265
|
+
return ["attributes", "events"]
|
|
266
|
+
|
|
267
|
+
def set_span_type(self, to_wrap, wrapped, instance, output_processor, span:Span, args, kwargs) -> str:
|
|
268
|
+
span_type = super().set_span_type(to_wrap, wrapped, instance, output_processor, span, args, kwargs)
|
|
269
|
+
if self.is_framework_span_in_progess() and span_type is not None:
|
|
270
|
+
span_type = span_type+".modelapi"
|
|
271
|
+
span.set_attribute("span.type", span_type)
|
|
272
|
+
return span_type
|
|
@@ -236,6 +236,13 @@ def set_scopes_from_baggage(baggage_context:Context):
|
|
|
236
236
|
scope_name = scope_key[len(MONOCLE_SCOPE_NAME_PREFIX):]
|
|
237
237
|
set_scope(scope_name, scope_value)
|
|
238
238
|
|
|
239
|
+
def get_parent_span() -> Span:
|
|
240
|
+
parent_span: Span = None
|
|
241
|
+
_parent_span_context = get_current()
|
|
242
|
+
if _parent_span_context is not None and _parent_span_context.get(_SPAN_KEY, None):
|
|
243
|
+
parent_span = _parent_span_context.get(_SPAN_KEY, None)
|
|
244
|
+
return parent_span
|
|
245
|
+
|
|
239
246
|
def extract_http_headers(headers) -> object:
|
|
240
247
|
global http_scopes
|
|
241
248
|
trace_context:Context = extract(headers, context=get_current())
|
|
@@ -362,6 +369,27 @@ def get_llm_type(instance):
|
|
|
362
369
|
except:
|
|
363
370
|
pass
|
|
364
371
|
|
|
372
|
+
def get_status(arguments):
|
|
373
|
+
if arguments['exception'] is not None:
|
|
374
|
+
return 'error'
|
|
375
|
+
else:
|
|
376
|
+
return 'success'
|
|
377
|
+
|
|
378
|
+
def get_exception_status_code(arguments):
|
|
379
|
+
if arguments['exception'] is not None and hasattr(arguments['exception'], 'code'):
|
|
380
|
+
return arguments['exception'].code
|
|
381
|
+
else:
|
|
382
|
+
return 'error'
|
|
383
|
+
|
|
384
|
+
def get_exception_message(arguments):
|
|
385
|
+
if arguments['exception'] is not None:
|
|
386
|
+
if hasattr(arguments['exception'], 'message'):
|
|
387
|
+
return arguments['exception'].message
|
|
388
|
+
else:
|
|
389
|
+
return arguments['exception'].__str__()
|
|
390
|
+
else:
|
|
391
|
+
return ''
|
|
392
|
+
|
|
365
393
|
def patch_instance_method(obj, method_name, func):
|
|
366
394
|
"""
|
|
367
395
|
Patch a special method (like __iter__) for a single instance.
|
|
@@ -9,7 +9,8 @@ from monocle_apptrace.instrumentation.common.utils import (
|
|
|
9
9
|
set_scopes,
|
|
10
10
|
with_tracer_wrapper,
|
|
11
11
|
set_scope,
|
|
12
|
-
remove_scope
|
|
12
|
+
remove_scope,
|
|
13
|
+
get_parent_span
|
|
13
14
|
)
|
|
14
15
|
from monocle_apptrace.instrumentation.common.constants import WORKFLOW_TYPE_KEY, ADD_NEW_WORKFLOW
|
|
15
16
|
logger = logging.getLogger(__name__)
|
|
@@ -30,12 +31,22 @@ def pre_process_span(name, tracer, handler, add_workflow_span, to_wrap, wrapped,
|
|
|
30
31
|
SpanHandler.set_workflow_properties(span, to_wrap)
|
|
31
32
|
else:
|
|
32
33
|
SpanHandler.set_non_workflow_properties(span)
|
|
33
|
-
|
|
34
|
+
try:
|
|
35
|
+
handler.pre_task_processing(to_wrap, wrapped, instance, args, kwargs, span)
|
|
36
|
+
except Exception as e:
|
|
37
|
+
logger.info(f"Warning: Error occurred in pre_task_processing: {e}")
|
|
34
38
|
|
|
35
|
-
def post_process_span(handler, to_wrap, wrapped, instance, args, kwargs, return_value, span):
|
|
39
|
+
def post_process_span(handler, to_wrap, wrapped, instance, args, kwargs, return_value, span, parent_span=None, ex = None):
|
|
36
40
|
if not (SpanHandler.is_root_span(span) or get_value(ADD_NEW_WORKFLOW) == True):
|
|
37
|
-
|
|
38
|
-
|
|
41
|
+
try:
|
|
42
|
+
handler.hydrate_span(to_wrap, wrapped, instance, args, kwargs, return_value, span, parent_span, ex)
|
|
43
|
+
except Exception as e:
|
|
44
|
+
logger.info(f"Warning: Error occurred in hydrate_span: {e}")
|
|
45
|
+
|
|
46
|
+
try:
|
|
47
|
+
handler.post_task_processing(to_wrap, wrapped, instance, args, kwargs, return_value, span)
|
|
48
|
+
except Exception as e:
|
|
49
|
+
logger.info(f"Warning: Error occurred in post_task_processing: {e}")
|
|
39
50
|
|
|
40
51
|
def get_span_name(to_wrap, instance):
|
|
41
52
|
if to_wrap.get("span_name"):
|
|
@@ -49,44 +60,45 @@ def monocle_wrapper_span_processor(tracer: Tracer, handler: SpanHandler, to_wrap
|
|
|
49
60
|
name = get_span_name(to_wrap, instance)
|
|
50
61
|
return_value = None
|
|
51
62
|
span_status = None
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
if SpanHandler.is_root_span(span) or add_workflow_span:
|
|
57
|
-
# Recursive call for the actual span
|
|
58
|
-
return_value, span_status = monocle_wrapper_span_processor(tracer, handler, to_wrap, wrapped, instance, source_path, False, args, kwargs)
|
|
59
|
-
span.set_status(span_status)
|
|
60
|
-
else:
|
|
61
|
-
with SpanHandler.workflow_type(to_wrap):
|
|
62
|
-
return_value = wrapped(*args, **kwargs)
|
|
63
|
-
post_process_span(handler, to_wrap, wrapped, instance, args, kwargs, return_value, span)
|
|
64
|
-
span_status = span.status
|
|
65
|
-
else:
|
|
66
|
-
span = tracer.start_span(name)
|
|
67
|
-
|
|
63
|
+
auto_close_span = get_auto_close_span(to_wrap, kwargs)
|
|
64
|
+
parent_span = get_parent_span()
|
|
65
|
+
with tracer.start_as_current_span(name, end_on_exit=auto_close_span) as span:
|
|
68
66
|
pre_process_span(name, tracer, handler, add_workflow_span, to_wrap, wrapped, instance, args, kwargs, span, source_path)
|
|
69
67
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
span.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
68
|
+
if SpanHandler.is_root_span(span) or add_workflow_span:
|
|
69
|
+
# Recursive call for the actual span
|
|
70
|
+
return_value, span_status = monocle_wrapper_span_processor(tracer, handler, to_wrap, wrapped, instance, source_path, False, args, kwargs)
|
|
71
|
+
span.set_status(span_status)
|
|
72
|
+
if not auto_close_span:
|
|
73
|
+
span.end()
|
|
74
|
+
else:
|
|
75
|
+
ex:Exception = None
|
|
76
|
+
try:
|
|
77
|
+
with SpanHandler.workflow_type(to_wrap, span):
|
|
78
|
+
return_value = wrapped(*args, **kwargs)
|
|
79
|
+
except Exception as e:
|
|
80
|
+
ex = e
|
|
81
|
+
raise
|
|
82
|
+
finally:
|
|
83
|
+
def post_process_span_internal(ret_val):
|
|
84
|
+
post_process_span(handler, to_wrap, wrapped, instance, args, kwargs, ret_val, span, parent_span ,ex)
|
|
85
|
+
if not auto_close_span:
|
|
86
|
+
span.end()
|
|
87
|
+
if ex is None and not auto_close_span and to_wrap.get("output_processor") and to_wrap.get("output_processor").get("response_processor"):
|
|
88
|
+
to_wrap.get("output_processor").get("response_processor")(to_wrap, return_value, post_process_span_internal)
|
|
89
|
+
else:
|
|
90
|
+
post_process_span_internal(return_value)
|
|
91
|
+
span_status = span.status
|
|
83
92
|
return return_value, span_status
|
|
84
93
|
|
|
85
94
|
def monocle_wrapper(tracer: Tracer, handler: SpanHandler, to_wrap, wrapped, instance, source_path, args, kwargs):
|
|
86
95
|
return_value = None
|
|
87
96
|
token = None
|
|
88
97
|
try:
|
|
89
|
-
|
|
98
|
+
try:
|
|
99
|
+
handler.pre_tracing(to_wrap, wrapped, instance, args, kwargs)
|
|
100
|
+
except Exception as e:
|
|
101
|
+
logger.info(f"Warning: Error occurred in pre_tracing: {e}")
|
|
90
102
|
if to_wrap.get('skip_span', False) or handler.skip_span(to_wrap, wrapped, instance, args, kwargs):
|
|
91
103
|
return_value = wrapped(*args, **kwargs)
|
|
92
104
|
else:
|
|
@@ -98,45 +110,44 @@ def monocle_wrapper(tracer: Tracer, handler: SpanHandler, to_wrap, wrapped, inst
|
|
|
98
110
|
detach(token)
|
|
99
111
|
return return_value
|
|
100
112
|
finally:
|
|
101
|
-
|
|
102
|
-
|
|
113
|
+
try:
|
|
114
|
+
handler.post_tracing(to_wrap, wrapped, instance, args, kwargs, return_value)
|
|
115
|
+
except Exception as e:
|
|
116
|
+
logger.info(f"Warning: Error occurred in post_tracing: {e}")
|
|
103
117
|
|
|
104
118
|
async def amonocle_wrapper_span_processor(tracer: Tracer, handler: SpanHandler, to_wrap, wrapped, instance, source_path, add_workflow_span, args, kwargs):
|
|
105
119
|
# Main span processing logic
|
|
106
120
|
name = get_span_name(to_wrap, instance)
|
|
107
121
|
return_value = None
|
|
108
122
|
span_status = None
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
if SpanHandler.is_root_span(span) or add_workflow_span:
|
|
114
|
-
# Recursive call for the actual span
|
|
115
|
-
return_value, span_status = await amonocle_wrapper_span_processor(tracer, handler, to_wrap, wrapped, instance, source_path, False, args, kwargs)
|
|
116
|
-
span.set_status(span_status)
|
|
117
|
-
else:
|
|
118
|
-
with SpanHandler.workflow_type(to_wrap):
|
|
119
|
-
return_value = await wrapped(*args, **kwargs)
|
|
120
|
-
span_status = span.status
|
|
121
|
-
post_process_span(handler, to_wrap, wrapped, instance, args, kwargs, return_value, span)
|
|
122
|
-
else:
|
|
123
|
-
span = tracer.start_span(name)
|
|
124
|
-
|
|
123
|
+
auto_close_span = get_auto_close_span(to_wrap, kwargs)
|
|
124
|
+
parent_span = get_parent_span()
|
|
125
|
+
with tracer.start_as_current_span(name, end_on_exit=auto_close_span) as span:
|
|
125
126
|
pre_process_span(name, tracer, handler, add_workflow_span, to_wrap, wrapped, instance, args, kwargs, span, source_path)
|
|
126
127
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
span.
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
128
|
+
if SpanHandler.is_root_span(span) or add_workflow_span:
|
|
129
|
+
# Recursive call for the actual span
|
|
130
|
+
return_value, span_status = await amonocle_wrapper_span_processor(tracer, handler, to_wrap, wrapped, instance, source_path, False, args, kwargs)
|
|
131
|
+
span.set_status(span_status)
|
|
132
|
+
if not auto_close_span:
|
|
133
|
+
span.end()
|
|
134
|
+
else:
|
|
135
|
+
ex:Exception = None
|
|
136
|
+
try:
|
|
137
|
+
with SpanHandler.workflow_type(to_wrap, span):
|
|
138
|
+
return_value = await wrapped(*args, **kwargs)
|
|
139
|
+
except Exception as e:
|
|
140
|
+
ex = e
|
|
141
|
+
raise
|
|
142
|
+
finally:
|
|
143
|
+
def post_process_span_internal(ret_val):
|
|
144
|
+
post_process_span(handler, to_wrap, wrapped, instance, args, kwargs, ret_val, span, parent_span,ex)
|
|
145
|
+
if not auto_close_span:
|
|
146
|
+
span.end()
|
|
147
|
+
if ex is None and not auto_close_span and to_wrap.get("output_processor") and to_wrap.get("output_processor").get("response_processor"):
|
|
148
|
+
to_wrap.get("output_processor").get("response_processor")(to_wrap, return_value, post_process_span_internal)
|
|
149
|
+
else:
|
|
150
|
+
post_process_span_internal(return_value)
|
|
140
151
|
span_status = span.status
|
|
141
152
|
return return_value, span.status
|
|
142
153
|
|
|
@@ -144,7 +155,10 @@ async def amonocle_wrapper(tracer: Tracer, handler: SpanHandler, to_wrap, wrappe
|
|
|
144
155
|
return_value = None
|
|
145
156
|
token = None
|
|
146
157
|
try:
|
|
147
|
-
|
|
158
|
+
try:
|
|
159
|
+
handler.pre_tracing(to_wrap, wrapped, instance, args, kwargs)
|
|
160
|
+
except Exception as e:
|
|
161
|
+
logger.info(f"Warning: Error occurred in pre_tracing: {e}")
|
|
148
162
|
if to_wrap.get('skip_span', False) or handler.skip_span(to_wrap, wrapped, instance, args, kwargs):
|
|
149
163
|
return_value = await wrapped(*args, **kwargs)
|
|
150
164
|
else:
|
|
@@ -156,7 +170,10 @@ async def amonocle_wrapper(tracer: Tracer, handler: SpanHandler, to_wrap, wrappe
|
|
|
156
170
|
detach(token)
|
|
157
171
|
return return_value
|
|
158
172
|
finally:
|
|
159
|
-
|
|
173
|
+
try:
|
|
174
|
+
handler.post_tracing(to_wrap, wrapped, instance, args, kwargs, return_value)
|
|
175
|
+
except Exception as e:
|
|
176
|
+
logger.info(f"Warning: Error occurred in post_tracing: {e}")
|
|
160
177
|
|
|
161
178
|
@with_tracer_wrapper
|
|
162
179
|
def task_wrapper(tracer: Tracer, handler: SpanHandler, to_wrap, wrapped, instance, source_path, args, kwargs):
|
|
@@ -193,7 +210,7 @@ async def ascope_wrapper(tracer: Tracer, handler: SpanHandler, to_wrap, wrapped,
|
|
|
193
210
|
@with_tracer_wrapper
|
|
194
211
|
def scopes_wrapper(tracer: Tracer, handler: SpanHandler, to_wrap, wrapped, instance, source_path, args, kwargs):
|
|
195
212
|
scope_values = to_wrap.get('scope_values', None)
|
|
196
|
-
scope_values = evaluate_scope_values(args, kwargs, scope_values)
|
|
213
|
+
scope_values = evaluate_scope_values(args, kwargs, to_wrap, scope_values)
|
|
197
214
|
token = None
|
|
198
215
|
try:
|
|
199
216
|
if scope_values:
|
|
@@ -207,7 +224,7 @@ def scopes_wrapper(tracer: Tracer, handler: SpanHandler, to_wrap, wrapped, insta
|
|
|
207
224
|
@with_tracer_wrapper
|
|
208
225
|
async def ascopes_wrapper(tracer: Tracer, handler: SpanHandler, to_wrap, wrapped, instance, source_path, args, kwargs):
|
|
209
226
|
scope_values = to_wrap.get('scope_values', None)
|
|
210
|
-
scope_values = evaluate_scope_values(args, kwargs, scope_values)
|
|
227
|
+
scope_values = evaluate_scope_values(args, kwargs, to_wrap, scope_values)
|
|
211
228
|
token = None
|
|
212
229
|
try:
|
|
213
230
|
if scope_values:
|
|
@@ -218,7 +235,7 @@ async def ascopes_wrapper(tracer: Tracer, handler: SpanHandler, to_wrap, wrapped
|
|
|
218
235
|
if token:
|
|
219
236
|
remove_scope(token)
|
|
220
237
|
|
|
221
|
-
def evaluate_scope_values(args, kwargs, scope_values):
|
|
238
|
+
def evaluate_scope_values(args, kwargs, to_wrap, scope_values):
|
|
222
239
|
if callable(scope_values):
|
|
223
240
|
try:
|
|
224
241
|
scope_values = scope_values(args, kwargs)
|
|
@@ -227,5 +244,4 @@ def evaluate_scope_values(args, kwargs, scope_values):
|
|
|
227
244
|
scope_values = None
|
|
228
245
|
if isinstance(scope_values, dict):
|
|
229
246
|
return scope_values
|
|
230
|
-
return None
|
|
231
|
-
|
|
247
|
+
return None
|
|
@@ -10,6 +10,7 @@ from monocle_apptrace.instrumentation.metamodel.langchain.methods import (
|
|
|
10
10
|
from monocle_apptrace.instrumentation.metamodel.llamaindex.methods import (LLAMAINDEX_METHODS, )
|
|
11
11
|
from monocle_apptrace.instrumentation.metamodel.haystack.methods import (HAYSTACK_METHODS, )
|
|
12
12
|
from monocle_apptrace.instrumentation.metamodel.openai.methods import (OPENAI_METHODS,)
|
|
13
|
+
from monocle_apptrace.instrumentation.metamodel.openai._helper import OpenAISpanHandler
|
|
13
14
|
from monocle_apptrace.instrumentation.metamodel.langgraph.methods import LANGGRAPH_METHODS
|
|
14
15
|
from monocle_apptrace.instrumentation.metamodel.flask.methods import (FLASK_METHODS, )
|
|
15
16
|
from monocle_apptrace.instrumentation.metamodel.flask._helper import FlaskSpanHandler, FlaskResponseSpanHandler
|
|
@@ -76,5 +77,6 @@ MONOCLE_SPAN_HANDLERS: Dict[str, SpanHandler] = {
|
|
|
76
77
|
"flask_handler": FlaskSpanHandler(),
|
|
77
78
|
"flask_response_handler": FlaskResponseSpanHandler(),
|
|
78
79
|
"request_handler": RequestSpanHandler(),
|
|
79
|
-
"non_framework_handler": NonFrameworkSpanHandler()
|
|
80
|
+
"non_framework_handler": NonFrameworkSpanHandler(),
|
|
81
|
+
"openai_handler": OpenAISpanHandler(),
|
|
80
82
|
}
|
|
@@ -70,7 +70,7 @@ class FlaskResponseSpanHandler(SpanHandler):
|
|
|
70
70
|
if _parent_span_context is not None:
|
|
71
71
|
parent_span: Span = _parent_span_context.get(_SPAN_KEY, None)
|
|
72
72
|
if parent_span is not None:
|
|
73
|
-
self.hydrate_events(to_wrap, wrapped, instance, args, kwargs, return_value, parent_span)
|
|
73
|
+
self.hydrate_events(to_wrap, wrapped, instance, args, kwargs, return_value, parent_span=parent_span)
|
|
74
74
|
except Exception as e:
|
|
75
75
|
logger.info(f"Failed to propogate flask response: {e}")
|
|
76
76
|
super().post_tracing(to_wrap, wrapped, instance, args, kwargs, return_value)
|
|
@@ -121,7 +121,7 @@ def update_span_from_llm_response(response, instance):
|
|
|
121
121
|
if response is not None and isinstance(response, dict):
|
|
122
122
|
if "meta" in response:
|
|
123
123
|
token_usage = response["meta"][0]["usage"]
|
|
124
|
-
|
|
124
|
+
elif "replies" in response: # and "meta" in response["replies"][0]:
|
|
125
125
|
token_usage = response["replies"][0].meta["usage"]
|
|
126
126
|
if token_usage is not None:
|
|
127
127
|
temperature = instance.__dict__.get("temperature", None)
|