aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/metric/instrument/Instrument.scala
blob: 8cacc767e900057aaa73fbcda7ec10a2a4863181 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package kamon.metric.instrument

import java.nio.LongBuffer

import akka.actor.{ Scheduler, Cancellable }
import akka.dispatch.MessageDispatcher
import scala.concurrent.duration.FiniteDuration

private[kamon] trait Instrument {
  type SnapshotType <: InstrumentSnapshot

  def collect(context: CollectionContext): SnapshotType
  def cleanup: Unit
}

trait InstrumentSnapshot {
  def merge(that: InstrumentSnapshot, context: CollectionContext): InstrumentSnapshot
}

class InstrumentType private[kamon] (val id: Int) extends AnyVal
object InstrumentTypes {
  val Histogram = new InstrumentType(1)
  val MinMaxCounter = new InstrumentType(2)
  val Gauge = new InstrumentType(3)
  val Counter = new InstrumentType(4)
}

trait CollectionContext {
  def buffer: LongBuffer
}

object CollectionContext {
  def apply(longBufferSize: Int): CollectionContext = new CollectionContext {
    val buffer: LongBuffer = LongBuffer.allocate(longBufferSize)
  }
}

trait RefreshScheduler {
  def schedule(interval: FiniteDuration, refresh: ()  Unit): Cancellable
}

object RefreshScheduler {
  val NoopScheduler = new RefreshScheduler {
    def schedule(interval: FiniteDuration, refresh: ()  Unit): Cancellable = new Cancellable {
      override def isCancelled: Boolean = true
      override def cancel(): Boolean = true
    }
  }

  def apply(scheduler: Scheduler, dispatcher: MessageDispatcher): RefreshScheduler = new RefreshScheduler {
    def schedule(interval: FiniteDuration, refresh: ()  Unit): Cancellable =
      scheduler.schedule(interval, interval)(refresh.apply())(dispatcher)
  }

  def create(scheduler: Scheduler, dispatcher: MessageDispatcher): RefreshScheduler = apply(scheduler, dispatcher)
}