Started work on Performance subagent for Windows
authorVictor Kirhenshtein <victor@netxms.org>
Sat, 2 Oct 2004 16:50:47 +0000 (16:50 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Sat, 2 Oct 2004 16:50:47 +0000 (16:50 +0000)
.gitattributes
src/agent/subagents/winperf/tools.cpp [new file with mode: 0644]
src/agent/subagents/winperf/winperf.cpp [new file with mode: 0644]
src/agent/subagents/winperf/winperf.dsp [new file with mode: 0644]
src/agent/subagents/winperf/winperf.dsw [new file with mode: 0644]
src/agent/subagents/winperf/winperf.h [new file with mode: 0644]

index bc9881a..08a1f7b 100644 (file)
@@ -108,6 +108,11 @@ src/agent/subagents/skeleton/Makefile.nw -text
 src/agent/subagents/skeleton/skeleton.cpp -text
 src/agent/subagents/skeleton/skeleton.dsp -text
 src/agent/subagents/skeleton/skeleton.dsw -text
+src/agent/subagents/winperf/tools.cpp -text
+src/agent/subagents/winperf/winperf.cpp -text
+src/agent/subagents/winperf/winperf.dsp -text
+src/agent/subagents/winperf/winperf.dsw -text
+src/agent/subagents/winperf/winperf.h -text
 src/console/cmdline/cmdline.cpp -text
 src/console/cmdline/main.cpp -text
 src/console/cmdline/nxcmd.dsp -text
diff --git a/src/agent/subagents/winperf/tools.cpp b/src/agent/subagents/winperf/tools.cpp
new file mode 100644 (file)
index 0000000..f7ca30a
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+** Windows Performance NetXMS subagent
+** Copyright (C) 2004 Victor Kirhenshtein
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** $module: tools.cpp
+**
+**/
+
+#include "winperf.h"
+
+
+//
+// Get error text for PDH functions
+//
+
+TCHAR *GetPdhErrorText(DWORD dwError, TCHAR *pszBuffer, int iBufferSize)
+{
+   TCHAR *pszMsg;
+
+   if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 
+                     FORMAT_MESSAGE_FROM_HMODULE | 
+                     FORMAT_MESSAGE_IGNORE_INSERTS,
+                     GetModuleHandle(_T("PDH.DLL")), dwError,
+                     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+                     (LPTSTR)&pszMsg, 0, NULL)>0)
+   {
+      pszMsg[_tcscspn(pszMsg, _T("\r\n"))] = 0;
+      _tcsncpy(pszBuffer, pszMsg, iBufferSize);
+      LocalFree(pszMsg);
+   }
+   else
+   {
+      GetSystemErrorText(dwError, pszBuffer, iBufferSize);
+   }
+   return pszBuffer;
+}
+
+
+//
+// Report PDH error to master agent's log
+//
+
+void ReportPdhError(TCHAR *pszFunction, TCHAR *pszPdhCall, PDH_STATUS dwError)
+{
+   TCHAR szBuffer[1024];
+
+   NxWriteAgentLog(EVENTLOG_WARNING_TYPE, _T("%s: PDH Error %08X in call to %s (%s)"), 
+                   pszFunction, rc, pszPdhCall, GetPdhErrorText(rc, szBuffer, 1024));
+}
diff --git a/src/agent/subagents/winperf/winperf.cpp b/src/agent/subagents/winperf/winperf.cpp
new file mode 100644 (file)
index 0000000..24d6ba5
--- /dev/null
@@ -0,0 +1,199 @@
+/*
+** Windows Performance NetXMS subagent
+** Copyright (C) 2004 Victor Kirhenshtein
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** $module: winperf.cpp
+**
+**/
+
+#include "winperf.h"
+
+
+//
+// CPU utilization
+//
+
+static LONG H_PdhhCounterValue(char *pszParam, char *pArg, char *pValue)
+{
+   HQUERY hQuery;
+   HhCounter hhCounter;
+   PDH_RAW_COUNTER rawData;
+   PDH_FMT_COUNTERVALUE hCounterValue;
+   PDH_STATUS rc;
+   PDH_hCounter_INFO ci;
+   TCHAR szhCounter[MAX_PATH], szBuffer[1024];
+   static TCHAR szFName[] = _T("H_PdhhCounterValue");
+
+   NxGetParameterArg(pszParam, 1, szhCounter, MAX_PATH);
+
+   if ((rc = PdhOpenQuery(NULL, 0, &hQuery)) != ERROR_SUCCESS)
+   {
+      ReportPdhError(szFName, _T("PdhOpenQuery"), rc);
+      return SYSINFO_RC_ERROR;
+   }
+
+   if ((rc = PdhAddhCounter(hQuery, szhCounter, 0, &hCounter)) != ERROR_SUCCESS)
+   {
+      ReportPdhError(szFName, _T("PdhAddhCounter"), rc);
+      PdhCloseQuery(hQuery);
+      return SYSINFO_RC_UNSUPPORTED;
+   }
+
+   if ((rc = PdhGethCounterInfo(hCounter, FALSE, &dwSize, &ci)) != ERROR_SUCCESS)
+   {
+      ReportPdhError(szFName, _T("PdhGetCounterInfo"), rc);
+      PdhCloseQuery(hQuery);
+      return SYSINFO_RC_ERROR;
+   }
+
+   if ((rc = PdhCollectQueryData(hQuery)) != ERROR_SUCCESS)
+   {
+      ReportPdhError(szFName, _T("PdhCollectQueryData"), rc);
+      PdhCloseQuery(hQuery);
+      return SYSINFO_RC_ERROR;
+   }
+
+   PdhGetRawCounterValue(hCounter, NULL, &rawData);
+   PdhCalculateCounterFromRawValue(hCounter, PDH_FMT_DOUBLE,
+                                   &rawData, NULL, &hCounterValue);
+   PdhCloseQuery(hQuery);
+   return SYSINFO_RC_SUCCESS;
+}
+
+
+//
+// List of available performance objects
+//
+
+static LONG H_PdhObjects(char *pszParam, char *pArg, NETXMS_VALUES_LIST *pValue)
+{
+   TCHAR *pszObject, *pszObjList, szHostName[256];
+   LONG iResult = SYSINFO_RC_ERROR;
+   DWORD dwSize;
+
+   dwSize = 256;
+   if (GetComputerName(szHostName, &dwSize))
+   {
+      dwSize = 256000;
+      pszObjList = (TCHAR *)malloc(sizeof(TCHAR) * dwSize);
+      if (PdhEnumObjects(NULL, szHostName, pszObjList, &dwSize, PERF_DETAIL_WIZARD, TRUE) == ERROR_SUCCESS)
+      {
+         for(pszObject = pszObjList; *pszObject != 0; pszObject += _tcslen(pszObject) + 1)
+            NxAddResultString(pValue, pszObject);
+         iResult = SYSINFO_RC_SUCCESS;
+      }
+      else
+      {
+         ReportPdhError(_T("H_PdhObjects"), _T("PdhEnumObjects"), rc);
+      }
+      free(pszObjList);
+   }
+   return iResult;
+}
+
+
+//
+// List of available performance items for given object
+//
+
+static LONG H_PdhObjectItems(char *pszParam, char *pArg, NETXMS_VALUES_LIST *pValue)
+{
+   TCHAR *pszElement, *pszhCounterList, *pszInstanceList, szHostName[256], szObject[256];
+   LONG iResult = SYSINFO_RC_ERROR;
+   DWORD dwSize1, dwSize2;
+   PDH_STATUS rc;
+
+   NxGetParameterArg(pszParam, 1, szObject, 256);
+   if (szObject[0] != 0)
+   {
+      dwSize1 = 256;
+      if (GetComputerName(szHostName, &dwSize1))
+      {
+         dwSize1 = dwSize2 = 256000;
+         pszhCounterList = (TCHAR *)malloc(sizeof(TCHAR) * dwSize1);
+         pszInstanceList = (TCHAR *)malloc(sizeof(TCHAR) * dwSize2);
+         rc = PdhEnumObjectItems(NULL, szHostName, szObject,
+                                 pszhCounterList, &dwSize1, pszInstanceList, &dwSize2, 
+                                 PERF_DETAIL_WIZARD, 0);
+         if ((rc == ERROR_SUCCESS) || (rc == PDH_MORE_DATA))
+         {
+            for(pszElement = (pArg[0] == _T('C')) ? pszhCounterList : pszInstanceList;
+                *pszElement != 0; pszElement += _tcslen(pszElement) + 1)
+               NxAddResultString(pValue, pszElement);
+            iResult = SYSINFO_RC_SUCCESS;
+         }
+         else
+         {
+            ReportPdhError(_T("H_PdhObjectItems"), _T("PdhEnumObjectItems"), rc);
+         }
+         free(pszhCounterList);
+         free(pszInstanceLIst)
+      }
+   }
+   else
+   {
+      iResult = SYSINFO_RC_UNSUPPORTED;
+   }
+   return iResult;
+}
+
+
+//
+// Subagent information
+//
+
+static NETXMS_SUBAGENT_PARAM m_parameters[] =
+{
+   { "PDH.hCounterValue(*)", H_PdhhCounterValue, NULL }
+};
+static NETXMS_SUBAGENT_ENUM m_enums[] =
+{
+   { "PDH.ObjecthCounters(*)", H_PdhObjectItems, _T("C") },
+   { "PDH.ObjectInstances(*)", H_PdhObjectItems, _T("I") },
+   { "PDH.Objects", H_PdhObjects, NULL }
+};
+
+static NETXMS_SUBAGENT_INFO m_info =
+{
+       "WinPerf", 0x01000000, NULL,
+       sizeof(m_parameters) / sizeof(NETXMS_SUBAGENT_PARAM),
+       m_parameters,
+       sizeof(m_enums) / sizeof(NETXMS_SUBAGENT_ENUM),
+       m_enums
+};
+
+
+//
+// Entry point for NetXMS agent
+//
+
+extern "C" BOOL __declspec(dllexport) __cdecl 
+   NxSubAgentInit(NETXMS_SUBAGENT_INFO **ppInfo, TCHAR *pszConfigFile)
+{
+   *ppInfo = &m_info;
+   return TRUE;
+}
+
+
+//
+// DLL entry point
+//
+
+BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
+{
+   return TRUE;
+}
diff --git a/src/agent/subagents/winperf/winperf.dsp b/src/agent/subagents/winperf/winperf.dsp
new file mode 100644 (file)
index 0000000..8e6bb4f
--- /dev/null
@@ -0,0 +1,124 @@
+# Microsoft Developer Studio Project File - Name="winperf" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=winperf - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "winperf.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "winperf.mak" CFG="winperf - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "winperf - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "winperf - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "winperf - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "winperf_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "winperf_EXPORTS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libnetxms.lib pdh.lib /nologo /dll /machine:I386 /out:"Release/winperf.nsm" /libpath:"..\..\..\libnetxms\Release"
+
+!ELSEIF  "$(CFG)" == "winperf - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "winperf_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "winperf_EXPORTS" /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libnetxms.lib pdh.lib /nologo /dll /debug /machine:I386 /out:"Debug/winperf.nsm" /pdbtype:sept /libpath:"..\..\..\libnetxms\Debug"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy files
+PostBuild_Cmds=copy Debug\winperf.nsm ..\..\..\..\bin
+# End Special Build Tool
+
+!ENDIF 
+
+# Begin Target
+
+# Name "winperf - Win32 Release"
+# Name "winperf - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\tools.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\winperf.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\..\..\include\nms_agent.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\winperf.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/src/agent/subagents/winperf/winperf.dsw b/src/agent/subagents/winperf/winperf.dsw
new file mode 100644 (file)
index 0000000..00eb4bb
--- /dev/null
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "winperf"=.\winperf.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/src/agent/subagents/winperf/winperf.h b/src/agent/subagents/winperf/winperf.h
new file mode 100644 (file)
index 0000000..45776fe
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+** Windows Performance NetXMS subagent
+** Copyright (C) 2004 Victor Kirhenshtein
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** $module: winperf.h
+**
+**/
+
+#ifndef _winperf_h_
+#define _winperf_h_
+
+#include <windows.h>
+#include <nms_common.h>
+#include <nms_agent.h>
+#include <pdh.h>
+#include <pdhmsg.h>
+
+
+//
+// Functions
+//
+
+TCHAR *GetPdhErrorText(DWORD dwError, TCHAR *pszBuffer, int iBufferSize);
+void ReportPdhError(TCHAR *pszFunction, TCHAR *pszPdhCall, PDH_STATUS dwError);
+
+#endif