docstr: Tracks function executions, calculates execution time and prepare data
  Args:
      function (function): Function that is to be executed
  
  Returns:
      Any: Response return after function execution
docstr_tok: ["Tracks","function","executions",",","calculates","execution","time","and","prepare","data","Args",":","function","(","function",")",":","Function","that","is","to","be","executed","Returns",":","Any",":","Response","return","after","function","execution"]
code: def execute_func(self, function, *args, **kwargs) -> Any:
      """
      Tracks function executions, calculates execution time and prepare data
      Args:
          function (function): Function that is to be executed
  
      Returns:
          Any: Response return after function execution
      """
      start_time = time.time()
  
      # Get the tag from kwargs if provided, or use the function name as the default
      tag = kwargs.pop("tag", function.__name__)
  
      try:
          result = function(*args, **kwargs)
  
          execution_time = time.time() - start_time
          if tag not in exec_steps:
              return result
  
          step_data = self._generate_exec_step(tag, result)
  
          step_data["success"] = True
          step_data["execution_time"] = execution_time
  
          self._steps.append(step_data)
  
          return result
  
      except Exception:
          execution_time = time.time() - start_time
          self._steps.append(
              {
                  "type": exec_steps[tag],
                  "success": False,
                  "execution_time": execution_time,
              }
          )
          raise
  
imports: import base64
  import json
  import os
  import time
  from typing import Any, List, TypedDict, Union
  import uuid
  import requests
  from collections import defaultdict
label_desc: Use image node_id 8 for calling the QueryExecTracker obj's underlying member method code with example usage: obj.execute_func(function) and returns: result, result