diff options
| author | Stefan Boberg <[email protected]> | 2023-10-25 12:21:51 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-10-25 12:21:51 +0200 |
| commit | 0b220255724020daea18ddb559f5edf3fdb1621b (patch) | |
| tree | 7809227752c15d90111c4e600d80b59d90ad25d2 /src/zenserver/stats | |
| parent | New rotating file logger that keeps on running regardless of errors (#495) (diff) | |
| download | zen-0b220255724020daea18ddb559f5edf3fdb1621b.tar.xz zen-0b220255724020daea18ddb559f5edf3fdb1621b.zip | |
statsd metrics reporting (#496)
added support for reporting metrics via statsd style UDP messaging, which is supported by many monitoring solution providers
this change adds reporting only of three cache related metrics (hit/miss/put) but this should be extended to include more metrics after additional evaluation
Diffstat (limited to 'src/zenserver/stats')
| -rw-r--r-- | src/zenserver/stats/statsreporter.cpp | 60 | ||||
| -rw-r--r-- | src/zenserver/stats/statsreporter.h | 39 |
2 files changed, 99 insertions, 0 deletions
diff --git a/src/zenserver/stats/statsreporter.cpp b/src/zenserver/stats/statsreporter.cpp new file mode 100644 index 000000000..5d5ef4bfa --- /dev/null +++ b/src/zenserver/stats/statsreporter.cpp @@ -0,0 +1,60 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "statsreporter.h" + +#include <zencore/logging.h> +#include <zennet/statsdclient.h> + +namespace zen { + +StatsReporter::StatsReporter() +{ +} + +StatsReporter::~StatsReporter() +{ +} + +void +StatsReporter::Initialize(const ZenStatsConfig& Config) +{ + RwLock::ExclusiveLockScope _(m_Lock); + + if (Config.Enabled) + { + ZEN_INFO("initializing stats reporter: {}:{}", Config.StatsdHost, Config.StatsdPort) + m_Statsd = CreateStatsDaemonClient(Config.StatsdHost, gsl::narrow<uint16_t>(Config.StatsdPort)); + m_Statsd->SetMessageSize(1500, false); + } +} + +void +StatsReporter::Shutdown() +{ + RwLock::ExclusiveLockScope _(m_Lock); + m_Statsd.reset(); +} + +void +StatsReporter::AddProvider(StatsProvider* Provider) +{ + RwLock::ExclusiveLockScope _(m_Lock); + m_Providers.push_back(Provider); +} + +void +StatsReporter::ReportStats() +{ + RwLock::ExclusiveLockScope _(m_Lock); + if (m_Statsd) + { + for (StatsProvider* Provider : m_Providers) + { + Provider->ReportMetrics(*m_Statsd); + } + + m_Statsd->Flush(); + } +} + +} // namespace zen diff --git a/src/zenserver/stats/statsreporter.h b/src/zenserver/stats/statsreporter.h new file mode 100644 index 000000000..ed6ec6c55 --- /dev/null +++ b/src/zenserver/stats/statsreporter.h @@ -0,0 +1,39 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "config.h" + +#include <zencore/thread.h> + +namespace zen { + +class StatsDaemonClient; + +class StatsProvider +{ +public: + virtual void ReportMetrics(StatsDaemonClient& Statsd) = 0; +}; + +class StatsReporter +{ +public: + StatsReporter(); + ~StatsReporter(); + + StatsReporter& operator=(const StatsReporter&) = delete; + StatsReporter(const StatsReporter&) = delete; + + void Initialize(const ZenStatsConfig& Config); + void Shutdown(); + void AddProvider(StatsProvider* Provider); + void ReportStats(); + +private: + RwLock m_Lock; + std::unique_ptr<StatsDaemonClient> m_Statsd; + std::vector<StatsProvider*> m_Providers; +}; + +} // namespace zen |