atatus 1.0.2 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +29 -0
- data/Gemfile +72 -22
- data/LICENSE +1 -1
- data/atatus.gemspec +2 -2
- data/lib/atatus.rb +76 -16
- data/lib/atatus/agent.rb +78 -29
- data/lib/atatus/central_config.rb +72 -27
- data/lib/atatus/central_config/cache_control.rb +18 -1
- data/lib/atatus/child_durations.rb +64 -0
- data/lib/atatus/collector/base.rb +115 -35
- data/lib/atatus/collector/builder.rb +104 -33
- data/lib/atatus/collector/hist.rb +54 -0
- data/lib/atatus/collector/layer.rb +3 -0
- data/lib/atatus/collector/transport.rb +44 -10
- data/lib/atatus/config.rb +130 -29
- data/lib/atatus/config/bytes.rb +17 -0
- data/lib/atatus/config/duration.rb +17 -0
- data/lib/atatus/config/options.rb +29 -9
- data/lib/atatus/config/regexp_list.rb +17 -0
- data/lib/atatus/config/wildcard_pattern_list.rb +64 -0
- data/lib/atatus/context.rb +32 -1
- data/lib/atatus/context/request.rb +17 -0
- data/lib/atatus/context/request/socket.rb +18 -1
- data/lib/atatus/context/request/url.rb +17 -0
- data/lib/atatus/context/response.rb +27 -2
- data/lib/atatus/context/user.rb +17 -0
- data/lib/atatus/context_builder.rb +19 -4
- data/lib/atatus/deprecations.rb +17 -0
- data/lib/atatus/error.rb +27 -0
- data/lib/atatus/error/exception.rb +24 -0
- data/lib/atatus/error/log.rb +17 -0
- data/lib/atatus/error_builder.rb +17 -2
- data/lib/atatus/grape.rb +62 -0
- data/lib/atatus/graphql.rb +91 -0
- data/lib/atatus/grpc.rb +99 -0
- data/lib/atatus/instrumenter.rb +135 -30
- data/lib/atatus/internal_error.rb +17 -0
- data/lib/atatus/logging.rb +17 -2
- data/lib/atatus/metadata.rb +17 -0
- data/lib/atatus/metadata/process_info.rb +17 -0
- data/lib/atatus/metadata/service_info.rb +21 -6
- data/lib/atatus/metadata/system_info.rb +22 -3
- data/lib/atatus/metadata/system_info/container_info.rb +49 -10
- data/lib/atatus/metadata/system_info/hw_info.rb +1 -1
- data/lib/atatus/metrics.rb +69 -27
- data/lib/atatus/metrics/breakdown_set.rb +31 -0
- data/lib/atatus/metrics/{cpu_mem.rb → cpu_mem_set.rb} +110 -63
- data/lib/atatus/metrics/metric.rb +140 -0
- data/lib/atatus/metrics/set.rb +123 -0
- data/lib/atatus/metrics/span_scoped_set.rb +56 -0
- data/lib/atatus/metrics/transaction_set.rb +26 -0
- data/lib/atatus/metrics/vm_set.rb +58 -0
- data/lib/atatus/metricset.rb +48 -4
- data/lib/atatus/middleware.rb +28 -8
- data/lib/atatus/naively_hashable.rb +17 -0
- data/lib/atatus/normalizers.rb +23 -9
- data/lib/atatus/normalizers/grape.rb +22 -0
- data/lib/atatus/normalizers/grape/endpoint_run.rb +65 -0
- data/lib/atatus/normalizers/rails.rb +27 -0
- data/lib/atatus/normalizers/rails/action_controller.rb +44 -0
- data/lib/atatus/normalizers/rails/action_mailer.rb +43 -0
- data/lib/atatus/normalizers/{action_view.rb → rails/action_view.rb} +17 -0
- data/lib/atatus/normalizers/rails/active_record.rb +80 -0
- data/lib/atatus/opentracing.rb +75 -42
- data/lib/atatus/rails.rb +29 -13
- data/lib/atatus/railtie.rb +19 -6
- data/lib/atatus/resque.rb +29 -0
- data/lib/atatus/sinatra.rb +53 -0
- data/lib/atatus/span.rb +48 -18
- data/lib/atatus/span/context.rb +43 -28
- data/lib/atatus/span/context/db.rb +43 -0
- data/lib/atatus/span/context/destination.rb +77 -0
- data/lib/atatus/span/context/http.rb +43 -0
- data/lib/atatus/span_helpers.rb +32 -6
- data/lib/atatus/spies.rb +33 -15
- data/lib/atatus/spies/action_dispatch.rb +27 -6
- data/lib/atatus/spies/delayed_job.rb +26 -5
- data/lib/atatus/spies/dynamo_db.rb +62 -0
- data/lib/atatus/spies/elasticsearch.rb +53 -7
- data/lib/atatus/spies/faraday.rb +54 -20
- data/lib/atatus/spies/http.rb +36 -6
- data/lib/atatus/spies/json.rb +18 -0
- data/lib/atatus/spies/mongo.rb +41 -10
- data/lib/atatus/spies/net_http.rb +52 -11
- data/lib/atatus/spies/rake.rb +42 -23
- data/lib/atatus/spies/redis.rb +17 -0
- data/lib/atatus/spies/resque.rb +57 -0
- data/lib/atatus/spies/sequel.rb +54 -17
- data/lib/atatus/spies/shoryuken.rb +69 -0
- data/lib/atatus/spies/sidekiq.rb +46 -25
- data/lib/atatus/spies/sinatra.rb +20 -4
- data/lib/atatus/spies/sneakers.rb +74 -0
- data/lib/atatus/spies/sucker_punch.rb +58 -0
- data/lib/atatus/spies/tilt.rb +20 -1
- data/lib/atatus/sql.rb +36 -0
- data/lib/atatus/sql/signature.rb +169 -0
- data/lib/atatus/sql/tokenizer.rb +264 -0
- data/lib/atatus/sql/tokens.rb +63 -0
- data/lib/atatus/sql_summarizer.rb +24 -6
- data/lib/atatus/stacktrace.rb +17 -0
- data/lib/atatus/stacktrace/frame.rb +17 -3
- data/lib/atatus/stacktrace_builder.rb +34 -10
- data/lib/atatus/subscriber.rb +23 -4
- data/lib/atatus/trace_context.rb +84 -51
- data/lib/atatus/trace_context/traceparent.rb +111 -0
- data/lib/atatus/trace_context/tracestate.rb +148 -0
- data/lib/atatus/transaction.rb +75 -19
- data/lib/atatus/transport/base.rb +44 -27
- data/lib/atatus/transport/connection.rb +28 -72
- data/lib/atatus/transport/connection/http.rb +58 -35
- data/lib/atatus/transport/connection/proxy_pipe.rb +24 -5
- data/lib/atatus/transport/filters.rb +18 -1
- data/lib/atatus/transport/filters/hash_sanitizer.rb +77 -0
- data/lib/atatus/transport/filters/secrets_filter.rb +30 -55
- data/lib/atatus/transport/headers.rb +83 -0
- data/lib/atatus/transport/serializers.rb +17 -5
- data/lib/atatus/transport/serializers/context_serializer.rb +30 -3
- data/lib/atatus/transport/serializers/error_serializer.rb +17 -2
- data/lib/atatus/transport/serializers/metadata_serializer.rb +44 -22
- data/lib/atatus/transport/serializers/metricset_serializer.rb +34 -6
- data/lib/atatus/transport/serializers/span_serializer.rb +47 -12
- data/lib/atatus/transport/serializers/transaction_serializer.rb +18 -2
- data/lib/atatus/transport/user_agent.rb +48 -0
- data/lib/atatus/transport/worker.rb +31 -7
- data/lib/atatus/util.rb +22 -1
- data/lib/atatus/util/inflector.rb +17 -0
- data/lib/atatus/util/lru_cache.rb +17 -0
- data/lib/atatus/util/throttle.rb +17 -0
- data/lib/atatus/version.rb +19 -1
- metadata +46 -26
- data/Rakefile +0 -19
- data/bench/.gitignore +0 -2
- data/bench/app.rb +0 -53
- data/bench/benchmark.rb +0 -36
- data/bench/report.rb +0 -55
- data/bench/rubyprof.rb +0 -39
- data/bench/stackprof.rb +0 -23
- data/bin/build_docs +0 -5
- data/bin/console +0 -15
- data/bin/setup +0 -8
- data/bin/with_framework +0 -7
- data/lib/atatus/metrics/vm.rb +0 -60
- data/lib/atatus/normalizers/action_controller.rb +0 -27
- data/lib/atatus/normalizers/action_mailer.rb +0 -26
- data/lib/atatus/normalizers/active_record.rb +0 -45
- data/lib/atatus/util/prefixed_logger.rb +0 -18
- data/vendor/.gitkeep +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8f1224097b7365777c25187cfc37e91183820049468b600c440a267e56eedab3
|
4
|
+
data.tar.gz: bfa687f00c9fc260b2b1c2530f98221feb145097ea950327dd50ed28d3c93f49
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c534a65922f5a3b4a82965af2eeeabd2b1f6d634cad3857054a2c4ae517a7fcda79bd6d9664874c1bd411078d7e0adfc27eba1c4c523d24e5195299b42fefb81
|
7
|
+
data.tar.gz: '078b28a6a86fa7d96c726e14f8cd8a8892efad31d839b843d58c6fd1c7229b7d8df36a21eaaea550ba2dcdd14431165ee317d31d0bb0bf34539f25f320b7d200'
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,35 @@ 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
|
+
|
8
|
+
## 1.5.0 (Thu, 27 May 2021)
|
9
|
+
|
10
|
+
- Fixed issue in status code conversion.
|
11
|
+
|
12
|
+
|
13
|
+
## 1.4.0 (Tue, 15 Sept 2020)
|
14
|
+
|
15
|
+
- Added histogram support.
|
16
|
+
- Fixed Ruby 2.7.0 warning messages.
|
17
|
+
|
18
|
+
|
19
|
+
## 1.3.0 (Wed, 18 Mar 2020)
|
20
|
+
|
21
|
+
- Added custom instrumentation via annotate method.
|
22
|
+
|
23
|
+
|
24
|
+
## 1.2.0 (Tue, 21 Jan 2020)
|
25
|
+
|
26
|
+
- Updated Sidekiq operation as background transaction.
|
27
|
+
|
28
|
+
|
29
|
+
## 1.1.0 (Thu, 5 Dec 2019)
|
30
|
+
|
31
|
+
- New layer for Ruby is added to represent time spent in Application.
|
32
|
+
- Handling of database calls min, average is fixed.
|
33
|
+
- Error stacktraces are only captured for in app code, the libraries code is removed.
|
34
|
+
|
35
|
+
|
7
36
|
## 1.0.2 (Thu, 21 Nov 2019)
|
8
37
|
|
9
38
|
- Changed Linux memory size to bytes.
|
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
|
-
|
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
|
26
|
-
gem 'simplecov-cobertura', require: false
|
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
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
61
|
+
## Install Framework
|
62
|
+
GITHUB_REPOS = {
|
63
|
+
'grape' => 'ruby-grape/grape',
|
64
|
+
'rails' => 'rails/rails',
|
65
|
+
'sinatra' => 'sinatra/sinatra'
|
66
|
+
}.freeze
|
35
67
|
|
36
|
-
|
37
|
-
|
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
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
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
|
-
|
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
|
-
|
51
|
-
gem '
|
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)
|
1
|
+
All components of this product are Copyright (c) 2021 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
@@ -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/
|
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')
|
data/lib/atatus.rb
CHANGED
@@ -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/
|
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
|
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/
|
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/
|
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
|
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/
|
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
|
data/lib/atatus/agent.rb
CHANGED
@@ -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
|
-
|
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.
|
54
|
+
unless config.enabled?
|
40
55
|
config.logger.debug format(
|
41
|
-
"%sAgent disabled with `
|
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
|
-
|
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
|
-
@
|
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
|
-
|
106
|
+
def_delegator :@central_config, :config
|
107
|
+
|
97
108
|
def start
|
98
|
-
unless config.disable_start_message
|
99
|
-
info
|
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
|
103
|
-
if
|
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
|
119
|
+
elsif config.license_key.nil?
|
106
120
|
error 'Atatus configuration license_key is missing'
|
107
|
-
elsif
|
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
|
-
|
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
|