Add `dd.trace.db.client.split-by-instance` Config

This commit is contained in:
Tyler Benson 2019-06-13 14:28:16 -07:00
parent 51d552aec8
commit 4c5793bddf
6 changed files with 47 additions and 15 deletions

View File

@ -1,5 +1,7 @@
package datadog.trace.agent.decorator; package datadog.trace.agent.decorator;
import datadog.trace.api.Config;
import datadog.trace.api.DDTags;
import io.opentracing.Span; import io.opentracing.Span;
import io.opentracing.tag.Tags; import io.opentracing.tag.Tags;
@ -29,7 +31,11 @@ public abstract class DatabaseClientDecorator<CONNECTION> extends ClientDecorato
assert span != null; assert span != null;
if (connection != null) { if (connection != null) {
Tags.DB_USER.set(span, dbUser(connection)); Tags.DB_USER.set(span, dbUser(connection));
Tags.DB_INSTANCE.set(span, dbInstance(connection)); final String instanceName = dbInstance(connection);
Tags.DB_INSTANCE.set(span, instanceName);
if (instanceName != null && Config.get().isDbClientSplitByInstance()) {
span.setTag(DDTags.SERVICE_NAME, instanceName);
}
} }
return span; return span;
} }

View File

@ -1,9 +1,12 @@
package datadog.trace.agent.decorator package datadog.trace.agent.decorator
import datadog.trace.api.Config
import datadog.trace.api.DDTags import datadog.trace.api.DDTags
import io.opentracing.Span import io.opentracing.Span
import io.opentracing.tag.Tags import io.opentracing.tag.Tags
import static datadog.trace.agent.test.utils.ConfigUtils.withConfigOverride
class DatabaseClientDecoratorTest extends ClientDecoratorTest { class DatabaseClientDecoratorTest extends ClientDecoratorTest {
def span = Mock(Span) def span = Mock(Span)
@ -35,21 +38,26 @@ class DatabaseClientDecoratorTest extends ClientDecoratorTest {
def decorator = newDecorator() def decorator = newDecorator()
when: when:
withConfigOverride(Config.DB_CLIENT_HOST_SPLIT_BY_INSTANCE, "$renameService") {
decorator.onConnection(span, session) decorator.onConnection(span, session)
}
then: then:
if (session) { if (session) {
1 * span.setTag(Tags.DB_USER.key, session.user) 1 * span.setTag(Tags.DB_USER.key, session.user)
1 * span.setTag(Tags.DB_INSTANCE.key, session.instance) 1 * span.setTag(Tags.DB_INSTANCE.key, session.instance)
if (renameService && session.instance) {
1 * span.setTag(DDTags.SERVICE_NAME, session.instance)
}
} }
0 * _ 0 * _
where: where:
session | _ renameService | session
null | _ false | null
[user: "test-user"] | _ true | [user: "test-user"]
[instance: "test-instance"] | _ false | [instance: "test-instance"]
[user: "test-user", instance: "test-instance"] | _ true | [user: "test-user", instance: "test-instance"]
} }
def "test onStatement"() { def "test onStatement"() {

View File

@ -26,12 +26,12 @@ class HttpClientDecoratorTest extends ClientDecoratorTest {
then: then:
if (req) { if (req) {
1 * span.setTag(Tags.HTTP_METHOD.key, "test-method") 1 * span.setTag(Tags.HTTP_METHOD.key, req.method)
1 * span.setTag(Tags.HTTP_URL.key, "$testUrl") 1 * span.setTag(Tags.HTTP_URL.key, "$req.url")
1 * span.setTag(Tags.PEER_HOSTNAME.key, "test-host") 1 * span.setTag(Tags.PEER_HOSTNAME.key, req.host)
1 * span.setTag(Tags.PEER_PORT.key, 555) 1 * span.setTag(Tags.PEER_PORT.key, req.port)
if (renameService) { if (renameService) {
1 * span.setTag(DDTags.SERVICE_NAME, "test-host") 1 * span.setTag(DDTags.SERVICE_NAME, req.host)
} }
} }
0 * _ 0 * _

View File

@ -1,12 +1,9 @@
package datadog.trace.agent.decorator package datadog.trace.agent.decorator
import datadog.trace.api.DDTags import datadog.trace.api.DDTags
import io.opentracing.Span
class OrmClientDecoratorTest extends DatabaseClientDecoratorTest { class OrmClientDecoratorTest extends DatabaseClientDecoratorTest {
def span = Mock(Span)
def "test onOperation #testName"() { def "test onOperation #testName"() {
setup: setup:
decorator = newDecorator({ e -> entityName }) decorator = newDecorator({ e -> entityName })

View File

@ -63,6 +63,7 @@ public class Config {
public static final String HTTP_SERVER_TAG_QUERY_STRING = "http.server.tag.query-string"; public static final String HTTP_SERVER_TAG_QUERY_STRING = "http.server.tag.query-string";
public static final String HTTP_CLIENT_TAG_QUERY_STRING = "http.client.tag.query-string"; public static final String HTTP_CLIENT_TAG_QUERY_STRING = "http.client.tag.query-string";
public static final String HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN = "trace.http.client.split-by-domain"; public static final String HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN = "trace.http.client.split-by-domain";
public static final String DB_CLIENT_HOST_SPLIT_BY_INSTANCE = "trace.db.client.split-by-instance";
public static final String PARTIAL_FLUSH_MIN_SPANS = "trace.partial.flush.min.spans"; public static final String PARTIAL_FLUSH_MIN_SPANS = "trace.partial.flush.min.spans";
public static final String RUNTIME_CONTEXT_FIELD_INJECTION = public static final String RUNTIME_CONTEXT_FIELD_INJECTION =
"trace.runtime.context.field.injection"; "trace.runtime.context.field.injection";
@ -107,6 +108,7 @@ public class Config {
private static final boolean DEFAULT_HTTP_SERVER_TAG_QUERY_STRING = false; private static final boolean DEFAULT_HTTP_SERVER_TAG_QUERY_STRING = false;
private static final boolean DEFAULT_HTTP_CLIENT_TAG_QUERY_STRING = false; private static final boolean DEFAULT_HTTP_CLIENT_TAG_QUERY_STRING = false;
private static final boolean DEFAULT_HTTP_CLIENT_SPLIT_BY_DOMAIN = false; private static final boolean DEFAULT_HTTP_CLIENT_SPLIT_BY_DOMAIN = false;
private static final boolean DEFAULT_DB_CLIENT_HOST_SPLIT_BY_INSTANCE = false;
private static final int DEFAULT_PARTIAL_FLUSH_MIN_SPANS = 1000; private static final int DEFAULT_PARTIAL_FLUSH_MIN_SPANS = 1000;
private static final String DEFAULT_PROPAGATION_STYLE_EXTRACT = PropagationStyle.DATADOG.name(); private static final String DEFAULT_PROPAGATION_STYLE_EXTRACT = PropagationStyle.DATADOG.name();
private static final String DEFAULT_PROPAGATION_STYLE_INJECT = PropagationStyle.DATADOG.name(); private static final String DEFAULT_PROPAGATION_STYLE_INJECT = PropagationStyle.DATADOG.name();
@ -160,6 +162,7 @@ public class Config {
@Getter private final boolean httpServerTagQueryString; @Getter private final boolean httpServerTagQueryString;
@Getter private final boolean httpClientTagQueryString; @Getter private final boolean httpClientTagQueryString;
@Getter private final boolean httpClientSplitByDomain; @Getter private final boolean httpClientSplitByDomain;
@Getter private final boolean dbClientSplitByInstance;
@Getter private final Integer partialFlushMinSpans; @Getter private final Integer partialFlushMinSpans;
@Getter private final boolean runtimeContextFieldInjection; @Getter private final boolean runtimeContextFieldInjection;
@Getter private final Set<PropagationStyle> propagationStylesToExtract; @Getter private final Set<PropagationStyle> propagationStylesToExtract;
@ -238,6 +241,10 @@ public class Config {
getBooleanSettingFromEnvironment( getBooleanSettingFromEnvironment(
HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, DEFAULT_HTTP_CLIENT_SPLIT_BY_DOMAIN); HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, DEFAULT_HTTP_CLIENT_SPLIT_BY_DOMAIN);
dbClientSplitByInstance =
getBooleanSettingFromEnvironment(
DB_CLIENT_HOST_SPLIT_BY_INSTANCE, DEFAULT_DB_CLIENT_HOST_SPLIT_BY_INSTANCE);
partialFlushMinSpans = partialFlushMinSpans =
getIntegerSettingFromEnvironment(PARTIAL_FLUSH_MIN_SPANS, DEFAULT_PARTIAL_FLUSH_MIN_SPANS); getIntegerSettingFromEnvironment(PARTIAL_FLUSH_MIN_SPANS, DEFAULT_PARTIAL_FLUSH_MIN_SPANS);
@ -342,6 +349,10 @@ public class Config {
getPropertyBooleanValue( getPropertyBooleanValue(
properties, HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, parent.httpClientSplitByDomain); properties, HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, parent.httpClientSplitByDomain);
dbClientSplitByInstance =
getPropertyBooleanValue(
properties, DB_CLIENT_HOST_SPLIT_BY_INSTANCE, parent.dbClientSplitByInstance);
partialFlushMinSpans = partialFlushMinSpans =
getPropertyIntegerValue(properties, PARTIAL_FLUSH_MIN_SPANS, parent.partialFlushMinSpans); getPropertyIntegerValue(properties, PARTIAL_FLUSH_MIN_SPANS, parent.partialFlushMinSpans);

View File

@ -8,6 +8,7 @@ import spock.lang.Specification
import static datadog.trace.api.Config.AGENT_HOST import static datadog.trace.api.Config.AGENT_HOST
import static datadog.trace.api.Config.AGENT_PORT_LEGACY import static datadog.trace.api.Config.AGENT_PORT_LEGACY
import static datadog.trace.api.Config.AGENT_UNIX_DOMAIN_SOCKET import static datadog.trace.api.Config.AGENT_UNIX_DOMAIN_SOCKET
import static datadog.trace.api.Config.DB_CLIENT_HOST_SPLIT_BY_INSTANCE
import static datadog.trace.api.Config.DEFAULT_JMX_FETCH_STATSD_PORT import static datadog.trace.api.Config.DEFAULT_JMX_FETCH_STATSD_PORT
import static datadog.trace.api.Config.GLOBAL_TAGS import static datadog.trace.api.Config.GLOBAL_TAGS
import static datadog.trace.api.Config.HEADER_TAGS import static datadog.trace.api.Config.HEADER_TAGS
@ -79,6 +80,7 @@ class ConfigTest extends Specification {
config.httpServerErrorStatuses == (500..599).toSet() config.httpServerErrorStatuses == (500..599).toSet()
config.httpClientErrorStatuses == (400..499).toSet() config.httpClientErrorStatuses == (400..499).toSet()
config.httpClientSplitByDomain == false config.httpClientSplitByDomain == false
config.dbClientSplitByInstance == false
config.partialFlushMinSpans == 1000 config.partialFlushMinSpans == 1000
config.reportHostName == false config.reportHostName == false
config.runtimeContextFieldInjection == true config.runtimeContextFieldInjection == true
@ -120,6 +122,7 @@ class ConfigTest extends Specification {
prop.setProperty(HTTP_SERVER_ERROR_STATUSES, "123-456,457,124-125,122") prop.setProperty(HTTP_SERVER_ERROR_STATUSES, "123-456,457,124-125,122")
prop.setProperty(HTTP_CLIENT_ERROR_STATUSES, "111") prop.setProperty(HTTP_CLIENT_ERROR_STATUSES, "111")
prop.setProperty(HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "true") prop.setProperty(HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "true")
prop.setProperty(DB_CLIENT_HOST_SPLIT_BY_INSTANCE, "true")
prop.setProperty(PARTIAL_FLUSH_MIN_SPANS, "15") prop.setProperty(PARTIAL_FLUSH_MIN_SPANS, "15")
prop.setProperty(TRACE_REPORT_HOSTNAME, "true") prop.setProperty(TRACE_REPORT_HOSTNAME, "true")
prop.setProperty(RUNTIME_CONTEXT_FIELD_INJECTION, "false") prop.setProperty(RUNTIME_CONTEXT_FIELD_INJECTION, "false")
@ -151,6 +154,7 @@ class ConfigTest extends Specification {
config.httpServerErrorStatuses == (122..457).toSet() config.httpServerErrorStatuses == (122..457).toSet()
config.httpClientErrorStatuses == (111..111).toSet() config.httpClientErrorStatuses == (111..111).toSet()
config.httpClientSplitByDomain == true config.httpClientSplitByDomain == true
config.dbClientSplitByInstance == true
config.partialFlushMinSpans == 15 config.partialFlushMinSpans == 15
config.reportHostName == true config.reportHostName == true
config.runtimeContextFieldInjection == false config.runtimeContextFieldInjection == false
@ -183,6 +187,7 @@ class ConfigTest extends Specification {
System.setProperty(PREFIX + HTTP_SERVER_ERROR_STATUSES, "123-456,457,124-125,122") System.setProperty(PREFIX + HTTP_SERVER_ERROR_STATUSES, "123-456,457,124-125,122")
System.setProperty(PREFIX + HTTP_CLIENT_ERROR_STATUSES, "111") System.setProperty(PREFIX + HTTP_CLIENT_ERROR_STATUSES, "111")
System.setProperty(PREFIX + HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "true") System.setProperty(PREFIX + HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "true")
System.setProperty(PREFIX + DB_CLIENT_HOST_SPLIT_BY_INSTANCE, "true")
System.setProperty(PREFIX + PARTIAL_FLUSH_MIN_SPANS, "25") System.setProperty(PREFIX + PARTIAL_FLUSH_MIN_SPANS, "25")
System.setProperty(PREFIX + TRACE_REPORT_HOSTNAME, "true") System.setProperty(PREFIX + TRACE_REPORT_HOSTNAME, "true")
System.setProperty(PREFIX + RUNTIME_CONTEXT_FIELD_INJECTION, "false") System.setProperty(PREFIX + RUNTIME_CONTEXT_FIELD_INJECTION, "false")
@ -214,6 +219,7 @@ class ConfigTest extends Specification {
config.httpServerErrorStatuses == (122..457).toSet() config.httpServerErrorStatuses == (122..457).toSet()
config.httpClientErrorStatuses == (111..111).toSet() config.httpClientErrorStatuses == (111..111).toSet()
config.httpClientSplitByDomain == true config.httpClientSplitByDomain == true
config.dbClientSplitByInstance == true
config.partialFlushMinSpans == 25 config.partialFlushMinSpans == 25
config.reportHostName == true config.reportHostName == true
config.runtimeContextFieldInjection == false config.runtimeContextFieldInjection == false
@ -287,6 +293,7 @@ class ConfigTest extends Specification {
System.setProperty(PREFIX + HTTP_SERVER_ERROR_STATUSES, "1111") System.setProperty(PREFIX + HTTP_SERVER_ERROR_STATUSES, "1111")
System.setProperty(PREFIX + HTTP_CLIENT_ERROR_STATUSES, "1:1") System.setProperty(PREFIX + HTTP_CLIENT_ERROR_STATUSES, "1:1")
System.setProperty(PREFIX + HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "invalid") System.setProperty(PREFIX + HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "invalid")
System.setProperty(PREFIX + DB_CLIENT_HOST_SPLIT_BY_INSTANCE, "invalid")
System.setProperty(PREFIX + PROPAGATION_STYLE_EXTRACT, "some garbage") System.setProperty(PREFIX + PROPAGATION_STYLE_EXTRACT, "some garbage")
System.setProperty(PREFIX + PROPAGATION_STYLE_INJECT, " ") System.setProperty(PREFIX + PROPAGATION_STYLE_INJECT, " ")
@ -307,6 +314,7 @@ class ConfigTest extends Specification {
config.httpServerErrorStatuses == (500..599).toSet() config.httpServerErrorStatuses == (500..599).toSet()
config.httpClientErrorStatuses == (400..499).toSet() config.httpClientErrorStatuses == (400..499).toSet()
config.httpClientSplitByDomain == false config.httpClientSplitByDomain == false
config.dbClientSplitByInstance == false
config.propagationStylesToExtract.toList() == [Config.PropagationStyle.DATADOG] config.propagationStylesToExtract.toList() == [Config.PropagationStyle.DATADOG]
config.propagationStylesToInject.toList() == [Config.PropagationStyle.DATADOG] config.propagationStylesToInject.toList() == [Config.PropagationStyle.DATADOG]
} }
@ -372,6 +380,7 @@ class ConfigTest extends Specification {
properties.setProperty(HTTP_SERVER_ERROR_STATUSES, "123-456,457,124-125,122") properties.setProperty(HTTP_SERVER_ERROR_STATUSES, "123-456,457,124-125,122")
properties.setProperty(HTTP_CLIENT_ERROR_STATUSES, "111") properties.setProperty(HTTP_CLIENT_ERROR_STATUSES, "111")
properties.setProperty(HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "true") properties.setProperty(HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "true")
properties.setProperty(DB_CLIENT_HOST_SPLIT_BY_INSTANCE, "true")
properties.setProperty(PARTIAL_FLUSH_MIN_SPANS, "15") properties.setProperty(PARTIAL_FLUSH_MIN_SPANS, "15")
properties.setProperty(PROPAGATION_STYLE_EXTRACT, "B3 Datadog") properties.setProperty(PROPAGATION_STYLE_EXTRACT, "B3 Datadog")
properties.setProperty(PROPAGATION_STYLE_INJECT, "Datadog B3") properties.setProperty(PROPAGATION_STYLE_INJECT, "Datadog B3")
@ -400,6 +409,7 @@ class ConfigTest extends Specification {
config.httpServerErrorStatuses == (122..457).toSet() config.httpServerErrorStatuses == (122..457).toSet()
config.httpClientErrorStatuses == (111..111).toSet() config.httpClientErrorStatuses == (111..111).toSet()
config.httpClientSplitByDomain == true config.httpClientSplitByDomain == true
config.dbClientSplitByInstance == true
config.partialFlushMinSpans == 15 config.partialFlushMinSpans == 15
config.propagationStylesToExtract.toList() == [Config.PropagationStyle.B3, Config.PropagationStyle.DATADOG] config.propagationStylesToExtract.toList() == [Config.PropagationStyle.B3, Config.PropagationStyle.DATADOG]
config.propagationStylesToInject.toList() == [Config.PropagationStyle.DATADOG, Config.PropagationStyle.B3] config.propagationStylesToInject.toList() == [Config.PropagationStyle.DATADOG, Config.PropagationStyle.B3]