pyroscope 0.0.14 → 0.1.1

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: 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: []