add nicer query endpoint to perf tests
This commit is contained in:
Родитель
625132690b
Коммит
9851a1de91
|
@ -0,0 +1,159 @@
|
||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
namespace PerformanceTests
|
||||||
|
{
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.Azure.WebJobs;
|
||||||
|
using Microsoft.Azure.WebJobs.Extensions.Http;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Net;
|
||||||
|
|
||||||
|
public static class Queries
|
||||||
|
{
|
||||||
|
[FunctionName(nameof(PagedQuery))]
|
||||||
|
public static async Task<JsonResult> PagedQuery(
|
||||||
|
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "pagedquery")] HttpRequest req,
|
||||||
|
[DurableClient] IDurableClient client,
|
||||||
|
ILogger log)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var queryCondition = new OrchestrationStatusQueryCondition()
|
||||||
|
{
|
||||||
|
PageSize = 100,
|
||||||
|
};
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var parameters = req.GetQueryParameterDictionary();
|
||||||
|
{
|
||||||
|
if (parameters.TryGetValue("runtimeStatus", out string val))
|
||||||
|
{
|
||||||
|
parameters.Remove("runtimeStatus");
|
||||||
|
queryCondition.RuntimeStatus = val
|
||||||
|
.Split(",")
|
||||||
|
.Select(s => (OrchestrationRuntimeStatus)Enum.Parse(typeof(OrchestrationRuntimeStatus), s))
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
if (parameters.TryGetValue("createdTimeFrom", out string val))
|
||||||
|
{
|
||||||
|
parameters.Remove("createdTimeFrom");
|
||||||
|
queryCondition.CreatedTimeFrom = DateTime.Parse(val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
if (parameters.TryGetValue("createdTimeTo", out string val))
|
||||||
|
{
|
||||||
|
parameters.Remove("createdTimeTo");
|
||||||
|
queryCondition.CreatedTimeTo = DateTime.Parse(val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
if (parameters.TryGetValue("pageSize", out string val))
|
||||||
|
{
|
||||||
|
parameters.Remove("pageSize");
|
||||||
|
queryCondition.PageSize = int.Parse(val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
if (parameters.TryGetValue("instanceIdPrefix", out string val))
|
||||||
|
{
|
||||||
|
parameters.Remove("instanceIdPrefix");
|
||||||
|
queryCondition.InstanceIdPrefix = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
if (parameters.TryGetValue("showInput", out string val))
|
||||||
|
{
|
||||||
|
parameters.Remove("showinput");
|
||||||
|
queryCondition.ShowInput = bool.Parse(val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (parameters.Count > 0)
|
||||||
|
{
|
||||||
|
throw new ArgumentException($"invalid parameter: {parameters.First().Key}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(Exception e)
|
||||||
|
{
|
||||||
|
return new JsonResult(new
|
||||||
|
{
|
||||||
|
message = e.Message,
|
||||||
|
})
|
||||||
|
{
|
||||||
|
StatusCode = (int)HttpStatusCode.BadRequest,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
int records = 0;
|
||||||
|
int completed = 0;
|
||||||
|
int inputchars = 0;
|
||||||
|
int pages = 0;
|
||||||
|
|
||||||
|
log.LogWarning($"Querying orchestration instances...");
|
||||||
|
|
||||||
|
var stopwatch = Stopwatch.StartNew();
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
pages++;
|
||||||
|
OrchestrationStatusQueryResult result = await client.ListInstancesAsync(queryCondition, CancellationToken.None);
|
||||||
|
queryCondition.ContinuationToken = result.ContinuationToken;
|
||||||
|
|
||||||
|
foreach (var status in result.DurableOrchestrationState)
|
||||||
|
{
|
||||||
|
records++;
|
||||||
|
|
||||||
|
if (status.RuntimeStatus == OrchestrationRuntimeStatus.Completed)
|
||||||
|
{
|
||||||
|
completed++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status.Input != null)
|
||||||
|
{
|
||||||
|
inputchars += status.Input.ToString().Length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (queryCondition.ContinuationToken != null);
|
||||||
|
|
||||||
|
stopwatch.Stop();
|
||||||
|
double querySec = stopwatch.ElapsedMilliseconds / 1000.0;
|
||||||
|
|
||||||
|
return new JsonResult(new
|
||||||
|
{
|
||||||
|
records,
|
||||||
|
completed,
|
||||||
|
inputchars,
|
||||||
|
pages,
|
||||||
|
querySec,
|
||||||
|
throughput = records > 0 ? (records/querySec).ToString("F2") : "n/a",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
return new JsonResult(new
|
||||||
|
{
|
||||||
|
error = e.ToString()
|
||||||
|
})
|
||||||
|
{
|
||||||
|
StatusCode = (int)HttpStatusCode.InternalServerError,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Загрузка…
Ссылка в новой задаче