将Span ID从long转换为String

时间:2019-03-26 15:14:10

标签: html spring spring-boot tracing brave

如何将我从span.context().spanId()检索到的Brave Span ID转换为包含其64个低十六进制编码位的String。 Sleuth包含一个静态实用程序方法Span.idToHex()。他们的勇敢等同吗? Long.toHexString()是一个候选者,但是我们看到了必须左键填充字符串的问题。

1 个答案:

答案 0 :(得分:1)

我看到,自从勇敢的版本5.6.0以来,spanIdString()Returns the hex representation of the span's ID

这在内部使用HexCodec中的toLowerHex(long v)。据我所知,这是4.9.0版以来的最新形式。在此之前,该方法自4.0.0版本开始存在,但形式有所不同。此方法是public,您可以使用它,但是请谨慎使用,因为包名称表明它不是公共API,我希望在将来的版本中可以更改它。

除此之外,我查看了Sleuth's Span.idToHex(),并发现其内部使用了Long.toHexString()。它什么也没做。

  

Long.toHexString()是一个候选者,但是我们看到了不得不左键填充字符串的问题。

勇敢的spanId8-byte number。十六进制表示形式可能是16个字符串。该字符串不必保留。这是在显示值时格式化值的问题。

例如:

System.out.println(String.format("%s", Long.toHexString(Long.MIN_VALUE)));
System.out.println(String.format("%s", Long.toHexString(-1L)));
System.out.println(String.format("%s", Long.toHexString(0L)));
System.out.println(String.format("%s", Long.toHexString(1L)));
System.out.println(String.format("%s", Long.toHexString(Long.MAX_VALUE)));

System.out.println(String.format("%X", Long.MIN_VALUE));
System.out.println(String.format("%X", -1L));
System.out.println(String.format("%X", 0L));
System.out.println(String.format("%X", 1L));
System.out.println(String.format("%X", Long.MAX_VALUE));

将输出以下内容:

8000000000000000
ffffffffffffffff
0
1
7fffffffffffffff

8000000000000000
FFFFFFFFFFFFFFFF
0
1
7FFFFFFFFFFFFFFF

这些是有效的十六进制值,没有填充。

如果您希望它以零填充表示,您可以像已经做的那样自己做。我可能会这样:

System.out.println(String.format("%016X", Long.MIN_VALUE));
System.out.println(String.format("%016X", -1L));
System.out.println(String.format("%016X", 0L));
System.out.println(String.format("%016X", 1L));
System.out.println(String.format("%016X", Long.MAX_VALUE));

那将打印:

8000000000000000
FFFFFFFFFFFFFFFF
0000000000000000
0000000000000001
7FFFFFFFFFFFFFFF

希望这会有所帮助!