aboutsummaryrefslogtreecommitdiff
path: root/src/common/Metric/Metric.cpp
diff options
context:
space:
mode:
authorariel- <ariel-@users.noreply.github.com>2017-06-19 23:20:06 -0300
committerariel- <ariel-@users.noreply.github.com>2017-06-19 23:20:06 -0300
commit85a7d5ce9ac68b30da2277cc91d4b70358f1880d (patch)
treedf3d2084ee2e35008903c03178039b9c986e2d08 /src/common/Metric/Metric.cpp
parent052fc24315ace866ea1cf610e85df119b68100c9 (diff)
Core: ported headers cleanup from master branch
Diffstat (limited to 'src/common/Metric/Metric.cpp')
-rw-r--r--src/common/Metric/Metric.cpp99
1 files changed, 79 insertions, 20 deletions
diff --git a/src/common/Metric/Metric.cpp b/src/common/Metric/Metric.cpp
index fbd8695429b..10f0d13b688 100644
--- a/src/common/Metric/Metric.cpp
+++ b/src/common/Metric/Metric.cpp
@@ -16,12 +16,18 @@
*/
#include "Metric.h"
-#include "Log.h"
+#include "AsioHacksImpl.h"
+#include "Common.h"
#include "Config.h"
+#include "Log.h"
#include "Util.h"
+#include <boost/algorithm/string/replace.hpp>
+#include <boost/asio/deadline_timer.hpp>
+#include <boost/asio/ip/tcp.hpp>
void Metric::Initialize(std::string const& realmName, boost::asio::io_service& ioService, std::function<void()> overallStatusLogger)
{
+ _dataStream = Trinity::make_unique<boost::asio::ip::tcp::iostream>();
_realmName = FormatInfluxDBTagValue(realmName);
_batchTimer = Trinity::make_unique<boost::asio::deadline_timer>(ioService);
_overallStatusTimer = Trinity::make_unique<boost::asio::deadline_timer>(ioService);
@@ -31,8 +37,9 @@ void Metric::Initialize(std::string const& realmName, boost::asio::io_service& i
bool Metric::Connect()
{
- _dataStream.connect(_hostname, _port);
- auto error = _dataStream.error();
+ auto& stream = static_cast<boost::asio::ip::tcp::iostream&>(GetDataStream());
+ stream.connect(_hostname, _port);
+ auto error = stream.error();
if (error)
{
TC_LOG_ERROR("metric", "Error connecting to '%s:%s', disabling Metric. Error message : %s",
@@ -40,7 +47,7 @@ bool Metric::Connect()
_enabled = false;
return false;
}
- _dataStream.clear();
+ stream.clear();
return true;
}
@@ -156,22 +163,22 @@ void Metric::SendBatch()
return;
}
- if (!_dataStream.good() && !Connect())
+ if (!GetDataStream().good() && !Connect())
return;
- _dataStream << "POST " << "/write?db=" << _databaseName << " HTTP/1.1\r\n";
- _dataStream << "Host: " << _hostname << ":" << _port << "\r\n";
- _dataStream << "Accept: */*\r\n";
- _dataStream << "Content-Type: application/octet-stream\r\n";
- _dataStream << "Content-Transfer-Encoding: binary\r\n";
+ GetDataStream() << "POST " << "/write?db=" << _databaseName << " HTTP/1.1\r\n";
+ GetDataStream() << "Host: " << _hostname << ":" << _port << "\r\n";
+ GetDataStream() << "Accept: */*\r\n";
+ GetDataStream() << "Content-Type: application/octet-stream\r\n";
+ GetDataStream() << "Content-Transfer-Encoding: binary\r\n";
- _dataStream << "Content-Length: " << std::to_string(batchedData.tellp()) << "\r\n\r\n";
- _dataStream << batchedData.rdbuf();
+ GetDataStream() << "Content-Length: " << std::to_string(batchedData.tellp()) << "\r\n\r\n";
+ GetDataStream() << batchedData.rdbuf();
std::string http_version;
- _dataStream >> http_version;
+ GetDataStream() >> http_version;
unsigned int status_code = 0;
- _dataStream >> status_code;
+ GetDataStream() >> status_code;
if (status_code != 204)
{
TC_LOG_ERROR("metric", "Error sending data, returned HTTP code: %u", status_code);
@@ -179,14 +186,12 @@ void Metric::SendBatch()
// Read and ignore the status description
std::string status_description;
- std::getline(_dataStream, status_description);
+ std::getline(GetDataStream(), status_description);
// Read headers
std::string header;
- while (std::getline(_dataStream, header) && header != "\r")
- {
+ while (std::getline(GetDataStream(), header) && header != "\r")
if (header == "Connection: close\r")
- _dataStream.close();
- }
+ static_cast<boost::asio::ip::tcp::iostream&>(GetDataStream()).close();
ScheduleSend();
}
@@ -200,7 +205,7 @@ void Metric::ScheduleSend()
}
else
{
- _dataStream.close();
+ static_cast<boost::asio::ip::tcp::iostream&>(GetDataStream()).close();
MetricData* data;
// Clear the queue
while (_queuedData.Dequeue(data))
@@ -228,8 +233,62 @@ void Metric::ScheduleOverallStatusLog()
}
}
+std::string Metric::FormatInfluxDBValue(bool value)
+{
+ return value ? "t" : "f";
+}
+
+template<class T>
+std::string Metric::FormatInfluxDBValue(T value)
+{
+ return std::to_string(value) + 'i';
+}
+
+std::string Metric::FormatInfluxDBValue(std::string const& value)
+{
+ return '"' + boost::replace_all_copy(value, "\"", "\\\"") + '"';
+}
+
+std::string Metric::FormatInfluxDBValue(char const* value)
+{
+ return FormatInfluxDBValue(std::string(value));
+}
+
+std::string Metric::FormatInfluxDBValue(double value)
+{
+ return std::to_string(value);
+}
+
+std::string Metric::FormatInfluxDBValue(float value)
+{
+ return FormatInfluxDBValue(double(value));
+}
+
+std::string Metric::FormatInfluxDBTagValue(std::string const& value)
+{
+ // ToDo: should handle '=' and ',' characters too
+ return boost::replace_all_copy(value, " ", "\\ ");
+}
+
+Metric::Metric()
+{
+}
+
+Metric::~Metric()
+{
+}
+
Metric* Metric::instance()
{
static Metric instance;
return &instance;
}
+
+template TC_COMMON_API std::string Metric::FormatInfluxDBValue(int8);
+template TC_COMMON_API std::string Metric::FormatInfluxDBValue(uint8);
+template TC_COMMON_API std::string Metric::FormatInfluxDBValue(int16);
+template TC_COMMON_API std::string Metric::FormatInfluxDBValue(uint16);
+template TC_COMMON_API std::string Metric::FormatInfluxDBValue(int32);
+template TC_COMMON_API std::string Metric::FormatInfluxDBValue(uint32);
+template TC_COMMON_API std::string Metric::FormatInfluxDBValue(int64);
+template TC_COMMON_API std::string Metric::FormatInfluxDBValue(uint64);