donau

Donation authority for GNU Taler (experimental)
Log | Files | Refs | Submodules | README | LICENSE

commit 9839b09b4ca27b7a217dbde078700420738d35fa
parent 081427c8f1e4c7e2d5315add1b69a1973e07d649
Author: Casaburi Johannes <johannes.casaburi@students.bfh.ch>
Date:   Sun,  7 Jan 2024 16:00:58 +0100

fixed httpd errors added metrics

Diffstat:
Msrc/donau/Makefile.am | 5++++-
Msrc/donau/donau-httpd_charity.h | 3++-
Msrc/donau/donau-httpd_db.c | 95+++++++++++++++++++++++++++++++++++++++++--------------------------------------
Msrc/donau/donau-httpd_get-charity.c | 10++++------
Asrc/donau/donau-httpd_metrics.c | 165+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/donau/donau-httpd_metrics.h | 136+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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))