class_docstr: Example usage:
  ```python
  from litellm import Router
  model_list = [
  {
      "model_name": "azure-gpt-3.5-turbo", # model alias
      "litellm_params": { # params for litellm completion/embedding call
          "model": "azure/<your-deployment-name-1>",
          "api_key": <your-api-key>,
          "api_version": <your-api-version>,
          "api_base": <your-api-base>
      },
  },
  {
      "model_name": "azure-gpt-3.5-turbo", # model alias
      "litellm_params": { # params for litellm completion/embedding call
          "model": "azure/<your-deployment-name-2>",
          "api_key": <your-api-key>,
          "api_version": <your-api-version>,
          "api_base": <your-api-base>
      },
  },
  {
      "model_name": "openai-gpt-3.5-turbo", # model alias
      "litellm_params": { # params for litellm completion/embedding call
          "model": "gpt-3.5-turbo",
          "api_key": <your-api-key>,
      },
  ]
  
  router = Router(model_list=model_list, fallbacks=[{"azure-gpt-3.5-turbo": "openai-gpt-3.5-turbo"}])
  ```
docstr: When a retry or fallback happens, log the details of the just failed model call - similar to Sentry breadcrumbing
code: def log_retry(self, kwargs: dict, e: Exception) -> dict:
      """
      When a retry or fallback happens, log the details of the just failed model call - similar to Sentry breadcrumbing
      """
      try:
          # Log failed model as the previous model
          previous_model = {
              "exception_type": type(e).__name__,
              "exception_string": str(e),
          }
          for (
              k,
              v,
          ) in (
              kwargs.items()
          ):  # log everything in kwargs except the old previous_models value - prevent nesting
              if k != "metadata":
                  previous_model[k] = v
              elif k == "metadata" and isinstance(v, dict):
                  previous_model["metadata"] = {}  # type: ignore
                  for metadata_k, metadata_v in kwargs[
                      "metadata"
                  ].items():
                      if metadata_k != "previous_models":
                          previous_model[k][metadata_k] = metadata_v  # type: ignore
          self.previous_models.append(previous_model)
          kwargs["metadata"]["previous_models"] = self.previous_models
          return kwargs
      except Exception as e:
          raise e
  
imports: import copy, httpx
  from datetime import datetime
  from typing import Dict, List, Optional, Union, Literal, Any
  import random, threading, time, traceback, uuid
  import litellm, openai
  from litellm.caching import RedisCache, InMemoryCache, DualCache
  import logging, asyncio
  import inspect, concurrent
  from openai import AsyncOpenAI
  from collections import defaultdict
  from litellm.router_strategy.least_busy import LeastBusyLoggingHandler
  from litellm.router_strategy.lowest_tpm_rpm import LowestTPMLoggingHandler
  from litellm.router_strategy.lowest_latency import LowestLatencyLoggingHandler
  from litellm.llms.custom_httpx.azure_dall_e_2 import CustomHTTPTransport, AsyncCustomHTTPTransport
  from litellm.utils import ModelResponse, CustomStreamWrapper
  import copy
  from litellm._logging import verbose_router_logger
  import logging
label_desc: Use image node_id 11 for calling the Router obj's underlying member method code with example usage: obj.log_retry(kwargs, e) and returns: kwargs