perfetto 0.1.5 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +26 -1
- data/lib/perfetto/interceptor.rb +12 -5
- data/lib/perfetto/middleware.rb +32 -0
- data/lib/perfetto/perfetto.rb +1 -1
- data/lib/perfetto/version.rb +1 -1
- data/lib/perfetto.rb +2 -0
- data/perfetto.gemspec +34 -0
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7384eed21d076be3de57b5afa9fc886e979ccc4d89e167afc61e2800314d61f4
|
4
|
+
data.tar.gz: f6c71a99835e93c07734bfd790aba1d80fa86879327f2357007c184edbd0a619
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c77bd5af96cb578659982e03d292893426a64d7d8ef7618ea5ab782005c519c6e2244b4d6cd7885fc2b9f2e76f6551e1fb3bd67b803552df3c8b8e861f671c38
|
7
|
+
data.tar.gz: e33c6fe69f65d1dcd2ed3a81ba6e2e699b85b89932511233638900514921d310dbf305f17bb0bb899fe39ac2593bac48667fcca452fa53f9fdf0467cf7a90923
|
data/README.md
CHANGED
@@ -4,7 +4,9 @@
|
|
4
4
|
|
5
5
|
https://ui.perfetto.dev/
|
6
6
|
|
7
|
-
|
7
|
+
## Usage
|
8
|
+
|
9
|
+
### Basic
|
8
10
|
|
9
11
|
```ruby
|
10
12
|
require "perfetto"
|
@@ -83,3 +85,26 @@ Perfetto.stop_tracing "example.pftrace"
|
|
83
85
|
```
|
84
86
|
|
85
87
|
![example](./example/example.png)
|
88
|
+
|
89
|
+
### Rack Middleware
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
# frozen_string_literal: true
|
93
|
+
|
94
|
+
require "sinatra/base"
|
95
|
+
require "perfetto"
|
96
|
+
|
97
|
+
Perfetto.setup enable_tracing: true
|
98
|
+
|
99
|
+
class Server < Sinatra::Base
|
100
|
+
use Perfetto::Middleware
|
101
|
+
|
102
|
+
get "/" do
|
103
|
+
"Hello World"
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
Perfetto.start_tracing
|
108
|
+
Server.run!
|
109
|
+
Perfetto.stop_tracing "middleware.pftrace"
|
110
|
+
```
|
data/lib/perfetto/interceptor.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rubocop:disable Metrics/AbcSize
|
4
|
+
# rubocop:disable Metrics/MethodLength
|
5
|
+
|
3
6
|
module Perfetto
|
4
7
|
# To intercept method calls in other classes
|
5
8
|
module Interceptor
|
@@ -39,14 +42,15 @@ module Perfetto
|
|
39
42
|
def perfetto_trace_instance_method(method_name)
|
40
43
|
return if method_name.to_s.start_with? "_pfi_"
|
41
44
|
|
42
|
-
# warn "Perfetto[InstanceMethod]: #{name}##{method_name}"
|
43
45
|
perfetto_traced_instance_methods << method_name
|
44
46
|
|
45
47
|
original_method = instance_method(method_name)
|
46
48
|
alias_method "_pfi_#{method_name}", method_name
|
47
49
|
|
48
50
|
define_method(method_name) do |*args, **kwargs, &block|
|
49
|
-
|
51
|
+
category = self.class.name
|
52
|
+
task_name = "#{self.class.name}##{method_name}"
|
53
|
+
Perfetto.trace_event_begin category, task_name
|
50
54
|
original_method.bind(self).call(*args, **kwargs, &block)
|
51
55
|
ensure
|
52
56
|
Perfetto.trace_event_end self.class.name
|
@@ -54,16 +58,17 @@ module Perfetto
|
|
54
58
|
end
|
55
59
|
|
56
60
|
def perfetto_trace_class_method(method_name)
|
57
|
-
return if method_name.to_s
|
61
|
+
return if method_name.to_s.start_with? "_pfc_"
|
58
62
|
|
59
|
-
# warn "Perfetto[ClassMethod]: #{name}.#{method_name}"
|
60
63
|
perfetto_traced_class_methods << method_name
|
61
64
|
|
62
65
|
original_method = method(method_name)
|
63
66
|
singleton_class.send(:alias_method, "_pfc_#{method_name}", method_name)
|
64
67
|
|
65
68
|
define_singleton_method(method_name) do |*args, **kwargs, &block|
|
66
|
-
|
69
|
+
category = name
|
70
|
+
task_name = "#{name}.#{method_name}"
|
71
|
+
Perfetto.trace_event_begin category, task_name
|
67
72
|
original_method.call(*args, **kwargs, &block)
|
68
73
|
ensure
|
69
74
|
Perfetto.trace_event_end name
|
@@ -102,3 +107,5 @@ module Perfetto
|
|
102
107
|
end
|
103
108
|
end
|
104
109
|
end
|
110
|
+
# rubocop:enable Metrics/AbcSize
|
111
|
+
# rubocop:enable Metrics/MethodLength
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "json"
|
4
|
+
|
5
|
+
module Perfetto
|
6
|
+
# Rack middleware
|
7
|
+
class Middleware
|
8
|
+
def initialize(app, options = {})
|
9
|
+
@app = app
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
if Perfetto::Configure.enable_tracing
|
14
|
+
def call(env)
|
15
|
+
category = "RackMiddleware"
|
16
|
+
method = env["REQUEST_METHOD"] || "UNKNOWN"
|
17
|
+
path = env["PATH_INFO"] || "UNKNOWN PATH"
|
18
|
+
task_name = "#{method} #{path}"
|
19
|
+
Perfetto.trace_event_begin_with_debug_info category, task_name, "env", env.to_json
|
20
|
+
begin
|
21
|
+
@app.call(env)
|
22
|
+
ensure
|
23
|
+
Perfetto.trace_event_end category
|
24
|
+
end
|
25
|
+
end
|
26
|
+
else # Stub methods
|
27
|
+
def call(env)
|
28
|
+
@app.call(env)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/perfetto/perfetto.rb
CHANGED
@@ -13,7 +13,7 @@ module Perfetto
|
|
13
13
|
start_tracing_native Configure.buffer_size_kb
|
14
14
|
end
|
15
15
|
|
16
|
-
def self.stop_tracing(trace_file_name = "#{Time.now.strftime("%Y%m%d
|
16
|
+
def self.stop_tracing(trace_file_name = "#{Time.now.strftime("%Y%m%d-%H-%M-%S")}.pftrace")
|
17
17
|
stop_tracing_native trace_file_name
|
18
18
|
end
|
19
19
|
|
data/lib/perfetto/version.rb
CHANGED
data/lib/perfetto.rb
CHANGED
data/perfetto.gemspec
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/perfetto/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "perfetto"
|
7
|
+
spec.version = Perfetto::VERSION
|
8
|
+
spec.authors = ["Kowalski Dark"]
|
9
|
+
spec.email = ["github@akenonet.com"]
|
10
|
+
|
11
|
+
spec.summary = "Yet another event tracing library for Ruby."
|
12
|
+
spec.description = "Yet another event tracing library for Ruby."
|
13
|
+
spec.homepage = "https://github.com/yet-another-ai/perfetto.rb"
|
14
|
+
spec.required_ruby_version = ">= 3.3.0"
|
15
|
+
|
16
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
17
|
+
|
18
|
+
# Specify which files should be added to the gem when it is released.
|
19
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
20
|
+
spec.files = Dir.chdir(__dir__) do
|
21
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
22
|
+
(File.expand_path(f) == __FILE__) ||
|
23
|
+
f.start_with?(*%w[bin/ test/ spec/ features/ .git .github appveyor Gemfile])
|
24
|
+
end
|
25
|
+
end
|
26
|
+
spec.bindir = "exe"
|
27
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
28
|
+
spec.require_paths = %w[lib ext]
|
29
|
+
spec.extensions = ["ext/perfetto/extconf.rb"]
|
30
|
+
|
31
|
+
# For more information and examples about making a new gem, check out our
|
32
|
+
# guide at: https://bundler.io/guides/creating_gem.html
|
33
|
+
spec.metadata["rubygems_mfa_required"] = "true"
|
34
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: perfetto
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kowalski Dark
|
@@ -35,8 +35,10 @@ files:
|
|
35
35
|
- lib/perfetto/configure.rb
|
36
36
|
- lib/perfetto/core_ext/configurable.rb
|
37
37
|
- lib/perfetto/interceptor.rb
|
38
|
+
- lib/perfetto/middleware.rb
|
38
39
|
- lib/perfetto/perfetto.rb
|
39
40
|
- lib/perfetto/version.rb
|
41
|
+
- perfetto.gemspec
|
40
42
|
- sig/perfetto.rbs
|
41
43
|
homepage: https://github.com/yet-another-ai/perfetto.rb
|
42
44
|
licenses: []
|