ZeroC Ice: recogiendo estadísticas.

Icenetworking
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