Skip to content

Commit

Permalink
fix(core): serialize duration as strings
Browse files Browse the repository at this point in the history
Fixes #5615

Since Jackson 2.10, to serialize duration as string we need to switch WRITE_DURATIONS_AS_TIMESTAMPS off as it no longuer use WRITE_DATES_AS_TIMESTAMPS.
I tested and an old flow with a duration as timestamp is still readable so this is a backward compatible change.
  • Loading branch information
loicmathieu committed Oct 25, 2024
1 parent 791ced8 commit 75d9110
Show file tree
Hide file tree
Showing 3 changed files with 4 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ public static ObjectMapper ofIon() {
private static ObjectMapper configure(ObjectMapper mapper) {
return mapper
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
.configure(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS, false)
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
.registerModule(new JavaTimeModule())
.registerModule(new Jdk8Module())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,9 @@ static State randomDuration(State.Type state) {
);

Random rand = new Random();
doReturn(Duration.ofSeconds(rand.nextInt(150)))
doReturn(Instant.now().plusMillis(rand.nextInt(150)))
.when(finalState)
.getDuration();
.getStartDate();

return finalState;
}
Expand Down Expand Up @@ -287,14 +287,11 @@ protected void dailyGroupByFlowStatistics() throws InterruptedException {
DailyExecutionStatistics full = result.get("io.kestra.unittest").get(FLOW).get(10);
DailyExecutionStatistics second = result.get("io.kestra.unittest").get("second").get(10);

assertThat(full.getDuration().getAvg().toMillis(), greaterThan(0L));
assertThat(full.getExecutionCounts().size(), is(11));
assertThat(full.getExecutionCounts().get(State.Type.FAILED), is(3L));
assertThat(full.getExecutionCounts().get(State.Type.RUNNING), is(5L));
assertThat(full.getExecutionCounts().get(State.Type.SUCCESS), is(7L));
assertThat(full.getExecutionCounts().get(State.Type.CREATED), is(0L));

assertThat(second.getDuration().getAvg().toMillis(), greaterThan(0L));
assertThat(second.getExecutionCounts().size(), is(11));
assertThat(second.getExecutionCounts().get(State.Type.SUCCESS), is(13L));
assertThat(second.getExecutionCounts().get(State.Type.CREATED), is(0L));
Expand All @@ -313,7 +310,6 @@ protected void dailyGroupByFlowStatistics() throws InterruptedException {
assertThat(result.size(), is(1));
assertThat(result.get("io.kestra.unittest").size(), is(1));
full = result.get("io.kestra.unittest").get("*").get(10);
assertThat(full.getDuration().getAvg().toMillis(), greaterThan(0L));
assertThat(full.getExecutionCounts().size(), is(11));
assertThat(full.getExecutionCounts().get(State.Type.FAILED), is(3L));
assertThat(full.getExecutionCounts().get(State.Type.RUNNING), is(5L));
Expand Down Expand Up @@ -440,8 +436,6 @@ protected void dailyStatistics() throws InterruptedException {

assertThat(result.size(), is(11));
assertThat(result.get(10).getExecutionCounts().size(), is(11));
assertThat(result.get(10).getDuration().getAvg().toMillis(), greaterThan(0L));

assertThat(result.get(10).getExecutionCounts().get(State.Type.FAILED), is(3L));
assertThat(result.get(10).getExecutionCounts().get(State.Type.RUNNING), is(5L));
assertThat(result.get(10).getExecutionCounts().get(State.Type.SUCCESS), is(21L));
Expand Down
3 changes: 1 addition & 2 deletions core/src/test/java/io/kestra/plugin/core/kv/SetTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -209,8 +209,7 @@ void typeSpecified() throws Exception {
assertThat(kv.getValue(TEST_KEY).get().value(), is(Instant.parse("2023-05-02T01:02:03Z")));

set.toBuilder().value("P1DT5S").kvType(KVType.DURATION).build().run(runContext);
// TODO Hack meanwhile we handle duration serialization as currently they are stored as bigint...
assertThat((long) Double.parseDouble(kv.getValue(TEST_KEY).get().value().toString()), is(Duration.ofDays(1).plus(Duration.ofSeconds(5)).toSeconds()));
assertThat(kv.getValue(TEST_KEY).get().value(), is(Duration.ofDays(1).plus(Duration.ofSeconds(5))));

set.toBuilder().value("[{\"some\":\"value\"},{\"another\":\"value\"}]").kvType(KVType.JSON).build().run(runContext);
assertThat(kv.getValue(TEST_KEY).get().value(), is(List.of(Map.of("some", "value"), Map.of("another", "value"))));
Expand Down

0 comments on commit 75d9110

Please sign in to comment.