aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/trace/IdentifierGenerator.scala
diff options
context:
space:
mode:
Diffstat (limited to 'kamon-core/src/main/scala/kamon/trace/IdentifierGenerator.scala')
-rw-r--r--kamon-core/src/main/scala/kamon/trace/IdentifierGenerator.scala57
1 files changed, 57 insertions, 0 deletions
diff --git a/kamon-core/src/main/scala/kamon/trace/IdentifierGenerator.scala b/kamon-core/src/main/scala/kamon/trace/IdentifierGenerator.scala
new file mode 100644
index 00000000..ea23227a
--- /dev/null
+++ b/kamon-core/src/main/scala/kamon/trace/IdentifierGenerator.scala
@@ -0,0 +1,57 @@
+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
+ }
+} \ No newline at end of file