diff options
author | Omar Tarabai <tarabai@devegypt.com> | 2014-05-04 17:18:27 +0000 |
---|---|---|
committer | Omar Tarabai <tarabai@devegypt.com> | 2014-05-04 17:18:27 +0000 |
commit | 4d8271297e5e63500bd3b2b8e185fa8880b7224d (patch) | |
tree | b0fd80b5b5fa06cfa789d6cdabc511c8f6d54514 /src | |
parent | 0e8b6f07503810a220e500fa20e05a3ce33bce7d (diff) | |
download | gnunet-4d8271297e5e63500bd3b2b8e185fa8880b7224d.tar.gz gnunet-4d8271297e5e63500bd3b2b8e185fa8880b7224d.zip |
running gnunet-statistics sensors
Diffstat (limited to 'src')
-rw-r--r-- | src/sensor/Makefile.am | 1 | ||||
-rw-r--r-- | src/sensor/gnunet-service-sensor.c | 132 | ||||
-rw-r--r-- | src/sensor/sensors/connectedpeers | 2 | ||||
-rw-r--r-- | src/sensor/sensors/gnunetversion | 6 |
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 |
36 | gnunet_service_sensor_LDADD = \ | 36 | gnunet_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 | ||
40 | libgnunetsensor_la_SOURCES = \ | 41 | libgnunetsensor_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 | */ |
34 | struct SensorInfo | 39 | struct 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; | |||
162 | struct GNUNET_CONTAINER_MultiHashMap *sensors; | 172 | struct GNUNET_CONTAINER_MultiHashMap *sensors; |
163 | 173 | ||
164 | /** | 174 | /** |
175 | * Supported sources of sensor information | ||
176 | */ | ||
177 | static const char *sources[] = { "gnunet-statistics", "process", NULL }; | ||
178 | |||
179 | /** | ||
180 | * Supported datatypes of sensor information | ||
181 | */ | ||
182 | static const char *datatypes[] = { "uint64", "double", "string", NULL }; | ||
183 | |||
184 | /** | ||
185 | * Handle to statistics service | ||
186 | */ | ||
187 | struct 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 | */ | ||
742 | int 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 | ||
25 | EXPECTED_DATATYPE = int64 | 25 | EXPECTED_DATATYPE = uint64 |
26 | 26 | ||
27 | # Reporting mechanism | 27 | # Reporting mechanism |
28 | COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80 | 28 | COLLECTION_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 |
12 | INTERVAL = 86400 | 12 | INTERVAL = 86400 |
13 | #LIFETIME = | 13 | LIFETIME = 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 | ||
22 | EXT_PROCESS = gnunet-arm -v | 22 | EXT_PROCESS = gnunet-arm |
23 | #EXT_ARGS = | 23 | EXT_ARGS = -v |
24 | 24 | ||
25 | EXPECTED_DATATYPE = string | 25 | EXPECTED_DATATYPE = string |
26 | 26 | ||