Skip to content

Commit eff6bac

Browse files
authored
feat: Add subproject micrometer with generic PrefixMeterFilter (#219)
* feat: Add subproject micrometer with generic PrefixMeterFilter feat: Add more configuration options to MicrometerStatsDModule fix: prefix was not what it was meant to be * fix: compilation issue
1 parent 4ac6d75 commit eff6bac

File tree

5 files changed

+63
-5
lines changed

5 files changed

+63
-5
lines changed

build.sbt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ lazy val root = project
3636
jvm,
3737
jvmMicrometer,
3838
jvmPureConfig,
39+
micrometer,
3940
micrometerJmx,
4041
micrometerJmxPureConfig,
4142
micrometerStatsD,
@@ -296,6 +297,17 @@ lazy val jvmPureConfig = project
296297
libraryDependencies += Dependencies.pureConfig
297298
)
298299

300+
lazy val micrometer = project
301+
.in(file("micrometer"))
302+
.settings(BuildSettings.common)
303+
.settings(
304+
name := "sst-micrometer",
305+
libraryDependencies ++= Seq(
306+
Dependencies.micrometerCore,
307+
Dependencies.jsr305 // required because of Scala compiler
308+
)
309+
)
310+
299311
lazy val micrometerJmx = project
300312
.in(file("micrometer-jmx"))
301313
.settings(BuildSettings.common)
@@ -318,6 +330,7 @@ lazy val micrometerJmxPureConfig = project
318330

319331
lazy val micrometerStatsD = project
320332
.in(file("micrometer-statsd"))
333+
.dependsOn(micrometer)
321334
.settings(BuildSettings.common)
322335
.settings(
323336
name := "sst-micrometer-statsd",

micrometer-statsd/src/main/scala/com/avast/sst/micrometer/statsd/MicrometerStatsDConfig.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,6 @@ final case class MicrometerStatsDConfig(
1717
step: Duration = Duration(1, TimeUnit.MINUTES),
1818
publishUnchangedMeters: Boolean = true,
1919
buffered: Boolean = true,
20-
prefix: String = "statsd"
20+
prefix: String = "",
21+
commonTags: Map[String, String] = Map.empty
2122
)

micrometer-statsd/src/main/scala/com/avast/sst/micrometer/statsd/MicrometerStatsDModule.scala

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ package com.avast.sst.micrometer.statsd
33
import java.time.Duration
44

55
import cats.effect.{Resource, Sync}
6+
import com.avast.sst.micrometer.PrefixMeterFilter
67
import io.micrometer.core.instrument.Clock
8+
import io.micrometer.core.instrument.config.{MeterFilter, NamingConvention}
79
import io.micrometer.core.instrument.util.HierarchicalNameMapper
810
import io.micrometer.statsd.{StatsdConfig, StatsdFlavor, StatsdMeterRegistry, StatsdProtocol}
911

@@ -13,24 +15,40 @@ object MicrometerStatsDModule {
1315
def make[F[_]: Sync](
1416
config: MicrometerStatsDConfig,
1517
clock: Clock = Clock.SYSTEM,
16-
nameMapper: HierarchicalNameMapper = HierarchicalNameMapper.DEFAULT
18+
nameMapper: HierarchicalNameMapper = HierarchicalNameMapper.DEFAULT,
19+
namingConvention: Option[NamingConvention] = None,
20+
meterFilter: Option[MeterFilter] = None
1721
): Resource[F, StatsdMeterRegistry] = {
1822
Resource
1923
.make {
2024
Sync[F].delay {
21-
StatsdMeterRegistry
25+
val registry = StatsdMeterRegistry
2226
.builder(new CustomStatsdConfig(config))
2327
.clock(clock)
2428
.nameMapper(nameMapper)
2529
.build
30+
31+
namingConvention.foreach(registry.config().namingConvention)
32+
33+
if (config.prefix.nonEmpty) {
34+
registry.config().meterFilter(new PrefixMeterFilter(config.prefix))
35+
}
36+
37+
meterFilter.foreach(registry.config().meterFilter)
38+
39+
val preprocessedTags = config.commonTags.foldRight(List.empty[String]) {
40+
case (tag, acc) =>
41+
tag._1 :: tag._2 :: acc
42+
}
43+
registry.config().commonTags(preprocessedTags: _*)
44+
45+
registry
2646
}
2747
}(registry => Sync[F].delay(registry.close()))
2848
}
2949

3050
private class CustomStatsdConfig(c: MicrometerStatsDConfig) extends StatsdConfig {
3151

32-
override val prefix: String = c.prefix
33-
3452
override val flavor: StatsdFlavor = c.flavor
3553

3654
override val enabled: Boolean = c.enabled
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.avast.sst.micrometer
2+
3+
import io.micrometer.core.instrument.Meter
4+
import io.micrometer.core.instrument.config.MeterFilter
5+
6+
class PrefixMeterFilter(prefix: String) extends MeterFilter {
7+
8+
override def map(id: Meter.Id): Meter.Id = id.withName(s"$prefix${id.getName}")
9+
10+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.avast.sst.micrometer
2+
3+
import io.micrometer.core.instrument.simple.SimpleMeterRegistry
4+
import org.scalatest.funsuite.AnyFunSuite
5+
6+
class PrefixMeterFilterTest extends AnyFunSuite {
7+
8+
test("prefixing") {
9+
val registry = new SimpleMeterRegistry
10+
registry.config().meterFilter(new PrefixMeterFilter("this.is.prefix."))
11+
val counter = registry.counter("test")
12+
13+
assert(counter.getId.getName === "this.is.prefix.test")
14+
}
15+
16+
}

0 commit comments

Comments
 (0)