elasticsearch 如何将'elasticapmtraceparent'编码为正确的二进制格式?

dwthyt8l  于 2023-01-08  发布在  ElasticSearch
关注(0)|答案(1)|浏览(119)

我尝试使用java代理1.35.0在Elastic APM中捕获完整的端到端跟踪。
我有一个Kafka生产者应用程序,它的底层是Debezium,依赖于OpenTracing实现,因此我必须先将ElasticAPMTracer注册到GlobalTracer:
第一个月
此生产者应用程序已经将消息发布到我的Kafka端点,消息头为elasticapmtraceparentco.elastic.apm.agent.impl.transaction.TraceContext#TRACE_PARENT_BINARY_HEADER_NAME
这个头被从字符串编码为字节数组,这就是出错的地方。Elastic期望某些部分被从十六进制字符串编码为二进制,这不是默认行为,因为串行化器没有这样配置。
因此,我想出了一个解决方案,以预期的格式编码,我的Kafka消费者应用程序(基于Sping Boot )现在使用这个头作为它们的当前跟踪ID,因此完整的端到端跟踪正在工作。
然而,我仍然不明白这会如此复杂,难道没有比手动组合此跟踪ID更干净的方法吗?

private void fillOutgoingTraceParentBinaryHeader(byte[] buffer, String traceParentHeader) {
        if (traceParentHeader == null || traceParentHeader.length() < TEXT_HEADER_EXPECTED_LENGTH) {
            log.warn("Trace parent header is null or does not have the minimal required length: {}", TEXT_HEADER_EXPECTED_LENGTH);
            return;
        }

        if (buffer.length < 29) {
            log.warn("Given byte array does not have the minimal required length - {}", 29);
            return;
        }

        var traceParentHeaderArr = traceParentHeader.split(SPLIT_CHAR);

        var traceId = hexStringToByteArray(traceParentHeaderArr[1]);
        var parentId = hexStringToByteArray(traceParentHeaderArr[2]);

        System.arraycopy(parentId, 0, buffer, 19, parentId.length);

        buffer[0] = 0;
        buffer[1] = 0;
        System.arraycopy(traceId, 0, buffer, 2, traceId.length);
        buffer[18] = 1;
        System.arraycopy(parentId, 0, buffer, 19, parentId.length);
        buffer[27] = 2;
        buffer[28] = getNextByte(traceParentHeader, 53);
    }

很高兴听到你对这个主题的看法。

thigvfpy

thigvfpy1#

没有实现elasticapmtraceparent编码器。几周前我遇到了这个问题,而且我不得不写自己的解析器,这和你的非常相似。

相关问题