aiecs 1.5.1__py3-none-any.whl

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.
Files changed (302) hide show
  1. aiecs/__init__.py +72 -0
  2. aiecs/__main__.py +41 -0
  3. aiecs/aiecs_client.py +469 -0
  4. aiecs/application/__init__.py +10 -0
  5. aiecs/application/executors/__init__.py +10 -0
  6. aiecs/application/executors/operation_executor.py +363 -0
  7. aiecs/application/knowledge_graph/__init__.py +7 -0
  8. aiecs/application/knowledge_graph/builder/__init__.py +37 -0
  9. aiecs/application/knowledge_graph/builder/document_builder.py +375 -0
  10. aiecs/application/knowledge_graph/builder/graph_builder.py +356 -0
  11. aiecs/application/knowledge_graph/builder/schema_mapping.py +531 -0
  12. aiecs/application/knowledge_graph/builder/structured_pipeline.py +443 -0
  13. aiecs/application/knowledge_graph/builder/text_chunker.py +319 -0
  14. aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
  15. aiecs/application/knowledge_graph/extractors/base.py +100 -0
  16. aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +327 -0
  17. aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +349 -0
  18. aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +244 -0
  19. aiecs/application/knowledge_graph/fusion/__init__.py +23 -0
  20. aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +387 -0
  21. aiecs/application/knowledge_graph/fusion/entity_linker.py +343 -0
  22. aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +580 -0
  23. aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +189 -0
  24. aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
  25. aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +344 -0
  26. aiecs/application/knowledge_graph/pattern_matching/query_executor.py +378 -0
  27. aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
  28. aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +199 -0
  29. aiecs/application/knowledge_graph/profiling/query_profiler.py +223 -0
  30. aiecs/application/knowledge_graph/reasoning/__init__.py +27 -0
  31. aiecs/application/knowledge_graph/reasoning/evidence_synthesis.py +347 -0
  32. aiecs/application/knowledge_graph/reasoning/inference_engine.py +504 -0
  33. aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +167 -0
  34. aiecs/application/knowledge_graph/reasoning/logic_parser/__init__.py +79 -0
  35. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_builder.py +513 -0
  36. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_nodes.py +630 -0
  37. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +654 -0
  38. aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +477 -0
  39. aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +390 -0
  40. aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +217 -0
  41. aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +169 -0
  42. aiecs/application/knowledge_graph/reasoning/query_planner.py +872 -0
  43. aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +554 -0
  44. aiecs/application/knowledge_graph/retrieval/__init__.py +19 -0
  45. aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +596 -0
  46. aiecs/application/knowledge_graph/search/__init__.py +59 -0
  47. aiecs/application/knowledge_graph/search/hybrid_search.py +423 -0
  48. aiecs/application/knowledge_graph/search/reranker.py +295 -0
  49. aiecs/application/knowledge_graph/search/reranker_strategies.py +553 -0
  50. aiecs/application/knowledge_graph/search/text_similarity.py +398 -0
  51. aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
  52. aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +329 -0
  53. aiecs/application/knowledge_graph/traversal/path_scorer.py +269 -0
  54. aiecs/application/knowledge_graph/validators/__init__.py +13 -0
  55. aiecs/application/knowledge_graph/validators/relation_validator.py +189 -0
  56. aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
  57. aiecs/application/knowledge_graph/visualization/graph_visualizer.py +321 -0
  58. aiecs/common/__init__.py +9 -0
  59. aiecs/common/knowledge_graph/__init__.py +17 -0
  60. aiecs/common/knowledge_graph/runnable.py +484 -0
  61. aiecs/config/__init__.py +16 -0
  62. aiecs/config/config.py +498 -0
  63. aiecs/config/graph_config.py +137 -0
  64. aiecs/config/registry.py +23 -0
  65. aiecs/core/__init__.py +46 -0
  66. aiecs/core/interface/__init__.py +34 -0
  67. aiecs/core/interface/execution_interface.py +152 -0
  68. aiecs/core/interface/storage_interface.py +171 -0
  69. aiecs/domain/__init__.py +289 -0
  70. aiecs/domain/agent/__init__.py +189 -0
  71. aiecs/domain/agent/base_agent.py +697 -0
  72. aiecs/domain/agent/exceptions.py +103 -0
  73. aiecs/domain/agent/graph_aware_mixin.py +559 -0
  74. aiecs/domain/agent/hybrid_agent.py +490 -0
  75. aiecs/domain/agent/integration/__init__.py +26 -0
  76. aiecs/domain/agent/integration/context_compressor.py +222 -0
  77. aiecs/domain/agent/integration/context_engine_adapter.py +252 -0
  78. aiecs/domain/agent/integration/retry_policy.py +219 -0
  79. aiecs/domain/agent/integration/role_config.py +213 -0
  80. aiecs/domain/agent/knowledge_aware_agent.py +646 -0
  81. aiecs/domain/agent/lifecycle.py +296 -0
  82. aiecs/domain/agent/llm_agent.py +300 -0
  83. aiecs/domain/agent/memory/__init__.py +12 -0
  84. aiecs/domain/agent/memory/conversation.py +197 -0
  85. aiecs/domain/agent/migration/__init__.py +14 -0
  86. aiecs/domain/agent/migration/conversion.py +160 -0
  87. aiecs/domain/agent/migration/legacy_wrapper.py +90 -0
  88. aiecs/domain/agent/models.py +317 -0
  89. aiecs/domain/agent/observability.py +407 -0
  90. aiecs/domain/agent/persistence.py +289 -0
  91. aiecs/domain/agent/prompts/__init__.py +29 -0
  92. aiecs/domain/agent/prompts/builder.py +161 -0
  93. aiecs/domain/agent/prompts/formatters.py +189 -0
  94. aiecs/domain/agent/prompts/template.py +255 -0
  95. aiecs/domain/agent/registry.py +260 -0
  96. aiecs/domain/agent/tool_agent.py +257 -0
  97. aiecs/domain/agent/tools/__init__.py +12 -0
  98. aiecs/domain/agent/tools/schema_generator.py +221 -0
  99. aiecs/domain/community/__init__.py +155 -0
  100. aiecs/domain/community/agent_adapter.py +477 -0
  101. aiecs/domain/community/analytics.py +481 -0
  102. aiecs/domain/community/collaborative_workflow.py +642 -0
  103. aiecs/domain/community/communication_hub.py +645 -0
  104. aiecs/domain/community/community_builder.py +320 -0
  105. aiecs/domain/community/community_integration.py +800 -0
  106. aiecs/domain/community/community_manager.py +813 -0
  107. aiecs/domain/community/decision_engine.py +879 -0
  108. aiecs/domain/community/exceptions.py +225 -0
  109. aiecs/domain/community/models/__init__.py +33 -0
  110. aiecs/domain/community/models/community_models.py +268 -0
  111. aiecs/domain/community/resource_manager.py +457 -0
  112. aiecs/domain/community/shared_context_manager.py +603 -0
  113. aiecs/domain/context/__init__.py +58 -0
  114. aiecs/domain/context/context_engine.py +989 -0
  115. aiecs/domain/context/conversation_models.py +354 -0
  116. aiecs/domain/context/graph_memory.py +467 -0
  117. aiecs/domain/execution/__init__.py +12 -0
  118. aiecs/domain/execution/model.py +57 -0
  119. aiecs/domain/knowledge_graph/__init__.py +19 -0
  120. aiecs/domain/knowledge_graph/models/__init__.py +52 -0
  121. aiecs/domain/knowledge_graph/models/entity.py +130 -0
  122. aiecs/domain/knowledge_graph/models/evidence.py +194 -0
  123. aiecs/domain/knowledge_graph/models/inference_rule.py +186 -0
  124. aiecs/domain/knowledge_graph/models/path.py +179 -0
  125. aiecs/domain/knowledge_graph/models/path_pattern.py +173 -0
  126. aiecs/domain/knowledge_graph/models/query.py +272 -0
  127. aiecs/domain/knowledge_graph/models/query_plan.py +187 -0
  128. aiecs/domain/knowledge_graph/models/relation.py +136 -0
  129. aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
  130. aiecs/domain/knowledge_graph/schema/entity_type.py +135 -0
  131. aiecs/domain/knowledge_graph/schema/graph_schema.py +271 -0
  132. aiecs/domain/knowledge_graph/schema/property_schema.py +155 -0
  133. aiecs/domain/knowledge_graph/schema/relation_type.py +171 -0
  134. aiecs/domain/knowledge_graph/schema/schema_manager.py +496 -0
  135. aiecs/domain/knowledge_graph/schema/type_enums.py +205 -0
  136. aiecs/domain/task/__init__.py +13 -0
  137. aiecs/domain/task/dsl_processor.py +613 -0
  138. aiecs/domain/task/model.py +62 -0
  139. aiecs/domain/task/task_context.py +268 -0
  140. aiecs/infrastructure/__init__.py +24 -0
  141. aiecs/infrastructure/graph_storage/__init__.py +11 -0
  142. aiecs/infrastructure/graph_storage/base.py +601 -0
  143. aiecs/infrastructure/graph_storage/batch_operations.py +449 -0
  144. aiecs/infrastructure/graph_storage/cache.py +429 -0
  145. aiecs/infrastructure/graph_storage/distributed.py +226 -0
  146. aiecs/infrastructure/graph_storage/error_handling.py +390 -0
  147. aiecs/infrastructure/graph_storage/graceful_degradation.py +306 -0
  148. aiecs/infrastructure/graph_storage/health_checks.py +378 -0
  149. aiecs/infrastructure/graph_storage/in_memory.py +514 -0
  150. aiecs/infrastructure/graph_storage/index_optimization.py +483 -0
  151. aiecs/infrastructure/graph_storage/lazy_loading.py +410 -0
  152. aiecs/infrastructure/graph_storage/metrics.py +357 -0
  153. aiecs/infrastructure/graph_storage/migration.py +413 -0
  154. aiecs/infrastructure/graph_storage/pagination.py +471 -0
  155. aiecs/infrastructure/graph_storage/performance_monitoring.py +466 -0
  156. aiecs/infrastructure/graph_storage/postgres.py +871 -0
  157. aiecs/infrastructure/graph_storage/query_optimizer.py +635 -0
  158. aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
  159. aiecs/infrastructure/graph_storage/sqlite.py +623 -0
  160. aiecs/infrastructure/graph_storage/streaming.py +495 -0
  161. aiecs/infrastructure/messaging/__init__.py +13 -0
  162. aiecs/infrastructure/messaging/celery_task_manager.py +383 -0
  163. aiecs/infrastructure/messaging/websocket_manager.py +298 -0
  164. aiecs/infrastructure/monitoring/__init__.py +34 -0
  165. aiecs/infrastructure/monitoring/executor_metrics.py +174 -0
  166. aiecs/infrastructure/monitoring/global_metrics_manager.py +213 -0
  167. aiecs/infrastructure/monitoring/structured_logger.py +48 -0
  168. aiecs/infrastructure/monitoring/tracing_manager.py +410 -0
  169. aiecs/infrastructure/persistence/__init__.py +24 -0
  170. aiecs/infrastructure/persistence/context_engine_client.py +187 -0
  171. aiecs/infrastructure/persistence/database_manager.py +333 -0
  172. aiecs/infrastructure/persistence/file_storage.py +754 -0
  173. aiecs/infrastructure/persistence/redis_client.py +220 -0
  174. aiecs/llm/__init__.py +86 -0
  175. aiecs/llm/callbacks/__init__.py +11 -0
  176. aiecs/llm/callbacks/custom_callbacks.py +264 -0
  177. aiecs/llm/client_factory.py +420 -0
  178. aiecs/llm/clients/__init__.py +33 -0
  179. aiecs/llm/clients/base_client.py +193 -0
  180. aiecs/llm/clients/googleai_client.py +181 -0
  181. aiecs/llm/clients/openai_client.py +131 -0
  182. aiecs/llm/clients/vertex_client.py +437 -0
  183. aiecs/llm/clients/xai_client.py +184 -0
  184. aiecs/llm/config/__init__.py +51 -0
  185. aiecs/llm/config/config_loader.py +275 -0
  186. aiecs/llm/config/config_validator.py +236 -0
  187. aiecs/llm/config/model_config.py +151 -0
  188. aiecs/llm/utils/__init__.py +10 -0
  189. aiecs/llm/utils/validate_config.py +91 -0
  190. aiecs/main.py +363 -0
  191. aiecs/scripts/__init__.py +3 -0
  192. aiecs/scripts/aid/VERSION_MANAGEMENT.md +97 -0
  193. aiecs/scripts/aid/__init__.py +19 -0
  194. aiecs/scripts/aid/version_manager.py +215 -0
  195. aiecs/scripts/dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md +242 -0
  196. aiecs/scripts/dependance_check/README_DEPENDENCY_CHECKER.md +310 -0
  197. aiecs/scripts/dependance_check/__init__.py +17 -0
  198. aiecs/scripts/dependance_check/dependency_checker.py +938 -0
  199. aiecs/scripts/dependance_check/dependency_fixer.py +391 -0
  200. aiecs/scripts/dependance_check/download_nlp_data.py +396 -0
  201. aiecs/scripts/dependance_check/quick_dependency_check.py +270 -0
  202. aiecs/scripts/dependance_check/setup_nlp_data.sh +217 -0
  203. aiecs/scripts/dependance_patch/__init__.py +7 -0
  204. aiecs/scripts/dependance_patch/fix_weasel/README_WEASEL_PATCH.md +126 -0
  205. aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
  206. aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.py +128 -0
  207. aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.sh +82 -0
  208. aiecs/scripts/dependance_patch/fix_weasel/patch_weasel_library.sh +188 -0
  209. aiecs/scripts/dependance_patch/fix_weasel/run_weasel_patch.sh +41 -0
  210. aiecs/scripts/tools_develop/README.md +449 -0
  211. aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
  212. aiecs/scripts/tools_develop/__init__.py +21 -0
  213. aiecs/scripts/tools_develop/check_type_annotations.py +259 -0
  214. aiecs/scripts/tools_develop/validate_tool_schemas.py +422 -0
  215. aiecs/scripts/tools_develop/verify_tools.py +356 -0
  216. aiecs/tasks/__init__.py +1 -0
  217. aiecs/tasks/worker.py +172 -0
  218. aiecs/tools/__init__.py +299 -0
  219. aiecs/tools/apisource/__init__.py +99 -0
  220. aiecs/tools/apisource/intelligence/__init__.py +19 -0
  221. aiecs/tools/apisource/intelligence/data_fusion.py +381 -0
  222. aiecs/tools/apisource/intelligence/query_analyzer.py +413 -0
  223. aiecs/tools/apisource/intelligence/search_enhancer.py +388 -0
  224. aiecs/tools/apisource/monitoring/__init__.py +9 -0
  225. aiecs/tools/apisource/monitoring/metrics.py +303 -0
  226. aiecs/tools/apisource/providers/__init__.py +115 -0
  227. aiecs/tools/apisource/providers/base.py +664 -0
  228. aiecs/tools/apisource/providers/census.py +401 -0
  229. aiecs/tools/apisource/providers/fred.py +564 -0
  230. aiecs/tools/apisource/providers/newsapi.py +412 -0
  231. aiecs/tools/apisource/providers/worldbank.py +357 -0
  232. aiecs/tools/apisource/reliability/__init__.py +12 -0
  233. aiecs/tools/apisource/reliability/error_handler.py +375 -0
  234. aiecs/tools/apisource/reliability/fallback_strategy.py +391 -0
  235. aiecs/tools/apisource/tool.py +850 -0
  236. aiecs/tools/apisource/utils/__init__.py +9 -0
  237. aiecs/tools/apisource/utils/validators.py +338 -0
  238. aiecs/tools/base_tool.py +201 -0
  239. aiecs/tools/docs/__init__.py +121 -0
  240. aiecs/tools/docs/ai_document_orchestrator.py +599 -0
  241. aiecs/tools/docs/ai_document_writer_orchestrator.py +2403 -0
  242. aiecs/tools/docs/content_insertion_tool.py +1333 -0
  243. aiecs/tools/docs/document_creator_tool.py +1317 -0
  244. aiecs/tools/docs/document_layout_tool.py +1166 -0
  245. aiecs/tools/docs/document_parser_tool.py +994 -0
  246. aiecs/tools/docs/document_writer_tool.py +1818 -0
  247. aiecs/tools/knowledge_graph/__init__.py +17 -0
  248. aiecs/tools/knowledge_graph/graph_reasoning_tool.py +734 -0
  249. aiecs/tools/knowledge_graph/graph_search_tool.py +923 -0
  250. aiecs/tools/knowledge_graph/kg_builder_tool.py +476 -0
  251. aiecs/tools/langchain_adapter.py +542 -0
  252. aiecs/tools/schema_generator.py +275 -0
  253. aiecs/tools/search_tool/__init__.py +100 -0
  254. aiecs/tools/search_tool/analyzers.py +589 -0
  255. aiecs/tools/search_tool/cache.py +260 -0
  256. aiecs/tools/search_tool/constants.py +128 -0
  257. aiecs/tools/search_tool/context.py +216 -0
  258. aiecs/tools/search_tool/core.py +749 -0
  259. aiecs/tools/search_tool/deduplicator.py +123 -0
  260. aiecs/tools/search_tool/error_handler.py +271 -0
  261. aiecs/tools/search_tool/metrics.py +371 -0
  262. aiecs/tools/search_tool/rate_limiter.py +178 -0
  263. aiecs/tools/search_tool/schemas.py +277 -0
  264. aiecs/tools/statistics/__init__.py +80 -0
  265. aiecs/tools/statistics/ai_data_analysis_orchestrator.py +643 -0
  266. aiecs/tools/statistics/ai_insight_generator_tool.py +505 -0
  267. aiecs/tools/statistics/ai_report_orchestrator_tool.py +694 -0
  268. aiecs/tools/statistics/data_loader_tool.py +564 -0
  269. aiecs/tools/statistics/data_profiler_tool.py +658 -0
  270. aiecs/tools/statistics/data_transformer_tool.py +573 -0
  271. aiecs/tools/statistics/data_visualizer_tool.py +495 -0
  272. aiecs/tools/statistics/model_trainer_tool.py +487 -0
  273. aiecs/tools/statistics/statistical_analyzer_tool.py +459 -0
  274. aiecs/tools/task_tools/__init__.py +86 -0
  275. aiecs/tools/task_tools/chart_tool.py +732 -0
  276. aiecs/tools/task_tools/classfire_tool.py +922 -0
  277. aiecs/tools/task_tools/image_tool.py +447 -0
  278. aiecs/tools/task_tools/office_tool.py +684 -0
  279. aiecs/tools/task_tools/pandas_tool.py +635 -0
  280. aiecs/tools/task_tools/report_tool.py +635 -0
  281. aiecs/tools/task_tools/research_tool.py +392 -0
  282. aiecs/tools/task_tools/scraper_tool.py +715 -0
  283. aiecs/tools/task_tools/stats_tool.py +688 -0
  284. aiecs/tools/temp_file_manager.py +130 -0
  285. aiecs/tools/tool_executor/__init__.py +37 -0
  286. aiecs/tools/tool_executor/tool_executor.py +881 -0
  287. aiecs/utils/LLM_output_structor.py +445 -0
  288. aiecs/utils/__init__.py +34 -0
  289. aiecs/utils/base_callback.py +47 -0
  290. aiecs/utils/cache_provider.py +695 -0
  291. aiecs/utils/execution_utils.py +184 -0
  292. aiecs/utils/logging.py +1 -0
  293. aiecs/utils/prompt_loader.py +14 -0
  294. aiecs/utils/token_usage_repository.py +323 -0
  295. aiecs/ws/__init__.py +0 -0
  296. aiecs/ws/socket_server.py +52 -0
  297. aiecs-1.5.1.dist-info/METADATA +608 -0
  298. aiecs-1.5.1.dist-info/RECORD +302 -0
  299. aiecs-1.5.1.dist-info/WHEEL +5 -0
  300. aiecs-1.5.1.dist-info/entry_points.txt +10 -0
  301. aiecs-1.5.1.dist-info/licenses/LICENSE +225 -0
  302. aiecs-1.5.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,357 @@
1
+ """
2
+ Monitoring Metrics for Graph Storage
3
+
4
+ Provides metrics collection and export for production monitoring,
5
+ including query latency, cache hit rates, and resource usage.
6
+ """
7
+
8
+ import logging
9
+ from typing import Dict, Any, Optional, List
10
+ from dataclasses import dataclass, field
11
+ from collections import defaultdict, deque
12
+ from datetime import datetime
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ @dataclass
18
+ class Metric:
19
+ """Single metric value"""
20
+
21
+ name: str
22
+ value: float
23
+ timestamp: Optional[datetime] = None
24
+ tags: Dict[str, str] = field(default_factory=dict)
25
+
26
+ def __post_init__(self):
27
+ if self.timestamp is None:
28
+ self.timestamp = datetime.utcnow()
29
+
30
+ def to_dict(self) -> Dict[str, Any]:
31
+ """Convert to dictionary"""
32
+ return {
33
+ "name": self.name,
34
+ "value": self.value,
35
+ "timestamp": self.timestamp.isoformat(),
36
+ "tags": self.tags,
37
+ }
38
+
39
+
40
+ class MetricsCollector:
41
+ """
42
+ Metrics collector for graph storage operations
43
+
44
+ Collects and aggregates metrics for monitoring systems.
45
+
46
+ Example:
47
+ ```python
48
+ collector = MetricsCollector()
49
+
50
+ # Record metrics
51
+ collector.record_latency("get_entity", 12.5)
52
+ collector.record_cache_hit()
53
+ collector.record_error("connection_error")
54
+
55
+ # Export metrics
56
+ metrics = collector.get_metrics()
57
+ ```
58
+ """
59
+
60
+ def __init__(self, window_seconds: int = 300):
61
+ """
62
+ Initialize metrics collector
63
+
64
+ Args:
65
+ window_seconds: Time window for metric aggregation
66
+ """
67
+ self.window_seconds = window_seconds
68
+
69
+ # Latency metrics
70
+ self.latency_metrics: Dict[str, deque] = defaultdict(lambda: deque(maxlen=1000))
71
+
72
+ # Counter metrics
73
+ self.counters: Dict[str, int] = defaultdict(int)
74
+
75
+ # Cache metrics
76
+ self.cache_hits = 0
77
+ self.cache_misses = 0
78
+
79
+ # Error metrics
80
+ self.error_counts: Dict[str, int] = defaultdict(int)
81
+
82
+ # Resource metrics
83
+ self.resource_metrics: Dict[str, deque] = defaultdict(lambda: deque(maxlen=100))
84
+
85
+ def record_latency(
86
+ self,
87
+ operation: str,
88
+ latency_ms: float,
89
+ tags: Optional[Dict[str, str]] = None,
90
+ ) -> None:
91
+ """
92
+ Record operation latency
93
+
94
+ Args:
95
+ operation: Operation name
96
+ latency_ms: Latency in milliseconds
97
+ tags: Optional tags for the metric
98
+ """
99
+ self.latency_metrics[operation].append(
100
+ {
101
+ "value": latency_ms,
102
+ "timestamp": datetime.utcnow(),
103
+ "tags": tags or {},
104
+ }
105
+ )
106
+
107
+ def record_cache_hit(self) -> None:
108
+ """Record a cache hit"""
109
+ self.cache_hits += 1
110
+
111
+ def record_cache_miss(self) -> None:
112
+ """Record a cache miss"""
113
+ self.cache_misses += 1
114
+
115
+ def record_error(self, error_type: str) -> None:
116
+ """
117
+ Record an error
118
+
119
+ Args:
120
+ error_type: Type of error
121
+ """
122
+ self.error_counts[error_type] += 1
123
+
124
+ def record_counter(self, name: str, value: int = 1) -> None:
125
+ """
126
+ Record a counter metric
127
+
128
+ Args:
129
+ name: Counter name
130
+ value: Counter increment
131
+ """
132
+ self.counters[name] += value
133
+
134
+ def record_resource_metric(self, name: str, value: float) -> None:
135
+ """
136
+ Record a resource metric (e.g., memory, connections)
137
+
138
+ Args:
139
+ name: Metric name
140
+ value: Metric value
141
+ """
142
+ self.resource_metrics[name].append({"value": value, "timestamp": datetime.utcnow()})
143
+
144
+ def get_cache_hit_rate(self) -> float:
145
+ """
146
+ Get cache hit rate
147
+
148
+ Returns:
149
+ Cache hit rate (0.0 to 1.0)
150
+ """
151
+ total = self.cache_hits + self.cache_misses
152
+ if total == 0:
153
+ return 0.0
154
+ return self.cache_hits / total
155
+
156
+ def get_latency_stats(self, operation: str) -> Dict[str, float]:
157
+ """
158
+ Get latency statistics for an operation
159
+
160
+ Args:
161
+ operation: Operation name
162
+
163
+ Returns:
164
+ Dictionary with min, max, avg, p50, p95, p99
165
+ """
166
+ latencies = self.latency_metrics.get(operation, deque())
167
+ if not latencies:
168
+ return {
169
+ "min": 0.0,
170
+ "max": 0.0,
171
+ "avg": 0.0,
172
+ "p50": 0.0,
173
+ "p95": 0.0,
174
+ "p99": 0.0,
175
+ "count": 0,
176
+ }
177
+
178
+ values = [m["value"] for m in latencies]
179
+ sorted_values = sorted(values)
180
+ count = len(sorted_values)
181
+
182
+ return {
183
+ "min": min(values),
184
+ "max": max(values),
185
+ "avg": sum(values) / count,
186
+ "p50": sorted_values[int(count * 0.50)] if count > 0 else 0.0,
187
+ "p95": sorted_values[int(count * 0.95)] if count > 0 else 0.0,
188
+ "p99": sorted_values[int(count * 0.99)] if count > 0 else 0.0,
189
+ "count": count,
190
+ }
191
+
192
+ def get_metrics(self) -> Dict[str, Any]:
193
+ """
194
+ Get all metrics in a format suitable for monitoring systems
195
+
196
+ Returns:
197
+ Dictionary with all metrics
198
+ """
199
+ # Aggregate latency metrics
200
+ latency_stats = {}
201
+ for operation in self.latency_metrics:
202
+ latency_stats[operation] = self.get_latency_stats(operation)
203
+
204
+ # Calculate cache metrics
205
+ cache_total = self.cache_hits + self.cache_misses
206
+ cache_metrics = {
207
+ "hits": self.cache_hits,
208
+ "misses": self.cache_misses,
209
+ "total": cache_total,
210
+ "hit_rate": self.get_cache_hit_rate(),
211
+ }
212
+
213
+ # Resource metrics (average over window)
214
+ resource_avgs = {}
215
+ for name, values in self.resource_metrics.items():
216
+ if values:
217
+ recent = [
218
+ v["value"]
219
+ for v in values
220
+ if (datetime.utcnow() - v["timestamp"]).total_seconds() <= self.window_seconds
221
+ ]
222
+ if recent:
223
+ resource_avgs[name] = sum(recent) / len(recent)
224
+
225
+ return {
226
+ "latency": latency_stats,
227
+ "cache": cache_metrics,
228
+ "counters": dict(self.counters),
229
+ "errors": dict(self.error_counts),
230
+ "resources": resource_avgs,
231
+ "timestamp": datetime.utcnow().isoformat(),
232
+ }
233
+
234
+ def reset(self) -> None:
235
+ """Reset all metrics"""
236
+ self.latency_metrics.clear()
237
+ self.counters.clear()
238
+ self.cache_hits = 0
239
+ self.cache_misses = 0
240
+ self.error_counts.clear()
241
+ self.resource_metrics.clear()
242
+ logger.info("Metrics reset")
243
+
244
+
245
+ class MetricsExporter:
246
+ """
247
+ Export metrics to monitoring systems
248
+
249
+ Supports Prometheus, StatsD, and custom formats.
250
+
251
+ Example:
252
+ ```python
253
+ exporter = MetricsExporter(collector)
254
+
255
+ # Export to Prometheus format
256
+ prometheus_metrics = exporter.to_prometheus()
257
+
258
+ # Export to StatsD format
259
+ statsd_metrics = exporter.to_statsd()
260
+ ```
261
+ """
262
+
263
+ def __init__(self, collector: MetricsCollector):
264
+ """
265
+ Initialize metrics exporter
266
+
267
+ Args:
268
+ collector: Metrics collector instance
269
+ """
270
+ self.collector = collector
271
+
272
+ def to_prometheus(self) -> str:
273
+ """
274
+ Export metrics in Prometheus format
275
+
276
+ Returns:
277
+ Prometheus metrics text format
278
+ """
279
+ metrics = self.collector.get_metrics()
280
+ lines = []
281
+
282
+ # Latency metrics
283
+ for operation, stats in metrics["latency"].items():
284
+ lines.append("# TYPE graph_store_latency_seconds histogram")
285
+ lines.append(
286
+ f'graph_store_latency_seconds{{operation="{operation}",quantile="0.5"}} {stats["p50"]/1000}'
287
+ )
288
+ lines.append(
289
+ f'graph_store_latency_seconds{{operation="{operation}",quantile="0.95"}} {stats["p95"]/1000}'
290
+ )
291
+ lines.append(
292
+ f'graph_store_latency_seconds{{operation="{operation}",quantile="0.99"}} {stats["p99"]/1000}'
293
+ )
294
+ lines.append(
295
+ f'graph_store_latency_seconds_count{{operation="{operation}"}} {stats["count"]}'
296
+ )
297
+ lines.append(
298
+ f'graph_store_latency_seconds_sum{{operation="{operation}"}} {stats["avg"] * stats["count"] / 1000}'
299
+ )
300
+
301
+ # Cache metrics
302
+ cache = metrics["cache"]
303
+ lines.append("# TYPE graph_store_cache_hits counter")
304
+ lines.append(f'graph_store_cache_hits {cache["hits"]}')
305
+ lines.append("# TYPE graph_store_cache_misses counter")
306
+ lines.append(f'graph_store_cache_misses {cache["misses"]}')
307
+ lines.append("# TYPE graph_store_cache_hit_rate gauge")
308
+ lines.append(f'graph_store_cache_hit_rate {cache["hit_rate"]}')
309
+
310
+ # Error metrics
311
+ for error_type, count in metrics["errors"].items():
312
+ lines.append("# TYPE graph_store_errors counter")
313
+ lines.append(f'graph_store_errors{{type="{error_type}"}} {count}')
314
+
315
+ # Counter metrics
316
+ for name, value in metrics["counters"].items():
317
+ lines.append("# TYPE graph_store_counter counter")
318
+ lines.append(f'graph_store_counter{{name="{name}"}} {value}')
319
+
320
+ return "\n".join(lines)
321
+
322
+ def to_statsd(self) -> List[str]:
323
+ """
324
+ Export metrics in StatsD format
325
+
326
+ Returns:
327
+ List of StatsD metric strings
328
+ """
329
+ metrics = self.collector.get_metrics()
330
+ lines = []
331
+
332
+ # Latency metrics
333
+ for operation, stats in metrics["latency"].items():
334
+ lines.append(f'graph_store.latency.{operation}:{stats["avg"]}|ms')
335
+ lines.append(f'graph_store.latency.{operation}.p95:{stats["p95"]}|ms')
336
+ lines.append(f'graph_store.latency.{operation}.p99:{stats["p99"]}|ms')
337
+
338
+ # Cache metrics
339
+ cache = metrics["cache"]
340
+ lines.append(f'graph_store.cache.hits:{cache["hits"]}|c')
341
+ lines.append(f'graph_store.cache.misses:{cache["misses"]}|c')
342
+ lines.append(f'graph_store.cache.hit_rate:{cache["hit_rate"]}|g')
343
+
344
+ # Error metrics
345
+ for error_type, count in metrics["errors"].items():
346
+ lines.append(f"graph_store.errors.{error_type}:{count}|c")
347
+
348
+ return lines
349
+
350
+ def to_dict(self) -> Dict[str, Any]:
351
+ """
352
+ Export metrics as dictionary (for JSON APIs)
353
+
354
+ Returns:
355
+ Dictionary with all metrics
356
+ """
357
+ return self.collector.get_metrics()