From 5eb742ee6a892b684b0c4cbde9f02f838b8300e5 Mon Sep 17 00:00:00 2001 From: Giacomo Pozzoni Date: Fri, 17 Jul 2020 22:52:01 +0000 Subject: Core/Metric: Log Map::Update() times (#25067) * Core/Metric: Log Map::Update() times * Add more performant version to reduce allocations when metrics are disabled * Linux build fix * Add metric stopwatch version that doesnt let users forget to _END it * Fix linux build * Code cleanup * Add Map updates panel to General dashboard * Add "Recent events" panel to General dashboard * Apply latest codestyle changes Co-authored-by: Shauren --- src/common/Metric/Metric.cpp | 5 +++++ src/common/Metric/Metric.h | 34 ++++++++++++++++++++++++++++++++++ src/server/game/Maps/MapUpdater.cpp | 2 ++ 3 files changed, 41 insertions(+) (limited to 'src') diff --git a/src/common/Metric/Metric.cpp b/src/common/Metric/Metric.cpp index b1302aacb5a..07db8e83f4d 100644 --- a/src/common/Metric/Metric.cpp +++ b/src/common/Metric/Metric.cpp @@ -279,6 +279,11 @@ std::string Metric::FormatInfluxDBTagValue(std::string const& value) return boost::replace_all_copy(value, " ", "\\ "); } +std::string Metric::FormatInfluxDBValue(std::chrono::nanoseconds value) +{ + return FormatInfluxDBValue(std::chrono::duration_cast(value).count()); +} + Metric::Metric() { } diff --git a/src/common/Metric/Metric.h b/src/common/Metric/Metric.h index 5e843139354..5038338421c 100644 --- a/src/common/Metric/Metric.h +++ b/src/common/Metric/Metric.h @@ -90,6 +90,7 @@ private: static std::string FormatInfluxDBValue(char const* value); static std::string FormatInfluxDBValue(double value); static std::string FormatInfluxDBValue(float value); + static std::string FormatInfluxDBValue(std::chrono::nanoseconds value); static std::string FormatInfluxDBTagValue(std::string const& value); @@ -127,6 +128,34 @@ public: #define sMetric Metric::instance() + +template +class MetricStopWatch +{ +public: + MetricStopWatch(LoggerType&& loggerFunc) : + _logger(std::forward(loggerFunc)), + _startTime(sMetric->IsEnabled() ? std::chrono::steady_clock::now() : TimePoint()) + { + } + + ~MetricStopWatch() + { + if (sMetric->IsEnabled()) + _logger(_startTime); + } + +private: + LoggerType _logger; + TimePoint _startTime; +}; + +template +MetricStopWatch MakeMetricStopWatch(LoggerType&& loggerFunc) +{ + return { std::forward(loggerFunc) }; +} + #define TC_METRIC_TAG(name, value) { name, value } #ifdef PERFORMANCE_PROFILING @@ -161,5 +190,10 @@ public: } while (0) \ __pragma(warning(pop)) #endif +#define TC_METRIC_TIMER(category, ...) \ + MetricStopWatch __tc_metric_stop_watch = MakeMetricStopWatch([&](TimePoint start) \ + { \ + sMetric->LogValue(category, std::chrono::steady_clock::now() - start, { __VA_ARGS__ }); \ + }); #endif // METRIC_H__ diff --git a/src/server/game/Maps/MapUpdater.cpp b/src/server/game/Maps/MapUpdater.cpp index 4a3a6c3cd02..9b0b42ee679 100644 --- a/src/server/game/Maps/MapUpdater.cpp +++ b/src/server/game/Maps/MapUpdater.cpp @@ -17,6 +17,7 @@ #include "MapUpdater.h" #include "Map.h" +#include "Metric.h" #include @@ -38,6 +39,7 @@ class MapUpdateRequest void call() { + TC_METRIC_TIMER("map_update_time_diff", TC_METRIC_TAG("map_id", std::to_string(m_map.GetId()))); m_map.Update (m_diff); m_updater.update_finished(); } -- cgit v1.2.3