instana 1.195.4 → 1.198.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 +4 -4
- data/.rubocop.yml +6 -2
- data/Rakefile +1 -1
- data/instana.gemspec +3 -7
- data/lib/instana.rb +3 -0
- data/lib/instana/activator.rb +2 -0
- data/lib/instana/backend/agent.rb +62 -0
- data/lib/instana/backend/gc_snapshot.rb +41 -0
- data/lib/instana/backend/host_agent.rb +74 -0
- data/lib/instana/backend/host_agent_activation_observer.rb +97 -0
- data/lib/instana/backend/host_agent_lookup.rb +57 -0
- data/lib/instana/backend/host_agent_reporting_observer.rb +106 -0
- data/lib/instana/backend/process_info.rb +64 -0
- data/lib/instana/backend/request_client.rb +74 -0
- data/lib/instana/backend/serverless_agent.rb +113 -0
- data/lib/instana/base.rb +10 -27
- data/lib/instana/config.rb +8 -22
- data/lib/instana/instrumentation/excon.rb +7 -5
- data/lib/instana/instrumentation/instrumented_request.rb +62 -7
- data/lib/instana/instrumentation/net-http.rb +7 -5
- data/lib/instana/instrumentation/rack.rb +12 -7
- data/lib/instana/logger_delegator.rb +31 -0
- data/lib/instana/{opentracing → open_tracing}/carrier.rb +0 -0
- data/lib/instana/open_tracing/instana_tracer.rb +99 -0
- data/lib/instana/secrets.rb +6 -2
- data/lib/instana/serverless.rb +139 -0
- data/lib/instana/setup.rb +23 -11
- data/lib/instana/snapshot/deltable.rb +25 -0
- data/lib/instana/snapshot/docker_container.rb +151 -0
- data/lib/instana/snapshot/fargate_container.rb +88 -0
- data/lib/instana/snapshot/fargate_process.rb +67 -0
- data/lib/instana/snapshot/fargate_task.rb +72 -0
- data/lib/instana/snapshot/lambda_function.rb +39 -0
- data/lib/instana/snapshot/ruby_process.rb +48 -0
- data/lib/instana/tracer.rb +25 -143
- data/lib/instana/tracing/processor.rb +14 -22
- data/lib/instana/tracing/span.rb +33 -36
- data/lib/instana/tracing/span_context.rb +15 -10
- data/lib/instana/util.rb +8 -69
- data/lib/instana/version.rb +1 -1
- data/lib/opentracing.rb +26 -3
- data/test/backend/agent_test.rb +67 -0
- data/test/backend/gc_snapshot_test.rb +11 -0
- data/test/backend/host_agent_activation_observer_test.rb +72 -0
- data/test/backend/host_agent_lookup_test.rb +78 -0
- data/test/backend/host_agent_reporting_observer_test.rb +192 -0
- data/test/backend/host_agent_test.rb +47 -0
- data/test/backend/process_info_test.rb +63 -0
- data/test/backend/request_client_test.rb +39 -0
- data/test/backend/serverless_agent_test.rb +73 -0
- data/test/config_test.rb +10 -0
- data/test/instana_test.rb +11 -4
- data/test/instrumentation/rack_instrumented_request_test.rb +5 -2
- data/test/instrumentation/rack_test.rb +2 -14
- data/test/secrets_test.rb +41 -22
- data/test/serverless_test.rb +323 -0
- data/test/snapshot/deltable_test.rb +17 -0
- data/test/snapshot/docker_container_test.rb +82 -0
- data/test/snapshot/fargate_container_test.rb +82 -0
- data/test/snapshot/fargate_process_test.rb +35 -0
- data/test/snapshot/fargate_task_test.rb +49 -0
- data/test/snapshot/lambda_function_test.rb +37 -0
- data/test/snapshot/ruby_process_test.rb +14 -0
- data/test/support/mock_timer.rb +20 -0
- data/test/test_helper.rb +16 -4
- data/test/tracing/custom_test.rb +1 -3
- data/test/tracing/id_management_test.rb +8 -0
- data/test/tracing/opentracing_test.rb +15 -2
- data/test/tracing/processor_test.rb +58 -0
- data/test/tracing/span_context_test.rb +22 -0
- data/test/tracing/span_test.rb +136 -0
- data/test/tracing/tracer_async_test.rb +29 -0
- data/test/tracing/tracer_test.rb +82 -16
- data/test/util_test.rb +10 -0
- metadata +76 -43
- data/lib/instana/agent.rb +0 -508
- data/lib/instana/agent/helpers.rb +0 -87
- data/lib/instana/agent/hooks.rb +0 -44
- data/lib/instana/agent/tasks.rb +0 -51
- data/lib/instana/collector.rb +0 -119
- data/lib/instana/collectors/gc.rb +0 -60
- data/lib/instana/collectors/memory.rb +0 -37
- data/lib/instana/collectors/thread.rb +0 -33
- data/lib/instana/eum/eum-test.js.erb +0 -17
- data/lib/instana/eum/eum.js.erb +0 -17
- data/lib/instana/helpers.rb +0 -47
- data/lib/instana/opentracing/tracer.rb +0 -21
- data/lib/instana/thread_local.rb +0 -18
- data/lib/oj_check.rb +0 -19
- data/test/agent/agent_test.rb +0 -151
@@ -0,0 +1,151 @@
|
|
1
|
+
# (c) Copyright IBM Corp. 2021
|
2
|
+
# (c) Copyright Instana Inc. 2021
|
3
|
+
|
4
|
+
module Instana
|
5
|
+
module Snapshot
|
6
|
+
# Describes a Docker container visible to the current process
|
7
|
+
# @since 1.197.0
|
8
|
+
class DockerContainer
|
9
|
+
include Deltable
|
10
|
+
ID = 'com.instana.plugin.docker'.freeze
|
11
|
+
|
12
|
+
def initialize(container, metadata_uri: ENV['ECS_CONTAINER_METADATA_URI'])
|
13
|
+
@container = container
|
14
|
+
@metadata_uri = URI(metadata_uri)
|
15
|
+
@client = Backend::RequestClient.new(@metadata_uri.host, @metadata_uri.port, use_ssl: @metadata_uri.scheme == "https")
|
16
|
+
end
|
17
|
+
|
18
|
+
def entity_id
|
19
|
+
"#{@container['Labels']['com.amazonaws.ecs.task-arn']}::#{@container['Name']}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def data
|
23
|
+
metrics = lookup('/task/stats').fetch(@container['DockerId'], {})
|
24
|
+
|
25
|
+
container_metrics(metrics)
|
26
|
+
.merge(container_metadata)
|
27
|
+
end
|
28
|
+
|
29
|
+
def snapshot
|
30
|
+
{
|
31
|
+
name: ID,
|
32
|
+
entityId: entity_id,
|
33
|
+
data: data
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def container_metadata
|
40
|
+
{
|
41
|
+
Id: @container['DockerId'],
|
42
|
+
Created: @container['CreatedAt'],
|
43
|
+
Started: @container['StartedAt'],
|
44
|
+
Image: @container['Image'],
|
45
|
+
Labels: @container['Labels'],
|
46
|
+
Ports: @container['Ports'],
|
47
|
+
NetworkMode: @container['Networks'].first['NetworkMode']
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
def container_metrics(metrics)
|
52
|
+
return {} if metrics.empty?
|
53
|
+
|
54
|
+
{
|
55
|
+
memory: memory_stats(metrics),
|
56
|
+
blkio: blkio_stats(metrics),
|
57
|
+
cpu: cpu_stats(metrics),
|
58
|
+
network: network_stats(metrics)
|
59
|
+
}.compact
|
60
|
+
end
|
61
|
+
|
62
|
+
def memory_stats(metrics)
|
63
|
+
identity = ->(_old, new) { new }
|
64
|
+
|
65
|
+
{
|
66
|
+
active_anon: delta('memory_stats', 'stats', 'active_anon', compute: identity, obj: metrics),
|
67
|
+
active_file: delta('memory_stats', 'stats', 'active_file', compute: identity, obj: metrics),
|
68
|
+
inactive_anon: delta('memory_stats', 'stats', 'inactive_anon', compute: identity, obj: metrics),
|
69
|
+
inactive_file: delta('memory_stats', 'stats', 'inactive_file', compute: identity, obj: metrics),
|
70
|
+
total_cache: delta('memory_stats', 'stats', 'total_cache', compute: identity, obj: metrics),
|
71
|
+
total_rss: delta('memory_stats', 'stats', 'total_rss', compute: identity, obj: metrics),
|
72
|
+
usage: delta('memory_stats', 'usage', compute: identity, obj: metrics),
|
73
|
+
max_usage: delta('memory_stats', 'max_usage', compute: identity, obj: metrics),
|
74
|
+
limit: delta('memory_stats', 'limit', compute: identity, obj: metrics)
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
def blkio_stats(metrics)
|
79
|
+
delta = ->(old, new) { new - old }
|
80
|
+
bytes = {
|
81
|
+
'block_bytes' => metrics['blkio_stats']['io_service_bytes_recursive'].map { |r| [r['op'], r['value']] }.to_h
|
82
|
+
}
|
83
|
+
|
84
|
+
{
|
85
|
+
blk_read: delta('block_bytes', 'Read', compute: delta, obj: bytes),
|
86
|
+
blk_write: delta('block_bytes', 'Write', compute: delta, obj: bytes)
|
87
|
+
}
|
88
|
+
end
|
89
|
+
|
90
|
+
def cpu_stats(metrics)
|
91
|
+
delta = ->(old, new) { new - old }
|
92
|
+
identity = ->(_old, new) { new }
|
93
|
+
|
94
|
+
cpu_system_delta = delta('cpu_stats', 'system_cpu_usage', compute: delta, obj: metrics).to_f
|
95
|
+
online_cpus = delta('cpu_stats', 'online_cpus', compute: identity, obj: metrics) || 1
|
96
|
+
|
97
|
+
{
|
98
|
+
total_usage: (delta('cpu_stats', 'cpu_usage', 'total_usage', compute: delta, obj: metrics) / cpu_system_delta) * online_cpus,
|
99
|
+
user_usage: (delta('cpu_stats', 'cpu_usage', 'usage_in_usermode', compute: delta, obj: metrics) / cpu_system_delta) * online_cpus,
|
100
|
+
system_usage: (delta('cpu_stats', 'cpu_usage', 'usage_in_kernelmode', compute: delta, obj: metrics) / cpu_system_delta) * online_cpus,
|
101
|
+
throttling_count: delta('cpu_stats', 'throttling_data', 'periods', compute: delta, obj: metrics),
|
102
|
+
throttling_time: delta('cpu_stats', 'throttling_data', 'throttled_time', compute: delta, obj: metrics)
|
103
|
+
}
|
104
|
+
end
|
105
|
+
|
106
|
+
def network_stats(metrics)
|
107
|
+
delta = ->(old, new) { new - old }
|
108
|
+
return nil unless metrics['networks']
|
109
|
+
|
110
|
+
interfaces = metrics['networks'].keys
|
111
|
+
payload = {
|
112
|
+
rx: {
|
113
|
+
bytes: 0,
|
114
|
+
dropped: 0,
|
115
|
+
errors: 0,
|
116
|
+
packet: 0
|
117
|
+
},
|
118
|
+
tx: {
|
119
|
+
bytes: 0,
|
120
|
+
dropped: 0,
|
121
|
+
errors: 0,
|
122
|
+
packet: 0
|
123
|
+
}
|
124
|
+
}
|
125
|
+
|
126
|
+
interfaces.each do |interface|
|
127
|
+
payload[:rx][:bytes] += delta('networks', interface, 'rx_bytes', compute: delta, obj: metrics)
|
128
|
+
payload[:rx][:dropped] += delta('networks', interface, 'rx_dropped', compute: delta, obj: metrics)
|
129
|
+
payload[:rx][:errors] += delta('networks', interface, 'rx_errors', compute: delta, obj: metrics)
|
130
|
+
payload[:rx][:packet] += delta('networks', interface, 'rx_packets', compute: delta, obj: metrics)
|
131
|
+
|
132
|
+
payload[:tx][:bytes] += delta('networks', interface, 'tx_bytes', compute: delta, obj: metrics)
|
133
|
+
payload[:tx][:dropped] += delta('networks', interface, 'tx_packets', compute: delta, obj: metrics)
|
134
|
+
payload[:tx][:errors] += delta('networks', interface, 'tx_errors', compute: delta, obj: metrics)
|
135
|
+
payload[:tx][:packet] += delta('networks', interface, 'tx_dropped', compute: delta, obj: metrics)
|
136
|
+
end
|
137
|
+
|
138
|
+
payload
|
139
|
+
end
|
140
|
+
|
141
|
+
def lookup(resource)
|
142
|
+
path = @metadata_uri.path + resource
|
143
|
+
response = @client.send_request('GET', path)
|
144
|
+
|
145
|
+
raise "Unable to get `#{path}`. Got `#{response.code}`." unless response.ok?
|
146
|
+
|
147
|
+
response.json
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# (c) Copyright IBM Corp. 2021
|
2
|
+
# (c) Copyright Instana Inc. 2021
|
3
|
+
|
4
|
+
module Instana
|
5
|
+
module Snapshot
|
6
|
+
# Describes a Fargate container visible to the current process
|
7
|
+
# @since 1.197.0
|
8
|
+
class FargateContainer
|
9
|
+
ID = 'com.instana.plugin.aws.ecs.container'.freeze
|
10
|
+
|
11
|
+
def initialize(container, metadata_uri: ENV['ECS_CONTAINER_METADATA_URI'])
|
12
|
+
@container = container
|
13
|
+
@metadata_uri = URI(metadata_uri)
|
14
|
+
@client = Backend::RequestClient.new(@metadata_uri.host, @metadata_uri.port, use_ssl: @metadata_uri.scheme == "https")
|
15
|
+
end
|
16
|
+
|
17
|
+
def entity_id
|
18
|
+
"#{@container['Labels']['com.amazonaws.ecs.task-arn']}::#{@container['Name']}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def data
|
22
|
+
payload = {
|
23
|
+
dockerId: @container['DockerId'],
|
24
|
+
dockerName: @container['DockerName'],
|
25
|
+
containerName: @container['Name'],
|
26
|
+
image: @container['Image'],
|
27
|
+
imageId: @container['ImageID'],
|
28
|
+
taskArn: @container['Labels']['com.amazonaws.ecs.task-arn'],
|
29
|
+
taskDefinition: @container['Labels']['com.amazonaws.ecs.task-definition-data.family'],
|
30
|
+
taskDefinitionVersion: @container['Labels']['com.amazonaws.ecs.task-definition-data.version'],
|
31
|
+
clusterArn: @container['Labels']['com.amazonaws.ecs.cluster'],
|
32
|
+
desiredStatus: @container['DesiredStatus'],
|
33
|
+
knownStatus: @container['KnownStatus'],
|
34
|
+
ports: @container['Ports'],
|
35
|
+
limits: {
|
36
|
+
cpu: @container['Limits']['CPU'],
|
37
|
+
memory: @container['Limits']['Memory']
|
38
|
+
},
|
39
|
+
createdAt: @container['CreatedAt'],
|
40
|
+
startedAt: @container['StartedAt']
|
41
|
+
}
|
42
|
+
|
43
|
+
if current_container?
|
44
|
+
payload[:instrumented] = true
|
45
|
+
payload[:runtime] = 'ruby'
|
46
|
+
end
|
47
|
+
|
48
|
+
payload
|
49
|
+
end
|
50
|
+
|
51
|
+
def snapshot
|
52
|
+
{
|
53
|
+
name: ID,
|
54
|
+
entityId: entity_id,
|
55
|
+
data: data
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
def source
|
60
|
+
return unless current_container?
|
61
|
+
|
62
|
+
{
|
63
|
+
hl: true,
|
64
|
+
cp: 'aws',
|
65
|
+
e: entity_id
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def current_container?
|
72
|
+
return @current_container if @current_container
|
73
|
+
|
74
|
+
current_conatiner_response = current_conatiner
|
75
|
+
@current_container = @container['DockerName'] == current_conatiner_response['DockerName']
|
76
|
+
end
|
77
|
+
|
78
|
+
def current_conatiner
|
79
|
+
path = @metadata_uri.path
|
80
|
+
response = @client.send_request('GET', path)
|
81
|
+
|
82
|
+
raise "Unable to get `#{path}`. Got `#{response.code}`." unless response.ok?
|
83
|
+
|
84
|
+
response.json
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# (c) Copyright IBM Corp. 2021
|
2
|
+
# (c) Copyright Instana Inc. 2021
|
3
|
+
|
4
|
+
module Instana
|
5
|
+
module Snapshot
|
6
|
+
# Describes the current process in terms of its existence inside of a Fargate container
|
7
|
+
# @since 1.197.0
|
8
|
+
class FargateProcess
|
9
|
+
ID = 'com.instana.plugin.process'.freeze
|
10
|
+
|
11
|
+
def initialize(metadata_uri: ENV['ECS_CONTAINER_METADATA_URI'])
|
12
|
+
@metadata_uri = URI(metadata_uri)
|
13
|
+
@client = Backend::RequestClient.new(@metadata_uri.host, @metadata_uri.port, use_ssl: @metadata_uri.scheme == "https")
|
14
|
+
@start_time = Time.now
|
15
|
+
end
|
16
|
+
|
17
|
+
def entity_id
|
18
|
+
Process.pid.to_s
|
19
|
+
end
|
20
|
+
|
21
|
+
def data
|
22
|
+
proc_table = Sys::ProcTable.ps(pid: Process.pid)
|
23
|
+
process = Backend::ProcessInfo.new(proc_table)
|
24
|
+
|
25
|
+
{
|
26
|
+
pid: process.pid.to_i,
|
27
|
+
env: ENV.to_h,
|
28
|
+
exec: process.name,
|
29
|
+
args: process.arguments,
|
30
|
+
user: process.uid,
|
31
|
+
group: process.gid,
|
32
|
+
start: @start_time.to_i * 1000,
|
33
|
+
containerType: 'docker',
|
34
|
+
container: container_id,
|
35
|
+
"com.instana.plugin.host.name": task_id
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
def snapshot
|
40
|
+
{
|
41
|
+
name: ID,
|
42
|
+
entityId: entity_id,
|
43
|
+
data: data
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def lookup(resource = nil)
|
50
|
+
path = resource ? @metadata_uri.path + resource : @metadata_uri.path
|
51
|
+
response = @client.send_request('GET', path)
|
52
|
+
|
53
|
+
raise "Unable to get `#{path}`. Got `#{response.code}`." unless response.ok?
|
54
|
+
|
55
|
+
response.json
|
56
|
+
end
|
57
|
+
|
58
|
+
def container_id
|
59
|
+
@container_id ||= lookup['DockerId']
|
60
|
+
end
|
61
|
+
|
62
|
+
def task_id
|
63
|
+
@task_id ||= lookup('/task')['TaskARN']
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# (c) Copyright IBM Corp. 2021
|
2
|
+
# (c) Copyright Instana Inc. 2021
|
3
|
+
|
4
|
+
module Instana
|
5
|
+
module Snapshot
|
6
|
+
# Describes the current process in terms of its existence inside of a Fargate task
|
7
|
+
# @since 1.197.0
|
8
|
+
class FargateTask
|
9
|
+
ID = 'com.instana.plugin.aws.ecs.task'.freeze
|
10
|
+
|
11
|
+
def initialize(metadata_uri: ENV['ECS_CONTAINER_METADATA_URI'])
|
12
|
+
@metadata_uri = URI(metadata_uri)
|
13
|
+
@client = Backend::RequestClient.new(@metadata_uri.host, @metadata_uri.port, use_ssl: @metadata_uri.scheme == "https")
|
14
|
+
end
|
15
|
+
|
16
|
+
def entity_id
|
17
|
+
task_metadata['TaskARN']
|
18
|
+
end
|
19
|
+
alias host_name entity_id
|
20
|
+
|
21
|
+
def data
|
22
|
+
{
|
23
|
+
taskArn: task_metadata['TaskARN'],
|
24
|
+
clusterArn: task_metadata['Cluster'],
|
25
|
+
taskDefinition: task_metadata['Family'],
|
26
|
+
taskDefinitionVersion: task_metadata['Revision'],
|
27
|
+
availabilityZone: task_metadata['AvailabilityZone'],
|
28
|
+
desiredStatus: task_metadata['DesiredStatus'],
|
29
|
+
knownStatus: task_metadata['KnownStatus'],
|
30
|
+
pullStartedAt: task_metadata['PullStartedAt'],
|
31
|
+
pullStoppedAt: task_metadata['PullStoppedAt'],
|
32
|
+
instanaZone: instana_zone,
|
33
|
+
tags: instana_tags
|
34
|
+
}.compact
|
35
|
+
end
|
36
|
+
|
37
|
+
def snapshot
|
38
|
+
{
|
39
|
+
name: ID,
|
40
|
+
entityId: entity_id,
|
41
|
+
data: data
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def task_metadata
|
48
|
+
lookup('/task')
|
49
|
+
end
|
50
|
+
|
51
|
+
def instana_zone
|
52
|
+
ENV['INSTANA_ZONE']
|
53
|
+
end
|
54
|
+
|
55
|
+
def instana_tags
|
56
|
+
ENV.fetch('INSTANA_TAGS', '')
|
57
|
+
.split(/,/)
|
58
|
+
.map { |t| t.include?('=') ? t.split('=', 2) : [t, nil] }
|
59
|
+
.to_h
|
60
|
+
end
|
61
|
+
|
62
|
+
def lookup(resource)
|
63
|
+
path = @metadata_uri.path + resource
|
64
|
+
response = @client.send_request('GET', path)
|
65
|
+
|
66
|
+
raise "Unable to get `#{path}`. Got `#{response.code}`." unless response.ok?
|
67
|
+
|
68
|
+
response.json
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# (c) Copyright IBM Corp. 2021
|
2
|
+
# (c) Copyright Instana Inc. 2021
|
3
|
+
|
4
|
+
module Instana
|
5
|
+
module Snapshot
|
6
|
+
# @since 1.198.0
|
7
|
+
class LambdaFunction
|
8
|
+
ID = "com.instana.plugin.aws.lambda".freeze
|
9
|
+
|
10
|
+
def entity_id
|
11
|
+
Thread.current[:instana_function_arn]
|
12
|
+
end
|
13
|
+
|
14
|
+
def data
|
15
|
+
{}
|
16
|
+
end
|
17
|
+
|
18
|
+
def snapshot
|
19
|
+
{
|
20
|
+
name: ID,
|
21
|
+
entityId: entity_id,
|
22
|
+
data: data
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def source
|
27
|
+
{
|
28
|
+
hl: true,
|
29
|
+
cp: "aws",
|
30
|
+
e: entity_id
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
def host_name
|
35
|
+
entity_id
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# (c) Copyright IBM Corp. 2021
|
2
|
+
# (c) Copyright Instana Inc. 2021
|
3
|
+
|
4
|
+
module Instana
|
5
|
+
module Snapshot
|
6
|
+
# Describes the current Ruby process
|
7
|
+
# @since 1.197.0
|
8
|
+
class RubyProcess
|
9
|
+
ID = 'com.instana.plugin.ruby'.freeze
|
10
|
+
|
11
|
+
def initialize(pid: Process.pid)
|
12
|
+
@pid = pid
|
13
|
+
end
|
14
|
+
|
15
|
+
def entity_id
|
16
|
+
@pid.to_s
|
17
|
+
end
|
18
|
+
|
19
|
+
def data
|
20
|
+
metrics_data.merge(Util.take_snapshot)
|
21
|
+
end
|
22
|
+
|
23
|
+
def snapshot
|
24
|
+
{
|
25
|
+
name: ID,
|
26
|
+
entityId: entity_id,
|
27
|
+
data: data
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def metrics_data
|
34
|
+
proc_table = Sys::ProcTable.ps(pid: Process.pid)
|
35
|
+
process = Backend::ProcessInfo.new(proc_table)
|
36
|
+
|
37
|
+
{
|
38
|
+
pid: @pid,
|
39
|
+
name: Util.get_app_name,
|
40
|
+
exec_args: process.arguments,
|
41
|
+
gc: Backend::GCSnapshot.instance.report,
|
42
|
+
thread: {count: ::Thread.list.count},
|
43
|
+
memory: {rss_size: proc_table.rss / 1024} # Bytes to Kilobytes
|
44
|
+
}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|