perfmonger 0.10.2 → 0.12.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +3 -0
- data/.travis.yml +9 -8
- data/HOWTO.md +0 -1
- data/NEWS +49 -5
- data/README.md +77 -27
- data/Rakefile +33 -11
- data/core/Makefile +22 -31
- data/core/build.sh +6 -8
- data/core/cmd/perfmonger-player/perfmonger-player.go +247 -0
- data/core/{perfmonger-plot-formatter.go → cmd/perfmonger-plot-formatter/perfmonger-plot-formatter.go} +20 -5
- data/core/{perfmonger-recorder.go → cmd/perfmonger-recorder/perfmonger-recorder.go} +22 -2
- data/core/{perfmonger-summarizer.go → cmd/perfmonger-summarizer/perfmonger-summarizer.go} +22 -15
- data/core/cmd/perfmonger-viewer/perfmonger-viewer.go +164 -0
- data/core/go.mod +10 -0
- data/core/go.sum +17 -0
- data/core/subsystem/Makefile +4 -0
- data/core/subsystem/perfmonger_linux.go +95 -0
- data/core/subsystem/perfmonger_linux_test.go +40 -0
- data/core/subsystem/stat.go +70 -0
- data/core/subsystem/stat_test.go +9 -0
- data/core/subsystem/usage.go +223 -66
- data/core/subsystem/usage_test.go +62 -32
- data/core/utils.go +2 -2
- data/{bin → exe}/perfmonger +0 -0
- data/lib/exec/perfmonger-player_darwin_amd64 +0 -0
- data/lib/exec/perfmonger-player_linux_amd64 +0 -0
- data/lib/exec/perfmonger-plot-formatter_darwin_amd64 +0 -0
- data/lib/exec/perfmonger-plot-formatter_linux_amd64 +0 -0
- data/lib/exec/perfmonger-recorder_darwin_amd64 +0 -0
- data/lib/exec/perfmonger-recorder_linux_amd64 +0 -0
- data/lib/exec/perfmonger-summarizer_darwin_amd64 +0 -0
- data/lib/exec/perfmonger-summarizer_linux_amd64 +0 -0
- data/lib/exec/perfmonger-viewer_darwin_amd64 +0 -0
- data/lib/exec/perfmonger-viewer_linux_amd64 +0 -0
- data/lib/perfmonger/command/fingerprint.rb +26 -1
- data/lib/perfmonger/command/live.rb +19 -0
- data/lib/perfmonger/command/play.rb +16 -0
- data/lib/perfmonger/command/plot.rb +23 -9
- data/lib/perfmonger/command/record.rb +24 -3
- data/lib/perfmonger/command/record_option.rb +16 -0
- data/lib/perfmonger/command/server.rb +1 -1
- data/lib/perfmonger/version.rb +1 -1
- data/misc/werker-box/Dockerfile +34 -0
- data/misc/werker-box/build-push.sh +7 -0
- data/perfmonger.gemspec +2 -1
- data/spec/data/busy100.pgr.played +3 -3
- data/spec/fingerprint_spec.rb +1 -1
- data/spec/live_spec.rb +2 -3
- data/spec/perfmonger_spec.rb +1 -1
- data/spec/play_spec.rb +1 -1
- data/spec/plot_spec.rb +16 -1
- data/spec/record_spec.rb +10 -1
- data/spec/spec_helper.rb +28 -3
- data/spec/stat_spec.rb +2 -2
- data/spec/summary_spec.rb +1 -1
- data/wercker.yml +29 -16
- metadata +34 -14
- data/core/perfmonger-player.go +0 -196
- data/lib/exec/perfmonger-player_linux_386 +0 -0
- data/lib/exec/perfmonger-plot-formatter_linux_386 +0 -0
- data/lib/exec/perfmonger-recorder_linux_386 +0 -0
- data/lib/exec/perfmonger-summarizer_linux_386 +0 -0
data/core/subsystem/stat_test.go
CHANGED
@@ -262,6 +262,14 @@ func TestNewNetStat(t *testing.T) {
|
|
262
262
|
}
|
263
263
|
}
|
264
264
|
|
265
|
+
func TestNewMemStat(t *testing.T) {
|
266
|
+
memstat := NewMemStat()
|
267
|
+
|
268
|
+
if memstat == nil {
|
269
|
+
t.Error("failed to create MemStat")
|
270
|
+
}
|
271
|
+
}
|
272
|
+
|
265
273
|
func TestNewStatRecord(t *testing.T) {
|
266
274
|
stat_record := NewStatRecord()
|
267
275
|
|
@@ -278,4 +286,5 @@ func TestNewStatRecord(t *testing.T) {
|
|
278
286
|
checkFieldIsNil("Disk")
|
279
287
|
checkFieldIsNil("Softirq")
|
280
288
|
checkFieldIsNil("Net")
|
289
|
+
checkFieldIsNil("Mem")
|
281
290
|
}
|
data/core/subsystem/usage.go
CHANGED
@@ -2,12 +2,13 @@ package subsystem
|
|
2
2
|
|
3
3
|
import (
|
4
4
|
"bytes"
|
5
|
-
"encoding/json"
|
6
5
|
"errors"
|
7
6
|
"fmt"
|
8
7
|
"regexp"
|
9
8
|
"sort"
|
10
9
|
"time"
|
10
|
+
|
11
|
+
projson "github.com/hayamiz/go-projson"
|
11
12
|
)
|
12
13
|
|
13
14
|
type CpuCoreUsage struct {
|
@@ -84,25 +85,56 @@ type NetUsageEntry struct {
|
|
84
85
|
|
85
86
|
type NetUsage map[string]*NetUsageEntry
|
86
87
|
|
87
|
-
|
88
|
-
|
89
|
-
fmt.Sprintf(`{"usr":%.2f,"nice":%.2f,"sys":%.2f,"idle":%.2f,"iowait":%.2f,"hardirq":%.2f,"softirq":%.2f,"steal":%.2f,"guest":%.2f,"guestnice":%.2f}`,
|
90
|
-
ccusage.User, ccusage.Nice, ccusage.Sys, ccusage.Idle, ccusage.Iowait,
|
91
|
-
ccusage.Hardirq, ccusage.Softirq, ccusage.Steal, ccusage.Guest, ccusage.GuestNice))
|
88
|
+
type MemUsage struct {
|
89
|
+
mem *MemStat
|
92
90
|
}
|
93
91
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
92
|
+
var UseColor = false
|
93
|
+
|
94
|
+
func SetUseColor(use_color bool) {
|
95
|
+
UseColor = use_color
|
96
|
+
}
|
97
|
+
|
98
|
+
func (ccusage *CpuCoreUsage) WriteJsonTo(printer *projson.JsonPrinter) {
|
99
|
+
printer.BeginObject()
|
100
|
+
printer.PutKey("usr")
|
101
|
+
printer.PutFloatFmt(ccusage.User, "%.2f")
|
102
|
+
printer.PutKey("nice")
|
103
|
+
printer.PutFloatFmt(ccusage.Nice, "%.2f")
|
104
|
+
printer.PutKey("sys")
|
105
|
+
printer.PutFloatFmt(ccusage.Sys, "%.2f")
|
106
|
+
printer.PutKey("idle")
|
107
|
+
printer.PutFloatFmt(ccusage.Idle, "%.2f")
|
108
|
+
printer.PutKey("iowait")
|
109
|
+
printer.PutFloatFmt(ccusage.Iowait, "%.2f")
|
110
|
+
printer.PutKey("hardirq")
|
111
|
+
printer.PutFloatFmt(ccusage.Hardirq, "%.2f")
|
112
|
+
printer.PutKey("softirq")
|
113
|
+
printer.PutFloatFmt(ccusage.Softirq, "%.2f")
|
114
|
+
printer.PutKey("steal")
|
115
|
+
printer.PutFloatFmt(ccusage.Steal, "%.2f")
|
116
|
+
printer.PutKey("guest")
|
117
|
+
printer.PutFloatFmt(ccusage.Guest, "%.2f")
|
118
|
+
printer.PutKey("guestnice")
|
119
|
+
printer.PutFloatFmt(ccusage.GuestNice, "%.2f")
|
120
|
+
printer.FinishObject()
|
121
|
+
}
|
122
|
+
|
123
|
+
func (cusage *CpuUsage) WriteJsonTo(printer *projson.JsonPrinter) {
|
124
|
+
printer.BeginObject()
|
125
|
+
printer.PutKey("num_core")
|
126
|
+
printer.PutInt(cusage.NumCore)
|
127
|
+
printer.PutKey("all")
|
128
|
+
|
129
|
+
cusage.All.WriteJsonTo(printer)
|
130
|
+
|
131
|
+
printer.PutKey("cores")
|
132
|
+
printer.BeginArray()
|
133
|
+
for _, ccusage := range cusage.CoreUsages {
|
134
|
+
ccusage.WriteJsonTo(printer)
|
104
135
|
}
|
105
|
-
|
136
|
+
printer.FinishArray()
|
137
|
+
printer.FinishObject()
|
106
138
|
}
|
107
139
|
|
108
140
|
func GetCpuCoreUsage(c1 *CpuCoreStat, c2 *CpuCoreStat) (*CpuCoreUsage, error) {
|
@@ -225,35 +257,68 @@ func GetInterruptUsage(t1 time.Time, i1 *InterruptStat, t2 time.Time, i2 *Interr
|
|
225
257
|
return usage, nil
|
226
258
|
}
|
227
259
|
|
228
|
-
func (intr_usage *InterruptUsage) WriteJsonTo(
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
}
|
235
|
-
fmt.Fprintf(buf, "%.2f", core_usage.Device)
|
260
|
+
func (intr_usage *InterruptUsage) WriteJsonTo(printer *projson.JsonPrinter) {
|
261
|
+
printer.BeginObject()
|
262
|
+
printer.PutKey("core_dev_intr")
|
263
|
+
printer.BeginArray()
|
264
|
+
for _, core_usage := range intr_usage.CoreIntrUsages {
|
265
|
+
printer.PutFloatFmt(core_usage.Device, "%.2f")
|
236
266
|
}
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
267
|
+
printer.FinishArray()
|
268
|
+
|
269
|
+
printer.PutKey("core_sys_intr")
|
270
|
+
printer.BeginArray()
|
271
|
+
for _, core_usage := range intr_usage.CoreIntrUsages {
|
272
|
+
printer.PutFloatFmt(core_usage.System, "%.2f")
|
243
273
|
}
|
244
|
-
|
245
|
-
|
274
|
+
printer.FinishArray()
|
275
|
+
printer.FinishObject()
|
246
276
|
}
|
247
277
|
|
248
|
-
func (duentry *DiskUsageEntry) WriteJsonTo(
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
278
|
+
func (duentry *DiskUsageEntry) WriteJsonTo(printer *projson.JsonPrinter) {
|
279
|
+
printer.BeginObject()
|
280
|
+
printer.PutKey("riops")
|
281
|
+
printer.PutFloatFmt(duentry.RdIops, "%.2f")
|
282
|
+
printer.PutKey("wiops")
|
283
|
+
printer.PutFloatFmt(duentry.WrIops, "%.2f")
|
284
|
+
printer.PutKey("rkbyteps")
|
285
|
+
printer.PutFloatFmt(duentry.RdSecps/2.0, "%.2f")
|
286
|
+
printer.PutKey("wkbyteps")
|
287
|
+
printer.PutFloatFmt(duentry.WrSecps/2.0, "%.2f")
|
288
|
+
printer.PutKey("rlatency")
|
289
|
+
printer.PutFloatFmt(duentry.RdLatency, "%.3f")
|
290
|
+
printer.PutKey("wlatency")
|
291
|
+
printer.PutFloatFmt(duentry.WrLatency, "%.3f")
|
292
|
+
printer.PutKey("rsize")
|
293
|
+
printer.PutFloatFmt(duentry.AvgRdSize, "%.2f")
|
294
|
+
printer.PutKey("wsize")
|
295
|
+
printer.PutFloatFmt(duentry.AvgWrSize, "%.2f")
|
296
|
+
printer.PutKey("qlen")
|
297
|
+
printer.PutFloatFmt(duentry.ReqQlen, "%.2f")
|
298
|
+
printer.FinishObject()
|
254
299
|
}
|
255
300
|
|
256
|
-
func (
|
301
|
+
func strarrayToString(arr []string) string {
|
302
|
+
buf := bytes.NewBuffer([]byte{})
|
303
|
+
|
304
|
+
fmt.Fprintf(buf, "[")
|
305
|
+
for i, elem := range arr {
|
306
|
+
if i > 0 {
|
307
|
+
fmt.Fprintf(buf, ",")
|
308
|
+
}
|
309
|
+
|
310
|
+
if UseColor {
|
311
|
+
fmt.Fprintf(buf, "\033[35m\"%s\"\033[0m", elem)
|
312
|
+
} else {
|
313
|
+
fmt.Fprintf(buf, "\"%s\"", elem)
|
314
|
+
}
|
315
|
+
}
|
316
|
+
fmt.Fprintf(buf, "]")
|
317
|
+
|
318
|
+
return buf.String()
|
319
|
+
}
|
320
|
+
|
321
|
+
func (dusage *DiskUsage) WriteJsonTo(printer *projson.JsonPrinter) {
|
257
322
|
var devices []string
|
258
323
|
|
259
324
|
for device, _ := range *dusage {
|
@@ -263,23 +328,24 @@ func (dusage *DiskUsage) WriteJsonTo(buf *bytes.Buffer) {
|
|
263
328
|
}
|
264
329
|
sort.Strings(devices)
|
265
330
|
|
266
|
-
|
267
|
-
|
268
|
-
|
331
|
+
printer.BeginObject()
|
332
|
+
printer.PutKey("devices")
|
333
|
+
printer.BeginArray()
|
334
|
+
for _, device := range devices {
|
335
|
+
printer.PutString(device)
|
269
336
|
}
|
270
|
-
|
337
|
+
printer.FinishArray()
|
271
338
|
|
272
339
|
devices = append(devices, "total")
|
273
340
|
|
274
341
|
for _, device := range devices {
|
275
342
|
usage := (*dusage)[device]
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
usage.WriteJsonTo(buf)
|
343
|
+
|
344
|
+
printer.PutKey(device)
|
345
|
+
usage.WriteJsonTo(printer)
|
280
346
|
}
|
281
347
|
|
282
|
-
|
348
|
+
printer.FinishObject()
|
283
349
|
}
|
284
350
|
|
285
351
|
func avgDelta(v int64, w int64, interval float64) float64 {
|
@@ -470,7 +536,7 @@ func GetNetUsage(t1 time.Time, d1 *NetStat, t2 time.Time, d2 *NetStat) (*NetUsag
|
|
470
536
|
return net_usage, nil
|
471
537
|
}
|
472
538
|
|
473
|
-
func (nusage *NetUsage) WriteJsonTo(
|
539
|
+
func (nusage *NetUsage) WriteJsonTo(printer *projson.JsonPrinter) {
|
474
540
|
var devices []string
|
475
541
|
|
476
542
|
for device, _ := range *nusage {
|
@@ -480,30 +546,121 @@ func (nusage *NetUsage) WriteJsonTo(buf *bytes.Buffer) {
|
|
480
546
|
}
|
481
547
|
sort.Strings(devices)
|
482
548
|
|
483
|
-
|
484
|
-
|
485
|
-
|
549
|
+
printer.BeginObject()
|
550
|
+
printer.PutKey("devices")
|
551
|
+
printer.BeginArray()
|
552
|
+
for _, device := range devices {
|
553
|
+
printer.PutString(device)
|
486
554
|
}
|
487
|
-
|
555
|
+
printer.FinishArray()
|
488
556
|
|
489
557
|
devices = append(devices, "total")
|
490
558
|
|
491
559
|
for _, device := range devices {
|
492
560
|
usage := (*nusage)[device]
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
561
|
+
|
562
|
+
printer.PutKey(device)
|
563
|
+
usage.WriteJsonTo(printer)
|
564
|
+
}
|
565
|
+
|
566
|
+
printer.FinishObject()
|
567
|
+
}
|
568
|
+
|
569
|
+
func GetMemUsage(mem *MemStat) (*MemUsage, error) {
|
570
|
+
if mem == nil {
|
571
|
+
return nil, errors.New("invalid memstat")
|
497
572
|
}
|
498
573
|
|
499
|
-
|
574
|
+
musage := new(MemUsage)
|
575
|
+
musage.mem = mem
|
576
|
+
|
577
|
+
return musage, nil
|
578
|
+
}
|
579
|
+
|
580
|
+
func (musage *MemUsage) WriteJsonTo(printer *projson.JsonPrinter) {
|
581
|
+
printer.BeginObject()
|
582
|
+
|
583
|
+
printer.PutKey("mem_total")
|
584
|
+
printer.PutInt64(musage.mem.MemTotal)
|
585
|
+
printer.PutKey("mem_used")
|
586
|
+
printer.PutInt64(musage.mem.MemTotal - musage.mem.MemFree - musage.mem.Buffers - musage.mem.Cached - musage.mem.SReclaimable)
|
587
|
+
printer.PutKey("mem_free")
|
588
|
+
printer.PutInt64(musage.mem.MemFree)
|
589
|
+
printer.PutKey("buffers")
|
590
|
+
printer.PutInt64(musage.mem.Buffers)
|
591
|
+
printer.PutKey("cached")
|
592
|
+
printer.PutInt64(musage.mem.Cached)
|
593
|
+
printer.PutKey("swap_cached")
|
594
|
+
printer.PutInt64(musage.mem.SwapCached)
|
595
|
+
printer.PutKey("active")
|
596
|
+
printer.PutInt64(musage.mem.Active)
|
597
|
+
printer.PutKey("inactive")
|
598
|
+
printer.PutInt64(musage.mem.Inactive)
|
599
|
+
printer.PutKey("swap_total")
|
600
|
+
printer.PutInt64(musage.mem.SwapTotal)
|
601
|
+
printer.PutKey("swap_free")
|
602
|
+
printer.PutInt64(musage.mem.SwapFree)
|
603
|
+
printer.PutKey("dirty")
|
604
|
+
printer.PutInt64(musage.mem.Dirty)
|
605
|
+
printer.PutKey("writeback")
|
606
|
+
printer.PutInt64(musage.mem.Writeback)
|
607
|
+
printer.PutKey("anon_pages")
|
608
|
+
printer.PutInt64(musage.mem.AnonPages)
|
609
|
+
printer.PutKey("mapped")
|
610
|
+
printer.PutInt64(musage.mem.Mapped)
|
611
|
+
printer.PutKey("shmem")
|
612
|
+
printer.PutInt64(musage.mem.Shmem)
|
613
|
+
printer.PutKey("slab")
|
614
|
+
printer.PutInt64(musage.mem.Slab)
|
615
|
+
printer.PutKey("s_reclaimable")
|
616
|
+
printer.PutInt64(musage.mem.SReclaimable)
|
617
|
+
printer.PutKey("s_unreclaim")
|
618
|
+
printer.PutInt64(musage.mem.SUnreclaim)
|
619
|
+
printer.PutKey("kernel_stack")
|
620
|
+
printer.PutInt64(musage.mem.KernelStack)
|
621
|
+
printer.PutKey("page_tables")
|
622
|
+
printer.PutInt64(musage.mem.PageTables)
|
623
|
+
printer.PutKey("nfs_unstable")
|
624
|
+
printer.PutInt64(musage.mem.NFS_Unstable)
|
625
|
+
printer.PutKey("bounce")
|
626
|
+
printer.PutInt64(musage.mem.Bounce)
|
627
|
+
printer.PutKey("commit_limit")
|
628
|
+
printer.PutInt64(musage.mem.CommitLimit)
|
629
|
+
printer.PutKey("committed_as")
|
630
|
+
printer.PutInt64(musage.mem.Committed_AS)
|
631
|
+
printer.PutKey("anon_huge_pages")
|
632
|
+
printer.PutInt64(musage.mem.AnonHugePages)
|
633
|
+
printer.PutKey("huge_pages_total")
|
634
|
+
printer.PutInt64(musage.mem.HugePages_Total)
|
635
|
+
printer.PutKey("huge_pages_free")
|
636
|
+
printer.PutInt64(musage.mem.HugePages_Free)
|
637
|
+
printer.PutKey("huge_pages_rsvd")
|
638
|
+
printer.PutInt64(musage.mem.HugePages_Rsvd)
|
639
|
+
printer.PutKey("huge_pages_surp")
|
640
|
+
printer.PutInt64(musage.mem.HugePages_Surp)
|
641
|
+
|
642
|
+
printer.FinishObject()
|
500
643
|
}
|
501
644
|
|
502
|
-
func (entry *NetUsageEntry) WriteJsonTo(
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
645
|
+
func (entry *NetUsageEntry) WriteJsonTo(printer *projson.JsonPrinter) {
|
646
|
+
printer.BeginObject()
|
647
|
+
|
648
|
+
printer.PutKey("rxkbyteps")
|
649
|
+
printer.PutFloatFmt(entry.RxBytesPerSec/1024.0, "%.2f")
|
650
|
+
printer.PutKey("rxpktps")
|
651
|
+
printer.PutFloatFmt(entry.RxPacketsPerSec, "%.2f")
|
652
|
+
printer.PutKey("rxerrps")
|
653
|
+
printer.PutFloatFmt(entry.RxErrorsPerSec, "%.2f")
|
654
|
+
printer.PutKey("rxdropps")
|
655
|
+
printer.PutFloatFmt(entry.RxDropsPerSec, "%.2f")
|
656
|
+
printer.PutKey("txkbyteps")
|
657
|
+
printer.PutFloatFmt(entry.TxBytesPerSec/1024.0, "%.2f")
|
658
|
+
printer.PutKey("txpktps")
|
659
|
+
printer.PutFloatFmt(entry.TxPacketsPerSec, "%.2f")
|
660
|
+
printer.PutKey("txerrps")
|
661
|
+
printer.PutFloatFmt(entry.TxErrorsPerSec, "%.2f")
|
662
|
+
printer.PutKey("txdropps")
|
663
|
+
printer.PutFloatFmt(entry.TxDropsPerSec, "%.2f")
|
664
|
+
|
665
|
+
printer.FinishObject()
|
509
666
|
}
|
@@ -1,7 +1,6 @@
|
|
1
1
|
package subsystem
|
2
2
|
|
3
3
|
import (
|
4
|
-
"bytes"
|
5
4
|
"encoding/json"
|
6
5
|
"math"
|
7
6
|
"regexp"
|
@@ -9,6 +8,8 @@ import (
|
|
9
8
|
"strings"
|
10
9
|
"testing"
|
11
10
|
"time"
|
11
|
+
|
12
|
+
projson "github.com/hayamiz/go-projson"
|
12
13
|
)
|
13
14
|
|
14
15
|
func isValidJson(byt []byte) bool {
|
@@ -89,7 +90,7 @@ func TestGetCoreUsage(t *testing.T) {
|
|
89
90
|
usage.Steal == 0 &&
|
90
91
|
usage.Guest == 0 &&
|
91
92
|
usage.GuestNice == 0) {
|
92
|
-
t.Error("usage is not 0
|
93
|
+
t.Error("usage is not 0 percent, want 0 percent")
|
93
94
|
}
|
94
95
|
|
95
96
|
// should return error if c1.Uptime() is larger than c2.Uptime()
|
@@ -120,10 +121,14 @@ func TestGetCoreUsage(t *testing.T) {
|
|
120
121
|
t.Errorf("usage.Sys = %v, want 25.0", usage.User)
|
121
122
|
}
|
122
123
|
|
123
|
-
|
124
|
-
usage.WriteJsonTo(
|
125
|
-
if
|
126
|
-
t.Errorf("
|
124
|
+
printer := projson.NewPrinter()
|
125
|
+
usage.WriteJsonTo(printer)
|
126
|
+
if str, err := printer.String(); err != nil {
|
127
|
+
t.Errorf("failed to print JSON")
|
128
|
+
} else {
|
129
|
+
if !isValidJson([]byte(str)) {
|
130
|
+
t.Errorf("Invalid JSON: %s", str)
|
131
|
+
}
|
127
132
|
}
|
128
133
|
}
|
129
134
|
|
@@ -207,15 +212,20 @@ func TestGetCpuUsage(t *testing.T) {
|
|
207
212
|
t.Errorf("usage.Sys = %v, want 25.0", usage.CoreUsages[1].User)
|
208
213
|
}
|
209
214
|
|
210
|
-
|
211
|
-
usage.WriteJsonTo(
|
212
|
-
|
213
|
-
|
215
|
+
printer := projson.NewPrinter()
|
216
|
+
usage.WriteJsonTo(printer)
|
217
|
+
str, err := printer.String()
|
218
|
+
if err != nil {
|
219
|
+
t.Errorf("failed printing JSON")
|
220
|
+
} else {
|
221
|
+
if !isValidJson([]byte(str)) {
|
222
|
+
t.Errorf("Invalid JSON: %s", str)
|
223
|
+
}
|
214
224
|
}
|
215
225
|
|
216
226
|
assertHasKey := func(key_path string) {
|
217
|
-
if !jsonHasKey(
|
218
|
-
t.Errorf("%v is not present in JSON:\n%v", key_path,
|
227
|
+
if !jsonHasKey([]byte(str), key_path) {
|
228
|
+
t.Errorf("%v is not present in JSON:\n%v", key_path, str)
|
219
229
|
}
|
220
230
|
}
|
221
231
|
assertHasKey("num_core")
|
@@ -291,10 +301,15 @@ func TestDiskUsage(t *testing.T) {
|
|
291
301
|
t.Errorf("sda.RdSectors = %v, want %v", (*usage)["sda"].RdSectors, 350)
|
292
302
|
}
|
293
303
|
|
294
|
-
|
295
|
-
usage.WriteJsonTo(
|
296
|
-
|
297
|
-
|
304
|
+
printer := projson.NewPrinter()
|
305
|
+
usage.WriteJsonTo(printer)
|
306
|
+
str, err := printer.String()
|
307
|
+
if err != nil {
|
308
|
+
t.Errorf("failed printing JSON")
|
309
|
+
} else {
|
310
|
+
if !isValidJson([]byte(str)) {
|
311
|
+
t.Errorf("invalid json: %s", str)
|
312
|
+
}
|
298
313
|
}
|
299
314
|
|
300
315
|
d1.Entries = append(d1.Entries, NewDiskStatEntry())
|
@@ -347,15 +362,20 @@ func TestDiskUsage(t *testing.T) {
|
|
347
362
|
t.Errorf("total.RdSectors = %v, want %v", (*usage)["total"].RdSectors, 350)
|
348
363
|
}
|
349
364
|
|
350
|
-
|
351
|
-
usage.WriteJsonTo(
|
352
|
-
|
353
|
-
|
365
|
+
printer = projson.NewPrinter()
|
366
|
+
usage.WriteJsonTo(printer)
|
367
|
+
str, err = printer.String()
|
368
|
+
if err != nil {
|
369
|
+
t.Errorf("failed printing JSON")
|
370
|
+
} else {
|
371
|
+
if !isValidJson([]byte(str)) {
|
372
|
+
t.Errorf("invalid json: %s", str)
|
373
|
+
}
|
354
374
|
}
|
355
375
|
|
356
376
|
assertHasKey := func(key_path string) {
|
357
|
-
if !jsonHasKey(
|
358
|
-
t.Errorf("%v is not present in JSON:\n%v", key_path,
|
377
|
+
if !jsonHasKey([]byte(str), key_path) {
|
378
|
+
t.Errorf("%v is not present in JSON:\n%v", key_path, str)
|
359
379
|
}
|
360
380
|
}
|
361
381
|
assertHasKey("devices")
|
@@ -428,10 +448,15 @@ func TestGetNetUsage(t *testing.T) {
|
|
428
448
|
t.Errorf("lo.RxPacketsPerSec = %v, want %v", (*usage)["lo"].RxPacketsPerSec, 100.0/interval)
|
429
449
|
}
|
430
450
|
|
431
|
-
|
432
|
-
usage.WriteJsonTo(
|
433
|
-
|
434
|
-
|
451
|
+
printer := projson.NewPrinter()
|
452
|
+
usage.WriteJsonTo(printer)
|
453
|
+
str, err := printer.String()
|
454
|
+
if err != nil {
|
455
|
+
t.Errorf("failed printing JSON")
|
456
|
+
} else {
|
457
|
+
if !isValidJson([]byte(str)) {
|
458
|
+
t.Errorf("invalid json: %s", str)
|
459
|
+
}
|
435
460
|
}
|
436
461
|
|
437
462
|
n1.Entries = append(n1.Entries, NewNetStatEntry())
|
@@ -483,15 +508,20 @@ func TestGetNetUsage(t *testing.T) {
|
|
483
508
|
(100.0+150.0)/interval)
|
484
509
|
}
|
485
510
|
|
486
|
-
|
487
|
-
usage.WriteJsonTo(
|
488
|
-
|
489
|
-
|
511
|
+
printer = projson.NewPrinter()
|
512
|
+
usage.WriteJsonTo(printer)
|
513
|
+
str, err = printer.String()
|
514
|
+
if err != nil {
|
515
|
+
t.Errorf("failed printing JSON")
|
516
|
+
} else {
|
517
|
+
if !isValidJson([]byte(str)) {
|
518
|
+
t.Errorf("invalid json: %s", str)
|
519
|
+
}
|
490
520
|
}
|
491
521
|
|
492
522
|
assertHasKey := func(key_path string) {
|
493
|
-
if !jsonHasKey(
|
494
|
-
t.Errorf("%v is not present in JSON:\n%v", key_path,
|
523
|
+
if !jsonHasKey([]byte(str), key_path) {
|
524
|
+
t.Errorf("%v is not present in JSON:\n%v", key_path, str)
|
495
525
|
}
|
496
526
|
}
|
497
527
|
assertHasKey("devices")
|