version 1.7, 2003/10/22 14:26:04
|
version 1.33.8.6, 2013/10/14 16:25:59
|
|
|
//%2003//////////////////////////////////////////////////////////////////////// |
//%LICENSE//////////////////////////////////////////////////////////////// |
// | // |
// Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Development |
// Licensed to The Open Group (TOG) under one or more contributor license |
// Company, L. P., IBM Corp., The Open Group, Tivoli Systems. |
// agreements. Refer to the OpenPegasusNOTICE.txt file distributed with |
// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L. P.; |
// this work for additional information regarding copyright ownership. |
// IBM Corp.; EMC Corporation, The Open Group. |
// Each contributor licenses this file to you under the OpenPegasus Open |
// |
// Source License; you may not use this file except in compliance with the |
// Permission is hereby granted, free of charge, to any person obtaining a copy |
// License. |
// of this software and associated documentation files (the "Software"), to |
// |
// deal in the Software without restriction, including without limitation the |
// Permission is hereby granted, free of charge, to any person obtaining a |
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or |
// copy of this software and associated documentation files (the "Software"), |
// sell copies of the Software, and to permit persons to whom the Software is |
// to deal in the Software without restriction, including without limitation |
// furnished to do so, subject to the following conditions: |
// the rights to use, copy, modify, merge, publish, distribute, sublicense, |
// |
// and/or sell copies of the Software, and to permit persons to whom the |
// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN |
// Software is furnished to do so, subject to the following conditions: |
// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED |
// |
// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT |
// The above copyright notice and this permission notice shall be included |
// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR |
// in all copies or substantial portions of the Software. |
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
// |
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
|
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
|
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
|
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
|
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
// | // |
//============================================================================== |
////////////////////////////////////////////////////////////////////////// |
// |
|
// Author: Arthur Pichlkostner |
|
// (checked in: Markus Mueller sedgewick_de@yahoo.de) |
|
// |
|
// Modified By: |
|
// | // |
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
#ifndef STATISTICAL_DATA_H |
#ifndef Pegasus_StatisticalData_h |
#define STATISTICAL_DATA_H |
#define Pegasus_StatisticalData_h |
| |
#include <Pegasus/Common/Config.h> | #include <Pegasus/Common/Config.h> |
#include <iostream> | #include <iostream> |
#include <cstring> | #include <cstring> |
|
#include <Pegasus/Common/Linkage.h> |
#include <Pegasus/Common/InternalException.h> | #include <Pegasus/Common/InternalException.h> |
#include <Pegasus/Common/IPC.h> |
|
#include <Pegasus/Common/String.h> | #include <Pegasus/Common/String.h> |
#include <Pegasus/Common/CIMProperty.h> | #include <Pegasus/Common/CIMProperty.h> |
#include <Pegasus/Common/CIMInstance.h> | #include <Pegasus/Common/CIMInstance.h> |
#include <Pegasus/Common/Linkage.h> |
#include <Pegasus/Common/CIMDateTime.h> |
|
#include <Pegasus/Common/CIMMessage.h> |
|
#include <Pegasus/Common/Mutex.h> |
|
#include <Pegasus/Common/Time.h> |
|
#include <Pegasus/Common/TimeValue.h> |
| |
PEGASUS_NAMESPACE_BEGIN | PEGASUS_NAMESPACE_BEGIN |
| |
#ifdef PEGASUS_HAS_PERFINST |
#ifndef PEGASUS_DISABLE_PERFINST |
| |
#define STAT_GETSTARTTIME \ | #define STAT_GETSTARTTIME \ |
timeval startTime; \ |
Uint64 serverStartTimeMicroseconds = \ |
pegasus_gettimeofday(&startTime); |
TimeValue::getCurrentTime().toMicroseconds(); |
|
|
#define STAT_PMS_PROVIDEREND \ |
|
response->endProvider(); \ |
|
response->setStartServerTime(request->getStartServerTime()); \ |
|
response->setStartProviderTime(startTime); |
|
| |
#define STAT_SERVERSTART request->setStartServerTime(startTime); |
#define STAT_SERVERSTART \ |
|
request->setServerStartTime(serverStartTimeMicroseconds); |
| |
#define STAT_SERVEREND \ | #define STAT_SERVEREND \ |
response->endServer(); \ | response->endServer(); \ |
Array<Sint8> timeOut; \ |
|
timeOut.reserveCapacity(10); \ |
|
timeOut << response->getTotalTime(); \ |
|
message.insert(30, timeOut.getData(), timeOut.size()); \ |
|
Uint32 statType = (response->getType() > CIM_GET_CLASS_RESPONSE_MESSAGE)? \ |
|
response->getType() - CIM_GET_CLASS_RESPONSE_MESSAGE: \ |
|
response->getType()-1; \ |
|
StatisticalData::current()->addToValue(message.size(), \ |
|
statType, StatisticalData::BYTES_SENT); |
|
|
|
#define STAT_SERVEREND_ERROR response->endServer(); |
|
|
|
|
|
#define STAT_PROVIDERSTART request->startProvider(); |
|
|
|
| |
#define STAT_PROVIDEREND request->endProvider(); |
#define STAT_BYTESSENT \ |
|
StatisticalData::current()->addToValue( \ |
#define STAT_COPYDISPATCHER response->setStartServerTime(request->getStartServerTime()); |
message.size(), response->getType(), \ |
|
StatisticalData::PEGASUS_STATDATA_BYTES_SENT); |
|
|
// copy request timing info into response |
#define STAT_SERVEREND_ERROR \ |
#define STAT_COPYDISPATCHER_REP \ |
response->endServer(); |
response->setStartServerTime(request->getStartServerTime()); \ |
|
response->setStartProviderTime(request->getStartProviderTime()); \ |
/* |
response->setEndProviderTime(request->getEndProviderTime()); |
The request size value must be stored (requSize) and passed to the |
|
StatisticalData object at the end of processing otherwise it will be |
|
the ONLY vlaue that is passed to the client which reports the current |
|
state of the object, not the pevious (one command ago) state |
|
*/ |
| |
#define STAT_BYTESREAD \ | #define STAT_BYTESREAD \ |
Uint32 statType = (request->getType() > CIM_GET_CLASS_RESPONSE_MESSAGE)? \ |
StatisticalData::current()->requSize = contentLength; |
request->getType() - CIM_GET_CLASS_RESPONSE_MESSAGE: \ |
|
request->getType()-1; \ |
|
StatisticalData::current()->addToValue(contentLength, \ |
|
statType, StatisticalData::BYTES_READ); |
|
|
|
| |
#define STAT_SERVERTIME out << "Servertime: \r\n"; |
|
#else | #else |
#define STAT_GETSTARTTIME | #define STAT_GETSTARTTIME |
#define STAT_PMS_PROVIDEREND |
|
#define STAT_SERVERSTART | #define STAT_SERVERSTART |
#define STAT_SERVEREND | #define STAT_SERVEREND |
#define STAT_SERVEREND_ERROR | #define STAT_SERVEREND_ERROR |
#define STAT_PROVIDERSTART |
|
#define STAT_PROVIDEREND |
|
#define STAT_PROVIDEREND_REP |
|
#define STAT_COPYDISPATCHER |
|
#define STAT_COPYDISPATCHER_REP |
|
#define STAT_BYTESREAD | #define STAT_BYTESREAD |
#define STAT_SERVERTIME |
#define STAT_BYTESSENT |
#endif | #endif |
| |
|
class PEGASUS_COMMON_LINKAGE StatProviderTimeMeasurement |
|
{ |
|
public: |
|
StatProviderTimeMeasurement(CIMMessage* message) |
|
: _message(message) |
|
{ |
|
#ifndef PEGASUS_DISABLE_PERFINST |
|
_startTimeMicroseconds = TimeValue::getCurrentTime().toMicroseconds(); |
|
#endif |
|
} |
|
|
|
~StatProviderTimeMeasurement() |
|
{ |
|
#ifndef PEGASUS_DISABLE_PERFINST |
|
_message->setProviderTime( |
|
TimeValue::getCurrentTime().toMicroseconds() - |
|
_startTimeMicroseconds); |
|
#endif |
|
} |
|
|
|
private: |
|
StatProviderTimeMeasurement(); |
|
StatProviderTimeMeasurement(const StatProviderTimeMeasurement&); |
|
StatProviderTimeMeasurement& operator=(const StatProviderTimeMeasurement&); |
|
|
|
CIMMessage* _message; |
|
Uint64 _startTimeMicroseconds; |
|
}; |
|
|
class PEGASUS_COMMON_LINKAGE StatisticalData | class PEGASUS_COMMON_LINKAGE StatisticalData |
{ | { |
public: | public: |
enum StatRequestType{ |
// Statistical data type is Request Type - 3; |
GET_CLASS, |
enum StatRequestType |
|
{ |
|
// UNKNOWN, |
|
// OTHER, // Other type not defined |
|
// BATCHED, // NOT used by Pegasus |
|
GET_CLASS, // 0 |
GET_INSTANCE, | GET_INSTANCE, |
|
INDICATION_DELIVERY, |
DELETE_CLASS, | DELETE_CLASS, |
DELETE_INSTANCE, | DELETE_INSTANCE, |
CREATE_CLASS, | CREATE_CLASS, |
|
|
MODIFY_CLASS, | MODIFY_CLASS, |
MODIFY_INSTANCE, | MODIFY_INSTANCE, |
ENUMERATE_CLASSES, | ENUMERATE_CLASSES, |
ENUMERATE_CLASS_NAMES, |
ENUMERATE_CLASS_NAMES, // 10 |
ENUMERATE_INSTANCES, | ENUMERATE_INSTANCES, |
ENUMERATE_INSTANCE_NAMES, | ENUMERATE_INSTANCE_NAMES, |
EXEC_QUERY, | EXEC_QUERY, |
|
|
REFERENCE_NAMES, | REFERENCE_NAMES, |
GET_PROPERTY, | GET_PROPERTY, |
SET_PROPERTY, | SET_PROPERTY, |
GET_QUALIFIER, |
GET_QUALIFIER, // 20 |
SET_QUALIFIER, | SET_QUALIFIER, |
DELETE_QUALIFIER, | DELETE_QUALIFIER, |
ENUMERATE_QUALIFIERS, |
ENUMERATE_QUALIFIERS, // 23 |
|
// Types beyond the here are NOT part of the valueMap,Values defined |
|
// in CIM_CIMOMStatisticalData.mof and must be treated as Other in |
|
// the preperation of the instance output. |
|
INVOKE_METHOD, // 24 |
NUMBER_OF_TYPES | NUMBER_OF_TYPES |
}; | }; |
| |
enum StatDataType{ |
enum StatDataType |
SERVER, |
{ |
PROVIDER, |
PEGASUS_STATDATA_SERVER, |
BYTES_SENT, |
PEGASUS_STATDATA_PROVIDER, |
BYTES_READ |
PEGASUS_STATDATA_BYTES_SENT, |
|
PEGASUS_STATDATA_BYTES_READ |
}; | }; |
| |
static const Uint32 length; | static const Uint32 length; |
static StatisticalData* current(); |
|
| |
StatisticalData(); |
/** |
|
Static function to get address of singleton StatisticalData |
|
instance. Creates a new object if none exists. |
|
|
|
@return StatisticalData* Pointer to the object which |
|
contains the table of accumulated statistics. |
|
*/ |
|
static StatisticalData* current(); |
| |
timeval timestamp; | timeval timestamp; |
| |
Uint64 numCalls[NUMBER_OF_TYPES]; |
// Statistics entries where statistics information is aggregated from |
Uint64 cimomTime[NUMBER_OF_TYPES]; |
// each operation. |
Uint64 providerTime[NUMBER_OF_TYPES]; |
Sint64 numCalls[NUMBER_OF_TYPES]; |
Uint64 responseSize[NUMBER_OF_TYPES]; |
Sint64 cimomTime[NUMBER_OF_TYPES]; |
Uint64 requestSize[NUMBER_OF_TYPES]; |
Sint64 providerTime[NUMBER_OF_TYPES]; |
static StatisticalData* cur; |
Sint64 responseSize[NUMBER_OF_TYPES]; |
void addToValue(Uint64 value, Uint16 type, Uint32 t); |
Sint64 requestSize[NUMBER_OF_TYPES]; |
static String requestName[]; |
Sint64 requSize; //temporary storage for requestSize value |
|
Boolean copyGSD; |
|
|
|
static StatisticalData* table; |
|
|
|
/** Add the value parameter to the current value for the |
|
messagetype msgType and the StatDataType |
|
|
|
@param value Sint64 type to add |
|
@param msgType Pegasus message type (may be either request |
|
or response |
|
@param t StatDataType stat type to which value is added |
|
*/ |
|
void addToValue(Sint64 value, MessageType msgType, StatDataType t); |
|
|
|
/** Clear the StatisticalData table entries back to zero |
|
*/ |
|
void clear(); |
|
|
|
/** |
|
Get the name for the statistics type |
|
*/ |
|
String getRequestName(Uint16 i); |
|
|
|
/** Set the copyGSD flag that controls whether statistics are to |
|
be gathered and displayed into the singleton object |
|
@param flag |
|
*/ |
|
void setCopyGSD(Boolean flag); |
| |
protected: | protected: |
Mutex _mutex; | Mutex _mutex; |
|
|
|
private: |
|
StatisticalData(); |
|
StatisticalData(const StatisticalData&); // Prevent copy-construction |
|
StatisticalData& operator=(const StatisticalData&); |
|
static String requestName[]; |
}; | }; |
| |
| |