diff --git a/pkg/loadRequest/dns.go b/pkg/loadRequest/dns.go index de83caa49..362bbc0cd 100644 --- a/pkg/loadRequest/dns.go +++ b/pkg/loadRequest/dns.go @@ -35,33 +35,33 @@ type DnsRequestData struct { DnsServerAddr string PerRequestTimeoutInMs int Qps int - DurationInMs int + DurationInSecond int } // ------------------ type DelayMetric struct { // Mean is the mean request latency. - Mean time.Duration `json:"mean"` + Mean string `json:"mean"` // P50 is the 50th percentile request latency. - P50 time.Duration `json:"50th"` + P50 string `json:"50th"` // P90 is the 90th percentile request latency. - P90 time.Duration `json:"90th"` + P90 string `json:"90th"` // P95 is the 95th percentile request latency. - P95 time.Duration `json:"95th"` + P95 string `json:"95th"` // P99 is the 99th percentile request latency. - P99 time.Duration `json:"99th"` + P99 string `json:"99th"` // Max is the maximum observed request latency. - Max time.Duration `json:"max"` + Max string `json:"max"` // Min is the minimum observed request latency. - Min time.Duration `json:"min"` + Min string `json:"min"` } // final metric type DnsMetrics struct { StartTime time.Time EndTime time.Time - Duration time.Duration + Duration string TargetDomain string DnsServer string @@ -110,43 +110,43 @@ func ParseMetrics(final *DnsMetrics, validVals []float32) (*DnsMetrics, error) { if e != nil { return nil, fmt.Errorf("failed to parse mean delay, error=%v", e) } - final.DelayForSuccess.Mean = time.Duration(t) + final.DelayForSuccess.Mean = parseTime(time.Duration(t)) t, e = stats.Max(validVals) if e != nil { return nil, fmt.Errorf("failed to parse max delay, error=%v", e) } - final.DelayForSuccess.Max = time.Duration(t) + final.DelayForSuccess.Max = parseTime(time.Duration(t)) t, e = stats.Min(validVals) if e != nil { return nil, fmt.Errorf("failed to parse min delay, error=%v", e) } - final.DelayForSuccess.Min = time.Duration(t) + final.DelayForSuccess.Min = parseTime(time.Duration(t)) t, e = stats.Percentile(validVals, 50) if e != nil { return nil, fmt.Errorf("failed to parse 50 Percentile, error=%v", e) } - final.DelayForSuccess.P50 = time.Duration(t) + final.DelayForSuccess.P50 = parseTime(time.Duration(t)) t, e = stats.Percentile(validVals, 90) if e != nil { return nil, fmt.Errorf("failed to parse 90 Percentile, error=%v", e) } - final.DelayForSuccess.P90 = time.Duration(t) + final.DelayForSuccess.P90 = parseTime(time.Duration(t)) t, e = stats.Percentile(validVals, 95) if e != nil { return nil, fmt.Errorf("failed to parse 95 Percentile, error=%v", e) } - final.DelayForSuccess.P95 = time.Duration(t) + final.DelayForSuccess.P95 = parseTime(time.Duration(t)) t, e = stats.Percentile(validVals, 99) if e != nil { return nil, fmt.Errorf("failed to parse 99 Percentile, error=%v", e) } - final.DelayForSuccess.P99 = time.Duration(t) + final.DelayForSuccess.P99 = parseTime(time.Duration(t)) } return final, nil @@ -169,7 +169,7 @@ func DnsRequest(logger *zap.Logger, req *DnsRequestData) (result *DnsMetrics, er rl := ratelimit.New(req.Qps) var wg sync.WaitGroup - d := time.Duration(req.DurationInMs) * time.Millisecond + d := time.Duration(req.DurationInSecond) * time.Second ctx, cancel := context.WithTimeout(context.Background(), d) defer cancel() var duration time.Duration @@ -240,7 +240,7 @@ LOOP: } r.StartTime = start r.EndTime = end - r.Duration = duration + r.Duration = duration.String() r.TargetDomain = req.TargetDomain r.DnsServer = ServerAddress r.DnsMethod = string(req.Protocol) @@ -249,3 +249,7 @@ LOOP: return r, nil } + +func parseTime(t time.Duration) string { + return fmt.Sprintf("%.6fms", t.Seconds()*1000) +} diff --git a/pkg/loadRequest/dns_test.go b/pkg/loadRequest/dns_test.go index 72f70f670..3571c0ee5 100644 --- a/pkg/loadRequest/dns_test.go +++ b/pkg/loadRequest/dns_test.go @@ -25,7 +25,7 @@ var _ = Describe("test dns ", Label("dns"), func() { TargetDomain: "www.baidu.com", DnsServerAddr: dnsServer, PerRequestTimeoutInMs: 1000, - DurationInMs: 1000, + DurationInSecond: 1, Qps: 10, } @@ -55,7 +55,7 @@ var _ = Describe("test dns ", Label("dns"), func() { TargetDomain: "www.baidu.com", DnsServerAddr: dnsServer, PerRequestTimeoutInMs: 1000, - DurationInMs: 1000, + DurationInSecond: 1, Qps: 10, } @@ -84,7 +84,7 @@ var _ = Describe("test dns ", Label("dns"), func() { TargetDomain: "www.no-existed.com", DnsServerAddr: dnsServer, PerRequestTimeoutInMs: 1000, - DurationInMs: 1000, + DurationInSecond: 1, Qps: 10, } @@ -113,7 +113,7 @@ var _ = Describe("test dns ", Label("dns"), func() { TargetDomain: "wikipedia.org", DnsServerAddr: dnsServer, PerRequestTimeoutInMs: 1000, - DurationInMs: 1000, + DurationInSecond: 1, Qps: 10, } diff --git a/pkg/pluginManager/netdns/agentExecuteTask.go b/pkg/pluginManager/netdns/agentExecuteTask.go index 28cd1a690..6b6fdcfd1 100644 --- a/pkg/pluginManager/netdns/agentExecuteTask.go +++ b/pkg/pluginManager/netdns/agentExecuteTask.go @@ -18,18 +18,22 @@ import ( "strconv" "strings" "sync" + "time" ) func ParseSuccessCondition(successCondition *crd.NetSuccessCondition, metricResult *loadRequest.DnsMetrics) (failureReason string, err error) { + mean, _ := time.ParseDuration(metricResult.DelayForSuccess.Mean) + switch { case successCondition.SuccessRate != nil && metricResult.SuccessRate < *(successCondition.SuccessRate): failureReason = fmt.Sprintf("Success Rate %v is lower than request %v", metricResult.SuccessRate, *(successCondition.SuccessRate)) - case successCondition.MeanAccessDelayInMs != nil && metricResult.DelayForSuccess.Mean.Milliseconds() > *(successCondition.MeanAccessDelayInMs): - failureReason = fmt.Sprintf("mean delay %v ms is bigger than request %v ms", metricResult.DelayForSuccess.Mean.Milliseconds(), *(successCondition.MeanAccessDelayInMs)) + case successCondition.MeanAccessDelayInMs != nil && mean.Milliseconds() > *(successCondition.MeanAccessDelayInMs): + failureReason = fmt.Sprintf("mean delay %v ms is bigger than request %v ms", mean.Milliseconds(), *(successCondition.MeanAccessDelayInMs)) default: failureReason = "" err = nil } + return } @@ -47,7 +51,7 @@ func SendRequestAndReport(logger *zap.Logger, targetName string, req *loadReques report["FailureReason"] = failureReason return } - report["MeanDelay"] = result.DelayForSuccess.Mean.String() + report["MeanDelay"] = result.DelayForSuccess.Mean report["SucceedRate"] = fmt.Sprintf("%v", result.SuccessRate) failureReason, err = ParseSuccessCondition(successCondition, result) @@ -108,7 +112,7 @@ func (s *PluginNetDns) AgentExecuteTask(logger *zap.Logger, ctx context.Context, DnsServerAddr: server, PerRequestTimeoutInMs: int(*instance.Spec.Request.PerRequestTimeoutInMS), Qps: int(*instance.Spec.Request.QPS), - DurationInMs: int(*instance.Spec.Request.DurationInSecond), + DurationInSecond: int(*instance.Spec.Request.DurationInSecond), }}) } else { testTargetList = append(testTargetList, &testTarget{Name: "typeAAAA_" + server + "_" + instance.Spec.Request.Domain, Request: &loadRequest.DnsRequestData{ @@ -118,7 +122,7 @@ func (s *PluginNetDns) AgentExecuteTask(logger *zap.Logger, ctx context.Context, DnsServerAddr: server, PerRequestTimeoutInMs: int(*instance.Spec.Request.PerRequestTimeoutInMS), Qps: int(*instance.Spec.Request.QPS), - DurationInMs: int(*instance.Spec.Request.DurationInSecond), + DurationInSecond: int(*instance.Spec.Request.DurationInSecond), }}) } } @@ -142,7 +146,7 @@ func (s *PluginNetDns) AgentExecuteTask(logger *zap.Logger, ctx context.Context, DnsServerAddr: server, PerRequestTimeoutInMs: int(*instance.Spec.Request.PerRequestTimeoutInMS), Qps: int(*instance.Spec.Request.QPS), - DurationInMs: int(*instance.Spec.Request.DurationInSecond), + DurationInSecond: int(*instance.Spec.Request.DurationInSecond), }}) } else if ip.To4() == nil && *instance.Spec.Target.NetDnsTargetDns.TestIPv6 { testTargetList = append(testTargetList, &testTarget{Name: "typeAAAA_" + server + "_" + instance.Spec.Request.Domain, Request: &loadRequest.DnsRequestData{ @@ -152,7 +156,7 @@ func (s *PluginNetDns) AgentExecuteTask(logger *zap.Logger, ctx context.Context, DnsServerAddr: server, PerRequestTimeoutInMs: int(*instance.Spec.Request.PerRequestTimeoutInMS), Qps: int(*instance.Spec.Request.QPS), - DurationInMs: int(*instance.Spec.Request.DurationInSecond), + DurationInSecond: int(*instance.Spec.Request.DurationInSecond), }}) } } @@ -174,7 +178,7 @@ func (s *PluginNetDns) AgentExecuteTask(logger *zap.Logger, ctx context.Context, DnsServerAddr: server, PerRequestTimeoutInMs: int(*instance.Spec.Request.PerRequestTimeoutInMS), Qps: int(*instance.Spec.Request.QPS), - DurationInMs: int(*instance.Spec.Request.DurationInSecond), + DurationInSecond: int(*instance.Spec.Request.DurationInSecond), }}) } else if ip.To4() == nil && *instance.Spec.Target.NetDnsTargetDns.TestIPv6 { testTargetList = append(testTargetList, &testTarget{Name: "typeAAAA_" + server + "_" + instance.Spec.Request.Domain, Request: &loadRequest.DnsRequestData{ @@ -184,7 +188,7 @@ func (s *PluginNetDns) AgentExecuteTask(logger *zap.Logger, ctx context.Context, DnsServerAddr: server, PerRequestTimeoutInMs: int(*instance.Spec.Request.PerRequestTimeoutInMS), Qps: int(*instance.Spec.Request.QPS), - DurationInMs: int(*instance.Spec.Request.DurationInSecond), + DurationInSecond: int(*instance.Spec.Request.DurationInSecond), }}) } }