atatus 1.3.0 → 1.4.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.
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