pyroscope 0.3.0-aarch64-linux → 0.3.1-aarch64-linux

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: 5e57774633571875419536249072ebf1e180e6d27b5ab6f108b480d45ef461a2
4
- data.tar.gz: 2c746ea7df815a8352141d272bf8bc864260d5fee32ee30e26a6b255cfc09c89
3
+ metadata.gz: ee2c1dba441e9d5a2b56b8c43e1dd161ad3bfdcb8182f65162e048505e2c8caf
4
+ data.tar.gz: 276b3292df0609fdca21471d188a4a79b6aa7dcbbcbc3e8c64674d4c5d46621a
5
5
  SHA512:
6
- metadata.gz: 573c57b40f211bfa8d4dab9aabcc1e7c919ddf6321ea11508ceff08416f95c937858fcab25d391189848072bdac6a5d1d28ab23a938748da572074a50107bf72
7
- data.tar.gz: 2343ad6184f596f87ee977d873e9a12ddda9f5f7bf95ecf754fd075b3b9f206901a1e02793b19774553528a2eacf323930c43894405ba429857cafe1b48e7490
6
+ metadata.gz: fcd551822fb88c6959bbb15421730af6f103c291c62e39359acf4236e1aff57a0393c3156d86071fd066dd9ebd2f7fc64e77f3259b9e81f1d3de0c400f10a735
7
+ data.tar.gz: 33389934d411b0440e6ad28aefbe4850e9f27d5e9cecb236c9d37845ba0fdd2e6c9acad48f4fa994b230cdeb5606f10b8f4e90a4a2ae23b80b34db7df12bd275
data/ext/rbspy/Cargo.toml CHANGED
@@ -12,6 +12,8 @@ crate-type = ["cdylib"]
12
12
  pyroscope = { path = "../../../../" }
13
13
  #pyroscope_rbspy = { version = "0.2" }
14
14
  pyroscope_rbspy = { path = "../../../../pyroscope_backends/pyroscope_rbspy" }
15
+ ffikit = { path = "../../../ffikit" }
16
+ pretty_env_logger = "0.4.0"
15
17
 
16
18
  [patch.crates-io]
17
19
  read-process-memory = {git = "https://github.com/omarabid/read-process-memory.git", branch = "0.1.4-fix"}
data/ext/rbspy/src/lib.rs CHANGED
@@ -1,38 +1,11 @@
1
+ use ffikit::Signal;
1
2
  use pyroscope::backend::Tag;
2
3
  use pyroscope::PyroscopeAgent;
3
4
  use pyroscope_rbspy::{rbspy_backend, RbspyConfig};
5
+ use std::collections::hash_map::DefaultHasher;
4
6
  use std::ffi::CStr;
5
- use std::mem::MaybeUninit;
7
+ use std::hash::Hasher;
6
8
  use std::os::raw::c_char;
7
- use std::sync::mpsc::{sync_channel, Receiver, SyncSender};
8
- use std::sync::{Mutex, Once};
9
-
10
- pub enum Signal {
11
- Kill,
12
- AddTag(u64, String, String),
13
- RemoveTag(u64, String, String),
14
- }
15
-
16
- pub struct SignalPass {
17
- inner_sender: Mutex<SyncSender<Signal>>,
18
- inner_receiver: Mutex<Receiver<Signal>>,
19
- }
20
-
21
- fn signalpass() -> &'static SignalPass {
22
- static mut SIGNAL_PASS: MaybeUninit<SignalPass> = MaybeUninit::uninit();
23
- static ONCE: Once = Once::new();
24
-
25
- ONCE.call_once(|| unsafe {
26
- let (sender, receiver) = sync_channel(1);
27
- let singleton = SignalPass {
28
- inner_sender: Mutex::new(sender),
29
- inner_receiver: Mutex::new(receiver),
30
- };
31
- SIGNAL_PASS = MaybeUninit::new(singleton);
32
- });
33
-
34
- unsafe { SIGNAL_PASS.assume_init_ref() }
35
- }
36
9
 
37
10
  #[no_mangle]
38
11
  pub extern "C" fn initialize_agent(
@@ -40,6 +13,9 @@ pub extern "C" fn initialize_agent(
40
13
  sample_rate: u32, detect_subprocesses: bool, on_cpu: bool, report_pid: bool,
41
14
  report_thread_id: bool, tags: *const c_char,
42
15
  ) -> bool {
16
+ // Initialize FFIKit
17
+ let recv = ffikit::initialize_ffi().unwrap();
18
+
43
19
  let application_name = unsafe { CStr::from_ptr(application_name) }
44
20
  .to_str()
45
21
  .unwrap()
@@ -62,44 +38,50 @@ pub extern "C" fn initialize_agent(
62
38
 
63
39
  let pid = std::process::id();
64
40
 
65
- let s = signalpass();
41
+ let rbspy_config = RbspyConfig::new(pid.try_into().unwrap())
42
+ .sample_rate(sample_rate)
43
+ .lock_process(false)
44
+ .with_subprocesses(detect_subprocesses)
45
+ .on_cpu(on_cpu)
46
+ .report_pid(report_pid)
47
+ .report_thread_id(report_thread_id);
66
48
 
67
- std::thread::spawn(move || {
68
- let rbspy_config = RbspyConfig::new(pid.try_into().unwrap())
69
- .sample_rate(sample_rate)
70
- .lock_process(false)
71
- .with_subprocesses(detect_subprocesses)
72
- .on_cpu(on_cpu)
73
- .report_pid(report_pid)
74
- .report_thread_id(report_thread_id);
75
-
76
- let tags_ref = tags_string.as_str();
77
- let tags = string_to_tags(tags_ref);
78
- let rbspy = rbspy_backend(rbspy_config);
79
-
80
- let mut agent_builder = PyroscopeAgent::builder(server_address, application_name)
81
- .backend(rbspy)
82
- .tags(tags);
83
-
84
- if auth_token != "" {
85
- agent_builder = agent_builder.auth_token(auth_token);
86
- }
49
+ let tags_ref = tags_string.as_str();
50
+ let tags = string_to_tags(tags_ref);
51
+ let rbspy = rbspy_backend(rbspy_config);
52
+
53
+ let mut agent_builder = PyroscopeAgent::builder(server_address, application_name)
54
+ .backend(rbspy)
55
+ .tags(tags);
87
56
 
88
- let agent = agent_builder.build().unwrap();
57
+ if auth_token != "" {
58
+ agent_builder = agent_builder.auth_token(auth_token);
59
+ }
60
+
61
+ let agent = agent_builder.build().unwrap();
89
62
 
90
- let agent_running = agent.start().unwrap();
63
+ let agent_running = agent.start().unwrap();
91
64
 
92
- while let Ok(signal) = s.inner_receiver.lock().unwrap().recv() {
65
+ std::thread::spawn(move || {
66
+ while let Ok(signal) = recv.recv() {
93
67
  match signal {
94
68
  Signal::Kill => {
95
69
  agent_running.stop().unwrap();
96
70
  break;
97
71
  }
98
- Signal::AddTag(thread_id, key, value) => {
72
+ Signal::AddGlobalTag(name, value) => {
73
+ agent_running.add_global_tag(Tag::new(name, value)).unwrap();
74
+ }
75
+ Signal::RemoveGlobalTag(name, value) => {
76
+ agent_running
77
+ .remove_global_tag(Tag::new(name, value))
78
+ .unwrap();
79
+ }
80
+ Signal::AddThreadTag(thread_id, key, value) => {
99
81
  let tag = Tag::new(key, value);
100
82
  agent_running.add_thread_tag(thread_id, tag).unwrap();
101
83
  }
102
- Signal::RemoveTag(thread_id, key, value) => {
84
+ Signal::RemoveThreadTag(thread_id, key, value) => {
103
85
  let tag = Tag::new(key, value);
104
86
  agent_running.remove_thread_tag(thread_id, tag).unwrap();
105
87
  }
@@ -112,40 +94,73 @@ pub extern "C" fn initialize_agent(
112
94
 
113
95
  #[no_mangle]
114
96
  pub extern "C" fn drop_agent() -> bool {
115
- let s = signalpass();
116
- s.inner_sender.lock().unwrap().send(Signal::Kill).unwrap();
97
+ // Send Kill signal to the FFI merge channel.
98
+ ffikit::send(ffikit::Signal::Kill).unwrap();
99
+
117
100
  true
118
101
  }
119
102
 
120
103
  #[no_mangle]
121
- pub extern "C" fn add_tag(thread_id: u64, key: *const c_char, value: *const c_char) -> bool {
122
- let s = signalpass();
104
+ pub extern "C" fn add_thread_tag(thread_id: u64, key: *const c_char, value: *const c_char) -> bool {
123
105
  let key = unsafe { CStr::from_ptr(key) }.to_str().unwrap().to_owned();
124
106
  let value = unsafe { CStr::from_ptr(value) }
125
107
  .to_str()
126
108
  .unwrap()
127
109
  .to_owned();
128
- s.inner_sender
129
- .lock()
110
+
111
+ let pid = std::process::id();
112
+ let mut hasher = DefaultHasher::new();
113
+ hasher.write_u64(thread_id % pid as u64);
114
+ let id = hasher.finish();
115
+
116
+ ffikit::send(ffikit::Signal::AddThreadTag(id, key, value)).unwrap();
117
+
118
+ true
119
+ }
120
+
121
+ #[no_mangle]
122
+ pub extern "C" fn remove_thread_tag(
123
+ thread_id: u64, key: *const c_char, value: *const c_char,
124
+ ) -> bool {
125
+ let key = unsafe { CStr::from_ptr(key) }.to_str().unwrap().to_owned();
126
+ let value = unsafe { CStr::from_ptr(value) }
127
+ .to_str()
130
128
  .unwrap()
131
- .send(Signal::AddTag(thread_id, key, value))
132
- .unwrap();
129
+ .to_owned();
130
+
131
+ let pid = std::process::id();
132
+ let mut hasher = DefaultHasher::new();
133
+ hasher.write_u64(thread_id % pid as u64);
134
+ let id = hasher.finish();
135
+
136
+ ffikit::send(ffikit::Signal::RemoveThreadTag(id, key, value)).unwrap();
137
+
133
138
  true
134
139
  }
135
140
 
136
141
  #[no_mangle]
137
- pub extern "C" fn remove_tag(thread_id: u64, key: *const c_char, value: *const c_char) -> bool {
138
- let s = signalpass();
142
+ pub extern "C" fn add_global_tag(key: *const c_char, value: *const c_char) -> bool {
139
143
  let key = unsafe { CStr::from_ptr(key) }.to_str().unwrap().to_owned();
140
144
  let value = unsafe { CStr::from_ptr(value) }
141
145
  .to_str()
142
146
  .unwrap()
143
147
  .to_owned();
144
- s.inner_sender
145
- .lock()
148
+
149
+ ffikit::send(ffikit::Signal::AddGlobalTag(key, value)).unwrap();
150
+
151
+ true
152
+ }
153
+
154
+ #[no_mangle]
155
+ pub extern "C" fn remove_global_tag(key: *const c_char, value: *const c_char) -> bool {
156
+ let key = unsafe { CStr::from_ptr(key) }.to_str().unwrap().to_owned();
157
+ let value = unsafe { CStr::from_ptr(value) }
158
+ .to_str()
146
159
  .unwrap()
147
- .send(Signal::RemoveTag(thread_id, key, value))
148
- .unwrap();
160
+ .to_owned();
161
+
162
+ ffikit::send(ffikit::Signal::RemoveGlobalTag(key, value)).unwrap();
163
+
149
164
  true
150
165
  }
151
166
 
@@ -1,3 +1,3 @@
1
1
  module Pyroscope
2
- VERSION = '0.3.0'.freeze
2
+ VERSION = '0.3.1'.freeze
3
3
  end
data/lib/pyroscope.rb CHANGED
@@ -1,34 +1,36 @@
1
1
  require 'ffi'
2
2
 
3
- module Rust
4
- extend FFI::Library
5
- ffi_lib File.expand_path(File.dirname(__FILE__)) + "/rbspy/rbspy.#{RbConfig::CONFIG["DLEXT"]}"
6
- attach_function :initialize_agent, [:string, :string, :string, :int, :bool, :bool, :bool, :bool, :string], :bool
7
- attach_function :add_tag, [:uint64, :string, :string], :bool
8
- attach_function :remove_tag, [:uint64, :string, :string], :bool
9
- attach_function :drop_agent, [], :bool
10
- end
3
+ module Pyroscope
4
+ module Rust
5
+ extend FFI::Library
6
+ ffi_lib File.expand_path(File.dirname(__FILE__)) + "/rbspy/rbspy.#{RbConfig::CONFIG["DLEXT"]}"
7
+ attach_function :initialize_agent, [:string, :string, :string, :int, :bool, :bool, :bool, :bool, :string], :bool
8
+ attach_function :add_thread_tag, [:uint64, :string, :string], :bool
9
+ attach_function :remove_thread_tag, [:uint64, :string, :string], :bool
10
+ attach_function :add_global_tag, [:string, :string], :bool
11
+ attach_function :remove_global_tag, [:string, :string], :bool
12
+ attach_function :drop_agent, [], :bool
13
+ end
11
14
 
12
- module Utils
13
- extend FFI::Library
14
- ffi_lib File.expand_path(File.dirname(__FILE__)) + "/thread_id/thread_id.#{RbConfig::CONFIG["DLEXT"]}"
15
- attach_function :thread_id, [], :uint64
16
- end
15
+ module Utils
16
+ extend FFI::Library
17
+ ffi_lib File.expand_path(File.dirname(__FILE__)) + "/thread_id/thread_id.#{RbConfig::CONFIG["DLEXT"]}"
18
+ attach_function :thread_id, [], :uint64
19
+ end
17
20
 
18
- module Pyroscope
19
21
  Config = Struct.new(:application_name, :app_name, :server_address, :auth_token, :sample_rate, :detect_subprocesses, :on_cpu, :report_pid, :report_thread_id, :log_level, :tags) do
20
22
  def initialize(*)
23
+ self.application_name = ''
24
+ self.server_address = 'http://localhost:4040'
25
+ self.auth_token = ''
26
+ self.sample_rate = 100
27
+ self.detect_subprocesses = false
28
+ self.on_cpu = true
29
+ self.report_pid = false
30
+ self.report_thread_id = false
31
+ self.log_level = 'info'
32
+ self.tags = {}
21
33
  super
22
- self.application_name ||= ''
23
- self.server_address ||= 'http://localhost:4040'
24
- self.auth_token ||= ''
25
- self.sample_rate ||= 100
26
- self.detect_subprocesses ||= true
27
- self.on_cpu ||= true
28
- self.report_pid ||= false
29
- self.report_thread_id ||= false
30
- self.log_level ||= 'info'
31
- self.tags ||= []
32
34
  end
33
35
  end
34
36
 
@@ -40,15 +42,15 @@ module Pyroscope
40
42
  yield @config
41
43
 
42
44
  Rust.initialize_agent(
43
- @config.app_name || @config.application_name,
44
- @config.server_address,
45
- @config.auth_token,
46
- @config.sample_rate,
47
- @config.detect_subprocesses,
48
- @config.on_cpu,
49
- @config.report_pid,
50
- @config.report_thread_id,
51
- tags_to_string(@config.tags)
45
+ @config.app_name || @config.application_name || "",
46
+ @config.server_address || "",
47
+ @config.auth_token || "",
48
+ @config.sample_rate || 100,
49
+ @config.detect_subprocesses || false,
50
+ @config.on_cpu || false,
51
+ @config.report_pid || false,
52
+ @config.report_thread_id || false,
53
+ tags_to_string(@config.tags || {})
52
54
  )
53
55
  end
54
56
 
@@ -83,14 +85,14 @@ module Pyroscope
83
85
  # add tags
84
86
  def _add_tags(thread_id, tags)
85
87
  tags.each do |tag_name, tag_value|
86
- Rust.add_tag(thread_id, tag_name.to_s, tag_value.to_s)
88
+ Rust.add_thread_tag(thread_id, tag_name.to_s, tag_value.to_s)
87
89
  end
88
90
  end
89
91
 
90
92
  # remove tags
91
93
  def _remove_tags(thread_id, tags)
92
94
  tags.each do |tag_name, tag_value|
93
- Rust.remove_tag(thread_id, tag_name.to_s, tag_value.to_s)
95
+ Rust.remove_thread_tag(thread_id, tag_name.to_s, tag_value.to_s)
94
96
  end
95
97
  end
96
98
 
data/lib/rbspy/rbspy.so CHANGED
Binary file
Binary file
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.3.0
4
+ version: 0.3.1
5
5
  platform: aarch64-linux
6
6
  authors:
7
7
  - Pyroscope Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-06-30 00:00:00.000000000 Z
11
+ date: 2022-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -85,6 +85,16 @@ files:
85
85
  - ext/thread_id/src/lib.rs
86
86
  - lib/pyroscope.rb
87
87
  - lib/pyroscope/version.rb
88
+ - lib/rbspy.libs/libcom_err-057ba42b.so.2.1
89
+ - lib/rbspy.libs/libcrypto-d9dd810d.so.1.0.2k
90
+ - lib/rbspy.libs/libgssapi_krb5-fec99a71.so.2.2
91
+ - lib/rbspy.libs/libk5crypto-47ac5e52.so.3.1
92
+ - lib/rbspy.libs/libkeyutils-19c64d08.so.1.5
93
+ - lib/rbspy.libs/libkrb5-c5423238.so.3.3
94
+ - lib/rbspy.libs/libkrb5support-2c32ed7d.so.0.1
95
+ - lib/rbspy.libs/libpcre-6b975b27.so.1.2.0
96
+ - lib/rbspy.libs/libselinux-ae24b712.so.1
97
+ - lib/rbspy.libs/libssl-4c1437a8.so.1.0.2k
88
98
  - lib/rbspy/rbspy.so
89
99
  - lib/thread_id/thread_id.so
90
100
  - pyroscope.gemspec
@@ -108,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
108
118
  - !ruby/object:Gem::Version
109
119
  version: '0'
110
120
  requirements: []
111
- rubygems_version: 3.2.3
121
+ rubygems_version: 3.3.7
112
122
  signing_key:
113
123
  specification_version: 4
114
124
  summary: Pyroscope