Skip to content

Commit

Permalink
Add workflow sample monitor
Browse files Browse the repository at this point in the history
Signed-off-by: MregXN <[email protected]>
  • Loading branch information
MregXN committed Dec 10, 2023
1 parent 10ef818 commit 2c293fe
Show file tree
Hide file tree
Showing 5 changed files with 131 additions and 0 deletions.
7 changes: 7 additions & 0 deletions all.sln
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BulkPublishEventExample", "
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WorkflowUnitTest", "examples\Workflow\WorkflowUnitTest\WorkflowUnitTest.csproj", "{8CA09061-2BEF-4506-A763-07062D2BD6AC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkflowMonitor", "examples\Workflow\WorkflowMonitor\WorkflowMonitor.csproj", "{0E3D4544-31FA-458D-8B1C-2F4E4B6D9E64}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -248,6 +250,10 @@ Global
{DDC41278-FB60-403A-B969-2AEBD7C2D83C}.Release|Any CPU.Build.0 = Release|Any CPU
{8CA09061-2BEF-4506-A763-07062D2BD6AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8CA09061-2BEF-4506-A763-07062D2BD6AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0E3D4544-31FA-458D-8B1C-2F4E4B6D9E64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0E3D4544-31FA-458D-8B1C-2F4E4B6D9E64}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0E3D4544-31FA-458D-8B1C-2F4E4B6D9E64}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0E3D4544-31FA-458D-8B1C-2F4E4B6D9E64}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -293,6 +299,7 @@ Global
{4A175C27-EAFE-47E7-90F6-873B37863656} = {0EF6EA64-D7C3-420D-9890-EAE8D54A57E6}
{DDC41278-FB60-403A-B969-2AEBD7C2D83C} = {0EF6EA64-D7C3-420D-9890-EAE8D54A57E6}
{8CA09061-2BEF-4506-A763-07062D2BD6AC} = {BF3ED6BF-ADF3-4D25-8E89-02FB8D945CA9}
{0E3D4544-31FA-458D-8B1C-2F4E4B6D9E64} = {BF3ED6BF-ADF3-4D25-8E89-02FB8D945CA9}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {65220BF2-EAE1-4CB2-AA58-EBE80768CB40}
Expand Down
14 changes: 14 additions & 0 deletions examples/Workflow/WorkflowMonitor/Activities/CheckStatus.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using Dapr.Workflow;

namespace WorkflowMonitor.Activities
{
public class CheckStatus : WorkflowActivity<bool, string>
{
static List<string> status = new List<string>() { "healthy", "unhealthy" };
Random random = new Random();
public override Task<string> RunAsync(WorkflowActivityContext context, bool input)
{
return Task.FromResult<string>(status[random.Next(status.Count)]);
}
}
}
57 changes: 57 additions & 0 deletions examples/Workflow/WorkflowMonitor/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
using Dapr.Client;
using Dapr.Workflow;
using WorkflowMonitor.Activities;
using WorkflowMonitor.Workflows;
using Microsoft.Extensions.Hosting;

const string DaprWorkflowComponent = "dapr";

// The workflow host is a background service that connects to the sidecar over gRPC
var builder = Host.CreateDefaultBuilder(args).ConfigureServices(services =>
{
services.AddDaprWorkflow(options =>
{
options.RegisterWorkflow<DemoWorkflow>();
options.RegisterActivity<CheckStatus>();
});
});

// Dapr uses a random port for gRPC by default. If we don't know what that port
// is (because this app was started separate from dapr), then assume 4001.
if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("DAPR_GRPC_PORT")))
{
Environment.SetEnvironmentVariable("DAPR_GRPC_PORT", "4001");
}

// Start the app - this is the point where we connect to the Dapr sidecar to
// listen for workflow work-items to execute.
using var host = builder.Build();
host.Start();


DaprClient daprClient = new DaprClientBuilder().Build();

while (!await daprClient.CheckHealthAsync())
{
Thread.Sleep(TimeSpan.FromSeconds(5));
}

using (daprClient)
{
Console.WriteLine($"Workflow Started.");
await daprClient.WaitForSidecarAsync();

string instanceId = $"demo-workflow-{Guid.NewGuid().ToString()[..8]}";

bool isHealthy = true;
await daprClient.StartWorkflowAsync(
workflowComponent: DaprWorkflowComponent,
workflowName: nameof(DemoWorkflow),
instanceId: instanceId,
input: isHealthy);


await daprClient.WaitForWorkflowCompletionAsync(
workflowComponent: DaprWorkflowComponent,
instanceId: instanceId);
}
14 changes: 14 additions & 0 deletions examples/Workflow/WorkflowMonitor/WorkflowMonitor.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">

<ItemGroup>
<ProjectReference Include="..\..\..\src\Dapr.Workflow\Dapr.Workflow.csproj" />
</ItemGroup>

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<NoWarn>612,618</NoWarn>
</PropertyGroup>

</Project>
39 changes: 39 additions & 0 deletions examples/Workflow/WorkflowMonitor/Workflows/DemoWorkflow.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using Dapr.Workflow;
using WorkflowMonitor.Activities;

namespace WorkflowMonitor.Workflows
{
public class DemoWorkflow : Workflow<bool, bool>
{
public override async Task<bool> RunAsync(WorkflowContext context, bool isHealthy)
{
string status = await context.CallActivityAsync<string>(nameof(CheckStatus), true);
int next_sleep_interval;
if (!context.IsReplaying)
{
Console.WriteLine($"This job is {status}");
}

if (status == "healthy")
{
isHealthy = true;
next_sleep_interval = 30;
}
else
{
if (isHealthy)
{
isHealthy = false;
}
Console.WriteLine($"Status is unhealthy. Set check interval to 1s");
next_sleep_interval = 5;
}

await context.CreateTimer(TimeSpan.FromSeconds(next_sleep_interval));
context.ContinueAsNew(isHealthy);

// This workflow will never complete.
return true;
}
}
}

0 comments on commit 2c293fe

Please sign in to comment.