pyroscope 0.0.13 → 0.1.0

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
  SHA256:
3
- metadata.gz: 42f5e0729331e9002034247e8e90daf55c4efee52fd9c73a09bcf97ea3faf073
4
- data.tar.gz: a15a4611dd40f44d1a3dd82d3fc15fe92efd3ac61bcba0ea4eb94e94748a34e4
3
+ metadata.gz: 15d405da85cfd950ffe3b25c9ea6a3b5df68c57cfb52cd0b53f91cf26f22a955
4
+ data.tar.gz: 76422633bd992c1a1b148f66a9be25c6974bb47fba0d70e38e09c749fa389109
5
5
  SHA512:
6
- metadata.gz: 702c84e56457539ce3872df0b9639c0f1ca3d8f70b6a5053a62056bec9cfb52272a99f8a4b9b795fc340dca5b34d9d1b2c02985f4a36ff96ae65f2981da69413
7
- data.tar.gz: 3c8bef0ab7f2bd2a86e8971eed949ea22e6a4edf1c0ad5bd274ab91c0f8d4538cef49a9ee441c54d0941b173329bd364ba434a17ffa49e2afe9919c52acd3143
6
+ metadata.gz: 67550275be573ffe4dac71dc62386dc917bed9cb0be052b155cd33d11d18107100e1323c0454d3dd55eaaa269c2c3a58b039fa48a54ba07170d755ac2f4d768c
7
+ data.tar.gz: a4d1a8a11ffc44762a7dcb30ea7d946960696e35e77936e56c67f520d94744161cde0255cdf6457482b6c419522341ba46051b569c36c9580f1dee0f89a48c58
data/Rakefile CHANGED
@@ -42,14 +42,8 @@ task :build => [:clean, :compile]
42
42
  task :default => [:build, :spec]
43
43
 
44
44
  task :test do
45
- system "rsync -a /home/dmitry/rbspy/ /home/dmitry/pyroscope/third_party/local-clones/rbspy"
46
- # system "cd ../pyroscope && DOCKER_BUILDKIT=1 docker build -f Dockerfile.static-libs --output type=local,dest=out ." if RUBY_PLATFORM.include?("linux")
47
- system "cd ../pyroscope && rm out/*.a"
48
- system "cd ../pyroscope && ENABLED_SPIES=rbspy make build-rust-dependencies"
49
- system "cd ../pyroscope && make build-rbspy-static-library"
50
- system "cd ../pyroscope && cp third_party/rustdeps/target/x86_64-unknown-linux-gnu/release/librustdeps.a ./out/librustdeps.a"
51
-
52
- system "PYROSCOPE_RUBY_LOCAL=1 rake build && PYROSCOPE_RUBY_LOCAL=1 sudo -E gem install pkg/pyroscope-#{Pyroscope::VERSION}.gem && sudo -E ruby test.rb"
45
+ sudo = RUBY_PLATFORM =~ /darwin/ ? "sudo -E" : ""
46
+ system "rake build && #{sudo} gem install pkg/pyroscope-#{Pyroscope::VERSION}.gem && #{sudo} ruby test.rb"
53
47
  end
54
48
 
55
49
  task :test_exec do
@@ -9,7 +9,7 @@ HEADER_DIRS = [INCLUDEDIR]
9
9
 
10
10
  LIB_DIRS = [LIBDIR, File.expand_path(File.join(File.dirname(__FILE__), "lib"))]
11
11
 
12
- COMMIT = "39a3d9c"
12
+ COMMIT = "df45c48"
13
13
 
14
14
  # TODO: this is not very accurate, but it works for now
15
15
  OS = RUBY_PLATFORM.include?("darwin") ? "mac" : "linux"
@@ -19,38 +19,49 @@ PREFIX = "/static-libs/#{COMMIT}/#{OS}-#{ARCH}"
19
19
 
20
20
  ROOT = File.expand_path("..", __FILE__)
21
21
 
22
+ def run(str)
23
+ system(str) || fail("command failed: #{str}")
24
+ end
25
+
22
26
  if ENV["PYROSCOPE_RUBY_LOCAL"]
23
27
  puts "PYROSCOPE_RUBY_LOCAL yes"
24
- system "cp #{ENV["HOME"]}/pyroscope/out/libpyroscope.rbspy.a #{File.join(ROOT, "lib/libpyroscope.rbspy.a")}"
25
- system "cp #{ENV["HOME"]}/pyroscope/out/librustdeps.a #{File.join(ROOT, "lib/librustdeps.a")}"
28
+ # TODO: make configurable
29
+ pyroscope_path = "#{ENV["HOME"]}/pyroscope"
30
+ run("rm -rf #{File.join(ROOT, "build")}")
31
+ run("cd #{pyroscope_path} && make build-rust-dependencies-docker")
32
+ run("cp #{pyroscope_path}/out/libpyroscope.rbspy.a #{File.join(ROOT, "lib/libpyroscope.rbspy.a")}")
33
+ run("cp #{pyroscope_path}/out/librustdeps.a #{File.join(ROOT, "lib/librustdeps.a")}")
26
34
  else
27
35
  Net::HTTP.start("dl.pyroscope.io", 443, :use_ssl => true) do |http|
28
- req = Net::HTTP::Get.new(PREFIX+"/libpyroscope.rbspy.combo.a.gz")
29
- http.request(req) do |resp|
30
- raise "HTTP error: #{resp.code}" unless resp.code == "200"
31
-
32
- r, w = IO.pipe
33
-
34
- t = Thread.new do
35
- zreader = Zlib::GzipReader.new(r)
36
- File.open(File.join(ROOT, "lib/libpyroscope.rbspy.combo.a"), "wb") do |f|
37
- loop do
38
- begin
39
- chunk = zreader.readpartial(32768)
40
- break if chunk.nil?
41
- rescue EOFError
42
- break
36
+ ["libpyroscope.rbspy.a", "librustdeps.a"].each do |name|
37
+ url = PREFIX+"/#{name}.gz"
38
+ req = Net::HTTP::Get.new(url)
39
+ http.request(req) do |resp|
40
+ raise "HTTP error: #{resp.code}" unless resp.code == "200"
41
+
42
+ r, w = IO.pipe
43
+
44
+ t = Thread.new do
45
+ zreader = Zlib::GzipReader.new(r)
46
+ File.open(File.join(ROOT, "lib/#{name}"), "wb") do |f|
47
+ loop do
48
+ begin
49
+ chunk = zreader.readpartial(32768)
50
+ break if chunk.nil?
51
+ rescue EOFError
52
+ break
53
+ end
54
+ f.write(chunk)
43
55
  end
44
- f.write(chunk)
45
56
  end
46
57
  end
47
- end
48
58
 
49
- resp.read_body do |chunk|
50
- w.write(chunk)
51
- end
59
+ resp.read_body do |chunk|
60
+ w.write(chunk)
61
+ end
52
62
 
53
- t.join
63
+ t.join
64
+ end
54
65
  end
55
66
  end
56
67
  end
@@ -60,7 +71,7 @@ end
60
71
 
61
72
  dir_config('pyroscope', HEADER_DIRS, LIB_DIRS)
62
73
 
63
- libs = ['-lpyroscope.rbspy.combo']
74
+ libs = ['-lpyroscope.rbspy', '-lrustdeps']
64
75
  libs.each do |lib|
65
76
  $LOCAL_LIBS << "#{lib} "
66
77
  end
File without changes
Binary file
Binary file
@@ -6,46 +6,82 @@ static VALUE rb_Pyroscope;
6
6
  #include <stdio.h>
7
7
  #include <string.h>
8
8
 
9
- int Start(char*, int, char*, char*);
10
- int Stop(int);
11
- int ChangeName(char*, int);
9
+ int Start(char*, char*, char*, char*, int, int, char*);
10
+ int Stop();
11
+ int ChangeName(char*);
12
+ int SetTag(char*, char*);
13
+ int TestLogger();
14
+ char* BuildSummary();
12
15
 
13
16
  static VALUE
14
- pyroscope_start(VALUE self, VALUE appName, VALUE pid, VALUE serverAddress) {
17
+ pyroscope_start(VALUE self, VALUE appName, VALUE serverAddress, VALUE authToken, VALUE sampleRate, VALUE withSubprocesses, VALUE logLevel) {
15
18
  VALUE r_appName = StringValue(appName);
16
19
  char *c_appName = RSTRING_PTR(r_appName);
17
20
 
18
- int c_pid = FIX2INT(pid);
21
+ int c_sampleRate = FIX2INT(sampleRate);
22
+ int c_withSubprocesses = FIX2INT(withSubprocesses);
19
23
 
20
24
  VALUE r_serverAddress = StringValue(serverAddress);
21
25
  char *c_serverAddress = RSTRING_PTR(r_serverAddress);
22
26
 
23
- int res = Start(c_appName, c_pid, "rbspy", c_serverAddress);
27
+ VALUE r_authToken = StringValue(authToken);
28
+ char *c_authToken = RSTRING_PTR(r_authToken);
29
+
30
+ VALUE r_logLevel = StringValue(logLevel);
31
+ char *c_logLevel = RSTRING_PTR(r_logLevel);
32
+
33
+ int res = Start(c_appName, "rbspy", c_serverAddress, c_authToken, c_sampleRate, c_withSubprocesses, c_logLevel);
24
34
 
25
35
  return INT2FIX(res);
26
36
  }
27
37
 
28
38
  static VALUE
29
- pyroscope_stop(VALUE self, VALUE pid) {
30
- int c_pid = FIX2INT(pid);
31
- int res = Stop(c_pid);
39
+ pyroscope_stop(VALUE self) {
40
+ int res = Stop();
32
41
  return INT2FIX(res);
33
42
  }
34
43
 
35
44
  static VALUE
36
- pyroscope_change_name(VALUE self, VALUE appName, VALUE pid) {
45
+ pyroscope_change_name(VALUE self, VALUE appName) {
37
46
  VALUE r_appName = StringValue(appName);
38
47
  char *c_appName = RSTRING_PTR(r_appName);
39
- int c_pid = FIX2INT(pid);
40
48
 
41
- int res = ChangeName(c_appName, c_pid);
49
+ int res = ChangeName(c_appName);
50
+ return INT2FIX(res);
51
+ }
52
+
53
+ static VALUE
54
+ pyroscope_set_tag(VALUE self, VALUE key, VALUE val) {
55
+ VALUE r_key = StringValue(key);
56
+ char *c_key = RSTRING_PTR(r_key);
57
+ VALUE r_val = StringValue(val);
58
+ char *c_val = RSTRING_PTR(r_val);
59
+
60
+ int res = SetTag(c_key, c_val);
42
61
  return INT2FIX(res);
43
62
  }
44
63
 
64
+ static VALUE
65
+ pyroscope_test_logger(VALUE self) {
66
+ int res = TestLogger();
67
+ return INT2FIX(res);
68
+ }
69
+
70
+ static VALUE
71
+ pyroscope_build_summary(VALUE self) {
72
+ char *c_summary = BuildSummary();
73
+ VALUE r_summary = rb_str_new_cstr(c_summary);
74
+ free(c_summary);
75
+ return r_summary;
76
+ }
77
+
45
78
  void
46
79
  Init_pyroscope_c() {
47
80
  rb_Pyroscope = rb_define_module("Pyroscope");
48
- rb_define_module_function(rb_Pyroscope, "_start", pyroscope_start, 3);
49
- rb_define_module_function(rb_Pyroscope, "_stop", pyroscope_stop, 1);
50
- rb_define_module_function(rb_Pyroscope, "_change_name", pyroscope_change_name, 2);
81
+ rb_define_module_function(rb_Pyroscope, "_start", pyroscope_start, 6);
82
+ rb_define_module_function(rb_Pyroscope, "_stop", pyroscope_stop, 0);
83
+ rb_define_module_function(rb_Pyroscope, "_change_name", pyroscope_change_name, 1);
84
+ rb_define_module_function(rb_Pyroscope, "_set_tag", pyroscope_set_tag, 2);
85
+ rb_define_module_function(rb_Pyroscope, "_test_logger", pyroscope_test_logger, 0);
86
+ rb_define_module_function(rb_Pyroscope, "_build_summary", pyroscope_build_summary, 0);
51
87
  }
@@ -1,3 +1,3 @@
1
1
  module Pyroscope
2
- VERSION = "0.0.13".freeze
2
+ VERSION = "0.1.0".freeze
3
3
  end
data/lib/pyroscope.rb CHANGED
@@ -2,23 +2,58 @@ require "pyroscope/version"
2
2
  require "pyroscope_c"
3
3
 
4
4
  module Pyroscope
5
- Config = Struct.new(:app_name, :server_address)
6
-
7
- def self.configure
8
- @configuration = Config.new
9
- yield @configuration
10
- _start(
11
- @configuration.app_name,
12
- Process.pid,
13
- @configuration.server_address,
14
- )
15
- end
5
+ Config = Struct.new(:app_name, :server_address, :auth_token, :sample_rate, :with_subprocesses, :log_level)
16
6
 
17
- def self.stop
18
- _stop(Process.pid)
19
- end
7
+ class << self
8
+ def configure
9
+ @configuration = Config.new
10
+ yield @configuration
11
+ _start(
12
+ @configuration.app_name,
13
+ @configuration.server_address,
14
+ @configuration.auth_token || "",
15
+ @configuration.sample_rate || 100,
16
+ @configuration.with_subprocesses || 0,
17
+ @configuration.log_level || "error",
18
+ )
19
+ end
20
+
21
+ def stop
22
+ _stop
23
+ end
24
+
25
+ def change_name(new_name)
26
+ _change_name(new_name)
27
+ end
28
+
29
+ def tag_wrapper(tags)
30
+ tag(tags)
31
+
32
+ begin
33
+ yield
34
+ ensure
35
+ remove_tags(*tags.keys)
36
+ end
37
+ end
38
+
39
+ def tag(tags)
40
+ tags.each_pair do |key, val|
41
+ _set_tag(key, val)
42
+ end
43
+ end
44
+
45
+ def remove_tags(*keys)
46
+ keys.each do |key|
47
+ _set_tag(key, "")
48
+ end
49
+ end
50
+
51
+ def test_logger
52
+ _test_logger
53
+ end
20
54
 
21
- def self.change_name(new_name)
22
- _change_name(new_name, Process.pid)
55
+ def build_summary
56
+ _build_summary
57
+ end
23
58
  end
24
59
  end
data/test.rb CHANGED
@@ -1,15 +1,11 @@
1
- # require 'pyroscope'
1
+ require 'pyroscope'
2
2
 
3
3
  puts "prestart #{Process.pid}"
4
4
 
5
- # Pyroscope.configure do |config|
6
- # config.app_name = "test.ruby.app{}"
7
- # config.server_address = "http://localhost:4040/"
8
- # end
9
-
10
- puts "start"
11
- iteration=0
12
- st = Time.new
5
+ Pyroscope.configure do |config|
6
+ config.app_name = "test.ruby.app{}"
7
+ config.server_address = "http://localhost:4040/"
8
+ end
13
9
 
14
10
  def work(n)
15
11
  i = 0
@@ -18,34 +14,19 @@ def work(n)
18
14
  end
19
15
  end
20
16
 
21
- def job_0
22
- work(rand()*1_000_000)
23
- end
24
-
25
- def job_1
26
- work(rand()*2_000_000)
17
+ def fast_function
18
+ Pyroscope.tag_wrapper({ "function" => "fast"}) do
19
+ work(20_000)
20
+ end
27
21
  end
28
22
 
29
- def sleep_job
30
- sleep(rand()*10)
23
+ def slow_function
24
+ Pyroscope.tag({ "function" => "slow"})
25
+ work(80_000)
26
+ Pyroscope.remove_tags("function")
31
27
  end
32
28
 
33
-
34
29
  while true
35
- iteration+=1
36
-
37
- r = rand
38
- if r < 0.1
39
- sleep_job
40
- elsif r < 0.5
41
- puts(" * test.ruby.app{job=0}")
42
- # Pyroscope.change_name("test.ruby.app{job=0}")
43
- job_0
44
- # Pyroscope.change_name("test.ruby.app{}")
45
- else
46
- puts(" * test.ruby.app{job=1}")
47
- # Pyroscope.change_name("test.ruby.app{job=1}")
48
- job_1
49
- # Pyroscope.change_name("test.ruby.app{}")
50
- end
30
+ fast_function
31
+ slow_function
51
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pyroscope
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pyroscope Team
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-30 00:00:00.000000000 Z
11
+ date: 2021-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -94,6 +94,7 @@ files:
94
94
  - Rakefile
95
95
  - ext/pyroscope/Makefile.example
96
96
  - ext/pyroscope/extconf.rb
97
+ - ext/pyroscope/lib/.gitkeep
97
98
  - ext/pyroscope/lib/libpyroscope.rbspy.a
98
99
  - ext/pyroscope/lib/libpyroscope.rbspy.combo.a
99
100
  - ext/pyroscope/lib/librustdeps.a
@@ -106,7 +107,7 @@ homepage: http://rubygems.org/gems/pyroscope
106
107
  licenses:
107
108
  - Apache-2.0
108
109
  metadata: {}
109
- post_install_message:
110
+ post_install_message:
110
111
  rdoc_options: []
111
112
  require_paths:
112
113
  - lib
@@ -122,8 +123,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
123
  - !ruby/object:Gem::Version
123
124
  version: '0'
124
125
  requirements: []
125
- rubygems_version: 3.2.15
126
- signing_key:
126
+ rubygems_version: 3.2.22
127
+ signing_key:
127
128
  specification_version: 4
128
129
  summary: pyroscope
129
130
  test_files: []