Skip to content

Commit fe3372e

Browse files
Sanitise invalid characters in metric names
resolves #27
1 parent 54c2de0 commit fe3372e

File tree

2 files changed

+196
-19
lines changed

2 files changed

+196
-19
lines changed

src/main/java/com/timgroup/statsd/NonBlockingStatsDClient.java

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.concurrent.ThreadFactory;
2121
import java.util.concurrent.ThreadLocalRandom;
2222
import java.util.concurrent.TimeUnit;
23+
import java.util.regex.Pattern;
2324
import jnr.unixsocket.UnixSocketAddress;
2425
import jnr.unixsocket.UnixDatagramChannel;
2526
import jnr.unixsocket.UnixSocketOptions;
@@ -106,6 +107,12 @@ protected NumberFormat initialValue() {
106107
}
107108
};
108109

110+
private static final Pattern invalidAspectChar = Pattern.compile("[^.0-9A-Za-z_]");
111+
112+
private static String sanitiseAspect(String aspect) {
113+
return invalidAspectChar.matcher(aspect).replaceAll("_");
114+
}
115+
109116
private final String prefix;
110117
private final DatagramChannel clientChannel;
111118
private final StatsDClientErrorHandler handler;
@@ -427,7 +434,7 @@ String tagString(final String[] tags) {
427434
*/
428435
@Override
429436
public void count(final String aspect, final long delta, final String... tags) {
430-
send(new StringBuilder(prefix).append(aspect).append(":").append(delta).append("|c").append(tagString(tags)).toString());
437+
send(new StringBuilder(prefix).append(sanitiseAspect(aspect)).append(":").append(delta).append("|c").append(tagString(tags)).toString());
431438
}
432439

433440
/**
@@ -438,7 +445,7 @@ public void count(final String aspect, final long delta, final double sampleRate
438445
if(isInvalidSample(sampleRate)) {
439446
return;
440447
}
441-
send(new StringBuilder(prefix).append(aspect).append(":").append(delta).append("|c|@").append(SAMPLE_RATE_FORMATTERS.get().format(sampleRate)).append(tagString(tags)).toString());
448+
send(new StringBuilder(prefix).append(sanitiseAspect(aspect)).append(":").append(delta).append("|c|@").append(SAMPLE_RATE_FORMATTERS.get().format(sampleRate)).append(tagString(tags)).toString());
442449
}
443450

444451
/**
@@ -455,7 +462,7 @@ public void count(final String aspect, final long delta, final double sampleRate
455462
*/
456463
@Override
457464
public void count(final String aspect, final double delta, final String... tags) {
458-
send(new StringBuilder(prefix).append(aspect).append(":").append(NUMBER_FORMATTERS.get().format(delta)).append("|c").append(tagString(tags)).toString());
465+
send(new StringBuilder(prefix).append(sanitiseAspect(aspect)).append(":").append(NUMBER_FORMATTERS.get().format(delta)).append("|c").append(tagString(tags)).toString());
459466
}
460467

461468
/**
@@ -466,7 +473,7 @@ public void count(final String aspect, final double delta, final double sampleRa
466473
if(isInvalidSample(sampleRate)) {
467474
return;
468475
}
469-
send(new StringBuilder(prefix).append(aspect).append(":").append(NUMBER_FORMATTERS.get().format(delta)).append("|c|@").append(SAMPLE_RATE_FORMATTERS.get().format(sampleRate)).append(tagString(tags)).toString());
476+
send(new StringBuilder(prefix).append(sanitiseAspect(aspect)).append(":").append(NUMBER_FORMATTERS.get().format(delta)).append("|c|@").append(SAMPLE_RATE_FORMATTERS.get().format(sampleRate)).append(tagString(tags)).toString());
470477
}
471478

472479
/**
@@ -563,7 +570,7 @@ public void decrement(final String aspect, final double sampleRate, final String
563570
public void recordGaugeValue(final String aspect, final double value, final String... tags) {
564571
/* Intentionally using %s rather than %f here to avoid
565572
* padding with extra 0s to represent precision */
566-
send(new StringBuilder(prefix).append(aspect).append(":").append(NUMBER_FORMATTERS.get().format(value)).append("|g").append(tagString(tags)).toString());
573+
send(new StringBuilder(prefix).append(sanitiseAspect(aspect)).append(":").append(NUMBER_FORMATTERS.get().format(value)).append("|g").append(tagString(tags)).toString());
567574
}
568575

569576
/**
@@ -574,7 +581,7 @@ public void recordGaugeValue(final String aspect, final double value, final doub
574581
if(isInvalidSample(sampleRate)) {
575582
return;
576583
}
577-
send(new StringBuilder(prefix).append(aspect).append(":").append(NUMBER_FORMATTERS.get().format(value)).append("|g|@").append(SAMPLE_RATE_FORMATTERS.get().format(sampleRate)).append(tagString(tags)).toString());
584+
send(new StringBuilder(prefix).append(sanitiseAspect(aspect)).append(":").append(NUMBER_FORMATTERS.get().format(value)).append("|g|@").append(SAMPLE_RATE_FORMATTERS.get().format(sampleRate)).append(tagString(tags)).toString());
578585
}
579586

580587
/**
@@ -608,7 +615,7 @@ public void gauge(final String aspect, final double value, final double sampleRa
608615
*/
609616
@Override
610617
public void recordGaugeValue(final String aspect, final long value, final String... tags) {
611-
send(new StringBuilder(prefix).append(aspect).append(":").append(value).append("|g").append(tagString(tags)).toString());
618+
send(new StringBuilder(prefix).append(sanitiseAspect(aspect)).append(":").append(value).append("|g").append(tagString(tags)).toString());
612619
}
613620

614621
/**
@@ -619,7 +626,7 @@ public void recordGaugeValue(final String aspect, final long value, final double
619626
if(isInvalidSample(sampleRate)) {
620627
return;
621628
}
622-
send(new StringBuilder(prefix).append(aspect).append(":").append(value).append("|g|@").append(SAMPLE_RATE_FORMATTERS.get().format(sampleRate)).append(tagString(tags)).toString());
629+
send(new StringBuilder(prefix).append(sanitiseAspect(aspect)).append(":").append(value).append("|g|@").append(SAMPLE_RATE_FORMATTERS.get().format(sampleRate)).append(tagString(tags)).toString());
623630
}
624631

625632
/**
@@ -652,7 +659,7 @@ public void gauge(final String aspect, final long value, final double sampleRate
652659
*/
653660
@Override
654661
public void recordExecutionTime(final String aspect, final long timeInMs, final String... tags) {
655-
send(new StringBuilder(prefix).append(aspect).append(":").append(timeInMs).append("|ms").append(tagString(tags)).toString());
662+
send(new StringBuilder(prefix).append(sanitiseAspect(aspect)).append(":").append(timeInMs).append("|ms").append(tagString(tags)).toString());
656663
}
657664

658665
/**
@@ -663,7 +670,7 @@ public void recordExecutionTime(final String aspect, final long timeInMs, final
663670
if(isInvalidSample(sampleRate)) {
664671
return;
665672
}
666-
send(new StringBuilder(prefix).append(aspect).append(":").append(timeInMs).append("|ms|@").append(SAMPLE_RATE_FORMATTERS.get().format(sampleRate)).append(tagString(tags)).toString());
673+
send(new StringBuilder(prefix).append(sanitiseAspect(aspect)).append(":").append(timeInMs).append("|ms|@").append(SAMPLE_RATE_FORMATTERS.get().format(sampleRate)).append(tagString(tags)).toString());
667674
}
668675

669676
/**
@@ -698,7 +705,7 @@ public void time(final String aspect, final long value, final double sampleRate,
698705
public void recordHistogramValue(final String aspect, final double value, final String... tags) {
699706
/* Intentionally using %s rather than %f here to avoid
700707
* padding with extra 0s to represent precision */
701-
send(new StringBuilder(prefix).append(aspect).append(":").append(NUMBER_FORMATTERS.get().format(value)).append("|h").append(tagString(tags)).toString());
708+
send(new StringBuilder(prefix).append(sanitiseAspect(aspect)).append(":").append(NUMBER_FORMATTERS.get().format(value)).append("|h").append(tagString(tags)).toString());
702709
}
703710

704711
/**
@@ -711,7 +718,7 @@ public void recordHistogramValue(final String aspect, final double value, final
711718
}
712719
/* Intentionally using %s rather than %f here to avoid
713720
* padding with extra 0s to represent precision */
714-
send(new StringBuilder(prefix).append(aspect).append(":").append(NUMBER_FORMATTERS.get().format(value)).append("|h|@").append(SAMPLE_RATE_FORMATTERS.get().format(sampleRate)).append(tagString(tags)).toString());
721+
send(new StringBuilder(prefix).append(sanitiseAspect(aspect)).append(":").append(NUMBER_FORMATTERS.get().format(value)).append("|h|@").append(SAMPLE_RATE_FORMATTERS.get().format(sampleRate)).append(tagString(tags)).toString());
715722
}
716723

717724
/**
@@ -744,7 +751,7 @@ public void histogram(final String aspect, final double value, final double samp
744751
*/
745752
@Override
746753
public void recordHistogramValue(final String aspect, final long value, final String... tags) {
747-
send(new StringBuilder(prefix).append(aspect).append(":").append(value).append("|h").append(tagString(tags)).toString());
754+
send(new StringBuilder(prefix).append(sanitiseAspect(aspect)).append(":").append(value).append("|h").append(tagString(tags)).toString());
748755
}
749756

750757
/**
@@ -755,7 +762,7 @@ public void recordHistogramValue(final String aspect, final long value, final do
755762
if(isInvalidSample(sampleRate)) {
756763
return;
757764
}
758-
send(new StringBuilder(prefix).append(aspect).append(":").append(value).append("|h|@").append(SAMPLE_RATE_FORMATTERS.get().format(sampleRate)).append(tagString(tags)).toString());
765+
send(new StringBuilder(prefix).append(sanitiseAspect(aspect)).append(":").append(value).append("|h|@").append(SAMPLE_RATE_FORMATTERS.get().format(sampleRate)).append(tagString(tags)).toString());
759766
}
760767

761768
/**
@@ -792,7 +799,7 @@ public void histogram(final String aspect, final long value, final double sample
792799
public void recordDistributionValue(final String aspect, final double value, final String... tags) {
793800
/* Intentionally using %s rather than %f here to avoid
794801
* padding with extra 0s to represent precision */
795-
send(new StringBuilder(prefix).append(aspect).append(":").append(NUMBER_FORMATTERS.get().format(value)).append("|d").append(tagString(tags)).toString());
802+
send(new StringBuilder(prefix).append(sanitiseAspect(aspect)).append(":").append(NUMBER_FORMATTERS.get().format(value)).append("|d").append(tagString(tags)).toString());
796803
}
797804

798805
/**
@@ -805,7 +812,7 @@ public void recordDistributionValue(final String aspect, final double value, fin
805812
}
806813
/* Intentionally using %s rather than %f here to avoid
807814
* padding with extra 0s to represent precision */
808-
send(new StringBuilder(prefix).append(aspect).append(":").append(NUMBER_FORMATTERS.get().format(value)).append("|d|@").append(SAMPLE_RATE_FORMATTERS.get().format(sampleRate)).append(tagString(tags)).toString());
815+
send(new StringBuilder(prefix).append(sanitiseAspect(aspect)).append(":").append(NUMBER_FORMATTERS.get().format(value)).append("|d|@").append(SAMPLE_RATE_FORMATTERS.get().format(sampleRate)).append(tagString(tags)).toString());
809816
}
810817

811818
/**
@@ -839,7 +846,7 @@ public void distribution(final String aspect, final double value, final double s
839846
*/
840847
@Override
841848
public void recordDistributionValue(final String aspect, final long value, final String... tags) {
842-
send(new StringBuilder(prefix).append(aspect).append(":").append(value).append("|d").append(tagString(tags)).toString());
849+
send(new StringBuilder(prefix).append(sanitiseAspect(aspect)).append(":").append(value).append("|d").append(tagString(tags)).toString());
843850
}
844851

845852
/**
@@ -850,7 +857,7 @@ public void recordDistributionValue(final String aspect, final long value, final
850857
if(isInvalidSample(sampleRate)) {
851858
return;
852859
}
853-
send(new StringBuilder(prefix).append(aspect).append(":").append(value).append("|d|@").append(SAMPLE_RATE_FORMATTERS.get().format(sampleRate)).append(tagString(tags)).toString());
860+
send(new StringBuilder(prefix).append(sanitiseAspect(aspect)).append(":").append(value).append("|d|@").append(SAMPLE_RATE_FORMATTERS.get().format(sampleRate)).append(tagString(tags)).toString());
854861
}
855862

856863
/**
@@ -990,7 +997,7 @@ public void serviceCheck(final ServiceCheck sc) {
990997
public void recordSetValue(final String aspect, final String value, final String... tags) {
991998
// documentation is light, but looking at dogstatsd source, we can send string values
992999
// here instead of numbers
993-
send(new StringBuilder(prefix).append(aspect).append(":").append(value).append("|s").append(tagString(tags)).toString());
1000+
send(new StringBuilder(prefix).append(sanitiseAspect(aspect)).append(":").append(value).append("|s").append(tagString(tags)).toString());
9941001
}
9951002

9961003
private void send(final String message) {

0 commit comments

Comments
 (0)