elastic-apm 2.3.0 → 2.3.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of elastic-apm might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d759346f9597d0a9b179ca5b0f4b888c6b95b0f3b36efa26c568c423d82a6701
4
- data.tar.gz: 1a9a46998c62b9f5d337cf4371f8472c5e337f1fb75a4094f3bd6347e4e9d537
3
+ metadata.gz: 4b8d2dcb34f97fa80f6dd200bbb5d6a02a0219d054a0f2ca0df5a186ff530c8a
4
+ data.tar.gz: 4ad68c7e8c7fcac5d82c7b621090091dd9816e90584115b0482523b7ca458942
5
5
  SHA512:
6
- metadata.gz: a969fa9e0929166458d40d775d8577d0579a193f5d2b8fece6e26ddf3d15b8bdb8a5551efd7872d2a6e28a321dff77aadf433eccc4c707be0a70d560d947ccba
7
- data.tar.gz: 2f849a3f13569328da9d6726a89ee80e5c9d233c53e4191525e6b95daa64f8b92cba98b981c8591d4440f86f7509056d5a578b9a481a4d278a43c6a9923e70ad
6
+ metadata.gz: f1203dad667452f7080e67d7509f8046b327989c88da82e7019ecac3488c6a990d974e631a2ebd284c0e7b0896c8d533912bb8228bf728f7244c4a6da10edbd6
7
+ data.tar.gz: be5499f9a2bbb5803879d8fde02c8aa6b4b6c7585b150cb9f7baebd7d52b86df79db664aaa3b9e330458e2f29c60dc53b4f0a96ffeb999a8615215a7b8de2289
@@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## Changed (2019-01-31)
8
+
9
+ ### Added
10
+
11
+ - Read container info from Docker or Kupernetes ([#303](https://github.com/elastic/apm-agent-ruby/pull/303))
12
+
13
+ ### Fixed
14
+
15
+ - Fix logging exceptions when booting via Railtie ([#306](https://github.com/elastic/apm-agent-ruby/pull/306))
16
+
7
17
  ## 2.3.0 (2019-01-29)
8
18
 
9
19
  ### Added
@@ -3,6 +3,7 @@
3
3
  require 'elastic_apm/trace_context'
4
4
  require 'elastic_apm/span'
5
5
  require 'elastic_apm/transaction'
6
+ require 'elastic_apm/span_helpers'
6
7
 
7
8
  module ElasticAPM
8
9
  # rubocop:disable Metrics/ClassLength
@@ -10,9 +10,13 @@ module ElasticAPM
10
10
  @hostname = @config.hostname || `hostname`.chomp
11
11
  @architecture = gem_platform.cpu
12
12
  @platform = gem_platform.os
13
+
14
+ container_info = ContainerInfo.read!
15
+ @container = container_info.container
16
+ @kupernetes = container_info.kupernetes
13
17
  end
14
18
 
15
- attr_reader :hostname, :architecture, :platform
19
+ attr_reader :hostname, :architecture, :platform, :container, :kupernetes
16
20
 
17
21
  private
18
22
 
@@ -22,3 +26,5 @@ module ElasticAPM
22
26
  end
23
27
  end
24
28
  end
29
+
30
+ require 'elastic_apm/metadata/system_info/container_info'
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ElasticAPM
4
+ class Metadata
5
+ class SystemInfo
6
+ # @api private
7
+ class ContainerInfo
8
+ CGROUP_PATH = '/proc/pid/cgroup'
9
+
10
+ attr_accessor :container_id, :kupernetes_namespace,
11
+ :kupernetes_node_name, :kupernetes_pod_name, :kupernetes_pod_uid
12
+
13
+ def initialize(cgroup_path: CGROUP_PATH)
14
+ @cgroup_path = cgroup_path
15
+ end
16
+
17
+ attr_reader :cgroup_path
18
+
19
+ def read!
20
+ read_from_cgroup!
21
+ read_from_env!
22
+ self
23
+ end
24
+
25
+ def self.read!
26
+ new.read!
27
+ end
28
+
29
+ def container
30
+ @container ||=
31
+ begin
32
+ return unless container_id
33
+ { id: container_id }
34
+ end
35
+ end
36
+
37
+ def kupernetes
38
+ @kupernetes =
39
+ begin
40
+ kupernetes = {}
41
+
42
+ kupernetes[:namespace] = kupernetes_namespace
43
+ kupernetes[:node_name] = kupernetes_node_name
44
+ kupernetes[:pod_name] = kupernetes_pod_name
45
+ kupernetes[:pod_uid] = kupernetes_pod_uid
46
+ return nil if kupernetes.values.all?(&:nil?)
47
+
48
+ kupernetes
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def read_from_env!
55
+ self.kupernetes_namespace =
56
+ ENV.fetch('KUBERNETES_NAMESPACE', kupernetes_namespace)
57
+ self.kupernetes_node_name =
58
+ ENV.fetch('KUBERNETES_NODE_NAME', kupernetes_node_name)
59
+ self.kupernetes_pod_name =
60
+ ENV.fetch('KUBERNETES_POD_NAME', kupernetes_pod_name)
61
+ self.kupernetes_pod_uid =
62
+ ENV.fetch('KUBERNETES_POD_UID', kupernetes_pod_uid)
63
+ end
64
+
65
+ CONTAINER_ID_REGEX = /^[0-9A-Fa-f]{64}$/.freeze
66
+ KUBEPODS_REGEX = %r{(?:^/kubepods/[^/]+/pod([^/]+)$)|(?:^/kubepods\.slice/kubepods-[^/]+\.slice/kubepods-[^/]+-pod([^/]+)\.slice$)}.freeze # rubocop:disable Metrics/LineLength
67
+ SYSTEMD_SCOPE_SUFFIX = '.scope'
68
+
69
+ # rubocop:disable Metrics/MethodLength, Metrics/PerceivedComplexity
70
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/AbcSize
71
+ def read_from_cgroup!
72
+ return unless File.exist?(cgroup_path)
73
+ IO.readlines(cgroup_path).each do |line|
74
+ parts = line.strip.split(':')
75
+ next if parts.length != 3
76
+
77
+ cgroup_path = parts[2]
78
+
79
+ # Depending on the filesystem driver used for cgroup
80
+ # management, the paths in /proc/pid/cgroup will have
81
+ # one of the following formats in a Docker container:
82
+ #
83
+ # systemd: /system.slice/docker-<container-ID>.scope
84
+ # cgroupfs: /docker/<container-ID>
85
+ #
86
+ # In a Kubernetes pod, the cgroup path will look like:
87
+ #
88
+ # systemd:
89
+ # /kubepods.slice/kubepods-<QoS-class>.slice/kubepods-\
90
+ # <QoS-class>-pod<pod-UID>.slice/<container-iD>.scope
91
+ # cgroupfs:
92
+ # /kubepods/<QoS-class>/pod<pod-UID>/<container-iD>
93
+ directory, container_id = File.split(cgroup_path)
94
+
95
+ if container_id.end_with?(SYSTEMD_SCOPE_SUFFIX)
96
+ container_id = container_id[0...-SYSTEMD_SCOPE_SUFFIX.length]
97
+ if container_id.include?('-')
98
+ container_id = container_id.split('-', 2)[1]
99
+ end
100
+ end
101
+
102
+ if (kubepods_match = KUBEPODS_REGEX.match(directory))
103
+ pod_id = kubepods_match[1] || kubepods_match[2]
104
+
105
+ self.container_id = container_id
106
+ self.kupernetes_pod_uid = pod_id
107
+ elsif CONTAINER_ID_REGEX.match(container_id)
108
+ self.container_id = container_id
109
+ end
110
+ end
111
+ end
112
+ # rubocop:enable Metrics/MethodLength, Metrics/PerceivedComplexity
113
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/AbcSize
114
+ end
115
+ end
116
+ end
117
+ end
@@ -10,7 +10,7 @@ module ElasticAPM
10
10
  Config::DEFAULTS.each { |option, value| config.elastic_apm[option] = value }
11
11
 
12
12
  initializer 'elastic_apm.initialize' do |app|
13
- config = app.config.elastic_apm.merge(app: app).tap do |c|
13
+ config = Config.new(app.config.elastic_apm.merge(app: app)).tap do |c|
14
14
  # Prepend Rails.root to log_path if present
15
15
  if c.log_path && !c.log_path.start_with?('/')
16
16
  c.log_path = Rails.root.join(c.log_path)
@@ -27,7 +27,7 @@ module ElasticAPM
27
27
  end
28
28
  rescue StandardError => e
29
29
  config.alert_logger.error format('Failed to start: %s', e.message)
30
- config.alert_logger.debug e.backtrace.join("\n")
30
+ config.alert_logger.debug "Backtrace:\n" + e.backtrace.join("\n")
31
31
  end
32
32
  end
33
33
 
@@ -119,7 +119,7 @@ module ElasticAPM
119
119
  if resp&.status == 202
120
120
  debug 'APM Server responded with status 202'
121
121
  elsif resp
122
- error "APM Server reponded with an error:\n%p", resp.body.to_s
122
+ error "APM Server responded with an error:\n%p", resp.body.to_s
123
123
  end
124
124
 
125
125
  resp
@@ -11,8 +11,8 @@ module ElasticAPM
11
11
 
12
12
  attr_reader :prefix
13
13
 
14
- def add(severity, message = nil, progname = nil)
15
- super(severity, format('%s%s', prefix, message), progname)
14
+ def add(severity, message = nil, progname = nil, &block)
15
+ super(severity, message, format('%s%s', prefix, progname), &block)
16
16
  end
17
17
  end
18
18
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ElasticAPM
4
- VERSION = '2.3.0'
4
+ VERSION = '2.3.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elastic-apm
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikkel Malmberg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-01-29 00:00:00.000000000 Z
11
+ date: 2019-01-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -104,6 +104,7 @@ files:
104
104
  - lib/elastic_apm/metadata/process_info.rb
105
105
  - lib/elastic_apm/metadata/service_info.rb
106
106
  - lib/elastic_apm/metadata/system_info.rb
107
+ - lib/elastic_apm/metadata/system_info/container_info.rb
107
108
  - lib/elastic_apm/metrics.rb
108
109
  - lib/elastic_apm/metrics/cpu_mem.rb
109
110
  - lib/elastic_apm/metricset.rb