Skip to content

Commit d66543e

Browse files
committed
WIP
1 parent 82d2489 commit d66543e

File tree

6 files changed

+132
-5
lines changed

6 files changed

+132
-5
lines changed

build.sbt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ lazy val root = project
3232
jvmPureConfig,
3333
micrometerJmx,
3434
micrometerJmxPureConfig,
35+
micrometerStatsD,
3536
pureConfig
3637
)
3738
.settings(
@@ -171,6 +172,14 @@ lazy val micrometerJmxPureConfig = project
171172
.settings(commonSettings)
172173
.settings(name := "sst-micrometer-jmx-pureconfig")
173174

175+
lazy val micrometerStatsD = project
176+
.in(file("micrometer-statsd"))
177+
.settings(commonSettings)
178+
.settings(
179+
name := "sst-micrometer-statsd",
180+
libraryDependencies += Dependencies.micrometerStatsD
181+
)
182+
174183
lazy val pureConfig = project
175184
.in(file("pureconfig"))
176185
.settings(commonSettings)
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
11
package com.avast.sst.micrometer.jmx
22

3-
final case class MicrometerJmxConfig(domain: String, enableTypeScopeNameHierarchy: Boolean = false)
3+
import java.util.concurrent.TimeUnit
4+
5+
import scala.concurrent.duration.Duration
6+
7+
final case class MicrometerJmxConfig(domain: String,
8+
enableTypeScopeNameHierarchy: Boolean = false,
9+
step: Duration = Duration(1, TimeUnit.MINUTES))

micrometer-jmx/src/main/scala/com/avast/sst/micrometer/jmx/MicrometerJmxModule.scala

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.avast.sst.micrometer.jmx
22

3+
import java.time.Duration
4+
35
import cats.effect.{Resource, Sync}
46
import com.codahale.metrics.MetricRegistry
57
import com.codahale.metrics.jmx.JmxReporter
@@ -21,7 +23,7 @@ object MicrometerJmxModule {
2123
if (config.enableTypeScopeNameHierarchy) {
2224
val dropwizardRegistry = new MetricRegistry
2325
val registry = new JmxMeterRegistry(
24-
new DomainJmxConfig(config.domain),
26+
new CustomJmxConfig(config),
2527
Clock.SYSTEM,
2628
HierarchicalNameMapper.DEFAULT,
2729
dropwizardRegistry,
@@ -30,7 +32,7 @@ object MicrometerJmxModule {
3032
registry.config.namingConvention(NamingConvention.dot)
3133
registry
3234
} else {
33-
new JmxMeterRegistry(new DomainJmxConfig(config.domain), Clock.SYSTEM)
35+
new JmxMeterRegistry(new CustomJmxConfig(config), Clock.SYSTEM)
3436
}
3537
}
3638
}(registry => Sync[F].delay(registry.close()))
@@ -44,9 +46,12 @@ object MicrometerJmxModule {
4446
.build
4547
}
4648

47-
private class DomainJmxConfig(override val domain: String) extends JmxConfig {
49+
private class CustomJmxConfig(c: MicrometerJmxConfig) extends JmxConfig {
50+
51+
override val domain: String = c.domain
52+
override val step: Duration = Duration.ofMillis(c.step.toMillis)
4853

49-
// implements MeterRegistryConfig.get which can return null according to JavaDoc and @Nullable annotation
54+
// the method is @Nullable and we don't need to implement it here
5055
@SuppressWarnings(Array("org.wartremover.warts.Null"))
5156
override def get(key: String): String = null
5257

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.avast.sst.micrometer.statsd
2+
3+
import java.util.concurrent.TimeUnit
4+
5+
import com.avast.sst.micrometer.statsd.MicrometerStatsDConfig.{Flavor, Protocol}
6+
7+
import scala.concurrent.duration.Duration
8+
9+
final case class MicrometerStatsDConfig(host: String,
10+
port: Int = 8125,
11+
flavor: Flavor = Flavor.Etsy,
12+
enabled: Boolean = true,
13+
protocol: Protocol = Protocol.Udp,
14+
maxPacketLength: Int = 1400,
15+
pollingFrequency: Duration = Duration(10, TimeUnit.SECONDS),
16+
step: Duration = Duration(1, TimeUnit.MINUTES),
17+
publishUnchangedMeters: Boolean = true,
18+
buffered: Boolean = true)
19+
20+
object MicrometerStatsDConfig {
21+
22+
sealed trait Flavor
23+
24+
object Flavor {
25+
26+
case object Etsy extends Flavor
27+
case object Datadog extends Flavor
28+
case object Telegraf extends Flavor
29+
case object Sysdig extends Flavor
30+
31+
}
32+
33+
sealed trait Protocol
34+
35+
object Protocol {
36+
37+
case object Udp extends Protocol
38+
case object Tcp extends Protocol
39+
40+
}
41+
42+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.avast.sst.micrometer.statsd
2+
3+
import java.time.{Clock, Duration}
4+
5+
import cats.effect.{Resource, Sync}
6+
import com.avast.sst.micrometer.statsd.MicrometerStatsDConfig.{Flavor, Protocol}
7+
import io.micrometer.core.instrument.config.NamingConvention
8+
import io.micrometer.core.instrument.util.HierarchicalNameMapper
9+
import io.micrometer.statsd.{StatsdConfig, StatsdFlavor, StatsdMeterRegistry, StatsdProtocol}
10+
11+
import scala.language.higherKinds
12+
13+
object MicrometerStatsDModule {
14+
15+
/** Makes configured [[io.micrometer.statsd.StatsdMeterRegistry]]. */
16+
def make[F[_]: Sync](config: MicrometerStatsDConfig, clock: Clock): Resource[F, StatsdMeterRegistry] = {
17+
Resource
18+
.make {
19+
Sync[F].delay {
20+
StatsdMeterRegistry
21+
.builder(new CustomStatsdConfig(config))
22+
.
23+
new StatsdMeterRegistry(???, ???)
24+
}
25+
}(registry => Sync[F].delay(registry.close()))
26+
}
27+
28+
private class CustomStatsdConfig(c: MicrometerStatsDConfig) extends StatsdConfig {
29+
30+
override val flavor: StatsdFlavor = c.flavor match {
31+
case Flavor.Etsy => StatsdFlavor.ETSY
32+
case Flavor.Datadog => StatsdFlavor.DATADOG
33+
case Flavor.Telegraf => StatsdFlavor.TELEGRAF
34+
case Flavor.Sysdig => StatsdFlavor.SYSDIG
35+
}
36+
37+
override val enabled: Boolean = c.enabled
38+
39+
override val host: String = c.host
40+
41+
override val port: Int = c.port
42+
43+
override val protocol: StatsdProtocol = c.protocol match {
44+
case Protocol.Udp => StatsdProtocol.UDP
45+
case Protocol.Tcp => StatsdProtocol.TCP
46+
}
47+
48+
override val maxPacketLength: Int = c.maxPacketLength
49+
50+
override val pollingFrequency: Duration = java.time.Duration.ofMillis(c.pollingFrequency.toMillis)
51+
52+
override val step: Duration = java.time.Duration.ofMillis(c.step.toMillis)
53+
54+
override val publishUnchangedMeters: Boolean = c.publishUnchangedMeters
55+
56+
override val buffered: Boolean = c.buffered
57+
58+
// the method is @Nullable and we don't need to implement it here
59+
@SuppressWarnings(Array("org.wartremover.warts.Null"))
60+
override def get(key: String): String = null
61+
62+
}
63+
64+
}

project/Dependencies.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ object Dependencies {
1212
val logbackClassic = "ch.qos.logback" % "logback-classic" % "1.2.3"
1313
val micrometerCore = "io.micrometer" % "micrometer-core" % Versions.micrometer
1414
val micrometerJmx = "io.micrometer" % "micrometer-registry-jmx" % Versions.micrometer
15+
val micrometerStatsD = "io.micrometer" % "micrometer-registry-statsd" % Versions.micrometer
1516
val monixEval = "io.monix" %% "monix-eval" % "3.0.0"
1617
val pureConfig = "com.github.pureconfig" %% "pureconfig" % "0.12.1"
1718
val scalaTest = "org.scalatest" %% "scalatest" % "3.0.8"

0 commit comments

Comments
 (0)