msgknife 0.0.1 → 0.0.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 12486e66b362622c270279e3f899c878aefacbc2
4
- data.tar.gz: 0f7c2744d6339331415be1642d4b9e050d1902cb
3
+ metadata.gz: 4fd10df9695dc9f79dacf92ee420f6982a2036b4
4
+ data.tar.gz: 3996af2ae260d1bf6903b6bddee0446dde52a4b9
5
5
  SHA512:
6
- metadata.gz: 46957373ce19f947101ffd7e15880616c0c96659350615779c99b45df87afc680114c0c7cc7af35e89d9b78bcb3e68ddcaeb0e83f59dddfae9e9bb9a3e86886d
7
- data.tar.gz: 635c553d8ba0ebb8b1ac6d58cdef331535f0cdf67a83f3960bc5e36cb27a06472d6bdea5ba8e81d9e8aeb56bbacfdc6adb686ab2ea988c1fc68f3c9b85e19f84
6
+ metadata.gz: 4fa624d4c51d6660a8fc842f094ca428dacbf15a0461e9e501197d48eed07515f9e4b93d1f45f7028ab77428ac358a054c169b22b54590d3f88c491d910eb037
7
+ data.tar.gz: d9ec2ad336ca7213b56b4dae51cfc95bfcc0771296bc8a7959f10ad07a2620c6c1968871a08f4c48f8c269b6c93d3d6b6a42d842062c43d5f65d0318a592229c
data/bin/mdot ADDED
@@ -0,0 +1,120 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'msgknife'
4
+ require 'pp'
5
+ require 'set'
6
+ require 'digest/md5'
7
+
8
+ # MsgPack Prety Print
9
+ class MDot < Msgknife::Stream
10
+ class Node
11
+ attr_reader :key, :hkey, :fwd_link, :fwd_count, :back_link, :category
12
+
13
+ def initialize(label)
14
+ label = '(nil)' if label.nil?
15
+ @key = label
16
+ @hkey = Digest::MD5.hexdigest(label)
17
+ @fwd_link = {}
18
+ @fwd_count = Hash.new{|h,k| h[k] = 0}
19
+ @back_link = {}
20
+ end
21
+
22
+ def set_cat(cat)
23
+ @category = cat
24
+ end
25
+
26
+ def attach(tgt)
27
+ @fwd_link[tgt.key] = tgt
28
+ @fwd_count[tgt.key] += 1
29
+ tgt.attach_back(self)
30
+ end
31
+
32
+ def attach_back(tgt)
33
+ @back_link[tgt.key] = tgt
34
+ end
35
+
36
+ def set(memo=Set.new)
37
+ if memo.include?(@key)
38
+ return memo
39
+ else
40
+ memo.add(@key)
41
+ @fwd_link.each do |k,n|
42
+ memo = n.set(memo) unless memo.include?(k)
43
+ end
44
+ @back_link.each do |k,n|
45
+ memo = n.set(memo) unless memo.include?(k)
46
+ end
47
+ end
48
+ return memo
49
+ end
50
+ end
51
+
52
+ def initialize
53
+ super
54
+ @node_map = Hash.new{|h,k| h[k] = Node.new(k)}
55
+ @optpsr.on('-M val', 'size of minimum graph size') {|v| @min_size = v.to_i}
56
+ @optpsr.on('-N', 'skip if value is nil') {|v| @skip_nil = v }
57
+ @optpsr.on('-d', 'output as dot format') {|v| @out_dot = v }
58
+ end
59
+
60
+ def setup(argv)
61
+ @key1 = argv[0]
62
+ @key2 = argv[1]
63
+ end
64
+
65
+ def recv(obj, ts, tag)
66
+ if obj.key?(@key1) and obj.key?(@key2)
67
+ return if @skip_nil and (obj[@key1].nil? or obj[@key2].nil?)
68
+ n1 = @node_map[obj[@key1]]
69
+ n2 = @node_map[obj[@key2]]
70
+ n1.set_cat(0)
71
+ n2.set_cat(1)
72
+ n1.attach(n2)
73
+ end
74
+ end
75
+
76
+ def teardown
77
+ ignore_set = Set.new
78
+ unless @min_size.nil?
79
+ @node_map.each do |key, node|
80
+ next if ignore_set.include?(key)
81
+ m = node.set
82
+ m.each {|n| ignore_set.add(n)} if m.size < @min_size
83
+ end
84
+ end
85
+
86
+ if @out_dot
87
+ puts "digraph mdot {"
88
+ @node_map.each do |key, node|
89
+ next if ignore_set.include?(node.key)
90
+ key = node.key.gsub('"', '\"')
91
+ case node.category
92
+ when 0; color = '#fbeac1'
93
+ when 1; color = '#ecac12'
94
+ end
95
+ puts " \"#{node.hkey}\" [label=\"#{key}\" color=\"#{color}\" style=\"filled\"];"
96
+ end
97
+
98
+ @node_map.each do |key1, node1|
99
+ next if ignore_set.include?(key1)
100
+ node1.fwd_link.each do |key2, node2|
101
+ count = node1.fwd_count[key2]
102
+ puts " \"#{node1.hkey}\" -> \"#{node2.hkey}\" [label=\"#{count}\" len=2.5];"
103
+ end
104
+ end
105
+ puts "}"
106
+
107
+ else
108
+ @node_map.each do |key1, node1|
109
+ next if ignore_set.include?(key1)
110
+ node1.fwd_link.each do |key2, node2|
111
+ count = node1.fwd_count[key2]
112
+ write_stream({'src'=>key1, 'dst'=>key2, 'count'=>count})
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
118
+
119
+ ins = MDot.new()
120
+ ins.run(ARGV, 0..1)
data/bin/medit ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'msgknife'
4
+ require 'pp'
5
+
6
+ # MsgPack Prety Print
7
+ class MPP < Msgknife::Stream
8
+ def setup(argv); end
9
+ def recv(obj, ts, tag)
10
+ write_stream(obj, ts, tag)
11
+ end
12
+ end
13
+
14
+ ins = MPP.new()
15
+ ins.run(ARGV)
data/bin/mhead ADDED
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'msgknife'
4
+ require 'pp'
5
+
6
+ class MHead < Msgknife::Stream
7
+ def initialize
8
+ super
9
+ @num = 20
10
+ @json = false
11
+ @optpsr.on('-n VAL', 'number of message to show') {|v| @num = v.to_i }
12
+ end
13
+
14
+ def setup(argv)
15
+ @count = 0
16
+ end
17
+ def recv(obj, ts, tag)
18
+ if @count < @num
19
+ write_stream(obj, ts, tag)
20
+ else
21
+ return false
22
+ end
23
+ @count += 1
24
+ end
25
+ def teardown
26
+ end
27
+ end
28
+
29
+ MHead.new.run(ARGV)
30
+
data/bin/mheat CHANGED
@@ -6,6 +6,7 @@ require 'pp'
6
6
  require 'time'
7
7
  require 'msgpack'
8
8
  require 'json'
9
+ require 'terminfo'
9
10
 
10
11
  # MsgPack Prety Print
11
12
  class MHeatMap < Msgknife::Stream
@@ -19,19 +20,20 @@ class MHeatMap < Msgknife::Stream
19
20
  @ts_key = 'ts'
20
21
  @optpsr.on('-t VAL', 'timestamp key name') { |v| @ts_key = v }
21
22
 
23
+ @ts_start = nil
24
+ @ts_end = nil
25
+ @optpsr.on('-s VAL', 'timestamp of start') {|v| @ts_start = v.to_i }
26
+ @optpsr.on('-e VAL', 'timestamp of end') {|v| @ts_end = v.to_i }
27
+
22
28
  @count_key = nil
23
29
  @optpsr.on('-c VAL', 'key name to sum numbers') { |v| @count_key = v }
24
30
 
25
- @width = 80 - 32
31
+ @width = TermInfo.screen_size[1] - 35
26
32
  @optpsr.on('-w VAL', 'width') { |v| @width = v.to_i }
27
33
 
28
34
  @relative = false
29
35
  @optpsr.on('-r', 'relative time') { |v| @relative = true }
30
36
 
31
- @output_fmt = 'console'
32
- @optpsr.on('-j', 'output as json') { |v| @output_fmt = 'json' }
33
- @optpsr.on('-m', 'output as msgpack') { |v| @output_fmt = 'msgpack' }
34
-
35
37
  # Set internval parameters
36
38
  @key = nil
37
39
  @ts_min = nil
@@ -68,7 +70,17 @@ class MHeatMap < Msgknife::Stream
68
70
  end
69
71
 
70
72
  def output_console(obj)
71
- STDOUT.write(sprintf("%30s | %s", "", obj['cols'][0]))
73
+ ep = obj['cols'].size - 1
74
+ dt1_len = obj['cols'][0].size
75
+ dt2_len = obj['cols'][ep].size
76
+ sp_len = @width - (dt1_len + dt2_len) - 2
77
+ if sp_len > 0
78
+ STDOUT.write(sprintf("%30s | %s %s %s|" , "", obj['cols'][0], " " * sp_len,
79
+ obj['cols'][ep]))
80
+ else
81
+ STDOUT.write(sprintf("%30s | %s" , "", obj['cols'][0]))
82
+ end
83
+
72
84
  puts
73
85
  STDOUT.write(sprintf("%30s | %s|", "-" * 28,
74
86
  "-" * @width))
@@ -95,6 +107,10 @@ class MHeatMap < Msgknife::Stream
95
107
  end
96
108
 
97
109
  def teardown
110
+ @ts_max = @ts_end unless @ts_end.nil?
111
+ @ts_min = @ts_start unless @ts_start.nil?
112
+
113
+ raise 'start timestamp should be less than end timestamp' if @ts_max < @ts_min
98
114
  dur_ts = @ts_max - @ts_min
99
115
  ts_unit = dur_ts / @width
100
116
 
@@ -117,11 +133,13 @@ class MHeatMap < Msgknife::Stream
117
133
  }}
118
134
  @rows.each do |k, ts_list|
119
135
  ts_list.each do |ts, val|
120
- idx = ((ts - @ts_min) / ts_unit).to_i
121
- idx = @width - 1 if idx >= @width
122
- data_map[k]['row'][idx] += val
123
- if data_map[k]['max'] < data_map[k]['row'][idx]
124
- data_map[k]['max'] = data_map[k]['row'][idx]
136
+ if @ts_min <= ts and ts <= @ts_max
137
+ idx = ((ts - @ts_min) / ts_unit).to_i
138
+ idx = @width - 1 if idx >= @width
139
+ data_map[k]['row'][idx] += val
140
+ if data_map[k]['max'] < data_map[k]['row'][idx]
141
+ data_map[k]['max'] = data_map[k]['row'][idx]
142
+ end
125
143
  end
126
144
  end
127
145
  end
data/bin/msplit ADDED
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'msgknife'
4
+ require 'fileutils'
5
+
6
+ # MsgPack Prety Print
7
+ class MGrep < Msgknife::Stream
8
+ def initialize
9
+ super
10
+ @optpsr.on('-a', 'append mode') { |v| @append = v }
11
+ @optpsr.on('-o VAL', 'output directory') { |v| @outdir = v }
12
+ end
13
+
14
+ def setup(argv)
15
+ @key = argv[0]
16
+ @fd_map = Hash.new
17
+ if !(@outdir.nil?) and !(File.exists?(@outdir))
18
+ FileUtils.mkdir_p @outdir
19
+ end
20
+ end
21
+
22
+ def recv(obj, ts, tag)
23
+ val = obj.has_key?(@key) ? obj[@key] : 'unknown'
24
+ unless @fd_map.has_key?(val)
25
+ mode = @append ? 'wb+' : 'wb'
26
+ fpath = (val.nil?) ? 'nil.msg' : val + '.msg'
27
+ puts fpath
28
+ fpath = File.join(@outdir, fpath) unless @outdir.nil?
29
+ @fd_map[val] = File.open(fpath, mode)
30
+ end
31
+
32
+ write_stream(obj, ts, tag, @fd_map[val])
33
+ end
34
+ end
35
+
36
+ ins = MGrep.new()
37
+ ins.run(ARGV, 0..0)
data/bin/mtext ADDED
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'msgknife'
4
+ require 'pp'
5
+
6
+ # MsgPack Prety Print
7
+ class MPP < Msgknife::Stream
8
+ def setup(argv)
9
+ @key = argv[0]
10
+ end
11
+ def recv(obj, ts, tag)
12
+ if obj.key?(@key) and (!@ignore_nil or !(obj[@key].nil?))
13
+ puts obj[@key]
14
+ end
15
+ end
16
+ end
17
+
18
+ ins = MPP.new()
19
+ ins.run(ARGV, 0..0)
@@ -1,3 +1,3 @@
1
1
  module Msgknife
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/msgknife.rb CHANGED
@@ -1,7 +1,11 @@
1
+ # -*- coding: utf-8 -*-
2
+
1
3
  require "msgknife/version"
2
4
  require 'msgpack'
3
5
  require 'optparse'
4
6
  require 'time'
7
+ require 'pp'
8
+ require 'json'
5
9
 
6
10
  module Msgknife
7
11
  class Stream
@@ -10,11 +14,14 @@ module Msgknife
10
14
  def initialize
11
15
  @out_encode = false
12
16
  @optpsr = OptionParser.new
13
- @optpsr.on('-m', 'output as msgpack encode') { |v| @out_encode = v }
14
17
  @optpsr.on('-F', 'input as fluentd format') { |v| @in_fluentd = v }
15
18
  @optpsr.on('-T VAL', 'key of timestamp in message') { |v| @ts_key = v }
16
19
  @optpsr.on('-N', 'ignore if value is nil') {|v| @ignore_nil = v }
17
20
  @argv = []
21
+
22
+ @output_fmt = 'console'
23
+ @optpsr.on('-j', 'output as json') { |v| @output_fmt = 'json' }
24
+ @optpsr.on('-m', 'output as msgpack') { |v| @output_fmt = 'msgpack' }
18
25
  end
19
26
 
20
27
  def run(cmd_argv, range = nil)
@@ -88,21 +95,17 @@ module Msgknife
88
95
  end
89
96
  end
90
97
 
91
- def write_stream(obj, ts=nil, tag=nil)
92
- if @out_encode == false
93
- if ts.nil? and tag.nil?
94
- pp obj
95
- else
96
- pp [tag, ts, obj]
97
- end
98
- else
99
- if ts.nil? and tag.nil?
100
- STDOUT.write(obj.to_msgpack)
101
- else
102
- STDOUT.write([tag, ts, obj].to_msgpack)
98
+ def write_stream(obj, ts=nil, tag=nil, io=STDOUT)
99
+ msg =(ts.nil? and tag.nil?) ? obj : [tag, ts, obj]
100
+
101
+ begin
102
+ case @output_fmt
103
+ when 'console'; PP.pp(msg, io);
104
+ when 'json'; JSON.dump(msg, io);
105
+ when 'msgpack'; io.write(msg.to_msgpack);
103
106
  end
107
+ rescue Errno::EPIPE => e ;
104
108
  end
105
- rescue Errno::EPIPE => e ;
106
109
  end
107
110
 
108
111
 
data/msgknife.gemspec CHANGED
@@ -21,4 +21,6 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "bundler", "~> 1.7"
22
22
  spec.add_development_dependency "rake", "~> 10.0"
23
23
  spec.add_dependency "msgpack", '~> 0.5'
24
+ spec.add_dependency "ruby-terminfo"
25
+ spec.add_dependency "diff-lcs"
24
26
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: msgknife
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masayoshi Mizutani
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-07 00:00:00.000000000 Z
11
+ date: 2015-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,15 +52,48 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: ruby-terminfo
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: diff-lcs
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
55
83
  description: MsgKnife makes easy to view, check and analyze MessagePack format file
56
84
  and stream such as Fluentd data
57
85
  email:
58
86
  - mizutani@sfc.wide.ad.jp
59
87
  executables:
88
+ - mdot
89
+ - medit
60
90
  - mentropy
91
+ - mhead
61
92
  - mheat
62
93
  - mkeys
63
94
  - mpp
95
+ - msplit
96
+ - mtext
64
97
  - mval
65
98
  extensions: []
66
99
  extra_rdoc_files: []
@@ -70,10 +103,15 @@ files:
70
103
  - LICENSE.txt
71
104
  - README.md
72
105
  - Rakefile
106
+ - bin/mdot
107
+ - bin/medit
73
108
  - bin/mentropy
109
+ - bin/mhead
74
110
  - bin/mheat
75
111
  - bin/mkeys
76
112
  - bin/mpp
113
+ - bin/msplit
114
+ - bin/mtext
77
115
  - bin/mval
78
116
  - lib/msgknife.rb
79
117
  - lib/msgknife/version.rb