【问题标题】:Convert Span Id from long to String将 Span Id 从 long 转换为 String
【发布时间】:2019-03-26 15:14:09
【问题描述】:

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

【问题讨论】:

    标签: html spring spring-boot trace brave


    【解决方案1】:

    我看到,自从 Brave 版本 5.6.0 以来,就有了 spanIdString() Returns the hex representation of the span's ID

    这在内部使用toLowerHex(long v) 中的HexCodec。据我所知,这具有自版本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
    

    希望这会有所帮助!

    【讨论】:

    • 谢谢。很好的答案!
    • spanIdString() 不在我正在使用的 Brave 5.4.3 中,但仍然是很好的答案!
    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 2019-07-31
    • 2021-10-08
    相关资源
    最近更新 更多