network/benchmarks/netperf/nptest/parsers/json_parsers.go (69 lines of code) (raw):
package parsers
import (
"encoding/json"
"math/bits"
)
func ParseIperfTcpResults(output string) string {
var iperfOutput IperfTcpCommandOutput
err := json.Unmarshal([]byte(output), &iperfOutput)
if err != nil {
return "{\"error\": \"Failed to parse JSON output\", \"message\": \"" + err.Error() + "\"}"
}
// Calculate the min, max and mean rtts by aggregating the streams
var sumMeanRtt uint
var minRtt uint = 1<<bits.UintSize - 1
var maxRtt uint
for _, stream := range iperfOutput.End.Streams {
sumMeanRtt += stream.Sender.MeanRtt
minRtt = min(minRtt, stream.Sender.MinRtt)
maxRtt = max(maxRtt, stream.Sender.MaxRtt)
}
var outputResult IperfTcpParsedResult
outputResult.TestInfo = IperfTestInfo{
Protocol: iperfOutput.Start.TestStart.Protocol,
Streams: iperfOutput.Start.TestStart.NumStreams,
BlkSize: iperfOutput.Start.TestStart.BlkSize,
Duration: iperfOutput.Start.TestStart.Duration,
Mss: iperfOutput.Start.TcpMss,
}
outputResult.TotalThroughput = iperfOutput.End.SumSent.BitsPerSecond / 1e6
outputResult.MeanRoundTripTime = float64(sumMeanRtt) / float64(len(iperfOutput.End.Streams))
outputResult.MinRoundTripTime = minRtt
outputResult.MaxRoundTripTime = maxRtt
outputResult.Retransmits = iperfOutput.End.SumSent.Retransmits
outputResult.CPUUtilization = iperfOutput.End.CPUUtilizationPercent
parsedJson, err := json.Marshal(outputResult)
if err != nil {
return "{\"error\": \"Failed to marshal JSON output\", \"message\": \"" + err.Error() + "\"}"
}
return string(parsedJson)
}
func ParseIperfUdpResults(output string) string {
var iperfOutput IperfUdpCommandOutput
err := json.Unmarshal([]byte(output), &iperfOutput)
if err != nil {
return "{\"error\": \"Failed to parse JSON output\", \"message\": \"" + err.Error() + "\"}"
}
// Calculate the total out of order packets
var totalOutOfOrderPackets int
for _, stream := range iperfOutput.End.Streams {
totalOutOfOrderPackets += stream.Udp.OutOfOrderPackets
}
var outputResult IperfUdpParsedResult
outputResult.TestInfo = IperfTestInfo{
Protocol: iperfOutput.Start.TestStart.Protocol,
Streams: iperfOutput.Start.TestStart.NumStreams,
BlkSize: iperfOutput.Start.TestStart.BlkSize,
Duration: iperfOutput.Start.TestStart.Duration,
}
outputResult.TotalThroughput = iperfOutput.End.Sum.BitsPerSecond / 1e6
outputResult.Jitter = iperfOutput.End.Sum.Jitter
outputResult.LostPackets = iperfOutput.End.Sum.LostPackets
outputResult.TotalPackets = iperfOutput.End.Sum.Packets
outputResult.LostPercent = iperfOutput.End.Sum.LostPercent
outputResult.TotalOutOfOrderPackets = totalOutOfOrderPackets
outputResult.CPUUtilization = iperfOutput.End.CPUUtilizationPercent
parsedJson, err := json.Marshal(outputResult)
if err != nil {
return "{\"error\": \"Failed to marshal JSON output\", \"message\": \"" + err.Error() + "\"}"
}
return string(parsedJson)
}