pyroscope 0.0.14 → 0.1.1

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: 619c59b1c6e494e5e1b4b47889ea9de7eed5c44264ec0bd9f1372ea87c6a94d0
4
- data.tar.gz: d4c3632f2ee191e8bb60529bd5699e11100500cc3ca1cbb4d119a183c38e279d
3
+ metadata.gz: 743ff4c97e82300fb18a63cb6ebe626f241ce77a1bf0fd034198db698b5c5aca
4
+ data.tar.gz: 76d3705d25132cb5779b9e430eb2972894597d4bd4732a30c28a8995ec18fcaa
5
5
  SHA512:
6
- metadata.gz: 98d120335fbe70f9527e4f9eeb3678dd8db7dfac0aefb1e44fb639c499911ddec9370bb91e9f22bd9ecda519cb3fa92e6982dd9eda135e7be9efe3f26042295d
7
- data.tar.gz: '09f603d60123a92e983ac22eeefff6468e047edc99f5cffd4278dfa94e51fc837522daa669838430459bf0009f14eef4d31c1aaae8c647b0196bcd4bedeb0cb6'
6
+ metadata.gz: 4bc08bbdc5fa0081806d4e2030eef6a6032c1e5fb68d53784fc5e0565f7ed4d57a85171d87ff91213d3fc0209967d47279593ac2025739a611588771d36e8c0d
7
+ data.tar.gz: 5d27f0e63129001f60bb11fab6f19e837b82a350bc746b6ac7a1bd0e072c1ea7546b3d0b9ea32ff4d864c8feb1b71c718f2a67e9d606d98b2b518c689b9e49fc
data/README.md CHANGED
@@ -1,3 +1,3 @@
1
1
  # pyroscope-ruby
2
2
 
3
- This is a repo for pyroscope ruby integration. It is currently under development and is not yet released.
3
+ This is a repo for pyroscope ruby integration. See [examples/ruby](https://github.com/pyroscope-io/pyroscope/tree/main/examples/ruby) in the main repo for examples.
data/Rakefile CHANGED
@@ -42,16 +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
- extra_env = "PYROSCOPE_RUBY_LOCAL=1"
52
- extra_env = ""
53
-
54
- system "#{extra_env} rake build && #{extra_env} 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"
55
47
  end
56
48
 
57
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 = "a263249"
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,10 +19,18 @@ 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
36
  ["libpyroscope.rbspy.a", "librustdeps.a"].each do |name|
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.14".freeze
2
+ VERSION = "0.1.1".freeze
3
3
  end
data/lib/pyroscope.rb CHANGED
@@ -2,23 +2,59 @@ 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, :tags)
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
+ tag(@configuration.tags) if @configuration.tags
20
+ end
21
+
22
+ def stop
23
+ _stop
24
+ end
25
+
26
+ def change_name(new_name)
27
+ _change_name(new_name)
28
+ end
29
+
30
+ def tag_wrapper(tags)
31
+ tag(tags)
32
+
33
+ begin
34
+ yield
35
+ ensure
36
+ remove_tags(*tags.keys)
37
+ end
38
+ end
39
+
40
+ def tag(tags)
41
+ tags.each_pair do |key, val|
42
+ _set_tag(key.to_s, val.to_s)
43
+ end
44
+ end
45
+
46
+ def remove_tags(*keys)
47
+ keys.each do |key|
48
+ _set_tag(key.to_s, "")
49
+ end
50
+ end
51
+
52
+ def test_logger
53
+ _test_logger
54
+ end
20
55
 
21
- def self.change_name(new_name)
22
- _change_name(new_name, Process.pid)
56
+ def build_summary
57
+ _build_summary
58
+ end
23
59
  end
24
60
  end
data/test.rb CHANGED
@@ -1,16 +1,14 @@
1
- require 'pyroscope'
2
-
3
- puts "prestart #{Process.pid}"
1
+ require "pyroscope"
4
2
 
5
3
  Pyroscope.configure do |config|
6
- config.app_name = "test.ruby.app{}"
7
- config.server_address = "http://localhost:4040/"
4
+ config.app_name = "test.ruby.app"
5
+ config.server_address = "http://pyroscope:4040/"
6
+ config.tags = {
7
+ :region => "us-east-1",
8
+ :hostname => ENV["hostname"]
9
+ }
8
10
  end
9
11
 
10
- puts "start"
11
- iteration=0
12
- st = Time.new
13
-
14
12
  def work(n)
15
13
  i = 0
16
14
  while i < n
@@ -18,34 +16,17 @@ def work(n)
18
16
  end
19
17
  end
20
18
 
21
- def job_0
22
- work(rand()*1_000_000)
23
- end
24
-
25
- def job_1
26
- work(rand()*2_000_000)
19
+ def fast_function
20
+ work(20000)
27
21
  end
28
22
 
29
- def sleep_job
30
- sleep(rand()*10)
23
+ def slow_function
24
+ work(80000)
31
25
  end
32
26
 
27
+ Pyroscope.tag({ "region" => "us-east-1" })
33
28
 
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.14
4
+ version: 0.1.1
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
@@ -107,7 +107,7 @@ homepage: http://rubygems.org/gems/pyroscope
107
107
  licenses:
108
108
  - Apache-2.0
109
109
  metadata: {}
110
- post_install_message:
110
+ post_install_message:
111
111
  rdoc_options: []
112
112
  require_paths:
113
113
  - lib
@@ -123,8 +123,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  requirements: []
126
- rubygems_version: 3.2.15
127
- signing_key:
126
+ rubygems_version: 3.2.22
127
+ signing_key:
128
128
  specification_version: 4
129
129
  summary: pyroscope
130
130
  test_files: []