class_docstr: Container for cluster load metrics.
  
  Metrics here are updated from raylet heartbeats. The autoscaler
  queries these metrics to determine when to scale up, and which nodes
  can be removed.
docstr: Return a concise string of cluster size to report to event logs.
  
  For example, "3 CPUs, 4 GPUs".
docstr_tok: ["Return","a","concise","string","of","cluster","size","to","report","to","event","logs",".","For","example",",","``","3","CPUs",",","4","GPUs","''","."]
code: def resources_avail_summary(self) -> str:
      """Return a concise string of cluster size to report to event logs.
  
      For example, "3 CPUs, 4 GPUs".
      """
      total_resources = (
          reduce(add_resources, self.static_resources_by_ip.values())
          if self.static_resources_by_ip
          else {}
      )
      out = "{} CPUs".format(int(total_resources.get("CPU", 0)))
      if "GPU" in total_resources:
          out += ", {} GPUs".format(int(total_resources["GPU"]))
      if "TPU" in total_resources:
          out += ", {} TPUs".format(int(total_resources["TPU"]))
      return out
  
imports: import logging
  import time
  from collections import Counter
  from functools import reduce
  from typing import Dict, List
  from ray._private.gcs_utils import PlacementGroupTableData
  from ray.autoscaler._private.constants import AUTOSCALER_MAX_RESOURCE_DEMAND_VECTOR_SIZE, AUTOSCALER_REPORT_PER_NODE_STATUS
  from ray.autoscaler._private.util import DictCount, LoadMetricsSummary, NodeIP, ResourceDict
  from ray.core.generated.common_pb2 import PlacementStrategy
label_desc: Use image node_id 14 for calling the LoadMetrics obj's underlying member method code with example usage: obj.resources_avail_summary() and returns: out