2020import java .util .concurrent .ThreadFactory ;
2121import java .util .concurrent .ThreadLocalRandom ;
2222import java .util .concurrent .TimeUnit ;
23+ import java .util .regex .Pattern ;
2324import jnr .unixsocket .UnixSocketAddress ;
2425import jnr .unixsocket .UnixDatagramChannel ;
2526import 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