ddtrace 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +5 -0
- data/Appraisals +92 -69
- data/Rakefile +36 -17
- data/circle.yml +10 -7
- data/ddtrace.gemspec +17 -17
- data/docs/GettingStarted.md +3 -0
- data/gemfiles/contrib.gemfile +1 -0
- data/gemfiles/contrib_old.gemfile +14 -0
- data/gemfiles/rails3_postgres.gemfile +1 -1
- data/gemfiles/rails3_postgres_redis.gemfile +1 -1
- data/gemfiles/rails3_postgres_sidekiq.gemfile +1 -1
- data/gemfiles/rails4_postgres_sidekiq.gemfile +1 -0
- data/gemfiles/rails5_postgres_sidekiq.gemfile +1 -0
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +74 -2
- data/lib/ddtrace/contrib/http/patcher.rb +6 -6
- data/lib/ddtrace/contrib/rails/action_controller.rb +10 -5
- data/lib/ddtrace/contrib/rails/action_view.rb +0 -2
- data/lib/ddtrace/contrib/rails/active_record.rb +9 -0
- data/lib/ddtrace/contrib/rails/active_support.rb +0 -1
- data/lib/ddtrace/contrib/rails/core_extensions.rb +84 -78
- data/lib/ddtrace/contrib/rails/utils.rb +1 -0
- data/lib/ddtrace/contrib/sidekiq/tracer.rb +9 -2
- data/lib/ddtrace/contrib/sinatra/tracer.rb +1 -1
- data/lib/ddtrace/monkey.rb +1 -1
- data/lib/ddtrace/pin.rb +6 -5
- data/lib/ddtrace/span.rb +1 -1
- data/lib/ddtrace/version.rb +1 -1
- metadata +7 -7
- data/lib/ddtrace/contrib/elasticsearch/core.rb +0 -66
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c166ccd4553aa6b0a63817846b4aca66a7d74f92
|
4
|
+
data.tar.gz: bd1cdacc971045e137b14a5714d0659747e442f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94e7ee6857c01885d16ada253e8d6cab86704c321e8fa114e6a7fbfb716e940d5aaad62261f9486b44ecb2cdc01bd7992e0dd8d6473c23758c82d8a909344d5e
|
7
|
+
data.tar.gz: 338c3d27571dc226d6c8dede32fb497b90a6a67d7985542fb74b1f0c0dd2d40e9e914eb50e64bd85dfb2c559fe97cdcca7cbccf12c0d36a8ceab444e4009b614
|
data/.rubocop.yml
CHANGED
data/Appraisals
CHANGED
@@ -1,90 +1,113 @@
|
|
1
|
-
if RUBY_VERSION <
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
if RUBY_VERSION < '2.4.0'
|
2
|
+
if RUBY_VERSION >= '1.9.1'
|
3
|
+
appraise 'rails3-mysql2' do
|
4
|
+
gem 'test-unit'
|
5
|
+
gem 'rails', '3.2.22.5'
|
6
|
+
gem 'mysql2', '0.3.21', platform: :ruby
|
7
|
+
gem 'activerecord-mysql-adapter', platform: :ruby
|
8
|
+
gem 'activerecord-jdbcmysql-adapter', platform: :jruby
|
9
|
+
end
|
7
10
|
end
|
8
11
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
12
|
+
if RUBY_VERSION >= '1.9.1'
|
13
|
+
appraise 'rails3-postgres' do
|
14
|
+
gem 'test-unit'
|
15
|
+
gem 'rails', '3.2.22.5'
|
16
|
+
gem 'pg', '0.15.1', platform: :ruby
|
17
|
+
gem 'activerecord-jdbcpostgresql-adapter', platform: :jruby
|
18
|
+
end
|
14
19
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
appraise 'rails3-postgres-redis' do
|
21
|
+
gem 'test-unit'
|
22
|
+
gem 'rails', '3.2.22.5'
|
23
|
+
gem 'pg', '0.15.1', platform: :ruby
|
24
|
+
gem 'activerecord-jdbcpostgresql-adapter', platform: :jruby
|
25
|
+
gem 'redis-rails'
|
26
|
+
end
|
22
27
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
28
|
+
appraise 'rails3-postgres-sidekiq' do
|
29
|
+
gem 'test-unit'
|
30
|
+
gem 'rails', '3.2.22.5'
|
31
|
+
gem 'pg', '0.15.1', platform: :ruby
|
32
|
+
gem 'activerecord-jdbcpostgresql-adapter', platform: :jruby
|
33
|
+
gem 'sidekiq'
|
34
|
+
end
|
27
35
|
end
|
28
36
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end
|
37
|
+
if RUBY_VERSION >= '2.1.10'
|
38
|
+
appraise 'rails4-mysql2' do
|
39
|
+
gem 'rails', '4.2.7.1'
|
40
|
+
gem 'mysql2', platform: :ruby
|
41
|
+
gem 'activerecord-jdbcmysql-adapter', platform: :jruby
|
42
|
+
end
|
36
43
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
end
|
44
|
+
appraise 'rails4-postgres' do
|
45
|
+
gem 'rails', '4.2.7.1'
|
46
|
+
gem 'pg', platform: :ruby
|
47
|
+
gem 'activerecord-jdbcpostgresql-adapter', platform: :jruby
|
48
|
+
end
|
49
|
+
|
50
|
+
appraise 'rails4-postgres-redis' do
|
51
|
+
gem 'rails', '4.2.7.1'
|
52
|
+
gem 'pg', platform: :ruby
|
53
|
+
gem 'activerecord-jdbcpostgresql-adapter', platform: :jruby
|
54
|
+
gem 'redis-rails'
|
55
|
+
end
|
50
56
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
57
|
+
appraise 'rails4-postgres-sidekiq' do
|
58
|
+
gem 'rails', '4.2.7.1'
|
59
|
+
gem 'pg', platform: :ruby
|
60
|
+
gem 'activerecord-jdbcpostgresql-adapter', platform: :jruby
|
61
|
+
gem 'sidekiq'
|
62
|
+
gem 'activejob'
|
63
|
+
end
|
56
64
|
end
|
57
65
|
|
58
|
-
if RUBY_VERSION >=
|
59
|
-
appraise
|
60
|
-
gem
|
61
|
-
gem
|
66
|
+
if RUBY_VERSION >= '2.2.2' && RUBY_PLATFORM != 'java'
|
67
|
+
appraise 'rails5-mysql2' do
|
68
|
+
gem 'rails', '5.0.1'
|
69
|
+
gem 'mysql2', platform: :ruby
|
62
70
|
end
|
63
71
|
|
64
|
-
appraise
|
65
|
-
gem
|
66
|
-
gem
|
72
|
+
appraise 'rails5-postgres' do
|
73
|
+
gem 'rails', '5.0.1'
|
74
|
+
gem 'pg', platform: :ruby
|
67
75
|
end
|
68
76
|
|
69
|
-
appraise
|
70
|
-
gem
|
71
|
-
gem
|
72
|
-
gem
|
77
|
+
appraise 'rails5-postgres-redis' do
|
78
|
+
gem 'rails', '5.0.1'
|
79
|
+
gem 'pg', platform: :ruby
|
80
|
+
gem 'redis-rails'
|
73
81
|
end
|
74
82
|
|
75
|
-
appraise
|
76
|
-
gem
|
77
|
-
gem
|
78
|
-
gem
|
83
|
+
appraise 'rails5-postgres-sidekiq' do
|
84
|
+
gem 'rails', '5.0.1'
|
85
|
+
gem 'pg', platform: :ruby
|
86
|
+
gem 'sidekiq'
|
87
|
+
gem "activejob"
|
79
88
|
end
|
80
89
|
end
|
81
90
|
end
|
82
91
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
92
|
+
if RUBY_VERSION >= '2.2.2'
|
93
|
+
appraise 'contrib' do
|
94
|
+
gem 'elasticsearch-transport'
|
95
|
+
gem 'redis'
|
96
|
+
gem 'hiredis'
|
97
|
+
gem 'rack-test'
|
98
|
+
gem 'sinatra'
|
99
|
+
gem 'activerecord'
|
100
|
+
gem 'sidekiq'
|
101
|
+
end
|
102
|
+
else
|
103
|
+
appraise 'contrib-old' do
|
104
|
+
gem 'elasticsearch-transport'
|
105
|
+
gem 'redis'
|
106
|
+
gem 'hiredis'
|
107
|
+
gem 'rack-test', '0.6.2'
|
108
|
+
gem 'rack', '1.4.7'
|
109
|
+
gem 'sinatra', '1.4.5'
|
110
|
+
gem 'activerecord', '3.2.22.5'
|
111
|
+
gem 'sidekiq', '4.0.0'
|
112
|
+
end
|
90
113
|
end
|
data/Rakefile
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
require 'bundler/gem_tasks'
|
2
2
|
require 'ddtrace/version'
|
3
|
-
require 'rubocop/rake_task'
|
3
|
+
require 'rubocop/rake_task' if RUBY_VERSION >= '2.1.0'
|
4
4
|
require 'rake/testtask'
|
5
5
|
require 'appraisal'
|
6
6
|
require 'yard'
|
7
7
|
|
8
8
|
namespace :test do
|
9
|
-
task all: [:main,
|
9
|
+
task all: [:main,
|
10
|
+
:rails, :railsredis, :railssidekiq, :railsactivejob,
|
11
|
+
:elasticsearch, :http, :redis, :sidekiq, :sinatra, :monkey]
|
10
12
|
|
11
13
|
Rake::TestTask.new(:main) do |t|
|
12
14
|
t.libs << %w(test lib)
|
@@ -22,7 +24,8 @@ namespace :test do
|
|
22
24
|
t.libs << %w(test lib)
|
23
25
|
t.test_files = FileList['test/contrib/rails/**/*_test.rb'].reject do |path|
|
24
26
|
path.include?('redis') ||
|
25
|
-
path.include?('sidekiq')
|
27
|
+
path.include?('sidekiq') ||
|
28
|
+
path.include?('active_job')
|
26
29
|
end
|
27
30
|
end
|
28
31
|
|
@@ -36,6 +39,11 @@ namespace :test do
|
|
36
39
|
t.test_files = FileList['test/contrib/rails/**/*sidekiq*_test.rb']
|
37
40
|
end
|
38
41
|
|
42
|
+
Rake::TestTask.new(:railsactivejob) do |t|
|
43
|
+
t.libs << %w(test lib)
|
44
|
+
t.test_files = FileList['test/contrib/rails/**/*active_job*_test.rb']
|
45
|
+
end
|
46
|
+
|
39
47
|
[:elasticsearch, :http, :redis, :sinatra, :sidekiq].each do |contrib|
|
40
48
|
Rake::TestTask.new(contrib) do |t|
|
41
49
|
t.libs << %w(test lib)
|
@@ -54,9 +62,11 @@ Rake::TestTask.new(:benchmark) do |t|
|
|
54
62
|
t.test_files = FileList['test/benchmark_test.rb']
|
55
63
|
end
|
56
64
|
|
57
|
-
|
58
|
-
|
59
|
-
|
65
|
+
if RUBY_VERSION >= '2.1.0'
|
66
|
+
RuboCop::RakeTask.new(:rubocop) do |t|
|
67
|
+
t.options << ['-D']
|
68
|
+
t.patterns = ['lib/**/*.rb', 'test/**/*.rb', 'Gemfile', 'Rakefile']
|
69
|
+
end
|
60
70
|
end
|
61
71
|
|
62
72
|
YARD::Rake::YardocTask.new(:docs) do |t|
|
@@ -113,7 +123,7 @@ task :ci do
|
|
113
123
|
# check: https://circleci.com/docs/parallel-manual-setup/#env-splitting
|
114
124
|
case ENV['CIRCLE_NODE_INDEX'].to_i
|
115
125
|
when 0
|
116
|
-
sh 'rvm $MRI_VERSIONS --verbose do rake test:main'
|
126
|
+
sh 'rvm $MRI_VERSIONS,$MRI_OLD_VERSIONS --verbose do rake test:main'
|
117
127
|
sh 'rvm $LAST_STABLE --verbose do rake benchmark'
|
118
128
|
when 1
|
119
129
|
sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:monkey'
|
@@ -122,19 +132,28 @@ task :ci do
|
|
122
132
|
sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:redis'
|
123
133
|
sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:sinatra'
|
124
134
|
sh 'rvm $MRI_VERSIONS --verbose do appraisal contrib rake test:sidekiq'
|
125
|
-
sh 'rvm $
|
126
|
-
sh 'rvm $
|
127
|
-
sh 'rvm $
|
135
|
+
sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:monkey'
|
136
|
+
sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:elasticsearch'
|
137
|
+
sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:http'
|
138
|
+
sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:redis'
|
139
|
+
sh 'rvm $MRI_OLD_VERSIONS --verbose do appraisal contrib-old rake test:sinatra'
|
140
|
+
sh 'rvm $SIDEKIQ_OLD_VERSIONS --verbose do appraisal contrib-old rake test:sidekiq'
|
128
141
|
when 2
|
129
|
-
sh 'rvm $
|
130
|
-
sh 'rvm $
|
131
|
-
sh 'rvm $
|
132
|
-
sh 'rvm $
|
133
|
-
sh 'rvm $
|
142
|
+
sh 'rvm $RAILS3_VERSIONS --verbose do appraisal rails3-mysql2 rake test:rails'
|
143
|
+
sh 'rvm $RAILS3_VERSIONS --verbose do appraisal rails3-postgres rake test:rails'
|
144
|
+
sh 'rvm $RAILS3_VERSIONS --verbose do appraisal rails3-postgres-redis rake test:railsredis'
|
145
|
+
sh 'rvm $RAILS4_VERSIONS --verbose do appraisal rails4-mysql2 rake test:rails'
|
146
|
+
sh 'rvm $RAILS4_VERSIONS --verbose do appraisal rails4-postgres rake test:rails'
|
147
|
+
sh 'rvm $RAILS4_VERSIONS --verbose do appraisal rails4-postgres-redis rake test:railsredis'
|
148
|
+
# Test Rails3/Sidekiq with Rails4 versions (3 vs 4) as Sidekiq requires >= 2.0 and Rails3 should support 1.9
|
149
|
+
sh 'rvm $RAILS4_VERSIONS --verbose do appraisal rails3-postgres-sidekiq rake test:railssidekiq'
|
150
|
+
sh 'rvm $RAILS4_VERSIONS --verbose do appraisal rails4-postgres-sidekiq rake test:railssidekiq'
|
151
|
+
sh 'rvm $RAILS4_VERSIONS --verbose do appraisal rails4-postgres-sidekiq rake test:railsactivejob'
|
134
152
|
sh 'rvm $RAILS5_VERSIONS --verbose do appraisal rails5-mysql2 rake test:rails'
|
135
|
-
sh 'rvm $
|
136
|
-
sh 'rvm $RAILS_VERSIONS --verbose do appraisal rails4-postgres-redis rake test:railsredis'
|
153
|
+
sh 'rvm $RAILS5_VERSIONS --verbose do appraisal rails5-postgres rake test:rails'
|
137
154
|
sh 'rvm $RAILS5_VERSIONS --verbose do appraisal rails5-postgres-redis rake test:railsredis'
|
155
|
+
sh 'rvm $RAILS5_VERSIONS --verbose do appraisal rails5-postgres-sidekiq rake test:railssidekiq'
|
156
|
+
sh 'rvm $RAILS5_VERSIONS --verbose do appraisal rails5-postgres-sidekiq rake test:railsactivejob'
|
138
157
|
else
|
139
158
|
puts 'Too many workers than parallel tasks'
|
140
159
|
end
|
data/circle.yml
CHANGED
@@ -4,9 +4,12 @@ machine:
|
|
4
4
|
environment:
|
5
5
|
# FIXME: Disabled $JRUBY_VERSIONS tests because of a Java incompatibility
|
6
6
|
LAST_STABLE: 2.4.0
|
7
|
-
EARLY_STABLE: 2.
|
8
|
-
MRI_VERSIONS: 2.4.0,2.3.3,2.2.6
|
9
|
-
|
7
|
+
EARLY_STABLE: 2.2.6
|
8
|
+
MRI_VERSIONS: 2.4.0,2.3.3,2.2.6
|
9
|
+
MRI_OLD_VERSIONS: 2.1.10,2.0.0,1.9.3
|
10
|
+
SIDEKIQ_OLD_VERSIONS: 2.1.10,2.0.0
|
11
|
+
RAILS3_VERSIONS: 2.3.3,2.2.6,2.1.10,2.0.0,1.9.3
|
12
|
+
RAILS4_VERSIONS: 2.3.3,2.2.6,2.1.10
|
10
13
|
RAILS5_VERSIONS: 2.3.3,2.2.6
|
11
14
|
AGENT_BUILD_PATH: "/home/ubuntu/agent"
|
12
15
|
TEST_DATADOG_INTEGRATION: 1
|
@@ -29,10 +32,10 @@ dependencies:
|
|
29
32
|
- rvm get head
|
30
33
|
- rvm install $MRI_VERSIONS
|
31
34
|
override:
|
32
|
-
- rvm $MRI_VERSIONS --verbose do gem update --system
|
33
|
-
- rvm $MRI_VERSIONS --verbose do gem install bundler
|
34
|
-
- rvm $MRI_VERSIONS --verbose do bundle install
|
35
|
-
- rvm $MRI_VERSIONS --verbose do appraisal install
|
35
|
+
- rvm $MRI_VERSIONS,$MRI_OLD_VERSIONS --verbose do gem update --system
|
36
|
+
- rvm $MRI_VERSIONS,$MRI_OLD_VERSIONS --verbose do gem install bundler
|
37
|
+
- rvm $MRI_VERSIONS,$MRI_OLD_VERSIONS --verbose do bundle install
|
38
|
+
- rvm $MRI_VERSIONS,$MRI_OLD_VERSIONS --verbose do appraisal install
|
36
39
|
|
37
40
|
test:
|
38
41
|
override:
|
data/ddtrace.gemspec
CHANGED
@@ -4,38 +4,38 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'ddtrace/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'ddtrace'
|
8
8
|
spec.version = "#{Datadog::VERSION::STRING}#{ENV['VERSION_SUFFIX']}"
|
9
|
-
spec.required_ruby_version = '>=
|
10
|
-
spec.authors = [
|
11
|
-
spec.email = [
|
9
|
+
spec.required_ruby_version = '>= 1.9.1'
|
10
|
+
spec.authors = ['Datadog, Inc.']
|
11
|
+
spec.email = ['dev@datadoghq.com']
|
12
12
|
|
13
|
-
spec.summary =
|
13
|
+
spec.summary = 'Datadog tracing code for your Ruby applications'
|
14
14
|
spec.description = <<-EOS
|
15
15
|
ddtrace is Datadog’s tracing client for Ruby. It is used to trace requests
|
16
16
|
as they flow across web servers, databases and microservices so that developers
|
17
17
|
have great visiblity into bottlenecks and troublesome requests.
|
18
18
|
EOS
|
19
19
|
|
20
|
-
spec.homepage =
|
21
|
-
spec.license =
|
20
|
+
spec.homepage = 'https://github.com/DataDog/dd-trace-rb'
|
21
|
+
spec.license = 'BSD-3-Clause'
|
22
22
|
|
23
23
|
if spec.respond_to?(:metadata)
|
24
|
-
spec.metadata['allowed_push_host'] =
|
24
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
25
25
|
else
|
26
|
-
raise
|
26
|
+
raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
|
27
27
|
end
|
28
28
|
|
29
29
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
30
|
-
spec.bindir =
|
30
|
+
spec.bindir = 'exe'
|
31
31
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
32
|
-
spec.require_paths = [
|
32
|
+
spec.require_paths = ['lib']
|
33
33
|
|
34
|
-
spec.add_dependency
|
34
|
+
spec.add_dependency 'msgpack'
|
35
35
|
|
36
|
-
spec.add_development_dependency
|
37
|
-
spec.add_development_dependency
|
38
|
-
spec.add_development_dependency
|
39
|
-
spec.add_development_dependency
|
40
|
-
spec.add_development_dependency
|
36
|
+
spec.add_development_dependency 'rake', '~> 10.5'
|
37
|
+
spec.add_development_dependency('rubocop', '~> 0.47') if RUBY_VERSION >= '2.1.0'
|
38
|
+
spec.add_development_dependency 'minitest', '~> 5.10'
|
39
|
+
spec.add_development_dependency 'appraisal', '~> 2.1'
|
40
|
+
spec.add_development_dependency 'yard', '~> 0.9'
|
41
41
|
end
|
data/docs/GettingStarted.md
CHANGED
data/gemfiles/contrib.gemfile
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
# This file was generated by Appraisal
|
2
|
+
|
3
|
+
source "https://rubygems.org"
|
4
|
+
|
5
|
+
gem "elasticsearch-transport"
|
6
|
+
gem "redis"
|
7
|
+
gem "hiredis"
|
8
|
+
gem "rack-test", "0.6.2"
|
9
|
+
gem "rack", "1.4.7"
|
10
|
+
gem "sinatra", "1.4.5"
|
11
|
+
gem "activerecord", "3.2.22.5"
|
12
|
+
gem "sidekiq", "4.0.0"
|
13
|
+
|
14
|
+
gemspec :path => "../"
|
@@ -3,6 +3,14 @@
|
|
3
3
|
module Datadog
|
4
4
|
module Contrib
|
5
5
|
module Elasticsearch
|
6
|
+
URL = 'elasticsearch.url'.freeze
|
7
|
+
METHOD = 'elasticsearch.method'.freeze
|
8
|
+
PARAMS = 'elasticsearch.params'.freeze
|
9
|
+
BODY = 'elasticsearch.body'.freeze
|
10
|
+
|
11
|
+
SERVICE = 'elasticsearch'.freeze
|
12
|
+
SPAN_TYPE = 'elasticsearch'.freeze
|
13
|
+
|
6
14
|
# Patcher enables patching of 'elasticsearch/transport' module.
|
7
15
|
# This is used in monkey.rb to automatically apply patches
|
8
16
|
module Patcher
|
@@ -15,8 +23,15 @@ module Datadog
|
|
15
23
|
if !@patched && (defined?(::Elasticsearch::Transport::VERSION) && \
|
16
24
|
Gem::Version.new(::Elasticsearch::Transport::VERSION) >= Gem::Version.new('1.0.0'))
|
17
25
|
begin
|
18
|
-
require '
|
19
|
-
|
26
|
+
require 'uri'
|
27
|
+
require 'json'
|
28
|
+
require 'ddtrace/monkey'
|
29
|
+
require 'ddtrace/pin'
|
30
|
+
require 'ddtrace/ext/app_types'
|
31
|
+
require 'ddtrace/contrib/elasticsearch/quantize'
|
32
|
+
|
33
|
+
patch_elasticsearch_transport_client()
|
34
|
+
|
20
35
|
@patched = true
|
21
36
|
rescue StandardError => e
|
22
37
|
Datadog::Tracer.log.error("Unable to apply Elastic Search integration: #{e}")
|
@@ -25,6 +40,63 @@ module Datadog
|
|
25
40
|
@patched
|
26
41
|
end
|
27
42
|
|
43
|
+
# rubocop:disable Metrics/MethodLength
|
44
|
+
def patch_elasticsearch_transport_client
|
45
|
+
::Elasticsearch::Transport::Client.class_eval do
|
46
|
+
alias_method :initialize_without_datadog, :initialize
|
47
|
+
Datadog::Monkey.without_warnings do
|
48
|
+
remove_method :initialize
|
49
|
+
end
|
50
|
+
|
51
|
+
def initialize(*args)
|
52
|
+
pin = Datadog::Pin.new(SERVICE, app: 'elasticsearch', app_type: Datadog::Ext::AppTypes::DB)
|
53
|
+
pin.onto(self)
|
54
|
+
initialize_without_datadog(*args)
|
55
|
+
end
|
56
|
+
|
57
|
+
alias_method :perform_request_without_datadog, :perform_request
|
58
|
+
remove_method :perform_request
|
59
|
+
|
60
|
+
def perform_request(*args)
|
61
|
+
pin = Datadog::Pin.get_from(self)
|
62
|
+
return perform_request_without_datadog(*args) unless pin && pin.tracer
|
63
|
+
|
64
|
+
method = args[0]
|
65
|
+
path = args[1]
|
66
|
+
params = args[2]
|
67
|
+
body = args[3]
|
68
|
+
full_url = URI.parse(path)
|
69
|
+
|
70
|
+
url = full_url.path
|
71
|
+
response = nil
|
72
|
+
pin.tracer.trace('elasticsearch.query') do |span|
|
73
|
+
begin
|
74
|
+
span.service = pin.service
|
75
|
+
span.span_type = SPAN_TYPE
|
76
|
+
|
77
|
+
# load JSON for the following fields unless they're already strings
|
78
|
+
params = JSON.generate(params) if params && !params.is_a?(String)
|
79
|
+
body = JSON.generate(body) if body && !body.is_a?(String)
|
80
|
+
|
81
|
+
span.set_tag(METHOD, method)
|
82
|
+
span.set_tag(URL, url)
|
83
|
+
span.set_tag(PARAMS, params) if params
|
84
|
+
span.set_tag(BODY, body) if body
|
85
|
+
|
86
|
+
quantized_url = Datadog::Contrib::Elasticsearch::Quantize.format_url(url)
|
87
|
+
span.resource = "#{method} #{quantized_url}"
|
88
|
+
rescue StandardError => e
|
89
|
+
Datadog::Tracer.log.error(e.message)
|
90
|
+
ensure
|
91
|
+
# the call is still executed
|
92
|
+
response = perform_request_without_datadog(*args)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
response
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
28
100
|
# patched? tells wether patch has been successfully applied
|
29
101
|
def patched?
|
30
102
|
@patched
|
@@ -18,7 +18,7 @@ module Datadog
|
|
18
18
|
# we don't want to trace our own call to the API (they use net/http)
|
19
19
|
# when we know the host & port (from the URI) we use it, else (most-likely
|
20
20
|
# called with a block) rely on the URL at the end.
|
21
|
-
if req.uri
|
21
|
+
if req.respond_to?(:uri) && req.uri
|
22
22
|
if req.uri.host.to_s == transport.hostname.to_s &&
|
23
23
|
req.uri.port.to_i == transport.port.to_i
|
24
24
|
return true
|
@@ -96,14 +96,14 @@ module Datadog
|
|
96
96
|
span.service = pin.service
|
97
97
|
span.span_type = Datadog::Ext::HTTP::TYPE
|
98
98
|
|
99
|
-
span.resource = req.
|
100
|
-
#
|
101
|
-
#
|
102
|
-
|
99
|
+
span.resource = req.method
|
100
|
+
# Using the method as a resource, as URL/path can trigger
|
101
|
+
# a possibly infinite number of resources.
|
102
|
+
span.set_tag(Datadog::Ext::HTTP::URL, req.path)
|
103
103
|
span.set_tag(Datadog::Ext::HTTP::METHOD, req.method)
|
104
104
|
response = request_without_datadog(req, body, &block)
|
105
105
|
span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, response.code)
|
106
|
-
if req.uri
|
106
|
+
if req.respond_to?(:uri) && req.uri
|
107
107
|
span.set_tag(Datadog::Ext::NET::TARGET_HOST, req.uri.host)
|
108
108
|
span.set_tag(Datadog::Ext::NET::TARGET_PORT, req.uri.port.to_s)
|
109
109
|
else
|
@@ -51,17 +51,22 @@ module Datadog
|
|
51
51
|
if payload[:exception].nil?
|
52
52
|
# [christian] in some cases :status is not defined,
|
53
53
|
# rather than firing an error, simply acknowledge we don't know it.
|
54
|
-
|
54
|
+
status = payload.fetch(:status, '?').to_s
|
55
|
+
if status.starts_with?('5')
|
56
|
+
span.status = 1
|
57
|
+
span.set_tag(Datadog::Ext::Errors::STACK, caller().join('\n'))
|
58
|
+
end
|
59
|
+
span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, status)
|
55
60
|
else
|
56
61
|
error = payload[:exception]
|
57
|
-
# TODO[manu]: it's right to have a 500? there are cases in Rails that let
|
58
|
-
# user to recover the error after this point?
|
59
62
|
span.status = 1
|
60
63
|
span.set_tag(Datadog::Ext::Errors::TYPE, error[0])
|
61
64
|
span.set_tag(Datadog::Ext::Errors::MSG, error[1])
|
62
|
-
span.set_tag(Datadog::Ext::
|
65
|
+
span.set_tag(Datadog::Ext::Errors::STACK, caller().join('\n'))
|
66
|
+
# [manu,christian]: it's right to have a 500? there are cases in Rails that let
|
67
|
+
# user to recover the error after this point?
|
68
|
+
span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, payload.fetch(:status, '500').to_s)
|
63
69
|
end
|
64
|
-
|
65
70
|
ensure
|
66
71
|
span.start_time = start
|
67
72
|
span.finish_at(finish)
|
@@ -81,7 +81,6 @@ module Datadog
|
|
81
81
|
span.set_tag(Datadog::Ext::Errors::TYPE, error[0])
|
82
82
|
span.set_tag(Datadog::Ext::Errors::MSG, error[1])
|
83
83
|
end
|
84
|
-
|
85
84
|
ensure
|
86
85
|
span.start_time = start
|
87
86
|
span.finish_at(finish)
|
@@ -110,7 +109,6 @@ module Datadog
|
|
110
109
|
span.set_tag(Datadog::Ext::Errors::TYPE, error[0])
|
111
110
|
span.set_tag(Datadog::Ext::Errors::MSG, error[1])
|
112
111
|
end
|
113
|
-
|
114
112
|
ensure
|
115
113
|
span.start_time = start
|
116
114
|
span.finish_at(finish)
|
@@ -31,11 +31,20 @@ module Datadog
|
|
31
31
|
span_type: span_type
|
32
32
|
)
|
33
33
|
|
34
|
+
# find out if the SQL query has been cached in this request. This meta is really
|
35
|
+
# helpful to users because some spans may have 0ns of duration because the query
|
36
|
+
# is simply cached from memory, so the notification is fired with start == finish.
|
37
|
+
# TODO[manu]: this feature has been merged into master but has not yet released.
|
38
|
+
# We're supporting this action as a best effort, but we should add a test after
|
39
|
+
# a new version of Rails is out.
|
40
|
+
cached = payload[:cached]
|
41
|
+
|
34
42
|
# the span should have the query ONLY in the Resource attribute,
|
35
43
|
# so that the ``sql.query`` tag will be set in the agent with an
|
36
44
|
# obfuscated version
|
37
45
|
span.span_type = Datadog::Ext::SQL::TYPE
|
38
46
|
span.set_tag('rails.db.vendor', adapter_name)
|
47
|
+
span.set_tag('rails.db.cached', cached) if cached
|
39
48
|
span.start_time = start
|
40
49
|
span.finish_at(finish)
|
41
50
|
rescue StandardError => e
|
@@ -1,106 +1,112 @@
|
|
1
1
|
module Datadog
|
2
|
-
#
|
3
|
-
module
|
4
|
-
|
5
|
-
ActiveSupport::Notifications.instrument('start_render_template.action_view')
|
6
|
-
super(*args)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
# TODO[manu]: write docs
|
11
|
-
module PartialRendererExtension
|
12
|
-
def render_partial(*args)
|
13
|
-
ActiveSupport::Notifications.instrument('start_render_partial.action_view')
|
14
|
-
super(*args)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
# CacheStoreReadExtension contains a new read function that notifies
|
19
|
-
# the framework of a read, then calls read.
|
20
|
-
module CacheStoreReadExtension
|
21
|
-
def read(*args)
|
22
|
-
ActiveSupport::Notifications.instrument('start_cache_read.active_support')
|
23
|
-
super(*args)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
# CacheStoreFetchExtension contains a new fetch function that notifies
|
28
|
-
# the framework of a fetch, then calls fetch.
|
29
|
-
module CacheStoreFetchExtension
|
30
|
-
# It might seem redundant to instrument both read and fetch since
|
31
|
-
# fetch very often calls read. But there's no garantee of this, in
|
32
|
-
# some cases fetch can call directly read_entry without calling read.
|
33
|
-
def fetch(*args)
|
34
|
-
ActiveSupport::Notifications.instrument('start_cache_fetch.active_support')
|
35
|
-
super(*args)
|
36
|
-
end
|
37
|
-
end
|
2
|
+
# RailsPatcher contains function to patch the Rails libraries.
|
3
|
+
module RailsPatcher
|
4
|
+
module_function
|
38
5
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
def write(*args)
|
43
|
-
ActiveSupport::Notifications.instrument('start_cache_write.active_support')
|
44
|
-
super(*args)
|
6
|
+
def patch_renderer
|
7
|
+
patch_renderer_render_template
|
8
|
+
patch_renderer_render_partial
|
45
9
|
end
|
46
|
-
end
|
47
10
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
11
|
+
def patch_cache_store
|
12
|
+
patch_cache_store_read
|
13
|
+
patch_cache_store_fetch
|
14
|
+
patch_cache_store_write
|
15
|
+
patch_cache_store_delete
|
16
|
+
patch_cache_store_instrument
|
54
17
|
end
|
55
|
-
end
|
56
18
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
19
|
+
def patch_renderer_render_template
|
20
|
+
::ActionView::Renderer.class_eval do
|
21
|
+
alias_method :render_template_without_datadog, :render_template
|
22
|
+
def render_template(*args, &block)
|
23
|
+
ActiveSupport::Notifications.instrument('start_render_template.action_view')
|
24
|
+
render_template_without_datadog(*args, &block)
|
25
|
+
end
|
26
|
+
end
|
63
27
|
end
|
64
|
-
end
|
65
28
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
29
|
+
def patch_renderer_render_partial
|
30
|
+
::ActionView::PartialRenderer.class_eval do
|
31
|
+
alias_method :render_partial_without_datadog, :render_partial
|
32
|
+
def render_partial(*args, &block)
|
33
|
+
ActiveSupport::Notifications.instrument('start_render_partial.action_view')
|
34
|
+
render_partial_without_datadog(*args, &block)
|
35
|
+
end
|
36
|
+
end
|
73
37
|
end
|
74
38
|
|
75
|
-
def
|
39
|
+
def cache_store_class(k)
|
76
40
|
# When Redis is used, we can't only patch Cache::Store as it is
|
77
41
|
# Cache::RedisStore, a sub-class of it that is used, in practice.
|
78
42
|
# We need to do a per-method monkey patching as some of them might
|
79
43
|
# be redefined, and some of them not. The latest version of redis-activesupport
|
80
44
|
# redefines write but leaves untouched read and delete:
|
81
45
|
# https://github.com/redis-store/redis-activesupport/blob/master/lib/active_support/cache/redis_store.rb
|
46
|
+
c = if defined?(::ActiveSupport::Cache::RedisStore) &&
|
47
|
+
::ActiveSupport::Cache::RedisStore.instance_methods(false).include?(k)
|
48
|
+
::ActiveSupport::Cache::RedisStore
|
49
|
+
else
|
50
|
+
::ActiveSupport::Cache::Store
|
51
|
+
end
|
52
|
+
c
|
53
|
+
end
|
82
54
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
else
|
91
|
-
::ActiveSupport::Cache::Store
|
92
|
-
end
|
93
|
-
Datadog::Tracer.log.debug("monkey patching #{c}.#{k} with #{v}.#{k}")
|
94
|
-
c.prepend v
|
55
|
+
def patch_cache_store_read
|
56
|
+
cache_store_class(:read).class_eval do
|
57
|
+
alias_method :read_without_datadog, :read
|
58
|
+
def read(*args, &block)
|
59
|
+
ActiveSupport::Notifications.instrument('start_cache_read.active_support')
|
60
|
+
read_without_datadog(*args, &block)
|
61
|
+
end
|
95
62
|
end
|
63
|
+
end
|
96
64
|
|
65
|
+
def patch_cache_store_fetch
|
66
|
+
cache_store_class(:fetch).class_eval do
|
67
|
+
alias_method :fetch_without_datadog, :fetch
|
68
|
+
def fetch(*args, &block)
|
69
|
+
ActiveSupport::Notifications.instrument('start_cache_fetch.active_support')
|
70
|
+
fetch_without_datadog(*args, &block)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def patch_cache_store_write
|
76
|
+
cache_store_class(:write).class_eval do
|
77
|
+
alias_method :write_without_datadog, :write
|
78
|
+
def write(*args, &block)
|
79
|
+
ActiveSupport::Notifications.instrument('start_cache_write.active_support')
|
80
|
+
write_without_datadog(*args, &block)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def patch_cache_store_delete
|
86
|
+
cache_store_class(:delete).class_eval do
|
87
|
+
alias_method :delete_without_datadog, :delete
|
88
|
+
def delete(*args, &block)
|
89
|
+
ActiveSupport::Notifications.instrument('start_cache_delete.active_support')
|
90
|
+
delete_without_datadog(*args, &block)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def patch_cache_store_instrument
|
97
96
|
# by default, Rails 3 doesn't instrument the cache system so we should turn it on
|
98
97
|
# using the ActiveSupport::Cache::Store.instrument= function. Unfortunately, early
|
99
98
|
# versions of Rails use a Thread.current store that is not compatible with some
|
100
99
|
# application servers like Passenger.
|
101
100
|
# More details: https://github.com/rails/rails/blob/v3.2.22.5/activesupport/lib/active_support/cache.rb#L175-L177
|
102
101
|
return unless ::Rails::VERSION::MAJOR.to_i == 3
|
103
|
-
::ActiveSupport::Cache::Store.singleton_class.
|
102
|
+
::ActiveSupport::Cache::Store.singleton_class.class_eval do
|
103
|
+
# Add the instrument function that Rails 3.x uses
|
104
|
+
# to know if the underlying cache should be instrumented or not. By default,
|
105
|
+
# we force that instrumentation if the Rails application is auto instrumented.
|
106
|
+
def instrument
|
107
|
+
true
|
108
|
+
end
|
109
|
+
end
|
104
110
|
end
|
105
111
|
end
|
106
112
|
end
|
@@ -25,7 +25,7 @@ module Datadog
|
|
25
25
|
|
26
26
|
# Middleware is a Sidekiq server-side middleware which traces executed jobs
|
27
27
|
class Tracer
|
28
|
-
def initialize(options)
|
28
|
+
def initialize(options = {})
|
29
29
|
# check if Rails configuration is available and use it to override
|
30
30
|
# Sidekiq defaults
|
31
31
|
rails_config = ::Rails.configuration.datadog_trace rescue {}
|
@@ -54,7 +54,14 @@ module Datadog
|
|
54
54
|
|
55
55
|
def call(worker, job, queue)
|
56
56
|
@tracer.trace('sidekiq.job', service: @sidekiq_service, span_type: 'job') do |span|
|
57
|
-
|
57
|
+
if job['wrapped']
|
58
|
+
# If class is wrapping something else, the interesting resource info
|
59
|
+
# is the underlying, wrapped class, and not the wrapper.
|
60
|
+
span.resource = job['wrapped']
|
61
|
+
span.set_tag('sidekiq.job.wrapper', job['class'])
|
62
|
+
else
|
63
|
+
span.resource = job['class']
|
64
|
+
end
|
58
65
|
span.set_tag('sidekiq.job.id', job['jid'])
|
59
66
|
span.set_tag('sidekiq.job.retry', job['retry'])
|
60
67
|
span.set_tag('sidekiq.job.queue', job['queue'])
|
data/lib/ddtrace/monkey.rb
CHANGED
data/lib/ddtrace/pin.rb
CHANGED
@@ -17,13 +17,14 @@ module Datadog
|
|
17
17
|
attr_accessor :name
|
18
18
|
attr_accessor :tracer
|
19
19
|
|
20
|
-
|
20
|
+
# [ruby19] named parameters would be more idiomatic here, but would break backward compatibility
|
21
|
+
def initialize(service, options = { app: nil, tags: nil, app_type: nil, tracer: nil })
|
21
22
|
@service = service
|
22
|
-
@app = app
|
23
|
-
@tags = tags
|
24
|
-
@app_type = app_type
|
23
|
+
@app = options[:app]
|
24
|
+
@tags = options[:tags]
|
25
|
+
@app_type = options[:app_type]
|
25
26
|
@name = nil # this would rarely be overriden as it's really span-specific
|
26
|
-
@tracer = tracer
|
27
|
+
@tracer = options[:tracer] || Datadog.tracer
|
27
28
|
end
|
28
29
|
|
29
30
|
def enabled?
|
data/lib/ddtrace/span.rb
CHANGED
@@ -86,7 +86,7 @@ module Datadog
|
|
86
86
|
@status = 1
|
87
87
|
@meta[Datadog::Ext::Errors::MSG] = e.message if e.respond_to?(:message) && e.message
|
88
88
|
@meta[Datadog::Ext::Errors::TYPE] = e.class.to_s
|
89
|
-
@meta[Datadog::Ext::Errors::STACK] = e.backtrace.join(
|
89
|
+
@meta[Datadog::Ext::Errors::STACK] = e.backtrace.join('\n') if e.respond_to?(:backtrace) && e.backtrace
|
90
90
|
end
|
91
91
|
|
92
92
|
# Mark the span finished at the current time and submit it.
|
data/lib/ddtrace/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ddtrace
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Datadog, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03-
|
11
|
+
date: 2017-03-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '10.5'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '10.5'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rubocop
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -118,6 +118,7 @@ files:
|
|
118
118
|
- docker-compose.yml
|
119
119
|
- docs/GettingStarted.md
|
120
120
|
- gemfiles/contrib.gemfile
|
121
|
+
- gemfiles/contrib_old.gemfile
|
121
122
|
- gemfiles/rails3_mysql2.gemfile
|
122
123
|
- gemfiles/rails3_postgres.gemfile
|
123
124
|
- gemfiles/rails3_postgres_redis.gemfile
|
@@ -132,7 +133,6 @@ files:
|
|
132
133
|
- gemfiles/rails5_postgres_sidekiq.gemfile
|
133
134
|
- lib/ddtrace.rb
|
134
135
|
- lib/ddtrace/buffer.rb
|
135
|
-
- lib/ddtrace/contrib/elasticsearch/core.rb
|
136
136
|
- lib/ddtrace/contrib/elasticsearch/patcher.rb
|
137
137
|
- lib/ddtrace/contrib/elasticsearch/quantize.rb
|
138
138
|
- lib/ddtrace/contrib/http/patcher.rb
|
@@ -179,7 +179,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
179
179
|
requirements:
|
180
180
|
- - ">="
|
181
181
|
- !ruby/object:Gem::Version
|
182
|
-
version:
|
182
|
+
version: 1.9.1
|
183
183
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
184
184
|
requirements:
|
185
185
|
- - ">="
|
@@ -187,7 +187,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
187
187
|
version: '0'
|
188
188
|
requirements: []
|
189
189
|
rubyforge_project:
|
190
|
-
rubygems_version: 2.
|
190
|
+
rubygems_version: 2.6.11
|
191
191
|
signing_key:
|
192
192
|
specification_version: 4
|
193
193
|
summary: Datadog tracing code for your Ruby applications
|
@@ -1,66 +0,0 @@
|
|
1
|
-
require 'uri'
|
2
|
-
require 'ddtrace/pin'
|
3
|
-
require 'ddtrace/ext/app_types'
|
4
|
-
require 'json'
|
5
|
-
require 'ddtrace/contrib/elasticsearch/quantize'
|
6
|
-
|
7
|
-
module Datadog
|
8
|
-
module Contrib
|
9
|
-
module Elasticsearch
|
10
|
-
URL = 'elasticsearch.url'.freeze
|
11
|
-
METHOD = 'elasticsearch.method'.freeze
|
12
|
-
PARAMS = 'elasticsearch.params'.freeze
|
13
|
-
BODY = 'elasticsearch.body'.freeze
|
14
|
-
|
15
|
-
SERVICE = 'elasticsearch'.freeze
|
16
|
-
SPAN_TYPE = 'elasticsearch'.freeze
|
17
|
-
|
18
|
-
# Datadog APM Elastic Search integration.
|
19
|
-
module TracedClient
|
20
|
-
def initialize(*)
|
21
|
-
pin = Datadog::Pin.new(SERVICE, app: 'elasticsearch', app_type: Datadog::Ext::AppTypes::DB)
|
22
|
-
pin.onto(self)
|
23
|
-
super
|
24
|
-
end
|
25
|
-
|
26
|
-
def perform_request(*args)
|
27
|
-
pin = Datadog::Pin.get_from(self)
|
28
|
-
return super unless pin && pin.tracer
|
29
|
-
|
30
|
-
method = args[0]
|
31
|
-
path = args[1]
|
32
|
-
params = args[2]
|
33
|
-
body = args[3]
|
34
|
-
full_url = URI.parse(path)
|
35
|
-
|
36
|
-
url = full_url.path
|
37
|
-
response = nil
|
38
|
-
pin.tracer.trace('elasticsearch.query') do |span|
|
39
|
-
begin
|
40
|
-
span.service = pin.service
|
41
|
-
span.span_type = SPAN_TYPE
|
42
|
-
|
43
|
-
# load JSON for the following fields unless they're already strings
|
44
|
-
params = JSON.generate(params) if params && !params.is_a?(String)
|
45
|
-
body = JSON.generate(body) if body && !body.is_a?(String)
|
46
|
-
|
47
|
-
span.set_tag(METHOD, method)
|
48
|
-
span.set_tag(URL, url)
|
49
|
-
span.set_tag(PARAMS, params) if params
|
50
|
-
span.set_tag(BODY, body) if body
|
51
|
-
|
52
|
-
quantized_url = Datadog::Contrib::Elasticsearch::Quantize.format_url(url)
|
53
|
-
span.resource = "#{method} #{quantized_url}"
|
54
|
-
rescue StandardError => e
|
55
|
-
Datadog::Tracer.log.error(e.message)
|
56
|
-
ensure
|
57
|
-
# the call is still executed
|
58
|
-
response = super(*args)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
response
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|