monocle-apptrace 0.4.0b2__tar.gz → 0.4.1__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 (110) hide show
  1. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/CHANGELOG.md +17 -3
  2. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/PKG-INFO +21 -18
  3. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/pyproject.toml +22 -19
  4. monocle_apptrace-0.4.1/src/monocle_apptrace/instrumentation/__init__.py +2 -0
  5. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/common/constants.py +3 -0
  6. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/common/instrumentor.py +1 -1
  7. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/common/span_handler.py +8 -6
  8. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/common/utils.py +33 -2
  9. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/common/wrapper.py +59 -79
  10. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/common/wrapper_method.py +5 -1
  11. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/anthropic/_helper.py +29 -4
  12. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/anthropic/entities/inference.py +12 -2
  13. monocle_apptrace-0.4.1/src/monocle_apptrace/instrumentation/metamodel/azfunc/_helper.py +78 -0
  14. monocle_apptrace-0.4.1/src/monocle_apptrace/instrumentation/metamodel/azfunc/entities/http.py +51 -0
  15. monocle_apptrace-0.4.1/src/monocle_apptrace/instrumentation/metamodel/azfunc/methods.py +23 -0
  16. monocle_apptrace-0.4.1/src/monocle_apptrace/instrumentation/metamodel/azfunc/wrapper.py +23 -0
  17. monocle_apptrace-0.4.1/src/monocle_apptrace/instrumentation/metamodel/azureaiinference/__init__.py +1 -0
  18. monocle_apptrace-0.4.1/src/monocle_apptrace/instrumentation/metamodel/azureaiinference/_helper.py +216 -0
  19. monocle_apptrace-0.4.1/src/monocle_apptrace/instrumentation/metamodel/azureaiinference/entities/inference.py +208 -0
  20. monocle_apptrace-0.4.1/src/monocle_apptrace/instrumentation/metamodel/azureaiinference/methods.py +23 -0
  21. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/botocore/_helper.py +42 -17
  22. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/botocore/entities/inference.py +11 -3
  23. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/flask/_helper.py +1 -1
  24. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/haystack/_helper.py +20 -12
  25. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/haystack/entities/inference.py +10 -2
  26. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/langchain/_helper.py +19 -13
  27. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/langchain/entities/inference.py +10 -2
  28. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/_helper.py +21 -13
  29. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/entities/inference.py +10 -2
  30. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/openai/_helper.py +31 -10
  31. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/openai/entities/inference.py +12 -1
  32. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/teamsai/_helper.py +50 -4
  33. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/teamsai/entities/inference/actionplanner_output_processor.py +32 -12
  34. monocle_apptrace-0.4.1/src/monocle_apptrace/instrumentation/metamodel/teamsai/methods.py +73 -0
  35. monocle_apptrace-0.4.1/src/monocle_apptrace/instrumentation/metamodel/teamsai/sample.json +448 -0
  36. monocle_apptrace-0.4.0b2/src/monocle_apptrace/instrumentation/__init__.py +0 -1
  37. monocle_apptrace-0.4.0b2/src/monocle_apptrace/instrumentation/metamodel/teamsai/methods.py +0 -60
  38. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/.gitignore +0 -0
  39. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/CODEOWNERS.md +0 -0
  40. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/CODE_OF_CONDUCT.md +0 -0
  41. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/CONTRIBUTING.md +0 -0
  42. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/COPYRIGHT.template +0 -0
  43. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/LICENSE +0 -0
  44. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/MAINTAINER.md +0 -0
  45. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/Monocle_User_Guide.md +0 -0
  46. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/Monocle_committer_guide.md +0 -0
  47. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/Monocle_contributor_guide.md +0 -0
  48. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/NOTICE +0 -0
  49. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/README.md +0 -0
  50. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/SECURITY.md +0 -0
  51. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/README.md +0 -0
  52. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/__init__.py +0 -0
  53. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/__main__.py +0 -0
  54. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/exporters/aws/s3_exporter.py +0 -0
  55. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/exporters/aws/s3_exporter_opendal.py +0 -0
  56. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/exporters/azure/blob_exporter.py +0 -0
  57. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/exporters/azure/blob_exporter_opendal.py +0 -0
  58. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/exporters/base_exporter.py +0 -0
  59. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/exporters/exporter_processor.py +0 -0
  60. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/exporters/file_exporter.py +0 -0
  61. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/exporters/monocle_exporters.py +0 -0
  62. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/exporters/okahu/okahu_exporter.py +0 -0
  63. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/common/__init__.py +0 -0
  64. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/common/tracing.md +0 -0
  65. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/__init__.py +0 -0
  66. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/aiohttp/__init__.py +0 -0
  67. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/aiohttp/_helper.py +0 -0
  68. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/aiohttp/entities/http.py +0 -0
  69. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/aiohttp/methods.py +0 -0
  70. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/anthropic/__init__.py +0 -0
  71. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/anthropic/entities/__init__.py +0 -0
  72. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/anthropic/methods.py +0 -0
  73. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/botocore/__init__.py +0 -0
  74. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/botocore/entities/__init__.py +0 -0
  75. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/botocore/handlers/botocore_span_handler.py +0 -0
  76. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/botocore/methods.py +0 -0
  77. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/flask/__init__.py +0 -0
  78. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/flask/entities/http.py +0 -0
  79. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/flask/methods.py +0 -0
  80. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/haystack/__init__.py +0 -0
  81. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/haystack/entities/__init__.py +0 -0
  82. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/haystack/entities/retrieval.py +0 -0
  83. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/haystack/methods.py +0 -0
  84. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/langchain/__init__.py +0 -0
  85. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/langchain/entities/__init__.py +0 -0
  86. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/langchain/entities/retrieval.py +0 -0
  87. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/langchain/methods.py +0 -0
  88. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/langgraph/__init__.py +0 -0
  89. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/langgraph/_helper.py +0 -0
  90. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/langgraph/entities/__init__.py +0 -0
  91. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/langgraph/entities/inference.py +0 -0
  92. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/langgraph/methods.py +0 -0
  93. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/__init__.py +0 -0
  94. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/entities/__init__.py +0 -0
  95. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/entities/agent.py +0 -0
  96. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/entities/retrieval.py +0 -0
  97. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/methods.py +0 -0
  98. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/openai/__init__.py +0 -0
  99. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/openai/entities/__init__.py +0 -0
  100. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/openai/entities/retrieval.py +0 -0
  101. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/openai/methods.py +0 -0
  102. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/requests/__init__.py +0 -0
  103. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/requests/_helper.py +0 -0
  104. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/requests/entities/http.py +0 -0
  105. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/requests/methods.py +0 -0
  106. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/teamsai/__init__.py +0 -0
  107. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/teamsai/entities/__init__.py +0 -0
  108. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/teamsai/entities/inference/__init__.py +0 -0
  109. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/src/monocle_apptrace/instrumentation/metamodel/teamsai/entities/inference/teamsai_output_processor.py +0 -0
  110. {monocle_apptrace-0.4.0b2 → monocle_apptrace-0.4.1}/tox.ini +0 -0
@@ -1,11 +1,25 @@
1
- ## Version 0.4.0b2 (2025-05-21)
1
+ ## Version 0.4.1 (2025-06-17)
2
+
3
+ - Add exception status code for Boto3 ([#211](https://github.com/monocle2ai/monocle/pull/211))
4
+ - Add exception status code for anthropic and openai ([#210](https://github.com/monocle2ai/monocle/pull/210))
5
+ - Add prompt template info in teamsAI ([#209](https://github.com/monocle2ai/monocle/pull/209))
6
+ - TeamsAI : added system prompt ([#208](https://github.com/monocle2ai/monocle/pull/208))
7
+ - Add prompt template info in ActionPlanner for teamsAI ([#207](https://github.com/monocle2ai/monocle/pull/207))
8
+ - Add teams channel id as scope in MS teams instrumentations ([#206](https://github.com/monocle2ai/monocle/pull/206))
9
+ - Azure function wrapper to generate http span ([#205](https://github.com/monocle2ai/monocle/pull/205))
10
+ - Azure ai inference sdk ([#204](https://github.com/monocle2ai/monocle/pull/204))
11
+
12
+ ## Version 0.4.0 (2025-06-02)
13
+
14
+ - Update teams scopes ([#200](https://github.com/monocle2ai/monocle/pull/200))
15
+ - Record input and errors for inference.modelapi in case of error ([#193](https://github.com/monocle2ai/monocle/pull/193))
16
+ - Removed special handling for streaming in wrapper ([#192](https://github.com/monocle2ai/monocle/pull/192))
17
+
2
18
 
3
19
  - Add Span error handling ([#186](https://github.com/monocle2ai/monocle/pull/186))
4
20
  - Add teams ai enhancements ([#184](https://github.com/monocle2ai/monocle/pull/184))
5
21
 
6
22
 
7
- ## Version 0.4.0b1 (2025-05-14)
8
-
9
23
  - Added conversation id in scope for teams ai bot ([#180](https://github.com/monocle2ai/monocle/pull/180))
10
24
  - Update inference entity type of TeamsAI SDK ([#178](https://github.com/monocle2ai/monocle/pull/178))
11
25
  - Added stream and async for openai ([#177](https://github.com/monocle2ai/monocle/pull/177))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: monocle_apptrace
3
- Version: 0.4.0b2
3
+ Version: 0.4.1
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,41 +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
23
  Requires-Dist: anthropic-haystack; extra == 'dev'
24
- Requires-Dist: anthropic==0.49.0; extra == 'dev'
24
+ Requires-Dist: anthropic==0.52.0; extra == 'dev'
25
25
  Requires-Dist: azure-storage-blob==12.22.0; extra == 'dev'
26
- Requires-Dist: boto3==1.34.131; extra == 'dev'
27
- 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'
28
28
  Requires-Dist: datasets==2.20.0; extra == 'dev'
29
29
  Requires-Dist: faiss-cpu==1.8.0; extra == 'dev'
30
30
  Requires-Dist: flask; extra == 'dev'
31
31
  Requires-Dist: haystack-ai==2.3.0; extra == 'dev'
32
32
  Requires-Dist: instructorembedding==1.0.1; extra == 'dev'
33
- Requires-Dist: langchain-aws==0.1.10; extra == 'dev'
34
- Requires-Dist: langchain-chroma==0.1.1; extra == 'dev'
35
- Requires-Dist: langchain-community==0.2.5; extra == 'dev'
36
- Requires-Dist: langchain-mistralai==0.1.13; extra == 'dev'
37
- Requires-Dist: langchain-openai==0.1.8; extra == 'dev'
38
- 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'
39
40
  Requires-Dist: langchainhub==0.1.21; extra == 'dev'
40
41
  Requires-Dist: langgraph==0.2.68; extra == 'dev'
41
- Requires-Dist: llama-index-embeddings-huggingface==0.2.0; extra == 'dev'
42
- Requires-Dist: llama-index-llms-azure-openai==0.1.9; extra == 'dev'
43
- Requires-Dist: llama-index-llms-mistralai==0.1.20; extra == 'dev'
44
- Requires-Dist: llama-index-vector-stores-chroma==0.1.9; extra == 'dev'
45
- Requires-Dist: llama-index-vector-stores-opensearch==0.1.10; extra == 'dev'
46
- 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'
47
49
  Requires-Dist: mistral-haystack==0.0.2; extra == 'dev'
48
50
  Requires-Dist: numpy==1.26.4; extra == 'dev'
49
51
  Requires-Dist: opendal==0.45.14; extra == 'dev'
50
52
  Requires-Dist: opensearch-haystack==1.2.0; extra == 'dev'
51
53
  Requires-Dist: opentelemetry-instrumentation-flask; extra == 'dev'
52
54
  Requires-Dist: parameterized==0.9.0; extra == 'dev'
53
- 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'
54
57
  Requires-Dist: requests-aws4auth==1.2.3; extra == 'dev'
55
58
  Requires-Dist: sentence-transformers==2.6.1; extra == 'dev'
56
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.0b2"
7
+ version = "0.4.1"
8
8
  authors = []
9
9
  description = "package with monocle genAI tracing"
10
10
  readme = "README.md"
@@ -41,40 +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',
77
- 'anthropic-haystack'
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'
78
81
  ]
79
82
 
80
83
  azure = [
@@ -82,7 +85,7 @@ azure = [
82
85
  ]
83
86
 
84
87
  aws = [
85
- 'boto3==1.35.19',
88
+ 'boto3==1.37.24',
86
89
  ]
87
90
 
88
91
  [project.urls]
@@ -0,0 +1,2 @@
1
+ from .common import *
2
+ from .metamodel.azfunc.wrapper import monocle_trace_azure_function_route
@@ -54,6 +54,9 @@ llm_type_map = {
54
54
  "anthropic": "anthropic",
55
55
  "chatanthropic":"anthropic",
56
56
  "anthropicchatgenerator":"anthropic",
57
+ "chatcompletionsclient": "azure_ai_inference",
58
+ "embeddingsclient": "azure_ai_inference",
59
+ "imageembeddingsclient": "azure_ai_inference",
57
60
  }
58
61
 
59
62
  MONOCLE_INSTRUMENTOR = "monocle_apptrace"
@@ -362,7 +362,7 @@ def monocle_trace_http_route(func):
362
362
  if inspect.iscoroutinefunction(func):
363
363
  @wraps(func)
364
364
  async def wrapper(*args, **kwargs):
365
- return http_async_route_handler(func, *args, **kwargs)
365
+ return await http_async_route_handler(func, *args, **kwargs)
366
366
  return wrapper
367
367
  else:
368
368
  @wraps(func)
@@ -83,10 +83,10 @@ class SpanHandler:
83
83
  def post_task_processing(self, to_wrap, wrapped, instance, args, kwargs, result, span:Span):
84
84
  pass
85
85
 
86
- def hydrate_span(self, to_wrap, wrapped, instance, args, kwargs, result, span, ex:Exception = None) -> bool:
86
+ def hydrate_span(self, to_wrap, wrapped, instance, args, kwargs, result, span, parent_span = None, ex:Exception = None) -> bool:
87
87
  try:
88
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, ex)
89
+ detected_error_in_event = self.hydrate_events(to_wrap, wrapped, instance, args, kwargs, result, span, parent_span, ex)
90
90
  if detected_error_in_attribute or detected_error_in_event:
91
91
  span.set_attribute(MONOCLE_DETECTED_SPAN_ERROR, True)
92
92
  finally:
@@ -134,18 +134,20 @@ class SpanHandler:
134
134
  span.set_attribute("entity.count", span_index)
135
135
  return detected_error
136
136
 
137
- def hydrate_events(self, to_wrap, wrapped, instance, args, kwargs, ret_result, span, ex:Exception=None) -> bool:
137
+ def hydrate_events(self, to_wrap, wrapped, instance, args, kwargs, ret_result, span, parent_span=None, ex:Exception=None) -> bool:
138
138
  detected_error:bool = False
139
139
  if 'output_processor' in to_wrap and to_wrap["output_processor"] is not None:
140
140
  output_processor=to_wrap['output_processor']
141
141
  skip_processors:list[str] = self.skip_processor(to_wrap, wrapped, instance, span, args, kwargs) or []
142
142
 
143
143
  arguments = {"instance": instance, "args": args, "kwargs": kwargs, "result": ret_result, "exception":ex}
144
- if 'events' in output_processor and 'events' not in skip_processors:
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):
145
147
  events = output_processor['events']
146
148
  for event in events:
147
149
  event_name = event.get("name")
148
- if 'events.'+event_name in skip_processors:
150
+ if 'events.'+event_name in skip_processors and ex is None:
149
151
  continue
150
152
  event_attributes = {}
151
153
  attributes = event.get("attributes", [])
@@ -157,7 +159,7 @@ class SpanHandler:
157
159
  result = accessor(arguments)
158
160
  if result and isinstance(result, dict):
159
161
  result = dict((key, value) for key, value in result.items() if value is not None)
160
- if result and isinstance(result, (str, list, dict)):
162
+ if result and isinstance(result, (int, str, list, dict)):
161
163
  if attribute_key is not None:
162
164
  event_attributes[attribute_key] = result
163
165
  else:
@@ -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,11 +369,19 @@ 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
+
365
378
  def get_exception_status_code(arguments):
366
- if arguments['exception'] is not None and hasattr(arguments['exception'], 'code'):
379
+ if arguments['exception'] is not None and hasattr(arguments['exception'], 'code') and arguments['exception'].code is not None:
367
380
  return arguments['exception'].code
368
- else:
381
+ elif arguments['exception'] is not None:
369
382
  return 'error'
383
+ else:
384
+ return 'success'
370
385
 
371
386
  def get_exception_message(arguments):
372
387
  if arguments['exception'] is not None:
@@ -377,6 +392,22 @@ def get_exception_message(arguments):
377
392
  else:
378
393
  return ''
379
394
 
395
+ def get_status_code(arguments):
396
+ if arguments["exception"] is not None:
397
+ return get_exception_status_code(arguments)
398
+ elif hasattr(arguments["result"], "status"):
399
+ return arguments["result"].status
400
+ else:
401
+ return 'success'
402
+
403
+ def get_status(arguments):
404
+ if arguments["exception"] is not None:
405
+ return 'error'
406
+ elif get_status_code(arguments) == 'success':
407
+ return 'success'
408
+ else:
409
+ return 'error'
410
+
380
411
  def patch_instance_method(obj, method_name, func):
381
412
  """
382
413
  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__)
@@ -35,10 +36,10 @@ def pre_process_span(name, tracer, handler, add_workflow_span, to_wrap, wrapped,
35
36
  except Exception as e:
36
37
  logger.info(f"Warning: Error occurred in pre_task_processing: {e}")
37
38
 
38
- def post_process_span(handler, to_wrap, wrapped, instance, args, kwargs, return_value, span, ex = None):
39
+ def post_process_span(handler, to_wrap, wrapped, instance, args, kwargs, return_value, span, parent_span=None, ex = None):
39
40
  if not (SpanHandler.is_root_span(span) or get_value(ADD_NEW_WORKFLOW) == True):
40
41
  try:
41
- handler.hydrate_span(to_wrap, wrapped, instance, args, kwargs, return_value, span, ex)
42
+ handler.hydrate_span(to_wrap, wrapped, instance, args, kwargs, return_value, span, parent_span, ex)
42
43
  except Exception as e:
43
44
  logger.info(f"Warning: Error occurred in hydrate_span: {e}")
44
45
 
@@ -59,45 +60,35 @@ def monocle_wrapper_span_processor(tracer: Tracer, handler: SpanHandler, to_wrap
59
60
  name = get_span_name(to_wrap, instance)
60
61
  return_value = None
61
62
  span_status = None
62
- if(get_auto_close_span(to_wrap, kwargs)):
63
- with tracer.start_as_current_span(name) as span:
64
- pre_process_span(name, tracer, handler, add_workflow_span, to_wrap, wrapped, instance, args, kwargs, span, source_path)
65
-
66
- if SpanHandler.is_root_span(span) or add_workflow_span:
67
- # Recursive call for the actual span
68
- return_value, span_status = monocle_wrapper_span_processor(tracer, handler, to_wrap, wrapped, instance, source_path, False, args, kwargs)
69
- span.set_status(span_status)
70
- else:
71
- ex:Exception = None
72
- try:
73
- with SpanHandler.workflow_type(to_wrap, span):
74
- return_value = wrapped(*args, **kwargs)
75
- except Exception as e:
76
- ex = e
77
- raise
78
- finally:
79
- post_process_span(handler, to_wrap, wrapped, instance, args, kwargs, return_value, span, ex)
80
- span_status = span.status
81
- else:
82
- span = tracer.start_span(name)
83
-
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:
84
66
  pre_process_span(name, tracer, handler, add_workflow_span, to_wrap, wrapped, instance, args, kwargs, span, source_path)
85
67
 
86
- def post_process_span_internal(ret_val):
87
- nonlocal handler, to_wrap, wrapped, instance, args, kwargs, span
88
- post_process_span(handler, to_wrap, wrapped, instance, args, kwargs, ret_val, span)
89
- span.end()
90
-
91
- try:
92
- with SpanHandler.workflow_type(to_wrap, span):
93
- return_value = wrapped(*args, **kwargs)
94
- finally:
95
- if to_wrap.get("output_processor") and to_wrap.get("output_processor").get("response_processor"):
96
- # Process the stream
97
- to_wrap.get("output_processor").get("response_processor")(to_wrap, return_value, post_process_span_internal)
98
- else:
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:
99
73
  span.end()
100
- span_status = span.status
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
101
92
  return return_value, span_status
102
93
 
103
94
  def monocle_wrapper(tracer: Tracer, handler: SpanHandler, to_wrap, wrapped, instance, source_path, args, kwargs):
@@ -129,44 +120,34 @@ async def amonocle_wrapper_span_processor(tracer: Tracer, handler: SpanHandler,
129
120
  name = get_span_name(to_wrap, instance)
130
121
  return_value = None
131
122
  span_status = None
132
- if(get_auto_close_span(to_wrap, kwargs)):
133
- with tracer.start_as_current_span(name) as span:
134
- pre_process_span(name, tracer, handler, add_workflow_span, to_wrap, wrapped, instance, args, kwargs, span, source_path)
135
-
136
- if SpanHandler.is_root_span(span) or add_workflow_span:
137
- # Recursive call for the actual span
138
- return_value, span_status = await amonocle_wrapper_span_processor(tracer, handler, to_wrap, wrapped, instance, source_path, False, args, kwargs)
139
- span.set_status(span_status)
140
- else:
141
- ex:Exception = None
142
- try:
143
- with SpanHandler.workflow_type(to_wrap, span):
144
- return_value = await wrapped(*args, **kwargs)
145
- except Exception as e:
146
- ex = e
147
- raise
148
- finally:
149
- post_process_span(handler, to_wrap, wrapped, instance, args, kwargs, return_value, span, ex)
150
- span_status = span.status
151
- else:
152
- span = tracer.start_span(name)
153
-
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:
154
126
  pre_process_span(name, tracer, handler, add_workflow_span, to_wrap, wrapped, instance, args, kwargs, span, source_path)
155
127
 
156
- def post_process_span_internal(ret_val):
157
- nonlocal handler, to_wrap, wrapped, instance, args, kwargs, span
158
- post_process_span(handler, to_wrap, wrapped, instance, args, kwargs, ret_val, span)
159
- span.end()
160
-
161
- try:
162
- with SpanHandler.workflow_type(to_wrap, span):
163
- return_value = await wrapped(*args, **kwargs)
164
- finally:
165
- if to_wrap.get("output_processor") and to_wrap.get("output_processor").get("response_processor"):
166
- # Process the stream
167
- to_wrap.get("output_processor").get("response_processor")(to_wrap, return_value, post_process_span_internal)
168
- else:
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:
169
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)
170
151
  span_status = span.status
171
152
  return return_value, span.status
172
153
 
@@ -229,7 +210,7 @@ async def ascope_wrapper(tracer: Tracer, handler: SpanHandler, to_wrap, wrapped,
229
210
  @with_tracer_wrapper
230
211
  def scopes_wrapper(tracer: Tracer, handler: SpanHandler, to_wrap, wrapped, instance, source_path, args, kwargs):
231
212
  scope_values = to_wrap.get('scope_values', None)
232
- scope_values = evaluate_scope_values(args, kwargs, scope_values)
213
+ scope_values = evaluate_scope_values(args, kwargs, to_wrap, scope_values)
233
214
  token = None
234
215
  try:
235
216
  if scope_values:
@@ -243,7 +224,7 @@ def scopes_wrapper(tracer: Tracer, handler: SpanHandler, to_wrap, wrapped, insta
243
224
  @with_tracer_wrapper
244
225
  async def ascopes_wrapper(tracer: Tracer, handler: SpanHandler, to_wrap, wrapped, instance, source_path, args, kwargs):
245
226
  scope_values = to_wrap.get('scope_values', None)
246
- scope_values = evaluate_scope_values(args, kwargs, scope_values)
227
+ scope_values = evaluate_scope_values(args, kwargs, to_wrap, scope_values)
247
228
  token = None
248
229
  try:
249
230
  if scope_values:
@@ -254,7 +235,7 @@ async def ascopes_wrapper(tracer: Tracer, handler: SpanHandler, to_wrap, wrapped
254
235
  if token:
255
236
  remove_scope(token)
256
237
 
257
- def evaluate_scope_values(args, kwargs, scope_values):
238
+ def evaluate_scope_values(args, kwargs, to_wrap, scope_values):
258
239
  if callable(scope_values):
259
240
  try:
260
241
  scope_values = scope_values(args, kwargs)
@@ -263,5 +244,4 @@ def evaluate_scope_values(args, kwargs, scope_values):
263
244
  scope_values = None
264
245
  if isinstance(scope_values, dict):
265
246
  return scope_values
266
- return None
267
-
247
+ return None
@@ -2,6 +2,7 @@
2
2
  from typing import Any, Dict
3
3
  from monocle_apptrace.instrumentation.common.wrapper import task_wrapper, scope_wrapper
4
4
  from monocle_apptrace.instrumentation.common.span_handler import SpanHandler, NonFrameworkSpanHandler
5
+ from monocle_apptrace.instrumentation.metamodel.azureaiinference.methods import AZURE_AI_INFERENCE_METHODS
5
6
  from monocle_apptrace.instrumentation.metamodel.botocore.methods import BOTOCORE_METHODS
6
7
  from monocle_apptrace.instrumentation.metamodel.botocore.handlers.botocore_span_handler import BotoCoreSpanHandler
7
8
  from monocle_apptrace.instrumentation.metamodel.langchain.methods import (
@@ -20,6 +21,8 @@ from monocle_apptrace.instrumentation.metamodel.teamsai.methods import (TEAMAI_M
20
21
  from monocle_apptrace.instrumentation.metamodel.anthropic.methods import (ANTHROPIC_METHODS, )
21
22
  from monocle_apptrace.instrumentation.metamodel.aiohttp.methods import (AIOHTTP_METHODS, )
22
23
  from monocle_apptrace.instrumentation.metamodel.aiohttp._helper import aiohttpSpanHandler
24
+ from monocle_apptrace.instrumentation.metamodel.azfunc._helper import (azureSpanHandler)
25
+ from monocle_apptrace.instrumentation.metamodel.azfunc.methods import AZFUNC_HTTP_METHODS
23
26
  class WrapperMethod:
24
27
  def __init__(
25
28
  self,
@@ -68,7 +71,7 @@ class WrapperMethod:
68
71
  def get_span_handler(self) -> SpanHandler:
69
72
  return self.span_handler()
70
73
 
71
- DEFAULT_METHODS_LIST = LANGCHAIN_METHODS + LLAMAINDEX_METHODS + HAYSTACK_METHODS + BOTOCORE_METHODS + FLASK_METHODS + REQUESTS_METHODS + LANGGRAPH_METHODS + OPENAI_METHODS + TEAMAI_METHODS + ANTHROPIC_METHODS + AIOHTTP_METHODS
74
+ DEFAULT_METHODS_LIST = LANGCHAIN_METHODS + LLAMAINDEX_METHODS + HAYSTACK_METHODS + BOTOCORE_METHODS + FLASK_METHODS + REQUESTS_METHODS + LANGGRAPH_METHODS + OPENAI_METHODS + TEAMAI_METHODS + ANTHROPIC_METHODS + AIOHTTP_METHODS + AZURE_AI_INFERENCE_METHODS + AZFUNC_HTTP_METHODS
72
75
 
73
76
  MONOCLE_SPAN_HANDLERS: Dict[str, SpanHandler] = {
74
77
  "default": SpanHandler(),
@@ -79,4 +82,5 @@ MONOCLE_SPAN_HANDLERS: Dict[str, SpanHandler] = {
79
82
  "request_handler": RequestSpanHandler(),
80
83
  "non_framework_handler": NonFrameworkSpanHandler(),
81
84
  "openai_handler": OpenAISpanHandler(),
85
+ "azure_func_handler": azureSpanHandler(),
82
86
  }
@@ -9,6 +9,7 @@ from monocle_apptrace.instrumentation.common.utils import (
9
9
  get_keys_as_tuple,
10
10
  get_nested_value,
11
11
  try_option,
12
+ get_exception_message,
12
13
  )
13
14
 
14
15
 
@@ -39,12 +40,36 @@ def extract_messages(kwargs):
39
40
  logger.warning("Warning: Error occurred in extract_messages: %s", str(e))
40
41
  return []
41
42
 
43
+ def get_exception_status_code(arguments):
44
+ if arguments['exception'] is not None and hasattr(arguments['exception'], 'status_code') and arguments['exception'].status_code is not None:
45
+ return arguments['exception'].status_code
46
+ elif arguments['exception'] is not None:
47
+ return 'error'
48
+ else:
49
+ return 'success'
42
50
 
43
- def extract_assistant_message(response):
51
+ def get_status_code(arguments):
52
+ if arguments["exception"] is not None:
53
+ return get_exception_status_code(arguments)
54
+ elif hasattr(arguments["result"], "status"):
55
+ return arguments["result"].status
56
+ else:
57
+ return 'success'
58
+
59
+ def extract_assistant_message(arguments):
44
60
  try:
45
- if response is not None and hasattr(response,"content") and len(response.content) >0:
46
- if hasattr(response.content[0],"text"):
47
- return response.content[0].text
61
+ status = get_status_code(arguments)
62
+ response: str = ""
63
+ if status == 'success':
64
+ if arguments['result'] is not None and hasattr(arguments['result'],"content") and len(arguments['result'].content) >0:
65
+ if hasattr(arguments['result'].content[0],"text"):
66
+ response = arguments['result'].content[0].text
67
+ else:
68
+ if arguments["exception"] is not None:
69
+ response = get_exception_message(arguments)
70
+ elif hasattr(arguments["result"], "error"):
71
+ response = arguments["result"].error
72
+ return response
48
73
  except (IndexError, AttributeError) as e:
49
74
  logger.warning("Warning: Error occurred in extract_assistant_message: %s", str(e))
50
75
  return None
@@ -1,7 +1,9 @@
1
1
  from monocle_apptrace.instrumentation.metamodel.anthropic import (
2
2
  _helper,
3
3
  )
4
- from monocle_apptrace.instrumentation.common.utils import resolve_from_alias, get_llm_type
4
+ from monocle_apptrace.instrumentation.common.utils import (resolve_from_alias, get_llm_type,
5
+ get_status, get_status_code
6
+ )
5
7
 
6
8
  INFERENCE = {
7
9
  "type": "inference",
@@ -52,10 +54,18 @@ INFERENCE = {
52
54
  {
53
55
  "name": "data.output",
54
56
  "attributes": [
57
+ {
58
+ "attribute": "status",
59
+ "accessor": lambda arguments: get_status(arguments)
60
+ },
61
+ {
62
+ "attribute": "status_code",
63
+ "accessor": lambda arguments: _helper.get_status_code(arguments)
64
+ },
55
65
  {
56
66
  "_comment": "this is result from LLM",
57
67
  "attribute": "response",
58
- "accessor": lambda arguments: _helper.extract_assistant_message(arguments['result'])
68
+ "accessor": lambda arguments: _helper.extract_assistant_message(arguments)
59
69
  }
60
70
  ]
61
71
  },