ray_metrics.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import time
  2. from ray.util.metrics import Histogram
  3. _num_buckets = 31
  4. _coeff = 4
  5. _short_event_min = 0.0001 # 0.1 ms
  6. _short_event_max = 1.5
  7. _long_event_min = 0.1
  8. _long_event_max = 600.0
  9. def _create_buckets(coeff, event_min, event_max, num):
  10. """Generates a list of `num` buckets between `event_min` and `event_max`.
  11. `coeff` - specifies how much denser at the low end
  12. """
  13. if num == 1:
  14. return [event_min]
  15. step = 1 / (num - 1)
  16. return [
  17. (0 + step * i) ** coeff * (event_max - event_min) + event_min
  18. for i in range(num)
  19. ]
  20. DEFAULT_HISTOGRAM_BOUNDARIES_SHORT_EVENTS = _create_buckets(
  21. coeff=_coeff,
  22. event_min=_short_event_min,
  23. event_max=_short_event_max,
  24. num=_num_buckets,
  25. )
  26. DEFAULT_HISTOGRAM_BOUNDARIES_LONG_EVENTS = _create_buckets(
  27. coeff=_coeff,
  28. event_min=_long_event_min,
  29. event_max=_long_event_max,
  30. num=_num_buckets,
  31. )
  32. class TimerAndPrometheusLogger:
  33. """Context manager for timing code execution.
  34. Elapsed time is automatically logged to the provided Prometheus Histogram.
  35. Example:
  36. with TimerAndPrometheusLogger(Histogram):
  37. learner.update()
  38. """
  39. def __init__(self, histogram: Histogram):
  40. self._histogram = histogram
  41. def __enter__(self):
  42. self.start = time.perf_counter()
  43. return self
  44. def __exit__(self, exc_type, exc_value, traceback):
  45. self.elapsed = time.perf_counter() - self.start
  46. self._histogram.observe(self.elapsed)