add connection stat log
This commit is contained in:
		
							parent
							
								
									9eefd27152
								
							
						
					
					
						commit
						82ffa15a56
					
				
					 5 changed files with 58 additions and 11 deletions
				
			
		|  | @ -61,6 +61,7 @@ class ServerPool(object): | |||
| 		self.tcp_ipv6_servers_pool = {} | ||||
| 		self.udp_servers_pool = {} | ||||
| 		self.udp_ipv6_servers_pool = {} | ||||
| 		self.stat_counter = {} | ||||
| 
 | ||||
| 		self.loop = eventloop.EventLoop() | ||||
| 		thread = MainThread( (self.loop, self.dns_resolver, self.mgr) ) | ||||
|  | @ -129,11 +130,11 @@ class ServerPool(object): | |||
| 				try: | ||||
| 					logging.info("starting server at [%s]:%d" % (a_config['server'], port)) | ||||
| 
 | ||||
| 					tcp_server = tcprelay.TCPRelay(a_config, self.dns_resolver, False) | ||||
| 					tcp_server = tcprelay.TCPRelay(a_config, self.dns_resolver, False, stat_counter=self.stat_counter) | ||||
| 					tcp_server.add_to_loop(self.loop) | ||||
| 					self.tcp_ipv6_servers_pool.update({port: tcp_server}) | ||||
| 
 | ||||
| 					udp_server = udprelay.UDPRelay(a_config, self.dns_resolver, False) | ||||
| 					udp_server = udprelay.UDPRelay(a_config, self.dns_resolver, False, stat_counter=self.stat_counter) | ||||
| 					udp_server.add_to_loop(self.loop) | ||||
| 					self.udp_ipv6_servers_pool.update({port: udp_server}) | ||||
| 
 | ||||
|  |  | |||
|  | @ -86,9 +86,9 @@ class Manager(object): | |||
|             return | ||||
|         logging.info("adding server at %s:%d" % (config['server'], port)) | ||||
|         t = tcprelay.TCPRelay(config, self._dns_resolver, False, | ||||
|                               self.stat_callback) | ||||
|                               stat_callback=self.stat_callback) | ||||
|         u = udprelay.UDPRelay(config, self._dns_resolver, False, | ||||
|                               self.stat_callback) | ||||
|                               stat_callback=self.stat_callback) | ||||
|         t.add_to_loop(self._loop) | ||||
|         u.add_to_loop(self._loop) | ||||
|         self._relays[port] = (t, u) | ||||
|  |  | |||
|  | @ -61,6 +61,10 @@ def main(): | |||
|     tcp_servers = [] | ||||
|     udp_servers = [] | ||||
|     dns_resolver = asyncdns.DNSResolver() | ||||
|     if int(config['workers']) > 1: | ||||
|         stat_counter_dict = None | ||||
|     else: | ||||
|         stat_counter_dict = {} | ||||
|     port_password = config['port_password'] | ||||
|     config_password = config.get('password', 'm') | ||||
|     del config['port_password'] | ||||
|  | @ -108,8 +112,8 @@ def main(): | |||
|                 a_config['server'] = a_config['server_ipv6'] | ||||
|                 logging.info("starting server at [%s]:%d" % | ||||
|                              (a_config['server'], int(port))) | ||||
|                 tcp_servers.append(tcprelay.TCPRelay(a_config, dns_resolver, False)) | ||||
|                 udp_servers.append(udprelay.UDPRelay(a_config, dns_resolver, False)) | ||||
|                 tcp_servers.append(tcprelay.TCPRelay(a_config, dns_resolver, False, stat_counter=stat_counter_dict)) | ||||
|                 udp_servers.append(udprelay.UDPRelay(a_config, dns_resolver, False, stat_counter=stat_counter_dict)) | ||||
|                 if a_config['server_ipv6'] == b"::": | ||||
|                     ipv6_ok = True | ||||
|             except Exception as e: | ||||
|  | @ -128,8 +132,8 @@ def main(): | |||
|             a_config['out_bindv6'] = bindv6 | ||||
|             logging.info("starting server at %s:%d" % | ||||
|                          (a_config['server'], int(port))) | ||||
|             tcp_servers.append(tcprelay.TCPRelay(a_config, dns_resolver, False)) | ||||
|             udp_servers.append(udprelay.UDPRelay(a_config, dns_resolver, False)) | ||||
|             tcp_servers.append(tcprelay.TCPRelay(a_config, dns_resolver, False, stat_counter=stat_counter_dict)) | ||||
|             udp_servers.append(udprelay.UDPRelay(a_config, dns_resolver, False, stat_counter=stat_counter_dict)) | ||||
|         except Exception as e: | ||||
|             if not ipv6_ok: | ||||
|                 shell.print_exception(e) | ||||
|  |  | |||
|  | @ -170,6 +170,7 @@ class TCPRelayHandler(object): | |||
|         self.last_activity = 0 | ||||
|         self._update_activity() | ||||
|         self._server.add_connection(1) | ||||
|         self._server.stat_add(common.to_str(self._client_address[0]), 1) | ||||
| 
 | ||||
|     def __hash__(self): | ||||
|         # default __hash__ is id / 16 | ||||
|  | @ -877,9 +878,10 @@ class TCPRelayHandler(object): | |||
|         self._dns_resolver.remove_callback(self._handle_dns_resolved) | ||||
|         self._server.remove_handler(self) | ||||
|         self._server.add_connection(-1) | ||||
|         self._server.stat_add(common.to_str(self._client_address[0]), -1) | ||||
| 
 | ||||
| class TCPRelay(object): | ||||
|     def __init__(self, config, dns_resolver, is_local, stat_callback=None): | ||||
|     def __init__(self, config, dns_resolver, is_local, stat_callback=None, stat_counter=None): | ||||
|         self._config = config | ||||
|         self._is_local = is_local | ||||
|         self._dns_resolver = dns_resolver | ||||
|  | @ -925,8 +927,9 @@ class TCPRelay(object): | |||
|             except socket.error: | ||||
|                 logging.error('warning: fast open is not available') | ||||
|                 self._config['fast_open'] = False | ||||
|         server_socket.listen(1024) | ||||
|         server_socket.listen(config.get('max_connect', 1024)) | ||||
|         self._server_socket = server_socket | ||||
|         self._stat_counter = stat_counter | ||||
|         self._stat_callback = stat_callback | ||||
| 
 | ||||
|     def add_to_loop(self, loop): | ||||
|  | @ -950,6 +953,45 @@ class TCPRelay(object): | |||
|         self.server_connections += val | ||||
|         logging.debug('server port %5d connections = %d' % (self._listen_port, self.server_connections,)) | ||||
| 
 | ||||
|     def update_stat(self, port, stat_dict, val): | ||||
|         newval = stat_dict.get(0, 0) + val | ||||
|         stat_dict[0] = newval | ||||
|         logging.debug('port %d connections %d' % (port, newval)) | ||||
|         connections_step = 25 | ||||
|         if newval >= stat_dict.get(-1, 0) + connections_step: | ||||
|             logging.info('port %d connections up to %d' % (port, newval)) | ||||
|             stat_dict[-1] = stat_dict.get(-1, 0) + connections_step | ||||
|         elif newval <= stat_dict.get(-1, 0) - connections_step: | ||||
|             logging.info('port %d connections down to %d' % (port, newval)) | ||||
|             stat_dict[-1] = stat_dict.get(-1, 0) - connections_step | ||||
| 
 | ||||
|     def stat_add(self, local_addr, val): | ||||
|         if self._stat_counter is not None: | ||||
|             if self._listen_port not in self._stat_counter: | ||||
|                 self._stat_counter[self._listen_port] = {} | ||||
|             newval = self._stat_counter[self._listen_port].get(local_addr, 0) + val | ||||
|             logging.debug('port %d addr %s connections %d' % (self._listen_port, local_addr, newval)) | ||||
|             if newval <= 0: | ||||
|                 if local_addr in self._stat_counter[self._listen_port]: | ||||
|                     del self._stat_counter[self._listen_port][local_addr] | ||||
|                 if len(self._stat_counter[self._listen_port]) == 0: | ||||
|                     del self._stat_counter[self._listen_port] | ||||
|             else: | ||||
|                 self._stat_counter[self._listen_port][local_addr] = newval | ||||
|                 self.update_stat(self._listen_port, self._stat_counter[self._listen_port], val) | ||||
| 
 | ||||
|             newval = self._stat_counter.get(0, 0) + val | ||||
|             self._stat_counter[0] = newval | ||||
|             logging.debug('Total connections %d' % newval) | ||||
| 
 | ||||
|             connections_step = 50 | ||||
|             if newval >= self._stat_counter.get(-1, 0) + connections_step: | ||||
|                 logging.info('Total connections up to %d' % newval) | ||||
|                 self._stat_counter[-1] = self._stat_counter.get(-1, 0) + connections_step | ||||
|             elif newval <= self._stat_counter.get(-1, 0) - connections_step: | ||||
|                 logging.info('Total connections down to %d' % newval) | ||||
|                 self._stat_counter[-1] = self._stat_counter.get(-1, 0) - connections_step | ||||
| 
 | ||||
|     def update_activity(self, handler, data_len): | ||||
|         if data_len and self._stat_callback: | ||||
|             self._stat_callback(self._listen_port, data_len) | ||||
|  |  | |||
|  | @ -863,7 +863,7 @@ def client_key(source_addr, server_af): | |||
| 
 | ||||
| 
 | ||||
| class UDPRelay(object): | ||||
|     def __init__(self, config, dns_resolver, is_local, stat_callback=None): | ||||
|     def __init__(self, config, dns_resolver, is_local, stat_callback=None, stat_counter=None): | ||||
|         self._config = config | ||||
|         if config.get('connect_verbose_info', 0) > 0: | ||||
|             common.connect_log = logging.info | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue