fix: 修复开启链路追踪后可能报错问题 (#407)

This commit is contained in:
老周 2023-08-17 16:10:52 +08:00 committed by GitHub
parent 7d750a1e0c
commit f84621178b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 227 additions and 7 deletions

View File

@ -72,7 +72,6 @@
<dependency>
<groupId>de.ruedigermoeller</groupId>
<artifactId>fst</artifactId>
<version>2.57</version>
</dependency>
<dependency>
@ -90,36 +89,53 @@
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-exporter-logging</artifactId>
<version>1.14.0</version>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk-trace</artifactId>
<version>1.14.0</version>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk</artifactId>
<version>1.14.0</version>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-exporter-jaeger</artifactId>
<version>1.14.0</version>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-exporter-common</artifactId>
<version>${opentelemetry.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jr</groupId>
<artifactId>jackson-jr-objects</artifactId>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.53.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty</artifactId>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>1.47.0</version>
<exclusions>
<exclusion>
<groupId>io.netty</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
@ -133,11 +149,22 @@
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.jetlinks.community</groupId>
<artifactId>timeseries-component</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,139 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.exporter.jaeger;
import com.fasterxml.jackson.jr.ob.JSON;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.exporter.internal.marshal.MarshalerUtil;
import io.opentelemetry.exporter.internal.marshal.MarshalerWithSize;
import io.opentelemetry.exporter.internal.marshal.ProtoEnumInfo;
import io.opentelemetry.exporter.internal.marshal.Serializer;
import io.opentelemetry.exporter.jaeger.proto.api_v2.internal.KeyValue;
import io.opentelemetry.exporter.jaeger.proto.api_v2.internal.ValueType;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
@SuppressWarnings({
"checkstyle:LocalVariableName",
"checkstyle:MemberName",
"checkstyle:ParameterName",
})
final class KeyValueMarshaler extends MarshalerWithSize {
private static final byte[] EMPTY_BYTES = new byte[0];
private final byte[] keyUtf8;
private final ProtoEnumInfo valueType;
private final byte[] vStrUtf8;
private final boolean vBool;
private final long vInt64;
private final double vFloat64;
static List<KeyValueMarshaler> createRepeated(Attributes attributes) {
if (attributes.isEmpty()) {
return new ArrayList<>();
}
List<KeyValueMarshaler> marshalers = new ArrayList<>(attributes.size());
attributes.forEach((attributeKey, o) -> marshalers.add(create(attributeKey, o)));
return marshalers;
}
static KeyValueMarshaler create(AttributeKey<?> key, Object value) {
byte[] keyUtf8 = MarshalerUtil.toBytes(key.getKey());
// Default is the 0 value, string in this case
ProtoEnumInfo valueType = ValueType.STRING;
byte[] vStrUtf8 = EMPTY_BYTES;
boolean vBool = false;
long vInt64 = 0;
double vFloat64 = 0;
if (value instanceof Supplier) {
value = ((Supplier<?>) value).get();
}
switch (key.getType()) {
case STRING:
valueType = ValueType.STRING;
vStrUtf8 = MarshalerUtil.toBytes(String.valueOf(value));
break;
case BOOLEAN:
valueType = ValueType.BOOL;
vBool = (boolean) value;
break;
case LONG:
valueType = ValueType.INT64;
vInt64 = (long) value;
break;
case DOUBLE:
valueType = ValueType.FLOAT64;
vFloat64 = (double) value;
break;
case STRING_ARRAY:
case BOOLEAN_ARRAY:
case LONG_ARRAY:
case DOUBLE_ARRAY:
valueType = ValueType.STRING;
try {
vStrUtf8 = JSON.std.asBytes(value);
} catch (IOException e) {
// Can't happen, just ignore it.
}
break;
}
return new KeyValueMarshaler(keyUtf8, valueType, vStrUtf8, vBool, vInt64, vFloat64);
}
KeyValueMarshaler(
byte[] keyUtf8,
ProtoEnumInfo valueType,
byte[] vStrUtf8,
boolean vBool,
long vInt64,
double vFloat64) {
super(calculateSize(keyUtf8, valueType, vStrUtf8, vBool, vInt64, vFloat64));
this.keyUtf8 = keyUtf8;
this.valueType = valueType;
this.vStrUtf8 = vStrUtf8;
this.vBool = vBool;
this.vInt64 = vInt64;
this.vFloat64 = vFloat64;
}
@Override
protected void writeTo(Serializer output) throws IOException {
output.serializeString(KeyValue.KEY, keyUtf8);
output.serializeEnum(KeyValue.V_TYPE, valueType);
output.serializeString(KeyValue.V_STR, vStrUtf8);
output.serializeBool(KeyValue.V_BOOL, vBool);
output.serializeInt64(KeyValue.V_INT64, vInt64);
output.serializeDouble(KeyValue.V_FLOAT64, vFloat64);
}
private static int calculateSize(
byte[] keyUtf8,
ProtoEnumInfo valueType,
byte[] vStrUtf8,
boolean vBool,
long vInt64,
double vFloat64) {
int size = 0;
size += MarshalerUtil.sizeBytes(KeyValue.KEY, keyUtf8);
size += MarshalerUtil.sizeEnum(KeyValue.V_TYPE, valueType);
size += MarshalerUtil.sizeBytes(KeyValue.V_STR, vStrUtf8);
size += MarshalerUtil.sizeBool(KeyValue.V_BOOL, vBool);
size += MarshalerUtil.sizeInt64(KeyValue.V_INT64, vInt64);
size += MarshalerUtil.sizeDouble(KeyValue.V_FLOAT64, vFloat64);
return size;
}
}

54
pom.xml
View File

@ -50,6 +50,8 @@
<swagger.version>2.2.8</swagger.version>
<jna.version>5.12.1</jna.version>
<aliyun.sdk.core>4.5.2</aliyun.sdk.core>
<fst.version>2.57</fst.version>
<grpc.version>1.53.0</grpc.version>
</properties>
@ -188,6 +190,18 @@
<dependencies>
<dependency>
<groupId>io.asyncer</groupId>
<artifactId>r2dbc-mysql</artifactId>
<version>0.9.3</version>
</dependency>
<dependency>
<groupId>de.ruedigermoeller</groupId>
<artifactId>fst</artifactId>
<version>${fst.version}</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
@ -359,6 +373,21 @@
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-bom</artifactId>
<version>${opentelemetry.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-semconv</artifactId>
<version>${opentelemetry.version}-alpha</version>
</dependency>
<dependency>
<groupId>io.r2dbc</groupId>
<artifactId>r2dbc-bom</artifactId>
@ -478,6 +507,31 @@
<version>${aliyun.sdk.core}</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>${grpc.version}</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty</artifactId>
<version>${grpc.version}</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>${grpc.version}</version>
<exclusions>
<exclusion>
<groupId>io.netty</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>