rephist.h (7709B)
1 /* Copyright (c) 2001 Matej Pfajfar. 2 * Copyright (c) 2001-2004, Roger Dingledine. 3 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. 4 * Copyright (c) 2007-2021, The Tor Project, Inc. */ 5 /* See LICENSE for licensing information */ 6 7 /** 8 * \file rephist.h 9 * \brief Header file for rephist.c. 10 **/ 11 12 #ifndef TOR_REPHIST_H 13 #define TOR_REPHIST_H 14 15 void rep_hist_init(void); 16 void rep_hist_dump_stats(time_t now, int severity); 17 18 void rep_hist_make_router_pessimal(const char *id, time_t when); 19 20 void rep_history_clean(time_t before); 21 22 void rep_hist_note_router_reachable(const char *id, const tor_addr_t *at_addr, 23 const uint16_t at_port, time_t when); 24 void rep_hist_note_router_unreachable(const char *id, time_t when); 25 int rep_hist_record_mtbf_data(time_t now, int missing_means_down); 26 int rep_hist_load_mtbf_data(time_t now); 27 28 time_t rep_hist_downrate_old_runs(time_t now); 29 long rep_hist_get_uptime(const char *id, time_t when); 30 double rep_hist_get_stability(const char *id, time_t when); 31 double rep_hist_get_weighted_fractional_uptime(const char *id, time_t when); 32 long rep_hist_get_weighted_time_known(const char *id, time_t when); 33 int rep_hist_have_measured_enough_stability(void); 34 35 void rep_hist_exit_stats_init(time_t now); 36 void rep_hist_reset_exit_stats(time_t now); 37 void rep_hist_exit_stats_term(void); 38 char *rep_hist_format_exit_stats(time_t now); 39 time_t rep_hist_exit_stats_write(time_t now); 40 void rep_hist_note_exit_bytes(uint16_t port, size_t num_written, 41 size_t num_read); 42 void rep_hist_note_exit_stream_opened(uint16_t port); 43 44 void rep_hist_note_conn_opened(bool initiated, unsigned int type, int af); 45 void rep_hist_note_conn_closed(bool initiated, unsigned int type, int af); 46 void rep_hist_note_conn_rejected(unsigned int type, int af); 47 uint64_t rep_hist_get_conn_created(bool initiated, unsigned int type, int af); 48 uint64_t rep_hist_get_conn_opened(bool initiated, unsigned int type, int af); 49 uint64_t rep_hist_get_conn_rejected(unsigned int type, int af); 50 51 void rep_hist_note_exit_stream(unsigned int cmd); 52 uint64_t rep_hist_get_exit_stream_seen(unsigned int cmd); 53 54 void rep_hist_buffer_stats_init(time_t now); 55 void rep_hist_buffer_stats_add_circ(circuit_t *circ, 56 time_t end_of_interval); 57 time_t rep_hist_buffer_stats_write(time_t now); 58 void rep_hist_buffer_stats_term(void); 59 void rep_hist_add_buffer_stats(double mean_num_cells_in_queue, 60 double mean_time_cells_in_queue, uint32_t processed_cells); 61 char *rep_hist_format_buffer_stats(time_t now); 62 void rep_hist_reset_buffer_stats(time_t now); 63 64 void rep_hist_desc_stats_init(time_t now); 65 void rep_hist_note_desc_served(const char * desc); 66 void rep_hist_desc_stats_term(void); 67 time_t rep_hist_desc_stats_write(time_t now); 68 69 void rep_hist_note_circuit_handshake_requested(uint16_t type); 70 void rep_hist_note_circuit_handshake_assigned(uint16_t type); 71 void rep_hist_note_circuit_handshake_dropped(uint16_t type); 72 void rep_hist_log_circuit_handshake_stats(time_t now); 73 74 MOCK_DECL(int, rep_hist_get_circuit_handshake_requested, (uint16_t type)); 75 MOCK_DECL(int, rep_hist_get_circuit_handshake_assigned, (uint16_t type)); 76 77 MOCK_DECL(uint64_t, rep_hist_get_circuit_n_handshake_assigned, 78 (uint16_t type)); 79 MOCK_DECL(uint64_t, rep_hist_get_circuit_n_handshake_dropped, 80 (uint16_t type)); 81 82 void rep_hist_hs_stats_init(time_t now); 83 void rep_hist_hs_stats_term(void); 84 time_t rep_hist_hs_stats_write(time_t now, bool is_v3); 85 86 void rep_hist_seen_new_rp_cell(bool is_v2); 87 88 char *rep_hist_get_hs_v3_stats_string(void); 89 void rep_hist_hsdir_stored_maybe_new_v3_onion(const uint8_t *blinded_key); 90 91 void rep_hist_free_all(void); 92 93 void rep_hist_note_negotiated_link_proto(unsigned link_proto, 94 int started_here); 95 void rep_hist_log_link_protocol_counts(void); 96 97 uint64_t rep_hist_get_n_dns_error(int type, uint8_t error); 98 uint64_t rep_hist_get_n_dns_request(int type); 99 void rep_hist_note_dns_request(int type); 100 void rep_hist_note_dns_error(int type, uint8_t error); 101 102 void rep_hist_consensus_has_changed(const networkstatus_t *ns); 103 104 /** We combine ntor and ntorv3 stats, so we have 3 stat types: 105 * tap, fast, and ntor. The max type is ntor_v3 (3) */ 106 #define MAX_ONION_STAT_TYPE MAX_ONION_HANDSHAKE_TYPE 107 108 extern uint64_t rephist_total_alloc; 109 extern uint32_t rephist_total_num; 110 #ifdef TOR_UNIT_TESTS 111 extern int onion_handshakes_requested[MAX_ONION_STAT_TYPE+1]; 112 extern int onion_handshakes_assigned[MAX_ONION_STAT_TYPE+1]; 113 #endif 114 115 #ifdef REPHIST_PRIVATE 116 /** Carries the various hidden service statistics, and any other 117 * information needed. */ 118 typedef struct hs_v2_stats_t { 119 /** How many v2 relay cells have we seen as rendezvous points? */ 120 uint64_t rp_v2_relay_cells_seen; 121 } hs_v2_stats_t; 122 123 /** Structure that contains the various statistics we keep about v3 124 * services. 125 * 126 * Because of the time period logic of v3 services, v3 statistics are more 127 * sensitive to time than v2 stats. For this reason, we collect v3 128 * statistics strictly from 12:00UTC to 12:00UTC as dictated by 129 * 'start_of_hs_v3_stats_interval'. 130 **/ 131 typedef struct hs_v3_stats_t { 132 /** How many v3 relay cells have we seen as a rendezvous point? */ 133 uint64_t rp_v3_relay_cells_seen; 134 135 /* The number of unique v3 onion descriptors (actually, unique v3 blind keys) 136 * we've seen during the measurement period */ 137 digest256map_t *v3_onions_seen_this_period; 138 } hs_v3_stats_t; 139 140 MOCK_DECL(STATIC bool, should_collect_v3_stats,(void)); 141 142 STATIC char *rep_hist_format_hs_stats(time_t now, bool is_v3); 143 #endif /* defined(REPHIST_PRIVATE) */ 144 145 /** 146 * Represents the type of a cell for padding accounting 147 */ 148 typedef enum padding_type_t { 149 /** A RELAY_DROP cell */ 150 PADDING_TYPE_DROP, 151 /** A CELL_PADDING cell */ 152 PADDING_TYPE_CELL, 153 /** Total counts of padding and non-padding together */ 154 PADDING_TYPE_TOTAL, 155 /** Total cell counts for all padding-enabled channels */ 156 PADDING_TYPE_ENABLED_TOTAL, 157 /** CELL_PADDING counts for all padding-enabled channels */ 158 PADDING_TYPE_ENABLED_CELL 159 } padding_type_t; 160 161 /** The amount of time over which the padding cell counts were counted */ 162 #define REPHIST_CELL_PADDING_COUNTS_INTERVAL (24*60*60) 163 void rep_hist_padding_count_read(padding_type_t type); 164 void rep_hist_padding_count_write(padding_type_t type); 165 char *rep_hist_get_padding_count_lines(void); 166 void rep_hist_reset_padding_counts(void); 167 void rep_hist_prep_published_padding_counts(time_t now); 168 void rep_hist_padding_count_timers(uint64_t num_timers); 169 170 /** 171 * Represents the various types of overload we keep track of and expose in our 172 * extra-info descriptor. 173 */ 174 typedef enum { 175 /* A general overload -- can have many different causes. */ 176 OVERLOAD_GENERAL, 177 /* We went over our configured read rate/burst bandwidth limit */ 178 OVERLOAD_READ, 179 /* We went over our configured write rate/burst bandwidth limit */ 180 OVERLOAD_WRITE, 181 /* We exhausted the file descriptors in this system */ 182 OVERLOAD_FD_EXHAUSTED, 183 } overload_type_t; 184 185 void rep_hist_note_overload(overload_type_t overload); 186 char *rep_hist_get_overload_general_line(void); 187 char *rep_hist_get_overload_stats_lines(void); 188 189 void rep_hist_note_tcp_exhaustion(void); 190 uint64_t rep_hist_get_n_tcp_exhaustion(void); 191 192 uint64_t rep_hist_get_n_read_limit_reached(void); 193 uint64_t rep_hist_get_n_write_limit_reached(void); 194 195 uint64_t rep_hist_get_drop_cell_received_count(void); 196 197 #ifdef TOR_UNIT_TESTS 198 struct hs_v2_stats_t; 199 const struct hs_v2_stats_t *rep_hist_get_hs_v2_stats(void); 200 struct hs_v3_stats_t; 201 const struct hs_v3_stats_t *rep_hist_get_hs_v3_stats(void); 202 #endif /* defined(TOR_UNIT_TESTS) */ 203 204 #endif /* !defined(TOR_REPHIST_H) */