atatus 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/Gemfile +72 -22
  4. data/LICENSE +1 -1
  5. data/atatus.gemspec +2 -2
  6. data/lib/atatus.rb +76 -16
  7. data/lib/atatus/agent.rb +78 -29
  8. data/lib/atatus/central_config.rb +72 -27
  9. data/lib/atatus/central_config/cache_control.rb +18 -1
  10. data/lib/atatus/child_durations.rb +64 -0
  11. data/lib/atatus/collector/base.rb +61 -29
  12. data/lib/atatus/collector/builder.rb +46 -2
  13. data/lib/atatus/collector/hist.rb +54 -0
  14. data/lib/atatus/collector/transport.rb +41 -11
  15. data/lib/atatus/config.rb +129 -28
  16. data/lib/atatus/config/bytes.rb +17 -0
  17. data/lib/atatus/config/duration.rb +17 -0
  18. data/lib/atatus/config/options.rb +29 -9
  19. data/lib/atatus/config/regexp_list.rb +17 -0
  20. data/lib/atatus/config/wildcard_pattern_list.rb +64 -0
  21. data/lib/atatus/context.rb +32 -1
  22. data/lib/atatus/context/request.rb +17 -0
  23. data/lib/atatus/context/request/socket.rb +18 -1
  24. data/lib/atatus/context/request/url.rb +17 -0
  25. data/lib/atatus/context/response.rb +27 -2
  26. data/lib/atatus/context/user.rb +17 -0
  27. data/lib/atatus/context_builder.rb +19 -4
  28. data/lib/atatus/deprecations.rb +17 -0
  29. data/lib/atatus/error.rb +27 -0
  30. data/lib/atatus/error/exception.rb +24 -0
  31. data/lib/atatus/error/log.rb +17 -0
  32. data/lib/atatus/error_builder.rb +17 -2
  33. data/lib/atatus/grape.rb +62 -0
  34. data/lib/atatus/graphql.rb +91 -0
  35. data/lib/atatus/grpc.rb +99 -0
  36. data/lib/atatus/instrumenter.rb +135 -30
  37. data/lib/atatus/internal_error.rb +17 -0
  38. data/lib/atatus/logging.rb +17 -2
  39. data/lib/atatus/metadata.rb +17 -0
  40. data/lib/atatus/metadata/process_info.rb +17 -0
  41. data/lib/atatus/metadata/service_info.rb +21 -6
  42. data/lib/atatus/metadata/system_info.rb +22 -3
  43. data/lib/atatus/metadata/system_info/container_info.rb +49 -10
  44. data/lib/atatus/metadata/system_info/hw_info.rb +1 -1
  45. data/lib/atatus/metrics.rb +69 -27
  46. data/lib/atatus/metrics/breakdown_set.rb +31 -0
  47. data/lib/atatus/metrics/{cpu_mem.rb → cpu_mem_set.rb} +110 -63
  48. data/lib/atatus/metrics/metric.rb +140 -0
  49. data/lib/atatus/metrics/set.rb +123 -0
  50. data/lib/atatus/metrics/span_scoped_set.rb +56 -0
  51. data/lib/atatus/metrics/transaction_set.rb +26 -0
  52. data/lib/atatus/metrics/vm_set.rb +58 -0
  53. data/lib/atatus/metricset.rb +48 -4
  54. data/lib/atatus/middleware.rb +28 -8
  55. data/lib/atatus/naively_hashable.rb +17 -0
  56. data/lib/atatus/normalizers.rb +23 -9
  57. data/lib/atatus/normalizers/grape.rb +22 -0
  58. data/lib/atatus/normalizers/grape/endpoint_run.rb +65 -0
  59. data/lib/atatus/normalizers/rails.rb +27 -0
  60. data/lib/atatus/normalizers/rails/action_controller.rb +44 -0
  61. data/lib/atatus/normalizers/rails/action_mailer.rb +43 -0
  62. data/lib/atatus/normalizers/{action_view.rb → rails/action_view.rb} +17 -0
  63. data/lib/atatus/normalizers/rails/active_record.rb +80 -0
  64. data/lib/atatus/opentracing.rb +75 -42
  65. data/lib/atatus/rails.rb +29 -13
  66. data/lib/atatus/railtie.rb +19 -6
  67. data/lib/atatus/resque.rb +29 -0
  68. data/lib/atatus/sinatra.rb +53 -0
  69. data/lib/atatus/span.rb +44 -15
  70. data/lib/atatus/span/context.rb +43 -28
  71. data/lib/atatus/span/context/db.rb +43 -0
  72. data/lib/atatus/span/context/destination.rb +77 -0
  73. data/lib/atatus/span/context/http.rb +43 -0
  74. data/lib/atatus/span_helpers.rb +18 -1
  75. data/lib/atatus/spies.rb +33 -15
  76. data/lib/atatus/spies/action_dispatch.rb +27 -6
  77. data/lib/atatus/spies/delayed_job.rb +26 -5
  78. data/lib/atatus/spies/dynamo_db.rb +62 -0
  79. data/lib/atatus/spies/elasticsearch.rb +53 -7
  80. data/lib/atatus/spies/faraday.rb +54 -20
  81. data/lib/atatus/spies/http.rb +36 -6
  82. data/lib/atatus/spies/json.rb +18 -0
  83. data/lib/atatus/spies/mongo.rb +41 -10
  84. data/lib/atatus/spies/net_http.rb +52 -11
  85. data/lib/atatus/spies/rake.rb +42 -23
  86. data/lib/atatus/spies/redis.rb +17 -0
  87. data/lib/atatus/spies/resque.rb +57 -0
  88. data/lib/atatus/spies/sequel.rb +54 -17
  89. data/lib/atatus/spies/shoryuken.rb +69 -0
  90. data/lib/atatus/spies/sidekiq.rb +46 -25
  91. data/lib/atatus/spies/sinatra.rb +20 -4
  92. data/lib/atatus/spies/sneakers.rb +74 -0
  93. data/lib/atatus/spies/sucker_punch.rb +58 -0
  94. data/lib/atatus/spies/tilt.rb +20 -1
  95. data/lib/atatus/sql.rb +36 -0
  96. data/lib/atatus/sql/signature.rb +169 -0
  97. data/lib/atatus/sql/tokenizer.rb +264 -0
  98. data/lib/atatus/sql/tokens.rb +63 -0
  99. data/lib/atatus/sql_summarizer.rb +24 -6
  100. data/lib/atatus/stacktrace.rb +17 -0
  101. data/lib/atatus/stacktrace/frame.rb +17 -3
  102. data/lib/atatus/stacktrace_builder.rb +23 -3
  103. data/lib/atatus/subscriber.rb +23 -4
  104. data/lib/atatus/trace_context.rb +84 -51
  105. data/lib/atatus/trace_context/traceparent.rb +111 -0
  106. data/lib/atatus/trace_context/tracestate.rb +148 -0
  107. data/lib/atatus/transaction.rb +74 -18
  108. data/lib/atatus/transport/base.rb +44 -27
  109. data/lib/atatus/transport/connection.rb +28 -72
  110. data/lib/atatus/transport/connection/http.rb +58 -35
  111. data/lib/atatus/transport/connection/proxy_pipe.rb +24 -5
  112. data/lib/atatus/transport/filters.rb +18 -1
  113. data/lib/atatus/transport/filters/hash_sanitizer.rb +77 -0
  114. data/lib/atatus/transport/filters/secrets_filter.rb +30 -55
  115. data/lib/atatus/transport/headers.rb +83 -0
  116. data/lib/atatus/transport/serializers.rb +17 -5
  117. data/lib/atatus/transport/serializers/context_serializer.rb +30 -3
  118. data/lib/atatus/transport/serializers/error_serializer.rb +17 -2
  119. data/lib/atatus/transport/serializers/metadata_serializer.rb +44 -22
  120. data/lib/atatus/transport/serializers/metricset_serializer.rb +34 -6
  121. data/lib/atatus/transport/serializers/span_serializer.rb +47 -12
  122. data/lib/atatus/transport/serializers/transaction_serializer.rb +18 -2
  123. data/lib/atatus/transport/user_agent.rb +48 -0
  124. data/lib/atatus/transport/worker.rb +31 -7
  125. data/lib/atatus/util.rb +18 -1
  126. data/lib/atatus/util/inflector.rb +17 -0
  127. data/lib/atatus/util/lru_cache.rb +17 -0
  128. data/lib/atatus/util/throttle.rb +17 -0
  129. data/lib/atatus/version.rb +19 -1
  130. metadata +46 -26
  131. data/Rakefile +0 -19
  132. data/bench/.gitignore +0 -2
  133. data/bench/app.rb +0 -53
  134. data/bench/benchmark.rb +0 -36
  135. data/bench/report.rb +0 -55
  136. data/bench/rubyprof.rb +0 -39
  137. data/bench/stackprof.rb +0 -23
  138. data/bin/build_docs +0 -5
  139. data/bin/console +0 -15
  140. data/bin/setup +0 -8
  141. data/bin/with_framework +0 -7
  142. data/lib/atatus/metrics/vm.rb +0 -60
  143. data/lib/atatus/normalizers/action_controller.rb +0 -27
  144. data/lib/atatus/normalizers/action_mailer.rb +0 -26
  145. data/lib/atatus/normalizers/active_record.rb +0 -45
  146. data/lib/atatus/util/prefixed_logger.rb +0 -18
  147. data/vendor/.gitkeep +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2602d9c1f9bd2eb164f36638cc774cbad5618f362a342be4f33b04c33b83b848
4
- data.tar.gz: 20446fd8e0a732c8361a523d84ad3af68f4ae0a93e177773bd8f20350a58a2d0
3
+ metadata.gz: 651694b5c78acd1f1582c30f1b28715b6a653c2b125a75613a19b7ae86361d9b
4
+ data.tar.gz: 4a8e5ee631f32b09942bb6ae53a72531c4e7ffe2677194ee7f19f81dfd4c9eeb
5
5
  SHA512:
6
- metadata.gz: 2d0f3386ee29b3785096f9832bbae6a4d73e374cc1c5b181a98baafc3f12a52bb67ab82d1d183850459ac8b67f96250a3cba3475ca1fd6527f6f176d44091f41
7
- data.tar.gz: 446edc9f0c6bf1c636592bc256807aea85261be9ec53008657df658ca3a5d7d179b0731cf74462ec4e0b0a29562dc878bfda84b0e7587ba84ea4babff48cc97b
6
+ metadata.gz: 0400c2f1f8bdd57366d49d5a05f8d4dc49bc804e5dc263cfe9771043a021a47c08d7544af1adb9408a2c517c7839d20e6e7bb48329038e684c35a61bbf0db210
7
+ data.tar.gz: 76eb02d1bf4cebf184ff8df44f71d553f64fe9e9dfb75aeb4c3e214a97a3dbc6efc7797a34321f019a0fc15be06800ef575efae6dc580aa1061037aeb1c13f4d
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
5
5
  This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
6
 
7
7
 
8
+ ## 1.4.0 (Tue, 15 Sept 2020)
9
+
10
+ - Added histogram support.
11
+ - Fixed Ruby 2.7.0 warning messages.
12
+
13
+
8
14
  ## 1.3.0 (Wed, 18 Mar 2020)
9
15
 
10
16
  - Added custom instrumentation via annotate method.
data/Gemfile CHANGED
@@ -1,57 +1,107 @@
1
+ # Licensed to Elasticsearch B.V. under one or more contributor
2
+ # license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright
4
+ # ownership. Elasticsearch B.V. licenses this file to you under
5
+ # the Apache License, Version 2.0 (the "License"); you may
6
+ # not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
1
18
  # frozen_string_literal: true
2
19
 
3
20
  source 'https://rubygems.org'
4
21
 
5
22
  git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
6
23
 
7
- gemspec
8
-
24
+ # Tools
25
+ gem 'bootsnap', require: false
26
+ gem 'cucumber', require: false
27
+ gem 'pry'
9
28
  gem 'rack-test'
10
- gem 'rspec'
29
+ gem 'rspec', '~> 3'
11
30
  gem 'rspec-its'
12
31
  gem 'rubocop', require: nil
32
+ gem 'rubocop-performance', require: nil
13
33
  gem 'timecop'
14
34
  gem 'webmock'
15
35
 
36
+ # Integrations
37
+ gem 'aws-sdk-dynamodb', require: nil
38
+ gem 'aws-sdk-sqs', require: nil
16
39
  gem 'elasticsearch', require: nil
17
40
  gem 'fakeredis', require: nil
18
41
  gem 'faraday', require: nil
42
+ gem 'graphql', require: nil
43
+ gem 'google-protobuf', '< 3.12' if !defined?(JRUBY_VERSION) && RUBY_VERSION < '2.5'
44
+ gem 'grpc' if !defined?(JRUBY_VERSION)
45
+ gem 'json'
19
46
  gem 'json-schema', require: nil
20
47
  gem 'mongo', require: nil
21
48
  gem 'opentracing', require: nil
22
49
  gem 'rake', require: nil
50
+ gem 'resque', require: nil
23
51
  gem 'sequel', require: nil
52
+ gem 'shoryuken', require: nil
24
53
  gem 'sidekiq', require: nil
25
- gem 'simplecov', require: false, group: :test
26
- gem 'simplecov-cobertura', require: false, group: :test
54
+ gem 'simplecov', require: false
55
+ gem 'simplecov-cobertura', require: false
56
+ gem 'sneakers', '~> 2.12', require: nil
57
+ gem 'sucker_punch', '~> 2.0', require: nil
27
58
  gem 'yard', require: nil
28
59
  gem 'yarjuf'
29
60
 
30
- if RUBY_PLATFORM == 'java'
31
- gem 'jdbc-sqlite3'
32
- else
33
- gem 'sqlite3'
34
- end
61
+ ## Install Framework
62
+ GITHUB_REPOS = {
63
+ 'grape' => 'ruby-grape/grape',
64
+ 'rails' => 'rails/rails',
65
+ 'sinatra' => 'sinatra/sinatra'
66
+ }.freeze
35
67
 
36
- framework, *version = ENV.fetch('FRAMEWORK', 'rails').split('-')
37
- version = version.join('-')
68
+ # new || legacy || default
69
+ env_frameworks = ENV['FRAMEWORKS'] || ENV['FRAMEWORK'] || ''
70
+ parsed_frameworks = env_frameworks.split(',')
71
+ frameworks_versions = parsed_frameworks.inject({}) do |frameworks, str|
72
+ framework, *version = str.split('-')
73
+ frameworks.merge(framework => version.join('-'))
74
+ end
38
75
 
39
- case version
40
- when 'master'
41
- gem framework, github: "#{framework}/#{framework}"
42
- when /.+/
43
- gem framework, "~> #{version}.0"
44
- else
45
- gem framework
76
+ frameworks_versions.each do |framework, version|
77
+ case version
78
+ when 'master'
79
+ gem framework, github: GITHUB_REPOS.fetch(framework)
80
+ when /.+/
81
+ gem framework, "~> #{version}.0"
82
+ else
83
+ gem framework
84
+ end
46
85
  end
47
86
 
48
- gem 'activerecord-jdbcsqlite3-adapter', platform: :jruby
87
+ if frameworks_versions.key?('rails')
88
+ unless frameworks_versions['rails'] =~ /^(master|6)/
89
+ gem 'delayed_job', require: nil
90
+ end
91
+ end
49
92
 
50
- unless version =~ /^(master|6)/
51
- gem 'delayed_job', require: nil
93
+ if RUBY_PLATFORM == 'java'
94
+ gem 'activerecord-jdbcsqlite3-adapter'
95
+ gem 'jdbc-sqlite3'
96
+ elsif frameworks_versions['rails'] =~ /^(4|5)/
97
+ gem 'sqlite3', '~> 1.3.6'
98
+ else
99
+ gem 'sqlite3' # rubocop:disable Bundler/DuplicatedGem
52
100
  end
53
101
 
54
102
  group :bench do
55
103
  gem 'ruby-prof', require: nil, platforms: %i[ruby]
56
104
  gem 'stackprof', require: nil, platforms: %i[ruby]
57
105
  end
106
+
107
+ gemspec
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- All components of this product are Copyright (c) 2019 Atatus. All rights reserved.
1
+ All components of this product are Copyright (c) 2020 Atatus. All rights reserved.
2
2
 
3
3
  Except as otherwise expressly provided in this Agreement,
4
4
  End User shall not (and shall not permit any third party to):
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
12
12
  spec.homepage = 'https://www.atatus.com'
13
13
  spec.metadata = {
14
14
  'changelog_uri' => 'https://docs.atatus.com/docs/release-notes/ruby.html',
15
- 'documentation_uri' => 'https://docs.atatus.com/docs/application-monitoring/ruby-agent/rails.html',
15
+ 'documentation_uri' => 'https://docs.atatus.com/docs/application-monitoring/ruby-agent/overview.html',
16
16
  }
17
17
  spec.date = Time.now.strftime('%Y-%m-%d')
18
18
  spec.licenses = ['Atatus']
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
26
26
  ]
27
27
 
28
28
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
29
- f.match(%r{^(test|spec|features|docs|releases)/}) || f.match(%r{^(CONTRIBUTING.md|RELEASE.md)})
29
+ f.match(%r{^(bench|bin|test|spec|features|docs|releases)/}) || f.match(%r{^(CONTRIBUTING.md|RELEASE.md|Rakefile|docker-compose.yml|Dockerfile)})
30
30
  end
31
31
 
32
32
  spec.add_dependency('concurrent-ruby', '~> 1.0')
@@ -1,5 +1,32 @@
1
+ # Licensed to Elasticsearch B.V. under one or more contributor
2
+ # license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright
4
+ # ownership. Elasticsearch B.V. licenses this file to you under
5
+ # the Apache License, Version 2.0 (the "License"); you may
6
+ # not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
1
18
  # frozen_string_literal: true
2
19
 
20
+ require 'erb'
21
+ require 'http'
22
+ require 'json'
23
+ require 'yaml'
24
+ require 'zlib'
25
+ require 'logger'
26
+ require 'concurrent'
27
+ require 'forwardable'
28
+ require 'securerandom'
29
+
3
30
  require 'atatus/version'
4
31
  require 'atatus/internal_error'
5
32
  require 'atatus/logging'
@@ -12,11 +39,15 @@ require 'atatus/instrumenter'
12
39
  require 'atatus/util'
13
40
 
14
41
  require 'atatus/middleware'
42
+ require 'atatus/graphql'
15
43
 
16
- require 'atatus/railtie' if defined?(::Rails::Railtie)
44
+ require 'atatus/rails' if defined?(::Rails::Railtie)
45
+ require 'atatus/sinatra' if defined?(::Sinatra)
46
+ require 'atatus/grape' if defined?(::Grape)
47
+ require 'atatus/grpc' if defined?(::GRPC)
17
48
 
18
49
  # Atatus
19
- module Atatus # rubocop:disable Metrics/ModuleLength
50
+ module Atatus
20
51
  class << self
21
52
  ### Life cycle
22
53
 
@@ -33,6 +64,16 @@ module Atatus # rubocop:disable Metrics/ModuleLength
33
64
  Agent.stop
34
65
  end
35
66
 
67
+ # Restarts the Atatus Agent using the same config or a new
68
+ # one, if it is provided.
69
+ # Starts the agent if it is not running.
70
+ # Stops and starts the agent if it is running.
71
+ def restart(config = nil)
72
+ config ||= agent&.config
73
+ stop if running?
74
+ start(config)
75
+ end
76
+
36
77
  # @return [Boolean] Whether there's an [Agent] running
37
78
  def running?
38
79
  Agent.running?
@@ -59,7 +100,6 @@ module Atatus # rubocop:disable Metrics/ModuleLength
59
100
  agent&.current_span
60
101
  end
61
102
 
62
- # rubocop:disable Metrics/AbcSize
63
103
  # Get a formatted string containing transaction, span, and trace ids.
64
104
  # If a block is provided, the ids are yielded.
65
105
  #
@@ -78,9 +118,7 @@ module Atatus # rubocop:disable Metrics/ModuleLength
78
118
  ids << "trace.id=#{trace_id}" if trace_id
79
119
  ids.join(' ')
80
120
  end
81
- # rubocop:enable Metrics/AbcSize
82
121
 
83
- # rubocop:disable Metrics/MethodLength
84
122
  # Start a new transaction
85
123
  #
86
124
  # @param name [String] A description of the transaction, eg
@@ -88,6 +126,8 @@ module Atatus # rubocop:disable Metrics/ModuleLength
88
126
  # @param type [String] The kind of the transaction, eg `app.request.get` or
89
127
  # `db.mysql2.query`
90
128
  # @param context [Context] An optional [Context]
129
+ # @param trace_context [TraceContext] An optional [TraceContext] object for
130
+ # Distributed Tracing.
91
131
  # @return [Transaction]
92
132
  def start_transaction(
93
133
  name = nil,
@@ -102,7 +142,6 @@ module Atatus # rubocop:disable Metrics/ModuleLength
102
142
  trace_context: trace_context
103
143
  )
104
144
  end
105
- # rubocop:enable Metrics/MethodLength
106
145
 
107
146
  # Ends the current transaction with `result`
108
147
  #
@@ -112,7 +151,6 @@ module Atatus # rubocop:disable Metrics/ModuleLength
112
151
  agent&.end_transaction(result)
113
152
  end
114
153
 
115
- # rubocop:disable Metrics/MethodLength
116
154
  # Wrap a block in a Transaction, ending it after the block
117
155
  #
118
156
  # @param name [String] A description of the transaction, eg
@@ -120,6 +158,8 @@ module Atatus # rubocop:disable Metrics/ModuleLength
120
158
  # @param type [String] The kind of the transaction, eg `app.request.get` or
121
159
  # `db.mysql2.query`
122
160
  # @param context [Context] An optional [Context]
161
+ # @param trace_context [TraceContext] An optional [TraceContext] object for
162
+ # Distributed Tracing.
123
163
  # @yield [Transaction]
124
164
  # @return result of block
125
165
  def with_transaction(
@@ -148,8 +188,8 @@ module Atatus # rubocop:disable Metrics/ModuleLength
148
188
  end_transaction
149
189
  end
150
190
  end
151
- # rubocop:enable Metrics/MethodLength
152
191
 
192
+ # rubocop:disable Metrics/ParameterLists
153
193
  # Start a new span
154
194
  #
155
195
  # @param name [String] A description of the span, eq `SELECT FROM "users"`
@@ -158,6 +198,11 @@ module Atatus # rubocop:disable Metrics/ModuleLength
158
198
  # @param action [String] The span action type, eq `connect` or `query`
159
199
  # @param context [Span::Context] Context information about the span
160
200
  # @param include_stacktrace [Boolean] Whether or not to capture a stacktrace
201
+ # @param trace_context [TraceContext] An optional [TraceContext] object for
202
+ # Distributed Tracing.
203
+ # @param parent [Transaction,Span] The parent transaction or span.
204
+ # Relevant when the span is created in another thread.
205
+ # @param sync [Boolean] Whether the span is created synchronously or not.
161
206
  # @return [Span]
162
207
  def start_span(
163
208
  name,
@@ -166,7 +211,9 @@ module Atatus # rubocop:disable Metrics/ModuleLength
166
211
  action: nil,
167
212
  context: nil,
168
213
  include_stacktrace: true,
169
- trace_context: nil
214
+ trace_context: nil,
215
+ parent: nil,
216
+ sync: nil
170
217
  )
171
218
  agent&.start_span(
172
219
  name,
@@ -174,7 +221,9 @@ module Atatus # rubocop:disable Metrics/ModuleLength
174
221
  subtype: subtype,
175
222
  action: action,
176
223
  context: context,
177
- trace_context: trace_context
224
+ trace_context: trace_context,
225
+ parent: parent,
226
+ sync: sync
178
227
  ).tap do |span|
179
228
  break unless span && include_stacktrace
180
229
  break unless agent.config.span_frames_min_duration?
@@ -182,7 +231,7 @@ module Atatus # rubocop:disable Metrics/ModuleLength
182
231
  span.original_backtrace ||= caller
183
232
  end
184
233
  end
185
- # rubocop:enable Metrics/MethodLength, Metrics/ParameterLists
234
+ # rubocop:enable Metrics/ParameterLists
186
235
 
187
236
  # Ends the current span
188
237
  #
@@ -191,13 +240,20 @@ module Atatus # rubocop:disable Metrics/ModuleLength
191
240
  agent&.end_span
192
241
  end
193
242
 
194
- # rubocop:disable Metrics/MethodLength, Metrics/ParameterLists
243
+ # rubocop:disable Metrics/ParameterLists
195
244
  # Wrap a block in a Span, ending it after the block
196
245
  #
197
246
  # @param name [String] A description of the span, eq `SELECT FROM "users"`
198
- # @param type [String] The kind of span, eq `db.mysql2.query`
247
+ # @param type [String] The kind of span, eq `db`
248
+ # @param subtype [String] The subtype of span eg. `postgresql`.
249
+ # @param action [String] The action type of span eg. `connect` or `query`.
199
250
  # @param context [Span::Context] Context information about the span
200
251
  # @param include_stacktrace [Boolean] Whether or not to capture a stacktrace
252
+ # @param trace_context [TraceContext] An optional [TraceContext] object for
253
+ # Distributed Tracing.
254
+ # @param parent [Transaction,Span] The parent transaction or span.
255
+ # Relevant when the span is created in another thread.
256
+ # @param sync [Boolean] Whether the span is created synchronously or not.
201
257
  # @yield [Span]
202
258
  # @return Result of block
203
259
  def with_span(
@@ -207,7 +263,9 @@ module Atatus # rubocop:disable Metrics/ModuleLength
207
263
  action: nil,
208
264
  context: nil,
209
265
  include_stacktrace: true,
210
- trace_context: nil
266
+ trace_context: nil,
267
+ parent: nil,
268
+ sync: nil
211
269
  )
212
270
  unless block_given?
213
271
  raise ArgumentError,
@@ -225,14 +283,16 @@ module Atatus # rubocop:disable Metrics/ModuleLength
225
283
  action: action,
226
284
  context: context,
227
285
  include_stacktrace: include_stacktrace,
228
- trace_context: trace_context
286
+ trace_context: trace_context,
287
+ parent: parent,
288
+ sync: sync
229
289
  )
230
290
  yield span
231
291
  ensure
232
292
  end_span
233
293
  end
234
294
  end
235
- # rubocop:enable Metrics/MethodLength, Metrics/ParameterLists
295
+ # rubocop:enable Metrics/ParameterLists
236
296
 
237
297
  # Build a [Context] from a Rack `env`. The context may include information
238
298
  # about the request, response, current user and more
@@ -1,3 +1,20 @@
1
+ # Licensed to Elasticsearch B.V. under one or more contributor
2
+ # license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright
4
+ # ownership. Elasticsearch B.V. licenses this file to you under
5
+ # the Apache License, Version 2.0 (the "License"); you may
6
+ # not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
1
18
  # frozen_string_literal: true
2
19
 
3
20
  require 'atatus/error'
@@ -5,19 +22,18 @@ require 'atatus/error'
5
22
  require 'atatus/context_builder'
6
23
  require 'atatus/error_builder'
7
24
  require 'atatus/stacktrace_builder'
8
- require 'atatus/collector/base'
9
25
 
10
26
  require 'atatus/central_config'
11
- # require 'atatus/transport/base'
27
+ require 'atatus/collector/base'
12
28
  require 'atatus/metrics'
13
29
 
14
30
  require 'atatus/spies'
15
31
 
16
32
  module Atatus
17
- # rubocop:disable Metrics/ClassLength
18
33
  # @api private
19
34
  class Agent
20
35
  include Logging
36
+ extend Forwardable
21
37
 
22
38
  LOCK = Mutex.new
23
39
 
@@ -27,7 +43,6 @@ module Atatus
27
43
  @instance
28
44
  end
29
45
 
30
- # rubocop:disable Metrics/MethodLength
31
46
  def self.start(config)
32
47
  return @instance if @instance
33
48
 
@@ -36,9 +51,9 @@ module Atatus
36
51
  LOCK.synchronize do
37
52
  return @instance if @instance
38
53
 
39
- unless config.active?
54
+ unless config.enabled?
40
55
  config.logger.debug format(
41
- "%sAgent disabled with `active: false'",
56
+ "%sAgent disabled with `enabled: false'",
42
57
  Logging::PREFIX
43
58
  )
44
59
  return
@@ -47,7 +62,6 @@ module Atatus
47
62
  @instance = new(config).start
48
63
  end
49
64
  end
50
- # rubocop:enable Metrics/MethodLength
51
65
 
52
66
  def self.stop
53
67
  LOCK.synchronize do
@@ -62,24 +76,21 @@ module Atatus
62
76
  !!@instance
63
77
  end
64
78
 
65
- # rubocop:disable Metrics/MethodLength
66
79
  def initialize(config)
67
- @config = config
68
-
69
80
  @stacktrace_builder = StacktraceBuilder.new(config)
70
81
  @context_builder = ContextBuilder.new(config)
71
82
  @error_builder = ErrorBuilder.new(self)
72
83
 
73
84
  @central_config = CentralConfig.new(config)
74
- # @transport = Transport::Base.new(config)
85
+ @collector = Collector::Base.new(config)
86
+ @metrics = Metrics.new(config) { |event| enqueue event }
75
87
  @instrumenter = Instrumenter.new(
76
88
  config,
89
+ metrics: metrics,
77
90
  stacktrace_builder: stacktrace_builder
78
91
  ) { |event| enqueue event }
79
- @metrics = Metrics.new(config) { |event| enqueue event }
80
- @collector = Collector::Base.new(config)
92
+ @pid = Process.pid
81
93
  end
82
- # rubocop:enable Metrics/MethodLength
83
94
 
84
95
  attr_reader(
85
96
  :central_config,
@@ -89,29 +100,31 @@ module Atatus
89
100
  :instrumenter,
90
101
  :metrics,
91
102
  :stacktrace_builder,
92
- # :transport,
93
103
  :collector
94
104
  )
95
105
 
96
- # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
106
+ def_delegator :@central_config, :config
107
+
97
108
  def start
98
- unless config.disable_start_message
99
- info '[%s] Starting atatus ruby agent', VERSION
109
+ unless config.disable_start_message?
110
+ config.logger.info format(
111
+ '[%s] Starting atatus ruby agent',
112
+ VERSION
113
+ )
100
114
  end
101
115
 
102
- if @config.license_key.nil? || @config.app_name.nil?
103
- if @config.license_key.nil? && @config.app_name.nil?
116
+ if config.license_key.nil? || config.app_name.nil?
117
+ if config.license_key.nil? && config.app_name.nil?
104
118
  error 'Atatus configuration license_key and app_name are missing'
105
- elsif @config.license_key.nil?
119
+ elsif config.license_key.nil?
106
120
  error 'Atatus configuration license_key is missing'
107
- elsif @config.app_name.nil?
121
+ elsif config.app_name.nil?
108
122
  error 'Atatus configuration app_name is missing'
109
123
  end
110
124
  end
111
125
 
112
- collector.start
113
126
  central_config.start
114
- # transport.start
127
+ collector.start
115
128
  instrumenter.start
116
129
  metrics.start
117
130
 
@@ -122,7 +135,6 @@ module Atatus
122
135
 
123
136
  self
124
137
  end
125
- # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
126
138
 
127
139
  def stop
128
140
  debug 'Stopping agent'
@@ -131,7 +143,6 @@ module Atatus
131
143
  metrics.stop
132
144
  instrumenter.stop
133
145
  collector.stop
134
- # transport.stop
135
146
 
136
147
  self
137
148
  end
@@ -172,9 +183,13 @@ module Atatus
172
183
  context: nil,
173
184
  trace_context: nil
174
185
  )
186
+ return unless config.recording?
187
+ detect_forking!
188
+
175
189
  instrumenter.start_transaction(
176
190
  name,
177
191
  type,
192
+ config: config,
178
193
  context: context,
179
194
  trace_context: trace_context
180
195
  )
@@ -192,8 +207,16 @@ module Atatus
192
207
  action: nil,
193
208
  backtrace: nil,
194
209
  context: nil,
195
- trace_context: nil
210
+ trace_context: nil,
211
+ parent: nil,
212
+ sync: nil
196
213
  )
214
+ detect_forking!
215
+
216
+ # We don't check config.recording? because the span
217
+ # will not be created if there's no transaction.
218
+ # We want to use the recording value from the config
219
+ # that existed when start_transaction was called. ~estolfo
197
220
  instrumenter.start_span(
198
221
  name,
199
222
  type,
@@ -201,7 +224,9 @@ module Atatus
201
224
  action: action,
202
225
  backtrace: backtrace,
203
226
  context: context,
204
- trace_context: trace_context
227
+ trace_context: trace_context,
228
+ parent: parent,
229
+ sync: sync
205
230
  )
206
231
  end
207
232
  # rubocop:enable Metrics/ParameterLists
@@ -229,6 +254,8 @@ module Atatus
229
254
  # errors
230
255
 
231
256
  def report(exception, context: nil, handled: true)
257
+ return unless config.recording?
258
+ detect_forking!
232
259
  return if config.filter_exception_types.include?(exception.class.to_s)
233
260
 
234
261
  error = @error_builder.build_exception(
@@ -241,6 +268,9 @@ module Atatus
241
268
  end
242
269
 
243
270
  def report_message(message, context: nil, backtrace: nil, **attrs)
271
+ return unless config.recording?
272
+ detect_forking!
273
+
244
274
  error = @error_builder.build_log(
245
275
  message,
246
276
  context: context,
@@ -256,6 +286,25 @@ module Atatus
256
286
  def add_filter(key, callback)
257
287
  # transport.add_filter(key, callback)
258
288
  end
289
+
290
+ # misc
291
+
292
+ def inspect
293
+ super.split.first + '>'
294
+ end
295
+
296
+ def detect_forking!
297
+ return if @pid == Process.pid
298
+
299
+ config.logger.debug "Detected forking,
300
+ restarting threads in process [PID:#{Process.pid}]"
301
+
302
+ central_config.handle_forking!
303
+ collector.handle_forking!
304
+ instrumenter.handle_forking!
305
+ metrics.handle_forking!
306
+
307
+ @pid = Process.pid
308
+ end
259
309
  end
260
- # rubocop:enable Metrics/ClassLength
261
310
  end