From 0a67e760bdc00cbeb251a9ca33d76b62f2d59316 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Fri, 8 Nov 2013 15:42:46 +0100 Subject: [PATCH] Optimize GraphiteWriter::SendMetric. Fixes #5037 --- components/perfdata/graphitewriter.cpp | 38 ++++++++++++++------------ components/perfdata/graphitewriter.h | 2 +- lib/base/convert.cpp | 14 ---------- lib/base/convert.h | 22 +++++++++++++-- 4 files changed, 40 insertions(+), 36 deletions(-) diff --git a/components/perfdata/graphitewriter.cpp b/components/perfdata/graphitewriter.cpp index 71920c574..edeeb734f 100644 --- a/components/perfdata/graphitewriter.cpp +++ b/components/perfdata/graphitewriter.cpp @@ -84,13 +84,22 @@ void GraphiteWriter::CheckResultHandler(const Service::Ptr& service, const Dicti if (!IcingaApplication::GetInstance()->GetEnablePerfdata() || !service->GetEnablePerfdata()) return; + /* TODO: sanitize host and service names */ + String hostName = service->GetHost()->GetName(); + String serviceName = service->GetShortName(); + + SanitizeMetric(hostName); + SanitizeMetric(serviceName); + + String prefix = "icinga." + hostName + "." + serviceName; + /* basic metrics */ - SendMetric(service, "current_attempt", service->GetCheckAttempt()); - SendMetric(service, "max_check_attempts", service->GetMaxCheckAttempts()); - SendMetric(service, "state_type", service->GetStateType()); - SendMetric(service, "state", service->GetState()); - SendMetric(service, "latency", Service::CalculateLatency(cr)); - SendMetric(service, "execution_time", Service::CalculateExecutionTime(cr)); + SendMetric(prefix, "current_attempt", service->GetCheckAttempt()); + SendMetric(prefix, "max_check_attempts", service->GetMaxCheckAttempts()); + SendMetric(prefix, "state_type", service->GetStateType()); + SendMetric(prefix, "state", service->GetState()); + SendMetric(prefix, "latency", Service::CalculateLatency(cr)); + SendMetric(prefix, "execution_time", Service::CalculateExecutionTime(cr)); Value pdv = cr->Get("performance_data"); @@ -109,23 +118,16 @@ void GraphiteWriter::CheckResultHandler(const Service::Ptr& service, const Dicti else valueNum = static_cast(value)->GetValue(); - SendMetric(service, key, valueNum); + SendMetric(prefix, key, valueNum); } } -void GraphiteWriter::SendMetric(const Service::Ptr& service, const String& name, double value) +void GraphiteWriter::SendMetric(const String& prefix, const String& name, double value) { - /* TODO: sanitize host and service names */ - String hostName = service->GetHost()->GetName(); - String serviceName = service->GetShortName(); - - SanitizeMetric(hostName); - SanitizeMetric(serviceName); - - String metricPrefix = hostName + "." + serviceName; - String graphitePrefix = "icinga"; + std::ostringstream msgbuf; + msgbuf << prefix << "." << name << " " << value << " " << static_cast(Utility::GetTime()) << "\n"; - String metric = graphitePrefix + "." + metricPrefix + "." + name + " " + Convert::ToString(value) + " " + Convert::ToString(static_cast(Utility::GetTime())) + "\n"; + String metric = msgbuf.str(); Log(LogDebug, "perfdata", "GraphiteWriter: Add to metric list:'" + metric + "'."); ObjectLock olock(this); diff --git a/components/perfdata/graphitewriter.h b/components/perfdata/graphitewriter.h index 133790fd1..697ce393d 100644 --- a/components/perfdata/graphitewriter.h +++ b/components/perfdata/graphitewriter.h @@ -50,7 +50,7 @@ private: Timer::Ptr m_ReconnectTimer; void CheckResultHandler(const Service::Ptr& service, const Dictionary::Ptr& cr); - void SendMetric(const Service::Ptr& service, const String& name, double value); + void SendMetric(const String& prefix, const String& name, double value); static void SanitizeMetric(String& str); void ReconnectTimerHandler(void); diff --git a/lib/base/convert.cpp b/lib/base/convert.cpp index 6e9299c18..b2727df74 100644 --- a/lib/base/convert.cpp +++ b/lib/base/convert.cpp @@ -22,22 +22,8 @@ using namespace icinga; -long Convert::ToLong(const String& val) -{ - return boost::lexical_cast(val); -} - -double Convert::ToDouble(const String& val) -{ - return boost::lexical_cast(val); -} - bool Convert::ToBool(const String& val) { return (ToLong(val) != 0); } -String Convert::ToString(const Value& val) -{ - return static_cast(val); -} diff --git a/lib/base/convert.h b/lib/base/convert.h index 2301136e3..435a2fa38 100644 --- a/lib/base/convert.h +++ b/lib/base/convert.h @@ -22,6 +22,7 @@ #include "base/i2-base.h" #include "base/value.h" +#include namespace icinga { @@ -34,10 +35,25 @@ namespace icinga class I2_BASE_API Convert { public: - static long ToLong(const String& val); - static double ToDouble(const String& val); + template + static long ToLong(const T& val) + { + return boost::lexical_cast(val); + } + + template + static double ToDouble(const T& val) + { + return boost::lexical_cast(val); + } + static bool ToBool(const String& val); - static String ToString(const Value& val); + + template + static String ToString(const T& val) + { + return boost::lexical_cast(val); + } private: Convert(void); -- 2.40.0