我尝试使用java代理1.35.0在Elastic APM中捕获完整的端到端跟踪。
我有一个Kafka生产者应用程序,它的底层是Debezium,依赖于OpenTracing实现,因此我必须先将ElasticAPMTracer注册到GlobalTracer:
第一个月
此生产者应用程序已经将消息发布到我的Kafka端点,消息头为elasticapmtraceparent
。co.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);
}
很高兴听到你对这个主题的看法。
1条答案
按热度按时间thigvfpy1#
没有实现elasticapmtraceparent编码器。几周前我遇到了这个问题,而且我不得不写自己的解析器,这和你的非常相似。