This is an automated email from the ASF dual-hosted git repository.

cwylie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 6b4d028  [statsd-emitter] Add config to send Druid process/service as 
tag (#8238)
6b4d028 is described below

commit 6b4d028b96d308eaf10220b49e0d9b434a750065
Author: Alexandre Yang <[email protected]>
AuthorDate: Mon Aug 12 22:18:44 2019 +0200

    [statsd-emitter] Add config to send Druid process/service as tag (#8238)
    
    * [statsd-emitter] Add serviceAsTag option
    
    * [statsd-emitter] Refactor serviceAsTag option
    
    * [statsd-emitter] Update statsd.md
    
    * [statsd-emitter] add default prefix
    
    * [statsd-emitter] update statsd.md
    
    * [statsd-emitter] Remove extra spaces
    
    * [statsd-emitter] Improve docs for config `dogstatsdServiceAsTag`
    
    * [statsd-emitter] Simplify equals() for StatsDEmitterConfig.java
    
    * [statsd-emitter] Add @Nullable for StatsDEmitterConfig.java
---
 .../development/extensions-contrib/statsd.md       |  1 +
 .../apache/druid/emitter/statsd/StatsDEmitter.java | 11 ++++-
 .../druid/emitter/statsd/StatsDEmitterConfig.java  | 50 ++++++++++++++--------
 .../druid/emitter/statsd/StatsDEmitterTest.java    | 34 ++++++++++++---
 4 files changed, 70 insertions(+), 26 deletions(-)

diff --git a/docs/content/development/extensions-contrib/statsd.md 
b/docs/content/development/extensions-contrib/statsd.md
index b25a113..c76c72b 100644
--- a/docs/content/development/extensions-contrib/statsd.md
+++ b/docs/content/development/extensions-contrib/statsd.md
@@ -47,6 +47,7 @@ All the configuration parameters for the StatsD emitter are 
under `druid.emitter
 |`druid.emitter.statsd.blankHolder`|The blank character replacement as statsD 
does not support path with blank character|no|"-"|  
 |`druid.emitter.statsd.dogstatsd`|Flag to enable 
[DogStatsD](https://docs.datadoghq.com/developers/dogstatsd/) support. Causes 
dimensions to be included as tags, not as a part of the metric name. 
`convertRange` fields will be ignored.|no|false|
 |`druid.emitter.statsd.dogstatsdConstantTags`|If 
`druid.emitter.statsd.dogstatsd` is true, the tags in the JSON list of strings 
will be sent with every event.|no|[]|
+|`druid.emitter.statsd.dogstatsdServiceAsTag`|If 
`druid.emitter.statsd.dogstatsd` and 
`druid.emitter.statsd.dogstatsdServiceAsTag` are true, druid service (e.g. 
`druid/broker`, `druid/coordinator`, etc) is reported as a tag (e.g. 
`service:druid/broker`) instead of being included in metric name (e.g. 
`druid.broker.my_metric`) and `druid` is used as metric prefix (e.g. 
`druid.query.time`).|no|false|
 
 ### Druid to StatsD Event Converter
 
diff --git 
a/extensions-contrib/statsd-emitter/src/main/java/org/apache/druid/emitter/statsd/StatsDEmitter.java
 
b/extensions-contrib/statsd-emitter/src/main/java/org/apache/druid/emitter/statsd/StatsDEmitter.java
index 4ccecbf..15f1091 100644
--- 
a/extensions-contrib/statsd-emitter/src/main/java/org/apache/druid/emitter/statsd/StatsDEmitter.java
+++ 
b/extensions-contrib/statsd-emitter/src/main/java/org/apache/druid/emitter/statsd/StatsDEmitter.java
@@ -43,6 +43,7 @@ public class StatsDEmitter implements Emitter
 
   private static final Logger log = new Logger(StatsDEmitter.class);
   private static final char DRUID_METRIC_SEPARATOR = '/';
+  private static final String DRUID_DEFAULT_PREFIX = "druid";
   private static final Pattern STATSD_SEPARATOR = Pattern.compile("[:|]");
   private static final Pattern BLANK = Pattern.compile("\\s+");
   private static final String[] EMPTY_ARRAY = new String[0];
@@ -99,10 +100,16 @@ public class StatsDEmitter implements Emitter
       Number value = metricEvent.getValue();
 
       ImmutableList.Builder<String> nameBuilder = new 
ImmutableList.Builder<>();
-      nameBuilder.add(service);
+      ImmutableMap.Builder<String, String> dimsBuilder = new 
ImmutableMap.Builder<>();
+
+      if (config.isDogstatsd() && config.isDogstatsdServiceAsTag()) {
+        dimsBuilder.put("service", service);
+        nameBuilder.add(DRUID_DEFAULT_PREFIX);
+      } else {
+        nameBuilder.add(service);
+      }
       nameBuilder.add(metric);
 
-      ImmutableMap.Builder<String, String> dimsBuilder = new 
ImmutableMap.Builder<>();
       StatsDMetric statsDMetric = converter.addFilteredUserDims(service, 
metric, userDims, dimsBuilder);
 
       if (statsDMetric != null) {
diff --git 
a/extensions-contrib/statsd-emitter/src/main/java/org/apache/druid/emitter/statsd/StatsDEmitterConfig.java
 
b/extensions-contrib/statsd-emitter/src/main/java/org/apache/druid/emitter/statsd/StatsDEmitterConfig.java
index 61d5761..1f272dd 100644
--- 
a/extensions-contrib/statsd-emitter/src/main/java/org/apache/druid/emitter/statsd/StatsDEmitterConfig.java
+++ 
b/extensions-contrib/statsd-emitter/src/main/java/org/apache/druid/emitter/statsd/StatsDEmitterConfig.java
@@ -23,6 +23,7 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.base.Preconditions;
 
+import javax.annotation.Nullable;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
@@ -43,6 +44,7 @@ public class StatsDEmitterConfig
   @JsonProperty
   private final Boolean includeHost;
   @JsonProperty
+  @Nullable
   private final String dimensionMapPath;
   @JsonProperty
   private final String blankHolder;
@@ -50,18 +52,21 @@ public class StatsDEmitterConfig
   private final Boolean dogstatsd;
   @JsonProperty
   private final List<String> dogstatsdConstantTags;
+  @JsonProperty
+  private final Boolean dogstatsdServiceAsTag;
 
   @JsonCreator
   public StatsDEmitterConfig(
       @JsonProperty("hostname") String hostname,
       @JsonProperty("port") Integer port,
-      @JsonProperty("prefix") String prefix,
-      @JsonProperty("separator") String separator,
-      @JsonProperty("includeHost") Boolean includeHost,
-      @JsonProperty("dimensionMapPath") String dimensionMapPath,
-      @JsonProperty("blankHolder") String blankHolder,
-      @JsonProperty("dogstatsd") Boolean dogstatsd,
-      @JsonProperty("dogstatsdConstantTags") List<String> dogstatsdConstantTags
+      @JsonProperty("prefix") @Nullable String prefix,
+      @JsonProperty("separator") @Nullable String separator,
+      @JsonProperty("includeHost") @Nullable Boolean includeHost,
+      @JsonProperty("dimensionMapPath") @Nullable String dimensionMapPath,
+      @JsonProperty("blankHolder") @Nullable String blankHolder,
+      @JsonProperty("dogstatsd") @Nullable Boolean dogstatsd,
+      @JsonProperty("dogstatsdConstantTags") @Nullable List<String> 
dogstatsdConstantTags,
+      @JsonProperty("dogstatsdServiceAsTag") @Nullable Boolean 
dogstatsdServiceAsTag
   )
   {
     this.hostname = Preconditions.checkNotNull(hostname, "StatsD hostname 
cannot be null.");
@@ -73,6 +78,7 @@ public class StatsDEmitterConfig
     this.blankHolder = blankHolder != null ? blankHolder : "-";
     this.dogstatsd = dogstatsd != null ? dogstatsd : false;
     this.dogstatsdConstantTags = dogstatsdConstantTags != null ? 
dogstatsdConstantTags : Collections.emptyList();
+    this.dogstatsdServiceAsTag = dogstatsdServiceAsTag != null ? 
dogstatsdServiceAsTag : false;
   }
 
   @Override
@@ -87,37 +93,38 @@ public class StatsDEmitterConfig
 
     StatsDEmitterConfig that = (StatsDEmitterConfig) o;
 
-    if (hostname != null ? !hostname.equals(that.hostname) : that.hostname != 
null) {
+    if (!Objects.equals(hostname, that.hostname)) {
       return false;
     }
-    if (port != null ? !port.equals(that.port) : that.port != null) {
+    if (!Objects.equals(port, that.port)) {
       return false;
     }
-    if (prefix != null ? !prefix.equals(that.prefix) : that.prefix != null) {
+    if (!Objects.equals(prefix, that.prefix)) {
       return false;
     }
-    if (separator != null ? !separator.equals(that.separator) : that.separator 
!= null) {
+    if (!Objects.equals(separator, that.separator)) {
       return false;
     }
-    if (includeHost != null ? !includeHost.equals(that.includeHost) : 
that.includeHost != null) {
+    if (!Objects.equals(includeHost, that.includeHost)) {
       return false;
     }
-    if (dimensionMapPath != null ? 
!dimensionMapPath.equals(that.dimensionMapPath) : that.dimensionMapPath != 
null) {
+    if (!Objects.equals(dimensionMapPath, that.dimensionMapPath)) {
       return false;
     }
-    if (dogstatsd != null ? !dogstatsd.equals(that.dogstatsd) : that.dogstatsd 
!= null) {
+    if (!Objects.equals(dogstatsd, that.dogstatsd)) {
       return false;
     }
-    return dogstatsdConstantTags != null ? 
dogstatsdConstantTags.equals(that.dogstatsdConstantTags)
-            : that.dogstatsdConstantTags == null;
-
+    if (!Objects.equals(dogstatsdServiceAsTag, that.dogstatsdServiceAsTag)) {
+      return false;
+    }
+    return Objects.equals(dogstatsdConstantTags, that.dogstatsdConstantTags);
   }
 
   @Override
   public int hashCode()
   {
     return Objects.hash(hostname, port, prefix, separator, includeHost, 
dimensionMapPath,
-            blankHolder, dogstatsd, dogstatsdConstantTags);
+            blankHolder, dogstatsd, dogstatsdConstantTags, 
dogstatsdServiceAsTag);
   }
 
   @JsonProperty
@@ -151,6 +158,7 @@ public class StatsDEmitterConfig
   }
 
   @JsonProperty
+  @Nullable
   public String getDimensionMapPath()
   {
     return dimensionMapPath;
@@ -173,4 +181,10 @@ public class StatsDEmitterConfig
   {
     return dogstatsdConstantTags;
   }
+
+  @JsonProperty
+  public Boolean isDogstatsdServiceAsTag()
+  {
+    return dogstatsdServiceAsTag;
+  }
 }
diff --git 
a/extensions-contrib/statsd-emitter/src/test/java/org/apache/druid/emitter/statsd/StatsDEmitterTest.java
 
b/extensions-contrib/statsd-emitter/src/test/java/org/apache/druid/emitter/statsd/StatsDEmitterTest.java
index 40f37ea..2bebd01 100644
--- 
a/extensions-contrib/statsd-emitter/src/test/java/org/apache/druid/emitter/statsd/StatsDEmitterTest.java
+++ 
b/extensions-contrib/statsd-emitter/src/test/java/org/apache/druid/emitter/statsd/StatsDEmitterTest.java
@@ -33,7 +33,7 @@ public class StatsDEmitterTest
   {
     StatsDClient client = EasyMock.createMock(StatsDClient.class);
     StatsDEmitter emitter = new StatsDEmitter(
-        new StatsDEmitterConfig("localhost", 8888, null, null, null, null, 
null, null, null),
+        new StatsDEmitterConfig("localhost", 8888, null, null, null, null, 
null, null, null, null),
         new ObjectMapper(),
         client
     );
@@ -52,7 +52,7 @@ public class StatsDEmitterTest
   {
     StatsDClient client = EasyMock.createMock(StatsDClient.class);
     StatsDEmitter emitter = new StatsDEmitter(
-        new StatsDEmitterConfig("localhost", 8888, null, null, null, null, 
null, true, null),
+        new StatsDEmitterConfig("localhost", 8888, null, null, null, null, 
null, true, null, null),
         new ObjectMapper(),
         client
     );
@@ -71,7 +71,7 @@ public class StatsDEmitterTest
   {
     StatsDClient client = EasyMock.createMock(StatsDClient.class);
     StatsDEmitter emitter = new StatsDEmitter(
-        new StatsDEmitterConfig("localhost", 8888, null, null, null, null, 
null, null, null),
+        new StatsDEmitterConfig("localhost", 8888, null, null, null, null, 
null, null, null, null),
         new ObjectMapper(),
         client
     );
@@ -99,7 +99,7 @@ public class StatsDEmitterTest
   {
     StatsDClient client = EasyMock.createMock(StatsDClient.class);
     StatsDEmitter emitter = new StatsDEmitter(
-        new StatsDEmitterConfig("localhost", 8888, null, "#", true, null, 
null, null, null),
+        new StatsDEmitterConfig("localhost", 8888, null, "#", true, null, 
null, null, null, null),
         new ObjectMapper(),
         client
     );
@@ -127,7 +127,7 @@ public class StatsDEmitterTest
   {
     StatsDClient client = EasyMock.createMock(StatsDClient.class);
     StatsDEmitter emitter = new StatsDEmitter(
-        new StatsDEmitterConfig("localhost", 8888, null, "#", true, null, 
null, true, null),
+        new StatsDEmitterConfig("localhost", 8888, null, "#", true, null, 
null, true, null, null),
         new ObjectMapper(),
         client
     );
@@ -157,7 +157,7 @@ public class StatsDEmitterTest
   {
     StatsDClient client = EasyMock.createMock(StatsDClient.class);
     StatsDEmitter emitter = new StatsDEmitter(
-        new StatsDEmitterConfig("localhost", 8888, null, null, true, null, 
null, null, null),
+        new StatsDEmitterConfig("localhost", 8888, null, null, true, null, 
null, null, null, null),
         new ObjectMapper(),
         client
     );
@@ -170,4 +170,26 @@ public class StatsDEmitterTest
     );
     EasyMock.verify(client);
   }
+
+  @Test
+  public void testServiceAsTagOption()
+  {
+    StatsDClient client = EasyMock.createMock(StatsDClient.class);
+    StatsDEmitter emitter = new StatsDEmitter(
+            new StatsDEmitterConfig("localhost", 8888, null, null, true, null, 
null, true, null, true),
+            new ObjectMapper(),
+            client
+    );
+    client.time("druid.query.time", 10,
+            "service:druid/broker", "dataSource:data-source", "type:groupBy", 
"hostname:brokerHost1"
+    );
+    EasyMock.replay(client);
+    emitter.emit(new ServiceMetricEvent.Builder()
+            .setDimension("dataSource", "data-source")
+            .setDimension("type", "groupBy")
+            .build(DateTimes.nowUtc(), "query/time", 10)
+            .build("druid/broker", "brokerHost1")
+    );
+    EasyMock.verify(client);
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to