diff options
author | Ivan Topolnjak <ivantopo@gmail.com> | 2017-07-17 13:13:41 +0200 |
---|---|---|
committer | Ivan Topolnjak <ivantopo@gmail.com> | 2017-07-17 13:13:41 +0200 |
commit | 483159862293a065be7cf3743d1aa759fbf31fc0 (patch) | |
tree | c6c2753c1c7abd7f2e44d7686bd088a51267867d /kamon-core/src/main/scala/kamon/trace/IdentityProvider.scala | |
parent | 34010efc7b273e50d805a277646f14aa96aaa8b2 (diff) | |
download | Kamon-483159862293a065be7cf3743d1aa759fbf31fc0.tar.gz Kamon-483159862293a065be7cf3743d1aa759fbf31fc0.tar.bz2 Kamon-483159862293a065be7cf3743d1aa759fbf31fc0.zip |
working on ID generation and SpanContext encoding/decoding
Diffstat (limited to 'kamon-core/src/main/scala/kamon/trace/IdentityProvider.scala')
-rw-r--r-- | kamon-core/src/main/scala/kamon/trace/IdentityProvider.scala | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/kamon-core/src/main/scala/kamon/trace/IdentityProvider.scala b/kamon-core/src/main/scala/kamon/trace/IdentityProvider.scala new file mode 100644 index 00000000..25e8f3c0 --- /dev/null +++ b/kamon-core/src/main/scala/kamon/trace/IdentityProvider.scala @@ -0,0 +1,60 @@ +package kamon.trace + +import java.nio.ByteBuffer +import java.util.concurrent.ThreadLocalRandom + +import kamon.util.HexCodec + +import scala.util.Try + +trait IdentityProvider { + def traceIdentifierGenerator(): IdentityProvider.Generator + def spanIdentifierGenerator(): IdentityProvider.Generator +} + +object IdentityProvider { + case class Identifier(string: String, bytes: Array[Byte]) + + val NoIdentifier = Identifier("", new Array[Byte](0)) + + trait Generator { + def generate(): Identifier + def from(string: String): Identifier + def from(bytes: Array[Byte]): Identifier + } + + + class Default extends IdentityProvider { + private val generator = new Generator { + override def generate(): Identifier = { + val data = ByteBuffer.wrap(new Array[Byte](8)) + val random = ThreadLocalRandom.current().nextLong() + data.putLong(random) + + Identifier(HexCodec.toLowerHex(random), data.array()) + } + + override def from(string: String): Identifier = Try { + val identifierLong = HexCodec.lowerHexToUnsignedLong(string) + val data = ByteBuffer.allocate(8) + data.putLong(identifierLong) + + Identifier(string, data.array()) + } getOrElse(IdentityProvider.NoIdentifier) + + override def from(bytes: Array[Byte]): Identifier = Try { + val buffer = ByteBuffer.wrap(bytes) + val identifierLong = buffer.getLong + + Identifier(HexCodec.toLowerHex(identifierLong), bytes) + } getOrElse(IdentityProvider.NoIdentifier) + } + + override def traceIdentifierGenerator(): Generator = generator + override def spanIdentifierGenerator(): Generator = generator + } + + object Default { + def apply(): Default = new Default() + } +}
\ No newline at end of file |