[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-donau] branch master updated: fixed httpd errors added metrics
From: |
gnunet |
Subject: |
[taler-donau] branch master updated: fixed httpd errors added metrics |
Date: |
Sun, 07 Jan 2024 16:01:47 +0100 |
This is an automated email from the git hooks/post-receive script.
johannes-casaburi pushed a commit to branch master
in repository donau.
The following commit(s) were added to refs/heads/master by this push:
new 9839b09 fixed httpd errors added metrics
9839b09 is described below
commit 9839b09b4ca27b7a217dbde078700420738d35fa
Author: Casaburi Johannes <johannes.casaburi@students.bfh.ch>
AuthorDate: Sun Jan 7 16:00:58 2024 +0100
fixed httpd errors added metrics
---
src/donau/Makefile.am | 5 +-
src/donau/donau-httpd_charity.h | 3 +-
src/donau/donau-httpd_db.c | 95 ++++++++++----------
src/donau/donau-httpd_get-charity.c | 10 +--
src/donau/donau-httpd_metrics.c | 165 +++++++++++++++++++++++++++++++++++
src/donau/donau-httpd_metrics.h | 136 +++++++++++++++++++++++++++++
src/donau/donau-httpd_post-charity.c | 9 +-
7 files changed, 366 insertions(+), 57 deletions(-)
diff --git a/src/donau/Makefile.am b/src/donau/Makefile.am
index 1225358..e89f2ff 100644
--- a/src/donau/Makefile.am
+++ b/src/donau/Makefile.am
@@ -37,9 +37,12 @@ donau_httpd_LDADD = \
donau_httpd_SOURCES = \
donau-httpd.c donau-httpd.h \
+ donau-httpd_metrics.c donau-httpd_metrics.h \
+ donau-httpd_db.c donau-httpd_db.h \
donau-httpd_keys.c donau-httpd_keys.h \
donau-httpd_config.c donau-httpd_config.h \
- donau-httpd_get-charities.c donau_httpd_charity.h
+ donau-httpd_get-charities.c donau_httpd_charity.h \
+ donau-httpd_get-charity.c donau-httpd_post-charity.c
# Testcases
diff --git a/src/donau/donau-httpd_charity.h b/src/donau/donau-httpd_charity.h
index 4210cfa..f16c764 100644
--- a/src/donau/donau-httpd_charity.h
+++ b/src/donau/donau-httpd_charity.h
@@ -22,7 +22,7 @@
#define DONAU_HTTPD_CHARITY_H
#include <microhttpd.h>
-// #include "donau-httpd.h"
+#include "donau-httpd.h"
/**
@@ -50,6 +50,7 @@ DH_handler_charity_get (
struct DH_RequestContext *rc,
const char *const args[]);
+
/**
* Handle a GET "/charities" request.
*
diff --git a/src/donau/donau-httpd_db.c b/src/donau/donau-httpd_db.c
index c0cad70..5073edd 100644
--- a/src/donau/donau-httpd_db.c
+++ b/src/donau/donau-httpd_db.c
@@ -26,7 +26,7 @@
#include "taler/taler_mhd_lib.h"
#include "donaudb_lib.h"
#include "donau-httpd_db.h"
-#include "donau-httpd_responses.h"
+// #include "donau-httpd_responses.h"
enum GNUNET_GenericReturnValue
@@ -39,17 +39,17 @@ DH_DB_run_transaction (struct MHD_Connection *connection,
{
if (NULL != mhd_ret)
*mhd_ret = -1; /* set to invalid value, to help detect bugs */
- // if (GNUNET_OK !=
- // DH_plugin->preflight (DH_plugin->cls))
- // {
- // GNUNET_break (0);
- // if (NULL != mhd_ret)
- // *mhd_ret = TALER_MHD_reply_with_error (connection,
- // MHD_HTTP_INTERNAL_SERVER_ERROR,
- //
TALER_EC_GENERIC_DB_SETUP_FAILED,
- // NULL);
- // return GNUNET_SYSERR;
- // }
+ if (GNUNET_OK !=
+ DH_plugin->preflight (DH_plugin->cls))
+ {
+ GNUNET_break (0);
+ if (NULL != mhd_ret)
+ *mhd_ret = TALER_MHD_reply_with_error (connection,
+ MHD_HTTP_INTERNAL_SERVER_ERROR,
+ TALER_EC_GENERIC_DB_SETUP_FAILED,
+ NULL);
+ return GNUNET_SYSERR;
+ }
GNUNET_assert (mt < DH_MT_REQUEST_COUNT);
DH_METRICS_num_requests[mt]++;
for (unsigned int retries = 0;
@@ -58,43 +58,46 @@ DH_DB_run_transaction (struct MHD_Connection *connection,
{
enum GNUNET_DB_QueryStatus qs;
- // if (GNUNET_OK !=
- // DH_plugin->start (DH_plugin->cls,
- // name))
- // {
- // GNUNET_break (0);
- // if (NULL != mhd_ret)
- // *mhd_ret = TALER_MHD_reply_with_error (connection,
- //
MHD_HTTP_INTERNAL_SERVER_ERROR,
- //
TALER_EC_GENERIC_DB_START_FAILED,
- // NULL);
- // return GNUNET_SYSERR;
- // }
+ if (GNUNET_OK !=
+ DH_plugin->start (DH_plugin->cls,
+ name))
+ {
+ GNUNET_break (0);
+ if (NULL != mhd_ret)
+ *mhd_ret = TALER_MHD_reply_with_error (connection,
+ MHD_HTTP_INTERNAL_SERVER_ERROR,
+
TALER_EC_GENERIC_DB_START_FAILED,
+ NULL);
+ return GNUNET_SYSERR;
+ }
qs = cb (cb_cls,
connection,
mhd_ret);
- // if (0 > qs)
- // {
- // DH_plugin->rollback (DH_plugin->cls);
- // if (GNUNET_DB_STATUS_HARD_ERROR == qs)
- // return GNUNET_SYSERR;
- // }
- // else
- // {
- // qs = DH_plugin->commit (DH_plugin->cls);
- // if (GNUNET_DB_STATUS_HARD_ERROR == qs)
- // {
- // DH_plugin->rollback (DH_plugin->cls);
- // if (NULL != mhd_ret)
- // *mhd_ret = TALER_MHD_reply_with_error (connection,
- //
MHD_HTTP_INTERNAL_SERVER_ERROR,
- //
TALER_EC_GENERIC_DB_COMMIT_FAILED,
- // NULL);
- // return GNUNET_SYSERR;
- // }
- // if (0 > qs)
- // DH_plugin->rollback (DH_plugin->cls);
- // }
+ if (0 > qs)
+ {
+ DH_plugin->rollback (DH_plugin->cls);
+ if (GNUNET_DB_STATUS_HARD_ERROR == qs)
+ return GNUNET_SYSERR;
+ }
+ else
+ {
+ qs = DH_plugin->commit (DH_plugin->cls);
+ if (GNUNET_DB_STATUS_HARD_ERROR == qs)
+ {
+ DH_plugin->rollback (DH_plugin->cls);
+ if (NULL != mhd_ret)
+ *mhd_ret = TALER_MHD_reply_with_error (connection,
+
MHD_HTTP_INTERNAL_SERVER_ERROR,
+
TALER_EC_GENERIC_DB_COMMIT_FAILED,
+ NULL);
+ return GNUNET_SYSERR;
+ }
+ if (0 > qs)
+ DH_plugin->rollback (DH_plugin->cls);
+ }
+ /* make sure callback did not violate invariants! */
+ GNUNET_assert ( (NULL == mhd_ret) ||
+ (-1 == (int) *mhd_ret) );
if (0 <= qs)
return GNUNET_OK;
DH_METRICS_num_conflict[mt]++;
diff --git a/src/donau/donau-httpd_get-charity.c
b/src/donau/donau-httpd_get-charity.c
index 24798e8..4f9852a 100644
--- a/src/donau/donau-httpd_get-charity.c
+++ b/src/donau/donau-httpd_get-charity.c
@@ -18,7 +18,7 @@
* @brief Return summary information about AML decision
* @author Johannes Casaburi
*/
-#include "platform.h"
+#include "taler/platform.h"
#include <gnunet/gnunet_util_lib.h>
#include <jansson.h>
#include <microhttpd.h>
@@ -26,9 +26,9 @@
#include "taler/taler_json_lib.h"
#include "taler/taler_mhd_lib.h"
#include "taler/taler_signatures.h"
-#include "donau-httpd.h"
#include "donaudb_plugin.h"
#include "donau-httpd_charity.h"
+// #include "donau-httpd.h"
// #include "donau-httpd_metrics.h"
@@ -70,7 +70,6 @@ DH_handler_charity_get (
bool none = false;
MHD_RESULT result;
- GNUNET_assert (NULL != charity_info);
qs = DH_plugin->get_charity (DH_plugin->cls,
charity_id,
&charity_url,
@@ -100,9 +99,8 @@ DH_handler_charity_get (
}
result = TALER_MHD_REPLY_JSON_PACK (
- connection,
- http_status,
- TALER_MHD_PACK_EC (ec),
+ rc->connection,
+ MHD_HTTP_OK,
GNUNET_JSON_pack_string ("url",
charity_url),
GNUNET_JSON_pack_string ("name",
diff --git a/src/donau/donau-httpd_metrics.c b/src/donau/donau-httpd_metrics.c
new file mode 100644
index 0000000..c37e094
--- /dev/null
+++ b/src/donau/donau-httpd_metrics.c
@@ -0,0 +1,165 @@
+/*
+ This file is part of TALER
+ Copyright (C) 2015-2021 Taler Systems SA
+
+ TALER is free software; you can redistribute it and/or modify it under the
+ terms of the GNU Affero General Public License as published by the Free
Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ TALER is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
details.
+
+ You should have received a copy of the GNU Affero General Public License
along with
+ TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+*/
+/**
+ * @file donau-httpd_metrics.c
+ * @brief Handle /metrics requests
+ * @author Christian Grothoff
+ */
+#include "taler/platform.h"
+#include <gnunet/gnunet_json_lib.h>
+#include "taler/taler_dbevents.h"
+// #include "donau-httpd_responses.h"
+#include "donau-httpd_keys.h"
+#include "donau-httpd_metrics.h"
+#include "taler/taler_json_lib.h"
+#include "taler/taler_mhd_lib.h"
+#include <jansson.h>
+
+
+unsigned long long DH_METRICS_num_requests[DH_MT_REQUEST_COUNT];
+
+unsigned long long DH_METRICS_batch_withdraw_num_coins;
+
+unsigned long long DH_METRICS_num_conflict[DH_MT_REQUEST_COUNT];
+
+unsigned long long DH_METRICS_num_signatures[DH_MT_SIGNATURE_COUNT];
+
+unsigned long long DH_METRICS_num_verifications[DH_MT_SIGNATURE_COUNT];
+
+unsigned long long DH_METRICS_num_keyexchanges[DH_MT_KEYX_COUNT];
+
+unsigned long long DH_METRICS_num_success[DH_MT_SUCCESS_COUNT];
+
+
+MHD_RESULT
+DH_handler_metrics (struct DH_RequestContext *rc,
+ const char *const args[])
+{
+ char *reply;
+ struct MHD_Response *resp;
+ MHD_RESULT ret;
+
+ (void) args;
+ GNUNET_asprintf (&reply,
+ "taler_exchange_success_transactions{type=\"%s\"} %llu\n"
+ "taler_exchange_success_transactions{type=\"%s\"} %llu\n"
+ "taler_exchange_success_transactions{type=\"%s\"} %llu\n"
+ "taler_exchange_success_transactions{type=\"%s\"} %llu\n"
+ "taler_exchange_success_transactions{type=\"%s\"} %llu\n"
+ "# HELP taler_exchange_serialization_failures "
+ " number of database serialization errors by type\n"
+ "# TYPE taler_exchange_serialization_failures counter\n"
+ "taler_exchange_serialization_failures{type=\"%s\"} %llu\n"
+ "taler_exchange_serialization_failures{type=\"%s\"} %llu\n"
+ "taler_exchange_serialization_failures{type=\"%s\"} %llu\n"
+ "taler_exchange_serialization_failures{type=\"%s\"} %llu\n"
+ "# HELP taler_exchange_received_requests "
+ " number of received requests by type\n"
+ "# TYPE taler_exchange_received_requests counter\n"
+ "taler_exchange_received_requests{type=\"%s\"} %llu\n"
+ "taler_exchange_received_requests{type=\"%s\"} %llu\n"
+ "taler_exchange_received_requests{type=\"%s\"} %llu\n"
+ "taler_exchange_received_requests{type=\"%s\"} %llu\n"
+ "taler_exchange_idempotent_requests{type=\"%s\"} %llu\n"
+#if NOT_YET_IMPLEMENTED
+ "taler_exchange_idempotent_requests{type=\"%s\"} %llu\n"
+ "taler_exchange_idempotent_requests{type=\"%s\"} %llu\n"
+#endif
+ "taler_exchange_idempotent_requests{type=\"%s\"} %llu\n"
+ "# HELP taler_exchange_num_signatures "
+ " number of signatures created by cipher\n"
+ "# TYPE taler_exchange_num_signatures counter\n"
+ "taler_exchange_num_signatures{type=\"%s\"} %llu\n"
+ "taler_exchange_num_signatures{type=\"%s\"} %llu\n"
+ "taler_exchange_num_signatures{type=\"%s\"} %llu\n"
+ "# HELP taler_exchange_num_signature_verifications "
+ " number of signatures verified by cipher\n"
+ "# TYPE taler_exchange_num_signature_verifications
counter\n"
+ "taler_exchange_num_signature_verifications{type=\"%s\"}
%llu\n"
+ "taler_exchange_num_signature_verifications{type=\"%s\"}
%llu\n"
+ "taler_exchange_num_signature_verifications{type=\"%s\"}
%llu\n"
+ "# HELP taler_exchange_num_keyexchanges "
+ " number of key exchanges done by cipher\n"
+ "# TYPE taler_exchange_num_keyexchanges counter\n"
+ "taler_exchange_num_keyexchanges{type=\"%s\"} %llu\n"
+ "# HELP taler_exchange_batch_withdraw_num_coins "
+ " number of coins withdrawn in a batch-withdraw request\n"
+ "# TYPE taler_exchange_batch_withdraw_num_coins counter\n"
+ "taler_exchange_batch_withdraw_num_coins{} %llu\n",
+ "deposit",
+ DH_METRICS_num_success[DH_MT_SUCCESS_DEPOSIT],
+ "withdraw",
+ DH_METRICS_num_success[DH_MT_SUCCESS_WITHDRAW],
+ "batch-withdraw",
+ DH_METRICS_num_success[DH_MT_SUCCESS_BATCH_WITHDRAW],
+ "melt",
+ DH_METRICS_num_success[DH_MT_SUCCESS_MELT],
+ "refresh-reveal",
+ DH_METRICS_num_success[DH_MT_SUCCESS_REFRESH_REVEAL],
+ "other",
+ DH_METRICS_num_conflict[DH_MT_REQUEST_OTHER],
+ "deposit",
+ DH_METRICS_num_conflict[DH_MT_REQUEST_DEPOSIT],
+ "withdraw",
+ DH_METRICS_num_conflict[DH_MT_REQUEST_WITHDRAW],
+ "melt",
+ DH_METRICS_num_conflict[DH_MT_REQUEST_MELT],
+ "other",
+ DH_METRICS_num_requests[DH_MT_REQUEST_OTHER],
+ "deposit",
+ DH_METRICS_num_requests[DH_MT_REQUEST_DEPOSIT],
+ "withdraw",
+ DH_METRICS_num_requests[DH_MT_REQUEST_WITHDRAW],
+ "melt",
+ DH_METRICS_num_requests[DH_MT_REQUEST_MELT],
+ "withdraw",
+ DH_METRICS_num_requests[DH_MT_REQUEST_IDEMPOTENT_WITHDRAW],
+#if NOT_YET_IMPLEMENTED
+ "deposit",
+ DH_METRICS_num_requests[DH_MT_REQUEST_IDEMPOTENT_DEPOSIT],
+ "melt",
+ DH_METRICS_num_requests[DH_MT_REQUEST_IDEMPOTENT_MELT],
+#endif
+ "batch-withdraw",
+ DH_METRICS_num_requests[
+ DH_MT_REQUEST_IDEMPOTENT_BATCH_WITHDRAW],
+ "rsa",
+ DH_METRICS_num_signatures[DH_MT_SIGNATURE_RSA],
+ "cs",
+ DH_METRICS_num_signatures[DH_MT_SIGNATURE_CS],
+ "eddsa",
+ DH_METRICS_num_signatures[DH_MT_SIGNATURE_EDDSA],
+ "rsa",
+ DH_METRICS_num_verifications[DH_MT_SIGNATURE_RSA],
+ "cs",
+ DH_METRICS_num_verifications[DH_MT_SIGNATURE_CS],
+ "eddsa",
+ DH_METRICS_num_verifications[DH_MT_SIGNATURE_EDDSA],
+ "ecdh",
+ DH_METRICS_num_keyexchanges[DH_MT_KEYX_ECDH],
+ DH_METRICS_batch_withdraw_num_coins);
+ resp = MHD_create_response_from_buffer (strlen (reply),
+ reply,
+ MHD_RESPMEM_MUST_FREE);
+ ret = MHD_queue_response (rc->connection,
+ MHD_HTTP_OK,
+ resp);
+ MHD_destroy_response (resp);
+ return ret;
+}
+
+
+/* end of donau-httpd_metrics.c */
diff --git a/src/donau/donau-httpd_metrics.h b/src/donau/donau-httpd_metrics.h
new file mode 100644
index 0000000..ee2149b
--- /dev/null
+++ b/src/donau/donau-httpd_metrics.h
@@ -0,0 +1,136 @@
+/*
+ This file is part of TALER
+ Copyright (C) 2014--2021 Taler Systems SA
+
+ TALER is free software; you can redistribute it and/or modify it under the
+ terms of the GNU Affero General Public License as published by the Free
Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ TALER is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
details.
+
+ You should have received a copy of the GNU Affero General Public License
along with
+ TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+*/
+/**
+ * @file donau-httpd_metrics.h
+ * @brief Handle /metrics requests
+ * @author Christian Grothoff
+ */
+#ifndef DONAU_HTTPD_METRICS_H
+#define DONAU_HTTPD_METRICS_H
+
+#include <gnunet/gnunet_util_lib.h>
+#include <microhttpd.h>
+#include "donau-httpd.h"
+
+
+/**
+ * Request types for which we collect metrics.
+ */
+enum DH_MetricTypeRequest
+{
+ DH_MT_REQUEST_OTHER = 0,
+ DH_MT_REQUEST_DEPOSIT = 1,
+ DH_MT_REQUEST_WITHDRAW = 2,
+ DH_MT_REQUEST_AGE_WITHDRAW = 3,
+ DH_MT_REQUEST_MELT = 4,
+ DH_MT_REQUEST_PURSE_CREATE = 5,
+ DH_MT_REQUEST_PURSE_MERGE = 6,
+ DH_MT_REQUEST_RESERVE_PURSE = 7,
+ DH_MT_REQUEST_PURSE_DEPOSIT = 8,
+ DH_MT_REQUEST_IDEMPOTENT_DEPOSIT = 9,
+ DH_MT_REQUEST_IDEMPOTENT_WITHDRAW = 10,
+ DH_MT_REQUEST_IDEMPOTENT_AGE_WITHDRAW = 11,
+ DH_MT_REQUEST_IDEMPOTENT_MELT = 12,
+ DH_MT_REQUEST_IDEMPOTENT_BATCH_WITHDRAW = 13,
+ DH_MT_REQUEST_BATCH_DEPOSIT = 14,
+ DH_MT_REQUEST_POLICY_FULFILLMENT = 15,
+ DH_MT_REQUEST_COUNT = 16 /* MUST BE LAST! */
+};
+
+/**
+ * Success types for which we collect metrics.
+ */
+enum DH_MetricTypeSuccess
+{
+ DH_MT_SUCCESS_DEPOSIT = 0,
+ DH_MT_SUCCESS_WITHDRAW = 1,
+ DH_MT_SUCCESS_AGE_WITHDRAW = 2,
+ DH_MT_SUCCESS_BATCH_WITHDRAW = 3,
+ DH_MT_SUCCESS_MELT = 4,
+ DH_MT_SUCCESS_REFRESH_REVEAL = 5,
+ DH_MT_SUCCESS_AGE_WITHDRAW_REVEAL = 6,
+ DH_MT_SUCCESS_COUNT = 7 /* MUST BE LAST! */
+};
+
+/**
+ * Cipher types for which we collect signature metrics.
+ */
+enum DH_MetricTypeSignature
+{
+ DH_MT_SIGNATURE_RSA = 0,
+ DH_MT_SIGNATURE_CS = 1,
+ DH_MT_SIGNATURE_EDDSA = 2,
+ DH_MT_SIGNATURE_COUNT = 3
+};
+
+/**
+ * Cipher types for which we collect key exchange metrics.
+ */
+enum DH_MetricTypeKeyX
+{
+ DH_MT_KEYX_ECDH = 0,
+ DH_MT_KEYX_COUNT = 1
+};
+
+/**
+ * Number of requests handled of the respective type.
+ */
+extern unsigned long long DH_METRICS_num_requests[DH_MT_REQUEST_COUNT];
+
+/**
+ * Number of successful requests handled of the respective type.
+ */
+extern unsigned long long DH_METRICS_num_success[DH_MT_SUCCESS_COUNT];
+
+/**
+ * Number of coins withdrawn in a batch-withdraw request
+ */
+extern unsigned long long DH_METRICS_batch_withdraw_num_coins;
+
+/**
+ * Number of serialization errors encountered when
+ * handling requests of the respective type.
+ */
+extern unsigned long long DH_METRICS_num_conflict[DH_MT_REQUEST_COUNT];
+
+/**
+ * Number of signatures created by the respective cipher.
+ */
+extern unsigned long long DH_METRICS_num_signatures[DH_MT_SIGNATURE_COUNT];
+
+/**
+ * Number of signatures verified by the respective cipher.
+ */
+extern unsigned long long DH_METRICS_num_verifications[DH_MT_SIGNATURE_COUNT];
+
+/**
+ * Number of key exchanges done with the respective cipher.
+ */
+extern unsigned long long DH_METRICS_num_keyexchanges[DH_MT_KEYX_COUNT];
+
+/**
+ * Handle a "/metrics" request.
+ *
+ * @param rc request context
+ * @param args array of additional options (must be empty for this function)
+ * @return MHD result code
+ */
+MHD_RESULT
+DH_handler_metrics (struct DH_RequestContext *rc,
+ const char *const args[]);
+
+
+#endif
diff --git a/src/donau/donau-httpd_post-charity.c
b/src/donau/donau-httpd_post-charity.c
index 99008a4..1268445 100644
--- a/src/donau/donau-httpd_post-charity.c
+++ b/src/donau/donau-httpd_post-charity.c
@@ -18,7 +18,7 @@
* @brief Handle request to insert a charity.
* @author Johannes Casaburi
*/
-#include "platform.h"
+#include "taler/platform.h"
#include <gnunet/gnunet_util_lib.h>
#include <gnunet/gnunet_json_lib.h>
#include <jansson.h>
@@ -27,7 +27,10 @@
#include "taler/taler_json_lib.h"
#include "taler/taler_mhd_lib.h"
#include "taler/taler_signatures.h"
-#include "taler/taler-exchange-httpd_responses.h"
+#include "donaudb_plugin.h"
+#include "donau-httpd_charity.h"
+#include "donau-httpd_db.h"
+#include "donau-httpd_metrics.h"
/**
@@ -128,7 +131,7 @@ DH_handler_charity_post (
if (GNUNET_OK !=
DH_DB_run_transaction (connection,
"insert_charity",
- TEH_MT_REQUEST_OTHER,
+ DH_MT_REQUEST_OTHER,
&mhd_ret,
&insert_charity,
&icc))
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [taler-donau] branch master updated: fixed httpd errors added metrics,
gnunet <=