diff --git a/Directory.Build.props b/Directory.Build.props index d79330ba..254646aa 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,5 +1,5 @@ - 1.0.1-preview.11 + 1.0.1-preview.13 diff --git a/src/ApiGateways/Masa.Tsc.ApiGateways.Caller/Services/ApmService.cs b/src/ApiGateways/Masa.Tsc.ApiGateways.Caller/Services/ApmService.cs index f77ebbe5..46d2e789 100644 --- a/src/ApiGateways/Masa.Tsc.ApiGateways.Caller/Services/ApmService.cs +++ b/src/ApiGateways/Masa.Tsc.ApiGateways.Caller/Services/ApmService.cs @@ -17,7 +17,7 @@ internal ApmService(ICaller caller) : base(caller, "/api/apm") { } public Task> GetTraceDetailAsync(ApmTraceLatencyRequestDto query) => Caller.GetAsync>($"{RootPath}/traceDetail", data: query)!; - public Task> GetChartsAsync(BaseApmRequestDto query) => Caller.GetAsync>($"{RootPath}/charts", data: query)!; + public Task> GetChartsAsync(ApmEndpointRequestDto query) => Caller.GetAsync>($"{RootPath}/charts", data: query)!; public Task> GetErrorChartAsync(ApmEndpointRequestDto query) => Caller.GetAsync>($"{RootPath}/errorChart", data: query)!; diff --git a/src/Contracts/Masa.Tsc.Contracts.Admin/Extensions/StringExtensions.cs b/src/Contracts/Masa.Tsc.Contracts.Admin/Extensions/StringExtensions.cs index c6254f32..7c6b18d0 100644 --- a/src/Contracts/Masa.Tsc.Contracts.Admin/Extensions/StringExtensions.cs +++ b/src/Contracts/Masa.Tsc.Contracts.Admin/Extensions/StringExtensions.cs @@ -23,8 +23,12 @@ public static bool IsRawQuery([NotNull] this string text, bool isElasticsearch = return false; } - public static DateTime ParseTime(this string str) + public static DateTime ParseUTCTime(this string str) { - return DateTime.TryParse(str, out var time) ? time : DateTime.MinValue; + if (DateTime.TryParse(str, out var time)) + { + return new DateTimeOffset(time, TimeSpan.Zero).DateTime; + } + return DateTime.MinValue; } } \ No newline at end of file diff --git a/src/Contracts/Masa.Tsc.Contracts.Admin/Logs/LogPageQueryDto.cs b/src/Contracts/Masa.Tsc.Contracts.Admin/Logs/LogPageQueryDto.cs index 15476dd5..2a67f651 100644 --- a/src/Contracts/Masa.Tsc.Contracts.Admin/Logs/LogPageQueryDto.cs +++ b/src/Contracts/Masa.Tsc.Contracts.Admin/Logs/LogPageQueryDto.cs @@ -29,4 +29,6 @@ public class LogPageQueryDto : Pagination public string Service { get; set; } public string LogLevel { get; set; } + + public bool IsLimitEnv { get; set; } = true; } \ No newline at end of file diff --git a/src/Services/Masa.Tsc.Service.Admin/Application/Logs/Queries/LogsQuery.cs b/src/Services/Masa.Tsc.Service.Admin/Application/Logs/Queries/LogsQuery.cs index e0d350ab..fa4af78a 100644 --- a/src/Services/Masa.Tsc.Service.Admin/Application/Logs/Queries/LogsQuery.cs +++ b/src/Services/Masa.Tsc.Service.Admin/Application/Logs/Queries/LogsQuery.cs @@ -10,7 +10,9 @@ public record LogsQuery(string Query, DateTime Start, DateTime End, int Page = 1 string? SpanId = null, string? Service = null, string? Env = null, - string? LogLevel = null) : Query> + string? LogLevel = null, + bool IsLimitEnv = false + ) : Query> { public override PaginatedListBase Result { get; set; } } diff --git a/src/Services/Masa.Tsc.Service.Admin/Application/Logs/QueryHandler.cs b/src/Services/Masa.Tsc.Service.Admin/Application/Logs/QueryHandler.cs index ffb2b042..0a5c4014 100644 --- a/src/Services/Masa.Tsc.Service.Admin/Application/Logs/QueryHandler.cs +++ b/src/Services/Masa.Tsc.Service.Admin/Application/Logs/QueryHandler.cs @@ -1,6 +1,8 @@ // Copyright (c) MASA Stack All rights reserved. // Licensed under the MIT License. See LICENSE.txt in the project root for license information. +using Masa.BuildingBlocks.StackSdks.Tsc.Contracts.Model; + namespace Masa.Tsc.Service.Admin.Application.Logs; public class QueryHandler : EnvQueryHandler @@ -98,9 +100,13 @@ public async Task GetPageListAsync(LogsQuery queryData) }; if (!isSkipEnv) { - var env = queryData.Env == null ? GetServiceEnvironmentName(queryData.Service!) : queryData.Env; + var env = queryData.Env; + if (queryData.IsLimitEnv) + { + env = GetServiceEnvironmentName(queryData.Service!); + } if (!string.IsNullOrEmpty(env)) - query.SetEnv(env,true); + query.SetEnv(env, queryData.IsLimitEnv); } var data = await _logService.ListAsync(query); diff --git a/src/Services/Masa.Tsc.Service.Admin/Extensions/SimpleAggregateRequestDtoExtensions.cs b/src/Services/Masa.Tsc.Service.Admin/Extensions/SimpleAggregateRequestDtoExtensions.cs index 9752a0a7..e54b11e6 100644 --- a/src/Services/Masa.Tsc.Service.Admin/Extensions/SimpleAggregateRequestDtoExtensions.cs +++ b/src/Services/Masa.Tsc.Service.Admin/Extensions/SimpleAggregateRequestDtoExtensions.cs @@ -19,9 +19,9 @@ public static void SetValues(this BaseRequestDto dto) } } - public static void SetEnv(this BaseRequestDto dto, string envName, bool isMust = false) + public static void SetEnv(this BaseRequestDto dto, string envName, bool isMustService = true) { - if (!isMust || string.IsNullOrEmpty(dto.Service)) + if (isMustService && string.IsNullOrEmpty(dto.Service)) return; var list = dto.Conditions?.ToList() ?? new(); diff --git a/src/Services/Masa.Tsc.Service.Admin/Services/ApmService.cs b/src/Services/Masa.Tsc.Service.Admin/Services/ApmService.cs index d18dcc72..37bad574 100644 --- a/src/Services/Masa.Tsc.Service.Admin/Services/ApmService.cs +++ b/src/Services/Masa.Tsc.Service.Admin/Services/ApmService.cs @@ -1,6 +1,8 @@ // Copyright (c) MASA Stack All rights reserved. // Licensed under the MIT License. See LICENSE.txt in the project root for license information. +using Masa.Contrib.StackSdks.Tsc.Apm.Clickhouse.Models; + namespace Masa.Tsc.Service.Admin.Services; public class ApmService : ServiceBase @@ -9,14 +11,15 @@ public ApmService() : base("/api/apm") { } - public async Task> GetServices([FromServices] IApmService apmService, int page, int pageSize, string start, string end, string? env, ComparisonTypes? comparisonType, string? queries, string? orderField, bool? isDesc) + public async Task> GetServices([FromServices] IApmService apmService, int page, int pageSize, string start, string end, string? env, string? service, ComparisonTypes? comparisonType, string? queries, string? orderField, bool? isDesc) => await apmService.ServicePageAsync(new BaseApmRequestDto { - Start = start.ParseTime(), - End = end.ParseTime(), + Start = start.ParseUTCTime(), + End = end.ParseUTCTime(), Env = GetEnv(env), ComparisonType = comparisonType, Queries = queries, + Service = service, OrderField = orderField, IsDesc = isDesc, Page = page, @@ -27,8 +30,8 @@ public async Task> GetServices([FromServices] public async Task> GetEndpoints([FromServices] IApmService apmService, int page, int pageSize, string start, string end, string? env, string? service, ComparisonTypes? comparisonType, string? queries, string? orderField, bool? isDesc) => await apmService.EndpointPageAsync(new BaseApmRequestDto { - Start = start.ParseTime(), - End = end.ParseTime(), + Start = start.ParseUTCTime(), + End = end.ParseUTCTime(), Env = GetEnv(env), ComparisonType = comparisonType, Queries = queries, @@ -40,23 +43,36 @@ public async Task> GetEndpoints([FromServices StatusCodes = string.Join(',', ConfigConst.TraceErrorStatus) }); - public async Task> GetCharts([FromServices] IApmService apmService, string start, string end, string? env, string? service, ComparisonTypes? comparisonType, string? queries) - => await apmService.ChartDataAsync(new BaseApmRequestDto + public async Task> GetCharts([FromServices] IApmService apmService, string start, string end, string? env, string? service, string? endpoint, ComparisonTypes? comparisonType, string? queries) + { + BaseApmRequestDto queryDto; + + if (endpoint == null) { - Start = start.ParseTime(), - End = end.ParseTime(), - Env = GetEnv(env), - ComparisonType = comparisonType, - Queries = queries, - Service = service, - StatusCodes = string.Join(',', ConfigConst.TraceErrorStatus) - }); + queryDto = new BaseApmRequestDto(); + } + else + { + queryDto = new ApmEndpointRequestDto() + { + Endpoint = endpoint! + }; + } + queryDto.Start = start.ParseUTCTime(); + queryDto.End = end.ParseUTCTime(); + queryDto.Env = GetEnv(env); + queryDto.ComparisonType = comparisonType; + queryDto.Queries = queries; + queryDto.Service = service; + queryDto.StatusCodes = string.Join(',', ConfigConst.TraceErrorStatus); + return await apmService.ChartDataAsync(queryDto); + } public async Task GetLatencyDistributions([FromServices] IApmService apmService, string start, string end, string? env, string? service, string endpoint) => await apmService.EndpointLatencyDistributionAsync(new ApmEndpointRequestDto { - Start = start.ParseTime(), - End = end.ParseTime(), + Start = start.ParseUTCTime(), + End = end.ParseUTCTime(), Env = GetEnv(env), Service = service, Endpoint = endpoint, @@ -66,8 +82,8 @@ public async Task GetLatencyDistributions([FromS public async Task> GetErrors([FromServices] IApmService apmService, int page, int pageSize, string start, string end, string? env, string? service, ComparisonTypes? comparisonType, string? queries, string? orderField, bool? isDesc) => await apmService.ErrorMessagePageAsync(new ApmEndpointRequestDto { - Start = start.ParseTime(), - End = end.ParseTime(), + Start = start.ParseUTCTime(), + End = end.ParseUTCTime(), Env = GetEnv(env), Queries = queries, OrderField = orderField, @@ -80,8 +96,8 @@ public async Task> GetErrors([FromServices] I public Task> GetSpanErrors([FromServices] IApmService apmService, int page, int pageSize, string start, string end, string? env, string? service, ComparisonTypes? comparisonType, string? queries, string? orderField, bool? isDesc) => apmService.GetTraceErrorsAsync(new ApmEndpointRequestDto { - Start = start.ParseTime(), - End = end.ParseTime(), + Start = start.ParseUTCTime(), + End = end.ParseUTCTime(), Env = GetEnv(env), Queries = queries, OrderField = orderField, @@ -94,8 +110,8 @@ public Task> GetSpanErrors([FromServices] IApmService public async Task> GetTraceDetail([FromServices] IApmService apmService, int page, string start, string end, string? env, string? service, string endpoint, long? latMin, long? latMax) => await apmService.TraceLatencyDetailAsync(new ApmTraceLatencyRequestDto { - Start = start.ParseTime(), - End = end.ParseTime(), + Start = start.ParseUTCTime(), + End = end.ParseUTCTime(), Env = GetEnv(env), Page = page, Service = service, @@ -107,8 +123,8 @@ public async Task> GetTraceDetail([FromServi public async Task> GetErrorChart([FromServices] IApmService apmService, string start, string end, string? env, string? service, string? endpoint, ComparisonTypes? comparisonType, string? queries) => await apmService.GetErrorChartAsync(new ApmEndpointRequestDto { - Start = start.ParseTime(), - End = end.ParseTime(), + Start = start.ParseUTCTime(), + End = end.ParseUTCTime(), Env = GetEnv(env), ComparisonType = comparisonType, Queries = queries, @@ -120,8 +136,8 @@ public async Task> GetErrorChart([FromServices] I public async Task> GetLogChart([FromServices] IApmService apmService, string start, string end, string? env, string? service, ComparisonTypes? comparisonType, string? queries) => await apmService.GetLogChartAsync(new ApmEndpointRequestDto { - Start = start.ParseTime(), - End = end.ParseTime(), + Start = start.ParseUTCTime(), + End = end.ParseUTCTime(), Env = GetEnv(env), ComparisonType = comparisonType, Queries = queries, diff --git a/src/Services/Masa.Tsc.Service.Admin/Services/AppService.cs b/src/Services/Masa.Tsc.Service.Admin/Services/AppService.cs index efd81ade..0456bded 100644 --- a/src/Services/Masa.Tsc.Service.Admin/Services/AppService.cs +++ b/src/Services/Masa.Tsc.Service.Admin/Services/AppService.cs @@ -19,7 +19,7 @@ public async Task> GetListAsync([FromServices] IEventBus eventBus, public async Task GetErrorCountAsync([FromServices] IEventBus eventBus, string appid, string start, string end) { - var query = new AppErrorCountQuery(appid, start.ParseTime(), end.ParseTime()); + var query = new AppErrorCountQuery(appid, start.ParseUTCTime(), end.ParseUTCTime()); await eventBus.PublishAsync(query); return query.Result; } diff --git a/src/Services/Masa.Tsc.Service.Admin/Services/LogService.cs b/src/Services/Masa.Tsc.Service.Admin/Services/LogService.cs index f6721b83..2d1cc4d8 100644 --- a/src/Services/Masa.Tsc.Service.Admin/Services/LogService.cs +++ b/src/Services/Masa.Tsc.Service.Admin/Services/LogService.cs @@ -36,14 +36,14 @@ private async Task> GetMappingFieldAsync([FromSe private async Task> GetPageAsync([FromServices] IEventBus eventBus, LogPageQueryDto param) { - var query = new LogsQuery(param.Query, param.Start, param.End, param.Page, param.PageSize, param.IsDesc, param.SortField, JobTaskId: param.TaskId, SpanId: param.SpanId, Service: param.Service, LogLevel: param.LogLevel, Env: param.Env); + var query = new LogsQuery(param.Query, param.Start, param.End, param.Page, param.PageSize, param.IsDesc, param.SortField, JobTaskId: param.TaskId, SpanId: param.SpanId, Service: param.Service, LogLevel: param.LogLevel, Env: param.Env, IsLimitEnv: param.IsLimitEnv); await eventBus.PublishAsync(query); return query.Result; } public async Task> GetErrorTypesAsync([FromServices] IEventBus eventBus, string service, string start, string end) { - var query = new LogErrorTypesQuery(service, start.ParseTime(), end.ParseTime()); + var query = new LogErrorTypesQuery(service, start.ParseUTCTime(), end.ParseUTCTime()); await eventBus.PublishAsync(query); return query.Result; } diff --git a/src/Services/Masa.Tsc.Service.Admin/Services/MetricService.cs b/src/Services/Masa.Tsc.Service.Admin/Services/MetricService.cs index 19300cc4..54ca66c5 100644 --- a/src/Services/Masa.Tsc.Service.Admin/Services/MetricService.cs +++ b/src/Services/Masa.Tsc.Service.Admin/Services/MetricService.cs @@ -38,7 +38,7 @@ private async Task GetRangeValuesAsync([FromServices] IEventBus eventBus public async Task GetQueryAsync([FromServices] IEventBus eventBus, [FromQuery] string query, [FromQuery] string time) { - var result = new InstantQuery(query, time.ParseTime()); + var result = new InstantQuery(query, time.ParseUTCTime()); await eventBus.PublishAsync(result); return result.Result; } diff --git a/src/Services/Masa.Tsc.Service.Admin/Services/TraceService.cs b/src/Services/Masa.Tsc.Service.Admin/Services/TraceService.cs index 9ae6ad52..d5858d10 100644 --- a/src/Services/Masa.Tsc.Service.Admin/Services/TraceService.cs +++ b/src/Services/Masa.Tsc.Service.Admin/Services/TraceService.cs @@ -23,7 +23,7 @@ private async Task> GetAsync([FromServices] IEvent private async Task GetTraceIdByMetricAsync([FromServices] IEventBus eventBus, string service, string url, string start, string end) { - var query = new TraceIdByMetricQuery(service, url, start.ParseTime(), end.ParseTime()); + var query = new TraceIdByMetricQuery(service, url, start.ParseUTCTime(), end.ParseUTCTime()); await eventBus.PublishAsync(query); return query.Result; } @@ -51,7 +51,7 @@ private async Task AggregateAsync([FromServices] IEventBus eventBus, [Fr public async Task> GetNextAsync([FromServices] IEventBus eventBus, string service, string traceId, string time, string url, bool isNext) { - var query = new TraceDetailNextQuery(service, traceId, time.ParseTime(), url, isNext); + var query = new TraceDetailNextQuery(service, traceId, time.ParseUTCTime(), url, isNext); await eventBus.PublishAsync(query); return query.Result; } diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Components/Apm/ApmSearchComponent.razor.cs b/src/Web/Masa.Tsc.Web.Admin.Rcl/Components/Apm/ApmSearchComponent.razor.cs index 4e181ab8..c8fe861a 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Components/Apm/ApmSearchComponent.razor.cs +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Components/Apm/ApmSearchComponent.razor.cs @@ -1,6 +1,8 @@ // Copyright (c) MASA Stack All rights reserved. // Licensed under the MIT License. See LICENSE.txt in the project root for license information. +using System; + namespace Masa.Tsc.Web.Admin.Rcl.Components.Apm; public partial class ApmSearchComponent @@ -60,11 +62,14 @@ protected override async Task OnInitializedAsync() protected override void OnInitialized() { - Search.ComparisonType = ApmComparisonTypes.Day; base.OnInitialized(); - if (string.IsNullOrEmpty(Search.Enviroment) && string.IsNullOrEmpty(Search.Service) && !string.IsNullOrEmpty(UserContext.Environment)) + var uri = NavigationManager.ToAbsoluteUri(NavigationManager.Uri); + if (string.IsNullOrEmpty(uri.Query)) { - Search.Enviroment = UserContext.Environment; + if (string.IsNullOrEmpty(Search.Enviroment) && string.IsNullOrEmpty(Search.Service) && !string.IsNullOrEmpty(UserContext.Environment)) + Search.Enviroment = UserContext.Environment; + if (Search.ComparisonType == ApmComparisonTypes.None) + Search.ComparisonType = ApmComparisonTypes.Day; } } diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Components/Apm/ApmTraceView.razor b/src/Web/Masa.Tsc.Web.Admin.Rcl/Components/Apm/ApmTraceView.razor index 8a95534c..77c3c19d 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Components/Apm/ApmTraceView.razor +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Components/Apm/ApmTraceView.razor @@ -11,7 +11,10 @@ @if (!string.IsNullOrEmpty(LinkUrl)) { - + @I18n.Apm("Trace.Detail.SpanLog") } diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Components/Apm/ApmTraceView.razor.cs b/src/Web/Masa.Tsc.Web.Admin.Rcl/Components/Apm/ApmTraceView.razor.cs index d9a36879..b8220ff4 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Components/Apm/ApmTraceView.razor.cs +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Components/Apm/ApmTraceView.razor.cs @@ -5,6 +5,9 @@ namespace Masa.Tsc.Web.Admin.Rcl.Components.Apm; public partial class ApmTraceView { + [Inject] + IJSRuntime JSRuntime { get; set; } + [Parameter] public object Value { get; set; } @@ -51,4 +54,9 @@ private void OnSeach(string value) { search = value; } + + private async Task OpenLogAsync() + { + await JSRuntime.InvokeVoidAsync("open", LinkUrl, "_blank"); + } } \ No newline at end of file diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoint.razor.cs b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoint.razor.cs index 9f1696aa..b20e582e 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoint.razor.cs +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoint.razor.cs @@ -91,12 +91,13 @@ private async Task LoadChartDataAsync() { if (data.Count == 0) return; - var query = new BaseApmRequestDto + var query = new ApmEndpointRequestDto { Page = page, PageSize = defaultSize, Start = Search.Start, End = Search.End, + Endpoint=Search.Endpoint!, Service = Search.Service, Env = Search.Enviroment }; diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/EndpointDetail.razor b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/EndpointDetail.razor index 8e8c43d1..54be366e 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/EndpointDetail.razor +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/EndpointDetail.razor @@ -11,7 +11,7 @@ ShowEnv ShowTime /> - + @I18n.Apm("Tabs.Overview") @I18n.Apm("Tabs.Errors") diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoints/OverView.razor.cs b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoints/OverView.razor.cs index 9b8414fa..14f21d94 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoints/OverView.razor.cs +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoints/OverView.razor.cs @@ -116,12 +116,13 @@ private void CaculatePercentil() private async Task LoadDataAsync() { - var query = new BaseApmRequestDto + var query = new ApmEndpointRequestDto { Start = SearchData.Start, End = SearchData.End, Service = SearchData.Service, Env = SearchData.Enviroment, + Endpoint = SearchData.Endpoint!, Queries = SearchData.Text, ComparisonType = SearchData.ComparisonType.ToComparisonType() }; @@ -136,11 +137,11 @@ private async Task LoadDataAsync() throughput = new(); failed = new(); - metricTypeChartData.Avg.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime().ToString("yyyy/MM/dd HH:mm:ss"), item => item.Latency, unit: "ms", lineName: "Average").Json; - metricTypeChartData.P95.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime().ToString("yyyy/MM/dd HH:mm:ss"), item => item.P95, unit: "ms", lineName: "95th percentile").Json; - metricTypeChartData.P99.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime().ToString("yyyy/MM/dd HH:mm:ss"), item => item.P99, unit: "ms", lineName: "99th percentile").Json; - throughput.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime().ToString("yyyy/MM/dd HH:mm:ss"), item => item.Throughput, unit: "tpm").Json; - failed.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime().ToString("yyyy/MM/dd HH:mm:ss"), item => item.Failed, unit: "%").Json; + metricTypeChartData.Avg.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime(CurrentTimeZone).ToString("yyyy/MM/dd HH:mm:ss"), item => item.Latency, unit: "ms", lineName: "Average").Json; + metricTypeChartData.P95.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime(CurrentTimeZone).ToString("yyyy/MM/dd HH:mm:ss"), item => item.P95, unit: "ms", lineName: "95th percentile").Json; + metricTypeChartData.P99.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime(CurrentTimeZone).ToString("yyyy/MM/dd HH:mm:ss"), item => item.P99, unit: "ms", lineName: "99th percentile").Json; + throughput.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime(CurrentTimeZone).ToString("yyyy/MM/dd HH:mm:ss"), item => item.Throughput, unit: "tpm").Json; + failed.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime(CurrentTimeZone).ToString("yyyy/MM/dd HH:mm:ss"), item => item.Failed, unit: "%").Json; metricTypeChartData.Avg.ChartLoading = false; metricTypeChartData.P95.ChartLoading = false; diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoints/TimeLine.razor b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoints/TimeLine.razor index 4926fcb4..7f03cefb 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoints/TimeLine.razor +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoints/TimeLine.razor @@ -1,7 +1,7 @@ @namespace Masa.Tsc.Web.Admin.Rcl.Pages.Apm.Endpoints @inherits ApmComponentBase - +
@I18n.Apm("Trace.Detail.Sample")
@@ -24,7 +24,10 @@
@if (!string.IsNullOrEmpty(traceLinkUrl)) { - + @I18n.Apm("Trace.Detail.TraceLog") }
@@ -67,15 +70,14 @@ { var left = timeLine.Left + timeLine.Process; string className = "d-flex", style = null; - if (timeLine.Left - 35 > 0) + if (timeLine.Left - 65 < 0) { - if (timeLine.Right -35> 0) - style = $"padding-left:{timeLine.Left}%"; - else - { - className = "d-flex justify-end"; - style = $"padding-right:{timeLine.Right}%"; - } + style = $"padding-left:{timeLine.Left}%"; + } + else if (35 - timeLine.Process - timeLine.Right >= 0) + { + className = "d-flex justify-end"; + style = $"padding-right:{timeLine.Right}%"; }
@@ -86,7 +88,7 @@ }
-
+
diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoints/TimeLine.razor.cs b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoints/TimeLine.razor.cs index fa257f5d..470e8e25 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoints/TimeLine.razor.cs +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoints/TimeLine.razor.cs @@ -27,7 +27,7 @@ public partial class TimeLine public EventCallback PageChanged { get; set; } private string? lastKey = default; - private bool loading = false; + private bool loading = true; private int totalDuration = 0; private int stepDuration = 0; private int lastDuration = 0; @@ -57,8 +57,10 @@ protected override void OnParametersSet() var key = MD5Utils.Encrypt(str); if (lastKey != key) { + loading = true; lastKey = key; - LoadData(); + CaculateTimelines(Data); + loading = false; } base.OnParametersSet(); } @@ -69,14 +71,6 @@ protected override async Task OnInitializedAsync() await base.OnInitializedAsync(); } - private void LoadData() - { - if (loading) return; - loading = true; - CaculateTimelines(Data); - loading = false; - } - private void CaculateTimelines(List? traces) { traceLinkUrl = default; @@ -164,6 +158,7 @@ private List GetChildren(string spanId, List trac private async Task LoadPageAsync(int page) { Page = page; + loading = true; if (PageChanged.HasDelegate) await PageChanged.InvokeAsync(Page); } @@ -267,19 +262,9 @@ private async Task OpenLogAsync(TreeLineDto item) await JSRuntime.InvokeVoidAsync("open", url, "_blank"); } - private static string GetClassStyle(TreeLineDto timeLine) + private async Task OpenTraceLogAsync() { - var left = timeLine.Left + timeLine.Process; - if (left - 65 <= 0) - { - if (timeLine.Left - 35 <= 0) - return "class=\"d-flex\""; - return $"class=\"d-flex\" style=\"padding-left:{timeLine.Left}\""; - } - else - { - return $"class=\"d-flex justify-end\" style=\"padding-right:{timeLine.Right}\""; - } + await JSRuntime.InvokeVoidAsync("open", traceLinkUrl, "_blank"); } private StringNumber index = 1; diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoints/TimeLine.razor.css b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoints/TimeLine.razor.css index efff0e19..427062f9 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoints/TimeLine.razor.css +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoints/TimeLine.razor.css @@ -12,7 +12,7 @@ } time_line .left, time_line .right, .time_line .process { - height: 20px; + height: 16px; } .time_line .process { diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/ErrorDetail.razor b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/ErrorDetail.razor index 3dcd083e..93b6af81 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/ErrorDetail.razor +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/ErrorDetail.razor @@ -24,7 +24,7 @@ } - +
@I18n.Apm("Error.Detail.Sample")
@@ -51,11 +51,11 @@
- + @I18n.Apm("Tabs.Stacktrace") @I18n.Apm("Tabs.Metadata") - +
@currentLog?.Attributes["exception.stacktrace"]
@@ -65,7 +65,7 @@
- + diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/ErrorDetail.razor.cs b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/ErrorDetail.razor.cs index 206c2dfa..0bc409b4 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/ErrorDetail.razor.cs +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/ErrorDetail.razor.cs @@ -20,15 +20,18 @@ public partial class ErrorDetail string search = string.Empty; IDictionary _dic = null; + bool loading = true; string exceptionType; string exceptionMessage; private async Task OnLoadAsync(SearchData data) { + loading = true; Search = data; await LoadChartDataAsync(); await ChangeRecordAsync(); + loading = false; } protected override void OnInitialized() @@ -67,7 +70,8 @@ private async Task LoadLogAysnc() Page = currentPage, Query = Search.Text, Start = Search.Start, - End = Search.End + End = Search.End, + IsLimitEnv = false }); total = (int)result.Total; currentLog = result.Result[0]; @@ -95,8 +99,10 @@ private async Task LoadTraceAsync() private async Task ChangePageAsync(int page) { + loading = true; currentPage = page; await ChangeRecordAsync(); + loading = false; } private async Task ChangeRecordAsync() @@ -121,7 +127,7 @@ private async Task LoadChartDataAsync() errorChart.ChartLoading = false; } - private static EChartType ConvertLatencyChartData(List data, string lineColor = null, string areaLineColor = null, string? unit = null, string? lineName = null) + private EChartType ConvertLatencyChartData(List data, string lineColor = null, string areaLineColor = null, string? unit = null, string? lineName = null) { var chart = EChartConst.Line; chart.SetValue("tooltip", new { trigger = "axis" }); @@ -137,7 +143,7 @@ private static EChartType ConvertLatencyChartData(List data, //if (data != null && data.Any()) { chart.SetValue("xAxis", new object[] { - new { type="category",boundaryGap=false,data=data?.Select(item=>item.Name)} + new { type="category",boundaryGap=false,data=data?.Select(item=>item.Currents.First().Time.ToDateTime(CurrentTimeZone).Format()) } }); chart.SetValue($"series[0]", new { name = $"{lineName}", type = "line", smooth = true, areaStyle = new { }, lineStyle = new { width = 1 }, symbol = "none", data = data?.Select(item => item.Currents.First().Value) }); } diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Logs.razor b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Logs.razor index 1edb53d9..48c01300 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Logs.razor +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Logs.razor @@ -23,7 +23,7 @@ @if (context.Header.Value == nameof(LogResponseDto.Timestamp)) { -
+
mdi-arrow-top-right-bottom-left @context.Item.Timestamp.UtcFormatLocal(CurrentTimeZone)
diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Logs.razor.cs b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Logs.razor.cs index 216e5f05..14b3d155 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Logs.razor.cs +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Logs.razor.cs @@ -96,7 +96,8 @@ private async Task LoadPageDataAsync() PageSize = defaultSize, IsDesc = sortBy ?? false, SortField = sortFiled!, - Query = Search.Text + Query = Search.Text, + IsLimitEnv=false }; var result = await ApiCaller.LogService.GetPageAsync(query); data.Clear(); diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Service.razor.cs b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Service.razor.cs index 665b2a69..14080c25 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Service.razor.cs +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Service.razor.cs @@ -92,7 +92,7 @@ private async Task LoadChartDataAsync() { if (data.Count == 0) return; - var query = new BaseApmRequestDto + var query = new ApmEndpointRequestDto { Page = page, PageSize = defaultSize, diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/ServiceDetail.razor b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/ServiceDetail.razor index 2a8b1d3c..356e3891 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/ServiceDetail.razor +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/ServiceDetail.razor @@ -10,7 +10,7 @@ ShowEnv ShowTime /> - + @I18n.Apm("Tabs.Overview") @I18n.Apm("Tabs.Endpoints") @I18n.Apm("Tabs.Errors") diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/OverView.razor.cs b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/OverView.razor.cs index f62918ac..3a04c4a0 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/OverView.razor.cs +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/OverView.razor.cs @@ -37,7 +37,7 @@ protected override async Task OnInitializedAsync() private async Task LoadDataAsync() { - var query = new BaseApmRequestDto + var query = new ApmEndpointRequestDto { Start = SearchData.Start, End = SearchData.End, @@ -64,11 +64,11 @@ private async Task LoadDataAsync() throughput = new(); failed = new(); - metricTypeChartData.Avg.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime().ToString("yyyy/MM/dd HH:mm:ss"), item => item.Latency, unit: "ms", lineName: I18n.Apm("Chart.Average")).Json; - metricTypeChartData.P95.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime().ToString("yyyy/MM/dd HH:mm:ss"), item => item.P95, unit: "ms", lineName: I18n.Apm("Chart.p95")).Json; - metricTypeChartData.P99.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime().ToString("yyyy/MM/dd HH:mm:ss"), item => item.P99, unit: "ms", lineName: I18n.Apm("Chart.p99")).Json; - throughput.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime().ToString("yyyy/MM/dd HH:mm:ss"), item => item.Throughput, unit: "tpm").Json; - failed.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime().ToString("yyyy/MM/dd HH:mm:ss"), item => item.Failed, unit: "%").Json; + metricTypeChartData.Avg.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime(CurrentTimeZone).ToString("yyyy/MM/dd HH:mm:ss"), item => item.Latency, unit: "ms", lineName: I18n.Apm("Chart.Average")).Json; + metricTypeChartData.P95.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime(CurrentTimeZone).ToString("yyyy/MM/dd HH:mm:ss"), item => item.P95, unit: "ms", lineName: I18n.Apm("Chart.p95")).Json; + metricTypeChartData.P99.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime(CurrentTimeZone).ToString("yyyy/MM/dd HH:mm:ss"), item => item.P99, unit: "ms", lineName: I18n.Apm("Chart.p99")).Json; + throughput.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime(CurrentTimeZone).ToString("yyyy/MM/dd HH:mm:ss"), item => item.Throughput, unit: "tpm").Json; + failed.Data = ConvertLatencyChartData(chartData, item => item.Time.ToDateTime(CurrentTimeZone).ToString("yyyy/MM/dd HH:mm:ss"), item => item.Failed, unit: "%").Json; metricTypeChartData.Avg.ChartLoading = false; metricTypeChartData.P95.ChartLoading = false; diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ServiceEndpoints.razor.cs b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ServiceEndpoints.razor.cs index 49100a6a..f3a9afc9 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ServiceEndpoints.razor.cs +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ServiceEndpoints.razor.cs @@ -113,12 +113,13 @@ private async Task LoadChartDataAsync() { if (data.Count == 0) return; - var query = new BaseApmRequestDto + var query = new ApmEndpointRequestDto { Page = page, PageSize = defaultSize, Start = SearchData.Start, End = SearchData.End, + Endpoint = "", Service = SearchData.Service, Env = SearchData.Enviroment }; @@ -130,7 +131,7 @@ private async Task LoadChartDataAsync() foreach (var service in data) { - var chartData = result.FirstOrDefault(s => s.Name == service.Name); + var chartData = result.FirstOrDefault(s => s.Name == service.Endpoint); service.LatencyChartData = new(); service.ThroughputChartData = new(); service.FailedChartData = new(); diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ServiceErrors.razor.cs b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ServiceErrors.razor.cs index 8228d5c4..f94789e6 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ServiceErrors.razor.cs +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ServiceErrors.razor.cs @@ -41,7 +41,7 @@ private async Task OnTableOptionsChanged(DataOptions sort) await LoadASync(); StateHasChanged(); } - + protected override async Task OnParametersSetAsync() { var key = MD5Utils.Encrypt(JsonSerializer.Serialize(SearchData)); @@ -110,7 +110,7 @@ private async Task LoadPageDataAsync() isTableLoading = false; } - private static EChartType ConvertLatencyChartData(List data, string lineColor = null, string areaLineColor = null, string? unit = null, string? lineName = null) + private EChartType ConvertLatencyChartData(List data, string lineColor = null, string areaLineColor = null, string? unit = null, string? lineName = null) { var chart = EChartConst.Line; chart.SetValue("tooltip", new { trigger = "axis" }); @@ -126,7 +126,7 @@ private static EChartType ConvertLatencyChartData(List data, //if (data != null && data.Any()) { chart.SetValue("xAxis", new object[] { - new { type="category",boundaryGap=false,data=data?.Select(item=>item.Name)} + new { type="category",boundaryGap=false,data=data?.Select(item=>item.Currents.First().Time.ToDateTime(CurrentTimeZone).Format()) } }); chart.SetValue($"series[0]", new { name = $"{lineName}", type = "line", smooth = true, areaStyle = new { }, lineStyle = new { width = 1 }, symbol = "none", data = data?.Select(item => item.Currents.First().Value) }); } diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ServiceLogs.razor b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ServiceLogs.razor index 26151396..0703809d 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ServiceLogs.razor +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ServiceLogs.razor @@ -29,7 +29,7 @@ @if (context.Header.Value == nameof(LogResponseDto.Timestamp)) { -
+
mdi-arrow-top-right-bottom-left @context.Item.Timestamp.UtcFormatLocal(CurrentTimeZone)
diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ServiceLogs.razor.cs b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ServiceLogs.razor.cs index c0f8c9bc..e7686cd0 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ServiceLogs.razor.cs +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ServiceLogs.razor.cs @@ -104,7 +104,8 @@ private async Task LoadPageDataAsync() Service = SearchData.Service!, Page = page, Env = SearchData.Enviroment!, - PageSize = defaultSize + PageSize = defaultSize, + IsLimitEnv = false }; var result = await ApiCaller.LogService.GetPageAsync(query); data.Clear(); @@ -115,7 +116,7 @@ private async Task LoadPageDataAsync() total = (int)result.Total; } - private static EChartType ConvertLatencyChartData(List data, string lineColor = null, string areaLineColor = null, string? unit = null, string? lineName = null) + private EChartType ConvertLatencyChartData(List data, string lineColor = null, string areaLineColor = null, string? unit = null, string? lineName = null) { var chart = EChartConst.Line; chart.SetValue("tooltip", new { trigger = "axis" }); @@ -124,7 +125,7 @@ private static EChartType ConvertLatencyChartData(List data, chart.SetValue("legend", new { data = new string[] { $"{lineName}" }, bottom = "2%" }); } chart.SetValue("xAxis", new object[] { - new { type="category",boundaryGap=false,data=data?.Select(item=>item.Name)} + new { type="category",boundaryGap=false,data=data?.Select(item=>item.Currents.First().Time.ToDateTime(CurrentTimeZone).Format()) } }); chart.SetValue("yAxis", new object[] { new {type="value",axisLabel=new{formatter=$"{{value}} {unit}" } } diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ShortEndpoint.razor.cs b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ShortEndpoint.razor.cs index 452bb6bf..4ef58835 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ShortEndpoint.razor.cs +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Services/ShortEndpoint.razor.cs @@ -115,7 +115,7 @@ private async Task LoadChartDataAsync() { if (data.Count == 0) return; - var query = new BaseApmRequestDto + var query = new ApmEndpointRequestDto { Page = page, PageSize = defaultSize, diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Shared/ApmComponentBase.cs b/src/Web/Masa.Tsc.Web.Admin.Rcl/Shared/ApmComponentBase.cs index 72cc37d9..4948e2f3 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Shared/ApmComponentBase.cs +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Shared/ApmComponentBase.cs @@ -117,7 +117,7 @@ public static string GetUrlParam(string? service = default, string? search = default) { StringBuilder text = new StringBuilder(); - if (!string.IsNullOrEmpty(service)) + if (!string.IsNullOrEmpty(env)) text.AppendFormat("&env={0}", HttpUtility.UrlEncode(env)); if (!string.IsNullOrEmpty(service)) text.AppendFormat("&service={0}", HttpUtility.UrlEncode(service)); @@ -133,7 +133,7 @@ public static string GetUrlParam(string? service = default, text.AppendFormat("&ex_type={0}", HttpUtility.UrlEncode(exType)); if (!string.IsNullOrEmpty(traceId)) text.AppendFormat("&traceId={0}", HttpUtility.UrlEncode(traceId)); - if (!string.IsNullOrEmpty(traceId)) + if (!string.IsNullOrEmpty(spanId)) text.AppendFormat("&spanId={0}", HttpUtility.UrlEncode(spanId)); if (!string.IsNullOrEmpty(search)) text.AppendFormat("&search={0}", HttpUtility.UrlEncode(search));