ragaai-catalyst 2.1.4b5__py3-none-any.whl → 2.1.4b7__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.
@@ -528,12 +528,12 @@ class AgentTracerMixin:
528
528
  metrics = []
529
529
  if name in self.span_attributes_dict:
530
530
  raw_metrics = self.span_attributes_dict[name].metrics or []
531
- # Check for duplicates
532
531
  for metric in raw_metrics:
533
- metric_name = metric["name"]
534
- if self.visited_metrics.count(metric_name) >= 1:
535
- raise ValueError(f"Duplicate metric '{metric_name}' found in trace. Metric names must be unique across all spans.")
532
+ base_metric_name = metric["name"]
533
+ counter = sum(1 for x in self.visited_metrics if x.startswith(base_metric_name))
534
+ metric_name = f'{base_metric_name}_{counter}' if counter > 0 else base_metric_name
536
535
  self.visited_metrics.append(metric_name)
536
+ metric["name"] = metric_name
537
537
  metrics.append(metric)
538
538
 
539
539
  component = {
@@ -9,6 +9,8 @@ from typing import List, Any
9
9
  import uuid
10
10
  import sys
11
11
  import tempfile
12
+ import threading
13
+ import time
12
14
  from ....ragaai_catalyst import RagaAICatalyst
13
15
  from ..data.data_structure import (
14
16
  Trace,
@@ -87,6 +89,14 @@ class BaseTracer:
87
89
  self.file_tracker = TrackName()
88
90
  self.span_attributes_dict = {}
89
91
 
92
+ self.interval_time = self.user_details['interval_time']
93
+ self.memory_usage_list = []
94
+ self.cpu_usage_list = []
95
+ self.disk_usage_list = []
96
+ self.network_usage_list = []
97
+ self.tracking_thread = None
98
+ self.tracking = False
99
+
90
100
  def _get_system_info(self) -> SystemInfo:
91
101
  # Get OS info
92
102
  os_info = OSInfo(
@@ -158,8 +168,49 @@ class BaseTracer:
158
168
 
159
169
  return Resources(cpu=cpu, memory=mem, disk=disk_resource, network=net)
160
170
 
171
+ def _track_memory_usage(self):
172
+ self.memory_usage_list = []
173
+ while self.tracking:
174
+ memory_usage = psutil.Process().memory_info().rss
175
+ self.memory_usage_list.append(memory_usage / (1024 * 1024)) # Convert to MB and append to the list
176
+ time.sleep(self.interval_time)
177
+
178
+ def _track_cpu_usage(self):
179
+ self.cpu_usage_list = []
180
+ while self.tracking:
181
+ cpu_usage = psutil.cpu_percent(interval=self.interval_time)
182
+ self.cpu_usage_list.append(cpu_usage)
183
+ time.sleep(self.interval_time)
184
+
185
+ def _track_disk_usage(self):
186
+ self.disk_usage_list = []
187
+ while self.tracking:
188
+ disk_io = psutil.disk_io_counters()
189
+ self.disk_usage_list.append({
190
+ 'disk_read': disk_io.read_bytes / (1024 * 1024), # Convert to MB
191
+ 'disk_write': disk_io.write_bytes / (1024 * 1024) # Convert to MB
192
+ })
193
+ time.sleep(self.interval_time)
194
+
195
+ def _track_network_usage(self):
196
+ self.network_usage_list = []
197
+ while self.tracking:
198
+ net_io = psutil.net_io_counters()
199
+ self.network_usage_list.append({
200
+ 'uploads': net_io.bytes_sent / (1024 * 1024), # Convert to MB
201
+ 'downloads': net_io.bytes_recv / (1024 * 1024) # Convert to MB
202
+ })
203
+ time.sleep(self.interval_time)
204
+
161
205
  def start(self):
162
206
  """Initialize a new trace"""
207
+ self.tracking = True
208
+ self.tracking_thread = threading.Thread(target=self._track_memory_usage)
209
+ self.tracking_thread.start()
210
+ threading.Thread(target=self._track_cpu_usage).start()
211
+ threading.Thread(target=self._track_disk_usage).start()
212
+ threading.Thread(target=self._track_network_usage).start()
213
+
163
214
  metadata = Metadata(
164
215
  cost={},
165
216
  tokens={},
@@ -198,6 +249,38 @@ class BaseTracer:
198
249
  self.trace.data[0]["end_time"] = datetime.now().astimezone().isoformat()
199
250
  self.trace.end_time = datetime.now().astimezone().isoformat()
200
251
 
252
+ #track memory usage
253
+ self.tracking = False
254
+ if self.tracking_thread is not None:
255
+ self.tracking_thread.join()
256
+ self.trace.metadata.resources.memory.values = self.memory_usage_list
257
+
258
+ #track cpu usage
259
+ self.trace.metadata.resources.cpu.values = self.cpu_usage_list
260
+
261
+ #track network and disk usage
262
+ network_upoloads, network_downloads = 0, 0
263
+ disk_read, disk_write = 0, 0
264
+ for network_usage, disk_usage in zip(self.network_usage_list, self.disk_usage_list):
265
+ network_upoloads += network_usage['uploads']
266
+ network_downloads += network_usage['downloads']
267
+ disk_read += disk_usage['disk_read']
268
+ disk_write += disk_usage['disk_write']
269
+
270
+ #track disk usage
271
+ self.trace.metadata.resources.disk.read = [disk_read / len(self.disk_usage_list)]
272
+ self.trace.metadata.resources.disk.write = [disk_write / len(self.disk_usage_list)]
273
+
274
+ #track network usage
275
+ self.trace.metadata.resources.network.uploads = [network_upoloads / len(self.network_usage_list)]
276
+ self.trace.metadata.resources.network.downloads = [network_downloads / len(self.network_usage_list)]
277
+
278
+ # update interval time
279
+ self.trace.metadata.resources.cpu.interval = float(self.interval_time)
280
+ self.trace.metadata.resources.memory.interval = float(self.interval_time)
281
+ self.trace.metadata.resources.disk.interval = float(self.interval_time)
282
+ self.trace.metadata.resources.network.interval = float(self.interval_time)
283
+
201
284
  # Change span ids to int
202
285
  self.trace = self._change_span_ids_to_int(self.trace)
203
286
  self.trace = self._change_agent_input_output(self.trace)
@@ -364,12 +364,12 @@ class LLMTracerMixin:
364
364
  metrics = []
365
365
  if name in self.span_attributes_dict:
366
366
  raw_metrics = self.span_attributes_dict[name].metrics or []
367
- # Check for duplicates
368
367
  for metric in raw_metrics:
369
- metric_name = metric["name"]
370
- if self.visited_metrics.count(metric_name) >= 1:
371
- raise ValueError(f"Duplicate metric '{metric_name}' found in trace. Metric names must be unique across all spans.")
368
+ base_metric_name = metric["name"]
369
+ counter = sum(1 for x in self.visited_metrics if x.startswith(base_metric_name))
370
+ metric_name = f'{base_metric_name}_{counter}' if counter > 0 else base_metric_name
372
371
  self.visited_metrics.append(metric_name)
372
+ metric["name"] = metric_name
373
373
  metrics.append(metric)
374
374
 
375
375
  component = {
@@ -277,15 +277,14 @@ class ToolTracerMixin:
277
277
 
278
278
  # metrics
279
279
  metrics = []
280
- metrics = []
281
280
  if name in self.span_attributes_dict:
282
281
  raw_metrics = self.span_attributes_dict[name].metrics or []
283
- # Check for duplicates
284
282
  for metric in raw_metrics:
285
- metric_name = metric["name"]
286
- if self.visited_metrics.count(metric_name) >= 1:
287
- raise ValueError(f"Duplicate metric '{metric_name}' found in trace. Metric names must be unique across all spans.")
283
+ base_metric_name = metric["name"]
284
+ counter = sum(1 for x in self.visited_metrics if x.startswith(base_metric_name))
285
+ metric_name = f'{base_metric_name}_{counter}' if counter > 0 else base_metric_name
288
286
  self.visited_metrics.append(metric_name)
287
+ metric["name"] = metric_name
289
288
  metrics.append(metric)
290
289
 
291
290
  start_time = kwargs["start_time"]
@@ -220,7 +220,7 @@ class LlamaIndexTracer:
220
220
  user_detail["trace_id"] = self._generate_trace_id()
221
221
  metadata = user_detail["metadata"]
222
222
  metadata["log_source"] = "llamaindex_tracer"
223
- metadata["recorded_on"] = datetime.now().astimezone().replace('T', ' ')
223
+ metadata["recorded_on"] = datetime.now().isoformat()
224
224
  user_detail["metadata"] = metadata
225
225
  return user_detail
226
226
 
@@ -25,7 +25,6 @@ from ragaai_catalyst.tracers.agentic_tracing.utils.trace_utils import load_model
25
25
 
26
26
  logger = logging.getLogger(__name__)
27
27
 
28
-
29
28
  class Tracer(AgenticTracing):
30
29
  NUM_PROJECTS = 100
31
30
  TIMEOUT = 10
@@ -48,7 +47,8 @@ class Tracer(AgenticTracing):
48
47
  'file_io':True,
49
48
  'network':True,
50
49
  'custom':True
51
- }
50
+ },
51
+ interval_time=2,
52
52
  # auto_instrumentation=True/False # to control automatic instrumentation of everything
53
53
 
54
54
  ):
@@ -70,6 +70,7 @@ class Tracer(AgenticTracing):
70
70
  "project_name": project_name,
71
71
  "project_id": None, # Will be set after project validation
72
72
  "dataset_name": dataset_name,
73
+ "interval_time": interval_time,
73
74
  "trace_name": trace_name if trace_name else f"trace_{datetime.datetime.now().strftime('%Y%m%d%H%M%S')}",
74
75
  "trace_user_detail": {"metadata": metadata} if metadata else {}
75
76
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: ragaai_catalyst
3
- Version: 2.1.4b5
3
+ Version: 2.1.4b7
4
4
  Summary: RAGA AI CATALYST
5
5
  Author-email: Kiran Scaria <kiran.scaria@raga.ai>, Kedar Gaikwad <kedar.gaikwad@raga.ai>, Dushyant Mahajan <dushyant.mahajan@raga.ai>, Siddhartha Kosti <siddhartha.kosti@raga.ai>, Ritika Goel <ritika.goel@raga.ai>, Vijay Chaurasia <vijay.chaurasia@raga.ai>
6
6
  Requires-Python: <3.13,>=3.9
@@ -12,8 +12,8 @@ ragaai_catalyst/ragaai_catalyst.py,sha256=FdqMzwuQLqS2-3JJDsTQ8uh2itllOxfPrRUjb8
12
12
  ragaai_catalyst/synthetic_data_generation.py,sha256=uDV9tNwto2xSkWg5XHXUvjErW-4P34CTrxaJpRfezyA,19250
13
13
  ragaai_catalyst/utils.py,sha256=TlhEFwLyRU690HvANbyoRycR3nQ67lxVUQoUOfTPYQ0,3772
14
14
  ragaai_catalyst/tracers/__init__.py,sha256=yxepo7iVjTNI_wFdk3Z6Ghu64SazVyszCPEHYrX5WQk,50
15
- ragaai_catalyst/tracers/llamaindex_callback.py,sha256=HGs0TgtSgn8xXL8CSgdL9ymvYQGxZCNmPY5tRTw-I4s,14047
16
- ragaai_catalyst/tracers/tracer.py,sha256=4RaLmtAvVA-KT-O4Oi5T-VLVFmKqhbWjHYNxuQ6Fktk,15585
15
+ ragaai_catalyst/tracers/llamaindex_callback.py,sha256=Qxq4khDwM3YmhPxjSVML8LTEmUNd0cgfOWwNGX6IyBw,14028
16
+ ragaai_catalyst/tracers/tracer.py,sha256=UX-01NYWcH2y4UW1W287Cn-jy760rgaFqu8llJbeMdg,15654
17
17
  ragaai_catalyst/tracers/upload_traces.py,sha256=hs0PEmit3n3_uUqrdbwcBdyK5Nbkik3JQVwJMEwYTd4,4796
18
18
  ragaai_catalyst/tracers/agentic_tracing/README.md,sha256=X4QwLb7-Jg7GQMIXj-SerZIgDETfw-7VgYlczOR8ZeQ,4508
19
19
  ragaai_catalyst/tracers/agentic_tracing/__init__.py,sha256=yf6SKvOPSpH-9LiKaoLKXwqj5sez8F_5wkOb91yp0oE,260
@@ -26,14 +26,14 @@ ragaai_catalyst/tracers/agentic_tracing/tests/__init__.py,sha256=47DEQpj8HBSa-_T
26
26
  ragaai_catalyst/tracers/agentic_tracing/tests/ai_travel_agent.py,sha256=S4rCcKzU_5SB62BYEbNn_1VbbTdG4396N8rdZ3ZNGcE,5654
27
27
  ragaai_catalyst/tracers/agentic_tracing/tests/unique_decorator_test.py,sha256=Xk1cLzs-2A3dgyBwRRnCWs7Eubki40FVonwd433hPN8,4805
28
28
  ragaai_catalyst/tracers/agentic_tracing/tracers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- ragaai_catalyst/tracers/agentic_tracing/tracers/agent_tracer.py,sha256=Xe7LcJWfHphezpHNBlKKU_D-AjjU-c9mNpYWCNZbhoQ,25531
30
- ragaai_catalyst/tracers/agentic_tracing/tracers/base.py,sha256=ihB0y54-JmSYLZRH6gmkm73jrqeD0NtuVWswuuq5N1o,31304
29
+ ragaai_catalyst/tracers/agentic_tracing/tracers/agent_tracer.py,sha256=aLiq5nPie5TT61QYtvAtvErsxjPFYiUxjayn5aCX1_k,25543
30
+ ragaai_catalyst/tracers/agentic_tracing/tracers/base.py,sha256=u2DX_BsMGsuJkWqN6ucxboMO8GnvOcArKJe5L08y-YI,35014
31
31
  ragaai_catalyst/tracers/agentic_tracing/tracers/custom_tracer.py,sha256=uay8lU7T-CKsVu8KvWX31qfMqufK9S3Ive7XKo2Ksmk,12252
32
32
  ragaai_catalyst/tracers/agentic_tracing/tracers/langgraph_tracer.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- ragaai_catalyst/tracers/agentic_tracing/tracers/llm_tracer.py,sha256=VmPxlIQBo58ewf1vyi34gqw7M4YviRmb5KgnSQMdejY,29331
33
+ ragaai_catalyst/tracers/agentic_tracing/tracers/llm_tracer.py,sha256=fn5qxb365GmQkJy_yZAY5TiiWRMFKPNJdYk8KFr8uWA,29343
34
34
  ragaai_catalyst/tracers/agentic_tracing/tracers/main_tracer.py,sha256=nxUOQSyWBTnbsZfxmr1lje2OggqNf9fwtGUb-sBo6mI,15215
35
35
  ragaai_catalyst/tracers/agentic_tracing/tracers/network_tracer.py,sha256=CviGiAg0W0krJxORMBDTosQytIoJDQ5RwU6xt_U_mOg,10408
36
- ragaai_catalyst/tracers/agentic_tracing/tracers/tool_tracer.py,sha256=XUDWn9F07lzrhFTaKcLZyJnLjIbFaucNGSHDgDQqxks,12169
36
+ ragaai_catalyst/tracers/agentic_tracing/tracers/tool_tracer.py,sha256=4h6epgRHPVRfTrCznwc6KPK6xevwBaZwE-q0Zj-4Kkk,12160
37
37
  ragaai_catalyst/tracers/agentic_tracing/tracers/user_interaction_tracer.py,sha256=bhSUhNQCuJXKjgJAXhjKEYjnHMpYN90FSZdR84fNIKU,4614
38
38
  ragaai_catalyst/tracers/agentic_tracing/upload/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
39
  ragaai_catalyst/tracers/agentic_tracing/upload/upload_agentic_traces.py,sha256=1MDKXAAPzOEdxFKWWQrRgrmM3kz--DGXSywGXQmR3lQ,6041
@@ -60,7 +60,7 @@ ragaai_catalyst/tracers/instrumentators/llamaindex.py,sha256=SMrRlR4xM7k9HK43hak
60
60
  ragaai_catalyst/tracers/instrumentators/openai.py,sha256=14R4KW9wQCR1xysLfsP_nxS7cqXrTPoD8En4MBAaZUU,379
61
61
  ragaai_catalyst/tracers/utils/__init__.py,sha256=KeMaZtYaTojilpLv65qH08QmpYclfpacDA0U3wg6Ybw,64
62
62
  ragaai_catalyst/tracers/utils/utils.py,sha256=ViygfJ7vZ7U0CTSA1lbxVloHp4NSlmfDzBRNCJuMhis,2374
63
- ragaai_catalyst-2.1.4b5.dist-info/METADATA,sha256=7pslb4wedeSS3p7J4rw4Lh8IL70dRP_vNKK0_5giJqE,12770
64
- ragaai_catalyst-2.1.4b5.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
65
- ragaai_catalyst-2.1.4b5.dist-info/top_level.txt,sha256=HpgsdRgEJMk8nqrU6qdCYk3di7MJkDL0B19lkc7dLfM,16
66
- ragaai_catalyst-2.1.4b5.dist-info/RECORD,,
63
+ ragaai_catalyst-2.1.4b7.dist-info/METADATA,sha256=ivt8Ahq71DIZMXQ2qXrtro3uEeywqK87vZi_6dgcvG0,12770
64
+ ragaai_catalyst-2.1.4b7.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
65
+ ragaai_catalyst-2.1.4b7.dist-info/top_level.txt,sha256=HpgsdRgEJMk8nqrU6qdCYk3di7MJkDL0B19lkc7dLfM,16
66
+ ragaai_catalyst-2.1.4b7.dist-info/RECORD,,