fix(gateway): preserve paced qualification traffic
Verify Data Plane / gateway (push) Successful in 2m8s

This commit is contained in:
sechmachine
2026-07-30 16:51:19 +07:00
parent d13a953711
commit 78e4709c90
5 changed files with 125 additions and 18 deletions
+29 -5
View File
@@ -76,6 +76,11 @@ type qualificationProcessRecordResult struct {
RecordingElapsed time.Duration
}
type qualificationProcessTimingSample struct {
elapsed time.Duration
observation mediaTimingObservation
}
type qualificationProcessRecorder struct {
mu sync.Mutex
active bool
@@ -89,6 +94,8 @@ type qualificationProcessRecorder struct {
recordErr error
tickerStop chan struct{}
tickerDone chan struct{}
timingSamples chan qualificationProcessTimingSample
timingDone chan struct{}
clock time.Duration
}
@@ -135,6 +142,9 @@ func (r *qualificationProcessRecorder) start(request qualificationProcessRecordR
r.clock = clock
r.tickerStop = make(chan struct{})
r.tickerDone = make(chan struct{})
r.timingSamples = make(chan qualificationProcessTimingSample, 4096)
r.timingDone = make(chan struct{})
go r.writeTimings()
go r.sampleResources()
return nil
}
@@ -142,13 +152,24 @@ func (r *qualificationProcessRecorder) start(request qualificationProcessRecordR
func (r *qualificationProcessRecorder) observe(observation mediaTimingObservation) {
r.mu.Lock()
defer r.mu.Unlock()
if !r.active || r.recordErr != nil {
if !r.active {
return
}
_, r.recordErr = fmt.Fprintf(r.rawBuffered, "%d,%d,%d,%d\n",
time.Since(r.started).Nanoseconds(), observation.QueueDelay.Nanoseconds(),
observation.ProcessingDelay.Nanoseconds(), observation.PacingDelay.Nanoseconds())
r.samples++
r.timingSamples <- qualificationProcessTimingSample{
elapsed: time.Since(r.started), observation: observation,
}
}
func (r *qualificationProcessRecorder) writeTimings() {
defer close(r.timingDone)
for sample := range r.timingSamples {
if r.recordErr == nil {
_, r.recordErr = fmt.Fprintf(r.rawBuffered, "%d,%d,%d,%d\n",
sample.elapsed.Nanoseconds(), sample.observation.QueueDelay.Nanoseconds(),
sample.observation.ProcessingDelay.Nanoseconds(), sample.observation.PacingDelay.Nanoseconds())
}
r.samples++
}
}
func (r *qualificationProcessRecorder) sampleResources() {
@@ -177,9 +198,12 @@ func (r *qualificationProcessRecorder) stop() (qualificationProcessRecordResult,
}
r.active = false
stop, done := r.tickerStop, r.tickerDone
timings, timingDone := r.timingSamples, r.timingDone
close(timings)
r.mu.Unlock()
close(stop)
<-done
<-timingDone
r.mu.Lock()
r.resources = append(r.resources, qualificationRuntimeSample(r.started))