2424
2525from synapse .api .errors import CodeMessageException , SynapseError
2626from synapse .logging .context import make_deferred_yieldable , run_in_background
27+ from synapse .logging .opentracing import log_kv , set_tag , tag_args , trace
2728from synapse .types import UserID , get_domain_from_id
2829from synapse .util import unwrapFirstError
2930from synapse .util .retryutils import NotRetryingDestination
@@ -46,6 +47,7 @@ def __init__(self, hs):
4647 "client_keys" , self .on_federation_query_client_keys
4748 )
4849
50+ @trace
4951 @defer .inlineCallbacks
5052 def query_devices (self , query_body , timeout ):
5153 """ Handle a device key query from a client
@@ -81,6 +83,9 @@ def query_devices(self, query_body, timeout):
8183 else :
8284 remote_queries [user_id ] = device_ids
8385
86+ set_tag ("local_key_query" , local_query )
87+ set_tag ("remote_key_query" , remote_queries )
88+
8489 # First get local devices.
8590 failures = {}
8691 results = {}
@@ -121,6 +126,7 @@ def query_devices(self, query_body, timeout):
121126 r [user_id ] = remote_queries [user_id ]
122127
123128 # Now fetch any devices that we don't have in our cache
129+ @trace
124130 @defer .inlineCallbacks
125131 def do_remote_query (destination ):
126132 """This is called when we are querying the device list of a user on
@@ -185,6 +191,8 @@ def do_remote_query(destination):
185191 except Exception as e :
186192 failure = _exception_to_failure (e )
187193 failures [destination ] = failure
194+ set_tag ("error" , True )
195+ set_tag ("reason" , failure )
188196
189197 yield make_deferred_yieldable (
190198 defer .gatherResults (
@@ -198,6 +206,7 @@ def do_remote_query(destination):
198206
199207 return {"device_keys" : results , "failures" : failures }
200208
209+ @trace
201210 @defer .inlineCallbacks
202211 def query_local_devices (self , query ):
203212 """Get E2E device keys for local users
@@ -210,13 +219,22 @@ def query_local_devices(self, query):
210219 defer.Deferred: (resolves to dict[string, dict[string, dict]]):
211220 map from user_id -> device_id -> device details
212221 """
222+ set_tag ("local_query" , query )
213223 local_query = []
214224
215225 result_dict = {}
216226 for user_id , device_ids in query .items ():
217227 # we use UserID.from_string to catch invalid user ids
218228 if not self .is_mine (UserID .from_string (user_id )):
219229 logger .warning ("Request for keys for non-local user %s" , user_id )
230+ log_kv (
231+ {
232+ "message" : "Requested a local key for a user which"
233+ " was not local to the homeserver" ,
234+ "user_id" : user_id ,
235+ }
236+ )
237+ set_tag ("error" , True )
220238 raise SynapseError (400 , "Not a user here" )
221239
222240 if not device_ids :
@@ -241,6 +259,7 @@ def query_local_devices(self, query):
241259 r ["unsigned" ]["device_display_name" ] = display_name
242260 result_dict [user_id ][device_id ] = r
243261
262+ log_kv (results )
244263 return result_dict
245264
246265 @defer .inlineCallbacks
@@ -251,6 +270,7 @@ def on_federation_query_client_keys(self, query_body):
251270 res = yield self .query_local_devices (device_keys_query )
252271 return {"device_keys" : res }
253272
273+ @trace
254274 @defer .inlineCallbacks
255275 def claim_one_time_keys (self , query , timeout ):
256276 local_query = []
@@ -265,6 +285,9 @@ def claim_one_time_keys(self, query, timeout):
265285 domain = get_domain_from_id (user_id )
266286 remote_queries .setdefault (domain , {})[user_id ] = device_keys
267287
288+ set_tag ("local_key_query" , local_query )
289+ set_tag ("remote_key_query" , remote_queries )
290+
268291 results = yield self .store .claim_e2e_one_time_keys (local_query )
269292
270293 json_result = {}
@@ -276,8 +299,10 @@ def claim_one_time_keys(self, query, timeout):
276299 key_id : json .loads (json_bytes )
277300 }
278301
302+ @trace
279303 @defer .inlineCallbacks
280304 def claim_client_keys (destination ):
305+ set_tag ("destination" , destination )
281306 device_keys = remote_queries [destination ]
282307 try :
283308 remote_result = yield self .federation .claim_client_keys (
@@ -290,6 +315,8 @@ def claim_client_keys(destination):
290315 except Exception as e :
291316 failure = _exception_to_failure (e )
292317 failures [destination ] = failure
318+ set_tag ("error" , True )
319+ set_tag ("reason" , failure )
293320
294321 yield make_deferred_yieldable (
295322 defer .gatherResults (
@@ -313,9 +340,11 @@ def claim_client_keys(destination):
313340 ),
314341 )
315342
343+ log_kv ({"one_time_keys" : json_result , "failures" : failures })
316344 return {"one_time_keys" : json_result , "failures" : failures }
317345
318346 @defer .inlineCallbacks
347+ @tag_args
319348 def upload_keys_for_user (self , user_id , device_id , keys ):
320349
321350 time_now = self .clock .time_msec ()
@@ -329,19 +358,38 @@ def upload_keys_for_user(self, user_id, device_id, keys):
329358 user_id ,
330359 time_now ,
331360 )
361+ log_kv (
362+ {
363+ "message" : "Updating device_keys for user." ,
364+ "user_id" : user_id ,
365+ "device_id" : device_id ,
366+ }
367+ )
332368 # TODO: Sign the JSON with the server key
333369 changed = yield self .store .set_e2e_device_keys (
334370 user_id , device_id , time_now , device_keys
335371 )
336372 if changed :
337373 # Only notify about device updates *if* the keys actually changed
338374 yield self .device_handler .notify_device_update (user_id , [device_id ])
339-
375+ else :
376+ log_kv ({"message" : "Not updating device_keys for user" , "user_id" : user_id })
340377 one_time_keys = keys .get ("one_time_keys" , None )
341378 if one_time_keys :
379+ log_kv (
380+ {
381+ "message" : "Updating one_time_keys for device." ,
382+ "user_id" : user_id ,
383+ "device_id" : device_id ,
384+ }
385+ )
342386 yield self ._upload_one_time_keys_for_user (
343387 user_id , device_id , time_now , one_time_keys
344388 )
389+ else :
390+ log_kv (
391+ {"message" : "Did not update one_time_keys" , "reason" : "no keys given" }
392+ )
345393
346394 # the device should have been registered already, but it may have been
347395 # deleted due to a race with a DELETE request. Or we may be using an
@@ -352,6 +400,7 @@ def upload_keys_for_user(self, user_id, device_id, keys):
352400
353401 result = yield self .store .count_e2e_one_time_keys (user_id , device_id )
354402
403+ set_tag ("one_time_key_counts" , result )
355404 return {"one_time_key_counts" : result }
356405
357406 @defer .inlineCallbacks
@@ -395,6 +444,7 @@ def _upload_one_time_keys_for_user(
395444 (algorithm , key_id , encode_canonical_json (key ).decode ("ascii" ))
396445 )
397446
447+ log_kv ({"message" : "Inserting new one_time_keys." , "keys" : new_keys })
398448 yield self .store .add_e2e_one_time_keys (user_id , device_id , time_now , new_keys )
399449
400450
0 commit comments