From b291dd44865ace133e5808cc221620b8f3290610 Mon Sep 17 00:00:00 2001 From: Simon Mo Date: Tue, 15 Dec 2020 09:39:39 -0800 Subject: [PATCH] [Metrics] Call GetMeasureDoubleByName to prevent override (#12860) --- python/ray/tests/test_metrics_agent.py | 28 ++++++++++++++++++++++++++ src/ray/stats/metric.cc | 15 ++++++++++++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/python/ray/tests/test_metrics_agent.py b/python/ray/tests/test_metrics_agent.py index 9386e4f1f..12490dd44 100644 --- a/python/ray/tests/test_metrics_agent.py +++ b/python/ray/tests/test_metrics_agent.py @@ -2,6 +2,7 @@ import json import pathlib import platform from pprint import pformat +import time from unittest.mock import MagicMock import requests @@ -293,6 +294,33 @@ def test_custom_metrics_edge_cases(metric_mock): Count("name", tag_keys=("a")) +def test_metrics_override_shouldnt_warn(ray_start_regular, log_pubsub): + # https://github.com/ray-project/ray/issues/12859 + + @ray.remote + def override(): + a = Count("num_count", description="") + b = Count("num_count", description="") + a.record(1) + b.record(1) + + ray.get(override.remote()) + + # Check the stderr from the worker. + start = time.time() + while True: + if (time.time() - start) > 5: + break + msg = log_pubsub.get_message() + if msg is None: + time.sleep(0.01) + continue + + log_lines = json.loads(ray.utils.decode(msg["data"]))["lines"] + for line in log_lines: + assert "Attempt to register measure" not in line + + if __name__ == "__main__": import sys sys.exit(pytest.main(["-v", __file__])) diff --git a/src/ray/stats/metric.cc b/src/ray/stats/metric.cc index 2cfe236b9..4a475a338 100644 --- a/src/ray/stats/metric.cc +++ b/src/ray/stats/metric.cc @@ -16,6 +16,7 @@ #include "opencensus/stats/internal/aggregation_window.h" #include "opencensus/stats/internal/set_aggregation_window.h" +#include "opencensus/stats/measure_registry.h" namespace ray { @@ -78,14 +79,24 @@ bool StatsConfig::IsInitialized() const { return is_initialized_; } /// /// Metric /// +using MeasureDouble = opencensus::stats::Measure; void Metric::Record(double value, const TagsType &tags) { if (StatsConfig::instance().IsStatsDisabled()) { return; } if (measure_ == nullptr) { - measure_.reset(new opencensus::stats::Measure( - opencensus::stats::Measure::Register(name_, description_, unit_))); + // Measure could be registered before, so we try to get it first. + MeasureDouble registered_measure = + opencensus::stats::MeasureRegistry::GetMeasureDoubleByName(name_); + + if (registered_measure.IsValid()) { + measure_.reset(new MeasureDouble(registered_measure)); + } else { + measure_.reset( + new MeasureDouble(MeasureDouble::Register(name_, description_, unit_))); + } + RegisterView(); }