monocle-apptrace 0.6.0__tar.gz → 0.6.6__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 (159) hide show
  1. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/PKG-INFO +15 -4
  2. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/pyproject.toml +47 -11
  3. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/common/constants.py +8 -0
  4. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/common/span_handler.py +73 -23
  5. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/common/utils.py +63 -6
  6. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/common/wrapper.py +111 -42
  7. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/common/wrapper_method.py +4 -2
  8. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/a2a/methods.py +1 -1
  9. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/adk/_helper.py +2 -1
  10. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/agents/_helper.py +3 -3
  11. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/agents/entities/inference.py +2 -0
  12. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/aiohttp/_helper.py +1 -1
  13. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/anthropic/entities/inference.py +1 -4
  14. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/azfunc/_helper.py +1 -1
  15. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/botocore/_helper.py +5 -0
  16. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/botocore/entities/inference.py +4 -0
  17. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/fastapi/_helper.py +4 -4
  18. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/fastapi/methods.py +4 -4
  19. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/flask/_helper.py +3 -3
  20. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/hugging_face/_helper.py +1 -1
  21. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/hugging_face/entities/inference.py +1 -4
  22. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/lambdafunc/_helper.py +1 -1
  23. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/langchain/entities/inference.py +1 -4
  24. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/langgraph/_helper.py +30 -6
  25. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/langgraph/entities/inference.py +1 -1
  26. monocle_apptrace-0.6.6/src/monocle_apptrace/instrumentation/metamodel/langgraph/langgraph_processor.py +119 -0
  27. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/langgraph/methods.py +22 -6
  28. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/_helper.py +30 -10
  29. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/entities/agent.py +4 -3
  30. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/llamaindex_processor.py +15 -7
  31. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/methods.py +1 -8
  32. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/mcp/_helper.py +1 -1
  33. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/mistral/_helper.py +1 -1
  34. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/mistral/entities/inference.py +1 -4
  35. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/mistral/methods.py +0 -8
  36. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/openai/_helper.py +47 -7
  37. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/openai/entities/inference.py +20 -4
  38. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/openai/methods.py +1 -1
  39. monocle_apptrace-0.6.6/src/monocle_apptrace/instrumentation/metamodel/strands/_helper.py +44 -0
  40. monocle_apptrace-0.6.6/src/monocle_apptrace/instrumentation/metamodel/strands/entities/agent.py +179 -0
  41. monocle_apptrace-0.6.6/src/monocle_apptrace/instrumentation/metamodel/strands/entities/tool.py +62 -0
  42. monocle_apptrace-0.6.6/src/monocle_apptrace/instrumentation/metamodel/strands/methods.py +20 -0
  43. monocle_apptrace-0.6.0/src/monocle_apptrace/instrumentation/metamodel/langgraph/langgraph_processor.py +0 -50
  44. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/.gitignore +0 -0
  45. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/LICENSE +0 -0
  46. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/README.md +0 -0
  47. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/README.md +0 -0
  48. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/__init__.py +0 -0
  49. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/__main__.py +0 -0
  50. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/exporters/aws/s3_exporter.py +0 -0
  51. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/exporters/aws/s3_exporter_opendal.py +0 -0
  52. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/exporters/azure/blob_exporter.py +0 -0
  53. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/exporters/azure/blob_exporter_opendal.py +0 -0
  54. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/exporters/base_exporter.py +0 -0
  55. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/exporters/exporter_processor.py +0 -0
  56. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/exporters/file_exporter.py +0 -0
  57. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/exporters/monocle_exporters.py +0 -0
  58. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/exporters/okahu/okahu_exporter.py +0 -0
  59. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/__init__.py +0 -0
  60. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/common/__init__.py +0 -0
  61. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/common/instrumentor.py +0 -0
  62. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/common/method_wrappers.py +0 -0
  63. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/common/scope_wrapper.py +0 -0
  64. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/common/tracing.md +0 -0
  65. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/__init__.py +0 -0
  66. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/a2a/__init__.py +0 -0
  67. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/a2a/_helper.py +0 -0
  68. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/a2a/entities/__init__.py +0 -0
  69. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/a2a/entities/inference.py +0 -0
  70. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/adk/__init__.py +0 -0
  71. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/adk/entities/agent.py +0 -0
  72. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/adk/entities/tool.py +0 -0
  73. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/adk/methods.py +0 -0
  74. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/agents/__init__.py +0 -0
  75. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/agents/agents_processor.py +0 -0
  76. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/agents/entities/__init__.py +0 -0
  77. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/agents/methods.py +0 -0
  78. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/aiohttp/__init__.py +0 -0
  79. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/aiohttp/entities/http.py +0 -0
  80. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/aiohttp/methods.py +0 -0
  81. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/anthropic/__init__.py +0 -0
  82. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/anthropic/_helper.py +0 -0
  83. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/anthropic/entities/__init__.py +0 -0
  84. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/anthropic/methods.py +0 -0
  85. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/azfunc/entities/http.py +0 -0
  86. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/azfunc/methods.py +0 -0
  87. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/azfunc/wrapper.py +0 -0
  88. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/azureaiinference/__init__.py +0 -0
  89. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/azureaiinference/_helper.py +0 -0
  90. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/azureaiinference/entities/inference.py +0 -0
  91. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/azureaiinference/methods.py +0 -0
  92. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/botocore/__init__.py +0 -0
  93. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/botocore/entities/__init__.py +0 -0
  94. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/botocore/handlers/botocore_span_handler.py +0 -0
  95. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/botocore/methods.py +0 -0
  96. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/fastapi/__init__.py +0 -0
  97. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/fastapi/entities/__init__.py +0 -0
  98. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/fastapi/entities/http.py +0 -0
  99. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/finish_types.py +0 -0
  100. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/flask/__init__.py +0 -0
  101. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/flask/entities/http.py +0 -0
  102. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/flask/methods.py +0 -0
  103. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/gemini/__init__.py +0 -0
  104. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/gemini/_helper.py +0 -0
  105. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/gemini/entities/__init__.py +0 -0
  106. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/gemini/entities/inference.py +0 -0
  107. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/gemini/entities/retrieval.py +0 -0
  108. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/gemini/methods.py +0 -0
  109. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/haystack/__init__.py +0 -0
  110. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/haystack/_helper.py +0 -0
  111. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/haystack/entities/__init__.py +0 -0
  112. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/haystack/entities/inference.py +0 -0
  113. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/haystack/entities/retrieval.py +0 -0
  114. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/haystack/methods.py +0 -0
  115. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/hugging_face/__init__.py +0 -0
  116. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/hugging_face/entities/__init__.py +0 -0
  117. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/hugging_face/methods.py +0 -0
  118. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/lambdafunc/entities/http.py +0 -0
  119. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/lambdafunc/methods.py +0 -0
  120. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/lambdafunc/wrapper.py +0 -0
  121. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/langchain/__init__.py +0 -0
  122. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/langchain/_helper.py +0 -0
  123. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/langchain/entities/__init__.py +0 -0
  124. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/langchain/entities/retrieval.py +0 -0
  125. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/langchain/methods.py +0 -0
  126. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/langgraph/__init__.py +0 -0
  127. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/langgraph/entities/__init__.py +0 -0
  128. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/litellm/__init__.py +0 -0
  129. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/litellm/_helper.py +0 -0
  130. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/litellm/entities/__init__.py +0 -0
  131. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/litellm/entities/inference.py +0 -0
  132. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/litellm/methods.py +0 -0
  133. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/__init__.py +0 -0
  134. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/entities/__init__.py +0 -0
  135. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/entities/inference.py +0 -0
  136. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/llamaindex/entities/retrieval.py +0 -0
  137. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/mcp/__init__.py +0 -0
  138. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/mcp/entities/__init__.py +0 -0
  139. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/mcp/entities/inference.py +0 -0
  140. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/mcp/mcp_processor.py +0 -0
  141. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/mcp/methods.py +0 -0
  142. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/mistral/__init__.py +0 -0
  143. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/mistral/entities/__init__.py +0 -0
  144. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/mistral/entities/retrieval.py +0 -0
  145. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/openai/__init__.py +0 -0
  146. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/openai/entities/__init__.py +0 -0
  147. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/openai/entities/retrieval.py +0 -0
  148. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/requests/__init__.py +0 -0
  149. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/requests/_helper.py +0 -0
  150. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/requests/entities/http.py +0 -0
  151. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/requests/methods.py +0 -0
  152. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/teamsai/__init__.py +0 -0
  153. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/teamsai/_helper.py +0 -0
  154. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/teamsai/entities/__init__.py +0 -0
  155. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/teamsai/entities/inference/__init__.py +0 -0
  156. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/teamsai/entities/inference/actionplanner_output_processor.py +0 -0
  157. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/teamsai/entities/inference/teamsai_output_processor.py +0 -0
  158. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/teamsai/methods.py +0 -0
  159. {monocle_apptrace-0.6.0 → monocle_apptrace-0.6.6}/src/monocle_apptrace/instrumentation/metamodel/teamsai/sample.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: monocle_apptrace
3
- Version: 0.6.0
3
+ Version: 0.6.6
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
@@ -14,6 +14,7 @@ Requires-Dist: opentelemetry-api>=1.21.0
14
14
  Requires-Dist: opentelemetry-instrumentation
15
15
  Requires-Dist: opentelemetry-sdk>=1.21.0
16
16
  Requires-Dist: requests
17
+ Requires-Dist: rfc3986>=2.0.0
17
18
  Requires-Dist: wrapt>=1.14.0
18
19
  Provides-Extra: ai-test
19
20
  Requires-Dist: bert-score; extra == 'ai-test'
@@ -21,20 +22,22 @@ Requires-Dist: transformers; extra == 'ai-test'
21
22
  Provides-Extra: aws
22
23
  Requires-Dist: boto3==1.37.24; extra == 'aws'
23
24
  Provides-Extra: azure
25
+ Requires-Dist: azure-ai-inference; extra == 'azure'
24
26
  Requires-Dist: azure-storage-blob==12.22.0; extra == 'azure'
25
27
  Provides-Extra: dev
26
28
  Requires-Dist: a2a-sdk==0.3.6; extra == 'dev'
27
29
  Requires-Dist: anthropic-haystack; extra == 'dev'
28
30
  Requires-Dist: anthropic==0.57.1; extra == 'dev'
29
31
  Requires-Dist: azure-storage-blob==12.22.0; extra == 'dev'
30
- Requires-Dist: boto3==1.37.24; extra == 'dev'
32
+ Requires-Dist: boto3==1.39.0; extra == 'dev'
31
33
  Requires-Dist: chromadb==1.0.15; extra == 'dev'
32
34
  Requires-Dist: click==8.2.1; extra == 'dev'
33
- Requires-Dist: datasets==2.20.0; extra == 'dev'
35
+ Requires-Dist: datasets==4.3.0; extra == 'dev'
34
36
  Requires-Dist: faiss-cpu==1.8.0; extra == 'dev'
35
37
  Requires-Dist: fastapi>=0.115.0; extra == 'dev'
36
38
  Requires-Dist: flask; extra == 'dev'
37
39
  Requires-Dist: google-adk==1.10.0; extra == 'dev'
40
+ Requires-Dist: google-ai-haystack; extra == 'dev'
38
41
  Requires-Dist: google-generativeai==0.8.5; extra == 'dev'
39
42
  Requires-Dist: haystack-ai==2.3.0; extra == 'dev'
40
43
  Requires-Dist: httpx==0.28.1; extra == 'dev'
@@ -52,6 +55,7 @@ Requires-Dist: langchain==0.3.25; extra == 'dev'
52
55
  Requires-Dist: langchainhub==0.1.21; extra == 'dev'
53
56
  Requires-Dist: langgraph-supervisor==0.0.28; extra == 'dev'
54
57
  Requires-Dist: langgraph==0.5.4; extra == 'dev'
58
+ Requires-Dist: litellm==1.77.5; extra == 'dev'
55
59
  Requires-Dist: llama-index-embeddings-huggingface==0.6.0; extra == 'dev'
56
60
  Requires-Dist: llama-index-llms-anthropic==0.8.1; extra == 'dev'
57
61
  Requires-Dist: llama-index-llms-azure-openai==0.4.0; extra == 'dev'
@@ -72,12 +76,19 @@ Requires-Dist: opentelemetry-instrumentation-flask; extra == 'dev'
72
76
  Requires-Dist: parameterized==0.9.0; extra == 'dev'
73
77
  Requires-Dist: pydantic==2.11.7; extra == 'dev'
74
78
  Requires-Dist: pytest-asyncio==0.26.0; extra == 'dev'
79
+ Requires-Dist: pytest-venv; extra == 'dev'
75
80
  Requires-Dist: pytest==8.3.5; extra == 'dev'
76
81
  Requires-Dist: python-dotenv>=1.1.0; extra == 'dev'
77
82
  Requires-Dist: requests-aws4auth==1.2.3; extra == 'dev'
78
- Requires-Dist: sentence-transformers==2.6.1; extra == 'dev'
79
83
  Requires-Dist: types-requests==2.31.0.20240106; extra == 'dev'
80
84
  Requires-Dist: uvicorn==0.35.0; extra == 'dev'
85
+ Provides-Extra: dev-gemini
86
+ Requires-Dist: llama-index-llms-gemini==0.6.0; extra == 'dev-gemini'
87
+ Provides-Extra: dev-strands
88
+ Requires-Dist: strands-agents-tools==0.2.10; extra == 'dev-strands'
89
+ Requires-Dist: strands-agents==1.11.0; extra == 'dev-strands'
90
+ Provides-Extra: dev-tranformers
91
+ Requires-Dist: sentence-transformers==3.3.0; extra == 'dev-tranformers'
81
92
  Description-Content-Type: text/markdown
82
93
 
83
94
  # Monocle Apptrace
@@ -10,7 +10,7 @@ commands = [
10
10
 
11
11
  [project]
12
12
  name = "monocle_apptrace"
13
- version = "0.6.0"
13
+ version = "0.6.6"
14
14
  authors = [
15
15
  { name="Okahu Inc.", email="okahu-pypi@okahu.ai" },
16
16
  ]
@@ -26,17 +26,18 @@ classifiers = [
26
26
  dependencies = [
27
27
  'requests',
28
28
  'wrapt>=1.14.0',
29
+ 'rfc3986>=2.0.0',
29
30
  'opentelemetry-api>=1.21.0',
30
31
  'opentelemetry-sdk>=1.21.0',
31
32
  'opentelemetry-instrumentation',
32
33
  ]
33
34
 
34
35
  [tool.pytest.ini_options]
35
- #log_cli = true
36
- #log_cli_level = "INFO"
36
+ log_cli = true
37
+ log_cli_level = "INFO"
37
38
  # Enable file logging
38
- log_file = "traces.log"
39
- log_file_level = "INFO"
39
+ #log_file = "traces.log"
40
+ #log_file_level = "INFO"
40
41
  log_format = "%(asctime)s %(levelname)s %(pathname)s:%(lineno)d %(message)s"
41
42
  log_date_format = "%Y-%m-%d %H:%M:%S"
42
43
 
@@ -44,8 +45,27 @@ pythonpath = [
44
45
  "src",
45
46
  "tests"
46
47
  ]
47
- markers = [
48
- "integration"
48
+
49
+ # Simple ignore patterns - uncomment lines to ignore specific tests
50
+ # Just uncomment the patterns you want to ignore:
51
+
52
+ #ignore = [
53
+ # "tests/integration/", # Ignore ALL integration tests
54
+ # "tests/unit/", # Ignore ALL unit tests
55
+ #]
56
+
57
+ # Or ignore specific test files/patterns:
58
+ #ignore = [
59
+ # "tests/integration/test_langchain_bedrock_sample.py",
60
+ # "tests/integration/test_anthropic_*.py",
61
+ # "tests/integration/test_azure_*.py",
62
+ # "tests/integration/test_openai_*.py",
63
+ # "tests/unit/*_processor_test.py",
64
+ #]
65
+
66
+ # Test discovery patterns
67
+ testpaths = [
68
+ "tests"
49
69
  ]
50
70
 
51
71
  [project.optional-dependencies]
@@ -59,13 +79,13 @@ dev = [
59
79
  'langchain-chroma==0.2.4',
60
80
  'langchain-community==0.3.24',
61
81
  'langchain==0.3.25',
62
- 'datasets==2.20.0',
82
+ 'datasets==4.3.0',
63
83
  'numpy==1.26.4',
64
84
  'types-requests==2.31.0.20240106',
65
85
  'InstructorEmbedding==1.0.1',
66
- 'sentence-transformers==2.6.1',
67
86
  'faiss-cpu==1.8.0',
68
87
  'pytest==8.3.5',
88
+ 'pytest-venv',
69
89
  'llama-index==0.13.0',
70
90
  'llama-index-llms-openai==0.5.0',
71
91
  'llama-index-tools-mcp==0.3.0',
@@ -77,7 +97,7 @@ dev = [
77
97
  'mistral-haystack==0.0.2',
78
98
  'langchain-aws==0.2.23',
79
99
  'azure-storage-blob==12.22.0', # this is for blob exporter
80
- 'boto3==1.37.24', # this is for aws exporter
100
+ 'boto3==1.39.0', # this is for aws exporter
81
101
  'llama-index-vector-stores-opensearch==0.6.0',
82
102
  'haystack-ai==2.3.0',
83
103
  'llama-index-llms-azure-openai==0.4.0',
@@ -109,11 +129,27 @@ dev = [
109
129
  'google-generativeai==0.8.5',
110
130
  'openai-agents==0.2.6',
111
131
  'mistralai==1.9.9',
112
- 'huggingface_hub==0.35.3'
132
+ 'huggingface_hub==0.35.3',
133
+ 'litellm==1.77.5',
134
+ 'google-ai-haystack'
135
+ ]
136
+
137
+ dev_tranformers = [
138
+ 'sentence-transformers==3.3.0'
139
+ ]
140
+
141
+ dev_gemini = [
142
+ 'llama-index-llms-gemini==0.6.0'
143
+ ]
144
+
145
+ dev_strands = [
146
+ 'strands-agents==1.11.0',
147
+ 'strands-agents-tools==0.2.10'
113
148
  ]
114
149
 
115
150
  azure = [
116
151
  'azure-storage-blob==12.22.0',
152
+ 'azure-ai-inference'
117
153
  ]
118
154
 
119
155
  aws = [
@@ -92,6 +92,9 @@ CHILD_ERROR_CODE = "child.error.code"
92
92
 
93
93
  AGENT_PREFIX_KEY = "monocle.agent.prefix"
94
94
 
95
+ MONOCLE_SKIP_EXECUTIONS = "monocle.skip_executions"
96
+ SKIPPED_EXECUTION = "monocle.skipped_execution"
97
+
95
98
  # agentic sub types
96
99
  INFERENCE_AGENT_DELEGATION = "delegation"
97
100
  INFERENCE_TOOL_CALL = "tool_call"
@@ -178,3 +181,8 @@ MAP_ATTRIBUTES_TO_SPAN_SUBTYPE = {
178
181
 
179
182
 
180
183
  }
184
+
185
+ PROVIDER_BASE_URLS = {
186
+ "deepseek": "https://api.deepseek.com",
187
+ # Add more providers here later
188
+ }
@@ -1,6 +1,7 @@
1
1
  import logging
2
2
  import os
3
3
  from contextlib import contextmanager
4
+ from typing import Union
4
5
  from opentelemetry.context import get_value, set_value, attach, detach
5
6
  from opentelemetry.sdk.trace import Span
6
7
  from opentelemetry.trace.status import Status, StatusCode
@@ -10,8 +11,8 @@ from monocle_apptrace.instrumentation.common.constants import (
10
11
  service_type_map,
11
12
  MONOCLE_SDK_VERSION, MONOCLE_SDK_LANGUAGE, MONOCLE_DETECTED_SPAN_ERROR
12
13
  )
13
- from monocle_apptrace.instrumentation.common.utils import set_attribute, get_scopes, MonocleSpanException, get_monocle_version
14
- from monocle_apptrace.instrumentation.common.constants import WORKFLOW_TYPE_KEY, WORKFLOW_TYPE_GENERIC, CHILD_ERROR_CODE
14
+ from monocle_apptrace.instrumentation.common.utils import set_attribute, get_scopes, MonocleSpanException, get_monocle_version, replace_placeholders
15
+ from monocle_apptrace.instrumentation.common.constants import WORKFLOW_TYPE_KEY, WORKFLOW_TYPE_GENERIC, CHILD_ERROR_CODE, MONOCLE_SKIP_EXECUTIONS, SKIPPED_EXECUTION
15
16
 
16
17
  logger = logging.getLogger(__name__)
17
18
 
@@ -49,7 +50,7 @@ class SpanHandler:
49
50
  pass
50
51
 
51
52
  def pre_tracing(self, to_wrap, wrapped, instance, args, kwargs):
52
- pass
53
+ return None, None
53
54
 
54
55
  def post_tracing(self, to_wrap, wrapped, instance, args, kwargs, return_value, token=None):
55
56
  pass
@@ -67,8 +68,6 @@ class SpanHandler:
67
68
  span.set_attribute("span.type", span_type)
68
69
  else:
69
70
  logger.warning("type of span not found or incorrect written in entity json")
70
- if "subtype" in output_processor:
71
- span.set_attribute("span.subtype", output_processor["subtype"])
72
71
  return span_type
73
72
 
74
73
  def pre_task_processing(self, to_wrap, wrapped, instance, args,kwargs, span):
@@ -103,28 +102,32 @@ class SpanHandler:
103
102
  def post_task_processing(self, to_wrap, wrapped, instance, args, kwargs, result, ex, span:Span, parent_span:Span):
104
103
  pass
105
104
 
106
- def should_skip(self, processor, instance, args, kwargs) -> bool:
105
+ def should_skip(self, processor, instance, span, parent_span, args, kwargs) -> bool:
107
106
  should_skip = False
108
107
  accessor = processor.get('should_skip')
109
108
  if accessor:
110
- arguments = {"instance":instance, "args":args, "kwargs":kwargs}
111
- should_skip = accessor(arguments)
112
- if not isinstance(should_skip, bool):
113
- logger.warning("Warning: 'should_skip' accessor did not return a boolean value")
114
- return True
109
+ arguments = {"instance":instance, "span":span, "parent_span":parent_span, "args":args, "kwargs":kwargs}
110
+ try:
111
+ should_skip = accessor(arguments)
112
+ if not isinstance(should_skip, bool):
113
+ logger.warning("Warning: 'should_skip' accessor did not return a boolean value")
114
+ return False
115
+ except Exception as e:
116
+ logger.warning("Warning: Error occurred in 'should_skip' accessor: %s", str(e))
115
117
  return should_skip
116
118
 
117
- def hydrate_span(self, to_wrap, wrapped, instance, args, kwargs, result, span, parent_span = None, ex:Exception = None) -> bool:
119
+ def hydrate_span(self, to_wrap, wrapped, instance, args, kwargs, result, span, parent_span = None,
120
+ ex:Exception = None, is_post_exec:bool= False) -> bool:
118
121
  try:
119
- detected_error_in_attribute = self.hydrate_attributes(to_wrap, wrapped, instance, args, kwargs, result, span, parent_span)
120
- detected_error_in_event = self.hydrate_events(to_wrap, wrapped, instance, args, kwargs, result, span, parent_span, ex)
122
+ detected_error_in_attribute = self.hydrate_attributes(to_wrap, wrapped, instance, args, kwargs, result, span, parent_span, is_post_exec)
123
+ detected_error_in_event = self.hydrate_events(to_wrap, wrapped, instance, args, kwargs, result, span, parent_span, ex, is_post_exec)
121
124
  if detected_error_in_attribute or detected_error_in_event:
122
125
  span.set_attribute(MONOCLE_DETECTED_SPAN_ERROR, True)
123
126
  finally:
124
- if span.status.status_code == StatusCode.UNSET and ex is None:
127
+ if is_post_exec and span.status.status_code == StatusCode.UNSET and ex is None:
125
128
  span.set_status(StatusCode.OK)
126
129
 
127
- def hydrate_attributes(self, to_wrap, wrapped, instance, args, kwargs, result, span:Span, parent_span:Span) -> bool:
130
+ def hydrate_attributes(self, to_wrap, wrapped, instance, args, kwargs, result, span:Span, parent_span:Span, is_post_exec:bool) -> bool:
128
131
  detected_error:bool = False
129
132
  span_index = 0
130
133
  if SpanHandler.is_root_span(span):
@@ -133,7 +136,6 @@ class SpanHandler:
133
136
  output_processor=to_wrap['output_processor']
134
137
  self.set_span_type(to_wrap, wrapped, instance, output_processor, span, args, kwargs)
135
138
  skip_processors:list[str] = self.skip_processor(to_wrap, wrapped, instance, span, args, kwargs) or []
136
-
137
139
  if 'attributes' in output_processor and 'attributes' not in skip_processors:
138
140
  arguments = {"instance":instance, "args":args, "kwargs":kwargs, "result":result, "parent_span":parent_span, "span":span}
139
141
  for processors in output_processor["attributes"]:
@@ -144,9 +146,10 @@ class SpanHandler:
144
146
  if attribute and accessor:
145
147
  attribute_name = f"entity.{span_index+1}.{attribute}"
146
148
  try:
147
- processor_result = accessor(arguments)
148
- if processor_result and isinstance(processor_result, (str, list)):
149
- span.set_attribute(attribute_name, processor_result)
149
+ if (not is_post_exec and processor.get('phase', '') != 'post_execution') or (is_post_exec and processor.get('phase', '') == 'post_execution'):
150
+ processor_result = accessor(arguments)
151
+ if processor_result and isinstance(processor_result, (str, list)):
152
+ span.set_attribute(attribute_name, processor_result)
150
153
  except MonocleSpanException as e:
151
154
  span.set_status(StatusCode.ERROR, e.message)
152
155
  detected_error = True
@@ -165,13 +168,27 @@ class SpanHandler:
165
168
  span.set_attribute("entity.count", span_index)
166
169
  return detected_error
167
170
 
168
- def hydrate_events(self, to_wrap, wrapped, instance, args, kwargs, ret_result, span: Span, parent_span=None, ex:Exception=None) -> bool:
171
+ def hydrate_events(self, to_wrap, wrapped, instance, args, kwargs, ret_result, span: Span, parent_span=None, ex:Exception=None,
172
+ is_post_exec: bool = False) -> bool:
169
173
  detected_error:bool = False
170
174
  if 'output_processor' in to_wrap and to_wrap["output_processor"] is not None:
171
175
  output_processor=to_wrap['output_processor']
172
- skip_processors:list[str] = self.skip_processor(to_wrap, wrapped, instance, span, args, kwargs) or []
173
-
176
+ if is_post_exec:
177
+ skip_events:list[str] = ['events.data.input']
178
+ else:
179
+ skip_events:list[str] = ['events.data.output', 'events.metadata']
180
+ skip_processors:list[str] = list(set(self.skip_processor(to_wrap, wrapped, instance, span, args, kwargs) or []).union(set(skip_events)))
174
181
  arguments = {"instance": instance, "args": args, "kwargs": kwargs, "result": ret_result, "exception":ex, "parent_span":parent_span, "span": span}
182
+ subtype = output_processor.get('subtype')
183
+ if subtype:
184
+ if callable(subtype):
185
+ try:
186
+ subtype_result = subtype(arguments)
187
+ span.set_attribute("span.subtype", subtype_result)
188
+ except Exception as e:
189
+ logger.debug(f"Error processing subtype: {e}")
190
+ else:
191
+ span.set_attribute("span.subtype", subtype)
175
192
  # Process events if they are defined in the output_processor.
176
193
  # In case of inference.modelapi skip the event processing unless the span has an exception
177
194
  if 'events' in output_processor and ('events' not in skip_processors or ex is not None):
@@ -200,6 +217,13 @@ class SpanHandler:
200
217
  event_attributes[attribute_key] = result
201
218
  else:
202
219
  event_attributes.update(result)
220
+ if not is_post_exec and event_name == "data.input" and attribute_key == "input" and result:
221
+ # append memory to input if available
222
+ # update the result with new input
223
+ pass
224
+ elif not detected_error and is_post_exec and event_name == "data.output" and attribute_key == "response" and result:
225
+ # capture memory
226
+ pass
203
227
  except Exception as e:
204
228
  logger.debug(f"Error evaluating accessor for attribute '{attribute_key}': {e}")
205
229
  matching_timestamp = getattr(ret_result, "timestamps", {}).get(event_name, None)
@@ -299,6 +323,32 @@ class SpanHandler:
299
323
  finally:
300
324
  SpanHandler.detach_workflow_type(token)
301
325
 
326
+ @staticmethod
327
+ def get_iput_entity_type(span: Span) -> str:
328
+ for event in span.events:
329
+ if event.name == "data.input":
330
+ return event.attributes.get("entity.type", "")
331
+
332
+ @staticmethod
333
+ def skip_execution(span:Span) -> tuple[bool, Union[dict, list, str, None]]:
334
+ skip_execs = get_value(MONOCLE_SKIP_EXECUTIONS)
335
+ if skip_execs is not None:
336
+ skip_exec_entity = skip_execs.get(span.attributes.get("entity.1.name", ""),{})
337
+ if ((span.attributes.get("span.type") is not None and skip_exec_entity.get("span.type", "") == span.attributes.get("span.type")) and
338
+ (span.attributes.get("entity.1.type") is not None and skip_exec_entity.get("entity.type", "") == span.attributes.get("entity.1.type"))):
339
+ span.set_attribute(SKIPPED_EXECUTION, True)
340
+ if skip_exec_entity.get("raise_error", False):
341
+ raise MonocleSpanException(skip_exec_entity.get("error_message", ""))
342
+ response = skip_exec_entity.get("response", None)
343
+ response = replace_placeholders(response, span)
344
+ return True, response
345
+ return False, None
346
+
347
+ @staticmethod
348
+ def replace_placeholders_in_response(response: Union[dict, list, str], span:Span) -> Union[dict, list, str]:
349
+ if span.attributes.get(SKIPPED_EXECUTION, False):
350
+ return replace_placeholders(response, span)
351
+ return response
302
352
 
303
353
  class NonFrameworkSpanHandler(SpanHandler):
304
354
  # If the language framework is being executed, then skip generating direct openAI attributes and events
@@ -1,7 +1,8 @@
1
+ import ast
1
2
  import logging, json
2
3
  import os
3
4
  import traceback
4
- from typing import Callable, Generic, Optional, TypeVar, Mapping
5
+ from typing import Callable, Generic, Optional, TypeVar, Mapping, Union
5
6
 
6
7
  from opentelemetry.context import attach, detach, get_current, get_value, set_value, Context
7
8
  from opentelemetry.trace import NonRecordingSpan, Span
@@ -217,13 +218,16 @@ def remove_scopes(token:object) -> None:
217
218
  if token is not None:
218
219
  detach(token)
219
220
 
220
- def get_scopes() -> dict[str, object]:
221
+ def get_scopes(scope_name: Optional[str] = None) -> dict[str, object]:
221
222
  monocle_scopes:dict[str, object] = {}
222
223
  for key, val in baggage.get_all().items():
223
- if key.startswith(MONOCLE_SCOPE_NAME_PREFIX):
224
+ if key.startswith(MONOCLE_SCOPE_NAME_PREFIX) and (scope_name is None or key == f"{MONOCLE_SCOPE_NAME_PREFIX}{scope_name}"):
224
225
  monocle_scopes[key[len(MONOCLE_SCOPE_NAME_PREFIX):]] = val
225
226
  return monocle_scopes
226
227
 
228
+ def is_scope_set(scepe_name: str) -> bool:
229
+ return len(get_scopes(scepe_name)) > 0
230
+
227
231
  def get_baggage_for_scopes():
228
232
  baggage_context:Context = None
229
233
  for scope_key, scope_value in get_scopes():
@@ -357,7 +361,7 @@ class Option(Generic[T]):
357
361
 
358
362
  def and_then(self, func: Callable[[T], 'Option[U]']) -> 'Option[U]':
359
363
  if self.is_some():
360
- return func(self.value)
364
+ return Option(func(self.value))
361
365
  return Option(None)
362
366
 
363
367
  # Example usage
@@ -409,7 +413,7 @@ def get_error_message(arguments):
409
413
 
410
414
 
411
415
  def get_status_code(arguments):
412
- if arguments["exception"] is not None:
416
+ if "exception" in arguments and arguments["exception"] is not None:
413
417
  return get_exception_status_code(arguments)
414
418
  elif hasattr(arguments["result"], "status"):
415
419
  return arguments["result"].status
@@ -467,4 +471,57 @@ def get_current_monocle_span(context: Optional[Context] = None) -> Span:
467
471
  span = get_value(_MONOCLE_SPAN_KEY, context=context)
468
472
  if span is None or not isinstance(span, Span):
469
473
  return INVALID_SPAN
470
- return span
474
+ return span
475
+
476
+ def get_input_event_from_span(events: list[dict], search_key:str) -> Optional[Mapping]:
477
+ """Extract the 'data.input' event from the span if it exists.
478
+
479
+ Args:
480
+ span: The Span to extract the event from.
481
+
482
+ Returns:
483
+ The 'data.input' event if it exists, None otherwise.
484
+ """
485
+ input_request = None
486
+ for event in events:
487
+ if event.name == "data.input":
488
+ try:
489
+ #load the input attribute as dictionary from string
490
+ try:
491
+ input_dict = json.loads(event.attributes.get("input", "{}"))
492
+ except Exception as e:
493
+ if isinstance(e, json.JSONDecodeError):
494
+ input_dict = ast.literal_eval(event.attributes.get("input", {}))
495
+ else:
496
+ raise
497
+ if search_key in input_dict:
498
+ input_request = input_dict[search_key]
499
+ except Exception as e:
500
+ logger.debug(f"Error parsing input event attribute: {e}")
501
+ break
502
+ return input_request
503
+
504
+ def replace_placeholders(obj: Union[dict, list, str], span: Span) -> Union[dict, list, str]:
505
+ """Replace placeholders in strings with span context values."""
506
+ if isinstance(obj, dict):
507
+ return {k: replace_placeholders(v, span) for k, v in obj.items()}
508
+ elif isinstance(obj, list):
509
+ return [replace_placeholders(item, span) for item in obj]
510
+ elif isinstance(obj, str):
511
+ startIndex = 0
512
+ while True:
513
+ start = obj.find("{{", startIndex)
514
+ end = obj.find("}}", start + 2)
515
+ if start == -1 or end == -1:
516
+ break
517
+ key = obj[start + 2:end].strip()
518
+ value = get_input_event_from_span(span.events, key)
519
+ if value is not None:
520
+ obj = obj[:start] + str(value) + obj[end + 2:]
521
+ startIndex = start + len(str(value))
522
+ if startIndex >= len(obj):
523
+ break
524
+ return obj
525
+ else:
526
+ return obj
527
+