@@ -181,19 +181,22 @@ func (s *StatRecorder) ReceiveRecord(r protocol.Record, connection *conn.Connect
181
181
// because we could missed some nicIngressEvents, the total duration may be negative
182
182
annotatedRecord .StartTs = math .MaxUint64
183
183
if hasNicInEvents {
184
- annotatedRecord . StartTs = min ( events .nicIngressEvents [0 ].GetTimestamp (), annotatedRecord . StartTs )
185
- }
186
- if hasTcpInEvents {
187
- annotatedRecord . StartTs = min ( events . tcpInEvents [ 0 ]. GetTimestamp (), annotatedRecord . StartTs )
188
- }
189
- if hasUserCopyEvents {
190
- annotatedRecord . StartTs = min ( events . userCopyEvents [ 0 ]. GetTimestamp (), annotatedRecord . StartTs )
191
- }
192
- if hasReadSyscallEvents {
193
- annotatedRecord .StartTs = min (events .readSyscallEvents [0 ].GetTimestamp (), annotatedRecord .StartTs )
184
+ nicInTimestamp , _ , ok := events .nicIngressEvents [0 ].GetMinIfItmestampAttr ( )
185
+ if ok {
186
+ annotatedRecord . StartTs = min ( uint64 ( nicInTimestamp ), annotatedRecord . StartTs )
187
+ }
188
+ } else if hasTcpInEvents {
189
+ annotatedRecord . StartTs = min ( events . tcpInEvents [ 0 ]. GetStartTs (), annotatedRecord . StartTs )
190
+ } else if hasUserCopyEvents {
191
+ annotatedRecord . StartTs = min ( events . userCopyEvents [ 0 ]. GetStartTs (), annotatedRecord . StartTs )
192
+ } else if hasReadSyscallEvents {
193
+ annotatedRecord .StartTs = min (events .readSyscallEvents [0 ].GetStartTs (), annotatedRecord .StartTs )
194
194
}
195
195
if hasDevOutEvents {
196
- annotatedRecord .EndTs = events .devOutEvents [len (events .devOutEvents )- 1 ].GetTimestamp ()
196
+ devOutTimestamp , _ , ok := events .devOutEvents [len (events .devOutEvents )- 1 ].GetMaxIfItmestampAttr ()
197
+ if ok {
198
+ annotatedRecord .EndTs = uint64 (devOutTimestamp )
199
+ }
197
200
}
198
201
if connection .IsSsl () {
199
202
annotatedRecord .ReqPlainTextSize = events .ingressMessage .ByteSize ()
@@ -205,28 +208,28 @@ func (s *StatRecorder) ReceiveRecord(r protocol.Record, connection *conn.Connect
205
208
annotatedRecord .TotalDuration = float64 (annotatedRecord .EndTs ) - float64 (annotatedRecord .StartTs )
206
209
}
207
210
if hasReadSyscallEvents && hasWriteSyscallEvents {
208
- annotatedRecord .BlackBoxDuration = float64 (events .writeSyscallEvents [len (events .writeSyscallEvents )- 1 ].GetTimestamp ()) - float64 (events .readSyscallEvents [0 ].GetTimestamp ())
211
+ annotatedRecord .BlackBoxDuration = float64 (events .writeSyscallEvents [len (events .writeSyscallEvents )- 1 ].GetEndTs ()) - float64 (events .readSyscallEvents [0 ].GetStartTs ())
209
212
} else {
210
213
annotatedRecord .BlackBoxDuration = float64 (events .egressMessage .TimestampNs ()) - float64 (events .ingressMessage .TimestampNs ())
211
214
}
212
215
if hasUserCopyEvents && hasTcpInEvents {
213
- annotatedRecord .ReadFromSocketBufferDuration = float64 (events .userCopyEvents [len (events .userCopyEvents )- 1 ].GetTimestamp ()) - float64 (events .tcpInEvents [0 ].GetTimestamp ())
216
+ annotatedRecord .ReadFromSocketBufferDuration = float64 (events .userCopyEvents [len (events .userCopyEvents )- 1 ].GetStartTs ()) - float64 (events .tcpInEvents [0 ].GetStartTs ())
214
217
}
215
218
if hasTcpInEvents && hasNicInEvents {
216
- annotatedRecord .CopyToSocketBufferDuration = float64 (events .tcpInEvents [len (events .tcpInEvents )- 1 ].GetTimestamp () - events .nicIngressEvents [0 ].GetTimestamp ())
219
+ annotatedRecord .CopyToSocketBufferDuration = float64 (events .tcpInEvents [len (events .tcpInEvents )- 1 ].GetStartTs () - events .nicIngressEvents [0 ].GetStartTs ())
217
220
}
218
221
annotatedRecord .ReqSyscallEventDetails = KernEventsToEventDetails [analysisCommon.SyscallEventDetail ](events .readSyscallEvents )
219
222
annotatedRecord .RespSyscallEventDetails = KernEventsToEventDetails [analysisCommon.SyscallEventDetail ](events .writeSyscallEvents )
220
223
annotatedRecord .ReqNicEventDetails = KernEventsToNicEventDetails (events .nicIngressEvents )
221
224
annotatedRecord .RespNicEventDetails = KernEventsToNicEventDetails (events .devOutEvents )
222
225
} else {
223
226
if hasWriteSyscallEvents {
224
- annotatedRecord .StartTs = events .writeSyscallEvents [ 0 ]. GetTimestamp ( )
227
+ annotatedRecord .StartTs = findMinTimestamp ( events .writeSyscallEvents , true )
225
228
} else {
226
229
annotatedRecord .StartTs = events .egressMessage .TimestampNs ()
227
230
}
228
231
if hasReadSyscallEvents {
229
- annotatedRecord .EndTs = events . readSyscallEvents [ len (events .readSyscallEvents ) - 1 ]. GetTimestamp ( )
232
+ annotatedRecord .EndTs = findMaxTimestamp (events .readSyscallEvents , false )
230
233
} else {
231
234
annotatedRecord .EndTs = events .ingressMessage .TimestampNs ()
232
235
}
@@ -242,19 +245,43 @@ func (s *StatRecorder) ReceiveRecord(r protocol.Record, connection *conn.Connect
242
245
annotatedRecord .TotalDuration = float64 (events .ingressMessage .TimestampNs ()) - float64 (events .egressMessage .TimestampNs ())
243
246
}
244
247
if hasNicInEvents && hasDevOutEvents {
245
- annotatedRecord .BlackBoxDuration = float64 (events .nicIngressEvents [len (events .nicIngressEvents )- 1 ].GetTimestamp ()) - float64 (events .devOutEvents [0 ].GetTimestamp ())
248
+ nicIngressTimestamp := int64 (0 )
249
+ for _ , nicIngressEvent := range events .nicIngressEvents {
250
+ _nicIngressTimestamp , _ , ok := nicIngressEvent .GetMinIfItmestampAttr ()
251
+ if ok {
252
+ nicIngressTimestamp = max (nicIngressTimestamp , _nicIngressTimestamp )
253
+ }
254
+ }
255
+
256
+ if nicIngressTimestamp != 0 {
257
+ nicEgressTimestamp := int64 (math .MaxInt64 )
258
+ for _ , devOutEvent := range events .devOutEvents {
259
+ _nicEgressTimestamp , _ , ok := devOutEvent .GetMaxIfItmestampAttr ()
260
+ if ok {
261
+ nicEgressTimestamp = min (nicEgressTimestamp , _nicEgressTimestamp )
262
+ }
263
+ }
264
+ if nicEgressTimestamp != int64 (math .MaxInt64 ) {
265
+ annotatedRecord .BlackBoxDuration = float64 (nicIngressTimestamp ) - float64 (nicEgressTimestamp )
266
+ } else {
267
+ annotatedRecord .BlackBoxDuration = - 1
268
+ }
269
+ nicEgressTimestamp ++
270
+ } else {
271
+ annotatedRecord .BlackBoxDuration = - 1
272
+ }
246
273
}
247
274
if (hasUserCopyEvents || hasReadSyscallEvents ) && hasTcpInEvents {
248
275
var readFromEndTime float64
249
276
if hasUserCopyEvents {
250
- readFromEndTime = float64 (events .userCopyEvents [len (events .userCopyEvents )- 1 ].GetTimestamp ())
277
+ readFromEndTime = float64 (events .userCopyEvents [len (events .userCopyEvents )- 1 ].GetStartTs ())
251
278
} else {
252
- readFromEndTime = float64 (events .readSyscallEvents [len (events .readSyscallEvents )- 1 ].GetTimestamp ())
279
+ readFromEndTime = float64 (events .readSyscallEvents [len (events .readSyscallEvents )- 1 ].GetEndTs ())
253
280
}
254
- annotatedRecord .ReadFromSocketBufferDuration = readFromEndTime - float64 (events .tcpInEvents [0 ].GetTimestamp ())
281
+ annotatedRecord .ReadFromSocketBufferDuration = readFromEndTime - float64 (events .tcpInEvents [0 ].GetStartTs ())
255
282
}
256
283
if hasTcpInEvents && hasNicInEvents {
257
- annotatedRecord .CopyToSocketBufferDuration = float64 (events .tcpInEvents [len (events .tcpInEvents )- 1 ].GetTimestamp () - events .nicIngressEvents [0 ].GetTimestamp ())
284
+ annotatedRecord .CopyToSocketBufferDuration = float64 (events .tcpInEvents [len (events .tcpInEvents )- 1 ].GetStartTs () - events .nicIngressEvents [0 ].GetStartTs ())
258
285
}
259
286
annotatedRecord .ReqSyscallEventDetails = KernEventsToEventDetails [analysisCommon.SyscallEventDetail ](events .writeSyscallEvents )
260
287
annotatedRecord .RespSyscallEventDetails = KernEventsToEventDetails [analysisCommon.SyscallEventDetail ](events .readSyscallEvents )
@@ -292,6 +319,30 @@ func (s *StatRecorder) ReceiveRecord(r protocol.Record, connection *conn.Connect
292
319
return nil
293
320
}
294
321
322
+ func findMaxTimestamp (events []conn.KernEvent , useStartTs bool ) uint64 {
323
+ var maxTimestamp uint64 = 0
324
+ for _ , each := range events {
325
+ if useStartTs {
326
+ maxTimestamp = max (maxTimestamp , each .GetStartTs ())
327
+ } else {
328
+ maxTimestamp = max (maxTimestamp , each .GetEndTs ())
329
+ }
330
+ }
331
+ return maxTimestamp
332
+ }
333
+
334
+ func findMinTimestamp (events []conn.KernEvent , useStartTs bool ) uint64 {
335
+ var minTimestamp uint64 = math .MaxUint64
336
+ for _ , each := range events {
337
+ if useStartTs {
338
+ minTimestamp = min (minTimestamp , each .GetStartTs ())
339
+ } else {
340
+ minTimestamp = min (minTimestamp , each .GetEndTs ())
341
+ }
342
+ }
343
+ return minTimestamp
344
+ }
345
+
295
346
func KernEventsToEventDetails [K analysisCommon.PacketEventDetail | analysisCommon.SyscallEventDetail ](kernEvents []conn.KernEvent ) []K {
296
347
if len (kernEvents ) == 0 {
297
348
return []K {}
@@ -300,7 +351,7 @@ func KernEventsToEventDetails[K analysisCommon.PacketEventDetail | analysisCommo
300
351
for _ , each := range kernEvents {
301
352
result = append (result , K {
302
353
ByteSize : each .GetLen (),
303
- Timestamp : each .GetTimestamp (),
354
+ Timestamp : each .GetStartTs (),
304
355
})
305
356
}
306
357
return result
@@ -315,7 +366,7 @@ func KernEventsToNicEventDetails(kernEvents []conn.KernEvent) []analysisCommon.N
315
366
PacketEventDetail : analysisCommon.PacketEventDetail {
316
367
317
368
ByteSize : each .GetLen (),
318
- Timestamp : each .GetTimestamp (),
369
+ Timestamp : each .GetStartTs (),
319
370
},
320
371
Attributes : each .GetAttributes (),
321
372
})
0 commit comments