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.

Files changed (99) hide show
  1. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/CHANGELOG.md +12 -0
  2. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/PKG-INFO +22 -18
  3. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/pyproject.toml +22 -18
  4. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/common/constants.py +4 -4
  5. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/common/span_handler.py +54 -28
  6. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/common/utils.py +28 -0
  7. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/common/wrapper.py +89 -73
  8. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/common/wrapper_method.py +3 -1
  9. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/flask/_helper.py +1 -1
  10. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/haystack/_helper.py +1 -1
  11. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/haystack/entities/inference.py +1 -1
  12. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langchain/entities/inference.py +1 -1
  13. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/entities/inference.py +1 -1
  14. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/openai/_helper.py +26 -5
  15. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/openai/entities/inference.py +11 -1
  16. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/openai/methods.py +6 -6
  17. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/teamsai/_helper.py +37 -5
  18. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/teamsai/entities/inference/actionplanner_output_processor.py +12 -32
  19. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/teamsai/entities/inference/teamsai_output_processor.py +14 -16
  20. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/.gitignore +0 -0
  21. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/CODEOWNERS.md +0 -0
  22. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/CODE_OF_CONDUCT.md +0 -0
  23. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/CONTRIBUTING.md +0 -0
  24. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/COPYRIGHT.template +0 -0
  25. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/LICENSE +0 -0
  26. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/MAINTAINER.md +0 -0
  27. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/Monocle_User_Guide.md +0 -0
  28. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/Monocle_committer_guide.md +0 -0
  29. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/Monocle_contributor_guide.md +0 -0
  30. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/NOTICE +0 -0
  31. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/README.md +0 -0
  32. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/SECURITY.md +0 -0
  33. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/README.md +0 -0
  34. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/__init__.py +0 -0
  35. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/__main__.py +0 -0
  36. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/exporters/aws/s3_exporter.py +0 -0
  37. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/exporters/aws/s3_exporter_opendal.py +0 -0
  38. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/exporters/azure/blob_exporter.py +0 -0
  39. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/exporters/azure/blob_exporter_opendal.py +0 -0
  40. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/exporters/base_exporter.py +0 -0
  41. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/exporters/exporter_processor.py +0 -0
  42. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/exporters/file_exporter.py +0 -0
  43. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/exporters/monocle_exporters.py +0 -0
  44. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/exporters/okahu/okahu_exporter.py +0 -0
  45. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/__init__.py +0 -0
  46. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/common/__init__.py +0 -0
  47. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/common/instrumentor.py +0 -0
  48. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/common/tracing.md +0 -0
  49. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/__init__.py +0 -0
  50. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/aiohttp/__init__.py +0 -0
  51. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/aiohttp/_helper.py +0 -0
  52. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/aiohttp/entities/http.py +0 -0
  53. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/aiohttp/methods.py +0 -0
  54. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/anthropic/__init__.py +0 -0
  55. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/anthropic/_helper.py +0 -0
  56. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/anthropic/entities/__init__.py +0 -0
  57. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/anthropic/entities/inference.py +0 -0
  58. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/anthropic/methods.py +0 -0
  59. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/botocore/__init__.py +0 -0
  60. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/botocore/_helper.py +0 -0
  61. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/botocore/entities/__init__.py +0 -0
  62. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/botocore/entities/inference.py +0 -0
  63. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/botocore/handlers/botocore_span_handler.py +0 -0
  64. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/botocore/methods.py +0 -0
  65. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/flask/__init__.py +0 -0
  66. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/flask/entities/http.py +0 -0
  67. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/flask/methods.py +0 -0
  68. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/haystack/__init__.py +0 -0
  69. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/haystack/entities/__init__.py +0 -0
  70. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/haystack/entities/retrieval.py +0 -0
  71. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/haystack/methods.py +0 -0
  72. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langchain/__init__.py +0 -0
  73. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langchain/_helper.py +0 -0
  74. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langchain/entities/__init__.py +0 -0
  75. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langchain/entities/retrieval.py +0 -0
  76. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langchain/methods.py +0 -0
  77. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langgraph/__init__.py +0 -0
  78. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langgraph/_helper.py +0 -0
  79. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langgraph/entities/__init__.py +0 -0
  80. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langgraph/entities/inference.py +0 -0
  81. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/langgraph/methods.py +0 -0
  82. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/__init__.py +0 -0
  83. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/_helper.py +0 -0
  84. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/entities/__init__.py +0 -0
  85. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/entities/agent.py +0 -0
  86. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/entities/retrieval.py +0 -0
  87. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/methods.py +0 -0
  88. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/openai/__init__.py +0 -0
  89. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/openai/entities/__init__.py +0 -0
  90. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/openai/entities/retrieval.py +0 -0
  91. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/requests/__init__.py +0 -0
  92. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/requests/_helper.py +0 -0
  93. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/requests/entities/http.py +0 -0
  94. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/requests/methods.py +0 -0
  95. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/teamsai/__init__.py +0 -0
  96. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/teamsai/entities/__init__.py +0 -0
  97. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/teamsai/entities/inference/__init__.py +0 -0
  98. {monocle_apptrace-0.4.0b1 → monocle_apptrace-0.4.0b3}/src/monocle_apptrace/instrumentation/metamodel/teamsai/methods.py +0 -0
  99. {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.0b1
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.35.19; extra == 'aws'
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==0.49.0; extra == 'dev'
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.34.131; extra == 'dev'
26
- Requires-Dist: chromadb==0.4.22; extra == 'dev'
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-aws==0.1.10; extra == 'dev'
33
- Requires-Dist: langchain-chroma==0.1.1; extra == 'dev'
34
- Requires-Dist: langchain-community==0.2.5; extra == 'dev'
35
- Requires-Dist: langchain-mistralai==0.1.13; extra == 'dev'
36
- Requires-Dist: langchain-openai==0.1.8; extra == 'dev'
37
- Requires-Dist: langchain==0.2.5; extra == 'dev'
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.2.0; extra == 'dev'
41
- Requires-Dist: llama-index-llms-azure-openai==0.1.9; extra == 'dev'
42
- Requires-Dist: llama-index-llms-mistralai==0.1.20; extra == 'dev'
43
- Requires-Dist: llama-index-vector-stores-chroma==0.1.9; extra == 'dev'
44
- Requires-Dist: llama-index-vector-stores-opensearch==0.1.10; extra == 'dev'
45
- Requires-Dist: llama-index==0.10.30; extra == 'dev'
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==8.0.0; extra == 'dev'
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.0b1"
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.1.8',
45
- 'langchain-chroma==0.1.1',
46
- 'langchain-community==0.2.5',
47
- 'langchain==0.2.5',
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.0.0',
55
- 'llama-index==0.10.30',
56
- 'llama-index-embeddings-huggingface==0.2.0',
57
- 'llama-index-vector-stores-chroma==0.1.9',
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.1.20',
60
- 'langchain-mistralai==0.1.13',
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.1.10',
62
+ 'langchain-aws==0.2.23',
63
63
  'azure-storage-blob==12.22.0', # this is for blob exporter
64
- 'boto3==1.34.131', # this is for aws exporter
65
- 'llama-index-vector-stores-opensearch==0.1.10',
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.1.9',
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.4.22',
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.49.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.35.19',
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 = "azure.func"
18
- AZURE_APP_SERVICE_NAME = "azure.asp"
19
- AZURE_ML_SERVICE_NAME = "azure.mlw"
20
- AWS_LAMBDA_SERVICE_NAME = "aws.lambda"
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) -> bool:
46
- return False
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
- if span.status.status_code == StatusCode.UNSET:
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
- detected_error_in_attribute = self.hydrate_attributes(to_wrap, wrapped, instance, args, kwargs, result, span)
79
- detected_error_in_event = self.hydrate_events(to_wrap, wrapped, instance, args, kwargs, result, span)
80
- if detected_error_in_attribute or detected_error_in_event:
81
- span.set_attribute(MONOCLE_DETECTED_SPAN_ERROR, True)
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 not self.skip_processor(to_wrap, wrapped, instance, args, kwargs) and (
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
- if 'type' in output_processor:
92
- span.set_attribute("span.type", output_processor['type'])
93
- else:
94
- logger.warning("type of span not found or incorrect written in entity json")
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 not self.skip_processor(to_wrap, wrapped, instance, args, kwargs) and (
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
- arguments = {"instance": instance, "args": args, "kwargs": kwargs, "result": ret_result}
136
- if 'events' in output_processor:
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) -> bool:
246
- return get_value(WORKFLOW_TYPE_KEY) in WORKFLOW_TYPE_MAP.values()
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
- handler.pre_task_processing(to_wrap, wrapped, instance, args, kwargs, span)
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
- handler.hydrate_span(to_wrap, wrapped, instance, args, kwargs, return_value, span)
38
- handler.post_task_processing(to_wrap, wrapped, instance, args, kwargs, return_value, span)
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
- if(get_auto_close_span(to_wrap, kwargs)):
53
- with tracer.start_as_current_span(name) as span:
54
- pre_process_span(name, tracer, handler, add_workflow_span, to_wrap, wrapped, instance, args, kwargs, span, source_path)
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
- def post_process_span_internal(ret_val):
71
- nonlocal handler, to_wrap, wrapped, instance, args, kwargs, span
72
- post_process_span(handler, to_wrap, wrapped, instance, args, kwargs, ret_val, span)
73
- span.end()
74
-
75
- with SpanHandler.workflow_type(to_wrap):
76
- return_value = wrapped(*args, **kwargs)
77
- if to_wrap.get("output_processor") and to_wrap.get("output_processor").get("response_processor"):
78
- # Process the stream
79
- to_wrap.get("output_processor").get("response_processor")(to_wrap, return_value, post_process_span_internal)
80
- else:
81
- span.end()
82
- span_status = span.status
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
- handler.pre_tracing(to_wrap, wrapped, instance, args, kwargs)
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
- handler.post_tracing(to_wrap, wrapped, instance, args, kwargs, return_value)
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
- if(get_auto_close_span(to_wrap, kwargs)):
110
- with tracer.start_as_current_span(name) as span:
111
- pre_process_span(name, tracer, handler, add_workflow_span, to_wrap, wrapped, instance, args, kwargs, span, source_path)
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
- def post_process_span_internal(ret_val):
128
- nonlocal handler, to_wrap, wrapped, instance, args, kwargs, span
129
- post_process_span(handler, to_wrap, wrapped, instance, args, kwargs, ret_val, span)
130
- span.end()
131
-
132
- with SpanHandler.workflow_type(to_wrap):
133
- return_value = await wrapped(*args, **kwargs)
134
-
135
- if to_wrap.get("output_processor") and to_wrap.get("output_processor").get("response_processor"):
136
- # Process the stream
137
- to_wrap.get("output_processor").get("response_processor")(to_wrap, return_value, post_process_span_internal)
138
- else:
139
- span.end()
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
- handler.pre_tracing(to_wrap, wrapped, instance, args, kwargs)
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
- handler.post_tracing(to_wrap, wrapped, instance, args, kwargs, return_value)
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
- if "replies" in response:
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)