From 3753e43414dcbdd26300eb40c80a0eba3b0eff59 Mon Sep 17 00:00:00 2001 From: Marco Costa Date: Thu, 23 Jan 2020 17:28:02 -0500 Subject: [PATCH 1/3] Tag spans from external services --- .../contrib/active_record/events/sql.rb | 4 ++ lib/ddtrace/contrib/aws/instrumentation.rb | 4 ++ lib/ddtrace/contrib/dalli/instrumentation.rb | 4 ++ lib/ddtrace/contrib/elasticsearch/patcher.rb | 4 ++ lib/ddtrace/contrib/ethon/easy_patch.rb | 4 ++ lib/ddtrace/contrib/ethon/multi_patch.rb | 4 ++ lib/ddtrace/contrib/excon/middleware.rb | 4 ++ lib/ddtrace/contrib/faraday/middleware.rb | 4 ++ .../grpc/datadog_interceptor/client.rb | 4 ++ .../grpc/datadog_interceptor/server.rb | 4 ++ lib/ddtrace/contrib/http/instrumentation.rb | 4 ++ lib/ddtrace/contrib/mongodb/subscribers.rb | 4 ++ lib/ddtrace/contrib/mysql2/instrumentation.rb | 4 ++ lib/ddtrace/contrib/racecar/event.rb | 4 ++ lib/ddtrace/contrib/redis/tags.rb | 4 ++ .../contrib/rest_client/request_patch.rb | 4 ++ lib/ddtrace/contrib/sequel/database.rb | 2 +- lib/ddtrace/contrib/sequel/dataset.rb | 2 +- lib/ddtrace/contrib/sequel/utils.rb | 8 +++- lib/ddtrace/ext/integration.rb | 8 ++++ .../contrib/active_record/multi_db_spec.rb | 25 +++++++++++ .../contrib/active_record/tracer_spec.rb | 3 ++ .../contrib/aws/instrumentation_spec.rb | 3 ++ .../contrib/dalli/instrumentation_spec.rb | 5 +++ .../contrib/elasticsearch/patcher_spec.rb | 7 ++++ .../contrib/elasticsearch/transport_spec.rb | 5 +++ spec/ddtrace/contrib/ethon/shared_examples.rb | 3 ++ .../contrib/excon/instrumentation_spec.rb | 23 ++++++++++- .../contrib/faraday/middleware_spec.rb | 25 ++++++++++- .../grpc/datadog_interceptor/client_spec.rb | 5 +++ .../grpc/datadog_interceptor/server_spec.rb | 3 ++ spec/ddtrace/contrib/grpc/integration_spec.rb | 1 + .../contrib/grpc/interception_context_spec.rb | 7 ++++ spec/ddtrace/contrib/http/miniapp_spec.rb | 2 + spec/ddtrace/contrib/http/patcher_spec.rb | 19 +++++++-- spec/ddtrace/contrib/http/request_spec.rb | 11 +++++ spec/ddtrace/contrib/integration_examples.rb | 10 +++++ spec/ddtrace/contrib/mongodb/client_spec.rb | 9 +++- spec/ddtrace/contrib/mysql2/patcher_spec.rb | 3 ++ spec/ddtrace/contrib/rails/database_spec.rb | 9 +++- .../ddtrace/contrib/rails/redis_cache_spec.rb | 13 ++++++ spec/ddtrace/contrib/redis/miniapp_spec.rb | 9 ++++ spec/ddtrace/contrib/redis/redis_spec.rb | 9 ++++ .../contrib/rest_client/request_patch_spec.rb | 5 +++ .../contrib/sequel/configuration_spec.rb | 41 +++++++++++++------ .../contrib/sequel/instrumentation_spec.rb | 3 ++ 46 files changed, 317 insertions(+), 25 deletions(-) create mode 100644 lib/ddtrace/ext/integration.rb create mode 100644 spec/ddtrace/contrib/integration_examples.rb diff --git a/lib/ddtrace/contrib/active_record/events/sql.rb b/lib/ddtrace/contrib/active_record/events/sql.rb index cdff8e08e15..a626cb8f871 100644 --- a/lib/ddtrace/contrib/active_record/events/sql.rb +++ b/lib/ddtrace/contrib/active_record/events/sql.rb @@ -1,3 +1,4 @@ +require 'ddtrace/ext/integration' require 'ddtrace/ext/net' require 'ddtrace/contrib/analytics' require 'ddtrace/contrib/active_record/ext' @@ -39,6 +40,9 @@ def process(span, event, _id, payload) span.resource = payload.fetch(:sql) span.span_type = Datadog::Ext::SQL::TYPE + # Tag as an external peer service + span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service) + # Set analytics sample rate if Contrib::Analytics.enabled?(configuration[:analytics_enabled]) Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate]) diff --git a/lib/ddtrace/contrib/aws/instrumentation.rb b/lib/ddtrace/contrib/aws/instrumentation.rb index 0dee60c8363..2f923c8ab6f 100644 --- a/lib/ddtrace/contrib/aws/instrumentation.rb +++ b/lib/ddtrace/contrib/aws/instrumentation.rb @@ -1,5 +1,6 @@ require 'ddtrace/contrib/analytics' require 'ddtrace/contrib/aws/ext' +require 'ddtrace/ext/integration' module Datadog module Contrib @@ -29,6 +30,9 @@ def annotate!(span, context) span.name = Ext::SPAN_COMMAND span.resource = context.safely(:resource) + # Tag as an external peer service + span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service) + # Set analytics sample rate if Contrib::Analytics.enabled?(configuration[:analytics_enabled]) Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate]) diff --git a/lib/ddtrace/contrib/dalli/instrumentation.rb b/lib/ddtrace/contrib/dalli/instrumentation.rb index 9a43fdfe3ef..67ce0c9aa2a 100644 --- a/lib/ddtrace/contrib/dalli/instrumentation.rb +++ b/lib/ddtrace/contrib/dalli/instrumentation.rb @@ -1,3 +1,4 @@ +require 'ddtrace/ext/integration' require 'ddtrace/ext/net' require 'ddtrace/contrib/analytics' require 'ddtrace/contrib/dalli/ext' @@ -20,6 +21,9 @@ def request(op, *args) span.service = datadog_configuration[:service_name] span.span_type = Datadog::Contrib::Dalli::Ext::SPAN_TYPE_COMMAND + # Tag as an external peer service + span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service) + # Set analytics sample rate if Contrib::Analytics.enabled?(datadog_configuration[:analytics_enabled]) Contrib::Analytics.set_sample_rate(span, datadog_configuration[:analytics_sample_rate]) diff --git a/lib/ddtrace/contrib/elasticsearch/patcher.rb b/lib/ddtrace/contrib/elasticsearch/patcher.rb index 620f969ab91..9355029f2b1 100644 --- a/lib/ddtrace/contrib/elasticsearch/patcher.rb +++ b/lib/ddtrace/contrib/elasticsearch/patcher.rb @@ -1,5 +1,6 @@ require 'ddtrace/contrib/patcher' require 'ddtrace/ext/app_types' +require 'ddtrace/ext/integration' require 'ddtrace/ext/net' require 'ddtrace/contrib/analytics' require 'ddtrace/contrib/elasticsearch/ext' @@ -78,6 +79,9 @@ def perform_request(*args) params = JSON.generate(params) if params && !params.is_a?(String) body = JSON.generate(body) if body && !body.is_a?(String) + # Tag as an external peer service + span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service) + # Set analytics sample rate if Contrib::Analytics.enabled?(datadog_configuration[:analytics_enabled]) Contrib::Analytics.set_sample_rate(span, datadog_configuration[:analytics_sample_rate]) diff --git a/lib/ddtrace/contrib/ethon/easy_patch.rb b/lib/ddtrace/contrib/ethon/easy_patch.rb index 13ffae9c29b..5595b92293d 100644 --- a/lib/ddtrace/contrib/ethon/easy_patch.rb +++ b/lib/ddtrace/contrib/ethon/easy_patch.rb @@ -1,5 +1,6 @@ require 'ddtrace/ext/net' require 'ddtrace/ext/distributed' +require 'ddtrace/ext/integration' require 'ddtrace/propagation/http_propagator' require 'ddtrace/contrib/ethon/ext' @@ -100,6 +101,9 @@ def datadog_tag_request end span.resource = method + # Tag as an external peer service + span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service) + # Set analytics sample rate Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled? diff --git a/lib/ddtrace/contrib/ethon/multi_patch.rb b/lib/ddtrace/contrib/ethon/multi_patch.rb index 4745984e820..7b9be2acd10 100644 --- a/lib/ddtrace/contrib/ethon/multi_patch.rb +++ b/lib/ddtrace/contrib/ethon/multi_patch.rb @@ -1,5 +1,6 @@ require 'ddtrace/ext/net' require 'ddtrace/ext/distributed' +require 'ddtrace/ext/integration' require 'ddtrace/propagation/http_propagator' require 'ddtrace/contrib/ethon/ext' @@ -52,6 +53,9 @@ def datadog_multi_span service: datadog_configuration[:service_name] ) + # Tag as an external peer service + @datadog_multi_span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, @datadog_multi_span.service) + # Set analytics sample rate Contrib::Analytics.set_sample_rate(@datadog_multi_span, analytics_sample_rate) if analytics_enabled? diff --git a/lib/ddtrace/contrib/excon/middleware.rb b/lib/ddtrace/contrib/excon/middleware.rb index 25b81b3b44f..64dacd11218 100644 --- a/lib/ddtrace/contrib/excon/middleware.rb +++ b/lib/ddtrace/contrib/excon/middleware.rb @@ -1,5 +1,6 @@ require 'excon' require 'ddtrace/ext/http' +require 'ddtrace/ext/integration' require 'ddtrace/ext/net' require 'ddtrace/ext/distributed' require 'ddtrace/propagation/http_propagator' @@ -108,6 +109,9 @@ def annotate!(span, datum) span.service = service_name(datum) span.span_type = Datadog::Ext::HTTP::TYPE_OUTBOUND + # Tag as an external peer service + span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service) + # Set analytics sample rate if analytics_enabled? Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) diff --git a/lib/ddtrace/contrib/faraday/middleware.rb b/lib/ddtrace/contrib/faraday/middleware.rb index cf4368b04cd..3be3a40313b 100644 --- a/lib/ddtrace/contrib/faraday/middleware.rb +++ b/lib/ddtrace/contrib/faraday/middleware.rb @@ -1,5 +1,6 @@ require 'faraday' require 'ddtrace/ext/http' +require 'ddtrace/ext/integration' require 'ddtrace/ext/net' require 'ddtrace/propagation/http_propagator' require 'ddtrace/contrib/analytics' @@ -35,6 +36,9 @@ def annotate!(span, env) span.service = service_name(env) span.span_type = Datadog::Ext::HTTP::TYPE_OUTBOUND + # Tag as an external peer service + span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service) + # Set analytics sample rate if analytics_enabled? Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) diff --git a/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb b/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb index 7fefa2496ad..66873d38659 100644 --- a/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +++ b/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb @@ -1,4 +1,5 @@ require 'ddtrace/ext/http' +require 'ddtrace/ext/integration' require 'ddtrace/contrib/analytics' require 'ddtrace/contrib/grpc/ext' @@ -34,6 +35,9 @@ def annotate!(span, metadata) span.set_tag(header, value) end + # Tag as an external peer service + span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service) + # Set analytics sample rate Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled? diff --git a/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb b/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb index 1139063a289..e00ff7bb581 100644 --- a/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +++ b/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb @@ -1,4 +1,5 @@ require 'ddtrace/ext/http' +require 'ddtrace/ext/integration' require 'ddtrace/contrib/analytics' require 'ddtrace/contrib/grpc/ext' @@ -46,6 +47,9 @@ def annotate!(span, metadata) span.set_tag(header, value) end + # Tag as an external peer service + span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service) + # Set analytics sample rate Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled? rescue StandardError => e diff --git a/lib/ddtrace/contrib/http/instrumentation.rb b/lib/ddtrace/contrib/http/instrumentation.rb index 0a05ff9d4ca..0375284c6c6 100644 --- a/lib/ddtrace/contrib/http/instrumentation.rb +++ b/lib/ddtrace/contrib/http/instrumentation.rb @@ -2,6 +2,7 @@ require 'ddtrace/pin' require 'ddtrace/ext/app_types' require 'ddtrace/ext/http' +require 'ddtrace/ext/integration' require 'ddtrace/ext/net' require 'ddtrace/ext/distributed' require 'ddtrace/contrib/analytics' @@ -78,6 +79,9 @@ def annotate_span_with_request!(span, request) span.set_tag(Datadog::Ext::NET::TARGET_PORT, @port.to_s) end + # Tag as an external peer service + span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service) + # Set analytics sample rate Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled? end diff --git a/lib/ddtrace/contrib/mongodb/subscribers.rb b/lib/ddtrace/contrib/mongodb/subscribers.rb index 1eed5c98b96..84ef40b785d 100644 --- a/lib/ddtrace/contrib/mongodb/subscribers.rb +++ b/lib/ddtrace/contrib/mongodb/subscribers.rb @@ -1,6 +1,7 @@ require 'ddtrace/contrib/analytics' require 'ddtrace/contrib/mongodb/ext' require 'ddtrace/contrib/mongodb/parsers' +require 'ddtrace/ext/integration' module Datadog module Contrib @@ -24,6 +25,9 @@ def started(event) query = MongoDB.query_builder(event.command_name, event.database_name, event.command) serialized_query = query.to_s + # Tag as an external peer service + span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service) + # Set analytics sample rate if analytics_enabled? Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) diff --git a/lib/ddtrace/contrib/mysql2/instrumentation.rb b/lib/ddtrace/contrib/mysql2/instrumentation.rb index d3e391c3cd1..346fedcfe31 100644 --- a/lib/ddtrace/contrib/mysql2/instrumentation.rb +++ b/lib/ddtrace/contrib/mysql2/instrumentation.rb @@ -1,4 +1,5 @@ require 'ddtrace/ext/app_types' +require 'ddtrace/ext/integration' require 'ddtrace/ext/net' require 'ddtrace/ext/sql' require 'ddtrace/contrib/analytics' @@ -21,6 +22,9 @@ def query(sql, options = {}) span.service = datadog_pin.service span.span_type = Datadog::Ext::SQL::TYPE + # Tag as an external peer service + span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service) + # Set analytics sample rate Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled? diff --git a/lib/ddtrace/contrib/racecar/event.rb b/lib/ddtrace/contrib/racecar/event.rb index 502844c8660..ba31e5259de 100644 --- a/lib/ddtrace/contrib/racecar/event.rb +++ b/lib/ddtrace/contrib/racecar/event.rb @@ -1,6 +1,7 @@ require 'ddtrace/contrib/analytics' require 'ddtrace/contrib/active_support/notifications/event' require 'ddtrace/contrib/racecar/ext' +require 'ddtrace/ext/integration' module Datadog module Contrib @@ -37,6 +38,9 @@ def process(span, event, _id, payload) span.service = configuration[:service_name] span.resource = payload[:consumer_class] + # Tag as an external peer service + span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service) + # Set analytics sample rate if Contrib::Analytics.enabled?(configuration[:analytics_enabled]) Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate]) diff --git a/lib/ddtrace/contrib/redis/tags.rb b/lib/ddtrace/contrib/redis/tags.rb index 9856a391798..8911b31690f 100644 --- a/lib/ddtrace/contrib/redis/tags.rb +++ b/lib/ddtrace/contrib/redis/tags.rb @@ -1,3 +1,4 @@ +require 'ddtrace/ext/integration' require 'ddtrace/ext/net' require 'ddtrace/contrib/analytics' require 'ddtrace/contrib/redis/ext' @@ -9,6 +10,9 @@ module Redis module Tags class << self def set_common_tags(client, span) + # Tag as an external peer service + span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service) + # Set analytics sample rate Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled? diff --git a/lib/ddtrace/contrib/rest_client/request_patch.rb b/lib/ddtrace/contrib/rest_client/request_patch.rb index a2429464664..7a345a394dc 100644 --- a/lib/ddtrace/contrib/rest_client/request_patch.rb +++ b/lib/ddtrace/contrib/rest_client/request_patch.rb @@ -1,5 +1,6 @@ require 'ddtrace/ext/net' require 'ddtrace/ext/distributed' +require 'ddtrace/ext/integration' require 'ddtrace/propagation/http_propagator' require 'ddtrace/contrib/rest_client/ext' @@ -31,6 +32,9 @@ def execute(&block) def datadog_tag_request(uri, span) span.resource = method.to_s.upcase + # Tag as an external peer service + span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service) + # Set analytics sample rate Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled? diff --git a/lib/ddtrace/contrib/sequel/database.rb b/lib/ddtrace/contrib/sequel/database.rb index df3b59821af..e7e12a6bd40 100644 --- a/lib/ddtrace/contrib/sequel/database.rb +++ b/lib/ddtrace/contrib/sequel/database.rb @@ -24,7 +24,7 @@ def run(sql, options = ::Sequel::OPTS) span.service = datadog_pin.service span.resource = opts[:query] span.span_type = Datadog::Ext::SQL::TYPE - Utils.set_analytics_sample_rate(span) + Utils.set_common_tags(span) span.set_tag(Ext::TAG_DB_VENDOR, adapter_name) response = super(sql, options) end diff --git a/lib/ddtrace/contrib/sequel/dataset.rb b/lib/ddtrace/contrib/sequel/dataset.rb index f4f52dd86f6..991671bf67e 100644 --- a/lib/ddtrace/contrib/sequel/dataset.rb +++ b/lib/ddtrace/contrib/sequel/dataset.rb @@ -45,7 +45,7 @@ def trace_execute(super_method, sql, options, &block) span.service = datadog_pin.service span.resource = opts[:query] span.span_type = Datadog::Ext::SQL::TYPE - Utils.set_analytics_sample_rate(span) + Utils.set_common_tags(span) span.set_tag(Ext::TAG_DB_VENDOR, adapter_name) response = super_method.call(sql, options, &block) end diff --git a/lib/ddtrace/contrib/sequel/utils.rb b/lib/ddtrace/contrib/sequel/utils.rb index 30554263e68..a0b3f2372f8 100644 --- a/lib/ddtrace/contrib/sequel/utils.rb +++ b/lib/ddtrace/contrib/sequel/utils.rb @@ -1,3 +1,5 @@ +require 'ddtrace/ext/integration' + module Datadog module Contrib module Sequel @@ -22,7 +24,11 @@ def parse_opts(sql, opts, db_opts) } end - def set_analytics_sample_rate(span) + def set_common_tags(span) + # Tag as an external peer service + span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service) + + # Set analytics sample rate Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled? end diff --git a/lib/ddtrace/ext/integration.rb b/lib/ddtrace/ext/integration.rb new file mode 100644 index 00000000000..61a98593ae5 --- /dev/null +++ b/lib/ddtrace/ext/integration.rb @@ -0,0 +1,8 @@ +module Datadog + module Ext + module Integration + # Name of external service that performed the work + TAG_PEER_SERVICE = 'peer.service'.freeze + end + end +end diff --git a/spec/ddtrace/contrib/active_record/multi_db_spec.rb b/spec/ddtrace/contrib/active_record/multi_db_spec.rb index 17f92954663..0be079f5af2 100644 --- a/spec/ddtrace/contrib/active_record/multi_db_spec.rb +++ b/spec/ddtrace/contrib/active_record/multi_db_spec.rb @@ -1,5 +1,6 @@ require 'spec_helper' require 'ddtrace' +require 'ddtrace/contrib/integration_examples' require 'active_record' require 'mysql2' @@ -170,6 +171,14 @@ def mysql_connection_string # Widget isn't, ends up assigned to the default database service expect(widget_span.service).to eq(default_db_service_name) end + + it_behaves_like 'a peer service span' do + let(:span) { gadget_span } + end + + it_behaves_like 'a peer service span' do + let(:span) { widget_span } + end end context 'for an in-memory database' do @@ -188,6 +197,14 @@ def mysql_connection_string # Widget belongs to its own database expect(widget_span.service).to eq(widget_db_service_name) end + + it_behaves_like 'a peer service span' do + let(:span) { gadget_span } + end + + it_behaves_like 'a peer service span' do + let(:span) { widget_span } + end end end @@ -209,6 +226,14 @@ def mysql_connection_string # Widget belongs to its own database expect(widget_span.service).to eq(widget_db_service_name) end + + it_behaves_like 'a peer service span' do + let(:span) { gadget_span } + end + + it_behaves_like 'a peer service span' do + let(:span) { widget_span } + end end end end diff --git a/spec/ddtrace/contrib/active_record/tracer_spec.rb b/spec/ddtrace/contrib/active_record/tracer_spec.rb index ef9dc97f29f..cf4610fb97a 100644 --- a/spec/ddtrace/contrib/active_record/tracer_spec.rb +++ b/spec/ddtrace/contrib/active_record/tracer_spec.rb @@ -1,5 +1,6 @@ require 'spec_helper' require 'ddtrace/contrib/analytics_examples' +require 'ddtrace/contrib/integration_examples' require 'ddtrace' require_relative 'app' @@ -38,6 +39,8 @@ let(:analytics_sample_rate_var) { Datadog::Contrib::ActiveRecord::Ext::ENV_ANALYTICS_SAMPLE_RATE } end + it_behaves_like 'a peer service span' + it 'calls the instrumentation when is used standalone' do # expect service and trace is sent expect(spans.size).to eq(1) diff --git a/spec/ddtrace/contrib/aws/instrumentation_spec.rb b/spec/ddtrace/contrib/aws/instrumentation_spec.rb index 2eeacade20f..b5e93d47af2 100644 --- a/spec/ddtrace/contrib/aws/instrumentation_spec.rb +++ b/spec/ddtrace/contrib/aws/instrumentation_spec.rb @@ -1,5 +1,6 @@ require 'spec_helper' require 'ddtrace/contrib/analytics_examples' +require 'ddtrace/contrib/integration_examples' require 'aws-sdk' require 'ddtrace' @@ -57,6 +58,8 @@ expect(span.get_tag('http.status_code')).to eq('200') end + it_behaves_like 'a peer service span' + it 'returns the correct response' do expect(list_buckets.buckets.map(&:name)).to eq(['bucket1']) end diff --git a/spec/ddtrace/contrib/dalli/instrumentation_spec.rb b/spec/ddtrace/contrib/dalli/instrumentation_spec.rb index 6c8b7e5f5cc..18f22ca40fa 100644 --- a/spec/ddtrace/contrib/dalli/instrumentation_spec.rb +++ b/spec/ddtrace/contrib/dalli/instrumentation_spec.rb @@ -1,5 +1,6 @@ require 'spec_helper' require 'ddtrace/contrib/analytics_examples' +require 'ddtrace/contrib/integration_examples' require 'dalli' require 'ddtrace' @@ -54,6 +55,8 @@ def all_spans expect(span.get_tag('out.host')).to eq(test_host) expect(span.get_tag('out.port')).to eq(test_port.to_f) end + + it_behaves_like 'a peer service span' end describe 'when multiplexed configuration is provided' do @@ -81,6 +84,8 @@ def all_spans expect(span.get_tag('out.host')).to eq(test_host) expect(span.get_tag('out.port')).to eq(test_port.to_f) end + + it_behaves_like 'a peer service span' end end end diff --git a/spec/ddtrace/contrib/elasticsearch/patcher_spec.rb b/spec/ddtrace/contrib/elasticsearch/patcher_spec.rb index 0386dae1209..45cc9659659 100644 --- a/spec/ddtrace/contrib/elasticsearch/patcher_spec.rb +++ b/spec/ddtrace/contrib/elasticsearch/patcher_spec.rb @@ -1,5 +1,6 @@ require 'spec_helper' require 'ddtrace/contrib/analytics_examples' +require 'ddtrace/contrib/integration_examples' require 'ddtrace' require 'elasticsearch-transport' @@ -69,6 +70,8 @@ it { expect(span.span_type).to eq('elasticsearch') } it { expect(span.parent_id).not_to be_nil } it { expect(span.trace_id).not_to be_nil } + + it_behaves_like 'a peer service span' end describe 'health request span' do @@ -84,6 +87,8 @@ it { expect(span.span_type).to eq('elasticsearch') } it { expect(span.parent_id).not_to be_nil } it { expect(span.trace_id).not_to be_nil } + + it_behaves_like 'a peer service span' end end @@ -132,6 +137,8 @@ expect(span.get_tag('elasticsearch.body')) .to eq('{"field":"?","nested_object":{"value":"?"},"nested_array":["?"],"nested_object_array":[{"a":"?"},"?"]}') end + + it_behaves_like 'a peer service span' end end end diff --git a/spec/ddtrace/contrib/elasticsearch/transport_spec.rb b/spec/ddtrace/contrib/elasticsearch/transport_spec.rb index 1040c8ce93d..e5ef9fc9c97 100644 --- a/spec/ddtrace/contrib/elasticsearch/transport_spec.rb +++ b/spec/ddtrace/contrib/elasticsearch/transport_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'spec_helper' require 'time' require 'elasticsearch-transport' @@ -88,6 +89,8 @@ def call(env) expect(span.get_tag('out.host')).to eq(host) expect(span.get_tag('out.port')).to eq(port) end + + it_behaves_like 'a peer service span' end context 'PUT request' do @@ -117,6 +120,8 @@ def call(env) expect(span.get_tag('out.host')).to eq(host) expect(span.get_tag('out.port')).to eq(port) end + + it_behaves_like 'a peer service span' end context 'with Hash params' do diff --git a/spec/ddtrace/contrib/ethon/shared_examples.rb b/spec/ddtrace/contrib/ethon/shared_examples.rb index 386e76ec670..61c70452837 100644 --- a/spec/ddtrace/contrib/ethon/shared_examples.rb +++ b/spec/ddtrace/contrib/ethon/shared_examples.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'ddtrace/contrib/ethon/integration_context' RSpec.shared_examples_for 'span' do @@ -37,6 +38,8 @@ it 'has correct service name' do expect(span.service).to eq('ethon') end + + it_behaves_like 'a peer service span' end RSpec.shared_examples_for 'instrumented request' do diff --git a/spec/ddtrace/contrib/excon/instrumentation_spec.rb b/spec/ddtrace/contrib/excon/instrumentation_spec.rb index e9c8c6267b2..e28531d8935 100644 --- a/spec/ddtrace/contrib/excon/instrumentation_spec.rb +++ b/spec/ddtrace/contrib/excon/instrumentation_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'spec_helper' require 'ddtrace/contrib/analytics_examples' @@ -98,6 +99,8 @@ expect(request_span.span_type).to eq(Datadog::Ext::HTTP::TYPE_OUTBOUND) expect(request_span).to_not have_error end + + it_behaves_like 'a peer service span' end context 'when there is a failing request' do @@ -117,6 +120,8 @@ expect(request_span).to have_error_type('Error 500') expect(request_span).to have_error_message('Boom!') end + + it_behaves_like 'a peer service span' end context 'when the path is not found' do @@ -161,6 +166,8 @@ expect(request_span.service).to eq('example.com') expect(request_span.resource).to eq('GET') end + + it_behaves_like 'a peer service span' end context 'default request headers' do @@ -240,6 +247,7 @@ end context 'global service name' do + subject(:get) { connection.get(path: '/success') } let(:service_name) { 'excon-global' } before(:each) do @@ -250,10 +258,13 @@ after(:each) { Datadog.configure { |c| c.use :excon, service_name: @old_service_name } } it do - Excon.stub({ method: :get, path: '/success' }, body: 'OK', status: 200) - connection.get(path: '/success') + subject expect(request_span.service).to eq(service_name) end + + it_behaves_like 'a peer service span' do + let(:span) { request_span } + end end context 'service name per request' do @@ -268,12 +279,20 @@ include_context 'connection with default middleware' let(:service_name) { 'request-with-default' } it { expect(request_span.service).to eq(service_name) } + + it_behaves_like 'a peer service span' do + let(:span) { request_span } + end end context 'with custom middleware' do include_context 'connection with custom middleware' let(:service_name) { 'request-with-custom' } it { expect(request_span.service).to eq(service_name) } + + it_behaves_like 'a peer service span' do + let(:span) { request_span } + end end end end diff --git a/spec/ddtrace/contrib/faraday/middleware_spec.rb b/spec/ddtrace/contrib/faraday/middleware_spec.rb index a28f6d55e11..f66a6db99ad 100644 --- a/spec/ddtrace/contrib/faraday/middleware_spec.rb +++ b/spec/ddtrace/contrib/faraday/middleware_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'spec_helper' require 'ddtrace/contrib/analytics_examples' @@ -60,6 +61,8 @@ expect(request_span.span_type).to eq(Datadog::Ext::HTTP::TYPE_OUTBOUND) expect(request_span).to_not have_error end + + it_behaves_like 'a peer service span' end context 'when there is no interference' do @@ -94,6 +97,8 @@ expect(request_span.span_type).to eq(Datadog::Ext::HTTP::TYPE_OUTBOUND) expect(request_span).to_not have_error end + + it_behaves_like 'a peer service span' end context 'when there is a failing request' do @@ -113,6 +118,8 @@ expect(request_span).to have_error_type('Error 500') expect(request_span).to have_error_message('Boom!') end + + it_behaves_like 'a peer service span' end context 'with library error' do @@ -133,6 +140,10 @@ expect(request_span).to have_error_type('Faraday::ConnectionFailed') expect(request_span).to have_error_message(/Test error/) end + + it_behaves_like 'a peer service span' do + subject { client.get('/error') rescue nil } + end end context 'when there is a client error' do @@ -159,6 +170,8 @@ expect(request_span.service).to eq('example.com') expect(request_span.resource).to eq('GET') end + + it_behaves_like 'a peer service span' end context 'default request headers' do @@ -203,10 +216,16 @@ after(:each) { Datadog.configure { |c| c.use :faraday, service_name: @old_service_name } } + subject { client.get('/success') } + it do - client.get('/success') + subject expect(request_span.service).to eq(service_name) end + + it_behaves_like 'a peer service span' do + let(:span) { request_span } + end end context 'service name per request' do @@ -218,5 +237,9 @@ it do expect(request_span.service).to eq(service_name) end + + it_behaves_like 'a peer service span' do + let(:span) { request_span } + end end end diff --git a/spec/ddtrace/contrib/grpc/datadog_interceptor/client_spec.rb b/spec/ddtrace/contrib/grpc/datadog_interceptor/client_spec.rb index 7c87b0e2a32..4c5b6d82505 100644 --- a/spec/ddtrace/contrib/grpc/datadog_interceptor/client_spec.rb +++ b/spec/ddtrace/contrib/grpc/datadog_interceptor/client_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'spec_helper' require 'ddtrace/contrib/analytics_examples' @@ -46,10 +47,12 @@ default_client_interceptor.request_response(keywords) {} span = tracer.writer.spans.first expect(span.service).to eq 'rspec' + expect(span.get_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE)).to eq('rspec') configured_client_interceptor.request_response(keywords) {} span = tracer.writer.spans.first expect(span.service).to eq 'cepsr' + expect(span.get_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE)).to eq('cepsr') end end @@ -65,6 +68,8 @@ let(:analytics_enabled_var) { Datadog::Contrib::GRPC::Ext::ENV_ANALYTICS_ENABLED } let(:analytics_sample_rate_var) { Datadog::Contrib::GRPC::Ext::ENV_ANALYTICS_SAMPLE_RATE } end + + it_behaves_like 'a peer service span' end describe '#request_response' do diff --git a/spec/ddtrace/contrib/grpc/datadog_interceptor/server_spec.rb b/spec/ddtrace/contrib/grpc/datadog_interceptor/server_spec.rb index 3bc9e996d0b..856500c25b9 100644 --- a/spec/ddtrace/contrib/grpc/datadog_interceptor/server_spec.rb +++ b/spec/ddtrace/contrib/grpc/datadog_interceptor/server_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'spec_helper' require 'ddtrace/contrib/analytics_examples' @@ -36,6 +37,8 @@ let(:analytics_enabled_var) { Datadog::Contrib::GRPC::Ext::ENV_ANALYTICS_ENABLED } let(:analytics_sample_rate_var) { Datadog::Contrib::GRPC::Ext::ENV_ANALYTICS_SAMPLE_RATE } end + + it_behaves_like 'a peer service span' end describe '#request_response' do diff --git a/spec/ddtrace/contrib/grpc/integration_spec.rb b/spec/ddtrace/contrib/grpc/integration_spec.rb index 9862823db3a..aa8b0e5c6bf 100644 --- a/spec/ddtrace/contrib/grpc/integration_spec.rb +++ b/spec/ddtrace/contrib/grpc/integration_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'spec_helper' require_relative 'support/grpc_helper' require 'ddtrace' diff --git a/spec/ddtrace/contrib/grpc/interception_context_spec.rb b/spec/ddtrace/contrib/grpc/interception_context_spec.rb index d9a70f4b1e9..4cd40d97886 100644 --- a/spec/ddtrace/contrib/grpc/interception_context_spec.rb +++ b/spec/ddtrace/contrib/grpc/interception_context_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'spec_helper' require 'ddtrace/contrib/analytics_examples' @@ -40,6 +41,8 @@ let(:analytics_enabled_var) { Datadog::Contrib::GRPC::Ext::ENV_ANALYTICS_ENABLED } let(:analytics_sample_rate_var) { Datadog::Contrib::GRPC::Ext::ENV_ANALYTICS_SAMPLE_RATE } end + + it_behaves_like 'a peer service span' end context 'request response call type' do @@ -82,6 +85,8 @@ expect(span.get_tag('error.stack')).to be_nil expect(span.get_tag(:some)).to eq 'datum' end + + it_behaves_like 'a peer service span' end context 'bidirectional streaming call type' do @@ -110,6 +115,8 @@ let(:analytics_enabled_var) { Datadog::Contrib::GRPC::Ext::ENV_ANALYTICS_ENABLED } let(:analytics_sample_rate_var) { Datadog::Contrib::GRPC::Ext::ENV_ANALYTICS_SAMPLE_RATE } end + + it_behaves_like 'a peer service span' end context 'request response call type' do diff --git a/spec/ddtrace/contrib/http/miniapp_spec.rb b/spec/ddtrace/contrib/http/miniapp_spec.rb index 732ca015362..12822248c42 100644 --- a/spec/ddtrace/contrib/http/miniapp_spec.rb +++ b/spec/ddtrace/contrib/http/miniapp_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'spec_helper' require 'ddtrace' require 'net/http' @@ -59,6 +60,7 @@ http_spans.each do |span| expect(span.name).to eq('http.request') expect(span.service).to eq('net/http') + expect(span.get_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE)).to eq('net/http') expect(span.resource).to eq('GET') expect(span.get_tag('http.url')).to eq('/my/path') expect(span.get_tag('http.method')).to eq('GET') diff --git a/spec/ddtrace/contrib/http/patcher_spec.rb b/spec/ddtrace/contrib/http/patcher_spec.rb index 631c9fcca77..eb57268f916 100644 --- a/spec/ddtrace/contrib/http/patcher_spec.rb +++ b/spec/ddtrace/contrib/http/patcher_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'spec_helper' require 'ddtrace' require 'net/http' @@ -23,11 +24,16 @@ end describe 'with default configuration' do - it 'uses default service name' do - Net::HTTP.get(host, '/') + subject { Net::HTTP.get(host, '/') } + it 'uses default service name' do + subject expect(request_span.service).to eq('net/http') end + + it_behaves_like 'a peer service span' do + let(:span) { request_span } + end end describe 'with changed service name' do @@ -41,10 +47,15 @@ after(:each) { Datadog.configure { |c| c.use :http, service_name: Datadog::Contrib::HTTP::Ext::SERVICE_NAME } } - it 'uses new service name' do - Net::HTTP.get(host, '/') + subject { Net::HTTP.get(host, '/') } + it 'uses new service name' do + subject expect(request_span.service).to eq(new_service_name) end + + it_behaves_like 'a peer service span' do + let(:service) { request_span } + end end end diff --git a/spec/ddtrace/contrib/http/request_spec.rb b/spec/ddtrace/contrib/http/request_spec.rb index f064188b140..42b3408a1d4 100644 --- a/spec/ddtrace/contrib/http/request_spec.rb +++ b/spec/ddtrace/contrib/http/request_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'spec_helper' require 'ddtrace/contrib/analytics_examples' @@ -63,6 +64,8 @@ let(:analytics_sample_rate_var) { Datadog::Contrib::HTTP::Ext::ENV_ANALYTICS_SAMPLE_RATE } before(:each) { response } end + + it_behaves_like 'a peer service span' end context 'that returns 404' do @@ -86,6 +89,8 @@ expect(span.get_tag('error.msg')).to be nil end + it_behaves_like 'a peer service span' + context 'when configured with #after_request hook' do before(:each) { Datadog::Contrib::HTTP::Instrumentation.after_request(&callback) } after(:each) { Datadog::Contrib::HTTP::Instrumentation.instance_variable_set(:@after_request, nil) } @@ -148,6 +153,8 @@ expect(span.get_tag('out.port')).to eq(port.to_s) expect(span.status).to eq(0) end + + it_behaves_like 'a peer service span' end end @@ -178,6 +185,8 @@ expect(span.get_tag('out.port')).to eq(port.to_s) expect(span.status).to eq(0) end + + it_behaves_like 'a peer service span' end end @@ -200,6 +209,8 @@ expect(span.name).to eq('http.request') expect(span.service).to eq(service_name) end + + it_behaves_like 'a peer service span' end end diff --git a/spec/ddtrace/contrib/integration_examples.rb b/spec/ddtrace/contrib/integration_examples.rb new file mode 100644 index 00000000000..e9b9393fab5 --- /dev/null +++ b/spec/ddtrace/contrib/integration_examples.rb @@ -0,0 +1,10 @@ +RSpec.shared_examples 'a peer service span' do + before { subject } + + let(:peer_service) { span.service } + + it 'contains peer service tag' do + expect(span.get_tag('peer.service')).to_not be nil + expect(span.get_tag('peer.service')).to eq(peer_service) + end +end diff --git a/spec/ddtrace/contrib/mongodb/client_spec.rb b/spec/ddtrace/contrib/mongodb/client_spec.rb index 423850694a2..678add30738 100644 --- a/spec/ddtrace/contrib/mongodb/client_spec.rb +++ b/spec/ddtrace/contrib/mongodb/client_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'spec_helper' require 'ddtrace/contrib/analytics_examples' @@ -63,11 +64,15 @@ def suppress_warnings let(:service) { 'mongodb-primary' } before(:each) { Datadog.configure(client, service_name: service) } + subject { client[collection].insert_one(name: 'FKA Twigs') } + it 'produces spans with the correct service' do - client[collection].insert_one(name: 'FKA Twigs') + subject expect(spans).to have(1).items expect(spans.first.service).to eq(service) end + + it_behaves_like 'a peer service span' end context 'to disable the tracer' do @@ -98,6 +103,8 @@ def suppress_warnings let(:analytics_enabled_var) { Datadog::Contrib::MongoDB::Ext::ENV_ANALYTICS_ENABLED } let(:analytics_sample_rate_var) { Datadog::Contrib::MongoDB::Ext::ENV_ANALYTICS_SAMPLE_RATE } end + + it_behaves_like 'a peer service span' end # Expects every value (except for keys) to be quantized. diff --git a/spec/ddtrace/contrib/mysql2/patcher_spec.rb b/spec/ddtrace/contrib/mysql2/patcher_spec.rb index bd7649494f5..b760583ec25 100644 --- a/spec/ddtrace/contrib/mysql2/patcher_spec.rb +++ b/spec/ddtrace/contrib/mysql2/patcher_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'spec_helper' require 'ddtrace/contrib/analytics_examples' @@ -76,6 +77,8 @@ let(:analytics_enabled_var) { Datadog::Contrib::Mysql2::Ext::ENV_ANALYTICS_ENABLED } let(:analytics_sample_rate_var) { Datadog::Contrib::Mysql2::Ext::ENV_ANALYTICS_SAMPLE_RATE } end + + it_behaves_like 'a peer service span' end context 'when a failed query is made' do diff --git a/spec/ddtrace/contrib/rails/database_spec.rb b/spec/ddtrace/contrib/rails/database_spec.rb index d9a7e208bb2..a1d91cb3af7 100644 --- a/spec/ddtrace/contrib/rails/database_spec.rb +++ b/spec/ddtrace/contrib/rails/database_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'ddtrace/contrib/rails/rails_helper' RSpec.describe 'Rails database' do @@ -38,6 +39,8 @@ # ensure that the sql.query tag is not set expect(span.get_tag('sql.query')).to be_nil end + + it_behaves_like 'a peer service span' end context 'on record creation' do @@ -106,12 +109,14 @@ end context 'with custom database_service' do + subject(:query) { Article.count } let(:database_service) { 'customer-db' } it 'doing a database call uses the proper service name if it is changed' do - Article.count - + subject expect(span.service).to eq('customer-db') end + + it_behaves_like 'a peer service span' end end diff --git a/spec/ddtrace/contrib/rails/redis_cache_spec.rb b/spec/ddtrace/contrib/rails/redis_cache_spec.rb index 76d4796c75b..a30f12e755c 100644 --- a/spec/ddtrace/contrib/rails/redis_cache_spec.rb +++ b/spec/ddtrace/contrib/rails/redis_cache_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'ddtrace/contrib/rails/rails_helper' # It's important that there's *NO* "require 'redis-rails'" or @@ -74,6 +75,10 @@ expect(cache.trace_id).to eq(redis.trace_id) expect(cache.span_id).to eq(redis.parent_id) end + + it_behaves_like 'a peer service span' do + let(:span) { spans.last } + end end context '#read' do @@ -134,6 +139,10 @@ expect(cache.trace_id).to eq(redis.trace_id) expect(cache.span_id).to eq(redis.parent_id) end + + it_behaves_like 'a peer service span' do + let(:span) { spans.last } + end end context '#write' do @@ -154,6 +163,10 @@ expect(cache.trace_id).to eq(del.trace_id) expect(cache.span_id).to eq(del.parent_id) end + + it_behaves_like 'a peer service span' do + let(:span) { spans.last } + end end private diff --git a/spec/ddtrace/contrib/redis/miniapp_spec.rb b/spec/ddtrace/contrib/redis/miniapp_spec.rb index 33193812f51..759de84a4db 100644 --- a/spec/ddtrace/contrib/redis/miniapp_spec.rb +++ b/spec/ddtrace/contrib/redis/miniapp_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'spec_helper' require 'time' @@ -98,6 +99,14 @@ def all_spans expect(redis_cmd2_span.parent_id).to eq(process_span.span_id) expect(redis_cmd2_span.trace_id).to eq(publish_span.trace_id) end + + it_behaves_like 'a peer service span' do + let(:span) { redis_cmd1_span } + end + + it_behaves_like 'a peer service span' do + let(:span) { redis_cmd2_span } + end end end end diff --git a/spec/ddtrace/contrib/redis/redis_spec.rb b/spec/ddtrace/contrib/redis/redis_spec.rb index b686a9db29d..03af35b7004 100644 --- a/spec/ddtrace/contrib/redis/redis_spec.rb +++ b/spec/ddtrace/contrib/redis/redis_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'spec_helper' require 'ddtrace/contrib/analytics_examples' @@ -92,6 +93,7 @@ def all_spans end it_behaves_like 'a span with common tags' + it_behaves_like 'a peer service span' end describe 'get span' do @@ -105,6 +107,7 @@ def all_spans end it_behaves_like 'a span with common tags' + it_behaves_like 'a peer service span' end end @@ -155,6 +158,7 @@ def all_spans end it_behaves_like 'a span with common tags' + it_behaves_like 'a peer service span' end end @@ -186,6 +190,7 @@ def all_spans end it_behaves_like 'a span with common tags' + it_behaves_like 'a peer service span' end end @@ -204,6 +209,7 @@ def all_spans end it_behaves_like 'a span with common tags' + it_behaves_like 'a peer service span' end describe 'get span' do @@ -223,6 +229,7 @@ def all_spans end it_behaves_like 'a span with common tags' + it_behaves_like 'a peer service span' end describe 'auth span' do @@ -239,6 +246,8 @@ def all_spans expect(span.resource).to eq('AUTH ?') expect(span.get_tag('redis.raw_command')).to eq('AUTH ?') end + + it_behaves_like 'a peer service span' end end end diff --git a/spec/ddtrace/contrib/rest_client/request_patch_spec.rb b/spec/ddtrace/contrib/rest_client/request_patch_spec.rb index 0d257627483..553c24b3aef 100644 --- a/spec/ddtrace/contrib/rest_client/request_patch_spec.rb +++ b/spec/ddtrace/contrib/rest_client/request_patch_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'spec_helper' require 'ddtrace/contrib/analytics_examples' @@ -90,6 +91,8 @@ let(:analytics_enabled_var) { Datadog::Contrib::RestClient::Ext::ENV_ANALYTICS_ENABLED } let(:analytics_sample_rate_var) { Datadog::Contrib::RestClient::Ext::ENV_ANALYTICS_SAMPLE_RATE } end + + it_behaves_like 'a peer service span' end context 'response has internal server error status' do @@ -187,6 +190,8 @@ it 'has correct service name' do expect(span.service).to eq('rest_client') end + + it_behaves_like 'a peer service span' end end end diff --git a/spec/ddtrace/contrib/sequel/configuration_spec.rb b/spec/ddtrace/contrib/sequel/configuration_spec.rb index e1d95e4ec47..1c4ad23e747 100644 --- a/spec/ddtrace/contrib/sequel/configuration_spec.rb +++ b/spec/ddtrace/contrib/sequel/configuration_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'spec_helper' require 'time' @@ -28,48 +29,64 @@ def perform_query! end describe 'when configured' do + subject(:query) { perform_query! } after(:each) { Datadog.configuration[:sequel].reset! } context 'only with defaults' do - # Expect it to be the normalized adapter name. - it do - Datadog.configure { |c| c.use :sequel, tracer: tracer } - perform_query! + before { Datadog.configure { |c| c.use :sequel, tracer: tracer } } + + it 'normalizes adapter name' do + subject expect(span.service).to eq('sqlite') end + + it_behaves_like 'a peer service span' end context 'with options set via #use' do let(:service_name) { 'my-sequel' } + before { Datadog.configure { |c| c.use :sequel, tracer: tracer, service_name: service_name } } + it do - Datadog.configure { |c| c.use :sequel, tracer: tracer, service_name: service_name } - perform_query! + subject expect(span.service).to eq(service_name) end + + it_behaves_like 'a peer service span' end context 'with options set on Sequel::Database' do let(:service_name) { 'custom-sequel' } - it do + before do Datadog.configure { |c| c.use :sequel, tracer: tracer } Datadog.configure(sequel, service_name: service_name) - perform_query! + end + + it do + subject expect(span.service).to eq(service_name) end + + it_behaves_like 'a peer service span' end + # NOTE: This test really only works when run in isolation. + # It relies on Sequel not being patched, and there's + # no way to unpatch it once its happened in other tests. context 'after the database has been initialized' do - # NOTE: This test really only works when run in isolation. - # It relies on Sequel not being patched, and there's - # no way to unpatch it once its happened in other tests. - it do + before do sequel Datadog.configure { |c| c.use :sequel, tracer: tracer } perform_query! + end + + it do expect(span.service).to eq('sqlite') end + + it_behaves_like 'a peer service span' end end end diff --git a/spec/ddtrace/contrib/sequel/instrumentation_spec.rb b/spec/ddtrace/contrib/sequel/instrumentation_spec.rb index ce0d7c5d198..a3491a38dcb 100644 --- a/spec/ddtrace/contrib/sequel/instrumentation_spec.rb +++ b/spec/ddtrace/contrib/sequel/instrumentation_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'spec_helper' require 'ddtrace/contrib/analytics_examples' @@ -61,6 +62,8 @@ let(:analytics_enabled_var) { Datadog::Contrib::Sequel::Ext::ENV_ANALYTICS_ENABLED } let(:analytics_sample_rate_var) { Datadog::Contrib::Sequel::Ext::ENV_ANALYTICS_SAMPLE_RATE } end + + it_behaves_like 'a peer service span' end describe 'when queried through a Sequel::Dataset' do From e4e6cfd477d785406d97398af49cce6769203910 Mon Sep 17 00:00:00 2001 From: ericmustin Date: Tue, 8 Sep 2020 14:25:47 +0200 Subject: [PATCH 2/3] add new peer service to new integrations and clean up merge conflict issues --- lib/ddtrace/contrib/httprb/instrumentation.rb | 3 ++ lib/ddtrace/contrib/presto/instrumentation.rb | 3 ++ .../contrib/faraday/middleware_spec.rb | 8 ++--- .../grpc/datadog_interceptor/client_spec.rb | 4 +-- .../grpc/datadog_interceptor/server_spec.rb | 4 +-- .../contrib/httprb/instrumentation_spec.rb | 3 ++ spec/ddtrace/contrib/mongodb/client_spec.rb | 4 +-- spec/ddtrace/contrib/mysql2/patcher_spec.rb | 4 +-- spec/ddtrace/contrib/presto/client_spec.rb | 3 ++ .../contrib/rest_client/request_patch_spec.rb | 4 +-- .../contrib/sequel/configuration_spec.rb | 35 +++---------------- .../contrib/sequel/instrumentation_spec.rb | 4 +-- 12 files changed, 25 insertions(+), 54 deletions(-) diff --git a/lib/ddtrace/contrib/httprb/instrumentation.rb b/lib/ddtrace/contrib/httprb/instrumentation.rb index 90fdac5aab7..7354124852e 100644 --- a/lib/ddtrace/contrib/httprb/instrumentation.rb +++ b/lib/ddtrace/contrib/httprb/instrumentation.rb @@ -72,6 +72,9 @@ def annotate_span_with_request!(span, req, req_options) logger.debug("service #{req_options[:service_name]} span #{Ext::SPAN_REQUEST} missing uri") end + # Tag as an external peer service + span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service) + set_analytics_sample_rate(span, req_options) end diff --git a/lib/ddtrace/contrib/presto/instrumentation.rb b/lib/ddtrace/contrib/presto/instrumentation.rb index 3a4b4d9963a..f2e027a5bdf 100644 --- a/lib/ddtrace/contrib/presto/instrumentation.rb +++ b/lib/ddtrace/contrib/presto/instrumentation.rb @@ -90,6 +90,9 @@ def decorate!(span) set_nilable_tag!(span, :http_proxy, Ext::TAG_PROXY) set_nilable_tag!(span, :model_version, Ext::TAG_MODEL_VERSION) + # Tag as an external peer service + span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service) + # Set analytics sample rate if Contrib::Analytics.enabled?(datadog_configuration[:analytics_enabled]) Contrib::Analytics.set_sample_rate(span, datadog_configuration[:analytics_sample_rate]) diff --git a/spec/ddtrace/contrib/faraday/middleware_spec.rb b/spec/ddtrace/contrib/faraday/middleware_spec.rb index 94ded488ccb..0c18f17be91 100644 --- a/spec/ddtrace/contrib/faraday/middleware_spec.rb +++ b/spec/ddtrace/contrib/faraday/middleware_spec.rb @@ -60,9 +60,8 @@ expect(request_span).to_not have_error end -<<<<<<< HEAD it_behaves_like 'a peer service span' -======= + it 'executes without warnings' do expect { response }.to_not output(/WARNING/).to_stderr end @@ -99,7 +98,6 @@ expect { response }.to_not output(/WARNING/).to_stderr end end ->>>>>>> master end context 'when there is no interference' do @@ -211,9 +209,8 @@ expect(request_span.resource).to eq('GET') end -<<<<<<< HEAD it_behaves_like 'a peer service span' -======= + context 'and the host matches a specific configuration' do before do Datadog.configure do |c| @@ -229,7 +226,6 @@ expect(request_span.service).to eq('bar') end end ->>>>>>> master end context 'default request headers' do diff --git a/spec/ddtrace/contrib/grpc/datadog_interceptor/client_spec.rb b/spec/ddtrace/contrib/grpc/datadog_interceptor/client_spec.rb index 071180e3336..02e1016de30 100644 --- a/spec/ddtrace/contrib/grpc/datadog_interceptor/client_spec.rb +++ b/spec/ddtrace/contrib/grpc/datadog_interceptor/client_spec.rb @@ -68,11 +68,9 @@ let(:analytics_sample_rate_var) { Datadog::Contrib::GRPC::Ext::ENV_ANALYTICS_SAMPLE_RATE } end -<<<<<<< HEAD it_behaves_like 'a peer service span' -======= + it_behaves_like 'measured span for integration', false ->>>>>>> master end describe '#request_response' do diff --git a/spec/ddtrace/contrib/grpc/datadog_interceptor/server_spec.rb b/spec/ddtrace/contrib/grpc/datadog_interceptor/server_spec.rb index f527f15af6a..bcbf0651b1d 100644 --- a/spec/ddtrace/contrib/grpc/datadog_interceptor/server_spec.rb +++ b/spec/ddtrace/contrib/grpc/datadog_interceptor/server_spec.rb @@ -35,11 +35,9 @@ let(:analytics_sample_rate_var) { Datadog::Contrib::GRPC::Ext::ENV_ANALYTICS_SAMPLE_RATE } end -<<<<<<< HEAD it_behaves_like 'a peer service span' -======= + it_behaves_like 'measured span for integration', true ->>>>>>> master end describe '#request_response' do diff --git a/spec/ddtrace/contrib/httprb/instrumentation_spec.rb b/spec/ddtrace/contrib/httprb/instrumentation_spec.rb index 0ea9f166faf..a4743cab552 100644 --- a/spec/ddtrace/contrib/httprb/instrumentation_spec.rb +++ b/spec/ddtrace/contrib/httprb/instrumentation_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'ddtrace/contrib/support/spec_helper' require 'ddtrace/contrib/analytics_examples' require 'ddtrace' @@ -108,6 +109,8 @@ expect(span.service).to eq('httprb') end + it_behaves_like 'a peer service span' + it_behaves_like 'analytics for integration' do let(:analytics_enabled_var) { Datadog::Contrib::Httprb::Ext::ENV_ANALYTICS_ENABLED } let(:analytics_sample_rate_var) { Datadog::Contrib::Httprb::Ext::ENV_ANALYTICS_SAMPLE_RATE } diff --git a/spec/ddtrace/contrib/mongodb/client_spec.rb b/spec/ddtrace/contrib/mongodb/client_spec.rb index 5ff6629e860..85012e1700e 100644 --- a/spec/ddtrace/contrib/mongodb/client_spec.rb +++ b/spec/ddtrace/contrib/mongodb/client_spec.rb @@ -96,11 +96,9 @@ def suppress_warnings let(:analytics_sample_rate_var) { Datadog::Contrib::MongoDB::Ext::ENV_ANALYTICS_SAMPLE_RATE } end -<<<<<<< HEAD it_behaves_like 'a peer service span' -======= + it_behaves_like 'measured span for integration', false ->>>>>>> master end # Expects every value (except for keys) to be quantized. diff --git a/spec/ddtrace/contrib/mysql2/patcher_spec.rb b/spec/ddtrace/contrib/mysql2/patcher_spec.rb index 7e4cf3980fc..a98ce4fd706 100644 --- a/spec/ddtrace/contrib/mysql2/patcher_spec.rb +++ b/spec/ddtrace/contrib/mysql2/patcher_spec.rb @@ -74,11 +74,9 @@ let(:analytics_sample_rate_var) { Datadog::Contrib::Mysql2::Ext::ENV_ANALYTICS_SAMPLE_RATE } end -<<<<<<< HEAD it_behaves_like 'a peer service span' -======= + it_behaves_like 'measured span for integration', false ->>>>>>> master end context 'when a failed query is made' do diff --git a/spec/ddtrace/contrib/presto/client_spec.rb b/spec/ddtrace/contrib/presto/client_spec.rb index 61557a0f2b6..85a76b43c3b 100644 --- a/spec/ddtrace/contrib/presto/client_spec.rb +++ b/spec/ddtrace/contrib/presto/client_spec.rb @@ -1,3 +1,4 @@ +require 'ddtrace/contrib/integration_examples' require 'ddtrace/contrib/support/spec_helper' require 'ddtrace/contrib/analytics_examples' @@ -202,6 +203,8 @@ def suppress_warnings end it_behaves_like 'measured span for integration', false + + it_behaves_like 'a peer service span' end describe '#run operation' do diff --git a/spec/ddtrace/contrib/rest_client/request_patch_spec.rb b/spec/ddtrace/contrib/rest_client/request_patch_spec.rb index ed7ce383772..4b336bb04fa 100644 --- a/spec/ddtrace/contrib/rest_client/request_patch_spec.rb +++ b/spec/ddtrace/contrib/rest_client/request_patch_spec.rb @@ -89,11 +89,9 @@ let(:analytics_sample_rate_var) { Datadog::Contrib::RestClient::Ext::ENV_ANALYTICS_SAMPLE_RATE } end -<<<<<<< HEAD it_behaves_like 'a peer service span' -======= + it_behaves_like 'measured span for integration', false ->>>>>>> master end context 'response has internal server error status' do diff --git a/spec/ddtrace/contrib/sequel/configuration_spec.rb b/spec/ddtrace/contrib/sequel/configuration_spec.rb index fb9b3818ec7..55c4f15ce7a 100644 --- a/spec/ddtrace/contrib/sequel/configuration_spec.rb +++ b/spec/ddtrace/contrib/sequel/configuration_spec.rb @@ -35,21 +35,13 @@ def perform_query! end describe 'when configured' do - subject(:query) { perform_query! } after(:each) { Datadog.configuration[:sequel].reset! } context 'only with defaults' do -<<<<<<< HEAD - before { Datadog.configure { |c| c.use :sequel, tracer: tracer } } - - it 'normalizes adapter name' do - subject -======= # Expect it to be the normalized adapter name. it do Datadog.configure { |c| c.use :sequel } perform_query! ->>>>>>> master expect(span.service).to eq('sqlite') end @@ -59,15 +51,9 @@ def perform_query! context 'with options set via #use' do let(:service_name) { 'my-sequel' } - before { Datadog.configure { |c| c.use :sequel, tracer: tracer, service_name: service_name } } - it do -<<<<<<< HEAD - subject -======= Datadog.configure { |c| c.use :sequel, service_name: service_name } perform_query! ->>>>>>> master expect(span.service).to eq(service_name) end @@ -77,35 +63,24 @@ def perform_query! context 'with options set on Sequel::Database' do let(:service_name) { 'custom-sequel' } -<<<<<<< HEAD - before do - Datadog.configure { |c| c.use :sequel, tracer: tracer } -======= it do Datadog.configure { |c| c.use :sequel } ->>>>>>> master Datadog.configure(sequel, service_name: service_name) - end - - it do - subject + perform_query! expect(span.service).to eq(service_name) end it_behaves_like 'a peer service span' end - # NOTE: This test really only works when run in isolation. - # It relies on Sequel not being patched, and there's - # no way to unpatch it once its happened in other tests. context 'after the database has been initialized' do - before do + # NOTE: This test really only works when run in isolation. + # It relies on Sequel not being patched, and there's + # no way to unpatch it once its happened in other tests. + it do sequel Datadog.configure { |c| c.use :sequel } perform_query! - end - - it do expect(span.service).to eq('sqlite') end diff --git a/spec/ddtrace/contrib/sequel/instrumentation_spec.rb b/spec/ddtrace/contrib/sequel/instrumentation_spec.rb index f9f598292ac..bf93328babc 100644 --- a/spec/ddtrace/contrib/sequel/instrumentation_spec.rb +++ b/spec/ddtrace/contrib/sequel/instrumentation_spec.rb @@ -70,11 +70,9 @@ let(:analytics_sample_rate_var) { Datadog::Contrib::Sequel::Ext::ENV_ANALYTICS_SAMPLE_RATE } end -<<<<<<< HEAD it_behaves_like 'a peer service span' -======= + it_behaves_like 'measured span for integration', false ->>>>>>> master end describe 'when queried through a Sequel::Dataset' do From ecf4ca01b166d851fdfac21d6b61eb9ffc57ca53 Mon Sep 17 00:00:00 2001 From: ericmustin Date: Tue, 8 Sep 2020 15:15:10 +0200 Subject: [PATCH 3/3] fix tests for peer service and ruboocop --- lib/ddtrace/contrib/ethon/easy_patch.rb | 4 +--- .../contrib/excon/instrumentation_spec.rb | 4 +--- .../contrib/sequel/configuration_spec.rb | 21 +++++++++++++++---- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/lib/ddtrace/contrib/ethon/easy_patch.rb b/lib/ddtrace/contrib/ethon/easy_patch.rb index cfb740cc066..bb21dda4f5e 100644 --- a/lib/ddtrace/contrib/ethon/easy_patch.rb +++ b/lib/ddtrace/contrib/ethon/easy_patch.rb @@ -13,8 +13,8 @@ module EasyPatch def self.included(base) base.send(:prepend, InstanceMethods) end - # InstanceMethods - implementing instrumentation + # rubocop:disable Metrics/ModuleLength module InstanceMethods include Datadog::Contrib::HttpAnnotationHelper @@ -104,10 +104,8 @@ def datadog_tag_request method = @datadog_method.to_s end span.resource = method - # Tag as an external peer service span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service) - # Set analytics sample rate Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled? diff --git a/spec/ddtrace/contrib/excon/instrumentation_spec.rb b/spec/ddtrace/contrib/excon/instrumentation_spec.rb index 129f5810e33..1b7679402c9 100644 --- a/spec/ddtrace/contrib/excon/instrumentation_spec.rb +++ b/spec/ddtrace/contrib/excon/instrumentation_spec.rb @@ -168,9 +168,8 @@ expect(request_span.resource).to eq('GET') end -<<<<<<< HEAD it_behaves_like 'a peer service span' -======= + context 'and the host matches a specific configuration' do before do Datadog.configure do |c| @@ -186,7 +185,6 @@ expect(request_span.service).to eq('bar') end end ->>>>>>> master end context 'default request headers' do diff --git a/spec/ddtrace/contrib/sequel/configuration_spec.rb b/spec/ddtrace/contrib/sequel/configuration_spec.rb index 55c4f15ce7a..e08e18aa603 100644 --- a/spec/ddtrace/contrib/sequel/configuration_spec.rb +++ b/spec/ddtrace/contrib/sequel/configuration_spec.rb @@ -39,9 +39,12 @@ def perform_query! context 'only with defaults' do # Expect it to be the normalized adapter name. - it do + before do Datadog.configure { |c| c.use :sequel } perform_query! + end + + it do expect(span.service).to eq('sqlite') end @@ -51,9 +54,12 @@ def perform_query! context 'with options set via #use' do let(:service_name) { 'my-sequel' } - it do + before do Datadog.configure { |c| c.use :sequel, service_name: service_name } perform_query! + end + + it do expect(span.service).to eq(service_name) end @@ -63,10 +69,14 @@ def perform_query! context 'with options set on Sequel::Database' do let(:service_name) { 'custom-sequel' } - it do + before do Datadog.configure { |c| c.use :sequel } Datadog.configure(sequel, service_name: service_name) + Datadog.configure { |c| c.use :sequel } perform_query! + end + + it do expect(span.service).to eq(service_name) end @@ -77,10 +87,13 @@ def perform_query! # NOTE: This test really only works when run in isolation. # It relies on Sequel not being patched, and there's # no way to unpatch it once its happened in other tests. - it do + before do sequel Datadog.configure { |c| c.use :sequel } perform_query! + end + + it do expect(span.service).to eq('sqlite') end