ZeroC Ice: recogiendo estadísticas.
Esta receta describe cómo recoger estadísticas de uso de red mediante la interfaz Ice::Stats en una aplicación que utilice ZeroC ICE.
Herramientas
- ZeroC ICE (en este enlace se describe su instalación en Debian).
- La interfaz Ice::Stats.
Uso de la interfaz Ice::Stats
La interfaz Ice::Stats permite informar sobre el número de bytes enviados y recibidos por cada invocación:
local interface Stats {
void bytesSent(string protocol, int num);
void bytesReceived(string protocol, int num);
};
El proceso a seguir consiste en implementar la interfaz Ice::Stats y registrar ese sirviente a la hora de inicializar el communicator. Una implementación sencilla consistiría en imprimir la información de uso de red:
// MyStats.h
#include <Ice/Stats.h>
using namespace std;
class MyStats : public virtual Ice::Stats {
public:
virtual void bytesSent(const string& prot, Ice::Int);
virtual void bytesReceived(const string& prot, Ice::Int);
};
// MyStats.cpp
#include <MyStats.h>
using namespace std;
void MyStats::bytesSent(const string& prot, Ice::Int num) {
cerr << prot << ": sent " << num << "bytes" << endl;
}
void MyStats::bytesReceived(const string& prot, Ice::Int num) {
cerr << prot << ": received " << num << "bytes" << endl;
}
A continuación, tendremos que instalar un objeto de la clase MyStats en el communicator del cliente, del servidor o de ambos. Este paso se lleva a cabo a la hora de crear el communicator y mediante una estructura del tipo Ice::InitializationData. Como lo normal es que utilicemos la clase Ice::Application, el código del cliente, por ejemplo, quedaría más o menos así:
#include <Ice/Ice.h>
#include <Demo.h>
#include <MyStats.h>
using namespace std;
using namespace Demo;
class Client : public Ice::Application {
public:
virtual int run (int argc, char* argv[]) {
Ice::ObjectPrx prx = communicator()->stringToProxy("dummy:default -p 9999");
Demo::DummyPrx dummy = Demo::DummyPrx::uncheckedCast(prx);
dummy->hello();
return 0;
}
};
int
main (int argc, char* argv[]) {
Client app;
Ice::InitializationData id;
id.stats = new MyStats;
return app.main(argc, argv, id);
return app.main(argc, argv);
}
En este caso, en la parte del cliente obtendríamos una salida similar a ésta al invocar la operación hello del proxy dummy:
tcp: received 14bytes
tcp: sent 40bytes
tcp: received 14bytes
tcp: received 11bytes
tcp: sent 14bytes
Referencias
- Manual de ZeroC ICE.
- Guía de referencia de Slice.