stackprof-webnav 0.0.2 → 0.0.3
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 +4 -4
- data/README.md +7 -5
- data/bin/stackprof-webnav +6 -9
- data/lib/stackprof-webnav/presenter.rb +18 -0
- data/lib/stackprof-webnav/server.rb +49 -11
- data/lib/stackprof-webnav/version.rb +1 -1
- data/lib/stackprof-webnav/views/listing.haml +21 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 860162061e27285bfb60182eebe0b2764fae0494
|
4
|
+
data.tar.gz: 3c1faab65bd0b183b32e8fe0966f2231eda8552b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c3fef38f9828dd0d1df0a9cb86ad6a829cc4fabe5e2fd59986ecfefe51f4ba4b8d192bed34f96f6ff34f260780451b27b915a409387e5011da964cbdb68586c3
|
7
|
+
data.tar.gz: 49f8daf5c57d8533bf762dbf21c6c487cc1e3c9a316721bb3c28e8124e90326294eabc3830d79040fe28543f82bbefcc762d9f927ab8c7c0eee120032140e350
|
data/README.md
CHANGED
@@ -19,17 +19,18 @@ Provides a web ui to inspect stackprof dumps.
|
|
19
19
|
$ gem install stackprof-webnav
|
20
20
|
```
|
21
21
|
|
22
|
-
### Pass a dump to it
|
22
|
+
### Pass a dump/URI to it
|
23
23
|
```bash
|
24
|
-
$ stackprof-webnav /path/to/stackprof.dump
|
25
|
-
$ stackprof-webnav http://path/to/stackprof.dump
|
24
|
+
$ stackprof-webnav -f /path/to/stackprof.dump
|
25
|
+
$ stackprof-webnav -u http://path/to/stackprof.dump
|
26
|
+
$ stackprof-webnav -b http://amazon/s3/bucketlisting.xml
|
26
27
|
```
|
27
|
-
If the argument passed does not exist locally, it is assumed to be a URI and is treated as such.
|
28
28
|
|
29
29
|
See [stackprof gem][create-dump] homepage to learn how to create dumps.
|
30
|
+
See [amazon s3 API docs][list-bucket-contents] to see the URI format for S3 bucket listings.
|
30
31
|
|
31
32
|
### Profit
|
32
|
-
Open the browser at localhost:9292
|
33
|
+
Open the browser at localhost:9292. If you've used the -f or -u form, you can navigate the dump. If you've used the -b form, you'll see a listing of the keys in the bucket -- click on one that is a dump to browse through it.
|
33
34
|
|
34
35
|
## Caveats
|
35
36
|
- no tests, this gem was created for my personal usage in a hack stream,
|
@@ -47,3 +48,4 @@ Open the browser at localhost:9292
|
|
47
48
|
[main-screenshot]: https://github.com/alisnic/stackprof-webnav/blob/master/screenshots/main.png?raw=true
|
48
49
|
[method-screenshot]: https://github.com/alisnic/stackprof-webnav/blob/master/screenshots/method.png?raw=true
|
49
50
|
[file-screenshot]: https://github.com/alisnic/stackprof-webnav/blob/master/screenshots/file.png?raw=true
|
51
|
+
[list-bucket-contents]: http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html
|
data/bin/stackprof-webnav
CHANGED
@@ -7,20 +7,17 @@ options = {
|
|
7
7
|
}
|
8
8
|
|
9
9
|
parser = OptionParser.new(ARGV) do |o|
|
10
|
-
o.banner = "Usage: stackprof-webnav
|
10
|
+
o.banner = "Usage: stackprof-webnav [-f localfile.dump]|[-u http://path/to/file.dump]|[-b http://path/to/s3/bucket/listing] [-p NUMBER]"
|
11
|
+
o.on('-f [LOCALFILE]', 'Local file path to dump') {|filepath| options[:filepath] = filepath }
|
12
|
+
o.on('-u [URI]', 'URI path to dump') {|uri| options[:uri] = uri }
|
13
|
+
o.on('-b [URI]', 'URI path to Amazon S3 bucket listing') {|bucket| options[:bucket] = bucket}
|
11
14
|
o.on('-p [PORT]', 'Server port') {|port| options[:port] = port }
|
12
15
|
end
|
13
16
|
|
14
17
|
parser.parse!
|
15
|
-
parser.abort(parser.help)
|
18
|
+
parser.abort(parser.help) unless [:filepath, :uri, :bucket].any? {|key| options.key?(key)}
|
16
19
|
|
17
|
-
file = ARGV.pop
|
18
20
|
server = StackProf::Webnav::Server
|
19
|
-
|
20
|
-
if File.exists?(file)
|
21
|
-
server.report_dump_path = File.expand_path(file)
|
22
|
-
else
|
23
|
-
server.report_dump_url = file
|
24
|
-
end
|
21
|
+
server.cmd_options = options
|
25
22
|
|
26
23
|
server.run! options[:port]
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'better_errors'
|
2
2
|
require 'stringio'
|
3
|
+
require 'rexml/document'
|
3
4
|
|
4
5
|
module StackProf
|
5
6
|
module Webnav
|
@@ -33,6 +34,23 @@ module StackProf
|
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
37
|
+
def listing_dumps
|
38
|
+
xml_data = Net::HTTP.get(URI.parse(Server.report_dump_listing))
|
39
|
+
if xml_data
|
40
|
+
doc = REXML::Document.new(xml_data)
|
41
|
+
dumps = []
|
42
|
+
doc.elements.each('ListBucketResult/Contents') do |ele|
|
43
|
+
dumps << {
|
44
|
+
:key => ele.elements["Key"].text,
|
45
|
+
:date => ele.elements["LastModified"].text,
|
46
|
+
:uri => Server.report_dump_listing + ele.elements["Key"].text
|
47
|
+
}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
dumps.sort_by! { |hash| hash[:date] }
|
51
|
+
dumps.reverse!
|
52
|
+
end
|
53
|
+
|
36
54
|
def method_info name
|
37
55
|
name = /#{Regexp.escape name}/ unless Regexp === name
|
38
56
|
frames = report.frames.select do |frame, info|
|
@@ -12,19 +12,33 @@ module StackProf
|
|
12
12
|
config.assets.paths << File.join(__dir__, 'css')
|
13
13
|
|
14
14
|
class << self
|
15
|
-
attr_accessor :report_dump_path, :
|
15
|
+
attr_accessor :cmd_options, :report_dump_path, :report_dump_uri, :report_dump_listing
|
16
16
|
|
17
|
-
def presenter
|
18
|
-
return @presenter unless @presenter.nil?
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
17
|
+
def presenter regenerate=false
|
18
|
+
return @presenter unless regenerate || @presenter.nil?
|
19
|
+
process_options
|
20
|
+
if self.report_dump_path || self.report_dump_uri
|
21
|
+
report_contents = if report_dump_path.nil?
|
22
|
+
Net::HTTP.get(URI.parse(report_dump_uri))
|
23
|
+
else
|
24
|
+
File.open(report_dump_path).read
|
25
|
+
end
|
26
|
+
report = StackProf::Report.new(Marshal.load(report_contents))
|
27
|
+
end
|
28
|
+
@presenter = Presenter.new(report)
|
29
|
+
end
|
24
30
|
|
25
|
-
|
26
|
-
|
31
|
+
private
|
32
|
+
def process_options
|
33
|
+
if cmd_options[:filepath]
|
34
|
+
self.report_dump_path = cmd_options[:filepath]
|
35
|
+
elsif cmd_options[:uri]
|
36
|
+
self.report_dump_uri = cmd_options[:uri]
|
37
|
+
elsif cmd_options[:bucket]
|
38
|
+
self.report_dump_listing = cmd_options[:bucket]
|
39
|
+
end
|
27
40
|
end
|
41
|
+
|
28
42
|
end
|
29
43
|
|
30
44
|
helpers do
|
@@ -48,15 +62,39 @@ module StackProf
|
|
48
62
|
def file_url path
|
49
63
|
"/file?path=#{URI.escape(path)}"
|
50
64
|
end
|
65
|
+
|
66
|
+
def overview_url path
|
67
|
+
"/overview?path=#{URI.escape(path)}"
|
68
|
+
end
|
51
69
|
end
|
52
70
|
|
53
71
|
get '/' do
|
54
|
-
|
72
|
+
presenter
|
73
|
+
if Server.report_dump_listing
|
74
|
+
redirect_to '/listing'
|
75
|
+
else
|
76
|
+
redirect_to '/overview'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
get '/overview' do
|
81
|
+
if params[:path]
|
82
|
+
Server.report_dump_uri = params[:path]
|
83
|
+
Server.presenter(true)
|
84
|
+
end
|
85
|
+
@file = Server.report_dump_path || Server.report_dump_uri
|
55
86
|
@action = "overview"
|
56
87
|
@frames = presenter.overview_frames
|
57
88
|
render_with_layout :overview
|
58
89
|
end
|
59
90
|
|
91
|
+
get '/listing' do
|
92
|
+
@file = Server.report_dump_listing
|
93
|
+
@action = "listing"
|
94
|
+
@dumps = presenter.listing_dumps
|
95
|
+
render_with_layout :listing
|
96
|
+
end
|
97
|
+
|
60
98
|
get '/method' do
|
61
99
|
@action = params[:name]
|
62
100
|
@frames = presenter.method_info(params[:name])
|
@@ -0,0 +1,21 @@
|
|
1
|
+
%h3 StackProf Navigator
|
2
|
+
%hr
|
3
|
+
|
4
|
+
%p
|
5
|
+
Viewing S3 bucket at
|
6
|
+
%b= @file
|
7
|
+
|
8
|
+
%table.centered
|
9
|
+
%thead
|
10
|
+
%th Key
|
11
|
+
%th Date
|
12
|
+
%th Dump
|
13
|
+
|
14
|
+
%tbody
|
15
|
+
- @dumps.each do |dump|
|
16
|
+
%tr
|
17
|
+
%td= dump[:key]
|
18
|
+
%td= dump[:date]
|
19
|
+
%td
|
20
|
+
%a{:href => overview_url(dump[:uri])}
|
21
|
+
= dump[:uri]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stackprof-webnav
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrei Lisnic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-06-
|
11
|
+
date: 2014-06-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nyny
|
@@ -118,6 +118,7 @@ files:
|
|
118
118
|
- lib/stackprof-webnav/version.rb
|
119
119
|
- lib/stackprof-webnav/views/file.haml
|
120
120
|
- lib/stackprof-webnav/views/layout.haml
|
121
|
+
- lib/stackprof-webnav/views/listing.haml
|
121
122
|
- lib/stackprof-webnav/views/method.haml
|
122
123
|
- lib/stackprof-webnav/views/overview.haml
|
123
124
|
- screenshots/file.png
|