class_docstr: The parent class of custom metrics.
  
  Ray's custom metrics APIs are rooted from this class and share
  the same public methods.
class_docstr_tok: ["The","parent","class","of","custom","metrics",".","Ray","'s","custom","metrics","APIs","are","rooted","from","this","class","and","share","the","same","public","methods","."]
docstr: Record the metric point of the metric.
  
  Tags passed in will take precedence over the metric's default tags.
  
  Args:
      value: The value to be recorded as a metric point.
docstr_tok: ["Record","the","metric","point","of","the","metric",".","Tags","passed","in","will","take","precedence","over","the","metric","'s","default","tags",".","Args",":","value",":","The","value","to","be","recorded","as","a","metric","point","."]
code: def record(
      self,
      value: Union[int, float],
      tags: Dict[str, str] = None,
      _internal=False,
  ) -> None:
      """Record the metric point of the metric.
  
      Tags passed in will take precedence over the metric's default tags.
  
      Args:
          value: The value to be recorded as a metric point.
      """
      assert self._metric is not None
      if isinstance(self._metric, CythonCount) and not _internal:
          logger.warning(
              "Counter.record() is deprecated in favor of "
              "Counter.inc() and will be removed in a future "
              "release. Please use Counter.inc() instead."
          )
  
      if isinstance(self._metric, CythonGauge) and not _internal:
          logger.warning(
              "Gauge.record() is deprecated in favor of "
              "Gauge.set() and will be removed in a future "
              "release. Please use Gauge.set() instead."
          )
  
      if isinstance(self._metric, CythonHistogram) and not _internal:
          logger.warning(
              "Histogram.record() is deprecated in favor of "
              "Histogram.observe() and will be removed in a "
              "future release. Please use Histogram.observe() "
              "instead."
          )
  
      if tags is not None:
          for val in tags.values():
              if not isinstance(val, str):
                  raise TypeError(
                      f"Tag values must be str, got {type(val)}."
                  )
  
      final_tags = {}
      tags_copy = tags.copy() if tags else {}
      for tag_key in self._tag_keys:
          # Prefer passed tags over default tags.
          if tags is not None and tag_key in tags:
              final_tags[tag_key] = tags_copy.pop(tag_key)
          elif tag_key in self._default_tags:
              final_tags[tag_key] = self._default_tags[tag_key]
          else:
              raise ValueError(f"Missing value for tag key {tag_key}.")
  
      if len(tags_copy) > 0:
          raise ValueError(
              f"Unrecognized tag keys: {list(tags_copy.keys())}."
          )
  
      self._metric.record(value, tags=final_tags)
  
imports: import logging
  from typing import Dict, Any, List, Optional, Tuple, Union
  from ray._raylet import Sum, Histogram, Gauge
  from ray.util.annotations import DeveloperAPI
label_desc: Use image node_id 3 for calling the Metric obj's underlying member method code with example usage: obj.record(value, tags, _internal) without return types