atatus 1.7.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/Gemfile +49 -13
  4. data/LICENSE +1 -1
  5. data/atatus.gemspec +3 -3
  6. data/lib/atatus/agent.rb +10 -7
  7. data/lib/atatus/central_config.rb +19 -8
  8. data/lib/atatus/collector/layer.rb +1 -1
  9. data/lib/atatus/{sql_summarizer.rb → config/log_level_map.rb} +22 -28
  10. data/lib/atatus/config/options.rb +2 -1
  11. data/lib/atatus/config/regexp_list.rb +1 -1
  12. data/lib/atatus/config/round_float.rb +31 -0
  13. data/lib/atatus/config/server_info.rb +50 -0
  14. data/lib/atatus/config/wildcard_pattern_list.rb +3 -1
  15. data/lib/atatus/config.rb +91 -70
  16. data/lib/atatus/context/request/socket.rb +1 -2
  17. data/lib/atatus/context/response.rb +1 -3
  18. data/lib/atatus/context.rb +3 -10
  19. data/lib/atatus/context_builder.rb +3 -3
  20. data/lib/atatus/error.rb +2 -1
  21. data/lib/atatus/error_builder.rb +1 -1
  22. data/lib/atatus/fields.rb +98 -0
  23. data/lib/atatus/graphql.rb +2 -0
  24. data/lib/atatus/grpc.rb +5 -7
  25. data/lib/atatus/instrumenter.rb +29 -25
  26. data/lib/atatus/metadata/cloud_info.rb +156 -0
  27. data/lib/atatus/metadata/service_info.rb +3 -3
  28. data/lib/atatus/metadata/system_info/container_info.rb +20 -8
  29. data/lib/atatus/metadata/system_info.rb +20 -5
  30. data/lib/atatus/metadata.rb +3 -1
  31. data/lib/atatus/metrics/cpu_mem_set.rb +10 -38
  32. data/lib/atatus/metrics/jvm_set.rb +88 -0
  33. data/lib/atatus/metrics/metric.rb +2 -0
  34. data/lib/atatus/metrics.rb +33 -16
  35. data/lib/atatus/middleware.rb +8 -3
  36. data/lib/atatus/naively_hashable.rb +1 -0
  37. data/lib/atatus/normalizers/rails/active_record.rb +25 -7
  38. data/lib/atatus/normalizers.rb +2 -2
  39. data/lib/atatus/opentracing.rb +5 -3
  40. data/lib/atatus/rails.rb +1 -1
  41. data/lib/atatus/span/context/db.rb +1 -1
  42. data/lib/atatus/span/context/destination.rb +58 -32
  43. data/lib/atatus/span/context/http.rb +2 -0
  44. data/lib/atatus/span/context/links.rb +32 -0
  45. data/lib/atatus/{sql.rb → span/context/message.rb} +16 -12
  46. data/lib/atatus/span/context/service.rb +55 -0
  47. data/lib/atatus/span/context.rb +28 -3
  48. data/lib/atatus/span.rb +35 -5
  49. data/lib/atatus/span_helpers.rb +12 -23
  50. data/lib/atatus/spies/action_dispatch.rb +10 -13
  51. data/lib/atatus/spies/azure_storage_table.rb +148 -0
  52. data/lib/atatus/spies/delayed_job.rb +19 -13
  53. data/lib/atatus/spies/dynamo_db.rb +56 -15
  54. data/lib/atatus/spies/elasticsearch.rb +54 -39
  55. data/lib/atatus/spies/faraday.rb +92 -58
  56. data/lib/atatus/spies/http.rb +33 -37
  57. data/lib/atatus/spies/json.rb +5 -9
  58. data/lib/atatus/spies/mongo.rb +26 -19
  59. data/lib/atatus/spies/net_http.rb +53 -51
  60. data/lib/atatus/spies/racecar.rb +77 -0
  61. data/lib/atatus/spies/rake.rb +27 -27
  62. data/lib/atatus/spies/redis.rb +11 -12
  63. data/lib/atatus/spies/resque.rb +18 -23
  64. data/lib/atatus/spies/s3.rb +132 -0
  65. data/lib/atatus/spies/sequel.rb +11 -2
  66. data/lib/atatus/spies/shoryuken.rb +4 -6
  67. data/lib/atatus/spies/sidekiq.rb +23 -31
  68. data/lib/atatus/spies/sinatra.rb +20 -28
  69. data/lib/atatus/spies/sneakers.rb +2 -0
  70. data/lib/atatus/spies/sns.rb +126 -0
  71. data/lib/atatus/spies/sqs.rb +231 -0
  72. data/lib/atatus/spies/sucker_punch.rb +20 -22
  73. data/lib/atatus/spies/tilt.rb +10 -13
  74. data/lib/atatus/spies.rb +20 -0
  75. data/lib/atatus/sql/signature.rb +4 -2
  76. data/lib/atatus/sql/tokenizer.rb +23 -7
  77. data/lib/atatus/stacktrace/frame.rb +1 -0
  78. data/lib/atatus/stacktrace_builder.rb +12 -16
  79. data/lib/atatus/subscriber.rb +1 -0
  80. data/lib/atatus/trace_context/traceparent.rb +5 -8
  81. data/lib/atatus/trace_context/tracestate.rb +16 -14
  82. data/lib/atatus/trace_context.rb +6 -16
  83. data/lib/atatus/transaction.rb +17 -4
  84. data/lib/atatus/transport/base.rb +1 -3
  85. data/lib/atatus/transport/connection/http.rb +11 -3
  86. data/lib/atatus/transport/connection/proxy_pipe.rb +1 -2
  87. data/lib/atatus/transport/connection.rb +3 -2
  88. data/lib/atatus/transport/filters/hash_sanitizer.rb +16 -34
  89. data/lib/atatus/transport/filters/secrets_filter.rb +35 -12
  90. data/lib/atatus/transport/serializers/context_serializer.rb +1 -2
  91. data/lib/atatus/transport/serializers/metadata_serializer.rb +54 -8
  92. data/lib/atatus/transport/serializers/metricset_serializer.rb +2 -2
  93. data/lib/atatus/transport/serializers/span_serializer.rb +55 -9
  94. data/lib/atatus/transport/serializers/transaction_serializer.rb +1 -0
  95. data/lib/atatus/transport/serializers.rb +9 -6
  96. data/lib/atatus/transport/user_agent.rb +16 -9
  97. data/lib/atatus/transport/worker.rb +2 -1
  98. data/lib/atatus/util/deep_dup.rb +65 -0
  99. data/lib/atatus/util/precision_validator.rb +46 -0
  100. data/lib/atatus/util.rb +2 -0
  101. data/lib/atatus/version.rb +1 -1
  102. data/lib/atatus.rb +32 -5
  103. metadata +40 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3b14ce033d2727c9e1773987897f569026bfd7bb45ff3387ab7bed2d8e5dc912
4
- data.tar.gz: 7d006a8ccc31f1cbb59d700eae5d7d83760c174e3dd8b0be7fc97e328feff8f0
3
+ metadata.gz: 454ba0ab877ac91b387bb0d4b3355494c2707a56634cd97774b0bcdb3e2194a6
4
+ data.tar.gz: dc8b8beca08a3a6ecc278c999d48ea7c316ac1fe8f5a221cd32df8a0bcd37262
5
5
  SHA512:
6
- metadata.gz: b8ee79aac253e143ea0867530643b800a226277dd644ca514a2aa07fbc656065f2a316eb3da46a5630e90ae2bb3041f984331453f475a6fa1a5afcccb349f1df
7
- data.tar.gz: df8621294a91c15d6afec8ac6fc76aba8f40376deb989b213b7a6cc5c6d8e6b91fb40c517fcb227f8ddfb0cd1c5dfc1e6f14908aa655d7491df0f41a5fa17eea
6
+ metadata.gz: 8377d4e174399b782592ce39b48ca738a806a8b881fe045cb3586cdc232d1f9d29a3f99ec02ab27cddd8c84a3c250b9bf35ac1f1bbb5f82c94a4d7fb8f7db661
7
+ data.tar.gz: 6bc01e9bec29bf52a0910abc465cbee55ca8c17dbd9bee531028d8ade630fa91517b06493c928aecfdd7cccee0bbc88cfeeff6ee143c758aec2e606d2f830367
data/CHANGELOG.md CHANGED
@@ -4,6 +4,11 @@ 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
+ ## 2.0.0 (Fri, 19 Jan 2024)
8
+
9
+ - Change the instrumentation method to prepend mode.
10
+
11
+
7
12
  ## 1.7.0 (Fri, 15 Jul 2022)
8
13
 
9
14
  - Added support for analytics.
data/Gemfile CHANGED
@@ -22,42 +22,50 @@ source 'https://rubygems.org'
22
22
  git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
23
23
 
24
24
  # Tools
25
- gem 'bootsnap', require: false
26
25
  gem 'cucumber', require: false
27
- gem 'pry'
28
26
  gem 'rack-test'
29
27
  gem 'rspec', '~> 3'
30
28
  gem 'rspec-its'
31
- gem 'rubocop', require: nil
32
- gem 'rubocop-performance', require: nil
29
+ gem 'rubocop', require: false
30
+ gem 'rubocop-performance', require: false
33
31
  gem 'timecop'
34
32
  gem 'webmock'
35
33
 
36
34
  # Integrations
37
35
  gem 'aws-sdk-dynamodb', require: nil
36
+ gem 'aws-sdk-s3', require: nil
38
37
  gem 'aws-sdk-sqs', require: nil
38
+ gem 'aws-sdk-sns', require: nil
39
+ gem 'azure-storage-table', require: nil if RUBY_VERSION < '3.0'
40
+ gem 'ecs-logging', require: 'ecs_logging/logger'
39
41
  gem 'elasticsearch', require: nil
40
42
  gem 'fakeredis', require: nil
41
43
  gem 'faraday', require: nil
42
44
  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
+ if !defined?(JRUBY_VERSION) && RUBY_VERSION < '2.5'
46
+ gem 'google-protobuf', '< 3.12'
47
+ end
48
+ gem 'grpc' if !defined?(JRUBY_VERSION) && RUBY_VERSION < '3.0'
45
49
  gem 'json'
46
50
  gem 'json-schema', require: nil
47
51
  gem 'mongo', require: nil
48
52
  gem 'opentracing', require: nil
49
- gem 'rake', require: nil
53
+ gem 'rake', '>= 13.0', require: nil
54
+ gem 'racecar', require: nil if !defined?(JRUBY_VERSION)
50
55
  gem 'resque', require: nil
51
56
  gem 'sequel', require: nil
52
57
  gem 'shoryuken', require: nil
53
58
  gem 'sidekiq', require: nil
54
59
  gem 'simplecov', require: false
55
60
  gem 'simplecov-cobertura', require: false
56
- gem 'sneakers', '~> 2.12', require: nil
57
61
  gem 'sucker_punch', '~> 2.0', require: nil
58
62
  gem 'yard', require: nil
59
63
  gem 'yarjuf'
60
64
 
65
+ if RUBY_VERSION < '2.5'
66
+ gem 'loofah', '~> 2.20.0', require: nil
67
+ end
68
+
61
69
  ## Install Framework
62
70
  GITHUB_REPOS = {
63
71
  'grape' => 'ruby-grape/grape',
@@ -74,9 +82,15 @@ frameworks_versions = parsed_frameworks.inject({}) do |frameworks, str|
74
82
  end
75
83
 
76
84
  frameworks_versions.each do |framework, version|
85
+ if framework =='rails' && RUBY_VERSION >= '3.1'
86
+ gem 'net-smtp', require: false
87
+ end
88
+
77
89
  case version
78
- when 'master'
90
+ when 'master' # grape
79
91
  gem framework, github: GITHUB_REPOS.fetch(framework)
92
+ when 'main' # sinatra, rails
93
+ gem framework, github: GITHUB_REPOS.fetch(framework), branch: 'main'
80
94
  when /.+/
81
95
  gem framework, "~> #{version}.0"
82
96
  else
@@ -85,18 +99,40 @@ frameworks_versions.each do |framework, version|
85
99
  end
86
100
 
87
101
  if frameworks_versions.key?('rails')
88
- unless frameworks_versions['rails'] =~ /^(master|6)/
102
+ unless /^(main|6)/.match?(frameworks_versions['rails'])
89
103
  gem 'delayed_job', require: nil
90
104
  end
91
105
  end
92
106
 
93
107
  if RUBY_PLATFORM == 'java'
94
- gem 'activerecord-jdbcsqlite3-adapter'
95
- gem 'jdbc-sqlite3'
108
+ # See issue #6547 in the JRuby repo. It is fixed in JRuby 9.3
109
+ gem 'i18n', '< 1.8.8' if JRUBY_VERSION < '9.3'
110
+
111
+ case rails = frameworks_versions['rails']
112
+ when 'main'
113
+ gem 'activerecord-jdbcsqlite3-adapter', git: 'https://github.com/jruby/activerecord-jdbc-adapter', glob: 'activerecord-jdbcsqlite3-adapter/*.gemspec'
114
+ when ''
115
+ gem 'activerecord-jdbcsqlite3-adapter', "~> 61.0"
116
+ when nil
117
+ gem 'jdbc-sqlite3'
118
+ else
119
+ gem 'activerecord-jdbcsqlite3-adapter', "~> #{rails.tr('.', '')}.0"
120
+ end
96
121
  elsif frameworks_versions['rails'] =~ /^(4|5)/
97
122
  gem 'sqlite3', '~> 1.3.6'
123
+ elsif RUBY_VERSION < '2.7'
124
+ gem 'sqlite3', '~> 1.4.4'
98
125
  else
99
- gem 'sqlite3' # rubocop:disable Bundler/DuplicatedGem
126
+ gem 'sqlite3'
127
+ end
128
+
129
+ # sneakers main only supports >=2.5.0
130
+ if Gem::Version.create(RUBY_VERSION) >= Gem::Version.create('2.5.0') && !defined?(JRUBY_VERSION)
131
+ gem 'sneakers', github: 'jondot/sneakers', ref: 'd761dfe1493', require: nil
132
+ end
133
+
134
+ if Gem::Version.create(RUBY_VERSION) <= Gem::Version.create('2.5.0')
135
+ gem 'bigdecimal', '1.3.5'
100
136
  end
101
137
 
102
138
  group :bench do
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- All components of this product are Copyright (c) 2022 Atatus. All rights reserved.
1
+ All components of this product are Copyright (c) 2024 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):
data/atatus.gemspec CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |spec|
6
6
  spec.name = 'atatus'
7
7
  spec.version = Atatus::VERSION
8
8
  spec.authors = ['Atatus']
9
- spec.email = 'success@atatus.com'
9
+ spec.email = ['success@atatus.com']
10
10
 
11
11
  spec.summary = 'Atatus Ruby Agent'
12
12
  spec.homepage = 'https://www.atatus.com'
@@ -14,8 +14,7 @@ Gem::Specification.new do |spec|
14
14
  'changelog_uri' => 'https://docs.atatus.com/docs/release-notes/ruby.html',
15
15
  'documentation_uri' => 'https://docs.atatus.com/docs/application-monitoring/ruby-agent/overview.html',
16
16
  }
17
- spec.date = Time.now.strftime('%Y-%m-%d')
18
- spec.licenses = ['Atatus']
17
+ spec.license = 'Apache-2.0'
19
18
  spec.required_ruby_version = ">= 2.3.0"
20
19
  spec.extra_rdoc_files = [
21
20
  "CHANGELOG.md",
@@ -31,6 +30,7 @@ Gem::Specification.new do |spec|
31
30
 
32
31
  spec.add_dependency('concurrent-ruby', '~> 1.0')
33
32
  spec.add_dependency('http', '>= 3.0')
33
+ spec.add_runtime_dependency('ruby2_keywords')
34
34
 
35
35
  spec.require_paths = ['lib']
36
36
  end
data/lib/atatus/agent.rb CHANGED
@@ -137,7 +137,7 @@ module Atatus
137
137
  end
138
138
 
139
139
  def stop
140
- debug 'Stopping agent'
140
+ info 'Stopping agent'
141
141
 
142
142
  central_config.stop
143
143
  metrics.stop
@@ -154,7 +154,6 @@ module Atatus
154
154
  # transport
155
155
 
156
156
  def enqueue(obj)
157
- # transport.submit obj
158
157
  case obj
159
158
  when Atatus::Transaction
160
159
  collector.add_txn(obj)
@@ -164,7 +163,7 @@ module Atatus
164
163
  collector.add_error(obj)
165
164
  when Atatus::Metricset
166
165
  collector.add_metrics(obj)
167
- end
166
+ end
168
167
  end
169
168
 
170
169
  # instrumentation
@@ -231,8 +230,8 @@ module Atatus
231
230
  end
232
231
  # rubocop:enable Metrics/ParameterLists
233
232
 
234
- def end_span
235
- instrumenter.end_span
233
+ def end_span(span = nil)
234
+ instrumenter.end_span(span)
236
235
  end
237
236
 
238
237
  def set_label(key, value)
@@ -255,6 +254,10 @@ module Atatus
255
254
  instrumenter.set_response_body(response_body)
256
255
  end
257
256
 
257
+ def set_destination(address: nil, port: nil, service: nil, cloud: nil)
258
+ current_span&.set_destination(address: nil, port: nil, service: nil, cloud: nil)
259
+ end
260
+
258
261
  def build_context(rack_env:, for_type:)
259
262
  @context_builder.build(rack_env: rack_env, for_type: for_type)
260
263
  end
@@ -304,8 +307,8 @@ module Atatus
304
307
  def detect_forking!
305
308
  return if @pid == Process.pid
306
309
 
307
- config.logger.debug "Detected forking,
308
- restarting threads in process [PID:#{Process.pid}]"
310
+ config.logger.debug(
311
+ "Forked process detected, restarting threads in process [PID:#{Process.pid}]")
309
312
 
310
313
  central_config.handle_forking!
311
314
  collector.handle_forking!
@@ -19,6 +19,7 @@
19
19
 
20
20
  require 'atatus/central_config/cache_control'
21
21
 
22
+ # rubocop:disable Style/AccessorGrouping
22
23
  module Atatus
23
24
  # @api private
24
25
  class CentralConfig
@@ -27,6 +28,7 @@ module Atatus
27
28
  # @api private
28
29
  class ResponseError < InternalError
29
30
  def initialize(response)
31
+ super
30
32
  @response = response
31
33
  end
32
34
 
@@ -66,14 +68,15 @@ module Atatus
66
68
  def fetch_and_apply_config
67
69
  @promise =
68
70
  Concurrent::Promise
69
- .execute(&method(:fetch_config))
70
- .on_success(&method(:handle_success))
71
- .rescue(&method(:handle_error))
71
+ .execute { fetch_config }
72
+ .on_success { |resp| handle_success(resp) }
73
+ .rescue { |err| handle_error(err) }
72
74
  end
73
75
 
74
76
  def fetch_config
75
77
  resp = perform_request
76
78
 
79
+ # rubocop:disable Lint/DuplicateBranch
77
80
  case resp.status
78
81
  when 200..299
79
82
  resp
@@ -84,6 +87,7 @@ module Atatus
84
87
  when 500..599
85
88
  raise ServerError, resp
86
89
  end
90
+ # rubocop:enable Lint/DuplicateBranch
87
91
  end
88
92
 
89
93
  def assign(update)
@@ -117,14 +121,14 @@ module Atatus
117
121
  end
118
122
 
119
123
  if resp.status == 304
120
- info 'Received 304 Not Modified'
124
+ debug 'Received 304 Not Modified'
121
125
  else
122
126
  if resp.body && !resp.body.empty?
123
127
  update = JSON.parse(resp.body.to_s)
124
128
  assign(update)
125
129
  end
126
130
 
127
- if update && update.any?
131
+ if update&.any?
128
132
  info 'Updated config from Kibana'
129
133
  debug 'Modified: %s', update.inspect
130
134
  debug 'Modified original options: %s', @modified_options.inspect
@@ -162,11 +166,12 @@ module Atatus
162
166
  @server_url ||=
163
167
  config.server_url +
164
168
  '/config/v1/agents' \
165
- "?service.name=#{config.service_name}"
169
+ "?service.name=#{CGI.escape(config.service_name)}" \
170
+ "&service.environment=#{CGI.escape(config.environment || '')}"
166
171
  end
167
172
 
168
173
  def headers
169
- { 'Etag': @etag }
174
+ { 'If-None-Match': @etag }
170
175
  end
171
176
 
172
177
  def schedule_next_fetch(resp = nil)
@@ -178,9 +183,15 @@ module Atatus
178
183
  DEFAULT_MAX_AGE
179
184
  end
180
185
 
186
+ if seconds < 5
187
+ debug "Next fetch is too low (#{seconds}s) - increasing to default"
188
+ seconds = 5
189
+ end
190
+
181
191
  @scheduled_task =
182
192
  Concurrent::ScheduledTask
183
- .execute(seconds, &method(:fetch_and_apply_config))
193
+ .execute(seconds) { fetch_and_apply_config }
184
194
  end
185
195
  end
186
196
  end
197
+ # rubocop:enable Style/AccessorGrouping
@@ -33,7 +33,7 @@ module Atatus
33
33
  KINDS = {
34
34
  'db' => 'Database',
35
35
  'cache' => 'Database',
36
- 'ext' => 'Remote',
36
+ 'external' => 'Remote',
37
37
  'websocket' => 'Remote',
38
38
  'template' => 'Template'
39
39
  }.freeze
@@ -17,37 +17,31 @@
17
17
 
18
18
  # frozen_string_literal: true
19
19
 
20
- require 'atatus/util/lru_cache'
21
-
22
20
  module Atatus
23
- # @api private
24
- class SqlSummarizer
25
- DEFAULT = 'SQL'
26
- TABLE_REGEX = %{["'`]?([A-Za-z0-9_]+)["'`]?}
27
-
28
- REGEXES = {
29
- /^BEGIN/iu => 'BEGIN',
30
- /^COMMIT/iu => 'COMMIT',
31
- /^SELECT .* FROM #{TABLE_REGEX}/iu => 'SELECT FROM ',
32
- /^INSERT INTO #{TABLE_REGEX}/iu => 'INSERT INTO ',
33
- /^UPDATE #{TABLE_REGEX}/iu => 'UPDATE ',
34
- /^DELETE FROM #{TABLE_REGEX}/iu => 'DELETE FROM '
35
- }.freeze
21
+ class Config
22
+ # @api private
23
+ class LogLevelMap
24
+ LEVELS = {
25
+ debug: Logger::DEBUG,
26
+ info: Logger::INFO,
27
+ warn: Logger::WARN,
28
+ error: Logger::ERROR,
29
+ fatal: Logger::FATAL,
30
+ trace: Logger::DEBUG,
31
+ warning: Logger::WARN,
32
+ critical: Logger::FATAL,
33
+ off: Logger::FATAL
34
+ }.freeze
36
35
 
37
- FORMAT = '%s%s'
38
-
39
- def self.cache
40
- @cache ||= Util::LruCache.new
41
- end
36
+ DEFAULT = Logger::INFO
42
37
 
43
- def summarize(sql)
44
- sql = sql.encode('utf-8', invalid: :replace, undef: :replace)
45
- self.class.cache[sql] ||=
46
- REGEXES.find do |regex, sig|
47
- if (match = sql[0...1000].match(regex))
48
- break format(FORMAT, sig, match[1] && match[1].gsub(/["']/, ''))
49
- end
50
- end || DEFAULT
38
+ def call(value)
39
+ if value.is_a?(Integer)
40
+ LEVELS.value?(value) ? value : DEFAULT
41
+ else
42
+ LEVELS.fetch(value.to_sym, DEFAULT)
43
+ end
44
+ end
51
45
  end
52
46
  end
53
47
  end
@@ -38,7 +38,8 @@ module Atatus
38
38
  set(value || default)
39
39
  end
40
40
 
41
- attr_reader :key, :value, :default, :type
41
+ attr_reader :key, :default, :type, :converter
42
+ attr_accessor :value
42
43
 
43
44
  def set(value)
44
45
  @value = normalize(value)
@@ -23,7 +23,7 @@ module Atatus
23
23
  class RegexpList
24
24
  def call(value)
25
25
  value = value.is_a?(String) ? value.split(',') : Array(value)
26
- value.map(&Regexp.method(:new))
26
+ value.map { |p| Regexp.new(p) }
27
27
  end
28
28
  end
29
29
  end
@@ -0,0 +1,31 @@
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
+
18
+ # frozen_string_literal: true
19
+
20
+ require 'atatus/util/precision_validator'
21
+
22
+ module Atatus
23
+ class Config
24
+ # @api private
25
+ class RoundFloat
26
+ def call(value)
27
+ Util::PrecisionValidator.validate(value, precision: 4, minimum: 0.0001)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,50 @@
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
+
18
+ # frozen_string_literal: true
19
+
20
+ module Atatus
21
+ class Config
22
+ # @api private
23
+ class ServerInfo
24
+ attr_reader :payload, :config, :http
25
+
26
+ VERSION_8_0 = '8.0'
27
+ VERSION_0 = '0'
28
+
29
+ def initialize(config)
30
+ @config = config
31
+ @http = Transport::Connection::Http.new(config)
32
+ end
33
+
34
+ def execute
35
+ resp = http.get(config.server_url)
36
+ @payload = JSON.parse(resp.body)
37
+ rescue
38
+ @payload = { "version" => VERSION_0 }
39
+ end
40
+
41
+ def version
42
+ @version ||= begin
43
+ execute
44
+ payload["version"] ? payload["version"].to_s : VERSION_0
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+
@@ -27,6 +27,8 @@ module Atatus
27
27
  @pattern = convert(str)
28
28
  end
29
29
 
30
+ attr_reader :pattern
31
+
30
32
  def match?(other)
31
33
  !!@pattern.match(other)
32
34
  end
@@ -57,7 +59,7 @@ module Atatus
57
59
 
58
60
  def call(value)
59
61
  value = value.is_a?(String) ? value.split(',') : Array(value)
60
- value.map(&WildcardPattern.method(:new))
62
+ value.map { |p| WildcardPattern.new(p) }
61
63
  end
62
64
  end
63
65
  end