24
24
25
25
from synapse .api .errors import CodeMessageException , SynapseError
26
26
from synapse .logging .context import make_deferred_yieldable , run_in_background
27
+ from synapse .logging .opentracing import log_kv , set_tag , tag_args , trace
27
28
from synapse .types import UserID , get_domain_from_id
28
29
from synapse .util import unwrapFirstError
29
30
from synapse .util .retryutils import NotRetryingDestination
@@ -46,6 +47,7 @@ def __init__(self, hs):
46
47
"client_keys" , self .on_federation_query_client_keys
47
48
)
48
49
50
+ @trace
49
51
@defer .inlineCallbacks
50
52
def query_devices (self , query_body , timeout ):
51
53
""" Handle a device key query from a client
@@ -81,6 +83,9 @@ def query_devices(self, query_body, timeout):
81
83
else :
82
84
remote_queries [user_id ] = device_ids
83
85
86
+ set_tag ("local_key_query" , local_query )
87
+ set_tag ("remote_key_query" , remote_queries )
88
+
84
89
# First get local devices.
85
90
failures = {}
86
91
results = {}
@@ -121,6 +126,7 @@ def query_devices(self, query_body, timeout):
121
126
r [user_id ] = remote_queries [user_id ]
122
127
123
128
# Now fetch any devices that we don't have in our cache
129
+ @trace
124
130
@defer .inlineCallbacks
125
131
def do_remote_query (destination ):
126
132
"""This is called when we are querying the device list of a user on
@@ -185,6 +191,8 @@ def do_remote_query(destination):
185
191
except Exception as e :
186
192
failure = _exception_to_failure (e )
187
193
failures [destination ] = failure
194
+ set_tag ("error" , True )
195
+ set_tag ("reason" , failure )
188
196
189
197
yield make_deferred_yieldable (
190
198
defer .gatherResults (
@@ -198,6 +206,7 @@ def do_remote_query(destination):
198
206
199
207
return {"device_keys" : results , "failures" : failures }
200
208
209
+ @trace
201
210
@defer .inlineCallbacks
202
211
def query_local_devices (self , query ):
203
212
"""Get E2E device keys for local users
@@ -210,13 +219,22 @@ def query_local_devices(self, query):
210
219
defer.Deferred: (resolves to dict[string, dict[string, dict]]):
211
220
map from user_id -> device_id -> device details
212
221
"""
222
+ set_tag ("local_query" , query )
213
223
local_query = []
214
224
215
225
result_dict = {}
216
226
for user_id , device_ids in query .items ():
217
227
# we use UserID.from_string to catch invalid user ids
218
228
if not self .is_mine (UserID .from_string (user_id )):
219
229
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 )
220
238
raise SynapseError (400 , "Not a user here" )
221
239
222
240
if not device_ids :
@@ -241,6 +259,7 @@ def query_local_devices(self, query):
241
259
r ["unsigned" ]["device_display_name" ] = display_name
242
260
result_dict [user_id ][device_id ] = r
243
261
262
+ log_kv (results )
244
263
return result_dict
245
264
246
265
@defer .inlineCallbacks
@@ -251,6 +270,7 @@ def on_federation_query_client_keys(self, query_body):
251
270
res = yield self .query_local_devices (device_keys_query )
252
271
return {"device_keys" : res }
253
272
273
+ @trace
254
274
@defer .inlineCallbacks
255
275
def claim_one_time_keys (self , query , timeout ):
256
276
local_query = []
@@ -265,6 +285,9 @@ def claim_one_time_keys(self, query, timeout):
265
285
domain = get_domain_from_id (user_id )
266
286
remote_queries .setdefault (domain , {})[user_id ] = device_keys
267
287
288
+ set_tag ("local_key_query" , local_query )
289
+ set_tag ("remote_key_query" , remote_queries )
290
+
268
291
results = yield self .store .claim_e2e_one_time_keys (local_query )
269
292
270
293
json_result = {}
@@ -276,8 +299,10 @@ def claim_one_time_keys(self, query, timeout):
276
299
key_id : json .loads (json_bytes )
277
300
}
278
301
302
+ @trace
279
303
@defer .inlineCallbacks
280
304
def claim_client_keys (destination ):
305
+ set_tag ("destination" , destination )
281
306
device_keys = remote_queries [destination ]
282
307
try :
283
308
remote_result = yield self .federation .claim_client_keys (
@@ -290,6 +315,8 @@ def claim_client_keys(destination):
290
315
except Exception as e :
291
316
failure = _exception_to_failure (e )
292
317
failures [destination ] = failure
318
+ set_tag ("error" , True )
319
+ set_tag ("reason" , failure )
293
320
294
321
yield make_deferred_yieldable (
295
322
defer .gatherResults (
@@ -313,9 +340,11 @@ def claim_client_keys(destination):
313
340
),
314
341
)
315
342
343
+ log_kv ({"one_time_keys" : json_result , "failures" : failures })
316
344
return {"one_time_keys" : json_result , "failures" : failures }
317
345
318
346
@defer .inlineCallbacks
347
+ @tag_args
319
348
def upload_keys_for_user (self , user_id , device_id , keys ):
320
349
321
350
time_now = self .clock .time_msec ()
@@ -329,19 +358,38 @@ def upload_keys_for_user(self, user_id, device_id, keys):
329
358
user_id ,
330
359
time_now ,
331
360
)
361
+ log_kv (
362
+ {
363
+ "message" : "Updating device_keys for user." ,
364
+ "user_id" : user_id ,
365
+ "device_id" : device_id ,
366
+ }
367
+ )
332
368
# TODO: Sign the JSON with the server key
333
369
changed = yield self .store .set_e2e_device_keys (
334
370
user_id , device_id , time_now , device_keys
335
371
)
336
372
if changed :
337
373
# Only notify about device updates *if* the keys actually changed
338
374
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 })
340
377
one_time_keys = keys .get ("one_time_keys" , None )
341
378
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
+ )
342
386
yield self ._upload_one_time_keys_for_user (
343
387
user_id , device_id , time_now , one_time_keys
344
388
)
389
+ else :
390
+ log_kv (
391
+ {"message" : "Did not update one_time_keys" , "reason" : "no keys given" }
392
+ )
345
393
346
394
# the device should have been registered already, but it may have been
347
395
# 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):
352
400
353
401
result = yield self .store .count_e2e_one_time_keys (user_id , device_id )
354
402
403
+ set_tag ("one_time_key_counts" , result )
355
404
return {"one_time_key_counts" : result }
356
405
357
406
@defer .inlineCallbacks
@@ -395,6 +444,7 @@ def _upload_one_time_keys_for_user(
395
444
(algorithm , key_id , encode_canonical_json (key ).decode ("ascii" ))
396
445
)
397
446
447
+ log_kv ({"message" : "Inserting new one_time_keys." , "keys" : new_keys })
398
448
yield self .store .add_e2e_one_time_keys (user_id , device_id , time_now , new_keys )
399
449
400
450
0 commit comments