Removed debug print
[public/netxms.git] / src / agent / subagents / winperf / winperf.cpp
index 312d778..55b086a 100644 (file)
@@ -27,8 +27,6 @@
 // Constants
 //
 
-#define CFG_BUFFER_SIZE    256000
-
 #define WPF_ENABLE_DEFAULT_COUNTERS    0x0001
 
 
@@ -56,15 +54,23 @@ static struct
    int iClass;
    int iNumSamples;
    int iDataType;
+   TCHAR *pszDescription;
+   int iDCIDataType;
 } m_counterList[] =
 {
-   { _T("System.CPU.LoadAvg"), _T("\\System\\Processor Queue Length"), 0, 60, COUNTER_TYPE_FLOAT },
-   { _T("System.CPU.LoadAvg5"), _T("\\System\\Processor Queue Length"), 0, 300, COUNTER_TYPE_FLOAT },
-   { _T("System.CPU.LoadAvg15"), _T("\\System\\Processor Queue Length"), 0, 900, COUNTER_TYPE_FLOAT },
-   { _T("System.CPU.Usage"), _T("\\Processor(_Total)\\% Processor Time"), 0, 60, COUNTER_TYPE_INT32 },
-   { _T("System.CPU.Usage5"), _T("\\Processor(_Total)\\% Processor Time"), 0, 300, COUNTER_TYPE_INT32 },
-   { _T("System.CPU.Usage15"), _T("\\Processor(_Total)\\% Processor Time"), 0, 900, COUNTER_TYPE_INT32 },
-   { NULL, NULL, 0, 0, 0 }
+   { _T("System.CPU.LoadAvg"), _T("\\System\\Processor Queue Length"), 0,
+     60, COUNTER_TYPE_FLOAT, _T("Average CPU load for last minute"), DCI_DT_FLOAT },
+   { _T("System.CPU.LoadAvg5"), _T("\\System\\Processor Queue Length"), 0,
+     300, COUNTER_TYPE_FLOAT, _T("Average CPU load for last 5 minutes"), DCI_DT_FLOAT },
+   { _T("System.CPU.LoadAvg15"), _T("\\System\\Processor Queue Length"), 0,
+     900, COUNTER_TYPE_FLOAT, _T("Average CPU load for last 15 minutes"), DCI_DT_FLOAT },
+   { _T("System.CPU.Usage"), _T("\\Processor(_Total)\\% Processor Time"), 0,
+     60, COUNTER_TYPE_INT32, _T("Average CPU utilization for last minute"), DCI_DT_INT },
+   { _T("System.CPU.Usage5"), _T("\\Processor(_Total)\\% Processor Time"), 0,
+     300, COUNTER_TYPE_INT32, _T("Average CPU utilization for last 5 minutes"), DCI_DT_INT },
+   { _T("System.CPU.Usage15"), _T("\\Processor(_Total)\\% Processor Time"), 0,
+     900, COUNTER_TYPE_INT32, _T("Average CPU utilization for last 15 minutes"), DCI_DT_INT },
+   { NULL, NULL, 0, 0, 0, NULL, 0 }
 };
 
 
@@ -87,7 +93,7 @@ static LONG H_PdhVersion(TCHAR *pszParam, TCHAR *pArg, TCHAR *pValue)
 // Value of given counter collected by one of the collector threads
 //
 
-static LONG H_CollectedCounterData(TCHAR *pszParam, TCHAR *pArg, TCHAR *pValue)
+LONG H_CollectedCounterData(TCHAR *pszParam, TCHAR *pArg, TCHAR *pValue)
 {
    switch(((WINPERF_COUNTER *)pArg)->wType)
    {
@@ -266,6 +272,17 @@ static LONG H_PdhObjectItems(TCHAR *pszParam, TCHAR *pArg, NETXMS_VALUES_LIST *p
 }
 
 
+//
+// Value of specific performance parameter, which is mapped one-to-one to
+// performance counter. Actually, it's an alias for PDH.CounterValue(xxx) parameter.
+//
+
+static LONG H_CounterAlias(TCHAR *pszParam, TCHAR *pArg, TCHAR *pValue)
+{
+   return H_PdhCounterValue(pArg, NULL, pValue);
+}
+
+
 //
 // Handler for subagent unload
 //
@@ -284,8 +301,10 @@ static void OnUnload(void)
 
 static NETXMS_SUBAGENT_PARAM m_parameters[] =
 {
-   { _T("PDH.CounterValue(*)"), H_PdhCounterValue, NULL },
-   { _T("PDH.Version"), H_PdhVersion, NULL }
+   { _T("PDH.CounterValue(*)"), H_PdhCounterValue, NULL, DCI_DT_INT, _T("") },
+   { _T("PDH.Version"), H_PdhVersion, NULL, DCI_DT_UINT, _T("Version of PDH.DLL") },
+   { _T("System.ThreadCount"), H_CounterAlias, _T("(\\System\\Threads)"), DCI_DT_INT, _T("Total number of threads") },
+   { _T("System.Uptime"), H_CounterAlias, _T("(\\System\\System Up Time)"), DCI_DT_UINT, _T("System uptime") }
 };
 static NETXMS_SUBAGENT_ENUM m_enums[] =
 {
@@ -296,8 +315,9 @@ static NETXMS_SUBAGENT_ENUM m_enums[] =
 
 static NETXMS_SUBAGENT_INFO m_info =
 {
-       "WinPerf", 0x01000000, OnUnload,
-       0, NULL,
+   NETXMS_SUBAGENT_INFO_MAGIC,
+       _T("WinPerf"), _T(NETXMS_VERSION_STRING) _T(DEBUG_SUFFIX), OnUnload,
+       0, NULL, NULL,
        sizeof(m_enums) / sizeof(NETXMS_SUBAGENT_ENUM),
        m_enums
 };
@@ -307,7 +327,8 @@ static NETXMS_SUBAGENT_INFO m_info =
 // Add new parameter to list
 //
 
-static BOOL AddParameter(TCHAR *pszName, LONG (* fpHandler)(TCHAR *, TCHAR *, TCHAR *), TCHAR *pArg)
+BOOL AddParameter(TCHAR *pszName, LONG (* fpHandler)(TCHAR *, TCHAR *, TCHAR *),
+                  TCHAR *pArg, int iDataType, TCHAR *pszDescription)
 {
    DWORD i;
 
@@ -327,6 +348,8 @@ static BOOL AddParameter(TCHAR *pszName, LONG (* fpHandler)(TCHAR *, TCHAR *, TC
    _tcsncpy(m_info.pParamList[i].szName, pszName, MAX_PARAM_NAME);
    m_info.pParamList[i].fpHandler = fpHandler;
    m_info.pParamList[i].pArg = pArg;
+   m_info.pParamList[i].iDataType = iDataType;
+   _tcsncpy(m_info.pParamList[i].szDescription, pszDescription, MAX_DB_STRING);
    
    return TRUE;
 }
@@ -346,7 +369,9 @@ static void AddPredefinedCounters(void)
       pCnt = AddCounter(m_counterList[i].pszCounterName, m_counterList[i].iClass,
                         m_counterList[i].iNumSamples, m_counterList[i].iDataType);
       if (pCnt != NULL)
-         AddParameter(m_counterList[i].pszParamName, H_CollectedCounterData, (TCHAR *)pCnt);
+         AddParameter(m_counterList[i].pszParamName, H_CollectedCounterData, 
+                      (TCHAR *)pCnt, m_counterList[i].iDCIDataType, 
+                      m_counterList[i].pszDescription);
    }
 }
 
@@ -355,9 +380,10 @@ static void AddPredefinedCounters(void)
 // Configuration file template
 //
 
+static TCHAR *m_pszCounterList = NULL;
 static NX_CFG_TEMPLATE cfgTemplate[] =
 {
-   { _T("Counter"), CT_STRING_LIST, _T('\n'), 0, CFG_BUFFER_SIZE, 0, NULL },
+   { _T("Counter"), CT_STRING_LIST, _T('\n'), 0, 0, 0, &m_pszCounterList },
    { _T("EnableDefaultCounters"), CT_BOOLEAN, 0, 0, WPF_ENABLE_DEFAULT_COUNTERS, 0, &m_dwFlags },
    { _T(""), CT_END_OF_LIST, 0, 0, 0, 0, NULL }
 };
@@ -377,23 +403,26 @@ extern "C" BOOL __declspec(dllexport) __cdecl
    m_info.pParamList = (NETXMS_SUBAGENT_PARAM *)nx_memdup(m_parameters, sizeof(m_parameters));
 
    // Load configuration
-   cfgTemplate[0].pBuffer = malloc(CFG_BUFFER_SIZE);
    dwResult = NxLoadConfig(pszConfigFile, _T("WinPerf"), cfgTemplate, FALSE);
    if (dwResult == NXCFG_ERR_OK)
    {
       TCHAR *pItem, *pEnd;
 
       // Parse counter list
-      for(pItem = (TCHAR *)cfgTemplate[0].pBuffer; *pItem != 0; pItem = pEnd + 1)
+      if (m_pszCounterList != NULL)
       {
-         pEnd = _tcschr(pItem, _T('\n'));
-         if (pEnd != NULL)
-            *pEnd = 0;
-         StrStrip(pItem);
-         if (!AddCounterFromConfig(pItem))
-            NxWriteAgentLog(EVENTLOG_WARNING_TYPE, 
-                            _T("Unable to add counter from configuration file. "
-                               "Original configuration record: %s",), pItem);
+         for(pItem = m_pszCounterList; *pItem != 0; pItem = pEnd + 1)
+         {
+            pEnd = _tcschr(pItem, _T('\n'));
+            if (pEnd != NULL)
+               *pEnd = 0;
+            StrStrip(pItem);
+            if (!AddCounterFromConfig(pItem))
+               NxWriteAgentLog(EVENTLOG_WARNING_TYPE, 
+                               _T("Unable to add counter from configuration file. "
+                                  "Original configuration record: %s",), pItem);
+         }
+         free(m_pszCounterList);
       }
 
       if (m_dwFlags & WPF_ENABLE_DEFAULT_COUNTERS)
@@ -404,7 +433,10 @@ extern "C" BOOL __declspec(dllexport) __cdecl
 
       StartCollectorThreads();
    }
-   free(cfgTemplate[0].pBuffer);
+   else
+   {
+      safe_free(m_pszCounterList);
+   }
    *ppInfo = &m_info;
    return dwResult == NXCFG_ERR_OK;
 }