From ae15cef7b7c75fdee95a6a5ce73ee452f13043f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mathieu?= Date: Thu, 8 Aug 2024 12:23:50 +0200 Subject: [PATCH] fix(core,jdbc): PurgeLog with levels in postgres Fixes #4604 --- .../io/kestra/core/models/executions/LogEntry.java | 5 ++--- .../core/repositories/AbstractLogRepositoryTest.java | 2 +- .../repository/postgres/PostgresLogRepository.java | 6 +++--- .../jdbc/repository/AbstractJdbcLogRepository.java | 10 +++++++--- .../webserver/controllers/api/LogController.java | 2 +- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/io/kestra/core/models/executions/LogEntry.java b/core/src/main/java/io/kestra/core/models/executions/LogEntry.java index f45b997858..2029c03a83 100644 --- a/core/src/main/java/io/kestra/core/models/executions/LogEntry.java +++ b/core/src/main/java/io/kestra/core/models/executions/LogEntry.java @@ -61,14 +61,13 @@ public class LogEntry implements DeletedInterface, TenantInterface { @Builder.Default boolean deleted = false; - public static List findLevelsByMin(Level minLevel) { + public static List findLevelsByMin(Level minLevel) { if (minLevel == null) { - return Arrays.stream(Level.values()).map(Enum::name).toList(); + return Arrays.asList(Level.values()); } return Arrays.stream(Level.values()) .filter(level -> level.toInt() >= minLevel.toInt()) - .map(Enum::name) .toList(); } diff --git a/core/src/test/java/io/kestra/core/repositories/AbstractLogRepositoryTest.java b/core/src/test/java/io/kestra/core/repositories/AbstractLogRepositoryTest.java index 7581ff18a2..de7a8f4bfe 100644 --- a/core/src/test/java/io/kestra/core/repositories/AbstractLogRepositoryTest.java +++ b/core/src/test/java/io/kestra/core/repositories/AbstractLogRepositoryTest.java @@ -149,7 +149,7 @@ void delete() { logRepository.save(log1); - logRepository.deleteByQuery(null, "io.kestra.unittest", "flowId", null, null, ZonedDateTime.now().plusMinutes(1)); + logRepository.deleteByQuery(null, "io.kestra.unittest", "flowId", List.of(Level.TRACE, Level.DEBUG, Level.INFO), null, ZonedDateTime.now().plusMinutes(1)); find = logRepository.findByExecutionId(null, log1.getExecutionId(), null, Pageable.from(1, 50)); assertThat(find.size(), is(0)); diff --git a/jdbc-postgres/src/main/java/io/kestra/repository/postgres/PostgresLogRepository.java b/jdbc-postgres/src/main/java/io/kestra/repository/postgres/PostgresLogRepository.java index 7d5d4bf80d..e58e2597af 100644 --- a/jdbc-postgres/src/main/java/io/kestra/repository/postgres/PostgresLogRepository.java +++ b/jdbc-postgres/src/main/java/io/kestra/repository/postgres/PostgresLogRepository.java @@ -10,6 +10,7 @@ import org.slf4j.event.Level; import java.util.Collections; +import java.util.List; import java.util.stream.Collectors; @@ -27,10 +28,9 @@ protected Condition findCondition(String query) { } @Override - protected Condition minLevel(Level minLevel) { + protected Condition levelsCondition(List levels) { return DSL.condition("level in (" + - LogEntry - .findLevelsByMin(minLevel) + levels .stream() .map(s -> "'" + s + "'::log_level") .collect(Collectors.joining(", ")) + diff --git a/jdbc/src/main/java/io/kestra/jdbc/repository/AbstractJdbcLogRepository.java b/jdbc/src/main/java/io/kestra/jdbc/repository/AbstractJdbcLogRepository.java index a834bb4e8d..c172380178 100644 --- a/jdbc/src/main/java/io/kestra/jdbc/repository/AbstractJdbcLogRepository.java +++ b/jdbc/src/main/java/io/kestra/jdbc/repository/AbstractJdbcLogRepository.java @@ -441,7 +441,7 @@ public int deleteByQuery(String tenantId, String namespace, String flowId, List< } if (logLevels != null) { - delete = delete.and(field("level").in(logLevels)); + delete = delete.and(levelsCondition(logLevels)); } return delete.execute(); @@ -493,7 +493,11 @@ private List query(String tenantId, Condition condition, Level minLeve }); } - protected Condition minLevel(Level minLevel) { - return field("level").in(LogEntry.findLevelsByMin(minLevel)); + private Condition minLevel(Level minLevel) { + return levelsCondition(LogEntry.findLevelsByMin(minLevel)); + } + + protected Condition levelsCondition(List levels) { + return field("level").in(levels.stream().map(level -> level.name()).toList()); } } diff --git a/webserver/src/main/java/io/kestra/webserver/controllers/api/LogController.java b/webserver/src/main/java/io/kestra/webserver/controllers/api/LogController.java index ec21057139..027318c06f 100644 --- a/webserver/src/main/java/io/kestra/webserver/controllers/api/LogController.java +++ b/webserver/src/main/java/io/kestra/webserver/controllers/api/LogController.java @@ -126,7 +126,7 @@ public Flux> follow( @Parameter(description = "The min log level filter") @Nullable @QueryValue Level minLevel ) { AtomicReference cancel = new AtomicReference<>(); - List levels = LogEntry.findLevelsByMin(minLevel); + List levels = LogEntry.findLevelsByMin(minLevel).stream().map(level -> level.name()).toList(); return Flux .>create(emitter -> {