gauravlochab commited on
Commit
cb9360a
·
1 Parent(s): 6879e5a

feat: implement logging for error handling in APR data processing

Browse files
Files changed (1) hide show
  1. apr_visualization.py +26 -22
apr_visualization.py CHANGED
@@ -11,6 +11,10 @@ import requests
11
  import sys
12
  import json
13
  from typing import List, Dict, Any
 
 
 
 
14
 
15
  # Global variable to store the data for reuse
16
  global_df = None
@@ -22,7 +26,7 @@ def get_agent_type_by_name(type_name: str) -> Dict[str, Any]:
22
  """Get agent type by name"""
23
  response = requests.get(f"{API_BASE_URL}/api/agent-types/name/{type_name}")
24
  if response.status_code == 404:
25
- print(f"Error: Agent type '{type_name}' not found")
26
  return None
27
  response.raise_for_status()
28
  return response.json()
@@ -31,7 +35,7 @@ def get_attribute_definition_by_name(attr_name: str) -> Dict[str, Any]:
31
  """Get attribute definition by name"""
32
  response = requests.get(f"{API_BASE_URL}/api/attributes/name/{attr_name}")
33
  if response.status_code == 404:
34
- print(f"Error: Attribute definition '{attr_name}' not found")
35
  return None
36
  response.raise_for_status()
37
  return response.json()
@@ -40,7 +44,7 @@ def get_agents_by_type(type_id: int) -> List[Dict[str, Any]]:
40
  """Get all agents of a specific type"""
41
  response = requests.get(f"{API_BASE_URL}/api/agent-types/{type_id}/agents/")
42
  if response.status_code == 404:
43
- print(f"No agents found for type ID {type_id}")
44
  return []
45
  response.raise_for_status()
46
  return response.json()
@@ -56,7 +60,7 @@ def get_attribute_values_by_type_and_attr(agents: List[Dict[str, Any]], attr_def
56
  # Call the /api/agents/{agent_id}/attributes/ endpoint
57
  response = requests.get(f"{API_BASE_URL}/api/agents/{agent_id}/attributes/", params={"limit": 1000})
58
  if response.status_code == 404:
59
- print(f"No attributes found for agent ID {agent_id}")
60
  continue
61
 
62
  try:
@@ -67,7 +71,7 @@ def get_attribute_values_by_type_and_attr(agents: List[Dict[str, Any]], attr_def
67
  filtered_attrs = [attr for attr in agent_attrs if attr.get("attr_def_id") == attr_def_id]
68
  all_attributes.extend(filtered_attrs)
69
  except requests.exceptions.RequestException as e:
70
- print(f"Error fetching attributes for agent ID {agent_id}: {e}")
71
 
72
  return all_attributes
73
 
@@ -101,7 +105,7 @@ def extract_apr_value(attr: Dict[str, Any]) -> Dict[str, Any]:
101
 
102
  return {"apr": apr, "timestamp": timestamp_dt, "agent_id": attr["agent_id"], "is_dummy": False}
103
  except (json.JSONDecodeError, KeyError, TypeError) as e:
104
- print(f"Error parsing JSON value: {e}")
105
  return {"apr": None, "timestamp": None, "agent_id": attr["agent_id"], "is_dummy": False}
106
 
107
  def fetch_apr_data_from_db():
@@ -114,7 +118,7 @@ def fetch_apr_data_from_db():
114
  # Step 1: Find the Modius agent type
115
  modius_type = get_agent_type_by_name("Modius")
116
  if not modius_type:
117
- print("Modius agent type not found, using placeholder data")
118
  global_df = pd.DataFrame([])
119
  return global_df
120
 
@@ -123,7 +127,7 @@ def fetch_apr_data_from_db():
123
  # Step 2: Find the APR attribute definition
124
  apr_attr_def = get_attribute_definition_by_name("APR")
125
  if not apr_attr_def:
126
- print("APR attribute definition not found, using placeholder data")
127
  global_df = pd.DataFrame([])
128
  return global_df
129
 
@@ -132,14 +136,14 @@ def fetch_apr_data_from_db():
132
  # Step 3: Get all agents of type Modius
133
  modius_agents = get_agents_by_type(type_id)
134
  if not modius_agents:
135
- print("No agents of type 'Modius' found")
136
  global_df = pd.DataFrame([])
137
  return global_df
138
 
139
  # Step 4: Fetch all APR values for Modius agents
140
  apr_attributes = get_attribute_values_by_type_and_attr(modius_agents, attr_def_id)
141
  if not apr_attributes:
142
- print("No APR values found for 'Modius' agents")
143
  global_df = pd.DataFrame([])
144
  return global_df
145
 
@@ -165,7 +169,7 @@ def fetch_apr_data_from_db():
165
 
166
  # Convert list of dictionaries to DataFrame
167
  if not apr_data_list:
168
- print("No valid APR data extracted")
169
  global_df = pd.DataFrame([])
170
  return global_df
171
 
@@ -173,11 +177,11 @@ def fetch_apr_data_from_db():
173
  return global_df
174
 
175
  except requests.exceptions.RequestException as e:
176
- print(f"API request error: {e}")
177
  global_df = pd.DataFrame([])
178
  return global_df
179
  except Exception as e:
180
- print(f"Error fetching APR data: {e}")
181
  global_df = pd.DataFrame([])
182
  return global_df
183
 
@@ -190,7 +194,7 @@ def generate_apr_visualizations():
190
 
191
  # If we got no data at all, return placeholder figures
192
  if df.empty:
193
- print("No APR data available. Using fallback visualization.")
194
  # Create empty visualizations with a message using Plotly
195
  fig = go.Figure()
196
  fig.add_annotation(
@@ -234,7 +238,7 @@ def create_time_series_graph_per_agent(df):
234
  unique_agents = df['agent_id'].unique()
235
 
236
  if len(unique_agents) == 0:
237
- print("No agent data to plot")
238
  fig = go.Figure()
239
  fig.add_annotation(
240
  text="No agent data available",
@@ -357,7 +361,7 @@ def create_time_series_graph_per_agent(df):
357
  img_file = "modius_apr_per_agent_graph.png"
358
  fig.write_image(img_file)
359
 
360
- print(f"Per-agent graph saved to {graph_file} and {img_file}")
361
 
362
  # Return the figure object for direct use in Gradio
363
  return fig
@@ -365,7 +369,7 @@ def create_time_series_graph_per_agent(df):
365
  def create_combined_time_series_graph(df):
366
  """Create a combined time series graph for all agents using Plotly"""
367
  if len(df) == 0:
368
- print("No data to plot combined graph")
369
  fig = go.Figure()
370
  fig.add_annotation(
371
  text="No data available",
@@ -501,7 +505,7 @@ def create_combined_time_series_graph(df):
501
  img_file = "modius_apr_combined_graph.png"
502
  fig.write_image(img_file)
503
 
504
- print(f"Combined graph saved to {graph_file} and {img_file}")
505
 
506
  # Return the figure object for direct use in Gradio
507
  return fig
@@ -509,7 +513,7 @@ def create_combined_time_series_graph(df):
509
  def save_to_csv(df):
510
  """Save the APR data DataFrame to a CSV file and return the file path"""
511
  if df.empty:
512
- print("No APR data to save to CSV")
513
  return None
514
 
515
  # Define the CSV file path
@@ -517,13 +521,13 @@ def save_to_csv(df):
517
 
518
  # Save to CSV
519
  df.to_csv(csv_file, index=False)
520
- print(f"APR data saved to {csv_file}")
521
 
522
  # Also generate a statistics CSV file
523
  stats_df = generate_statistics_from_data(df)
524
  stats_csv = "modius_apr_statistics.csv"
525
  stats_df.to_csv(stats_csv, index=False)
526
- print(f"Statistics saved to {stats_csv}")
527
 
528
  return csv_file
529
 
@@ -585,4 +589,4 @@ def generate_statistics_from_data(df):
585
  }
586
  stats_list.append(overall_stats)
587
 
588
- return pd.DataFrame(stats_list)
 
11
  import sys
12
  import json
13
  from typing import List, Dict, Any
14
+ import logging
15
+
16
+ logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
17
+ logger = logging.getLogger(__name__)
18
 
19
  # Global variable to store the data for reuse
20
  global_df = None
 
26
  """Get agent type by name"""
27
  response = requests.get(f"{API_BASE_URL}/api/agent-types/name/{type_name}")
28
  if response.status_code == 404:
29
+ logger.error(f"Agent type '{type_name}' not found")
30
  return None
31
  response.raise_for_status()
32
  return response.json()
 
35
  """Get attribute definition by name"""
36
  response = requests.get(f"{API_BASE_URL}/api/attributes/name/{attr_name}")
37
  if response.status_code == 404:
38
+ logger.error(f"Attribute definition '{attr_name}' not found")
39
  return None
40
  response.raise_for_status()
41
  return response.json()
 
44
  """Get all agents of a specific type"""
45
  response = requests.get(f"{API_BASE_URL}/api/agent-types/{type_id}/agents/")
46
  if response.status_code == 404:
47
+ logger.error(f"No agents found for type ID {type_id}")
48
  return []
49
  response.raise_for_status()
50
  return response.json()
 
60
  # Call the /api/agents/{agent_id}/attributes/ endpoint
61
  response = requests.get(f"{API_BASE_URL}/api/agents/{agent_id}/attributes/", params={"limit": 1000})
62
  if response.status_code == 404:
63
+ logger.error(f"No attributes found for agent ID {agent_id}")
64
  continue
65
 
66
  try:
 
71
  filtered_attrs = [attr for attr in agent_attrs if attr.get("attr_def_id") == attr_def_id]
72
  all_attributes.extend(filtered_attrs)
73
  except requests.exceptions.RequestException as e:
74
+ logger.error(f"Error fetching attributes for agent ID {agent_id}: {e}")
75
 
76
  return all_attributes
77
 
 
105
 
106
  return {"apr": apr, "timestamp": timestamp_dt, "agent_id": attr["agent_id"], "is_dummy": False}
107
  except (json.JSONDecodeError, KeyError, TypeError) as e:
108
+ logger.error(f"Error parsing JSON value: {e} for agent_id: {attr.get('agent_id')}")
109
  return {"apr": None, "timestamp": None, "agent_id": attr["agent_id"], "is_dummy": False}
110
 
111
  def fetch_apr_data_from_db():
 
118
  # Step 1: Find the Modius agent type
119
  modius_type = get_agent_type_by_name("Modius")
120
  if not modius_type:
121
+ logger.error("Modius agent type not found, using placeholder data")
122
  global_df = pd.DataFrame([])
123
  return global_df
124
 
 
127
  # Step 2: Find the APR attribute definition
128
  apr_attr_def = get_attribute_definition_by_name("APR")
129
  if not apr_attr_def:
130
+ logger.error("APR attribute definition not found, using placeholder data")
131
  global_df = pd.DataFrame([])
132
  return global_df
133
 
 
136
  # Step 3: Get all agents of type Modius
137
  modius_agents = get_agents_by_type(type_id)
138
  if not modius_agents:
139
+ logger.error("No agents of type 'Modius' found")
140
  global_df = pd.DataFrame([])
141
  return global_df
142
 
143
  # Step 4: Fetch all APR values for Modius agents
144
  apr_attributes = get_attribute_values_by_type_and_attr(modius_agents, attr_def_id)
145
  if not apr_attributes:
146
+ logger.error("No APR values found for 'Modius' agents")
147
  global_df = pd.DataFrame([])
148
  return global_df
149
 
 
169
 
170
  # Convert list of dictionaries to DataFrame
171
  if not apr_data_list:
172
+ logger.error("No valid APR data extracted")
173
  global_df = pd.DataFrame([])
174
  return global_df
175
 
 
177
  return global_df
178
 
179
  except requests.exceptions.RequestException as e:
180
+ logger.error(f"API request error: {e}")
181
  global_df = pd.DataFrame([])
182
  return global_df
183
  except Exception as e:
184
+ logger.error(f"Error fetching APR data: {e}")
185
  global_df = pd.DataFrame([])
186
  return global_df
187
 
 
194
 
195
  # If we got no data at all, return placeholder figures
196
  if df.empty:
197
+ logger.info("No APR data available. Using fallback visualization.")
198
  # Create empty visualizations with a message using Plotly
199
  fig = go.Figure()
200
  fig.add_annotation(
 
238
  unique_agents = df['agent_id'].unique()
239
 
240
  if len(unique_agents) == 0:
241
+ logger.error("No agent data to plot")
242
  fig = go.Figure()
243
  fig.add_annotation(
244
  text="No agent data available",
 
361
  img_file = "modius_apr_per_agent_graph.png"
362
  fig.write_image(img_file)
363
 
364
+ logger.info(f"Per-agent graph saved to {graph_file} and {img_file}")
365
 
366
  # Return the figure object for direct use in Gradio
367
  return fig
 
369
  def create_combined_time_series_graph(df):
370
  """Create a combined time series graph for all agents using Plotly"""
371
  if len(df) == 0:
372
+ logger.error("No data to plot combined graph")
373
  fig = go.Figure()
374
  fig.add_annotation(
375
  text="No data available",
 
505
  img_file = "modius_apr_combined_graph.png"
506
  fig.write_image(img_file)
507
 
508
+ logger.info(f"Combined graph saved to {graph_file} and {img_file}")
509
 
510
  # Return the figure object for direct use in Gradio
511
  return fig
 
513
  def save_to_csv(df):
514
  """Save the APR data DataFrame to a CSV file and return the file path"""
515
  if df.empty:
516
+ logger.error("No APR data to save to CSV")
517
  return None
518
 
519
  # Define the CSV file path
 
521
 
522
  # Save to CSV
523
  df.to_csv(csv_file, index=False)
524
+ logger.info(f"APR data saved to {csv_file}")
525
 
526
  # Also generate a statistics CSV file
527
  stats_df = generate_statistics_from_data(df)
528
  stats_csv = "modius_apr_statistics.csv"
529
  stats_df.to_csv(stats_csv, index=False)
530
+ logger.info(f"Statistics saved to {stats_csv}")
531
 
532
  return csv_file
533
 
 
589
  }
590
  stats_list.append(overall_stats)
591
 
592
+ return pd.DataFrame(stats_list)