in pkg/profiling/task/network/analyze/layer7/protocols/http1/sampling.go [55:108]
func (s *Sampler) AppendMetrics(config *SamplingConfig, duration time.Duration, request *reader.Request, response *reader.Response) {
if config == nil {
return
}
tracingContext, err := protocol.AnalyzeTracingContext(func(key string) string {
return request.Headers().Get(key)
})
if err != nil {
log.Warnf("analyze tracing context error: %v", err)
return
}
if tracingContext == nil {
return
}
uri := request.Original().RequestURI
// remove the query parameters
if i := strings.Index(uri, "?"); i > 0 {
uri = uri[0:i]
}
// find out with url rule is match
rule := config.findMatchesRule(uri)
if rule == nil {
return
}
statusCode := response.Original().StatusCode
var traceType string
var topN *metrics.TopN
if rule.When5XX && statusCode >= 500 && statusCode < 600 {
traceType = "status_5xx"
topN = s.Error5xxTraces
} else if rule.When4XX && statusCode >= 400 && statusCode < 500 {
traceType = "status_4xx"
topN = s.Error4xxTraces
} else if rule.MinDuration != nil && int64(*rule.MinDuration) <= duration.Milliseconds() {
traceType = "slow"
topN = s.SlowTraces
} else {
return
}
trace := &Trace{
Trace: tracingContext,
RequestURI: uri,
Request: request,
Response: response,
Type: traceType,
Settings: rule.Settings,
TaskConfig: config.ProfilingSampling,
}
topN.AddRecord(trace, duration.Milliseconds())
}