From ef8c48245e9bf56d089f2e371a4447598c326c96 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 2 Jul 2013 10:05:28 -0700 Subject: [PATCH 1/5] remove a couple of unused variables in the domain-server --- domain-server/src/main.cpp | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index 2ea7ecf9f6..a0cd48218c 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -17,36 +17,22 @@ // M - Audio Mixer // -#include +#include +#include #include #include #include #include -#include -#include + #include "AgentList.h" #include "AgentTypes.h" -#include +#include "Logstash.h" +#include "PacketHeaders.h" #include "SharedUtil.h" -#ifdef _WIN32 -#include "Syssocket.h" -#include "Systime.h" -#else -#include -#include -#include -#include -#endif - - const int DOMAIN_LISTEN_PORT = 40102; unsigned char packetData[MAX_PACKET_SIZE]; -const int LOGOFF_CHECK_INTERVAL = 5000; - -int lastActiveCount = 0; - unsigned char* addAgentToBroadcastPacket(unsigned char* currentPosition, Agent* agentToAdd) { *currentPosition++ = agentToAdd->getType(); From 2a4d9c98ee4ba40d4f5e8308aed6b46aae58739e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 2 Jul 2013 10:34:57 -0700 Subject: [PATCH 2/5] add return of number of alive agents from AgentList --- libraries/shared/src/AgentList.cpp | 12 ++++++++++++ libraries/shared/src/AgentList.h | 1 + 2 files changed, 13 insertions(+) diff --git a/libraries/shared/src/AgentList.cpp b/libraries/shared/src/AgentList.cpp index 2db1e68318..f438591d75 100644 --- a/libraries/shared/src/AgentList.cpp +++ b/libraries/shared/src/AgentList.cpp @@ -191,6 +191,18 @@ Agent* AgentList::agentWithID(uint16_t agentID) { return NULL; } +int AgentList::numAliveAgents() const { + int numAliveAgents = 0; + + for (AgentList::iterator agent = begin(); agent != end(); agent++) { + if (agent->isAlive()) { + ++numAliveAgents; + } + } + + return numAliveAgents; +} + void AgentList::setAgentTypesOfInterest(const char* agentTypesOfInterest, int numAgentTypesOfInterest) { delete _agentTypesOfInterest; diff --git a/libraries/shared/src/AgentList.h b/libraries/shared/src/AgentList.h index c817adb6f3..44bab7aa97 100644 --- a/libraries/shared/src/AgentList.h +++ b/libraries/shared/src/AgentList.h @@ -63,6 +63,7 @@ public: void(*linkedDataCreateCallback)(Agent *); int size() { return _numAgents; } + int numAliveAgents() const; void lock() { pthread_mutex_lock(&mutex); } void unlock() { pthread_mutex_unlock(&mutex); } From 64f3b55aaa3fffd5ac12aca912fcddb288c97f22 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 2 Jul 2013 12:10:46 -0700 Subject: [PATCH 3/5] split logstash stash methods to stat types --- audio-mixer/src/main.cpp | 2 +- interface/src/Application.cpp | 2 +- libraries/shared/src/Logstash.cpp | 22 +++++++++++++++++++--- libraries/shared/src/Logstash.h | 6 +++++- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index d473a8172e..5782539180 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -138,7 +138,7 @@ int main(int argc, const char* argv[]) { const char MIXER_LOGSTASH_METRIC_NAME[] = "audio-mixer-frame-time-usage"; float averageFrameTimePercentage = sumFrameTimePercentages / numStatCollections; - Logstash::stashValue(MIXER_LOGSTASH_METRIC_NAME, averageFrameTimePercentage); + Logstash::stashGaugeValue(MIXER_LOGSTASH_METRIC_NAME, averageFrameTimePercentage); sumFrameTimePercentages = 0.0f; numStatCollections = 0; diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fb63fe2daf..7d546328aa 100755 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -349,7 +349,7 @@ void Application::initializeGL() { const char LOGSTASH_INTERFACE_START_TIME_KEY[] = "interface-start-time"; // ask the Logstash class to record the startup time - Logstash::stashValue(LOGSTASH_INTERFACE_START_TIME_KEY, startupTime); + Logstash::stashTimerValue(LOGSTASH_INTERFACE_START_TIME_KEY, startupTime); } // update before the first render diff --git a/libraries/shared/src/Logstash.cpp b/libraries/shared/src/Logstash.cpp index 94279fdd4a..bee5e26aba 100644 --- a/libraries/shared/src/Logstash.cpp +++ b/libraries/shared/src/Logstash.cpp @@ -45,16 +45,32 @@ bool Logstash::shouldSendStats() { return shouldSendStats; } -void Logstash::stashValue(const char* key, float value) { +void Logstash::stashValue(char valueType, const char* key, float value) { static char logstashPacket[MAX_PACKET_SIZE]; // load up the logstash packet with the key and the passed float value // send it to 4 decimal places - int numPacketBytes = sprintf(logstashPacket, "%s %.4f", key, value); + int numPacketBytes = sprintf(logstashPacket, "%c %s %.4f", valueType, key, value); AgentList *agentList = AgentList::getInstance(); if (agentList) { agentList->getAgentSocket()->send(socket(), logstashPacket, numPacketBytes); } -} \ No newline at end of file +} + +void Logstash::stashTimerValue(const char* key, float value) { + const char STAT_TYPE_TIMER = 't'; + stashValue(STAT_TYPE_TIMER, key, value); +} + +void Logstash::stashCounterValue(const char* key, float value) { + const char STAT_TYPE_COUNTER = 'c'; + stashValue(STAT_TYPE_COUNTER, key, value); +} + +void Logstash::stashGaugeValue(const char* key, float value) { + const char STAT_TYPE_GAUGE = 'g'; + stashValue(STAT_TYPE_GAUGE, key, value); +} + diff --git a/libraries/shared/src/Logstash.h b/libraries/shared/src/Logstash.h index 5f2d247218..f41a42e85f 100644 --- a/libraries/shared/src/Logstash.h +++ b/libraries/shared/src/Logstash.h @@ -18,8 +18,12 @@ class Logstash { public: static sockaddr* socket(); static bool shouldSendStats(); - static void stashValue(const char* key, float value); + static void stashTimerValue(const char* key, float value); + static void stashCounterValue(const char* key, float value); + static void stashGaugeValue(const char* key, float value); private: + static void stashValue(char valueType, const char* key, float value); + static sockaddr_in logstashSocket; }; From 08c1d54cf3c22deac0fd04438ee471c197b1b0a1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 2 Jul 2013 12:18:16 -0700 Subject: [PATCH 4/5] send count of alive nodes to logstash from DS --- domain-server/src/main.cpp | 15 +++++++++++++++ libraries/shared/src/AgentList.cpp | 2 +- libraries/shared/src/AgentList.h | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index a0cd48218c..8bbdfe0f6b 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -33,6 +33,8 @@ const int DOMAIN_LISTEN_PORT = 40102; unsigned char packetData[MAX_PACKET_SIZE]; +const int NODE_COUNT_STAT_INTERVAL_MSECS = 5000; + unsigned char* addAgentToBroadcastPacket(unsigned char* currentPosition, Agent* agentToAdd) { *currentPosition++ = agentToAdd->getType(); @@ -80,6 +82,8 @@ int main(int argc, const char * argv[]) agentList->startSilentAgentRemovalThread(); + timeval lastStatSendTime = {}; + while (true) { if (agentList->getAgentSocket()->receive((sockaddr *)&agentPublicAddress, packetData, &receivedBytes) && (packetData[0] == PACKET_HEADER_DOMAIN_REPORT_FOR_DUTY || packetData[0] == PACKET_HEADER_DOMAIN_LIST_REQUEST)) { @@ -171,6 +175,17 @@ int main(int argc, const char * argv[]) broadcastPacket, (currentBufferPos - startPointer) + 1); } + + if (Logstash::shouldSendStats()) { + if (usecTimestampNow() - usecTimestamp(&lastStatSendTime) >= (NODE_COUNT_STAT_INTERVAL_MSECS * 1000)) { + // time to send our count of agents and servers to logstash + const char NODE_COUNT_LOGSTASH_KEY[] = "ds-node-count"; + + Logstash::stashGaugeValue(NODE_COUNT_LOGSTASH_KEY, agentList->getNumAliveAgents()); + + gettimeofday(&lastStatSendTime, NULL); + } + } } return 0; diff --git a/libraries/shared/src/AgentList.cpp b/libraries/shared/src/AgentList.cpp index f438591d75..3e5f7c331c 100644 --- a/libraries/shared/src/AgentList.cpp +++ b/libraries/shared/src/AgentList.cpp @@ -191,7 +191,7 @@ Agent* AgentList::agentWithID(uint16_t agentID) { return NULL; } -int AgentList::numAliveAgents() const { +int AgentList::getNumAliveAgents() const { int numAliveAgents = 0; for (AgentList::iterator agent = begin(); agent != end(); agent++) { diff --git a/libraries/shared/src/AgentList.h b/libraries/shared/src/AgentList.h index 44bab7aa97..71e1969c90 100644 --- a/libraries/shared/src/AgentList.h +++ b/libraries/shared/src/AgentList.h @@ -63,7 +63,7 @@ public: void(*linkedDataCreateCallback)(Agent *); int size() { return _numAgents; } - int numAliveAgents() const; + int getNumAliveAgents() const; void lock() { pthread_mutex_lock(&mutex); } void unlock() { pthread_mutex_unlock(&mutex); } From f7f321663af34f2e81331a2582c81a8d4fab056d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 2 Jul 2013 14:42:31 -0700 Subject: [PATCH 5/5] DRY up multiple stat type sending --- audio-mixer/src/main.cpp | 2 +- domain-server/src/main.cpp | 2 +- interface/src/Application.cpp | 2 +- libraries/shared/src/Logstash.cpp | 18 +----------------- libraries/shared/src/Logstash.h | 10 +++++----- 5 files changed, 9 insertions(+), 25 deletions(-) diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index 5782539180..c14df9ca43 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -138,7 +138,7 @@ int main(int argc, const char* argv[]) { const char MIXER_LOGSTASH_METRIC_NAME[] = "audio-mixer-frame-time-usage"; float averageFrameTimePercentage = sumFrameTimePercentages / numStatCollections; - Logstash::stashGaugeValue(MIXER_LOGSTASH_METRIC_NAME, averageFrameTimePercentage); + Logstash::stashValue(STAT_TYPE_GAUGE, MIXER_LOGSTASH_METRIC_NAME, averageFrameTimePercentage); sumFrameTimePercentages = 0.0f; numStatCollections = 0; diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index 8bbdfe0f6b..5139e13dd8 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -181,7 +181,7 @@ int main(int argc, const char * argv[]) // time to send our count of agents and servers to logstash const char NODE_COUNT_LOGSTASH_KEY[] = "ds-node-count"; - Logstash::stashGaugeValue(NODE_COUNT_LOGSTASH_KEY, agentList->getNumAliveAgents()); + Logstash::stashValue(STAT_TYPE_GAUGE, NODE_COUNT_LOGSTASH_KEY, agentList->getNumAliveAgents()); gettimeofday(&lastStatSendTime, NULL); } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7d546328aa..bf56943974 100755 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -349,7 +349,7 @@ void Application::initializeGL() { const char LOGSTASH_INTERFACE_START_TIME_KEY[] = "interface-start-time"; // ask the Logstash class to record the startup time - Logstash::stashTimerValue(LOGSTASH_INTERFACE_START_TIME_KEY, startupTime); + Logstash::stashValue(STAT_TYPE_TIMER, LOGSTASH_INTERFACE_START_TIME_KEY, startupTime); } // update before the first render diff --git a/libraries/shared/src/Logstash.cpp b/libraries/shared/src/Logstash.cpp index bee5e26aba..7773fa76c2 100644 --- a/libraries/shared/src/Logstash.cpp +++ b/libraries/shared/src/Logstash.cpp @@ -57,20 +57,4 @@ void Logstash::stashValue(char valueType, const char* key, float value) { if (agentList) { agentList->getAgentSocket()->send(socket(), logstashPacket, numPacketBytes); } -} - -void Logstash::stashTimerValue(const char* key, float value) { - const char STAT_TYPE_TIMER = 't'; - stashValue(STAT_TYPE_TIMER, key, value); -} - -void Logstash::stashCounterValue(const char* key, float value) { - const char STAT_TYPE_COUNTER = 'c'; - stashValue(STAT_TYPE_COUNTER, key, value); -} - -void Logstash::stashGaugeValue(const char* key, float value) { - const char STAT_TYPE_GAUGE = 'g'; - stashValue(STAT_TYPE_GAUGE, key, value); -} - +} \ No newline at end of file diff --git a/libraries/shared/src/Logstash.h b/libraries/shared/src/Logstash.h index f41a42e85f..7c805ddb23 100644 --- a/libraries/shared/src/Logstash.h +++ b/libraries/shared/src/Logstash.h @@ -14,16 +14,16 @@ const int LOGSTASH_UDP_PORT = 9500; const char LOGSTASH_HOSTNAME[] = "graphite.highfidelity.io"; +const char STAT_TYPE_TIMER = 't'; +const char STAT_TYPE_COUNTER = 'c'; +const char STAT_TYPE_GAUGE = 'g'; + class Logstash { public: static sockaddr* socket(); static bool shouldSendStats(); - static void stashTimerValue(const char* key, float value); - static void stashCounterValue(const char* key, float value); - static void stashGaugeValue(const char* key, float value); + static void stashValue(char statType, const char* key, float value); private: - static void stashValue(char valueType, const char* key, float value); - static sockaddr_in logstashSocket; };