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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -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 +61 -29
- data/lib/atatus/collector/builder.rb +46 -2
- data/lib/atatus/collector/hist.rb +54 -0
- data/lib/atatus/collector/transport.rb +41 -11
- data/lib/atatus/config.rb +129 -28
- 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 +44 -15
- 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 +18 -1
- 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 +23 -3
- 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 +74 -18
- 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 +18 -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: 651694b5c78acd1f1582c30f1b28715b6a653c2b125a75613a19b7ae86361d9b
|
|
4
|
+
data.tar.gz: 4a8e5ee631f32b09942bb6ae53a72531c4e7ffe2677194ee7f19f81dfd4c9eeb
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0400c2f1f8bdd57366d49d5a05f8d4dc49bc804e5dc263cfe9771043a021a47c08d7544af1adb9408a2c517c7839d20e6e7bb48329038e684c35a61bbf0db210
|
|
7
|
+
data.tar.gz: 76eb02d1bf4cebf184ff8df44f71d553f64fe9e9dfb75aeb4c3e214a97a3dbc6efc7797a34321f019a0fc15be06800ef575efae6dc580aa1061037aeb1c13f4d
|
data/CHANGELOG.md
CHANGED
|
@@ -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
|
-
|
|
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) 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):
|
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
|