diff --git a/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetUsageTracker.cs b/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetUsageTracker.cs index dc7e37563..edd3b9e75 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetUsageTracker.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetUsageTracker.cs @@ -57,9 +57,9 @@ namespace Squidex.Domain.Apps.Entities.Assets return enriched; } - private static void AddCounters(List enriched, List<(DateTime Date, Counters Counters)>? byCategory) + private static void AddCounters(List enriched, List<(DateTime, Counters)> details) { - foreach (var (date, counters) in byCategory) + foreach (var (date, counters) in details) { var totalCount = counters.GetInt64(CounterTotalCount); var totalSize = counters.GetInt64(CounterTotalSize); diff --git a/backend/src/Squidex.Domain.Apps.Entities/Rules/UsageTracking/UsageTrackerGrain.cs b/backend/src/Squidex.Domain.Apps.Entities/Rules/UsageTracking/UsageTrackerGrain.cs index 19bda5034..6aeeaa976 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Rules/UsageTracking/UsageTrackerGrain.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Rules/UsageTracking/UsageTrackerGrain.cs @@ -83,18 +83,18 @@ namespace Squidex.Domain.Apps.Entities.Rules.UsageTracking if (!target.Triggered.HasValue || target.Triggered < from) { - var usage = await usageTracker.GetMonthlyWeightAsync(target.AppId.Id.ToString(), today); + var costs = await usageTracker.GetMonthCostsAsync(target.AppId.Id.ToString(), today); var limit = target.Limits; - if (usage > limit) + if (costs > limit) { target.Triggered = today; var @event = new AppUsageExceeded { AppId = target.AppId, - CallsCurrent = usage, + CallsCurrent = costs, CallsLimit = limit, RuleId = key }; diff --git a/backend/src/Squidex.Infrastructure/UsageTracking/ApiStats.cs b/backend/src/Squidex.Infrastructure/UsageTracking/ApiStats.cs index a9aae0ea9..52f3c3b3e 100644 --- a/backend/src/Squidex.Infrastructure/UsageTracking/ApiStats.cs +++ b/backend/src/Squidex.Infrastructure/UsageTracking/ApiStats.cs @@ -5,22 +5,28 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== +using System; + namespace Squidex.Infrastructure.UsageTracking { public sealed class ApiStats { + public DateTime Date { get; } + public long TotalCalls { get; } public long TotalBytes { get; } - public double AverageElapsed { get; } + public double AverageElapsedMs { get; } - public ApiStats(long totalCalls, double averageElapsed, long totalBytes) + public ApiStats(DateTime date, long totalCalls, double averageElapsedMs, long totalBytes) { + Date = date; + TotalCalls = totalCalls; TotalBytes = totalBytes; - AverageElapsed = averageElapsed; + AverageElapsedMs = averageElapsedMs; } } } diff --git a/backend/src/Squidex.Infrastructure/UsageTracking/ApiStatsSummary.cs b/backend/src/Squidex.Infrastructure/UsageTracking/ApiStatsSummary.cs new file mode 100644 index 000000000..292245cde --- /dev/null +++ b/backend/src/Squidex.Infrastructure/UsageTracking/ApiStatsSummary.cs @@ -0,0 +1,26 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +namespace Squidex.Infrastructure.UsageTracking +{ + public sealed class ApiStatsSummary + { + public long TotalCalls { get; } + + public long TotalBytes { get; } + + public double AverageElapsedMs { get; } + + public ApiStatsSummary(long totalCalls, double averageElapsedMs, long totalBytes) + { + TotalCalls = totalCalls; + TotalBytes = totalBytes; + + AverageElapsedMs = averageElapsedMs; + } + } +} diff --git a/backend/src/Squidex.Infrastructure/UsageTracking/ApiUsageTracker.cs b/backend/src/Squidex.Infrastructure/UsageTracking/ApiUsageTracker.cs index 38e4f6e9d..f1102954a 100644 --- a/backend/src/Squidex.Infrastructure/UsageTracking/ApiUsageTracker.cs +++ b/backend/src/Squidex.Infrastructure/UsageTracking/ApiUsageTracker.cs @@ -14,7 +14,7 @@ namespace Squidex.Infrastructure.UsageTracking public sealed class ApiUsageTracker : IApiUsageTracker { public const string CounterTotalBytes = "TotalBytes"; - public const string CounterTotalWeight = "TotalWeight"; + public const string CounterTotalCosts = "TotalCosts"; public const string CounterTotalCalls = "TotalCalls"; public const string CounterTotalElapsedMs = "TotalElapsedMs"; private readonly IUsageTracker usageTracker; @@ -24,37 +24,37 @@ namespace Squidex.Infrastructure.UsageTracking this.usageTracker = usageTracker; } - public async Task GetMonthlyWeightAsync(string key, DateTime date) + public async Task GetMonthCostsAsync(string key, DateTime date) { var apiKey = GetKey(key); var counters = await usageTracker.GetForMonthAsync(apiKey, date); - return counters.GetInt64(CounterTotalWeight); + return counters.GetInt64(CounterTotalCosts); } - public Task TrackAsync(DateTime date, string key, string? category, double weight, long elapsed, long bytes) + public Task TrackAsync(DateTime date, string key, string? category, double costs, long elapsedMs, long bytes) { var apiKey = GetKey(key); var counters = new Counters { - [CounterTotalWeight] = weight, + [CounterTotalCosts] = costs, [CounterTotalCalls] = 1, - [CounterTotalElapsedMs] = elapsed, + [CounterTotalElapsedMs] = elapsedMs, [CounterTotalBytes] = bytes }; return usageTracker.TrackAsync(date, apiKey, category, counters); } - public async Task<(ApiStats Summary, Dictionary> Details)> QueryAsync(string key, DateTime fromDate, DateTime toDate) + public async Task<(ApiStatsSummary, Dictionary> Details)> QueryAsync(string key, DateTime fromDate, DateTime toDate) { var apiKey = GetKey(key); var queries = await usageTracker.QueryAsync(apiKey, fromDate, toDate); - var result = new Dictionary>(); + var details = new Dictionary>(); var summaryBytes = 0L; var summaryCalls = 0L; @@ -62,30 +62,30 @@ namespace Squidex.Infrastructure.UsageTracking foreach (var (category, usages) in queries) { - var resultByCategory = new List<(DateTime Date, ApiStats)>(); + var resultByCategory = new List(); - foreach (var usage in usages) + foreach (var (date, counters) in usages) { - var dateBytes = usage.Counters.GetInt64(CounterTotalBytes); - var dateCalls = usage.Counters.GetInt64(CounterTotalCalls); - var dateElapsed = usage.Counters.GetInt64(CounterTotalElapsedMs); + var dateBytes = counters.GetInt64(CounterTotalBytes); + var dateCalls = counters.GetInt64(CounterTotalCalls); + var dateElapsed = counters.GetInt64(CounterTotalElapsedMs); var dateElapsedAvg = CalculateAverage(dateCalls, dateElapsed); - resultByCategory.Add((usage.Date, new ApiStats(dateCalls, dateElapsedAvg, dateBytes))); + resultByCategory.Add(new ApiStats(date, dateCalls, dateElapsedAvg, dateBytes)); summaryBytes += dateBytes; summaryCalls += dateCalls; summaryElapsed += dateElapsed; } - result[category] = resultByCategory; + details[category] = resultByCategory; } var summaryElapsedAvg = CalculateAverage(summaryCalls, summaryElapsed); - var summary = new ApiStats(summaryCalls, summaryElapsedAvg, summaryBytes); + var summary = new ApiStatsSummary(summaryCalls, summaryElapsedAvg, summaryBytes); - return (summary, result); + return (summary, details); } private static double CalculateAverage(long calls, long elapsed) diff --git a/backend/src/Squidex.Infrastructure/UsageTracking/BackgroundUsageTracker.cs b/backend/src/Squidex.Infrastructure/UsageTracking/BackgroundUsageTracker.cs index afd65c29a..92862556f 100644 --- a/backend/src/Squidex.Infrastructure/UsageTracking/BackgroundUsageTracker.cs +++ b/backend/src/Squidex.Infrastructure/UsageTracking/BackgroundUsageTracker.cs @@ -100,7 +100,7 @@ namespace Squidex.Infrastructure.UsageTracking return Task.CompletedTask; } - public async Task>> QueryAsync(string key, DateTime fromDate, DateTime toDate) + public async Task>> QueryAsync(string key, DateTime fromDate, DateTime toDate) { Guard.NotNullOrEmpty(key); diff --git a/backend/src/Squidex.Infrastructure/UsageTracking/CachingUsageTracker.cs b/backend/src/Squidex.Infrastructure/UsageTracking/CachingUsageTracker.cs index f12ec9315..79bd09be9 100644 --- a/backend/src/Squidex.Infrastructure/UsageTracking/CachingUsageTracker.cs +++ b/backend/src/Squidex.Infrastructure/UsageTracking/CachingUsageTracker.cs @@ -26,7 +26,7 @@ namespace Squidex.Infrastructure.UsageTracking this.inner = inner; } - public Task>> QueryAsync(string key, DateTime fromDate, DateTime toDate) + public Task>> QueryAsync(string key, DateTime fromDate, DateTime toDate) { Guard.NotNull(key); diff --git a/backend/src/Squidex.Infrastructure/UsageTracking/IApiUsageTracker.cs b/backend/src/Squidex.Infrastructure/UsageTracking/IApiUsageTracker.cs index c8946c1fb..5d2abed75 100644 --- a/backend/src/Squidex.Infrastructure/UsageTracking/IApiUsageTracker.cs +++ b/backend/src/Squidex.Infrastructure/UsageTracking/IApiUsageTracker.cs @@ -13,10 +13,10 @@ namespace Squidex.Infrastructure.UsageTracking { public interface IApiUsageTracker { - Task TrackAsync(DateTime date, string key, string? category, double weight, long elapsed, long bytes); + Task TrackAsync(DateTime date, string key, string? category, double costs, long elapsedMs, long bytes); - Task GetMonthlyWeightAsync(string key, DateTime date); + Task GetMonthCostsAsync(string key, DateTime date); - Task<(ApiStats Summary, Dictionary> Details)> QueryAsync(string key, DateTime fromDate, DateTime toDate); + Task<(ApiStatsSummary, Dictionary> Details)> QueryAsync(string key, DateTime fromDate, DateTime toDate); } } diff --git a/backend/src/Squidex.Infrastructure/UsageTracking/IUsageTracker.cs b/backend/src/Squidex.Infrastructure/UsageTracking/IUsageTracker.cs index 9ccae462e..48d793128 100644 --- a/backend/src/Squidex.Infrastructure/UsageTracking/IUsageTracker.cs +++ b/backend/src/Squidex.Infrastructure/UsageTracking/IUsageTracker.cs @@ -19,6 +19,6 @@ namespace Squidex.Infrastructure.UsageTracking Task GetAsync(string key, DateTime fromDate, DateTime toDate); - Task>> QueryAsync(string key, DateTime fromDate, DateTime toDate); + Task>> QueryAsync(string key, DateTime fromDate, DateTime toDate); } } diff --git a/backend/src/Squidex.Web/ApiCostsAttribute.cs b/backend/src/Squidex.Web/ApiCostsAttribute.cs index 0b07afc23..65c96b641 100644 --- a/backend/src/Squidex.Web/ApiCostsAttribute.cs +++ b/backend/src/Squidex.Web/ApiCostsAttribute.cs @@ -14,12 +14,12 @@ namespace Squidex.Web [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public sealed class ApiCostsAttribute : ServiceFilterAttribute, IApiCostsFeature { - public double Weight { get; } + public double Costs { get; } - public ApiCostsAttribute(double weight) + public ApiCostsAttribute(double costs) : base(typeof(ApiCostsFilter)) { - Weight = weight; + Costs = costs; } } } diff --git a/backend/src/Squidex.Web/IApiCostsFeature.cs b/backend/src/Squidex.Web/IApiCostsFeature.cs index 9f1e380f5..b0cbcee8b 100644 --- a/backend/src/Squidex.Web/IApiCostsFeature.cs +++ b/backend/src/Squidex.Web/IApiCostsFeature.cs @@ -9,6 +9,6 @@ namespace Squidex.Web { public interface IApiCostsFeature { - double Weight { get; } + double Costs { get; } } } \ No newline at end of file diff --git a/backend/src/Squidex.Web/Pipeline/ApiCostsFilter.cs b/backend/src/Squidex.Web/Pipeline/ApiCostsFilter.cs index f5bb3c123..430b1340c 100644 --- a/backend/src/Squidex.Web/Pipeline/ApiCostsFilter.cs +++ b/backend/src/Squidex.Web/Pipeline/ApiCostsFilter.cs @@ -55,13 +55,13 @@ namespace Squidex.Web.Pipeline { var appId = app.Id.ToString(); - if (FilterDefinition.Weight > 0) + if (FilterDefinition.Costs > 0) { using (Profiler.Trace("CheckUsage")) { var (plan, _) = appPlansProvider.GetPlanForApp(app); - var usage = await usageTracker.GetMonthlyWeightAsync(appId, DateTime.Today); + var usage = await usageTracker.GetMonthCostsAsync(appId, DateTime.Today); if (plan.BlockingApiCalls >= 0 && usage > plan.BlockingApiCalls) { diff --git a/backend/src/Squidex.Web/Pipeline/RequestLogPerformanceMiddleware.cs b/backend/src/Squidex.Web/Pipeline/RequestLogPerformanceMiddleware.cs index 27e3d39f3..dff21bd50 100644 --- a/backend/src/Squidex.Web/Pipeline/RequestLogPerformanceMiddleware.cs +++ b/backend/src/Squidex.Web/Pipeline/RequestLogPerformanceMiddleware.cs @@ -84,7 +84,7 @@ namespace Squidex.Web.Pipeline c.WriteProperty(nameof(clientId), clientId); } - var costs = httpContext.Features.Get()?.Weight ?? 0; + var costs = httpContext.Features.Get()?.Costs ?? 0; c.WriteProperty(nameof(costs), costs); } diff --git a/backend/src/Squidex.Web/Pipeline/UsageMiddleware.cs b/backend/src/Squidex.Web/Pipeline/UsageMiddleware.cs index 6486bc471..131f5eabd 100644 --- a/backend/src/Squidex.Web/Pipeline/UsageMiddleware.cs +++ b/backend/src/Squidex.Web/Pipeline/UsageMiddleware.cs @@ -49,11 +49,11 @@ namespace Squidex.Web.Pipeline { if (context.Response.StatusCode != StatusCodes.Status429TooManyRequests) { - var app = context.Features.Get()?.AppId; + var appId = context.Features.Get()?.AppId; - var costs = context.Features.Get()?.Weight ?? 0; + var costs = context.Features.Get()?.Costs ?? 0; - if (app != null) + if (appId != null) { var elapsedMs = watch.Stop(); @@ -62,7 +62,7 @@ namespace Squidex.Web.Pipeline var userId = context.User.OpenIdSubject(); var userClient = context.User.OpenIdClientId(); - await log.LogAsync(app.Id, now, + await log.LogAsync(appId.Id, now, context.Request.Method, context.Request.Path, userId, @@ -72,11 +72,16 @@ namespace Squidex.Web.Pipeline if (costs > 0) { - var bytes = usageBody.BytesWritten + (context.Request.ContentLength ?? 0); + var bytes = usageBody.BytesWritten; + + if (context.Request.ContentLength != null) + { + bytes += context.Request.ContentLength.Value; + } var date = now.ToDateTimeUtc().Date; - await usageTracker.TrackAsync(date, app.Id.ToString(), userClient, costs, elapsedMs, bytes); + await usageTracker.TrackAsync(date, appId.Id.ToString(), userClient, costs, elapsedMs, bytes); } } } @@ -94,4 +99,4 @@ namespace Squidex.Web.Pipeline return usageBody; } } -} +} \ No newline at end of file diff --git a/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/ApiUsageDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/ApiUsageDto.cs index 829af9c76..b1c49530e 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/ApiUsageDto.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/ApiUsageDto.cs @@ -30,18 +30,16 @@ namespace Squidex.Areas.Api.Controllers.Statistics.Models /// /// The average duration in milliseconds. /// - public double AverageMs { get; set; } + public double AverageElapsedMs { get; set; } - public static ApiUsageDto FromUsage((DateTime Date, ApiStats Stats) dateStatistics) + public static ApiUsageDto FromStats(ApiStats stats) { - var (date, stats) = dateStatistics; - return new ApiUsageDto { - Date = date, + Date = stats.Date, TotalBytes = stats.TotalBytes, TotalCalls = stats.TotalCalls, - AverageMs = stats.AverageElapsed, + AverageElapsedMs = stats.AverageElapsedMs, }; } } diff --git a/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/ApiUsagesDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/ApiUsagesDto.cs index 32727f6e9..780272a5a 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/ApiUsagesDto.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/ApiUsagesDto.cs @@ -33,7 +33,7 @@ namespace Squidex.Areas.Api.Controllers.Statistics.Models /// /// The average duration in milliseconds. /// - public double AverageMs { get; set; } + public double AverageElapsedMs { get; set; } /// /// The statistics by date and group. @@ -41,15 +41,15 @@ namespace Squidex.Areas.Api.Controllers.Statistics.Models [Required] public Dictionary Details { get; set; } - public static ApiUsagesDto FromUsages(long allowedCalls, ApiStats summary, Dictionary> details) + public static ApiUsagesDto FromStats(long allowedCalls, ApiStatsSummary summary, Dictionary> details) { return new ApiUsagesDto { AllowedCalls = allowedCalls, - AverageMs = summary.AverageElapsed, + AverageElapsedMs = summary.AverageElapsedMs, TotalBytes = summary.TotalBytes, TotalCalls = summary.TotalBytes, - Details = details.ToDictionary(x => x.Key, x => x.Value.Select(ApiUsageDto.FromUsage).ToArray()) + Details = details.ToDictionary(x => x.Key, x => x.Value.Select(ApiUsageDto.FromStats).ToArray()) }; } } diff --git a/backend/src/Squidex/Areas/Api/Controllers/Statistics/UsagesController.cs b/backend/src/Squidex/Areas/Api/Controllers/Statistics/UsagesController.cs index 5fb158c8d..b8d731b9b 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Statistics/UsagesController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Statistics/UsagesController.cs @@ -103,11 +103,11 @@ namespace Squidex.Areas.Api.Controllers.Statistics return BadRequest(); } - var usages = await usageTracker.QueryAsync(AppId.ToString(), fromDate.Date, toDate.Date); + var (summary, details) = await usageTracker.QueryAsync(AppId.ToString(), fromDate.Date, toDate.Date); var (plan, _) = appPlansProvider.GetPlanForApp(App); - var response = ApiUsagesDto.FromUsages(plan.MaxApiCalls, usages.Summary, usages.Details); + var response = ApiUsagesDto.FromStats(plan.MaxApiCalls, summary, details); return Ok(response); } diff --git a/backend/tests/Squidex.Infrastructure.Tests/UsageTracking/ApiUsageTrackerTests.cs b/backend/tests/Squidex.Infrastructure.Tests/UsageTracking/ApiUsageTrackerTests.cs index 474a80df0..af13b3272 100644 --- a/backend/tests/Squidex.Infrastructure.Tests/UsageTracking/ApiUsageTrackerTests.cs +++ b/backend/tests/Squidex.Infrastructure.Tests/UsageTracking/ApiUsageTrackerTests.cs @@ -44,22 +44,22 @@ namespace Squidex.Infrastructure.UsageTracking [ApiUsageTracker.CounterTotalBytes] = 1024, [ApiUsageTracker.CounterTotalCalls] = 1, [ApiUsageTracker.CounterTotalElapsedMs] = 120, - [ApiUsageTracker.CounterTotalWeight] = 4 + [ApiUsageTracker.CounterTotalCosts] = 4 }); } [Fact] - public async Task Should_query_weight_from_tracker() + public async Task Should_query_from_tracker() { var counters = new Counters { - [ApiUsageTracker.CounterTotalWeight] = 4 + [ApiUsageTracker.CounterTotalCosts] = 4 }; A.CallTo(() => usageTracker.GetForMonthAsync($"{key}_API", date)) .Returns(counters); - var result = await sut.GetMonthlyWeightAsync(key, date); + var result = await sut.GetMonthCostsAsync(key, date); Assert.Equal(4, result); } @@ -95,27 +95,27 @@ namespace Squidex.Infrastructure.UsageTracking var (summary, stats) = await sut.QueryAsync(key, dateFrom, dateTo); - stats.Should().BeEquivalentTo(new Dictionary> + stats.Should().BeEquivalentTo(new Dictionary> { - ["my-category"] = new List<(DateTime Date, ApiStats Counters)> + ["my-category"] = new List { - (dateFrom.AddDays(0), new ApiStats(0, 0, 0)), - (dateFrom.AddDays(1), new ApiStats(4, 25, 2048)), - (dateFrom.AddDays(2), new ApiStats(0, 0, 0)), - (dateFrom.AddDays(3), new ApiStats(2, 30, 1024)), - (dateFrom.AddDays(4), new ApiStats(3, 10, 512)) + new ApiStats(dateFrom.AddDays(0), 0, 0, 0), + new ApiStats(dateFrom.AddDays(1), 4, 25, 2048), + new ApiStats(dateFrom.AddDays(2), 0, 0, 0), + new ApiStats(dateFrom.AddDays(3), 2, 30, 1024), + new ApiStats(dateFrom.AddDays(4), 3, 10, 512) }, - ["*"] = new List<(DateTime Date, ApiStats)> + ["*"] = new List { - (dateFrom.AddDays(0), new ApiStats(1, 20, 128)), - (dateFrom.AddDays(1), new ApiStats(0, 0, 0)), - (dateFrom.AddDays(2), new ApiStats(5, 18, 16)), - (dateFrom.AddDays(3), new ApiStats(0, 0, 0)), - (dateFrom.AddDays(4), new ApiStats(0, 0, 0)) + new ApiStats(dateFrom.AddDays(0), 1, 20, 128), + new ApiStats(dateFrom.AddDays(1), 0, 0, 0), + new ApiStats(dateFrom.AddDays(2), 5, 18, 16), + new ApiStats(dateFrom.AddDays(3), 0, 0, 0), + new ApiStats(dateFrom.AddDays(4), 0, 0, 0) } }); - summary.Should().BeEquivalentTo(new ApiStats(15, 20, 3728)); + summary.Should().BeEquivalentTo(new ApiStatsSummary(15, 20, 3728)); } private static Counters Counters(long calls, long elapsed, long bytes) @@ -128,4 +128,4 @@ namespace Squidex.Infrastructure.UsageTracking }; } } -} +} \ No newline at end of file diff --git a/backend/tests/Squidex.Web.Tests/ApiCostsAttributeTests.cs b/backend/tests/Squidex.Web.Tests/ApiCostsAttributeTests.cs index 91f9c4a16..e9d048709 100644 --- a/backend/tests/Squidex.Web.Tests/ApiCostsAttributeTests.cs +++ b/backend/tests/Squidex.Web.Tests/ApiCostsAttributeTests.cs @@ -12,11 +12,11 @@ namespace Squidex.Web public class ApiCostsAttributeTests { [Fact] - public void Should_assign_weight() + public void Should_assign_costs() { var sut = new ApiCostsAttribute(10.5); - Assert.Equal(10.5, sut.Weight); + Assert.Equal(10.5, sut.Costs); } } } diff --git a/backend/tests/Squidex.Web.Tests/Pipeline/ApiCostsFilterTests.cs b/backend/tests/Squidex.Web.Tests/Pipeline/ApiCostsFilterTests.cs index 3d1e8904e..734c89b5a 100644 --- a/backend/tests/Squidex.Web.Tests/Pipeline/ApiCostsFilterTests.cs +++ b/backend/tests/Squidex.Web.Tests/Pipeline/ApiCostsFilterTests.cs @@ -52,7 +52,7 @@ namespace Squidex.Web.Pipeline A.CallTo(() => appPlan.BlockingApiCalls) .ReturnsLazily(x => apiCallsBlocking); - A.CallTo(() => usageTracker.GetMonthlyWeightAsync(A._, DateTime.Today)) + A.CallTo(() => usageTracker.GetMonthCostsAsync(A._, DateTime.Today)) .ReturnsLazily(x => Task.FromResult(apiCallsCurrent)); next = () => diff --git a/backend/tests/Squidex.Web.Tests/Pipeline/CleanupHostMiddlewareTests.cs b/backend/tests/Squidex.Web.Tests/Pipeline/CleanupHostMiddlewareTests.cs index 8796e77dd..6d314f856 100644 --- a/backend/tests/Squidex.Web.Tests/Pipeline/CleanupHostMiddlewareTests.cs +++ b/backend/tests/Squidex.Web.Tests/Pipeline/CleanupHostMiddlewareTests.cs @@ -52,7 +52,7 @@ namespace Squidex.Web.Pipeline httpContext.Request.Scheme = "http"; httpContext.Request.Host = new HostString("host", 80); - await sut.Invoke(httpContext); + await sut.InvokeAsync(httpContext); Assert.Null(httpContext.Request.Host.Port); Assert.True(isNextCalled); @@ -66,7 +66,7 @@ namespace Squidex.Web.Pipeline httpContext.Request.Scheme = "http"; httpContext.Request.Host = new HostString("host", 8080); - await sut.Invoke(httpContext); + await sut.InvokeAsync(httpContext); Assert.Equal(8080, httpContext.Request.Host.Port); Assert.True(isNextCalled); diff --git a/backend/tests/Squidex.Web.Tests/Pipeline/UsageMiddlewareTests.cs b/backend/tests/Squidex.Web.Tests/Pipeline/UsageMiddlewareTests.cs index 8786acb7c..2cbdad475 100644 --- a/backend/tests/Squidex.Web.Tests/Pipeline/UsageMiddlewareTests.cs +++ b/backend/tests/Squidex.Web.Tests/Pipeline/UsageMiddlewareTests.cs @@ -130,7 +130,7 @@ namespace Squidex.Web.Pipeline } [Fact] - public async Task Should_not_track_if_weight_is_zero() + public async Task Should_not_track_if_costs_are_zero() { httpContext.Features.Set(new AppFeature(appId)); httpContext.Features.Set(new ApiCostsAttribute(0)); @@ -146,7 +146,7 @@ namespace Squidex.Web.Pipeline } [Fact] - public async Task Should_log_request_even_if_weight_is_zero() + public async Task Should_log_request_even_if_costs_are_zero() { httpContext.Features.Set(new AppFeature(appId)); httpContext.Features.Set(new ApiCostsAttribute(0)); diff --git a/frontend/app/features/dashboard/pages/dashboard-page.component.ts b/frontend/app/features/dashboard/pages/dashboard-page.component.ts index bd845c4ca..4d6ec1a2d 100644 --- a/frontend/app/features/dashboard/pages/dashboard-page.component.ts +++ b/frontend/app/features/dashboard/pages/dashboard-page.component.ts @@ -175,7 +175,7 @@ export class DashboardPageComponent extends ResourceOwner implements OnInit { this.own( this.appsState.selectedApp.pipe( switchMap(app => this.usagesService.getCallsUsages(app.name, DateTime.today().addDays(-20), DateTime.today()))) - .subscribe(({ details, totalBytes, totalCalls, allowedCalls, averageMs }) => { + .subscribe(({ details, totalBytes, totalCalls, allowedCalls, averageElapsedMs }) => { const labels = createLabelsFromSet(details); this.chartCallsCount = { @@ -210,11 +210,11 @@ export class DashboardPageComponent extends ResourceOwner implements OnInit { backgroundColor: `rgba(${COLORS[i]}, 0.6)`, borderColor: `rgba(${COLORS[i]}, 1)`, borderWidth: 1, - data: details[k].map(x => x.averageMs) + data: details[k].map(x => x.averageElapsedMs) })) }; - this.callsPerformance = averageMs; + this.callsPerformance = averageElapsedMs; this.callsBytes = totalBytes; this.callsCurrent = totalCalls; this.callsAllowed = allowedCalls; diff --git a/frontend/app/shared/services/usages.service.spec.ts b/frontend/app/shared/services/usages.service.spec.ts index befefd1a7..6494633fe 100644 --- a/frontend/app/shared/services/usages.service.spec.ts +++ b/frontend/app/shared/services/usages.service.spec.ts @@ -53,20 +53,20 @@ describe('UsagesService', () => { allowedCalls: 100, totalBytes: 1024, totalCalls: 40, - averageMs: 12.4, + averageElapsedMs: 12.4, details: { category1: [ { date: '2017-10-12', totalBytes: 10, totalCalls: 130, - averageMs: 12.3 + averageElapsedMs: 12.3 }, { date: '2017-10-13', totalBytes: 13, totalCalls: 170, - averageMs: 33.3 + averageElapsedMs: 33.3 } ] } diff --git a/frontend/app/shared/services/usages.service.ts b/frontend/app/shared/services/usages.service.ts index d3284a08b..29ab4827e 100644 --- a/frontend/app/shared/services/usages.service.ts +++ b/frontend/app/shared/services/usages.service.ts @@ -21,7 +21,7 @@ export class ApiUsagesDto { public readonly allowedCalls: number, public readonly totalBytes: number, public readonly totalCalls: number, - public readonly averageMs: number, + public readonly averageElapsedMs: number, public readonly details: { [category: string]: ReadonlyArray } ) { } @@ -32,7 +32,7 @@ export class ApiUsageDto { public readonly date: DateTime, public readonly totalBytes: number, public readonly totalCalls: number, - public readonly averageMs: number + public readonly averageElapsedMs: number ) { } } @@ -95,7 +95,7 @@ export class UsagesService { DateTime.parseISO_UTC(item.date), item.totalBytes, item.totalCalls, - item.averageMs)); + item.averageElapsedMs)); } const usages = @@ -103,7 +103,7 @@ export class UsagesService { body.allowedCalls, body.totalBytes, body.totalBytes, - body.averageMs, + body.averageElapsedMs, details); return usages;