aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/util/Clock.scala
diff options
context:
space:
mode:
Diffstat (limited to 'kamon-core/src/main/scala/kamon/util/Clock.scala')
-rw-r--r--kamon-core/src/main/scala/kamon/util/Clock.scala28
1 files changed, 20 insertions, 8 deletions
diff --git a/kamon-core/src/main/scala/kamon/util/Clock.scala b/kamon-core/src/main/scala/kamon/util/Clock.scala
index 48a88968..8c00ecc6 100644
--- a/kamon-core/src/main/scala/kamon/util/Clock.scala
+++ b/kamon-core/src/main/scala/kamon/util/Clock.scala
@@ -15,17 +15,17 @@
package kamon.util
-import java.time.{Instant, ZoneId, Clock => JavaClock}
+import java.time.{Duration, Instant, ZoneId, Clock => JavaClock}
abstract class Clock extends JavaClock {
def nanos(): Long
- def nanosBetween(left: Instant, right: Instant): Long
def toInstant(nanos: Long): Instant
}
object Clock {
private val MillisInSecond = 1000L
+ private val NanosInMicro = 1000L
private val MicrosInSecond = 1000000L
private val NanosInSecond = 1000000000L
@@ -74,16 +74,28 @@ object Clock {
override def instant(): Instant =
toInstant(System.nanoTime())
- override def nanosBetween(left: Instant, right: Instant): Long = {
- val secsDiff = Math.subtractExact(right.getEpochSecond, left.getEpochSecond)
- val totalNanos = Math.multiplyExact(secsDiff, NanosInSecond)
- return Math.addExact(totalNanos, right.getNano - left.getNano)
- }
-
override def withZone(zone: ZoneId): JavaClock =
systemClock.withZone(zone)
override def getZone: ZoneId =
systemClock.getZone()
}
+
+ def nanosBetween(left: Instant, right: Instant): Long = {
+ val secsDiff = Math.subtractExact(right.getEpochSecond, left.getEpochSecond)
+ val totalNanos = Math.multiplyExact(secsDiff, NanosInSecond)
+ return Math.addExact(totalNanos, right.getNano - left.getNano)
+ }
+
+ def toEpochMicros(instant: Instant): Long = {
+ Math.multiplyExact(instant.getEpochSecond, MicrosInSecond) + Math.floorDiv(instant.getNano, NanosInMicro)
+ }
+
+ def nextTick(from: Instant, expectedDuration: Duration): Instant = {
+ val fromMillis = from.toEpochMilli()
+ val intervalCount = Math.floorDiv(fromMillis, expectedDuration.toMillis)
+ val nextTickMillis = expectedDuration.toMillis * (intervalCount + 1)
+
+ Instant.ofEpochMilli(nextTickMillis)
+ }
} \ No newline at end of file