Github user tillrohrmann commented on a diff in the pull request:
https://github.com/apache/flink/pull/4688#discussion_r140236062
--- Diff:
flink-runtime/src/main/java/org/apache/flink/runtime/messages/webmonitor/JobDetails.java
---
@@ -145,8 +180,89 @@ public String toString() {
", endTime=" + endTime +
", status=" + status +
", lastUpdateTime=" + lastUpdateTime +
- ", numVerticesPerExecutionState=" +
Arrays.toString(numVerticesPerExecutionState) +
+ ", numVerticesPerExecutionState=" +
Arrays.toString(tasksPerState) +
", numTasks=" + numTasks +
'}';
}
+
+ public static final class JobDetailsSerializer extends
StdSerializer<JobDetails> {
+ private static final long serialVersionUID =
7915913423515194428L;
+
+ public JobDetailsSerializer() {
+ super(JobDetails.class);
+ }
+
+ @Override
+ public void serialize(
+ JobDetails jobDetails,
+ JsonGenerator jsonGenerator,
+ SerializerProvider serializerProvider) throws
IOException {
+ jsonGenerator.writeStartObject();
+
+ jsonGenerator.writeStringField(FIELD_NAME_JOB_ID,
jobDetails.getJobId().toString());
+ jsonGenerator.writeStringField(FIELD_NAME_JOB_NAME,
jobDetails.getJobName());
+ jsonGenerator.writeStringField(FIELD_NAME_STATUS,
jobDetails.getStatus().name());
+
+ jsonGenerator.writeNumberField(FIELD_NAME_START_TIME,
jobDetails.getStartTime());
+ jsonGenerator.writeNumberField(FIELD_NAME_END_TIME,
jobDetails.getEndTime());
+ jsonGenerator.writeNumberField(FIELD_NAME_DURATION,
jobDetails.getDuration());
+
jsonGenerator.writeNumberField(FIELD_NAME_LAST_MODIFICATION,
jobDetails.getLastUpdateTime());
+
+ jsonGenerator.writeObjectFieldStart("tasks");
+
jsonGenerator.writeNumberField(FIELD_NAME_TOTAL_NUMBER_TASKS,
jobDetails.getNumTasks());
+
+ final int[] perState = jobDetails.getTasksPerState();
+
+ for (ExecutionState executionState :
ExecutionState.values()) {
+
jsonGenerator.writeNumberField(executionState.name().toLowerCase(),
perState[executionState.ordinal()]);
+ }
--- End diff --
I think it's actually alright to have a custom
serialization/deserialization logic defined if needed. I think this should be
more efficient than the generic serialization because you don't have to use
reflection magic. Moreover, it's encapsulated in the `JobDetails class. Thus,
if need is there, then this could also be changed as you've proposed.
---