class_docstr: Map nodes to their corresponding logs.
  
  We need to be a little careful here. At an given point in time, node_id <->
  ip can be interchangeably used, but the node_id -> ip relation is not
  bijective _across time_ since IP addresses can be reused. Therefore, we
  should treat node_id as the only unique identifier.
docstr: Begin to track a new node.
  
  Args:
      node_id: The node id.
      ip: The node ip address.
      node_type: The node type.
docstr_tok: ["Begin","to","track","a","new","node",".","Args",":","node_id",":","The","node","id",".","ip",":","The","node","ip","address",".","node_type",":","The","node","type","."]
code: def track(self, node_id: str, ip: str, node_type: str):
      """
      Begin to track a new node.
  
      Args:
          node_id: The node id.
          ip: The node ip address.
          node_type: The node type.
      """
      if node_id not in self.node_mapping:
          self._add_node_mapping(node_id, (ip, node_type))
  
file_path: ray/python/ray/autoscaler/_private/node_tracker.py
imports: from typing import List, Set, Tuple
  from ray.autoscaler._private import constants
label_desc: Use image node_id 3 for calling the NodeTracker obj's underlying member method code with example usage: obj.track(node_id, ip, node_type) without return types