@@ -56,17 +56,22 @@ func (rm *ResponseManager) terminateRequest(key responseKey) {
56
56
ipr .span .End ()
57
57
}
58
58
59
- func (rm * ResponseManager ) processUpdate (key responseKey , update gsmsg.GraphSyncRequest ) {
59
+ func (rm * ResponseManager ) processUpdate (ctx context. Context , key responseKey , update gsmsg.GraphSyncRequest ) {
60
60
response , ok := rm .inProgressResponses [key ]
61
61
if ! ok || response .state == graphsync .CompletingSend {
62
62
log .Warnf ("received update for non existent request, peer %s, request ID %d" , key .p .Pretty (), key .requestID )
63
63
return
64
64
}
65
65
66
- _ , span := otel .Tracer ("graphsync" ).Start (trace .ContextWithSpan (rm .ctx , response .span ), "processUpdate" , trace .WithAttributes (
67
- attribute .Int ("id" , int (update .ID ())),
68
- attribute .StringSlice ("extensions" , update .ExtensionNames ()),
69
- ))
66
+ _ , span := otel .Tracer ("graphsync" ).Start (
67
+ trace .ContextWithSpan (ctx , response .span ),
68
+ "processUpdate" ,
69
+ trace .WithLinks (trace .LinkFromContext (ctx )),
70
+ trace .WithAttributes (
71
+ attribute .Int ("id" , int (update .ID ())),
72
+ attribute .StringSlice ("extensions" , update .ExtensionNames ()),
73
+ ))
74
+
70
75
defer span .End ()
71
76
72
77
if response .state != graphsync .Paused {
@@ -125,15 +130,18 @@ func (rm *ResponseManager) unpauseRequest(p peer.ID, requestID graphsync.Request
125
130
return nil
126
131
}
127
132
128
- func (rm * ResponseManager ) abortRequest (p peer.ID , requestID graphsync.RequestID , err error ) error {
133
+ func (rm * ResponseManager ) abortRequest (ctx context. Context , p peer.ID , requestID graphsync.RequestID , err error ) error {
129
134
key := responseKey {p , requestID }
130
135
rm .responseQueue .Remove (key , key .p )
131
136
response , ok := rm .inProgressResponses [key ]
132
137
if ! ok || response .state == graphsync .CompletingSend {
133
138
return errors .New ("could not find request" )
134
139
}
135
140
136
- _ , span := otel .Tracer ("graphsync" ).Start (trace .ContextWithSpan (rm .ctx , response .span ), "abortRequest" )
141
+ _ , span := otel .Tracer ("graphsync" ).Start (trace .ContextWithSpan (ctx , response .span ),
142
+ "abortRequest" ,
143
+ trace .WithLinks (trace .LinkFromContext (ctx )),
144
+ )
137
145
defer span .End ()
138
146
span .RecordError (err )
139
147
span .SetStatus (codes .Error , err .Error ())
@@ -166,25 +174,38 @@ func (rm *ResponseManager) abortRequest(p peer.ID, requestID graphsync.RequestID
166
174
}
167
175
168
176
func (rm * ResponseManager ) processRequests (p peer.ID , requests []gsmsg.GraphSyncRequest ) {
177
+ ctx , messageSpan := otel .Tracer ("graphsync" ).Start (
178
+ rm .ctx ,
179
+ "requestMessage" ,
180
+ trace .WithAttributes (attribute .String ("peerID" , p .Pretty ())),
181
+ )
182
+ defer messageSpan .End ()
183
+
169
184
for _ , request := range requests {
170
185
key := responseKey {p : p , requestID : request .ID ()}
171
186
if request .IsCancel () {
172
- _ = rm .abortRequest (p , request .ID (), ipldutil.ContextCancelError {})
187
+ _ = rm .abortRequest (ctx , p , request .ID (), ipldutil.ContextCancelError {})
173
188
continue
174
189
}
175
190
if request .IsUpdate () {
176
- rm .processUpdate (key , request )
191
+ rm .processUpdate (ctx , key , request )
177
192
continue
178
193
}
179
194
rm .connManager .Protect (p , request .ID ().Tag ())
180
- ctx := rm .requestQueuedHooks .ProcessRequestQueuedHooks (p , request , rm .ctx )
181
- ctx , responseSpan := otel .Tracer ("graphsync" ).Start (ctx , "response" , trace .WithAttributes (
182
- attribute .Int ("id" , int (request .ID ())),
183
- attribute .Int ("priority" , int (request .Priority ())),
184
- attribute .String ("root" , request .Root ().String ()),
185
- attribute .StringSlice ("extensions" , request .ExtensionNames ()),
186
- ))
187
- ctx , cancelFn := context .WithCancel (ctx )
195
+ // don't use `ctx` which has the "message" trace, but rm.ctx for a fresh trace which allows
196
+ // for a request hook to join this particular response up to an existing external trace
197
+ rctx := rm .requestQueuedHooks .ProcessRequestQueuedHooks (p , request , rm .ctx )
198
+ rctx , responseSpan := otel .Tracer ("graphsync" ).Start (
199
+ rctx ,
200
+ "response" ,
201
+ trace .WithLinks (trace .LinkFromContext (ctx )),
202
+ trace .WithAttributes (
203
+ attribute .Int ("id" , int (request .ID ())),
204
+ attribute .Int ("priority" , int (request .Priority ())),
205
+ attribute .String ("root" , request .Root ().String ()),
206
+ attribute .StringSlice ("extensions" , request .ExtensionNames ()),
207
+ ))
208
+ rctx , cancelFn := context .WithCancel (rctx )
188
209
sub := & subscriber {
189
210
p : key .p ,
190
211
request : request ,
@@ -202,7 +223,7 @@ func (rm *ResponseManager) processRequests(p peer.ID, requests []gsmsg.GraphSync
202
223
203
224
rm .inProgressResponses [key ] =
204
225
& inProgressResponseStatus {
205
- ctx : ctx ,
226
+ ctx : rctx ,
206
227
span : responseSpan ,
207
228
cancelFn : cancelFn ,
208
229
request : request ,
0 commit comments