mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 05:03:43 +01:00
Merge branch 'metrics-count-bug' into 'main'
add metrics counter for BUG() reached Closes #40839 See merge request tpo/core/tor!760
This commit is contained in:
commit
dad173d3be
@ -9,8 +9,10 @@ lib/intmath/*.h
|
|||||||
lib/lock/*.h
|
lib/lock/*.h
|
||||||
lib/log/*.h
|
lib/log/*.h
|
||||||
lib/malloc/*.h
|
lib/malloc/*.h
|
||||||
|
lib/metrics/*.h
|
||||||
lib/string/*.h
|
lib/string/*.h
|
||||||
lib/subsys/*.h
|
lib/subsys/*.h
|
||||||
lib/testsupport/*.h
|
lib/testsupport/*.h
|
||||||
|
lib/thread/threads.h
|
||||||
lib/version/*.h
|
lib/version/*.h
|
||||||
lib/wallclock/*.h
|
lib/wallclock/*.h
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#define LOG_PRIVATE
|
#define LOG_PRIVATE
|
||||||
#include "lib/log/log.h"
|
#include "lib/log/log.h"
|
||||||
#include "lib/log/log_sys.h"
|
#include "lib/log/log_sys.h"
|
||||||
|
#include "lib/log/util_bug.h"
|
||||||
#include "lib/version/git_revision.h"
|
#include "lib/version/git_revision.h"
|
||||||
#include "lib/log/ratelim.h"
|
#include "lib/log/ratelim.h"
|
||||||
#include "lib/lock/compat_mutex.h"
|
#include "lib/lock/compat_mutex.h"
|
||||||
@ -912,6 +913,7 @@ init_logging(int disable_startup_queue)
|
|||||||
{
|
{
|
||||||
if (!log_mutex_initialized) {
|
if (!log_mutex_initialized) {
|
||||||
tor_mutex_init(&log_mutex);
|
tor_mutex_init(&log_mutex);
|
||||||
|
tor_bug_init_counter();
|
||||||
log_mutex_initialized = 1;
|
log_mutex_initialized = 1;
|
||||||
}
|
}
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
|
@ -11,11 +11,16 @@
|
|||||||
#include "lib/log/escape.h"
|
#include "lib/log/escape.h"
|
||||||
#include "lib/log/log.h"
|
#include "lib/log/log.h"
|
||||||
#include "lib/log/log_sys.h"
|
#include "lib/log/log_sys.h"
|
||||||
|
#include "lib/log/util_bug.h"
|
||||||
|
#include "lib/metrics/metrics_store.h"
|
||||||
|
|
||||||
|
static metrics_store_t *the_store;
|
||||||
|
|
||||||
static int
|
static int
|
||||||
subsys_logging_initialize(void)
|
subsys_logging_initialize(void)
|
||||||
{
|
{
|
||||||
init_logging(0);
|
init_logging(0);
|
||||||
|
the_store = metrics_store_new();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -26,6 +31,29 @@ subsys_logging_shutdown(void)
|
|||||||
escaped(NULL);
|
escaped(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const smartlist_t *
|
||||||
|
logging_metrics_get_stores(void)
|
||||||
|
{
|
||||||
|
static smartlist_t *stores_list = NULL;
|
||||||
|
|
||||||
|
metrics_store_reset(the_store);
|
||||||
|
|
||||||
|
metrics_store_entry_t *sentry = metrics_store_add(
|
||||||
|
the_store,
|
||||||
|
METRICS_TYPE_COUNTER,
|
||||||
|
METRICS_NAME(bug_reached),
|
||||||
|
"Total number of BUG() and similar assertion reached",
|
||||||
|
0, NULL);
|
||||||
|
metrics_store_entry_update(sentry, tor_bug_get_count());
|
||||||
|
|
||||||
|
if (!stores_list) {
|
||||||
|
stores_list = smartlist_new();
|
||||||
|
smartlist_add(stores_list, the_store);
|
||||||
|
}
|
||||||
|
|
||||||
|
return stores_list;
|
||||||
|
}
|
||||||
|
|
||||||
const subsys_fns_t sys_logging = {
|
const subsys_fns_t sys_logging = {
|
||||||
.name = "log",
|
.name = "log",
|
||||||
SUBSYS_DECLARE_LOCATION(),
|
SUBSYS_DECLARE_LOCATION(),
|
||||||
@ -35,4 +63,5 @@ const subsys_fns_t sys_logging = {
|
|||||||
.level = -90,
|
.level = -90,
|
||||||
.initialize = subsys_logging_initialize,
|
.initialize = subsys_logging_initialize,
|
||||||
.shutdown = subsys_logging_shutdown,
|
.shutdown = subsys_logging_shutdown,
|
||||||
|
.get_metrics = logging_metrics_get_stores,
|
||||||
};
|
};
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#endif
|
#endif
|
||||||
#include "lib/malloc/malloc.h"
|
#include "lib/malloc/malloc.h"
|
||||||
#include "lib/string/printf.h"
|
#include "lib/string/printf.h"
|
||||||
|
#include "lib/thread/threads.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -101,6 +102,27 @@ tor_assertion_failed_(const char *fname, unsigned int line,
|
|||||||
tor_free(buf);
|
tor_free(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static atomic_counter_t total_bug_reached;
|
||||||
|
|
||||||
|
void
|
||||||
|
tor_bug_init_counter(void)
|
||||||
|
{
|
||||||
|
atomic_counter_init(&total_bug_reached);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Helper to update BUG count in metrics. */
|
||||||
|
void
|
||||||
|
tor_bug_increment_count_(void)
|
||||||
|
{
|
||||||
|
atomic_counter_add(&total_bug_reached, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
tor_bug_get_count(void)
|
||||||
|
{
|
||||||
|
return atomic_counter_get(&total_bug_reached);
|
||||||
|
}
|
||||||
|
|
||||||
/** Helper for tor_assert_nonfatal: report the assertion failure. */
|
/** Helper for tor_assert_nonfatal: report the assertion failure. */
|
||||||
void
|
void
|
||||||
tor_bug_occurred_(const char *fname, unsigned int line,
|
tor_bug_occurred_(const char *fname, unsigned int line,
|
||||||
@ -110,6 +132,11 @@ tor_bug_occurred_(const char *fname, unsigned int line,
|
|||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
const char *once_str = once ?
|
const char *once_str = once ?
|
||||||
" (Future instances of this warning will be silenced.)": "";
|
" (Future instances of this warning will be silenced.)": "";
|
||||||
|
if (! once) {
|
||||||
|
// _once assertions count from the macro directly so we count them as many
|
||||||
|
// time as they are reached, and not just once.
|
||||||
|
tor_bug_increment_count_();
|
||||||
|
}
|
||||||
if (! expr) {
|
if (! expr) {
|
||||||
if (capturing_bugs()) {
|
if (capturing_bugs()) {
|
||||||
add_captured_bug("This line should not have been reached.");
|
add_captured_bug("This line should not have been reached.");
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#include "orconfig.h"
|
#include "orconfig.h"
|
||||||
#include "lib/cc/compat_compiler.h"
|
#include "lib/cc/compat_compiler.h"
|
||||||
#include "lib/log/log.h"
|
#include "lib/log/log.h"
|
||||||
|
#include "lib/smartlist_core/smartlist_core.h"
|
||||||
#include "lib/testsupport/testsupport.h"
|
#include "lib/testsupport/testsupport.h"
|
||||||
|
|
||||||
/* Replace assert() with a variant that sends failures to the log before
|
/* Replace assert() with a variant that sends failures to the log before
|
||||||
@ -191,6 +192,7 @@
|
|||||||
STMT_END
|
STMT_END
|
||||||
#define tor_assert_nonfatal_unreached_once() STMT_BEGIN \
|
#define tor_assert_nonfatal_unreached_once() STMT_BEGIN \
|
||||||
static int warning_logged__ = 0; \
|
static int warning_logged__ = 0; \
|
||||||
|
tor_bug_increment_count_(); \
|
||||||
if (!warning_logged__) { \
|
if (!warning_logged__) { \
|
||||||
warning_logged__ = 1; \
|
warning_logged__ = 1; \
|
||||||
tor_bug_occurred_(SHORT_FILE__, __LINE__, __func__, NULL, 1, NULL); \
|
tor_bug_occurred_(SHORT_FILE__, __LINE__, __func__, NULL, 1, NULL); \
|
||||||
@ -198,10 +200,12 @@
|
|||||||
STMT_END
|
STMT_END
|
||||||
#define tor_assert_nonfatal_once(cond) STMT_BEGIN \
|
#define tor_assert_nonfatal_once(cond) STMT_BEGIN \
|
||||||
static int warning_logged__ = 0; \
|
static int warning_logged__ = 0; \
|
||||||
if (ASSERT_PREDICT_LIKELY_(cond)) { \
|
if (!ASSERT_PREDICT_LIKELY_(cond)) { \
|
||||||
} else if (!warning_logged__) { \
|
tor_bug_increment_count_(); \
|
||||||
warning_logged__ = 1; \
|
if (!warning_logged__) { \
|
||||||
tor_bug_occurred_(SHORT_FILE__, __LINE__, __func__, #cond, 1, NULL);\
|
warning_logged__ = 1; \
|
||||||
|
tor_bug_occurred_(SHORT_FILE__, __LINE__, __func__, #cond, 1, NULL);\
|
||||||
|
} \
|
||||||
} \
|
} \
|
||||||
STMT_END
|
STMT_END
|
||||||
#define BUG(cond) \
|
#define BUG(cond) \
|
||||||
@ -215,18 +219,22 @@
|
|||||||
if (( { \
|
if (( { \
|
||||||
static int var = 0; \
|
static int var = 0; \
|
||||||
int bool_result = !!(cond); \
|
int bool_result = !!(cond); \
|
||||||
if (bool_result && !var) { \
|
if (bool_result) { \
|
||||||
var = 1; \
|
tor_bug_increment_count_(); \
|
||||||
tor_bug_occurred_(SHORT_FILE__, __LINE__, __func__, \
|
if (!var) { \
|
||||||
("!("#cond")"), 1, NULL); \
|
var = 1; \
|
||||||
|
tor_bug_occurred_(SHORT_FILE__, __LINE__, __func__, \
|
||||||
|
("!("#cond")"), 1, NULL); \
|
||||||
|
} \
|
||||||
} \
|
} \
|
||||||
bool_result; } ))
|
bool_result; } ))
|
||||||
#else /* !defined(__GNUC__) */
|
#else /* !defined(__GNUC__) */
|
||||||
#define IF_BUG_ONCE__(cond,var) \
|
#define IF_BUG_ONCE__(cond,var) \
|
||||||
static int var = 0; \
|
static int var = 0; \
|
||||||
if ((cond) ? \
|
if ((cond) ? \
|
||||||
(var ? 1 : \
|
(var ? (tor_bug_increment_count_(), 1) : \
|
||||||
(var=1, \
|
(var=1, \
|
||||||
|
tor_bug_increment_count_(), \
|
||||||
tor_bug_occurred_(SHORT_FILE__, __LINE__, __func__, \
|
tor_bug_occurred_(SHORT_FILE__, __LINE__, __func__, \
|
||||||
("!("#cond")"), 1, NULL), \
|
("!("#cond")"), 1, NULL), \
|
||||||
1)) \
|
1)) \
|
||||||
@ -273,12 +281,15 @@ void tor_assertion_failed_(const char *fname, unsigned int line,
|
|||||||
const char *func, const char *expr,
|
const char *func, const char *expr,
|
||||||
const char *fmt, ...)
|
const char *fmt, ...)
|
||||||
CHECK_PRINTF(5,6);
|
CHECK_PRINTF(5,6);
|
||||||
|
void tor_bug_increment_count_(void);
|
||||||
|
size_t tor_bug_get_count(void);
|
||||||
void tor_bug_occurred_(const char *fname, unsigned int line,
|
void tor_bug_occurred_(const char *fname, unsigned int line,
|
||||||
const char *func, const char *expr,
|
const char *func, const char *expr,
|
||||||
int once, const char *fmt, ...)
|
int once, const char *fmt, ...)
|
||||||
CHECK_PRINTF(6,7);
|
CHECK_PRINTF(6,7);
|
||||||
|
|
||||||
void tor_abort_(void) ATTR_NORETURN;
|
void tor_abort_(void) ATTR_NORETURN;
|
||||||
|
void tor_bug_init_counter(void);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#define SHORT_FILE__ (tor_fix_source_file(__FILE__))
|
#define SHORT_FILE__ (tor_fix_source_file(__FILE__))
|
||||||
|
Loading…
Reference in New Issue
Block a user