perfmonger 0.10.2 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +3 -0
  3. data/.travis.yml +9 -8
  4. data/HOWTO.md +0 -1
  5. data/NEWS +49 -5
  6. data/README.md +77 -27
  7. data/Rakefile +33 -11
  8. data/core/Makefile +22 -31
  9. data/core/build.sh +6 -8
  10. data/core/cmd/perfmonger-player/perfmonger-player.go +247 -0
  11. data/core/{perfmonger-plot-formatter.go → cmd/perfmonger-plot-formatter/perfmonger-plot-formatter.go} +20 -5
  12. data/core/{perfmonger-recorder.go → cmd/perfmonger-recorder/perfmonger-recorder.go} +22 -2
  13. data/core/{perfmonger-summarizer.go → cmd/perfmonger-summarizer/perfmonger-summarizer.go} +22 -15
  14. data/core/cmd/perfmonger-viewer/perfmonger-viewer.go +164 -0
  15. data/core/go.mod +10 -0
  16. data/core/go.sum +17 -0
  17. data/core/subsystem/Makefile +4 -0
  18. data/core/subsystem/perfmonger_linux.go +95 -0
  19. data/core/subsystem/perfmonger_linux_test.go +40 -0
  20. data/core/subsystem/stat.go +70 -0
  21. data/core/subsystem/stat_test.go +9 -0
  22. data/core/subsystem/usage.go +223 -66
  23. data/core/subsystem/usage_test.go +62 -32
  24. data/core/utils.go +2 -2
  25. data/{bin → exe}/perfmonger +0 -0
  26. data/lib/exec/perfmonger-player_darwin_amd64 +0 -0
  27. data/lib/exec/perfmonger-player_linux_amd64 +0 -0
  28. data/lib/exec/perfmonger-plot-formatter_darwin_amd64 +0 -0
  29. data/lib/exec/perfmonger-plot-formatter_linux_amd64 +0 -0
  30. data/lib/exec/perfmonger-recorder_darwin_amd64 +0 -0
  31. data/lib/exec/perfmonger-recorder_linux_amd64 +0 -0
  32. data/lib/exec/perfmonger-summarizer_darwin_amd64 +0 -0
  33. data/lib/exec/perfmonger-summarizer_linux_amd64 +0 -0
  34. data/lib/exec/perfmonger-viewer_darwin_amd64 +0 -0
  35. data/lib/exec/perfmonger-viewer_linux_amd64 +0 -0
  36. data/lib/perfmonger/command/fingerprint.rb +26 -1
  37. data/lib/perfmonger/command/live.rb +19 -0
  38. data/lib/perfmonger/command/play.rb +16 -0
  39. data/lib/perfmonger/command/plot.rb +23 -9
  40. data/lib/perfmonger/command/record.rb +24 -3
  41. data/lib/perfmonger/command/record_option.rb +16 -0
  42. data/lib/perfmonger/command/server.rb +1 -1
  43. data/lib/perfmonger/version.rb +1 -1
  44. data/misc/werker-box/Dockerfile +34 -0
  45. data/misc/werker-box/build-push.sh +7 -0
  46. data/perfmonger.gemspec +2 -1
  47. data/spec/data/busy100.pgr.played +3 -3
  48. data/spec/fingerprint_spec.rb +1 -1
  49. data/spec/live_spec.rb +2 -3
  50. data/spec/perfmonger_spec.rb +1 -1
  51. data/spec/play_spec.rb +1 -1
  52. data/spec/plot_spec.rb +16 -1
  53. data/spec/record_spec.rb +10 -1
  54. data/spec/spec_helper.rb +28 -3
  55. data/spec/stat_spec.rb +2 -2
  56. data/spec/summary_spec.rb +1 -1
  57. data/wercker.yml +29 -16
  58. metadata +34 -14
  59. data/core/perfmonger-player.go +0 -196
  60. data/lib/exec/perfmonger-player_linux_386 +0 -0
  61. data/lib/exec/perfmonger-plot-formatter_linux_386 +0 -0
  62. data/lib/exec/perfmonger-recorder_linux_386 +0 -0
  63. data/lib/exec/perfmonger-summarizer_linux_386 +0 -0
@@ -1,7 +1,7 @@
1
1
 
2
2
  require 'spec_helper'
3
3
 
4
- describe "perfmonger command" do
4
+ RSpec.describe "perfmonger command" do
5
5
  it "should be an executable" do
6
6
  expect(File.executable?(perfmonger_bin)).to be true
7
7
  end
data/spec/play_spec.rb CHANGED
@@ -1,7 +1,7 @@
1
1
 
2
2
  require 'spec_helper'
3
3
 
4
- describe '[play] subcommand' do
4
+ RSpec.describe '[play] subcommand' do
5
5
  it 'should print 3 JSON records for busy100.pgr' do
6
6
  busy100 = data_file "busy100.pgr"
7
7
  cmd = "#{perfmonger_bin} play #{busy100}"
data/spec/plot_spec.rb CHANGED
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  # TODO: examples for options
4
4
 
5
- describe '[plot] subcommand' do
5
+ RSpec.describe '[plot] subcommand' do
6
6
  let(:busy100_disk_dat) {
7
7
  File.read(data_file "busy100.pgr.plot-formatted.disk.dat")
8
8
  }
@@ -74,4 +74,19 @@ describe '[plot] subcommand' do
74
74
  expect("disk.dat").to have_file_content busy100_disk_dat
75
75
  expect("cpu.dat").to have_file_content busy100_cpu_dat
76
76
  end
77
+
78
+ it "should work with --disk-only option" do
79
+ busy100 = data_file "busy100.pgr.gz"
80
+
81
+ cmd = "#{perfmonger_bin} plot --save #{busy100} --disk-only sda1"
82
+
83
+ run(cmd, 30)
84
+
85
+ expect(last_command_started).to be_successfully_executed
86
+
87
+ disk_dat = File.expand_path("disk.dat", last_command_started.working_directory)
88
+ total_write_iops = `cat #{disk_dat}|grep total -A 2|tail -n1|awk '{print $3}'`.to_f
89
+
90
+ expect(total_write_iops).to be_within(1.67).of(0.01)
91
+ end
77
92
  end
data/spec/record_spec.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe '[record] subcommand' do
3
+ RSpec.describe '[record] subcommand' do
4
4
  before(:each) do
5
5
  skip_if_proc_is_not_available
6
6
  end
@@ -9,7 +9,16 @@ describe '[record] subcommand' do
9
9
  cmd = "#{perfmonger_bin} record --timeout 1"
10
10
  run(cmd)
11
11
  expect(last_command_started).to be_successfully_executed
12
+ expect("perfmonger.pgr.gz").to be_an_existing_file # default file name
13
+ expect(last_command_started.stdout).to be_empty
14
+ end
15
+
16
+ it 'should create a non-gzipped logfile' do
17
+ cmd = "#{perfmonger_bin} record --timeout 1 --no-gzip"
18
+ run(cmd)
19
+ expect(last_command_started).to be_successfully_executed
12
20
  expect("perfmonger.pgr").to be_an_existing_file # default file name
13
21
  expect(last_command_started.stdout).to be_empty
14
22
  end
23
+
15
24
  end
data/spec/spec_helper.rb CHANGED
@@ -19,15 +19,40 @@ def data_file(rel_path)
19
19
  end
20
20
 
21
21
  def perfmonger_bin
22
- File.expand_path('../../bin/perfmonger', __FILE__)
22
+ File.expand_path('../../exe/perfmonger', __FILE__)
23
23
  end
24
24
 
25
25
  RSpec.configure do |config|
26
- # RSpec config here
26
+ config.expect_with :rspec do |expectations|
27
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
28
+ end
29
+
30
+ config.mock_with :rspec do |mocks|
31
+ mocks.verify_partial_doubles = true
32
+ end
33
+
34
+ config.shared_context_metadata_behavior = :apply_to_host_groups
35
+
36
+ config.filter_run_when_matching :focus
37
+
38
+ config.example_status_persistence_file_path = "spec/examples.txt"
39
+
40
+ config.disable_monkey_patching!
41
+
42
+ config.warnings = true
43
+
44
+ if config.files_to_run.one?
45
+ config.default_formatter = "doc"
46
+ end
47
+
48
+ config.profile_examples = 10
49
+
50
+ config.order = :random
51
+ # Kernel.srand config.seed
27
52
  end
28
53
 
29
54
  def skip_if_proc_is_not_available
30
- if ! File.exists?("/proc/diskstats")
55
+ if ! File.exist?("/proc/diskstats")
31
56
  skip "/proc/diskstats is not available."
32
57
  end
33
58
  end
data/spec/stat_spec.rb CHANGED
@@ -1,7 +1,7 @@
1
1
 
2
2
  require 'spec_helper'
3
3
 
4
- describe '[stat] subcommand' do
4
+ RSpec.describe '[stat] subcommand' do
5
5
  before(:each) do
6
6
  skip_if_proc_is_not_available
7
7
  end
@@ -10,6 +10,6 @@ describe '[stat] subcommand' do
10
10
  cmd = "#{perfmonger_bin} stat -- sleep 1"
11
11
  run(cmd)
12
12
  expect(last_command_started).to be_successfully_executed
13
- expect("perfmonger.pgr").to be_an_existing_file
13
+ expect("perfmonger.pgr.gz").to be_an_existing_file
14
14
  end
15
15
  end
data/spec/summary_spec.rb CHANGED
@@ -1,7 +1,7 @@
1
1
 
2
2
  require 'spec_helper'
3
3
 
4
- describe '[summary] subcommand' do
4
+ RSpec.describe '[summary] subcommand' do
5
5
  let(:busy100_summary) do
6
6
  content = File.read(data_file "busy100.pgr.summary")
7
7
 
data/wercker.yml CHANGED
@@ -1,4 +1,4 @@
1
- box: hayamiz/rvm-golang
1
+ box: hayamiz/go-rvm:wercker-env-0.11.2
2
2
  # Build definition
3
3
  build:
4
4
  # The steps that will be executed on build
@@ -6,19 +6,17 @@ build:
6
6
  # http://devcenter.wercker.com/articles/languages/ruby.html
7
7
  steps:
8
8
  - script:
9
- name: install gnuplot and check terminal
9
+ name: prepare perfmonger go subsystem
10
10
  code: |
11
- sudo apt-get update
12
- sudo apt-get install gnuplot
13
- gnuplot -e "set terminal" < /dev/null 2>&1
11
+ source /etc/profile.d/rvm.sh
12
+ rvm use 2.4.9
13
+ rake go_get
14
14
 
15
15
  - script:
16
- name: install go packages
16
+ name: switch ruby to 2.4.9
17
17
  code: |
18
- go get -u golang.org/x/crypto/ssh/terminal
19
- go get -u github.com/hayamiz/perfmonger/core/subsystem
20
- - rvm-use:
21
- version: 1.9.3-p551
18
+ source /etc/profile.d/rvm.sh
19
+ rvm use 2.4.9
22
20
  - bundle-install
23
21
  - script:
24
22
  name: run rspec
@@ -26,8 +24,11 @@ build:
26
24
  bundle exec rake clean
27
25
  bundle exec rake spec
28
26
 
29
- - rvm-use:
30
- version: 2.0.0-p598
27
+ - script:
28
+ name: switch ruby to 2.5.7
29
+ code: |
30
+ source /etc/profile.d/rvm.sh
31
+ rvm use 2.5.7
31
32
  - bundle-install
32
33
  - script:
33
34
  name: run rspec
@@ -35,8 +36,11 @@ build:
35
36
  bundle exec rake clean
36
37
  bundle exec rake spec
37
38
 
38
- - rvm-use:
39
- version: 2.1.5
39
+ - script:
40
+ name: switch ruby to 2.6.5
41
+ code: |
42
+ source /etc/profile.d/rvm.sh
43
+ rvm use 2.6.5
40
44
  - bundle-install
41
45
  - script:
42
46
  name: run rspec
@@ -44,8 +48,11 @@ build:
44
48
  bundle exec rake clean
45
49
  bundle exec rake spec
46
50
 
47
- - rvm-use:
48
- version: 2.2.0
51
+ - script:
52
+ name: switch ruby to 2.7.0
53
+ code: |
54
+ source /etc/profile.d/rvm.sh
55
+ rvm use 2.7.0
49
56
  - bundle-install
50
57
  - script:
51
58
  name: run rspec
@@ -57,3 +64,9 @@ build:
57
64
  name: run go test
58
65
  code: |
59
66
  bundle exec rake test_core
67
+ after-steps:
68
+ - slack-notifier:
69
+ url: $SLACK_URL
70
+ channel: pokeme
71
+ username: werckerbot
72
+ notify_on: "failed"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: perfmonger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.2
4
+ version: 0.12.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuto HAYAMIZU
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2017-09-14 00:00:00.000000000 Z
11
+ date: 2021-07-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -99,13 +99,15 @@ files:
99
99
  - NEWS
100
100
  - README.md
101
101
  - Rakefile
102
- - bin/perfmonger
103
102
  - core/Makefile
104
103
  - core/build.sh
105
- - core/perfmonger-player.go
106
- - core/perfmonger-plot-formatter.go
107
- - core/perfmonger-recorder.go
108
- - core/perfmonger-summarizer.go
104
+ - core/cmd/perfmonger-player/perfmonger-player.go
105
+ - core/cmd/perfmonger-plot-formatter/perfmonger-plot-formatter.go
106
+ - core/cmd/perfmonger-recorder/perfmonger-recorder.go
107
+ - core/cmd/perfmonger-summarizer/perfmonger-summarizer.go
108
+ - core/cmd/perfmonger-viewer/perfmonger-viewer.go
109
+ - core/go.mod
110
+ - core/go.sum
109
111
  - core/subsystem/Makefile
110
112
  - core/subsystem/perfmonger.go
111
113
  - core/subsystem/perfmonger_darwin.go
@@ -129,18 +131,17 @@ files:
129
131
  - data/assets/js/canvasjs.js
130
132
  - data/assets/js/canvasjs.min.js
131
133
  - data/sysstat.ioconf
134
+ - exe/perfmonger
132
135
  - lib/exec/perfmonger-player_darwin_amd64
133
- - lib/exec/perfmonger-player_linux_386
134
136
  - lib/exec/perfmonger-player_linux_amd64
135
137
  - lib/exec/perfmonger-plot-formatter_darwin_amd64
136
- - lib/exec/perfmonger-plot-formatter_linux_386
137
138
  - lib/exec/perfmonger-plot-formatter_linux_amd64
138
139
  - lib/exec/perfmonger-recorder_darwin_amd64
139
- - lib/exec/perfmonger-recorder_linux_386
140
140
  - lib/exec/perfmonger-recorder_linux_amd64
141
141
  - lib/exec/perfmonger-summarizer_darwin_amd64
142
- - lib/exec/perfmonger-summarizer_linux_386
143
142
  - lib/exec/perfmonger-summarizer_linux_amd64
143
+ - lib/exec/perfmonger-viewer_darwin_amd64
144
+ - lib/exec/perfmonger-viewer_linux_amd64
144
145
  - lib/perfmonger.rb
145
146
  - lib/perfmonger/cli.rb
146
147
  - lib/perfmonger/command/base_command.rb
@@ -163,6 +164,8 @@ files:
163
164
  - misc/release-howto.txt
164
165
  - misc/sample-cpu.png
165
166
  - misc/sample-read-iops.png
167
+ - misc/werker-box/Dockerfile
168
+ - misc/werker-box/build-push.sh
166
169
  - perfmonger.gemspec
167
170
  - spec/data/busy100.pgr
168
171
  - spec/data/busy100.pgr.gz
@@ -214,8 +217,25 @@ required_rubygems_version: !ruby/object:Gem::Requirement
214
217
  version: '0'
215
218
  requirements: []
216
219
  rubyforge_project:
217
- rubygems_version: 2.5.1
220
+ rubygems_version: 2.7.6
218
221
  signing_key:
219
222
  specification_version: 4
220
223
  summary: yet anothor performance measurement/monitoring tool
221
- test_files: []
224
+ test_files:
225
+ - spec/data/busy100.pgr
226
+ - spec/data/busy100.pgr.gz
227
+ - spec/data/busy100.pgr.played
228
+ - spec/data/busy100.pgr.plot-formatted.cpu.dat
229
+ - spec/data/busy100.pgr.plot-formatted.disk.dat
230
+ - spec/data/busy100.pgr.summary
231
+ - spec/data/busy100.pgr.summary.json
232
+ - spec/fingerprint_spec.rb
233
+ - spec/live_spec.rb
234
+ - spec/perfmonger_spec.rb
235
+ - spec/play_spec.rb
236
+ - spec/plot_spec.rb
237
+ - spec/record_spec.rb
238
+ - spec/spec_helper.rb
239
+ - spec/stat_spec.rb
240
+ - spec/summary_spec.rb
241
+ - spec/support/aruba.rb
@@ -1,196 +0,0 @@
1
- //usr/bin/env go run $0 $@ ; exit
2
-
3
- package main
4
-
5
- import (
6
- "bufio"
7
- "bytes"
8
- "encoding/gob"
9
- "fmt"
10
- "io"
11
- "os"
12
-
13
- ss "github.com/hayamiz/perfmonger/core/subsystem"
14
- )
15
-
16
- func showCpuStat(buffer *bytes.Buffer, prev_rec *ss.StatRecord, cur_rec *ss.StatRecord) error {
17
- cusage, err := ss.GetCpuUsage(prev_rec.Cpu, cur_rec.Cpu)
18
- if err != nil {
19
- return err
20
- }
21
- buffer.WriteString(`,"cpu":`)
22
- cusage.WriteJsonTo(buffer)
23
-
24
- return nil
25
- }
26
-
27
- func showInterruptStat(buffer *bytes.Buffer, prev_rec *ss.StatRecord, cur_rec *ss.StatRecord) error {
28
- // intr_usage, err := ss.GetInterruptUsage(
29
- // prev_rec.Time, prev_rec.Interrupt,
30
- // cur_rec.Time, cur_rec.Interrupt)
31
- // if err != nil {
32
- // return err
33
- // }
34
- //
35
- // buffer.WriteString(`,"intr":`)
36
- // intr_usage.WriteJsonTo(buffer)
37
- //
38
- // return nil
39
-
40
- intr_usage, err := ss.GetInterruptUsage(
41
- prev_rec.Time, prev_rec.Interrupt,
42
- cur_rec.Time, cur_rec.Interrupt)
43
- if err != nil {
44
- return err
45
- }
46
-
47
- buffer.WriteString(`,"intr":`)
48
- intr_usage.WriteJsonTo(buffer)
49
-
50
- return nil
51
- }
52
-
53
- func showDiskStat(buffer *bytes.Buffer, prev_rec *ss.StatRecord, cur_rec *ss.StatRecord) error {
54
- dusage, err := ss.GetDiskUsage(
55
- prev_rec.Time, prev_rec.Disk,
56
- cur_rec.Time, cur_rec.Disk)
57
- if err != nil {
58
- return err
59
- }
60
-
61
- buffer.WriteString(`,"disk":`)
62
- dusage.WriteJsonTo(buffer)
63
-
64
- return nil
65
- }
66
-
67
- func showNetStat(buffer *bytes.Buffer, prev_rec *ss.StatRecord, cur_rec *ss.StatRecord) error {
68
- dusage, err := ss.GetNetUsage(
69
- prev_rec.Time, prev_rec.Net,
70
- cur_rec.Time, cur_rec.Net,
71
- )
72
- if err != nil {
73
- return err
74
- }
75
-
76
- buffer.WriteString(`,"net":`)
77
- dusage.WriteJsonTo(buffer)
78
-
79
- return nil
80
- }
81
-
82
- func showStat(buffer *bytes.Buffer, prev_rec *ss.StatRecord, cur_rec *ss.StatRecord) error {
83
- buffer.WriteString(fmt.Sprintf(`{"time":%.3f`, float64(cur_rec.Time.UnixNano())/1e9))
84
- if cur_rec.Cpu != nil {
85
- err := showCpuStat(buffer, prev_rec, cur_rec)
86
- if err != nil {
87
- return err
88
- }
89
- }
90
- if cur_rec.Interrupt != nil {
91
- err := showInterruptStat(buffer, prev_rec, cur_rec)
92
- if err != nil {
93
- return err
94
- }
95
- }
96
- if cur_rec.Disk != nil {
97
- err := showDiskStat(buffer, prev_rec, cur_rec)
98
- if err != nil {
99
- return err
100
- }
101
- }
102
- if cur_rec.Net != nil {
103
- err := showNetStat(buffer, prev_rec, cur_rec)
104
- if err != nil {
105
- return err
106
- }
107
- }
108
- buffer.WriteString("}\n")
109
-
110
- return nil
111
- }
112
-
113
- func main() {
114
- args := os.Args
115
- var in *os.File
116
- var out *bufio.Writer
117
-
118
- if len(args) < 2 {
119
- in = os.Stdin
120
- } else {
121
- f, err := os.Open(args[1])
122
- if err != nil {
123
- panic(err)
124
- }
125
- in = f
126
- defer f.Close()
127
- }
128
- input_reader := newPerfmongerLogReader(in)
129
- dec := gob.NewDecoder(input_reader)
130
-
131
- out = bufio.NewWriter(os.Stdout)
132
-
133
- var cheader ss.CommonHeader
134
- var pheader ss.PlatformHeader
135
- var records = make([]ss.StatRecord, 2)
136
- curr := 0
137
-
138
- var err error
139
-
140
- err = dec.Decode(&cheader)
141
- if err == io.EOF {
142
- return
143
- }
144
- if err != nil {
145
- panic(err)
146
- }
147
- err = dec.Decode(&pheader)
148
- if err == io.EOF {
149
- return
150
- }
151
- if err != nil {
152
- panic(err)
153
- }
154
-
155
- // read first record
156
- err = dec.Decode(&records[curr])
157
- if err == io.EOF {
158
- return
159
- } else if err != nil {
160
- panic(err)
161
- }
162
- curr ^= 1
163
-
164
- buffer := bytes.NewBuffer([]byte{})
165
- for {
166
- prev_rec := &records[curr^1]
167
- cur_rec := &records[curr]
168
-
169
- err = dec.Decode(cur_rec)
170
- if err == io.EOF {
171
- break
172
- } else if err != nil {
173
- panic(err)
174
- }
175
-
176
- err = showStat(buffer, prev_rec, cur_rec)
177
- if err != nil {
178
- buffer.Reset()
179
- fmt.Fprintln(os.Stderr, "skip by err")
180
- continue
181
- }
182
-
183
- _, err = out.WriteString(buffer.String())
184
- err = out.Flush()
185
- if err != nil {
186
- // stdout is closed
187
- break
188
- }
189
-
190
- buffer.Reset()
191
-
192
- curr ^= 1
193
- }
194
-
195
- return
196
- }