func()

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())
}