@@ -9,6 +9,10 @@ import (
9
9
"github.com/ipfs/go-peertaskqueue/peertask"
10
10
"github.com/ipfs/go-peertaskqueue/peertracker"
11
11
"github.com/libp2p/go-libp2p-core/peer"
12
+ "go.opentelemetry.io/otel"
13
+ "go.opentelemetry.io/otel/attribute"
14
+ "go.opentelemetry.io/otel/codes"
15
+ "go.opentelemetry.io/otel/trace"
12
16
13
17
"github.com/ipfs/go-graphsync"
14
18
"github.com/ipfs/go-graphsync/ipldutil"
@@ -50,6 +54,7 @@ func (rm *ResponseManager) terminateRequest(key responseKey) {
50
54
rm .connManager .Unprotect (key .p , key .requestID .Tag ())
51
55
delete (rm .inProgressResponses , key )
52
56
ipr .cancelFn ()
57
+ ipr .span .End ()
53
58
}
54
59
55
60
func (rm * ResponseManager ) processUpdate (key responseKey , update gsmsg.GraphSyncRequest ) {
@@ -58,6 +63,17 @@ func (rm *ResponseManager) processUpdate(key responseKey, update gsmsg.GraphSync
58
63
log .Warnf ("received update for non existent request, peer %s, request ID %d" , key .p .Pretty (), key .requestID )
59
64
return
60
65
}
66
+
67
+ _ , span := otel .Tracer ("graphsync" ).Start (trace .ContextWithSpan (rm .ctx , response .span ), "processUpdate" , trace .WithAttributes (
68
+ attribute .Int ("id" , int (update .ID ())),
69
+ attribute .Int ("priority" , int (update .Priority ())),
70
+ attribute .String ("root" , update .Root ().String ()),
71
+ attribute .Bool ("isCancel" , update .IsCancel ()),
72
+ attribute .Bool ("isUpdate" , update .IsUpdate ()),
73
+ attribute .StringSlice ("extensions" , update .ExtensionNames ()),
74
+ ))
75
+ defer span .End ()
76
+
61
77
if response .state != graphsync .Paused {
62
78
response .updates = append (response .updates , update )
63
79
select {
@@ -79,11 +95,15 @@ func (rm *ResponseManager) processUpdate(key responseKey, update gsmsg.GraphSync
79
95
})
80
96
if result .Err != nil {
81
97
response .state = graphsync .CompletingSend
98
+ response .span .RecordError (result .Err )
99
+ response .span .SetStatus (codes .Error , result .Err .Error ())
82
100
return
83
101
}
84
102
if result .Unpause {
85
103
err := rm .unpauseRequest (key .p , key .requestID )
86
104
if err != nil {
105
+ span .RecordError (err )
106
+ span .SetStatus (codes .Error , result .Err .Error ())
87
107
log .Warnf ("error unpausing request: %s" , err .Error ())
88
108
}
89
109
}
@@ -119,6 +139,13 @@ func (rm *ResponseManager) abortRequest(p peer.ID, requestID graphsync.RequestID
119
139
return errors .New ("could not find request" )
120
140
}
121
141
142
+ _ , span := otel .Tracer ("graphsync" ).Start (trace .ContextWithSpan (rm .ctx , response .span ), "abortRequest" )
143
+ defer span .End ()
144
+ span .RecordError (err )
145
+ span .SetStatus (codes .Error , err .Error ())
146
+ response .span .RecordError (err )
147
+ response .span .SetStatus (codes .Error , err .Error ())
148
+
122
149
if response .state != graphsync .Running {
123
150
_ = rm .responseAssembler .Transaction (p , requestID , func (rb responseassembler.ResponseBuilder ) error {
124
151
if ipldutil .IsContextCancelErr (err ) {
@@ -155,9 +182,17 @@ func (rm *ResponseManager) processRequests(p peer.ID, requests []gsmsg.GraphSync
155
182
rm .processUpdate (key , request )
156
183
continue
157
184
}
185
+ ctx , responseSpan := otel .Tracer ("graphsync" ).Start (rm .ctx , "response" , trace .WithAttributes (
186
+ attribute .Int ("id" , int (request .ID ())),
187
+ attribute .Int ("priority" , int (request .Priority ())),
188
+ attribute .String ("root" , request .Root ().String ()),
189
+ attribute .Bool ("isCancel" , request .IsCancel ()),
190
+ attribute .Bool ("isUpdate" , request .IsUpdate ()),
191
+ attribute .StringSlice ("extensions" , request .ExtensionNames ()),
192
+ ))
158
193
rm .connManager .Protect (p , request .ID ().Tag ())
159
194
rm .requestQueuedHooks .ProcessRequestQueuedHooks (p , request )
160
- ctx , cancelFn := context .WithCancel (rm . ctx )
195
+ ctx , cancelFn := context .WithCancel (ctx )
161
196
sub := notifications .NewTopicDataSubscriber (& subscriber {
162
197
p : key .p ,
163
198
request : request ,
@@ -176,6 +211,7 @@ func (rm *ResponseManager) processRequests(p peer.ID, requests []gsmsg.GraphSync
176
211
rm .inProgressResponses [key ] =
177
212
& inProgressResponseStatus {
178
213
ctx : ctx ,
214
+ span : responseSpan ,
179
215
cancelFn : cancelFn ,
180
216
subscriber : sub ,
181
217
request : request ,
@@ -204,6 +240,8 @@ func (rm *ResponseManager) taskDataForKey(key responseKey) queryexecutor.Respons
204
240
loader , traverser , isPaused , err := (& queryPreparer {rm .requestHooks , rm .responseAssembler , rm .linkSystem , rm .maxLinksPerRequest }).prepareQuery (response .ctx , key .p , response .request , response .signals , response .subscriber )
205
241
if err != nil {
206
242
response .state = graphsync .CompletingSend
243
+ response .span .RecordError (err )
244
+ response .span .SetStatus (codes .Error , err .Error ())
207
245
return queryexecutor.ResponseTask {Empty : true }
208
246
}
209
247
response .loader = loader
@@ -216,6 +254,7 @@ func (rm *ResponseManager) taskDataForKey(key responseKey) queryexecutor.Respons
216
254
response .state = graphsync .Running
217
255
return queryexecutor.ResponseTask {
218
256
Ctx : response .ctx ,
257
+ Span : response .span ,
219
258
Empty : false ,
220
259
Subscriber : response .subscriber ,
221
260
Request : response .request ,
@@ -249,6 +288,8 @@ func (rm *ResponseManager) finishTask(task *peertask.Task, err error) {
249
288
log .Infow ("graphsync response processing complete (messages stil sending)" , "request id" , key .requestID , "peer" , key .p , "total time" , time .Since (response .startTime ))
250
289
251
290
if err != nil {
291
+ response .span .RecordError (err )
292
+ response .span .SetStatus (codes .Error , err .Error ())
252
293
log .Infof ("response failed: %w" , err )
253
294
}
254
295
0 commit comments