From ed496d56531a13318db0f3b70ce75232f0d57ccf Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 15 Jan 2014 01:24:12 -0700 Subject: [PATCH] Added serverMetrics library --- engine/server/library/CMakeLists.txt | 3 +- .../library/serverMetrics/CMakeLists.txt | 11 ++ .../public/serverMetrics/FirstServerMetrics.h | 1 + .../public/serverMetrics/MetricsConnection.h | 1 + .../public/serverMetrics/MetricsData.h | 1 + .../public/serverMetrics/MetricsManager.h | 1 + .../library/serverMetrics/src/CMakeLists.txt | 40 ++++++ .../src/shared/ConfigServerMetrics.cpp | 47 ++++++ .../src/shared/ConfigServerMetrics.h | 77 ++++++++++ .../src/shared/FirstServerMetrics.h | 18 +++ .../src/shared/MetricsConnection.cpp | 61 ++++++++ .../src/shared/MetricsConnection.h | 32 +++++ .../serverMetrics/src/shared/MetricsData.cpp | 128 +++++++++++++++++ .../serverMetrics/src/shared/MetricsData.h | 57 ++++++++ .../src/shared/MetricsManager.cpp | 135 ++++++++++++++++++ .../serverMetrics/src/shared/MetricsManager.h | 64 +++++++++ .../src/win32/FirstServerMetrics.cpp | 9 ++ 17 files changed, 685 insertions(+), 1 deletion(-) create mode 100644 engine/server/library/serverMetrics/CMakeLists.txt create mode 100644 engine/server/library/serverMetrics/include/public/serverMetrics/FirstServerMetrics.h create mode 100644 engine/server/library/serverMetrics/include/public/serverMetrics/MetricsConnection.h create mode 100644 engine/server/library/serverMetrics/include/public/serverMetrics/MetricsData.h create mode 100644 engine/server/library/serverMetrics/include/public/serverMetrics/MetricsManager.h create mode 100644 engine/server/library/serverMetrics/src/CMakeLists.txt create mode 100644 engine/server/library/serverMetrics/src/shared/ConfigServerMetrics.cpp create mode 100644 engine/server/library/serverMetrics/src/shared/ConfigServerMetrics.h create mode 100644 engine/server/library/serverMetrics/src/shared/FirstServerMetrics.h create mode 100644 engine/server/library/serverMetrics/src/shared/MetricsConnection.cpp create mode 100644 engine/server/library/serverMetrics/src/shared/MetricsConnection.h create mode 100644 engine/server/library/serverMetrics/src/shared/MetricsData.cpp create mode 100644 engine/server/library/serverMetrics/src/shared/MetricsData.h create mode 100644 engine/server/library/serverMetrics/src/shared/MetricsManager.cpp create mode 100644 engine/server/library/serverMetrics/src/shared/MetricsManager.h create mode 100644 engine/server/library/serverMetrics/src/win32/FirstServerMetrics.cpp diff --git a/engine/server/library/CMakeLists.txt b/engine/server/library/CMakeLists.txt index 2030f138..1e7013f0 100644 --- a/engine/server/library/CMakeLists.txt +++ b/engine/server/library/CMakeLists.txt @@ -1,2 +1,3 @@ -add_subdirectory(serverKeyShare) \ No newline at end of file +add_subdirectory(serverKeyShare) +add_subdirectory(serverMetrics) diff --git a/engine/server/library/serverMetrics/CMakeLists.txt b/engine/server/library/serverMetrics/CMakeLists.txt new file mode 100644 index 00000000..96a68840 --- /dev/null +++ b/engine/server/library/serverMetrics/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 2.8) + +project(serverMetrics) + +if(WIN32) + add_definitions(/D_CRT_SECURE_NO_WARNINGS) +endif() + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/public) + +add_subdirectory(src) diff --git a/engine/server/library/serverMetrics/include/public/serverMetrics/FirstServerMetrics.h b/engine/server/library/serverMetrics/include/public/serverMetrics/FirstServerMetrics.h new file mode 100644 index 00000000..e259c9eb --- /dev/null +++ b/engine/server/library/serverMetrics/include/public/serverMetrics/FirstServerMetrics.h @@ -0,0 +1 @@ +#include "../../src/shared/FirstServerMetrics.h" diff --git a/engine/server/library/serverMetrics/include/public/serverMetrics/MetricsConnection.h b/engine/server/library/serverMetrics/include/public/serverMetrics/MetricsConnection.h new file mode 100644 index 00000000..abca15a6 --- /dev/null +++ b/engine/server/library/serverMetrics/include/public/serverMetrics/MetricsConnection.h @@ -0,0 +1 @@ +#include "../../src/shared/MetricsConnection.h" diff --git a/engine/server/library/serverMetrics/include/public/serverMetrics/MetricsData.h b/engine/server/library/serverMetrics/include/public/serverMetrics/MetricsData.h new file mode 100644 index 00000000..73ef26b0 --- /dev/null +++ b/engine/server/library/serverMetrics/include/public/serverMetrics/MetricsData.h @@ -0,0 +1 @@ +#include "../../src/shared/MetricsData.h" diff --git a/engine/server/library/serverMetrics/include/public/serverMetrics/MetricsManager.h b/engine/server/library/serverMetrics/include/public/serverMetrics/MetricsManager.h new file mode 100644 index 00000000..c6b0a383 --- /dev/null +++ b/engine/server/library/serverMetrics/include/public/serverMetrics/MetricsManager.h @@ -0,0 +1 @@ +#include "../../src/shared/MetricsManager.h" diff --git a/engine/server/library/serverMetrics/src/CMakeLists.txt b/engine/server/library/serverMetrics/src/CMakeLists.txt new file mode 100644 index 00000000..c6578d7d --- /dev/null +++ b/engine/server/library/serverMetrics/src/CMakeLists.txt @@ -0,0 +1,40 @@ + +set(SHARED_SOURCES + shared/ConfigServerMetrics.cpp + shared/ConfigServerMetrics.h + shared/FirstServerMetrics.h + shared/MetricsConnection.cpp + shared/MetricsConnection.h + shared/MetricsData.cpp + shared/MetricsData.h + shared/MetricsManager.cpp + shared/MetricsManager.h +) + +if(WIN32) + set(PLATFORM_SOURCES + win32/FirstServerMetrics.cpp + ) +else() + set(PLATFORM_SOURCES "") +endif() + +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR}/shared + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedDebug/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedFoundation/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedFoundationTypes/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedMemoryManager/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedNetwork/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedNetworkMessages/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/sharedUtility/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/serverNetworkMessages/include/public + ${SWG_ENGINE_SOURCE_DIR}/shared/library/serverUtility/include/public + ${SWG_EXTERNALS_SOURCE_DIR}/ours/library/archive/include + ${SWG_EXTERNALS_SOURCE_DIR}/ours/library/singleton/include +) + +add_library(serverMetrics STATIC + ${SHARED_SOURCES} + ${PLATFORM_SOURCES} +) diff --git a/engine/server/library/serverMetrics/src/shared/ConfigServerMetrics.cpp b/engine/server/library/serverMetrics/src/shared/ConfigServerMetrics.cpp new file mode 100644 index 00000000..1ce30451 --- /dev/null +++ b/engine/server/library/serverMetrics/src/shared/ConfigServerMetrics.cpp @@ -0,0 +1,47 @@ +// ConfigServerMetrics.cpp +// copyright 2000 Verant Interactive +// Author: Justin Randall + + +//----------------------------------------------------------------------- + +#include "serverMetrics/FirstServerMetrics.h" +#include "sharedFoundation/ConfigFile.h" +#include "ConfigServerMetrics.h" + +//----------------------------------------------------------------------- + +ConfigServerMetrics::Data * ConfigServerMetrics::data = 0; + +#define KEY_INT(a,b) (data->a = ConfigFile::getKeyInt("ServerMetrics", #a, b)) +#define KEY_BOOL(a,b) (data->a = ConfigFile::getKeyBool("ServerMetrics", #a, b)) +#define KEY_REAL(a,b) (data->a = ConfigFile::getKeyReal("ServerMetrics", #a, b)) +#define KEY_STRING(a,b) (data->a = ConfigFile::getKeyString("ServerMetrics", #a, b)) + +//----------------------------------------------------------------------- + +void ConfigServerMetrics::install(void) +{ + data = new ConfigServerMetrics::Data; + + KEY_STRING(metricsServerAddress, "localhost"); + + data->secondsBetweenUpdates = static_cast(ConfigFile::getKeyInt("ServerMetrics", "secondsBetweenUpdates", 5)); + data->metricsServerPort = static_cast(ConfigFile::getKeyInt("ServerMetrics", "metricsServerPort", 44480)); + + KEY_STRING(primaryName, "unknownProcess"); + KEY_STRING(secondaryName, ""); + KEY_INT(frameTimeAveragingSize, 11); + +} + +//----------------------------------------------------------------------- + +void ConfigServerMetrics::remove(void) +{ + delete data; + data = 0; +} + +//----------------------------------------------------------------------- + diff --git a/engine/server/library/serverMetrics/src/shared/ConfigServerMetrics.h b/engine/server/library/serverMetrics/src/shared/ConfigServerMetrics.h new file mode 100644 index 00000000..1ee92edc --- /dev/null +++ b/engine/server/library/serverMetrics/src/shared/ConfigServerMetrics.h @@ -0,0 +1,77 @@ +// ConfigServerMetrics.h +// copyright 2000 Verant Interactive + + +#ifndef _ConfigServerMetrics_H +#define _ConfigServerMetrics_H + +//----------------------------------------------------------------------- + +class ConfigServerMetrics +{ +public: + struct Data + { + const char * metricsServerAddress; + uint16 metricsServerPort; + uint16 secondsBetweenUpdates; + const char * primaryName; + const char * secondaryName; + int frameTimeAveragingSize; + + }; + static void install (); + static void remove (); + + static const char* getMetricsServerAddress(); + static uint16 getMetricsServerPort(); + static uint16 getSecondsBetweenUpdates(); + static const char* getPrimaryName(); + static const char* getSecondaryName(); + static int getFrameTimeAveragingSize(); + +private: + static Data * data; +}; + +//----------------------------------------------------------------------- + +inline const char* ConfigServerMetrics::getMetricsServerAddress() +{ + return data->metricsServerAddress; +} +//----------------------------------------------------------------------- + +inline uint16 ConfigServerMetrics::getMetricsServerPort() +{ + return data->metricsServerPort; +} +//----------------------------------------------------------------------- + +inline uint16 ConfigServerMetrics::getSecondsBetweenUpdates() +{ + return data->secondsBetweenUpdates; +} + +//----------------------------------------------------------------------- +inline const char* ConfigServerMetrics::getPrimaryName() +{ + return data->primaryName; +} +//----------------------------------------------------------------------- + +inline const char* ConfigServerMetrics::getSecondaryName() +{ + return data->secondaryName; +} +//----------------------------------------------------------------------- + +inline int ConfigServerMetrics::getFrameTimeAveragingSize() +{ + return data->frameTimeAveragingSize; +} + +//----------------------------------------------------------------------- + +#endif // _ConfigServerMetrics_H + diff --git a/engine/server/library/serverMetrics/src/shared/FirstServerMetrics.h b/engine/server/library/serverMetrics/src/shared/FirstServerMetrics.h new file mode 100644 index 00000000..05f8ea9e --- /dev/null +++ b/engine/server/library/serverMetrics/src/shared/FirstServerMetrics.h @@ -0,0 +1,18 @@ +// FirstServerMetrics.h +// Copyright 2000-02, Sony Online Entertainment Inc., all rights reserved. +// Author: Justin Randall + +#ifndef _INCLUDED_FirstServerMetrics_H +#define _INCLUDED_FirstServerMetrics_H + +//----------------------------------------------------------------------- + +#pragma warning ( disable : 4702 ) + +#include "Archive/ByteStream.h" +#include "sharedFoundation/FirstSharedFoundation.h" +#include "sharedNetwork/Connection.h" + +//----------------------------------------------------------------------- + +#endif diff --git a/engine/server/library/serverMetrics/src/shared/MetricsConnection.cpp b/engine/server/library/serverMetrics/src/shared/MetricsConnection.cpp new file mode 100644 index 00000000..8aa88412 --- /dev/null +++ b/engine/server/library/serverMetrics/src/shared/MetricsConnection.cpp @@ -0,0 +1,61 @@ +// MetricsConnection.cpp +// copyright 2000 Verant Interactive + + + +//----------------------------------------------------------------------- + +#include "serverMetrics/FirstServerMetrics.h" +#include "serverMetrics/MetricsConnection.h" + +#include "serverMetrics/MetricsManager.h" +#include "sharedNetwork/NetworkSetupData.h" +#include "sharedNetworkMessages/GameNetworkMessage.h" + +//----------------------------------------------------------------------- + +MetricsConnection::MetricsConnection(const std::string & a, const unsigned short p) : +ServerConnection(a, p, NetworkSetupData()) +{ +} + +//----------------------------------------------------------------------- + +MetricsConnection::MetricsConnection(UdpConnectionMT * u, TcpClient * t) : +ServerConnection(u, t) +{ +} + +//----------------------------------------------------------------------- + +MetricsConnection::~MetricsConnection() +{ +} + +//----------------------------------------------------------------------- + +void MetricsConnection::onConnectionClosed() +{ + DEBUG_REPORT_LOG(true, ("Connection with Metrics Server closed\n")); + MetricsManager::disconnect(); +} + +//----------------------------------------------------------------------- + +void MetricsConnection::onConnectionOpened() +{ + DEBUG_REPORT_LOG(true, ("Connection with Metrics Server opened\n")); + MetricsManager::connect(*this); +} + +//----------------------------------------------------------------------- + +void MetricsConnection::onReceive(const Archive::ByteStream & message) +{ + Archive::ReadIterator r(message); + GameNetworkMessage m(r); + UNREF(m); +// DEBUG_WARNING(true, ("This connection should receive no data (metrics) \n")); +} + +//----------------------------------------------------------------------- diff --git a/engine/server/library/serverMetrics/src/shared/MetricsConnection.h b/engine/server/library/serverMetrics/src/shared/MetricsConnection.h new file mode 100644 index 00000000..24d4c496 --- /dev/null +++ b/engine/server/library/serverMetrics/src/shared/MetricsConnection.h @@ -0,0 +1,32 @@ +// MetricsConnection.h +// copyright 2001 Verant Interactive + + +#ifndef _MetricsConnection_H +#define _MetricsConnection_H + +//----------------------------------------------------------------------- + +#include "serverUtility/ServerConnection.h" + +//----------------------------------------------------------------------- + +class MetricsConnection : public ServerConnection +{ +public: + MetricsConnection(const std::string & remoteAddress, const unsigned short remotePort); + MetricsConnection(UdpConnectionMT * u, TcpClient * t); + virtual ~MetricsConnection(); + + virtual void onConnectionClosed(); + virtual void onConnectionOpened(); + virtual void onReceive(const Archive::ByteStream & message); + +private: + MetricsConnection(const MetricsConnection&); + MetricsConnection& operator= (const MetricsConnection&); +}; + +//----------------------------------------------------------------------- + +#endif diff --git a/engine/server/library/serverMetrics/src/shared/MetricsData.cpp b/engine/server/library/serverMetrics/src/shared/MetricsData.cpp new file mode 100644 index 00000000..25231ade --- /dev/null +++ b/engine/server/library/serverMetrics/src/shared/MetricsData.cpp @@ -0,0 +1,128 @@ +//MetricsData.cpp +//Copyright 2002 Sony Online Entertainment + + +#include "serverMetrics/FirstServerMetrics.h" +#include "serverMetrics/MetricsData.h" + +#include "serverNetworkMessages/MetricsDataMessage.h" +#include "sharedFoundation/Clock.h" +#include "sharedFoundation/ConfigFile.h" +#include "sharedFoundation/Os.h" + +#include + +//--------------------------------------------- + +MetricsData* MetricsData::m_spInstance = 0; + + +MetricsData::MetricsData() : +m_data(), +m_message(), +m_memoryUtilization(0), +m_memoryUtilizationNoLeakTest(0), +m_memoryAllocated(0), +#ifndef _WIN32 + m_memoryVmSize(0), +#endif +m_loopTimeMs(0), +m_frameTimeHistory(), +m_frameTimeHistoryIndex(0), +m_frameTimeHistorySize(0), +m_frameTimeHistoryTotalTime(0.0f) +{ + MetricsPair p; + ADD_METRICS_DATA(memoryUtilization, 0, true); + ADD_METRICS_DATA(memoryUtilizationNoLeakTest, 0, true); + ADD_METRICS_DATA(memoryAllocated, 0, true); +#ifndef _WIN32 + ADD_METRICS_DATA(memoryVmSize, 0, true); +#endif + ADD_METRICS_DATA(loopTimeMs, 0, true); + + m_frameTimeHistorySize = ConfigFile::getKeyInt("ServerMetrics", "frameTimeAveragingSize", 11); + if (m_frameTimeHistorySize <= 0) + { + m_frameTimeHistorySize = 1; + } + m_frameTimeHistory.reserve(m_frameTimeHistorySize); + for (int i = 0; i < m_frameTimeHistorySize; ++i) + { + m_frameTimeHistory[i] = 0.0f; + } + + m_spInstance = this; +} + + +//--------------------------------------------- + + +MetricsData::~MetricsData() +{ +} + +//--------------------------------------------- + +const GameNetworkMessage & MetricsData::getDataToSend() +{ + updateData(); + m_message.setData(m_data); + return m_message; +} + +//--------------------------------------------- + +void MetricsData::updateData() +{ + m_data[m_memoryUtilization].m_value = static_cast(MemoryManager::getCurrentNumberOfBytesAllocated(static_cast(Os::getProcessId())) / 1024); + m_data[m_memoryUtilizationNoLeakTest].m_value = static_cast(MemoryManager::getCurrentNumberOfBytesAllocatedNoLeakTest() / 1024); + m_data[m_memoryAllocated].m_value = MemoryManager::getSystemMemoryAllocatedMegabytes() * 1024; +#ifndef _WIN32 + m_data[m_memoryVmSize].m_value = MemoryManager::getProcessVmSizeKBytes(static_cast(Os::getProcessId())); +#endif + + //deal with frame time + float frameTime = Clock::frameTime() * 1000; + float oldFrameTime = m_frameTimeHistory[m_frameTimeHistoryIndex]; + + m_frameTimeHistoryTotalTime += (frameTime - oldFrameTime); + m_frameTimeHistory[m_frameTimeHistoryIndex] = frameTime; + ++m_frameTimeHistoryIndex; + if (m_frameTimeHistoryIndex >= m_frameTimeHistorySize) + m_frameTimeHistoryIndex = 0; + + m_data[m_loopTimeMs].m_value = std::max(0, static_cast(m_frameTimeHistoryTotalTime / m_frameTimeHistorySize)); +} + +//--------------------------------------------- +int MetricsData::addMetric( const char* sLabel, int iValue, const char* sDescription, bool bPersist, bool bSummary) +{ + MetricsPair p; + p.m_label = sLabel; + p.m_value = iValue; + p.m_description = sDescription ? sDescription : ""; + p.m_persistData = bPersist; + p.m_summary = bSummary; + m_data.push_back(p); + return( m_data.size()-1 ); +} + +//--------------------------------------------- +void MetricsData::updateMetric( int iKey, int iValue ) +{ + if ( iKey >= int(m_data.size()) ) + return; + if ( iKey < 0 ) + return; + m_data[ iKey ].m_value = iValue; +} + + + + + + + + diff --git a/engine/server/library/serverMetrics/src/shared/MetricsData.h b/engine/server/library/serverMetrics/src/shared/MetricsData.h new file mode 100644 index 00000000..869593fb --- /dev/null +++ b/engine/server/library/serverMetrics/src/shared/MetricsData.h @@ -0,0 +1,57 @@ + +// MetricsData.h +// Copyright 2002 Sony Online Entertainment + + +#ifndef _MetricsData_H +#define _MetricsData_H + +class GameNetworkMessage; + +#include "serverNetworkMessages/MetricsDataMessage.h" + +class MetricsData +{ + friend class MetricsManager; +public: + MetricsData(); + virtual ~MetricsData() = 0; + + const GameNetworkMessage & getDataToSend(); + virtual void updateData(); + + virtual int addMetric( const char* sLabel, int iValue=0, const char* sDescription=0, bool bPersist=true, bool bSummary=false); + virtual void updateMetric( int iKey, int iValue ); + + static MetricsData* getInstance() { return m_spInstance; } + +protected: + std::vector m_data; + +private: + + MetricsDataMessage m_message; + unsigned long m_memoryUtilization; + unsigned long m_memoryUtilizationNoLeakTest; + unsigned long m_memoryAllocated; +#ifndef _WIN32 + unsigned long m_memoryVmSize; +#endif + unsigned long m_loopTimeMs; + +private: + + static MetricsData* m_spInstance; + + // Disabled. + MetricsData(const MetricsData&); + MetricsData &operator =(const MetricsData&); + + std::vector m_frameTimeHistory; + int m_frameTimeHistoryIndex; + int m_frameTimeHistorySize; + float m_frameTimeHistoryTotalTime; +}; + + +#endif diff --git a/engine/server/library/serverMetrics/src/shared/MetricsManager.cpp b/engine/server/library/serverMetrics/src/shared/MetricsManager.cpp new file mode 100644 index 00000000..2cf8aa1c --- /dev/null +++ b/engine/server/library/serverMetrics/src/shared/MetricsManager.cpp @@ -0,0 +1,135 @@ +// MetricsManager.h +// copyright 2002 Verant Interactive + +#include "serverMetrics/FirstServerMetrics.h" +#include "MetricsManager.h" + +#include "ConfigServerMetrics.h" +#include "serverMetrics/MetricsConnection.h" +#include "serverMetrics/MetricsData.h" +#include "serverNetworkMessages/MetricsInitiationMessage.h" + +//------------------------------------------------------- + +MetricsManager::ConnectionState MetricsManager::m_connectionState = MetricsManager::CS_Unconnected; +bool MetricsManager::m_isDynamic = false; +bool MetricsManager::m_isInstalled = false; +MetricsConnection* MetricsManager::m_metricsServerConnection = 0; +MetricsData* MetricsManager::m_metricsData = 0; +std::string MetricsManager::m_primaryName; +std::string MetricsManager::m_secondaryName; +float MetricsManager::m_timer = 0.0f; +int MetricsManager::m_index = 0; + +//------------------------------------------------------- +MetricsManager::MetricsManager() +{ +} + +//------------------------------------------------------- + +MetricsManager::~MetricsManager() +{ +} + +//------------------------------------------------------- + +void MetricsManager::connect(MetricsConnection& c) +{ + DEBUG_FATAL(!m_isInstalled, ("MetricsManager not installed\n")); + DEBUG_REPORT_LOG(true, ("Metrics server connected\n")); + m_metricsServerConnection = &c; + m_connectionState = CS_Connected; + + MetricsInitiationMessage m(m_isDynamic, m_primaryName, m_secondaryName, m_index); + c.send(m, true); +} + +//------------------------------------------------------- +void MetricsManager::install(MetricsData* d, bool isDynamic, const std::string & primaryName, const std::string & secondaryName, const int index) +{ + DEBUG_FATAL(m_isInstalled, ("MetricsManager already installed\n")); + NOT_NULL(d); + ConfigServerMetrics::install(); + m_isInstalled = true; + m_metricsData = d; + m_index = index; + + if (ConfigServerMetrics::getMetricsServerPort()!=0) + { + DEBUG_REPORT_LOG(true, ("Attempting to connect to metrics server\n")); + m_metricsServerConnection = new MetricsConnection(ConfigServerMetrics::getMetricsServerAddress(), ConfigServerMetrics::getMetricsServerPort()); + m_connectionState = CS_Connecting; + } + else + { + DEBUG_REPORT_LOG(true,("Metrics server disabled in config file (port is set to 0)\n")); + m_connectionState = CS_Disabled; + } + + m_isDynamic = isDynamic; + + if (primaryName == "") + m_primaryName = ConfigServerMetrics::getPrimaryName(); + else + m_primaryName = primaryName; + + if (secondaryName == "") + m_secondaryName = ConfigServerMetrics::getSecondaryName(); + else + m_secondaryName = secondaryName; +} + +//------------------------------------------------------- + +void MetricsManager::remove() +{ + DEBUG_FATAL(!m_isInstalled, ("MetricsManager not installed\n")); + m_metricsServerConnection = 0; + ConfigServerMetrics::remove(); +} + +//------------------------------------------------------- + +void MetricsManager::update(float time) +{ + DEBUG_FATAL(!m_isInstalled, ("MetricsManager not installed\n")); + //each update time send out metrics data to the metrics server. + //if we are unconnected, try to connect to metrics server + //if we are connecting do nothing + //if we are connected, send data + + switch(m_connectionState) + { + case CS_Unconnected: + DEBUG_REPORT_LOG(true, ("Attempting to connect to metrics server\n")); + m_metricsServerConnection = new MetricsConnection(ConfigServerMetrics::getMetricsServerAddress(), ConfigServerMetrics::getMetricsServerPort()); + m_connectionState = CS_Connecting; + break; + + case CS_Connecting: + break; + + case CS_Connected: + + m_timer -= time; + if (m_timer <= 0) + { + // DEBUG_REPORT_LOG(true, ("Sending data to Metrics server")); + NOT_NULL(m_metricsData); + const GameNetworkMessage& m = m_metricsData->getDataToSend(); + if (m_metricsServerConnection) + m_metricsServerConnection->send(m, true); + m_timer = static_cast(ConfigServerMetrics::getSecondsBetweenUpdates()) * 1000; + } + break; + + case CS_Disabled: + break; + + default: + break; + } +} + +//------------------------------------------------------- diff --git a/engine/server/library/serverMetrics/src/shared/MetricsManager.h b/engine/server/library/serverMetrics/src/shared/MetricsManager.h new file mode 100644 index 00000000..1728e885 --- /dev/null +++ b/engine/server/library/serverMetrics/src/shared/MetricsManager.h @@ -0,0 +1,64 @@ +// MetricsManager.h +// Copyright 2002 Sony Online Entertainment + + +#ifndef _MetricsManager_H +#define _MetricsManager_H + +#include "Singleton/Singleton.h" + +class GameNetworkMessage; +class MetricsConnection; +class MetricsData; + +class MetricsManager +{ + friend class MetricsConnection; +public: + static void install(MetricsData*, bool, const std::string & primaryName, const std::string & secondaryName, const int index); + static void remove(); + static void update(float time); + +private: + + MetricsManager(); + ~MetricsManager(); + +private: + + enum ConnectionState + { + CS_Unconnected, + CS_Connecting, + CS_Connected, + CS_Disabled + }; + static void connect(MetricsConnection &); + static void disconnect(); + + static ConnectionState m_connectionState; + static bool m_isDynamic; + static bool m_isInstalled; + static MetricsConnection* m_metricsServerConnection; + static MetricsData* m_metricsData; + static std::string m_primaryName; + static std::string m_secondaryName; + static int m_index; + static float m_timer; + +}; + +//--------------------------------------------------------------- + + +//--------------------------------------------------------------- + +inline void MetricsManager::disconnect() +{ + DEBUG_REPORT_LOG(true, ("Metrics server disconnected\n")); + m_connectionState = CS_Unconnected; + m_metricsServerConnection = 0; +} +//--------------------------------------------------------------- + +#endif diff --git a/engine/server/library/serverMetrics/src/win32/FirstServerMetrics.cpp b/engine/server/library/serverMetrics/src/win32/FirstServerMetrics.cpp new file mode 100644 index 00000000..5133f174 --- /dev/null +++ b/engine/server/library/serverMetrics/src/win32/FirstServerMetrics.cpp @@ -0,0 +1,9 @@ +// FirstServerMetrics.cpp +// Copyright 2000-02, Sony Online Entertainment Inc., all rights reserved. +// Author: Justin Randall + +//----------------------------------------------------------------------- + +#include "serverMetrics/FirstServerMetrics.h" + +//-----------------------------------------------------------------------