diff --git a/src/main/java/com/uber/cadence/converter/JsonDataConverter.java b/src/main/java/com/uber/cadence/converter/JsonDataConverter.java index 72337cec3..aed0c91e5 100644 --- a/src/main/java/com/uber/cadence/converter/JsonDataConverter.java +++ b/src/main/java/com/uber/cadence/converter/JsonDataConverter.java @@ -28,6 +28,7 @@ import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; +import com.uber.m3.tally.Scope; import java.io.IOException; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; @@ -48,12 +49,22 @@ public final class JsonDataConverter implements DataConverter { private static final String TYPE_FIELD_NAME = "type"; private static final String JSON_CONVERTER_TYPE = "JSON"; private static final String CLASS_NAME_FIELD_NAME = "className"; + private static Scope metricsScope; private final Gson gson; public static DataConverter getInstance() { return INSTANCE; } + /** + * Used to set the metrics scope for this class. + * + * @param metricsScope metrics scope to set + */ + public static void setMetricsScope(Scope metricsScope) { + JsonDataConverter.metricsScope = metricsScope; + } + private JsonDataConverter() { this((b) -> b); } @@ -68,7 +79,7 @@ public JsonDataConverter(Function builderInterceptor) new GsonBuilder() .serializeNulls() .registerTypeAdapterFactory(new ThrowableTypeAdapterFactory()) - .registerTypeAdapterFactory(new TBaseTypeAdapterFactory()) + .registerTypeAdapterFactory(new TBaseTypeAdapterFactory(metricsScope)) .registerTypeAdapterFactory(new TEnumTypeAdapterFactory()); GsonBuilder intercepted = builderInterceptor.apply(gsonBuilder); gson = intercepted.create(); diff --git a/src/main/java/com/uber/cadence/converter/TBaseTypeAdapterFactory.java b/src/main/java/com/uber/cadence/converter/TBaseTypeAdapterFactory.java index c27580b4c..c2f4d2b5b 100644 --- a/src/main/java/com/uber/cadence/converter/TBaseTypeAdapterFactory.java +++ b/src/main/java/com/uber/cadence/converter/TBaseTypeAdapterFactory.java @@ -23,6 +23,7 @@ import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; +import com.uber.m3.tally.Scope; import java.io.IOException; import java.nio.charset.StandardCharsets; import org.apache.thrift.TBase; @@ -30,6 +31,8 @@ import org.apache.thrift.TException; import org.apache.thrift.TSerializer; import org.apache.thrift.protocol.TJSONProtocol; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Special handling of TBase message serialization and deserialization. This is to support for @@ -37,6 +40,13 @@ */ public class TBaseTypeAdapterFactory implements TypeAdapterFactory { + private static final Logger logger = LoggerFactory.getLogger(TBaseTypeAdapterFactory.class); + private final Scope metricsScope; + + public TBaseTypeAdapterFactory(Scope metricsScope) { + this.metricsScope = metricsScope; + } + @Override public TypeAdapter create(Gson gson, TypeToken typeToken) { // this class only serializes 'TBase' and its subtypes @@ -47,10 +57,16 @@ public TypeAdapter create(Gson gson, TypeToken typeToken) { new TypeAdapter() { @Override public void write(JsonWriter jsonWriter, T value) throws IOException { + if (metricsScope != null) { + metricsScope.counter("tbase_message_write").inc(1); + } try { String result = newThriftSerializer().toString((TBase) value, StandardCharsets.UTF_8.name()); jsonWriter.value(result); + logger.warn( + "TBase message will no longer be support in cadence-java-client V4, payload {}", + result); } catch (TException e) { throw new DataConverterException("Failed to serialize TBase", e); } @@ -58,8 +74,14 @@ public void write(JsonWriter jsonWriter, T value) throws IOException { @Override public T read(JsonReader jsonReader) throws IOException { + if (metricsScope != null) { + metricsScope.counter("tbase_message_read").inc(1); + } String value = jsonReader.nextString(); try { + logger.warn( + "TBase message will no longer be support in cadence-java-client V4, payload {}", + value); @SuppressWarnings("unchecked") T instance = (T) typeToken.getRawType().getConstructor().newInstance(); newThriftDeserializer() diff --git a/src/main/java/com/uber/cadence/worker/WorkerFactory.java b/src/main/java/com/uber/cadence/worker/WorkerFactory.java index 06113e067..c5f9ef93c 100644 --- a/src/main/java/com/uber/cadence/worker/WorkerFactory.java +++ b/src/main/java/com/uber/cadence/worker/WorkerFactory.java @@ -24,6 +24,7 @@ import com.uber.cadence.PollForDecisionTaskResponse; import com.uber.cadence.client.WorkflowClient; import com.uber.cadence.converter.DataConverter; +import com.uber.cadence.converter.JsonDataConverter; import com.uber.cadence.internal.common.InternalUtils; import com.uber.cadence.internal.metrics.MetricsTag; import com.uber.cadence.internal.replay.DeciderCache; @@ -107,6 +108,9 @@ public WorkerFactory(WorkflowClient workflowClient, WorkerFactoryOptions factory return; } + // initialize the JsonDataConverter with the metrics scope + JsonDataConverter.setMetricsScope(workflowClient.getOptions().getMetricsScope()); + Scope stickyScope = workflowClient .getOptions()