aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOmar Tarabai <tarabai@devegypt.com>2014-05-04 17:18:27 +0000
committerOmar Tarabai <tarabai@devegypt.com>2014-05-04 17:18:27 +0000
commit4d8271297e5e63500bd3b2b8e185fa8880b7224d (patch)
treeb0fd80b5b5fa06cfa789d6cdabc511c8f6d54514 /src
parent0e8b6f07503810a220e500fa20e05a3ce33bce7d (diff)
downloadgnunet-4d8271297e5e63500bd3b2b8e185fa8880b7224d.tar.gz
gnunet-4d8271297e5e63500bd3b2b8e185fa8880b7224d.zip
running gnunet-statistics sensors
Diffstat (limited to 'src')
-rw-r--r--src/sensor/Makefile.am1
-rw-r--r--src/sensor/gnunet-service-sensor.c132
-rw-r--r--src/sensor/sensors/connectedpeers2
-rw-r--r--src/sensor/sensors/gnunetversion6
4 files changed, 133 insertions, 8 deletions
diff --git a/src/sensor/Makefile.am b/src/sensor/Makefile.am
index 1efad0ed6..fe461d1bc 100644
--- a/src/sensor/Makefile.am
+++ b/src/sensor/Makefile.am
@@ -35,6 +35,7 @@ gnunet_service_sensor_SOURCES = \
35 gnunet-service-sensor.c 35 gnunet-service-sensor.c
36gnunet_service_sensor_LDADD = \ 36gnunet_service_sensor_LDADD = \
37 $(top_builddir)/src/util/libgnunetutil.la \ 37 $(top_builddir)/src/util/libgnunetutil.la \
38 $(top_builddir)/src/statistics/libgnunetstatistics.la \
38 $(GN_LIBINTL) 39 $(GN_LIBINTL)
39 40
40libgnunetsensor_la_SOURCES = \ 41libgnunetsensor_la_SOURCES = \
diff --git a/src/sensor/gnunet-service-sensor.c b/src/sensor/gnunet-service-sensor.c
index 31dcf515d..8956df1c6 100644
--- a/src/sensor/gnunet-service-sensor.c
+++ b/src/sensor/gnunet-service-sensor.c
@@ -29,6 +29,11 @@
29#include "sensor.h" 29#include "sensor.h"
30 30
31/** 31/**
32 * Minimum sensor execution interval (in seconds)
33 */
34#define MIN_INTERVAL 30
35
36/**
32 * Structure containing sensor definition 37 * Structure containing sensor definition
33 */ 38 */
34struct SensorInfo 39struct SensorInfo
@@ -87,7 +92,7 @@ struct SensorInfo
87 /* 92 /*
88 * Lifetime of an information sample after which it is deleted from storage 93 * Lifetime of an information sample after which it is deleted from storage
89 */ 94 */
90 struct GNUNET_TIME_Relative *lifetime; 95 struct GNUNET_TIME_Relative lifetime;
91 96
92 /* 97 /*
93 * A set of required peer capabilities for the sensor to collect meaningful information (e.g. ipv6) 98 * A set of required peer capabilities for the sensor to collect meaningful information (e.g. ipv6)
@@ -109,6 +114,11 @@ struct SensorInfo
109 */ 114 */
110 char *gnunet_stat_name; 115 char *gnunet_stat_name;
111 116
117 /**
118 * Handle to statistics get request (OR GNUNET_SCHEDULER_NO_TASK)
119 */
120 struct GNUNET_STATISTICS_GetHandle *gnunet_stat_get_handle;
121
112 /* 122 /*
113 * Name of the external process to be executed 123 * Name of the external process to be executed
114 */ 124 */
@@ -162,6 +172,21 @@ static const struct GNUNET_CONFIGURATION_Handle *cfg;
162struct GNUNET_CONTAINER_MultiHashMap *sensors; 172struct GNUNET_CONTAINER_MultiHashMap *sensors;
163 173
164/** 174/**
175 * Supported sources of sensor information
176 */
177static const char *sources[] = { "gnunet-statistics", "process", NULL };
178
179/**
180 * Supported datatypes of sensor information
181 */
182static const char *datatypes[] = { "uint64", "double", "string", NULL };
183
184/**
185 * Handle to statistics service
186 */
187struct GNUNET_STATISTICS_Handle *statistics;
188
189/**
165 * Remove sensor execution from scheduler 190 * Remove sensor execution from scheduler
166 * 191 *
167 * @param cls unused 192 * @param cls unused
@@ -176,6 +201,11 @@ int unschedule_sensor(void *cls,
176{ 201{
177 struct SensorInfo *sensorinfo = value; 202 struct SensorInfo *sensorinfo = value;
178 203
204 if(NULL != sensorinfo->gnunet_stat_get_handle)
205 {
206 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Canceling a statistics get request for sensor `%s'\n", sensorinfo->name);
207 GNUNET_STATISTICS_get_cancel(sensorinfo->gnunet_stat_get_handle);
208 }
179 if(GNUNET_SCHEDULER_NO_TASK != sensorinfo->execution_task) 209 if(GNUNET_SCHEDULER_NO_TASK != sensorinfo->execution_task)
180 { 210 {
181 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Unscheduling sensor `%s'\n", sensorinfo->name); 211 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Unscheduling sensor `%s'\n", sensorinfo->name);
@@ -195,6 +225,8 @@ shutdown_task (void *cls,
195 const struct GNUNET_SCHEDULER_TaskContext *tc) 225 const struct GNUNET_SCHEDULER_TaskContext *tc)
196{ 226{
197 GNUNET_CONTAINER_multihashmap_iterate(sensors, &unschedule_sensor, NULL); 227 GNUNET_CONTAINER_multihashmap_iterate(sensors, &unschedule_sensor, NULL);
228 if(NULL != statistics)
229 GNUNET_STATISTICS_destroy(statistics, GNUNET_YES);
198 GNUNET_SCHEDULER_shutdown(); 230 GNUNET_SCHEDULER_shutdown();
199} 231}
200 232
@@ -260,7 +292,7 @@ load_sensor_from_cfg(struct GNUNET_CONFIGURATION_Handle *cfg, const char *sectio
260 char *version_str; 292 char *version_str;
261 char *starttime_str; 293 char *starttime_str;
262 char *endtime_str; 294 char *endtime_str;
263 unsigned long long interval_sec; 295 unsigned long long time_sec;
264 296
265 sensor = GNUNET_new(struct SensorInfo); 297 sensor = GNUNET_new(struct SensorInfo);
266 //name 298 //name
@@ -312,14 +344,72 @@ load_sensor_from_cfg(struct GNUNET_CONFIGURATION_Handle *cfg, const char *sectio
312 GNUNET_free(endtime_str); 344 GNUNET_free(endtime_str);
313 } 345 }
314 //interval 346 //interval
315 if(GNUNET_OK != GNUNET_CONFIGURATION_get_value_number(cfg, sectionname, "INTERVAL", &interval_sec)) 347 if(GNUNET_OK != GNUNET_CONFIGURATION_get_value_number(cfg, sectionname, "INTERVAL", &time_sec))
316 { 348 {
317 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Error reading sensor run interval\n")); 349 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Error reading sensor run interval\n"));
318 GNUNET_free(sensor); 350 GNUNET_free(sensor);
319 return NULL; 351 return NULL;
320 } 352 }
321 sensor->interval = GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, interval_sec); 353 if(time_sec < MIN_INTERVAL)
354 {
355 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Sensor run interval too low (%" PRIu64 " < %d)\n"),
356 time_sec, MIN_INTERVAL);
357 GNUNET_free(sensor);
358 return NULL;
359 }
360 sensor->interval = GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, time_sec);
322 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Interval loaded: %" PRIu64 "\n", sensor->interval.rel_value_us); 361 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Interval loaded: %" PRIu64 "\n", sensor->interval.rel_value_us);
362 //lifetime
363 if(GNUNET_OK == GNUNET_CONFIGURATION_get_value_number(cfg, sectionname, "LIFETIME", &time_sec))
364 {
365 sensor->lifetime = GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, time_sec);
366 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Lifetime loaded: %" PRIu64 "\n", sensor->lifetime.rel_value_us);
367 }
368 else
369 sensor->lifetime = GNUNET_TIME_UNIT_FOREVER_REL;
370 //capabilities TODO
371 //source
372 if(GNUNET_OK != GNUNET_CONFIGURATION_get_value_choice(cfg, sectionname, "SOURCE", sources, &sensor->source))
373 {
374 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Error reading sensor source\n"));
375 GNUNET_free(sensor);
376 return NULL;
377 }
378 if(sources[0] == sensor->source) //gnunet-statistics
379 {
380 if(GNUNET_OK != GNUNET_CONFIGURATION_get_value_string(cfg, sectionname, "GNUNET_STAT_SERVICE", &sensor->gnunet_stat_service) ||
381 GNUNET_OK != GNUNET_CONFIGURATION_get_value_string(cfg, sectionname, "GNUNET_STAT_NAME", &sensor->gnunet_stat_name))
382 {
383 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Error reading sensor gnunet-statistics source information\n"));
384 GNUNET_free(sensor);
385 return NULL;
386 }
387 sensor->gnunet_stat_get_handle = NULL;
388 }
389 else if(sources[1] == sensor->source) //process
390 {
391 if(GNUNET_OK != GNUNET_CONFIGURATION_get_value_string(cfg, sectionname, "EXT_PROCESS", &sensor->ext_process))
392 {
393 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Error reading sensor process name\n"));
394 GNUNET_free(sensor);
395 return NULL;
396 }
397 GNUNET_CONFIGURATION_get_value_string(cfg, sectionname, "EXT_ARGS", &sensor->ext_args);
398 }
399 //expected datatype
400 if(GNUNET_OK != GNUNET_CONFIGURATION_get_value_choice(cfg, sectionname, "EXPECTED_DATATYPE", datatypes, &sensor->expected_datatype))
401 {
402 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Error reading sensor expected datatype\n"));
403 GNUNET_free(sensor);
404 return NULL;
405 }
406 if(sources[0] == sensor->source && datatypes[0] != sensor->expected_datatype)
407 {
408 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Invalid expected datatype, gnunet-statistics returns uint64 values\n"));
409 GNUNET_free(sensor);
410 return NULL;
411 }
412 //TODO: reporting mechanism
323 //execution task 413 //execution task
324 sensor->execution_task = GNUNET_SCHEDULER_NO_TASK; 414 sensor->execution_task = GNUNET_SCHEDULER_NO_TASK;
325 415
@@ -640,6 +730,28 @@ should_run_sensor(struct SensorInfo *sensorinfo)
640} 730}
641 731
642/** 732/**
733 * Callback function to process statistic values
734 *
735 * @param cls 'struct SensorInfo *'
736 * @param subsystem name of subsystem that created the statistic
737 * @param name the name of the datum
738 * @param value the current value
739 * @param is_persistent #GNUNET_YES if the value is persistent, #GNUNET_NO if not
740 * @return #GNUNET_OK to continue, #GNUNET_SYSERR to abort iteration
741 */
742int sensor_statistics_iterator (void *cls,
743 const char *subsystem,
744 const char *name,
745 uint64_t value,
746 int is_persistent)
747{
748 struct SensorInfo *sensorinfo = cls;
749
750 GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Received a value for sensor `%s': %" PRIu64 "\n", sensorinfo->name, value);
751 return GNUNET_OK;
752}
753
754/**
643 * Actual execution of a sensor 755 * Actual execution of a sensor
644 * 756 *
645 * @param cls 'struct SensorInfo' 757 * @param cls 'struct SensorInfo'
@@ -656,6 +768,18 @@ run_sensor (void *cls,
656 return; 768 return;
657 sensorinfo->execution_task = GNUNET_SCHEDULER_add_delayed(sensorinfo->interval, &run_sensor, sensorinfo); 769 sensorinfo->execution_task = GNUNET_SCHEDULER_add_delayed(sensorinfo->interval, &run_sensor, sensorinfo);
658 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Starting the execution of sensor `%s'\n", sensorinfo->name); 770 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Starting the execution of sensor `%s'\n", sensorinfo->name);
771 if(sources[0] == sensorinfo->source) //gnunet-statistics
772 {
773 if(NULL == statistics)
774 statistics = GNUNET_STATISTICS_create("sensor", cfg);
775 GNUNET_STATISTICS_get(statistics,
776 sensorinfo->gnunet_stat_service,
777 sensorinfo->gnunet_stat_name,
778 GNUNET_TIME_UNIT_FOREVER_REL,
779 NULL,
780 &sensor_statistics_iterator,
781 sensorinfo);
782 }
659} 783}
660 784
661/** 785/**
diff --git a/src/sensor/sensors/connectedpeers b/src/sensor/sensors/connectedpeers
index 2e9bc53d7..c05619ca0 100644
--- a/src/sensor/sensors/connectedpeers
+++ b/src/sensor/sensors/connectedpeers
@@ -22,7 +22,7 @@ GNUNET_STAT_NAME = '# peers connected'
22#EXT_PROCESS = 22#EXT_PROCESS =
23#EXT_ARGS = 23#EXT_ARGS =
24 24
25EXPECTED_DATATYPE = int64 25EXPECTED_DATATYPE = uint64
26 26
27# Reporting mechanism 27# Reporting mechanism
28COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80 28COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80
diff --git a/src/sensor/sensors/gnunetversion b/src/sensor/sensors/gnunetversion
index 7aee046e3..deb0e5f2d 100644
--- a/src/sensor/sensors/gnunetversion
+++ b/src/sensor/sensors/gnunetversion
@@ -10,7 +10,7 @@ ENABLED = YES
10#END_TIME = 10#END_TIME =
11#Interval in seconds 11#Interval in seconds
12INTERVAL = 86400 12INTERVAL = 86400
13#LIFETIME = 13LIFETIME = 86400
14 14
15#CAPABILITIES = 15#CAPABILITIES =
16 16
@@ -19,8 +19,8 @@ SOURCE = process
19#GNUNET_STAT_SERVICE = 19#GNUNET_STAT_SERVICE =
20#GNUNET_STAT_NAME = 20#GNUNET_STAT_NAME =
21 21
22EXT_PROCESS = gnunet-arm -v 22EXT_PROCESS = gnunet-arm
23#EXT_ARGS = 23EXT_ARGS = -v
24 24
25EXPECTED_DATATYPE = string 25EXPECTED_DATATYPE = string
26 26