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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9989cb452ab1dd59f10629d8b29dd9ea035954d24fd013120bbeef3787adfcc9
4
- data.tar.gz: 017cfdfd0a27a8e4c93d0d3ec74575b2455a4139491c6ef131608cc389487dd8
3
+ metadata.gz: 7384eed21d076be3de57b5afa9fc886e979ccc4d89e167afc61e2800314d61f4
4
+ data.tar.gz: f6c71a99835e93c07734bfd790aba1d80fa86879327f2357007c184edbd0a619
5
5
  SHA512:
6
- metadata.gz: 6af238ffdf8008e4edb49b35bd8e10de5005c7d2cd307158651ef88ba711b28e16a8d4f04d5481a87f9871ee16f5ae573151bda33f0f02475cf62b49e0b2f3be
7
- data.tar.gz: a27cf64202e4731cf07a9b3752d6b3afce376585c91b9f2609aa3971ecd06c5d15cbe06ef3cee0935692cb37d4c8cfb9003efaf2afe1e5ce35b970480b5a35d0
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
- # Usage
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
+ ```
@@ -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
- Perfetto.trace_event_begin self.class.name, method_name.to_s
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 == "singleton_method_added" || method_name.to_s.start_with?("_pfc_")
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
- Perfetto.trace_event_begin name, method_name.to_s
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
@@ -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%H%M%S")}.pftrace")
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
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Perfetto
4
- VERSION = "0.1.5"
4
+ VERSION = "0.1.7"
5
5
  end
data/lib/perfetto.rb CHANGED
@@ -20,5 +20,7 @@ module Perfetto
20
20
  require_relative "perfetto/perfetto"
21
21
  # Instrumentation Helper
22
22
  require_relative "perfetto/interceptor"
23
+ # Rack middleware
24
+ require_relative "perfetto/middleware"
23
25
  end
24
26
  end
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.5
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: []