Skip to content

Commit 4640a20

Browse files
committed
Initial implementation of Presto intergration
1 parent 7550873 commit 4640a20

File tree

10 files changed

+194
-0
lines changed

10 files changed

+194
-0
lines changed

.env

+2
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,7 @@ TEST_POSTGRES_HOST=127.0.0.1
2020
TEST_POSTGRES_PASSWORD=postgres
2121
TEST_POSTGRES_PORT=5432
2222
TEST_POSTGRES_USER=postgres
23+
TEST_PRESTO_HOST=localhost
24+
TEST_PRESTO_PORT=8080
2325
TEST_REDIS_HOST=127.0.0.1
2426
TEST_REDIS_PORT=6379

Appraisals

+3
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,7 @@ elsif Gem::Version.new('2.2.0') <= Gem::Version.new(RUBY_VERSION) \
406406
gem 'hiredis'
407407
gem 'mongo', '>= 2.8.0'
408408
gem 'mysql2', '< 0.5', platform: :ruby
409+
gem 'presto-client', '>= 0.5.14'
409410
gem 'racecar', '>= 0.3.5'
410411
gem 'rack'
411412
gem 'rack-test'
@@ -545,6 +546,7 @@ elsif Gem::Version.new('2.3.0') <= Gem::Version.new(RUBY_VERSION) \
545546
gem 'hiredis'
546547
gem 'mongo', '>= 2.8.0'
547548
gem 'mysql2', '< 0.5', platform: :ruby
549+
gem 'presto-client', '>= 0.5.14'
548550
gem 'racecar', '>= 0.3.5'
549551
gem 'rack'
550552
gem 'rack-test'
@@ -578,6 +580,7 @@ elsif Gem::Version.new('2.4.0') <= Gem::Version.new(RUBY_VERSION)
578580
gem 'hiredis'
579581
gem 'mongo', '>= 2.8.0'
580582
gem 'mysql2', '< 0.5', platform: :ruby
583+
gem 'presto-client', '>= 0.5.14'
581584
gem 'racecar', '>= 0.3.5'
582585
gem 'rack'
583586
gem 'rack-test'

Rakefile

+1
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ namespace :spec do
7575
:http,
7676
:mongodb,
7777
:mysql2,
78+
:presto,
7879
:racecar,
7980
:rack,
8081
:rake,

docker-compose.yml

+9
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ services:
150150
- mongodb
151151
- mysql
152152
- postgres
153+
- presto
153154
- redis
154155
env_file: ./.env
155156
environment:
@@ -161,6 +162,8 @@ services:
161162
- TEST_MONGODB_HOST=mongodb
162163
- TEST_MYSQL_HOST=mysql
163164
- TEST_POSTGRES_HOST=postgres
165+
- TEST_PRESTO_HOST=presto
166+
- TEST_PRESTO_PORT=8080
164167
- TEST_REDIS_HOST=redis
165168
stdin_open: true
166169
tty: true
@@ -225,6 +228,12 @@ services:
225228
- "5432"
226229
ports:
227230
- "${TEST_POSTGRES_PORT}:5432"
231+
presto:
232+
image: starburstdata/presto:302-e.2
233+
expose:
234+
- "8080"
235+
ports:
236+
- "${TEST_PRESTO_PORT}:8080"
228237
redis:
229238
image: redis:3.0
230239
expose:

lib/ddtrace.rb

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ module Datadog
3535
require 'ddtrace/contrib/grpc/integration'
3636
require 'ddtrace/contrib/http/integration'
3737
require 'ddtrace/contrib/integration'
38+
require 'ddtrace/contrib/presto/integration'
3839
require 'ddtrace/contrib/mysql2/integration'
3940
require 'ddtrace/contrib/mongodb/integration'
4041
require 'ddtrace/contrib/racecar/integration'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
require 'ddtrace/contrib/configuration/settings'
2+
require 'ddtrace/contrib/presto/ext'
3+
4+
module Datadog
5+
module Contrib
6+
module Presto
7+
module Configuration
8+
# Custom settings for the Presto integration
9+
class Settings < Contrib::Configuration::Settings
10+
option :analytics_enabled,
11+
default: -> { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) },
12+
lazy: true
13+
14+
option :analytics_sample_rate,
15+
default: -> { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) },
16+
lazy: true
17+
18+
option :service_name, default: Ext::SERVICE_NAME
19+
end
20+
end
21+
end
22+
end
23+
end

lib/ddtrace/contrib/presto/ext.rb

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
module Datadog
2+
module Contrib
3+
module Presto
4+
# MongoDB integration constants
5+
module Ext
6+
APP = 'presto'.freeze
7+
ENV_ANALYTICS_ENABLED = 'DD_PRESTO_ANALYTICS_ENABLED'.freeze
8+
ENV_ANALYTICS_SAMPLE_RATE = 'DD_PRESTO_ANALYTICS_SAMPLE_RATE'.freeze
9+
SERVICE_NAME = 'presto'.freeze
10+
SPAN_QUERY = 'presto.query'.freeze
11+
SPAN_RESUME = 'presto.resume_query'.freeze
12+
SPAN_KILL = 'presto.kill_query'.freeze
13+
TAG_SCHEMA_NAME = 'presto.schema'.freeze
14+
TAG_CATALOG_NAME = 'presto.catalog'.freeze
15+
TAG_USER_NAME = 'presto.user'.freeze
16+
TAG_TIME_ZONE = 'presto.time_zone'.freeze
17+
TAG_LANGUAGE = 'presto.language'.freeze
18+
TAG_PROXY = 'presto.http_proxy'.freeze
19+
TAG_MODEL_VERSION = 'presto.model_version'.freeze
20+
end
21+
end
22+
end
23+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
require 'ddtrace/pin'
2+
require 'ddtrace/ext/net'
3+
require 'ddtrace/ext/sql'
4+
require 'ddtrace/ext/app_types'
5+
require 'ddtrace/contrib/presto/ext'
6+
7+
module Datadog
8+
module Contrib
9+
module Presto
10+
# Instrumentation for Presto integration
11+
module Instrumentation
12+
# Instrumentation for Presto::Client::Client
13+
module Client
14+
def self.included(base)
15+
base.send(:prepend, InstanceMethods)
16+
end
17+
18+
# Instance methods for Presto::Client
19+
module InstanceMethods
20+
def run(query)
21+
datadog_pin.tracer.trace(Ext::SPAN_QUERY) do |span|
22+
decorate!(span)
23+
super(query)
24+
end
25+
end
26+
27+
def query(query, &blk)
28+
datadog_pin.tracer.trace(Ext::SPAN_QUERY) do |span|
29+
decorate!(span)
30+
super(query, &blk)
31+
end
32+
end
33+
34+
def kill(query_id)
35+
datadog_pin.tracer.trace(Ext::SPAN_KILL) do |span|
36+
decorate!(span)
37+
super(query_id)
38+
end
39+
end
40+
41+
private
42+
43+
def decorate!(span)
44+
span.service = datadog_pin.service
45+
span.span_type = Datadog::Ext::SQL::TYPE
46+
47+
span.set_tag(Ext::TAG_SCHEMA_NAME, @options[:schema])
48+
span.set_tag(Ext::TAG_CATALOG_NAME, @options[:catalog])
49+
span.set_tag(Ext::TAG_USER_NAME, @options[:user])
50+
span.set_tag(Ext::TAG_TIME_ZONE, @options[:time_zone])
51+
span.set_tag(Ext::TAG_LANGUAGE, @options[:language])
52+
span.set_tag(Ext::TAG_PROXY, @options[:http_proxy])
53+
span.set_tag(Ext::TAG_MODEL_VERSION, @options[:model_version])
54+
span.set_tag(Datadog::Ext::NET::TARGET_HOST, @options[:server])
55+
end
56+
57+
def datadog_pin
58+
@datadog_pin ||= Datadog::Pin.new(
59+
Datadog.configuration[:presto][:service_name],
60+
app: Ext::APP,
61+
app_type: Datadog::Ext::AppTypes::DB,
62+
tracer: Datadog.configuration[:presto][:tracer]
63+
)
64+
end
65+
end
66+
end
67+
end
68+
end
69+
end
70+
end
+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
require 'ddtrace/contrib/integration'
2+
require 'ddtrace/contrib/presto/configuration/settings'
3+
require 'ddtrace/contrib/presto/patcher'
4+
5+
module Datadog
6+
module Contrib
7+
module Presto
8+
# Description of Presto integration
9+
class Integration
10+
include Contrib::Integration
11+
12+
register_as :presto
13+
14+
def self.version
15+
Gem.loaded_specs['presto-client'] && Gem.loaded_specs['presto-client'].version
16+
end
17+
18+
def self.present?
19+
super && defined?(::Presto::Client::Client)
20+
end
21+
22+
def default_configuration
23+
Configuration::Settings.new
24+
end
25+
26+
def patcher
27+
Patcher
28+
end
29+
end
30+
end
31+
end
32+
end

lib/ddtrace/contrib/presto/patcher.rb

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
require 'ddtrace/contrib/patcher'
2+
require 'ddtrace/contrib/presto/ext'
3+
require 'ddtrace/contrib/presto/instrumentation'
4+
5+
module Datadog
6+
module Contrib
7+
module Presto
8+
# Patcher enables patching of 'presto-client' module.
9+
module Patcher
10+
include Contrib::Patcher
11+
12+
module_function
13+
14+
def patched?
15+
done?(:presto)
16+
end
17+
18+
def patch
19+
do_once(:presto) do
20+
begin
21+
::Presto::Client::Client.send(:include, Instrumentation::Client)
22+
rescue StandardError => e
23+
Datadog::Tracer.log.error("Unable to apply Presto integration: #{e}")
24+
end
25+
end
26+
end
27+
end
28+
end
29+
end
30+
end

0 commit comments

Comments
 (0)