From 1a386518880049dafb8d1a6cf47d63d9ac0bf726 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Sun, 24 Dec 2023 00:09:19 +0100 Subject: [PATCH] plot improvements and fixes --- .gitignore | 2 +- cmd/benchmark.go | 4 +- cmd/plot.go | 139 ++--- cmd/plot_test.go | 67 +-- cmd/report.go | 14 +- cmd/report_test.go | 8 +- cmd/result.go | 11 +- cmd/root.go | 6 +- cmd/test-boxplot-latency.png | Bin 11008 -> 0 bytes cmd/test-boxplot-latency.svg | 44 ++ cmd/test-errorrate-lineplot.png | Bin 13560 -> 0 bytes cmd/test-errorrate-lineplot.svg | 55 ++ cmd/test-histogram-latency.png | Bin 12920 -> 0 bytes cmd/test-histogram-latency.svg | 81 +++ cmd/test-latency-lineplot.png | Bin 29527 -> 0 bytes cmd/test-latency-lineplot.svg | 122 ++++ cmd/test-responses-barchart.png | Bin 17195 -> 0 bytes cmd/test-responses-barchart.svg | 51 ++ cmd/test-throughput-lineplot.png | Bin 15212 -> 0 bytes cmd/test-throughput-lineplot.svg | 66 +++ docs/graphs.md | 14 +- docs/graphs/errorrate-lineplot.png | Bin 12826 -> 0 bytes docs/graphs/errorrate-lineplot.svg | 54 ++ docs/graphs/latency-boxplot.png | Bin 14522 -> 0 bytes docs/graphs/latency-boxplot.svg | 824 ++++++++++++++++++++++++++++ docs/graphs/latency-histogram.png | Bin 14188 -> 0 bytes docs/graphs/latency-histogram.svg | 93 ++++ docs/graphs/latency-lineplot.png | Bin 48731 -> 0 bytes docs/graphs/latency-lineplot.svg | 181 ++++++ docs/graphs/responses-barchart.png | Bin 18098 -> 0 bytes docs/graphs/responses-barchart.svg | 49 ++ docs/graphs/throughput-lineplot.png | Bin 49836 -> 0 bytes docs/graphs/throughput-lineplot.svg | 72 +++ docs/index.md | 2 +- 34 files changed, 1827 insertions(+), 132 deletions(-) delete mode 100644 cmd/test-boxplot-latency.png create mode 100644 cmd/test-boxplot-latency.svg delete mode 100644 cmd/test-errorrate-lineplot.png create mode 100644 cmd/test-errorrate-lineplot.svg delete mode 100644 cmd/test-histogram-latency.png create mode 100644 cmd/test-histogram-latency.svg delete mode 100644 cmd/test-latency-lineplot.png create mode 100644 cmd/test-latency-lineplot.svg delete mode 100644 cmd/test-responses-barchart.png create mode 100644 cmd/test-responses-barchart.svg delete mode 100644 cmd/test-throughput-lineplot.png create mode 100644 cmd/test-throughput-lineplot.svg delete mode 100644 docs/graphs/errorrate-lineplot.png create mode 100644 docs/graphs/errorrate-lineplot.svg delete mode 100644 docs/graphs/latency-boxplot.png create mode 100644 docs/graphs/latency-boxplot.svg delete mode 100644 docs/graphs/latency-histogram.png create mode 100644 docs/graphs/latency-histogram.svg delete mode 100644 docs/graphs/latency-lineplot.png create mode 100644 docs/graphs/latency-lineplot.svg delete mode 100644 docs/graphs/responses-barchart.png create mode 100644 docs/graphs/responses-barchart.svg delete mode 100644 docs/graphs/throughput-lineplot.png create mode 100644 docs/graphs/throughput-lineplot.svg diff --git a/.gitignore b/.gitignore index d83253e..e05cee3 100644 --- a/.gitignore +++ b/.gitignore @@ -37,7 +37,7 @@ dist/ report/ dnspyre -graphs*/ +/graphs*/ # Jekyll documentation _site diff --git a/cmd/benchmark.go b/cmd/benchmark.go index 4584b53..bda4453 100644 --- a/cmd/benchmark.go +++ b/cmd/benchmark.go @@ -149,7 +149,7 @@ type Benchmark struct { // PlotDir controls where the generated graphs are exported. If set to empty (""), which is default value. Then no graphs are generated. PlotDir string - // PlotFormat controls the format of generated graphs. Supported values are "png" and "jpg". + // PlotFormat controls the format of generated graphs. Supported values are "svg", "png" and "jpg". PlotFormat string // DohMethod controls HTTP method used for sending DoH requests. Supported values are "post" and "get". Default is "post". @@ -460,8 +460,6 @@ func (b *Benchmark) Run(ctx context.Context) ([]*ResultStats, error) { edns0.SetDo(true) } - st.Counters.Total++ - start := time.Now() reqTimeoutCtx, cancel := context.WithTimeout(ctx, b.RequestTimeout) diff --git a/cmd/plot.go b/cmd/plot.go index 0a47289..6854025 100644 --- a/cmd/plot.go +++ b/cmd/plot.go @@ -5,6 +5,7 @@ import ( "image/color" "os" "sort" + "time" "github.com/miekg/dns" "github.com/montanaflynn/stats" @@ -13,6 +14,7 @@ import ( "gonum.org/v1/plot/plotter" "gonum.org/v1/plot/plotutil" "gonum.org/v1/plot/vg" + "gonum.org/v1/plot/vg/draw" ) func plotHistogramLatency(file string, times []Datapoint) { @@ -22,7 +24,7 @@ func plotHistogramLatency(file string, times []Datapoint) { } var values plotter.Values for _, v := range times { - values = append(values, v.Duration) + values = append(values, float64(v.Duration.Milliseconds())) } p := plot.New() p.Title.Text = "Latencies distribution" @@ -35,7 +37,7 @@ func plotHistogramLatency(file string, times []Datapoint) { p.X.Tick.Marker = hplot.Ticks{N: 3, Format: "%.0f"} p.Y.Label.Text = "Number of requests" p.Y.Tick.Marker = hplot.Ticks{N: 3, Format: "%.0f"} - hist.FillColor = color.RGBA{R: 175, G: 238, B: 238} + hist.FillColor = color.RGBA{R: 175, G: 238, B: 238, A: 255} p.Add(hist) if err := p.Save(6*vg.Inch, 6*vg.Inch, file); err != nil { @@ -50,7 +52,7 @@ func plotBoxPlotLatency(file, server string, times []Datapoint) { } var values plotter.Values for _, v := range times { - values = append(values, v.Duration) + values = append(values, float64(v.Duration.Milliseconds())) } p := plot.New() p.Title.Text = "Latencies distribution" @@ -62,7 +64,7 @@ func plotBoxPlotLatency(file, server string, times []Datapoint) { if err != nil { panic(err) } - boxplot.FillColor = color.RGBA{R: 127, G: 188, B: 165, A: 1} + boxplot.FillColor = color.RGBA{R: 127, G: 188, B: 165, A: 255} p.Add(boxplot) if err := p.Save(6*vg.Inch, 6*vg.Inch, file); err != nil { @@ -82,13 +84,13 @@ func plotResponses(file string, rcodes map[int]int64) { sort.Ints(sortedKeys) colors := []color.Color{ - color.RGBA{R: 122, G: 195, B: 106}, - color.RGBA{R: 241, G: 90, B: 96}, - color.RGBA{R: 90, G: 155, B: 212}, - color.RGBA{R: 250, G: 167, B: 91}, - color.RGBA{R: 158, G: 103, B: 171}, - color.RGBA{R: 206, G: 112, B: 88}, - color.RGBA{R: 215, G: 127, B: 180}, + color.RGBA{R: 122, G: 195, B: 106, A: 255}, + color.RGBA{R: 241, G: 90, B: 96, A: 255}, + color.RGBA{R: 90, G: 155, B: 212, A: 255}, + color.RGBA{R: 250, G: 167, B: 91, A: 255}, + color.RGBA{R: 158, G: 103, B: 171, A: 255}, + color.RGBA{R: 206, G: 112, B: 88, A: 255}, + color.RGBA{R: 215, G: 127, B: 180, A: 255}, } colors = append(colors, plotutil.DarkColors...) @@ -122,7 +124,7 @@ func plotResponses(file string, rcodes map[int]int64) { } } -func plotLineThroughput(file string, times []Datapoint) { +func plotLineThroughput(file string, benchStart time.Time, times []Datapoint) { if len(times) == 0 { // nothing to plot return @@ -131,14 +133,12 @@ func plotLineThroughput(file string, times []Datapoint) { m := make(map[int64]int64) if len(times) != 0 { - first := times[0].Start.Unix() - for _, v := range times { - unix := v.Start.Unix() - first - if _, ok := m[unix]; !ok { - m[unix] = 0 + offset := v.Start.Unix() - benchStart.Unix() + if _, ok := m[offset]; !ok { + m[offset] = 0 } - m[unix]++ + m[offset]++ } } @@ -158,13 +158,16 @@ func plotLineThroughput(file string, times []Datapoint) { p.Y.Tick.Marker = hplot.Ticks{N: 3, Format: "%.0f"} l, err := plotter.NewLine(values) - l.FillColor = color.RGBA{R: 175, G: 238, B: 238} + l.Width = vg.Points(0.5) + l.FillColor = color.RGBA{R: 175, G: 238, B: 238, A: 255} if err != nil { panic(err) } p.Add(l) scatter, err := plotter.NewScatter(values) + scatter.GlyphStyle.Shape = draw.CircleGlyph{} + if err != nil { panic(err) } @@ -182,58 +185,32 @@ type latencyMeasurements struct { p50 float64 } -func plotLineLatencies(file string, times []Datapoint) { +func plotLineLatencies(file string, benchStart time.Time, times []Datapoint) { if len(times) == 0 { // nothing to plot return } - m := make(map[int64]latencyMeasurements) + measurements := make(map[int64]latencyMeasurements) timings := make([]float64, 0) - if len(times) != 0 { - first := times[0].Start.Unix() - last := int64(0) + last := times[0].Start.Unix() - benchStart.Unix() - for _, v := range times { - unix := v.Start.Unix() - first - if _, ok := m[unix]; !ok { - m[unix] = latencyMeasurements{} - } - if unix != last { - p99, err := stats.Percentile(timings, 99) - if err != nil { - panic(err) - } - p95, err := stats.Percentile(timings, 95) - if err != nil { - panic(err) - } - p90, err := stats.Percentile(timings, 90) - if err != nil { - panic(err) - } - p50, err := stats.Percentile(timings, 50) - if err != nil { - panic(err) - } - measure := m[unix] - measure.p99 = p99 - measure.p95 = p95 - measure.p90 = p90 - measure.p50 = p50 - m[unix] = measure - last = unix - } - timings = append(timings, v.Duration) + for _, v := range times { + offset := v.Start.Unix() - benchStart.Unix() + if offset != last { + collectMeasurements(timings, measurements, last) + last = offset } + timings = append(timings, float64(v.Duration.Milliseconds())) } + collectMeasurements(timings, measurements, last) var p99values plotter.XYs var p95values plotter.XYs var p90values plotter.XYs var p50values plotter.XYs - for k, v := range m { + for k, v := range measurements { p99values = append(p99values, plotter.XY{X: float64(k), Y: v.p99}) p95values = append(p95values, plotter.XY{X: float64(k), Y: v.p95}) p90values = append(p90values, plotter.XY{X: float64(k), Y: v.p90}) @@ -268,7 +245,32 @@ func plotLineLatencies(file string, times []Datapoint) { } } -func plotErrorRate(file string, times []ErrorDatapoint) { +func collectMeasurements(timings []float64, measurements map[int64]latencyMeasurements, offset int64) { + p99, err := stats.Percentile(timings, 99) + if err != nil { + panic(err) + } + p95, err := stats.Percentile(timings, 95) + if err != nil { + panic(err) + } + p90, err := stats.Percentile(timings, 90) + if err != nil { + panic(err) + } + p50, err := stats.Percentile(timings, 50) + if err != nil { + panic(err) + } + measure := latencyMeasurements{} + measure.p99 = p99 + measure.p95 = p95 + measure.p90 = p90 + measure.p50 = p50 + measurements[offset] = measure +} + +func plotErrorRate(file string, benchStart time.Time, times []ErrorDatapoint) { if len(times) == 0 { // nothing to plot return @@ -276,16 +278,12 @@ func plotErrorRate(file string, times []ErrorDatapoint) { var values plotter.XYs m := make(map[int64]int64) - if len(times) != 0 { - first := times[0].Start.Unix() - - for _, v := range times { - unix := v.Start.Unix() - first - if _, ok := m[unix]; !ok { - m[unix] = 0 - } - m[unix]++ + for _, v := range times { + offset := v.Start.Unix() - benchStart.Unix() + if _, ok := m[offset]; !ok { + m[offset] = 0 } + m[offset]++ } for k, v := range m { @@ -304,7 +302,8 @@ func plotErrorRate(file string, times []ErrorDatapoint) { p.Y.Tick.Marker = hplot.Ticks{N: 3, Format: "%.0f"} l, err := plotter.NewLine(values) - l.FillColor = plotutil.SoftColors[0] + l.Width = vg.Points(0.5) + if err != nil { panic(err) } @@ -314,6 +313,9 @@ func plotErrorRate(file string, times []ErrorDatapoint) { if err != nil { panic(err) } + scatter.GlyphStyle.Color = color.RGBA{R: 238, G: 46, B: 47, A: 255} + scatter.GlyphStyle.Shape = draw.CircleGlyph{} + p.Add(scatter) if err := p.Save(6*vg.Inch, 6*vg.Inch, file); err != nil { @@ -334,6 +336,7 @@ func plotLine(p *plot.Plot, values plotter.XYs, color color.Color, fill color.Co if err != nil { panic(err) } - scatter.Color = color + scatter.GlyphStyle.Color = color + scatter.GlyphStyle.Shape = draw.CircleGlyph{} p.Add(scatter) } diff --git a/cmd/plot_test.go b/cmd/plot_test.go index 5bf37db..9783fd8 100644 --- a/cmd/plot_test.go +++ b/cmd/plot_test.go @@ -9,28 +9,29 @@ import ( "github.com/stretchr/testify/require" ) +var testStart = time.Now() + var testDatapoints = []Datapoint{ - {Start: time.Now(), Duration: 100}, - {Start: time.Now().Add(time.Second), Duration: 200}, - {Start: time.Now().Add(2 * time.Second), Duration: 300}, - {Start: time.Now().Add(3 * time.Second), Duration: 100}, - {Start: time.Now().Add(4 * time.Second), Duration: 150}, - {Start: time.Now().Add(5 * time.Second), Duration: 200}, - {Start: time.Now().Add(6 * time.Second), Duration: 200}, - {Start: time.Now().Add(7 * time.Second), Duration: 300}, - {Start: time.Now().Add(8 * time.Second), Duration: 350}, - {Start: time.Now().Add(9 * time.Second), Duration: 100}, - {Start: time.Now().Add(10 * time.Second), Duration: 200}, + {Start: testStart, Duration: 100 * time.Millisecond}, + {Start: testStart.Add(time.Second), Duration: 200 * time.Millisecond}, + {Start: testStart.Add(2 * time.Second), Duration: 300 * time.Millisecond}, + {Start: testStart.Add(3 * time.Second), Duration: 100 * time.Millisecond}, + {Start: testStart.Add(4 * time.Second), Duration: 150 * time.Millisecond}, + {Start: testStart.Add(5 * time.Second), Duration: 200 * time.Millisecond}, + {Start: testStart.Add(6 * time.Second), Duration: 200 * time.Millisecond}, + {Start: testStart.Add(7 * time.Second), Duration: 300 * time.Millisecond}, + {Start: testStart.Add(8 * time.Second), Duration: 350 * time.Millisecond}, + {Start: testStart.Add(9 * time.Second), Duration: 100 * time.Millisecond}, + {Start: testStart.Add(10 * time.Second), Duration: 200 * time.Millisecond}, } var testErrorDatapoints = []ErrorDatapoint{ - {Start: time.Now()}, - {Start: time.Now().Add(2 * time.Second)}, - {Start: time.Now().Add(3 * time.Second)}, - {Start: time.Now().Add(4 * time.Second)}, - {Start: time.Now().Add(5 * time.Second)}, - {Start: time.Now().Add(6 * time.Second)}, - {Start: time.Now().Add(7 * time.Second)}, + {Start: testStart.Add(2 * time.Second)}, + {Start: testStart.Add(3 * time.Second)}, + {Start: testStart.Add(4 * time.Second)}, + {Start: testStart.Add(5 * time.Second)}, + {Start: testStart.Add(6 * time.Second)}, + {Start: testStart.Add(7 * time.Second)}, } var testRcodes = map[int]int64{ @@ -42,10 +43,10 @@ var testRcodes = map[int]int64{ func Test_plotHistogramLatency(t *testing.T) { dir := t.TempDir() - file := dir + "/histogram-latency.png" + file := dir + "/histogram-latency.svg" plotHistogramLatency(file, testDatapoints) - expected, err := os.ReadFile("test-histogram-latency.png") + expected, err := os.ReadFile("test-histogram-latency.svg") require.NoError(t, err) actual, err := os.ReadFile(file) @@ -57,10 +58,10 @@ func Test_plotHistogramLatency(t *testing.T) { func Test_plotBoxPlotLatency(t *testing.T) { dir := t.TempDir() - file := dir + "/boxplot-latency.png" + file := dir + "/boxplot-latency.svg" plotBoxPlotLatency(file, "127.0.0.1", testDatapoints) - expected, err := os.ReadFile("test-boxplot-latency.png") + expected, err := os.ReadFile("test-boxplot-latency.svg") require.NoError(t, err) actual, err := os.ReadFile(file) @@ -72,10 +73,10 @@ func Test_plotBoxPlotLatency(t *testing.T) { func Test_plotResponses(t *testing.T) { dir := t.TempDir() - file := dir + "/responses-barchart.png" + file := dir + "/responses-barchart.svg" plotResponses(file, testRcodes) - expected, err := os.ReadFile("test-responses-barchart.png") + expected, err := os.ReadFile("test-responses-barchart.svg") require.NoError(t, err) actual, err := os.ReadFile(file) @@ -87,10 +88,10 @@ func Test_plotResponses(t *testing.T) { func Test_plotLineThroughput(t *testing.T) { dir := t.TempDir() - file := dir + "/throughput-lineplot.png" - plotLineThroughput(file, testDatapoints) + file := dir + "/throughput-lineplot.svg" + plotLineThroughput(file, testStart, testDatapoints) - expected, err := os.ReadFile("test-throughput-lineplot.png") + expected, err := os.ReadFile("test-throughput-lineplot.svg") require.NoError(t, err) actual, err := os.ReadFile(file) @@ -102,10 +103,10 @@ func Test_plotLineThroughput(t *testing.T) { func Test_plotLineLatencies(t *testing.T) { dir := t.TempDir() - file := dir + "/latency-lineplot.png" - plotLineLatencies(file, testDatapoints) + file := dir + "/latency-lineplot.svg" + plotLineLatencies(file, testStart, testDatapoints) - expected, err := os.ReadFile("test-latency-lineplot.png") + expected, err := os.ReadFile("test-latency-lineplot.svg") require.NoError(t, err) actual, err := os.ReadFile(file) @@ -117,10 +118,10 @@ func Test_plotLineLatencies(t *testing.T) { func Test_plotErrorRate(t *testing.T) { dir := t.TempDir() - file := dir + "/errorrate-lineplot.png" - plotErrorRate(file, testErrorDatapoints) + file := dir + "/errorrate-lineplot.svg" + plotErrorRate(file, testStart, testErrorDatapoints) - expected, err := os.ReadFile("test-errorrate-lineplot.png") + expected, err := os.ReadFile("test-errorrate-lineplot.svg") require.NoError(t, err) actual, err := os.ReadFile(file) diff --git a/cmd/report.go b/cmd/report.go index b9cd6ad..4756621 100644 --- a/cmd/report.go +++ b/cmd/report.go @@ -38,7 +38,7 @@ type reportParameters struct { // PrintReport prints formatted benchmark result to stdout, exports graphs and generates CSV output if configured. // If there is a fatal error while printing report, an error is returned. -func (b *Benchmark) PrintReport(w io.Writer, stats []*ResultStats, benchmarkDuration time.Duration) error { +func (b *Benchmark) PrintReport(w io.Writer, stats []*ResultStats, benchStart time.Time, benchDuration time.Duration) error { // merge all the stats here timings := hdrhistogram.New(b.HistMin.Nanoseconds(), b.HistMax.Nanoseconds(), b.HistPre) codeTotals := make(map[int]int64) @@ -52,6 +52,7 @@ func (b *Benchmark) PrintReport(w io.Writer, stats []*ResultStats, benchmarkDura var totalCounters Counters + // TODO proper coverage of plots for _, s := range stats { for _, err := range s.Errors { errorString := errString(err) @@ -61,9 +62,8 @@ func (b *Benchmark) PrintReport(w io.Writer, stats []*ResultStats, benchmarkDura } else { errs[errorString] = 1 } - - errTimes = append(errTimes, s.Errors...) } + errTimes = append(errTimes, s.Errors...) timings.Merge(s.Hist) times = append(times, s.Timings...) @@ -122,9 +122,9 @@ func (b *Benchmark) PrintReport(w io.Writer, stats []*ResultStats, benchmarkDura plotHistogramLatency(b.fileName(dir, "latency-histogram"), times) plotBoxPlotLatency(b.fileName(dir, "latency-boxplot"), b.Server, times) plotResponses(b.fileName(dir, "responses-barchart"), codeTotals) - plotLineThroughput(b.fileName(dir, "throughput-lineplot"), times) - plotLineLatencies(b.fileName(dir, "latency-lineplot"), times) - plotErrorRate(b.fileName(dir, "errorrate-lineplot"), errTimes) + plotLineThroughput(b.fileName(dir, "throughput-lineplot"), benchStart, times) + plotLineLatencies(b.fileName(dir, "latency-lineplot"), benchStart, times) + plotErrorRate(b.fileName(dir, "errorrate-lineplot"), benchStart, errTimes) } var csv *os.File @@ -169,7 +169,7 @@ func (b *Benchmark) PrintReport(w io.Writer, stats []*ResultStats, benchmarkDura qtypeTotals: qtypeTotals, topErrs: topErrs, authenticatedDomains: authenticatedDomains, - benchmarkDuration: benchmarkDuration, + benchmarkDuration: benchDuration, } if b.JSON { j := jsonReporter{} diff --git a/cmd/report_test.go b/cmd/report_test.go index b2fa0bc..91144fd 100644 --- a/cmd/report_test.go +++ b/cmd/report_test.go @@ -13,7 +13,7 @@ import ( func ExampleBenchmark_PrintReport() { b, rs := testData() - b.PrintReport(os.Stdout, []*ResultStats{&rs}, time.Second) + b.PrintReport(os.Stdout, []*ResultStats{&rs}, time.Now(), time.Second) // Output: Total requests: 1 // Read/Write errors: 3 @@ -52,7 +52,7 @@ func ExampleBenchmark_PrintReport_dnssec() { b.DNSSEC = true rs.AuthenticatedDomains = map[string]struct{}{"example.org.": {}} - b.PrintReport(os.Stdout, []*ResultStats{&rs}, time.Second) + b.PrintReport(os.Stdout, []*ResultStats{&rs}, time.Now(), time.Second) // Output: Total requests: 1 // Read/Write errors: 3 @@ -94,7 +94,7 @@ func ExampleBenchmark_PrintReport_json() { b.Rcodes = true b.HistDisplay = true - b.PrintReport(os.Stdout, []*ResultStats{&rs}, time.Second) + b.PrintReport(os.Stdout, []*ResultStats{&rs}, time.Now(), time.Second) // Output: {"totalRequests":1,"totalSuccessCodes":4,"totalErrors":6,"TotalIDmismatch":6,"totalTruncatedResponses":7,"responseRcodes":{"NOERROR":2},"questionTypes":{"A":2},"queriesPerSecond":1,"benchmarkDurationSeconds":1,"latencyStats":{"minMs":0,"meanMs":0,"stdMs":0,"maxMs":0,"p99Ms":0,"p95Ms":0,"p90Ms":0,"p75Ms":0,"p50Ms":0},"latencyDistribution":[{"latencyMs":0,"count":0},{"latencyMs":0,"count":0},{"latencyMs":0,"count":0},{"latencyMs":0,"count":0},{"latencyMs":0,"count":0},{"latencyMs":0,"count":1},{"latencyMs":0,"count":0},{"latencyMs":0,"count":0},{"latencyMs":0,"count":0},{"latencyMs":0,"count":0},{"latencyMs":0,"count":1}]} } @@ -107,7 +107,7 @@ func ExampleBenchmark_PrintReport_json_dnssec() { b.DNSSEC = true rs.AuthenticatedDomains = map[string]struct{}{"example.org.": {}} - b.PrintReport(os.Stdout, []*ResultStats{&rs}, time.Second) + b.PrintReport(os.Stdout, []*ResultStats{&rs}, time.Now(), time.Second) // Output: {"totalRequests":1,"totalSuccessCodes":4,"totalErrors":6,"TotalIDmismatch":6,"totalTruncatedResponses":7,"responseRcodes":{"NOERROR":2},"questionTypes":{"A":2},"queriesPerSecond":1,"benchmarkDurationSeconds":1,"latencyStats":{"minMs":0,"meanMs":0,"stdMs":0,"maxMs":0,"p99Ms":0,"p95Ms":0,"p90Ms":0,"p75Ms":0,"p50Ms":0},"latencyDistribution":[{"latencyMs":0,"count":0},{"latencyMs":0,"count":0},{"latencyMs":0,"count":0},{"latencyMs":0,"count":0},{"latencyMs":0,"count":0},{"latencyMs":0,"count":1},{"latencyMs":0,"count":0},{"latencyMs":0,"count":0},{"latencyMs":0,"count":0},{"latencyMs":0,"count":0},{"latencyMs":0,"count":1}],"totalDNSSECSecuredDomains":1} } diff --git a/cmd/result.go b/cmd/result.go index 44dfaf6..2b323ab 100644 --- a/cmd/result.go +++ b/cmd/result.go @@ -18,7 +18,7 @@ type Counters struct { // Datapoint one datapoint of benchmark (single DNS request). type Datapoint struct { - Duration float64 + Duration time.Duration Start time.Time } @@ -40,10 +40,11 @@ type ResultStats struct { AuthenticatedDomains map[string]struct{} } -func (rs *ResultStats) record(req *dns.Msg, resp *dns.Msg, err error, time time.Time, timing time.Duration) { +func (rs *ResultStats) record(req *dns.Msg, resp *dns.Msg, err error, time time.Time, duration time.Duration) { + rs.Counters.Total++ if err != nil { rs.Counters.IOError++ - rs.Errors = append(rs.Errors, ErrorDatapoint{time, err}) + rs.Errors = append(rs.Errors, ErrorDatapoint{Start: time, Err: err}) return } @@ -77,6 +78,6 @@ func (rs *ResultStats) record(req *dns.Msg, resp *dns.Msg, err error, time time. rs.AuthenticatedDomains[req.Question[0].Name] = struct{}{} } - rs.Hist.RecordValue(timing.Nanoseconds()) - rs.Timings = append(rs.Timings, Datapoint{float64(timing.Milliseconds()), time}) + rs.Hist.RecordValue(duration.Nanoseconds()) + rs.Timings = append(rs.Timings, Datapoint{Duration: duration, Start: time}) } diff --git a/cmd/root.go b/cmd/root.go index 3212de2..bfe6603 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -105,8 +105,8 @@ func init() { pApp.Flag("plot", "Plot benchmark results and export them to the directory."). Default("").PlaceHolder("/path/to/folder").StringVar(&benchmark.PlotDir) - pApp.Flag("plotf", "Format of graphs. Supported formats: png, jpg."). - Default("png").EnumVar(&benchmark.PlotFormat, "png", "jpg") + pApp.Flag("plotf", "Format of graphs. Supported formats: svg, png and jpg."). + Default("svg").EnumVar(&benchmark.PlotFormat, "svg", "png", "jpg") pApp.Flag("doh-method", "HTTP method to use for DoH requests. Supported values: get, post."). Default("post").EnumVar(&benchmark.DohMethod, getMethod, postMethod) @@ -167,7 +167,7 @@ func Execute() { if err != nil { errPrint(os.Stderr, "There was an error while starting benchmark: %s\n", err.Error()) } else { - if err := benchmark.PrintReport(os.Stdout, res, end.Sub(start)); err != nil { + if err := benchmark.PrintReport(os.Stdout, res, start, end.Sub(start)); err != nil { errPrint(os.Stderr, "There was an error while printing report: %s\n", err.Error()) } } diff --git a/cmd/test-boxplot-latency.png b/cmd/test-boxplot-latency.png deleted file mode 100644 index b1a40420b8ce61b79e1f6e8646ccc858cd04ab77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11008 zcmdUV2|Uzm-}fJdN}e6i7#SO~6Y|Q)hdfAlrt7x35 zZAm*izg;7z_en$D?#@EBMxKh#ui9cOJFHV9V@s4v9?CS?$=v3O*}RSC?&0LaHz#Gs zmQ9!EWm_KBZpTY6diUqyyr$>8nnKcM`&^q`gL0CE;qBdqaXv`Z?)LWfH}B^rzr4Br z_3bTQN&EAx?lOJx=&1O3N*%A0++wfm#*G_2m-Mi0%v=rU+}%mn^C~(jd>4eQ*ba_!I6B7)gg7KsL|XU?2SM<-HO5(tCUK@L5IT3TA}o}P&( zU51!Ye&;V-_yM1^q7|o_pPjL^{7PII#>Vck5EoonSjfXseeenL73Jmnd1n4AySfW( z(ObgVIXD(Nanv^(6VDUz80y@&4-s)EpWSiVw`Y&Vhe!Jp5)yF4)RdGIS6A2eybu=d zS64nfDssCukOOZFV#C2@6A@;I!WwNlozJ5`{s!3glEhd3>`cfJqgPjceETpxJlsFqLAGMl#PwQd~ZoX zVOD2nW@g3`e5X64aj*vX6WD*_lM@<=xtHt1X+OtGsLHRBC-P8UgMr)|ZaS`&g>?Dx&9Sol%_|Ayf06475;SurnlQ(HTfS4k%P zA#kR=y!>rV&D@V4ZZdsY7qeF>6tPRidxDo%=kTicxMrJViF*3_O^J$%l9C>9Xm>fq znm&B+o~`AiP$+YAbM0fxgzP+}GiTZ{R$>+N7cO3mVzYwvQphBe3LjF;(aXE}_=0ZU zY$NiC3vRZssSD@h-Mzba@Qm-`w7l!+y=375|HXK=z5Dm8=tQP!L=*7%4mi6 zL?#P|u%aAW)3hutpCt>^o>*uftDP=#rs5BdrL0Y-P75rlHU5pp=SZNM#)PSHZn3Q^O(A@bEE*T;Og$) zu84Maob>{7Y&-~p%7^R%=>VHfoD+Hjb)dVXI`oyf^a zdjVy8`xj)EXV0Dyo?g9rRVg$$c!RsVq@;cYx3W%Tfi3<^PfvPk>cKDwq&q|=$1q<> zC-Qn{ZsuBTlCb)#y)H8e)aIkQY z`aw*r97-FQn4%*iGccVZVME`)+gV$;r)kBtq^OR4`rZpN6ahBJ*JGWU!SO(R>i-6 zpOKlVGyF_g-NIrpr-;zq)s=ywq&Hn)!BN;;XK29tEHK*(U8*^)x?O1)~Qv~wFU{i=9A-BR~Dv3^k1A) zQ@eBTUU_^hub#2-p?eCgr6c`vte$dL(nr)D0Qk0^is%m0l@_C8dXAc!8VNPkSLSJBV`FA!wgYXVtGk1fbBsVB_qyUMmPg}YZb&Yj4TyjYCND3) zaqRoj)TGVaVpzxH_hV(cOiWtZ2;((7q=Lb$4IE{#@Y}#Lnwp!No0XN7oIC{aU#mmMA+ez05m#%KdKC0>gl4V^3e{(aMz7N<2e z8)7AFsVf6(n+5uPCURQS(VZO~{0e?ujg2{;#C}quM{lui$}`Lq5D0|!Y=Z$;ygb1j?dP|8YYXS2M~_O~#(#t;u2$F9 zj#M+D`v_WUtOAo!(3g&t;Itn+BGL>$ICzyl{|LrMtwM+wY4>` zl;iQGZw*aNj__582h+CQ&Esw`FR#U*6BSI2jeYR)i~9~7$dZbIAvp{gNTpH%V3bl@ zi=ov*RX$Hml|FgW(8Ppu=g#@59;yBNt$PX`AO~O=(7*|t1QQDv+pb-2{8ttxCnup9 z-U<%R$m8F>{n3*rK2u-boDO2#$|asuTwDw=2Qu2U%;WyuyCNbYt{xuYVPQUlflS-C zZ->#?+t&xF9WeCnPL4^@#irDCo3wtdPQ2owDjJ+RwEyy()c&~yi*Xjql4$OtyCp#Tz{j9E^9OP$&)AZ^KKMNAD>d~bcu0g z1Sz;2PA78cP*`YaGpfJXrKZ2X|M?C&q#<0I@de-;5rf<|)Bz!(P9itfhPHqz+kgG4 zU#o|Z!=^(0Et=`+84dR=1fJgVD*!J~O)>;=u>BwJ=|AyB>*0i+^6s57#S*%(gF}v* z5dFRyhPNDzxDgJN1 z=vBpBy4PZ#XGBCq{L`m$a&n_h@jY1=MFf=3o~;8g1VL3&QsVdi#!hO07Q!d%0Z0u{ zoaaQxRFgRml4K;x_Hu3v56HY;Qc@CrN`&zOFzJwpNc}x-=;$L;Q+zx;*REfewP}cf zB+fA^7zMg8K0Xd0QW`LBL4m7=-xh?0me9@gP6D}x`ETp$&N3ghdKU^qf>~f;x^Ds~ z#PINC2M2j~LK|jv7^M_?pH~WIOv{%qU+U}A0i6K)ymn`q?l=}s;U))j7hwAA0GDs? z9|8~AED*5tmC4D;$vq#wX^T&AuxCfG1L@X|Lre3m=%An=*Bduzt+W4aHpaKPwsyai zR8hVP;>kd(SkW2o7&fafTCyIKfZonuy7V+9;PW=z8N>7E2gk<`2G7jTA3k*G zvzU*!_xPFx0F)g>;n9(i_KuFi!KVna#W|f$1Nye6rk+z|-isIT-5)bEUh^%giqxgc zq+sayfX(%oXTPUBfFW}$BqaMTX8Du(JbJsE?q#uuPoM5)XLkv4rAH1o#4|R0`Qp=_ zbx}n{1r`i}piG#r5r{;w;23esw_C)@2Z=Cii4&Di* zr3Vv0+H4Ok+w-JQ5+88sF>N2ia*idIhT2+{3c|5LcU{UZz_C~?Ru-dzXr-7n(+6C){Wq?A&cyvk_6z(UdHk{Jy>`SS$iV>aw84 zOFsaOm6erg32(c$p%m;1?Dq(5nYw_wBuP8P579GzGSJl(433%k;o84QI!Zch=N*+g zf|8rNp`vmtlPNHtUEEG3E_}*VrcjEs)6RQg+qN`*y0mJo-T!ciFkoupPJV7}MJLF` zK7Oo!;lj}1U^C!nz_*MWHv<2UwNpY6o*9iQpr&%3)4i~ULt$3d)+2+1=XG^;O-w|B zXGkQ|0-Huq8Z>1NAqZ}1S@hk~(h?KDSCZ>k6CmJEczox$+sMcW^i%kM7$+D)X8LGj zToG_xUGx^D3UA+@s5=9MZ?|GVIdmUJ)*|3jYiZHu0n7RI{1XGXHK6F4$JZY}zIhVB zXxHnjtvRGDJb-Foh}_)VXP<6GuxBZ58y5zHSS6PXVb(3rjR7iN@5#>2&N0%iX)Qt< zkR-a>MJ;GxmNmDxDuqI~1=tUgS1Qn;+1c3xJgf-zHaBBKU7Zbeby+DCq!1#j!jeTm zKmZW>$D$^h$N51gUAb7bQ$+{k=y~lL0jAO8Bc|7!oD^ZaO?2kPIj#pS`+ftcc2QAL zXn9f_P~HK+)gk;o=a^lfA#dZ8iCO=e#S+JmP@><^`1tZn4J&Z~XU@#d$4BY5P0YW= zjaWFcU?TM(h(M)M6nEd)A?1P~4fidp!otFUheX82W}55lOf4+z7#JA%UOWRO#vZ_`0C5c|rCs%aGX z{>kkK(kQXYVh{8YWD;Kh91{cY*txl{CeOlZW4_v2I669hiWbXT<49(+>Ud#v7R7>K z)3~Vn!a<|~orml2bWagJR1h{USA(wtg#(10>A}Gyh|0*<5R@bt=*aO}af@x+wgLSl z8SGR!I(-g)g%`Jg=i=N^UBD*qtuLg2LkY<9H-MFd*&NvQ((>{qfn0MOwZp`T+kgE? zTXz|rJNG`6T@W}HOwjf&Z{RKw2ef>M6^r*|*Yo0_MPXqfzzXI~o5q36-Q$*kK=)Mo zgGLep>;Q->yqDNrAav-^wYkwoIy$;Eel7%={bXwa^014G3#c7lUvF`S-Mu@JXbI>D zSUE^$Xf%4q)=dcZnYrVTU29sSEU~=6heUuvgMt0%(RNT^0N+q4D`lmnPuyUKEZqIK z>}+kN1`q6LWI(DMj;^Xf`JW5?MPQH%*A7`gfito412L5xl0%SQjvB01f}HnyT@Z0= z{Xm(427;zJq^bstMT^0}0>B`rQu%Bh@0r^yA3*A%Db$T|T1R;i`Ip^ z{g#21!jZZ zd#wXcXbphdEYRA<2D)Z%cegjx8Q~+$UJM{b-3CVFR0<2j0)RtS@DN}c%lpiqHvm9W zu9us+4T3UKQoBS;TeeVP-f)v#n z=NP~qKruBH2*%-X?V^N%4mt!Y{c@L5S65d9$T#mo*_A?JDIjc=Qn|yD-__Q}{%lQi zwiaNAB$I1F7WVV=W6>sb<)^eTL2M7+_7pg)s_NAB@)@;h1O!w_ycAXloh}PQp~uu0 zcpOcLAxC}usO~s~AThi(sQvB0>ml_z%_rg1Z`^qG>q(00S+8Dw9=r!*08nF7u`X08 zOHC0Q2mlf=OW@ZahKzjsHrZdXk{WHcdDEt&EncwOh8ZCjnm7q+38-|0XZP>@bU3+az;OTH1zG;HzJWZHRbRvcJt=Vl1}|E6w3oBKA;Caw1owhFa~fW zM@3z1)*?sI z9oF86oRVO1NFMbiG{E%u(W48-#@FVnp(BTVB{F<^{~p40%G5NTExE8zQb8f0`;|4V zjm5DcSVpe?ceCLCgo8#8)S;up19Yl4Z{Ac_SA&H9>v+X2;6Fj^RdD-${_NSaK(~BJ zgj&&11d+JH^>V7G2pxOO8afX-3ffy+TieT*;wkv`>Ln`mmU-q?tDBkiSNgB~Y}+d% zo9#jW62qA{>+>7IeN-l(&6-6nHHRcF_Ay)c%@+B=|PKPgz;n6*Ae!*O%92eXUE} zhW;P}92OPr1MMEz=aqL4;k3gwu3*OL`~1Hi4ji<^uJV+J6xv@G#5G&GbZXjV&rjGC?$XVaSr&#%MNff3qD zL?q4|8C~tAy|N!q7Y8oPE9*}@a%a+8bIdBfthbGOiHZ!@UzjPzTRKpRaFoXN3Mfxo z2<%Jy5FzC2A(yf;4CxN}(WT$w}278UCM%y$!U7ji$04UUyAin}6-_6bKDF`4dM4TdY zEoj|WtgZcjd=LUG3logzq;pbqv;j@-Kt!(v2)Y)4z%ELA#~nvb6&UZaAm6tF^8wV_?Mly|KQAsR$-E0^ zaIKvn=HulB4qN}S1_N?Ddt<+n-bFn<=rbpd9lO8`KF?MmAtCp^4gHhO7M4O;rj{J7w{hXRff8DdYf`GVO%CDz4UOk+zfFTZ4}#|QnE zrkh^CHTY(oz^SWyR7J@}To>&cH!rJsu&aq?1!a-;sb5$Ci-a6USR1uMxe(F

<0}u{+XjVps9mp8fK}?BWLz@KN!OPd? z64x~2By-BkSIdZ%CS@KuR5h92w(p^Zg#a#aHPV6DW+q}q-h=hm92OO__~MpM2Yv{Z z(={Ss1fBpvCgjXP44@}_Qq+8kKr?jD1XGom4U0CYg*PnJA)uorL9=lO(v%q zV_lyfMy0RCFGP$9!DelAOkqN*mi~ewy;&;n9Ht z%M%(-tlM4$+x=C7W`g{8%!R+=*8Ri>%Xq26#~plPa?R(@7f>kFPpy5FOB{{H1Bg_@ z#H=flmY?r{P8ISG9?*Z=?Y{!4W@|ApEHL)xLsC;y6%-T>#4{rn9t}rnM9ti9_7+tf z*x%m0Z`b{tZB7F8>k{05*%JTjSl<{{0f$l7(3r>r@O-J*`E+{gI8b9XP0ey2(lw0= z;h(ceCf*S^94JwsCXj0ZY*@oR7f>4Sec^qbz_=Ok8!RLyT>F z$IvctM+gKhPEJl0owg{@P%z+LYpbinR7*>PM!End@oK#y)n$#ch>tmXhM5MlfVaTd zl*PCsSjjh4ySiRl)-Z0{ZHTcZ_E(Uj1_uWLLwvDtnHj7G6Sib7nh~+-wLYp=S$YuV&ko$>p7 zb@4YJ8yFee5ZEnvJonQy2eQdlFudVP&hsM#C*8vb54r$QNnC3;FrNaZly3{5dGnSn zWxTFRf^C@D%1fk#Or~nnwo>=&x(|@cWg>K-Spjf(O?FpThwB?jr7;N!x#oV8`StT- z=;ColO?qYlaAxM$l-}+IXEy_bKczdZUInAO2!K9NdI(VfOd+uFIh1G@+?;@Pn^S*8 z!$$xMKyvB3AI<1!ef>JzEwU#ZL|%)FP%4PH9+3F86BWSs=>^Xk9s&+~Ye&bzkC9J5 zU3UMOY9^8sa#lsfe`TsjDbzN>I}H>!(W8pMjsbok2p39m3;SQz)A~>v%>d(=3S;3b zKy0w%+iHM~zBO-Ed~N{k4ou;$IVsBb90tTD6iYX{Ur_M!$H;?dMat^{Yse3f#AreR zaKpu^9--jS2M-o!W{MZr02yegsb#M1LxGheftQ1;6ba4E&Aq*sf}-unE%2VAfq*iN z=p#jE*~LXXtx;Uy?<6G+!nHBT$vb!MkZS?gk0oNvm|MWt0t?H$%tMQLcD5dcj+ePe zx#&l`h6CJyG&TlU4bUGzZUBHeSy{&UR<#gpr#T$~RtDmUtafS}SpKMkt;21xoEI52c&KbYwl8ccO`S^!vqmMQ5q zGf19*%y)a68y^VV^DdwWnzUqded zf(5ejAZVi%6xE!Z9Nf~-U8n}Q6a$IU1Il7YkuaS^H5yRZzqyS-HAfI+ZSA=I3nlr` SOrTK+qNbv)oU3GU^M3$exVMJ@ diff --git a/cmd/test-boxplot-latency.svg b/cmd/test-boxplot-latency.svg new file mode 100644 index 0000000..6a1ba38 --- /dev/null +++ b/cmd/test-boxplot-latency.svg @@ -0,0 +1,44 @@ + + + + + +Latencies distribution +127.0.0.1 + +Latencies (ms) + +100 +200 +300 + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cmd/test-errorrate-lineplot.png b/cmd/test-errorrate-lineplot.png deleted file mode 100644 index 1cfc68502659b5f6a4bc2ba4b009d845bc58194d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13560 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 + + + + +Error rate over time +Time of test (s) +2 +4 +6 + + + + + + + + +Number of errors (per sec) + +0 +1 +2 + + + + + + + + + + + + + + + + + + + + + diff --git a/cmd/test-histogram-latency.png b/cmd/test-histogram-latency.png deleted file mode 100644 index 7737cf71249f7ab33a521961f17f6f43aee0cb1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12920 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 diff --git a/cmd/test-histogram-latency.svg b/cmd/test-histogram-latency.svg new file mode 100644 index 0000000..59f8748 --- /dev/null +++ b/cmd/test-histogram-latency.svg @@ -0,0 +1,81 @@ + + + + + +Latencies distribution +Latencies (ms) +100 +200 +300 + + + + + + + + + + + + + + + +Number of requests + +0 +2 +4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cmd/test-latency-lineplot.png b/cmd/test-latency-lineplot.png deleted file mode 100644 index 1bacc542ed0271b5488c1aa50de564d592489974..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29527 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 + + + + +Response latencies +Time of test (s) +0 +5 +10 + + + + + + + + + + + + + +Latency (ms) + +100 +200 +300 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +p99 + + +p95 + + +p90 + + +p50 + + diff --git a/cmd/test-responses-barchart.png b/cmd/test-responses-barchart.png deleted file mode 100644 index 0caa9ff1ad1e5dc95a7f423184ead4da9b3d47b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17195 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 diff --git a/cmd/test-responses-barchart.svg b/cmd/test-responses-barchart.svg new file mode 100644 index 0000000..ac494f6 --- /dev/null +++ b/cmd/test-responses-barchart.svg @@ -0,0 +1,51 @@ + + + + + +Response code distribution +Response codes + +Number of requests + +0 +4 +8 + + + + + + + + + + + + + + + + + + +NOERROR + + +SERVFAIL + + +NXDOMAIN + + diff --git a/cmd/test-throughput-lineplot.png b/cmd/test-throughput-lineplot.png deleted file mode 100644 index 15576a5ad7daaf83cb0bcd13bb3b155ae2b1e666..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15212 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 diff --git a/cmd/test-throughput-lineplot.svg b/cmd/test-throughput-lineplot.svg new file mode 100644 index 0000000..5a78139 --- /dev/null +++ b/cmd/test-throughput-lineplot.svg @@ -0,0 +1,66 @@ + + + + + +Throughput per second +Time of test (s) +0 +5 +10 + + + + + + + + + + + + + +Number of requests (per sec) + +0 +1 +2 + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/graphs.md b/docs/graphs.md index 90c115e..cb05e85 100644 --- a/docs/graphs.md +++ b/docs/graphs.md @@ -25,29 +25,29 @@ generates these graphs: ## Latency histogram Shows the distribution of response latencies -![latency histogram](graphs/latency-histogram.png) +![latency histogram](graphs/latency-histogram.svg) ## Latency boxplot Shows the distribution of response latencies -![latency boxplot](graphs/latency-boxplot.png) +![latency boxplot](graphs/latency-boxplot.svg) ## Response codes barchart Shows the distribution of DNS server response codes -![responses bar](graphs/responses-barchart.png) +![responses bar](graphs/responses-barchart.svg) ## Throughput line graph Shows the throughput of DNS requests during benchmark execution -![throughput line](graphs/throughput-lineplot.png) +![throughput line](graphs/throughput-lineplot.svg) ## Latency line plot Shows the latencies of DNS responses during benchmark execution -![latency line](graphs/latency-lineplot.png) +![latency line](graphs/latency-lineplot.svg) ## Error rate over time plot -Shows the number of errors during benchmark execution +Shows the number of IO errors during benchmark execution -![error rate line](graphs/errorrate-lineplot.png) +![error rate line](graphs/errorrate-lineplot.svg) diff --git a/docs/graphs/errorrate-lineplot.png b/docs/graphs/errorrate-lineplot.png deleted file mode 100644 index 33158edb58cd1d9923f944596bd948ed8f238a94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12826 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 pv@2{DjVzx0ZI=N{{Yutq;CKK diff --git a/docs/graphs/errorrate-lineplot.svg b/docs/graphs/errorrate-lineplot.svg new file mode 100644 index 0000000..f35ceef --- /dev/null +++ b/docs/graphs/errorrate-lineplot.svg @@ -0,0 +1,54 @@ + + + + + +Error rate over time +Time of test (s) +30 +31 +32 + + + + + + + + + + + + + +Number of errors (per sec) + +194 +195 +196 + + + + + + + + + + + + + + + diff --git a/docs/graphs/latency-boxplot.png b/docs/graphs/latency-boxplot.png deleted file mode 100644 index ff2a644c378c72330b3e1b7af3c7a79756b3c566..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14522 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 diff --git a/docs/graphs/latency-boxplot.svg b/docs/graphs/latency-boxplot.svg new file mode 100644 index 0000000..3da8a96 --- /dev/null +++ b/docs/graphs/latency-boxplot.svg @@ -0,0 +1,824 @@ + + + + + +Latencies distribution +8.8.8.8:53 + +Latencies (ms) + +1000 +2000 +3000 +4000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/graphs/latency-histogram.png b/docs/graphs/latency-histogram.png deleted file mode 100644 index 11e9d20b1ccb7f4f905dcc76d1042b1107a4f9ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14188 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 + + + + +Latencies distribution +Latencies (ms) +1000 +2000 +3000 +4000 + + + + + + + + + + + + + + + + + + + + + + + +Number of requests + +0 +3000 +6000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/graphs/latency-lineplot.png b/docs/graphs/latency-lineplot.png deleted file mode 100644 index 305f341b4d286700379f20b28876e39680beea0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48731 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 HIQahn5-lfE diff --git a/docs/graphs/latency-lineplot.svg b/docs/graphs/latency-lineplot.svg new file mode 100644 index 0000000..d5cc49b --- /dev/null +++ b/docs/graphs/latency-lineplot.svg @@ -0,0 +1,181 @@ + + + + + +Response latencies +Time of test (s) +4 +16 +28 + + + + + + + +Latency (ms) + +400 +1200 +2000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +p99 + + +p95 + + +p90 + + +p50 + + diff --git a/docs/graphs/responses-barchart.png b/docs/graphs/responses-barchart.png deleted file mode 100644 index 748e1a3f1eac1e52bb08e31025713ec3ec5a3d88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18098 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 diff --git a/docs/graphs/responses-barchart.svg b/docs/graphs/responses-barchart.svg new file mode 100644 index 0000000..6da9a4f --- /dev/null +++ b/docs/graphs/responses-barchart.svg @@ -0,0 +1,49 @@ + + + + + +Response code distribution +Response codes + +Number of requests + +0 +3000 +6000 + + + + + + + + + + + + + + + + +NOERROR + + +SERVFAIL + + +NXDOMAIN + + diff --git a/docs/graphs/throughput-lineplot.png b/docs/graphs/throughput-lineplot.png deleted file mode 100644 index d8ec327298160afe86dcf4d29265c7d06c81aab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49836 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 + + + + +Throughput per second +Time of test (s) +4 +16 +28 + + + + + + + +Number of requests (per sec) + +50 +200 +350 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/index.md b/docs/index.md index 139b722..5d9d228 100644 --- a/docs/index.md +++ b/docs/index.md @@ -71,7 +71,7 @@ Flags: --[no-]silent Disable stdout. --[no-]color ANSI Color output. Enabled by default. --plot=/path/to/folder Plot benchmark results and export them to the directory. - --plotf=png Format of graphs. Supported formats: png, jpg. + --plotf=svg Format of graphs. Supported formats: svg, png and jpg. --doh-method=post HTTP method to use for DoH requests. Supported values: get, post. --doh-protocol=1.1 HTTP protocol to use for DoH requests. Supported values: 1.1, 2 and 3. --[no-]insecure Disables server TLS certificate validation. Applicable for DoT, DoH and DoQ.