Improve logging in more places.
This shows the Shard ID in more places, along with a gateway trace and session ID. Also helps show the RESUME/IDENTIFY/RESUMED/READY flow a bit more instead of it looking like the connection has zombied out.
This commit is contained in:
parent
3e15f46dcf
commit
ac90159c72
@ -69,7 +69,7 @@ class KeepAliveHandler(threading.Thread):
|
|||||||
def run(self):
|
def run(self):
|
||||||
while not self._stop_ev.wait(self.interval):
|
while not self._stop_ev.wait(self.interval):
|
||||||
if self._last_ack + 2 * self.interval < time.time():
|
if self._last_ack + 2 * self.interval < time.time():
|
||||||
log.warn("Shard ID %s has stopped responding to the gateway." % self.shard_id)
|
log.warn("Shard ID %s has stopped responding to the gateway. Closing and restarting." % self.shard_id)
|
||||||
coro = self.ws.close(1006)
|
coro = self.ws.close(1006)
|
||||||
f = compat.run_coroutine_threadsafe(coro, loop=self.ws.loop)
|
f = compat.run_coroutine_threadsafe(coro, loop=self.ws.loop)
|
||||||
|
|
||||||
@ -215,16 +215,14 @@ class DiscordWebSocket(websockets.client.WebSocketClientProtocol):
|
|||||||
|
|
||||||
if not resume:
|
if not resume:
|
||||||
yield from ws.identify()
|
yield from ws.identify()
|
||||||
log.info('sent the identify payload to create the websocket')
|
|
||||||
return ws
|
return ws
|
||||||
|
|
||||||
yield from ws.resume()
|
yield from ws.resume()
|
||||||
log.info('sent the resume payload to create the websocket')
|
|
||||||
try:
|
try:
|
||||||
yield from ws.ensure_open()
|
yield from ws.ensure_open()
|
||||||
except websockets.exceptions.ConnectionClosed:
|
except websockets.exceptions.ConnectionClosed:
|
||||||
# ws got closed so let's just do a regular IDENTIFY connect.
|
# ws got closed so let's just do a regular IDENTIFY connect.
|
||||||
log.info('RESUME failure.')
|
log.info('RESUME failed (the websocket decided to close) for Shard ID %s. Retrying.', shard_id)
|
||||||
return (yield from cls.from_client(client))
|
return (yield from cls.from_client(client))
|
||||||
else:
|
else:
|
||||||
return ws
|
return ws
|
||||||
@ -281,6 +279,7 @@ class DiscordWebSocket(websockets.client.WebSocketClientProtocol):
|
|||||||
payload['d']['shard'] = [self.shard_id, self.shard_count]
|
payload['d']['shard'] = [self.shard_id, self.shard_count]
|
||||||
|
|
||||||
yield from self.send_as_json(payload)
|
yield from self.send_as_json(payload)
|
||||||
|
log.info('Shard ID %s has sent the IDENTIFY payload.', self.shard_id)
|
||||||
|
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
def resume(self):
|
def resume(self):
|
||||||
@ -295,6 +294,7 @@ class DiscordWebSocket(websockets.client.WebSocketClientProtocol):
|
|||||||
}
|
}
|
||||||
|
|
||||||
yield from self.send_as_json(payload)
|
yield from self.send_as_json(payload)
|
||||||
|
log.info('Shard ID %s has sent the RESUME payload.', self.shard_id)
|
||||||
|
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
def received_message(self, msg):
|
def received_message(self, msg):
|
||||||
@ -306,7 +306,7 @@ class DiscordWebSocket(websockets.client.WebSocketClientProtocol):
|
|||||||
|
|
||||||
msg = json.loads(msg)
|
msg = json.loads(msg)
|
||||||
|
|
||||||
log.debug('For Shard ID {}: WebSocket Event: {}'.format(self.shard_id, msg))
|
log.debug('For Shard ID %s: WebSocket Event: %s', self.shard_id, msg)
|
||||||
self._dispatch('socket_response', msg)
|
self._dispatch('socket_response', msg)
|
||||||
|
|
||||||
op = msg.get('op')
|
op = msg.get('op')
|
||||||
@ -345,27 +345,34 @@ class DiscordWebSocket(websockets.client.WebSocketClientProtocol):
|
|||||||
|
|
||||||
self.sequence = None
|
self.sequence = None
|
||||||
self.session_id = None
|
self.session_id = None
|
||||||
log.info('Shard ID %s has either failed a RESUME request or needed to invalidate its session.' % self.shard_id)
|
log.info('Shard ID %s session has been invalidated.' % self.shard_id)
|
||||||
yield from self.identify()
|
yield from self.identify()
|
||||||
return
|
return
|
||||||
|
|
||||||
if op != self.DISPATCH:
|
if op != self.DISPATCH:
|
||||||
log.info('Unhandled op {}'.format(op))
|
log.warning('Unknown OP code %s.', op)
|
||||||
return
|
return
|
||||||
|
|
||||||
event = msg.get('t')
|
event = msg.get('t')
|
||||||
is_ready = event == 'READY'
|
|
||||||
|
|
||||||
if is_ready:
|
if event == 'READY':
|
||||||
|
self._trace = trace = data.get('_trace', [])
|
||||||
self.sequence = msg['s']
|
self.sequence = msg['s']
|
||||||
self.session_id = data['session_id']
|
self.session_id = data['session_id']
|
||||||
|
log.info('Shard ID %s has connected to Gateway: %s (Session ID: %s).',
|
||||||
|
self.shard_id, ', '.join(trace), self.session_id)
|
||||||
|
|
||||||
|
if event == 'RESUMED':
|
||||||
|
self._trace = trace = data.get('_trace', [])
|
||||||
|
log.info('Shard ID %s has successfully RESUMED session %s under trace %s.',
|
||||||
|
self.shard_id, self.session_id, ', '.join(trace))
|
||||||
|
|
||||||
parser = 'parse_' + event.lower()
|
parser = 'parse_' + event.lower()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
func = getattr(self._connection, parser)
|
func = getattr(self._connection, parser)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
log.info('Unhandled event {}'.format(event))
|
log.warning('Unknown event %s.', event)
|
||||||
else:
|
else:
|
||||||
func(data)
|
func(data)
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ class Shard:
|
|||||||
try:
|
try:
|
||||||
yield from self.ws.poll_event()
|
yield from self.ws.poll_event()
|
||||||
except ResumeWebSocket as e:
|
except ResumeWebSocket as e:
|
||||||
log.info('Got a request to RESUME the websocket.')
|
log.info('Got a request to RESUME the websocket at Shard ID %s.', self.id)
|
||||||
self.ws = yield from DiscordWebSocket.from_client(self._client, resume=True,
|
self.ws = yield from DiscordWebSocket.from_client(self._client, resume=True,
|
||||||
shard_id=self.id,
|
shard_id=self.id,
|
||||||
session=self.ws.session_id,
|
session=self.ws.session_id,
|
||||||
@ -191,7 +191,6 @@ class AutoShardedClient(Client):
|
|||||||
# OP HELLO
|
# OP HELLO
|
||||||
yield from ws.poll_event()
|
yield from ws.poll_event()
|
||||||
yield from ws.identify()
|
yield from ws.identify()
|
||||||
log.info('Sent IDENTIFY payload to create the websocket for shard_id: %s' % shard_id)
|
|
||||||
|
|
||||||
# keep reading the shard while others connect
|
# keep reading the shard while others connect
|
||||||
self.shards[shard_id] = ret = Shard(ws, self)
|
self.shards[shard_id] = ret = Shard(ws, self)
|
||||||
|
@ -658,7 +658,8 @@ class ConnectionState:
|
|||||||
log.warning('GUILD_ROLE_UPDATE referencing an unknown guild ID: %s. Discarding.', data['guild_id'])
|
log.warning('GUILD_ROLE_UPDATE referencing an unknown guild ID: %s. Discarding.', data['guild_id'])
|
||||||
|
|
||||||
def parse_guild_members_chunk(self, data):
|
def parse_guild_members_chunk(self, data):
|
||||||
guild = self._get_guild(int(data['guild_id']))
|
guild_id = int(data['guild_id'])
|
||||||
|
guild = self._get_guild(guild_id)
|
||||||
members = data.get('members', [])
|
members = data.get('members', [])
|
||||||
for member in members:
|
for member in members:
|
||||||
m = Member(guild=guild, data=member, state=self)
|
m = Member(guild=guild, data=member, state=self)
|
||||||
@ -666,7 +667,7 @@ class ConnectionState:
|
|||||||
if existing is None or existing.joined_at is None:
|
if existing is None or existing.joined_at is None:
|
||||||
guild._add_member(m)
|
guild._add_member(m)
|
||||||
|
|
||||||
log.info('processed a chunk for {} members.'.format(len(members)))
|
log.info('Processed a chunk for %s members in guild ID %s.', len(members), guild_id)
|
||||||
self.process_listeners(ListenerType.chunk, guild, len(members))
|
self.process_listeners(ListenerType.chunk, guild, len(members))
|
||||||
|
|
||||||
def parse_voice_state_update(self, data):
|
def parse_voice_state_update(self, data):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user