public static async Task <HttpResponseMessage> HttpStart(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
            [OrchestrationClient] DurableOrchestrationClient starter,
            ILogger log)
        {
            string runId          = Guid.NewGuid().ToString();
            int    partitionCount = await GetCosmosDBPartitionCount();

            log.LogInformation("Triggered run for {RunId}. Cosmos DB has {PartitionCount} partitions.", runId, partitionCount);

            LoadGeneratorOptions loadGeneratorOptions = LoadGeneratorOptions.Create(partitionCount, runId, RuntimeMinutes, SleepTimeSeconds);

            await starter.StartNewAsync(LoadGeneratorFunctionName, loadGeneratorOptions);

            return(req.CreateResponse(loadGeneratorOptions));
        }
        public static async Task RunOrchestrator(
            [OrchestrationTrigger] DurableOrchestrationContext context)
        {
            LoadGeneratorOptions options = context.GetInput <LoadGeneratorOptions>();

            int runCount = options.RunCount;

            for (int runNumber = 0; runNumber < runCount; runNumber++)
            {
                Task[] taskList = new Task[options.ItemsPerRunCount];
                for (int runItemNumber = 0; runItemNumber < options.ItemsPerRunCount; runItemNumber++)
                {
                    DocDBRecord docDbRecord = DocDBRecord.Create(runNumber, runItemNumber, options.RunId, context.CurrentUtcDateTime.ToShortTimeString());
                    taskList[runItemNumber] = context.CallActivityAsync(SaveDocumentFunctionName, docDbRecord);
                }

                await Task.WhenAll(taskList);

                await context.CreateTimer(context.CurrentUtcDateTime.AddSeconds(options.SleepTimeInSeconds),
                                          CancellationToken.None);
            }
        }