From 81a3058223c0bde8c04e841d56ef0928fa625f29 Mon Sep 17 00:00:00 2001 From: Ryan Lettieri <67934986+RyanLettieri@users.noreply.github.com> Date: Fri, 5 Jan 2024 17:21:59 -0700 Subject: [PATCH] Improving and Adding Logs for Workflow (#978) * Initial push for improving/adding logs for workflow Signed-off-by: Ryan Lettieri * Cleaning up linter issues Signed-off-by: Ryan Lettieri * Altering log level for logging registered activities and workflows Signed-off-by: Ryan Lettieri * Adding in time format to workflow log statements Signed-off-by: Ryan Lettieri * Fixing month format for workflow logs Signed-off-by: Ryan Lettieri * Adding in logging test for workflow Signed-off-by: Ryan Lettieri * Removing log-level setting from workflow sdk Signed-off-by: Ryan Lettieri * Removing time format logging from workflow sdk Signed-off-by: Ryan Lettieri * Fixing workflow logging test Signed-off-by: Ryan Lettieri * Update WorkflowRuntimeBuilderTest.java Signed-off-by: Artur Souza --------- Signed-off-by: Ryan Lettieri Signed-off-by: Artur Souza Co-authored-by: Artur Souza --- .../runtime/WorkflowRuntimeBuilder.java | 21 ++++++++- .../runtime/WorkflowRuntimeBuilderTest.java | 46 +++++++++++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/sdk-workflows/src/main/java/io/dapr/workflows/runtime/WorkflowRuntimeBuilder.java b/sdk-workflows/src/main/java/io/dapr/workflows/runtime/WorkflowRuntimeBuilder.java index fb9ed14a4..99d8a0d7b 100644 --- a/sdk-workflows/src/main/java/io/dapr/workflows/runtime/WorkflowRuntimeBuilder.java +++ b/sdk-workflows/src/main/java/io/dapr/workflows/runtime/WorkflowRuntimeBuilder.java @@ -19,14 +19,26 @@ import io.dapr.workflows.Workflow; import io.dapr.workflows.internal.ApiTokenClientInterceptor; import io.grpc.ClientInterceptor; +import java.util.HashSet; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; + public class WorkflowRuntimeBuilder { private static volatile WorkflowRuntime instance; private DurableTaskGrpcWorkerBuilder builder; + private Logger logger; + private Set workflows = new HashSet(); + private Set activities = new HashSet(); private static ClientInterceptor WORKFLOW_INTERCEPTOR = new ApiTokenClientInterceptor(); + /** + * Constructs the WorkflowRuntimeBuilder. + */ public WorkflowRuntimeBuilder() { this.builder = new DurableTaskGrpcWorkerBuilder().grpcChannel( NetworkUtils.buildGrpcManagedChannel(WORKFLOW_INTERCEPTOR)); + this.logger = Logger.getLogger(WorkflowRuntimeBuilder.class.getName()); } /** @@ -42,6 +54,7 @@ public class WorkflowRuntimeBuilder { } } } + this.logger.log(Level.INFO, "Successfully built dapr workflow runtime"); return instance; } @@ -56,7 +69,8 @@ public class WorkflowRuntimeBuilder { this.builder = this.builder.addOrchestration( new OrchestratorWrapper<>(clazz) ); - + this.logger.log(Level.INFO, "Registered Workflow: " + clazz.getSimpleName()); + this.workflows.add(clazz.getSimpleName()); return this; } @@ -70,5 +84,8 @@ public class WorkflowRuntimeBuilder { this.builder = this.builder.addActivity( new ActivityWrapper<>(clazz) ); + this.logger.log(Level.INFO, "Registered Activity: " + clazz.getSimpleName()); + this.activities.add(clazz.getSimpleName()); } -} + +} \ No newline at end of file diff --git a/sdk-workflows/src/test/java/io/dapr/workflows/runtime/WorkflowRuntimeBuilderTest.java b/sdk-workflows/src/test/java/io/dapr/workflows/runtime/WorkflowRuntimeBuilderTest.java index faded869b..e563a04f7 100644 --- a/sdk-workflows/src/test/java/io/dapr/workflows/runtime/WorkflowRuntimeBuilderTest.java +++ b/sdk-workflows/src/test/java/io/dapr/workflows/runtime/WorkflowRuntimeBuilderTest.java @@ -5,8 +5,15 @@ import io.dapr.workflows.Workflow; import io.dapr.workflows.WorkflowStub; import org.junit.jupiter.api.Test; +import static org.junit.Assert.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.logging.Logger; +import java.util.logging.Handler; +import java.util.logging.LogRecord; + public class WorkflowRuntimeBuilderTest { public static class TestWorkflow extends Workflow { @Override @@ -37,4 +44,43 @@ public class WorkflowRuntimeBuilderTest { public void buildTest() { assertDoesNotThrow(() -> new WorkflowRuntimeBuilder().build()); } + + @Test + public void loggingOutputTest() { + // Set the output stream for log capturing + ByteArrayOutputStream outStreamCapture = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outStreamCapture)); + + LogCaptureHandler testLoggerHandler = new LogCaptureHandler(); + Logger testLogger = Logger.getLogger(WorkflowRuntimeBuilder.class.getName()); + + testLogger.addHandler(testLoggerHandler); + + // indexOf will return -1 if the string is not found. + assertDoesNotThrow(() -> new WorkflowRuntimeBuilder().registerWorkflow(TestWorkflow.class)); + assertNotEquals(-1, testLoggerHandler.capturedLog.indexOf("Registered Workflow: TestWorkflow")); + assertDoesNotThrow(() -> new WorkflowRuntimeBuilder().registerActivity(TestActivity.class)); + assertNotEquals(-1, testLoggerHandler.capturedLog.indexOf("Registered Activity: TestActivity")); + + WorkflowRuntimeBuilder wfRuntime = new WorkflowRuntimeBuilder(); + + wfRuntime.build(); + } + + private static class LogCaptureHandler extends Handler { + private StringBuilder capturedLog = new StringBuilder(); + + @Override + public void publish(LogRecord record) { + capturedLog.append(record.getMessage()).append(System.lineSeparator()); + } + + @Override + public void flush(){ + } + + @Override + public void close() throws SecurityException { + } + } }