diff --git a/power.ps1 b/power.ps1 index 5b610631..0bcbedb7 100644 --- a/power.ps1 +++ b/power.ps1 @@ -7,7 +7,7 @@ Write-Host "Hello $t" docker login --username=$u registry.cn-hangzhou.aliyuncs.com --password=$p $ServiceDockerfilePath="./src/Services/Masa.Tsc.Service.Admin/Dockerfile" -$ServiceServerName="masa-tsc-service-admin" +$ServiceServerName="masa-tsc-service" $WebDockerfilePath="./src/Web/Masa.Tsc.Web.Admin.Server/Dockerfile" $WebServerName="masa-tsc-web-admin" diff --git a/src/Infrastructure/Masa.Tsc.Storage.Clickhouse.Apm/Cliclhouse/ClickhouseApmServiceNew.cs b/src/Infrastructure/Masa.Tsc.Storage.Clickhouse.Apm/Cliclhouse/ClickhouseApmServiceNew.cs index b7cc1818..66f73a44 100644 --- a/src/Infrastructure/Masa.Tsc.Storage.Clickhouse.Apm/Cliclhouse/ClickhouseApmServiceNew.cs +++ b/src/Infrastructure/Masa.Tsc.Storage.Clickhouse.Apm/Cliclhouse/ClickhouseApmServiceNew.cs @@ -315,28 +315,32 @@ public async Task> TraceLatencyDetailAsync(A public async Task> GetSimpleTraceListAsync(ApmEndpointRequestDto query) { - //query.IsServer = default; - //query.IsTrace = true; - var (where, ors, parameters) = AppendWhere(query); var orderBy = GetOrderBy(query, new() { { StorageConst.Current.Timestimap, StorageConst.Current.Timestimap } }); - + var (where, ors, parameters) = AppendWhere(query); PaginatedListBase result = new() { }; if (query.HasPage) { - //var sql1 = CombineOrs($@"select TraceId from {Constants.DurationTable} where {where}", ors); - //var countSql = $"select count(1) from {sql1}"; - var sql1 = CombineOrs($@"select countMerge(Total) as Total from {Constants.DurationCountTable} where {where}", ors); + string sql1; + if (query.IsInstrument) + { + sql1 = $"select count(1) as Total from {MasaStackClickhouseConnection.TraceHttpServerTable} where {where}"; + } + else + { + sql1 = $@"select countMerge(Total) as Total from {Constants.DurationCountTable} where {where}"; + } + + sql1 = CombineOrs(sql1, ors); var countSql = $"select sum(Total) from({sql1})"; result.Total = Convert.ToInt64(await Scalar(countSql, parameters)); } - //Constants.DurationTable - - var sql = CombineOrs($@"select TraceId,Duration,Timestamp from {Constants.DurationTable} where {where}", ors); + + var sql = CombineOrs($@"select TraceId,Duration,Timestamp from {(query.IsInstrument ? MasaStackClickhouseConnection.TraceHttpServerTable : Constants.DurationTable)} where {where}", ors); sql = $"select TraceId,Duration,Timestamp from {sql} {orderBy} @limit"; await SetData(sql, parameters, result, query, ToSampleTraceListDto); return result; - } + } private static SimpleTraceListDto ToSampleTraceListDto(IDataReader reader) { @@ -777,7 +781,7 @@ private static void AppendEndpoint(ApmEndpointRequestDto? traceQuery, StringBuil if (!string.IsNullOrEmpty(traceQuery.Method)) { sql.AppendLine($" and {StorageConst.Current.Trace.HttpMethod}=@method"); - parameters.Add(new ClickHouseParameter { ParameterName = "method", Value = traceQuery.Endpoint }); + parameters.Add(new ClickHouseParameter { ParameterName = "method", Value = traceQuery.Method }); } if (!isMetric) diff --git a/src/Services/Masa.Tsc.Service.Admin/Services/ApmService.cs b/src/Services/Masa.Tsc.Service.Admin/Services/ApmService.cs index d3cc5944..08e4a308 100644 --- a/src/Services/Masa.Tsc.Service.Admin/Services/ApmService.cs +++ b/src/Services/Masa.Tsc.Service.Admin/Services/ApmService.cs @@ -38,16 +38,16 @@ public async Task> GetEndpoints([FromServices Page = page, PageSize = pageSize, Endpoint = endpoint!, - TextField = textField, - TextValue = textValue, - StatusCode = statusCode, - ExType = exType, - TraceId = traceId, + TextField = textField!, + TextValue = textValue!, + StatusCode = statusCode!, + ExType = exType!, + TraceId = traceId!, Service = service, StatusCodes = string.Join(',', ConfigConst.TraceErrorStatus) }); - public async Task> GetCharts([FromServices] IApmService apmService, string start, string end, string? env, string? service, string? endpoint, ComparisonTypes? comparisonType, string? queries) + public async Task> GetCharts([FromServices] IApmService apmService, string start, string end, string? env, string? service, string? endpoint, string? method, ComparisonTypes? comparisonType, string? queries) { BaseApmRequestDto queryDto; @@ -59,7 +59,8 @@ public async Task> GetCharts([FromServices] IApmServic { queryDto = new ApmEndpointRequestDto() { - Endpoint = endpoint.Equals("@all", StringComparison.InvariantCultureIgnoreCase) ? "" : endpoint! + Endpoint = endpoint.Equals("@all", StringComparison.InvariantCultureIgnoreCase) ? "" : endpoint!, + Method = method! }; } queryDto.Start = start.ParseUTCTime(); diff --git a/src/Services/Masa.Tsc.Service.Admin/Services/ClientService.cs b/src/Services/Masa.Tsc.Service.Admin/Services/ClientService.cs new file mode 100644 index 00000000..b548ff46 --- /dev/null +++ b/src/Services/Masa.Tsc.Service.Admin/Services/ClientService.cs @@ -0,0 +1,31 @@ +// Copyright (c) MASA Stack All rights reserved. +// Licensed under the Apache License. See LICENSE.txt in the project root for license information. + +namespace Masa.Tsc.Service.Admin.Services; + +public class ClientService : ServiceBase +{ + public ClientService() : base("/api/client") + { } + + public string GetIp([FromServices] IHttpContextAccessor httpContext) + { + return GetIp(httpContext.HttpContext!.Request.Headers, httpContext.HttpContext.Connection.RemoteIpAddress); + } + + private static string GetIp(IHeaderDictionary headers, IPAddress? deafultIp) + { + if (headers.TryGetValue("X-Forwarded-For", out StringValues value)) + { + var ip = value.ToString().Split(',')[0].Trim(); + if (ip.Length > 0) return ip; + } + if (headers.TryGetValue("X-Real-IP", out value)) + { + var ip = value.ToString(); + if (ip.Length > 0) return ip; + } + + return deafultIp?.ToString() ?? string.Empty; + } +} diff --git a/src/Services/Masa.Tsc.Service.Admin/_Imports.cs b/src/Services/Masa.Tsc.Service.Admin/_Imports.cs index 5f56bcc2..d39f2d4c 100644 --- a/src/Services/Masa.Tsc.Service.Admin/_Imports.cs +++ b/src/Services/Masa.Tsc.Service.Admin/_Imports.cs @@ -77,8 +77,10 @@ global using Microsoft.EntityFrameworkCore.Design; global using Microsoft.EntityFrameworkCore.Metadata.Builders; global using Microsoft.Extensions.Configuration; +global using Microsoft.Extensions.Primitives; global using Microsoft.OpenApi.Models; global using System.Linq.Expressions; +global using System.Net; global using System.Reflection; global using System.Text; global using System.Text.Json; 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 00d9c0f5..715e31ad 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 @@ -75,7 +75,24 @@ else @currentName - @value + + @{ + if (IsRedirectTrace && string.Equals(currentName, StorageConst.Current.TraceId, StringComparison.CurrentCultureIgnoreCase)) + { + var resources = (Dictionary)dic["Resource"]; + var attributes = (Dictionary)dic["Attributes"]; + attributes.TryGetValue("RequestPath", out var path); + var time1 = (DateTime)dic["Timestamp"]; + DateTime start = time1.AddHours(-6), end = time1.AddHours(6); + var url = path?.ToString().Split('?')[0]; + @value + } + else + { + @value + } + } + } else if (value is IDictionary dicValue) 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 ea8c1ab1..6fc52d6d 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 @@ -29,6 +29,9 @@ public partial class ApmTraceView [Parameter] public StringNumber? Height { get; set; } + [Parameter] + public bool IsRedirectTrace { get; set; } = true; + private async Task CloseAsync() { Show = false; diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Data/Apm/ListChartData.cs b/src/Web/Masa.Tsc.Web.Admin.Rcl/Data/Apm/ListChartData.cs index 6dfef3a8..afcf9313 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Data/Apm/ListChartData.cs +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Data/Apm/ListChartData.cs @@ -11,6 +11,8 @@ internal class ListChartData public string Endpoint { get; set; } + public string Method { get; set; } + public string Envs { get; set; } public long Latency { get; set; } @@ -31,10 +33,11 @@ internal class ListChartData public ChartData P95ChartData { get; set; } - public ChartData P99ChartData { get; set; } + public ChartData P99ChartData { get; set; } } -public class ChartData { +public class ChartData +{ public bool HasChart { get; set; } = true; diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoint.razor b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoint.razor index 9cafdf25..9e6388e0 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoint.razor +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Endpoint.razor @@ -24,7 +24,7 @@ @@ -95,7 +95,7 @@ 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 6bd72391..6a0903ad 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 @@ -87,6 +87,7 @@ private async Task LoadPageDataAsync() data.AddRange(result.Result.Select(item => new ListChartData { Name = $"{item.Method} {item.Endpoint}", + Method = item.Method, Endpoint = item.Endpoint, Service = item.Service, Failed = item.Failed, 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 4a6ca8b8..0e1cf372 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 @@ -3,7 +3,7 @@ @page "/apm/endpoints/{name}" @I18n.Apm("PageTitles.EndpointDetail") - 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 efa19666..7828f8c3 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 @@ -14,7 +14,6 @@ public partial class OverView private ChartData failed = new(); private readonly ChartData timeTypeCount = new(); private string? lastKey = null; - private readonly ApmTraceLatencyRequestDto query = new(); private List? traceDetails = null; private List? errors = null; int page = 1, total = 1; @@ -36,17 +35,6 @@ protected override async Task OnParametersSetAsync() } } - //protected override void OnInitialized() - //{ - // var uri = NavigationManager.ToAbsoluteUri(NavigationManager.Uri); - // var queries = HttpUtility.ParseQueryString(uri.Query); - // var endpoint = queries.Get("endpoint"); - // SearchData.Endpoint = endpoint; - // query.Endpoint = endpoint!; - // //traceId = queries.Get("traceId"); - // base.OnInitialized(); - //} - private async Task LoadTraceDetailAsync(int page = 1) { this.page = page; @@ -66,7 +54,10 @@ private async Task LoadTraceDetailAsync(int page = 1) Env = SearchData.Environment!, Page = 1, PageSize = 100, - Method=query.Method, + Method = SearchData.Method, + TextField = SearchData.TextField, + TextValue = SearchData.TextValue, + StatusCode = SearchData.Status, //Queries = SearchData.Text, OrderField = "Timestamp", IsDesc = true @@ -85,7 +76,7 @@ private async Task LoadTraceDetailAsync(int page = 1) Start = SearchData.Start, End = SearchData.End, Endpoint = SearchData.Endpoint!, - Method = query.Method, + Method = SearchData.Method, Service = SearchData.Service!, Env = SearchData.Environment!, Page = 1, @@ -152,6 +143,7 @@ private void CaculatePercentil() percentile = lessTotal * 1.0 / sum; } + //需要优化,不是自己关注的条件不刷新数据 private async Task LoadDataAsync() { var query = new ApmEndpointRequestDto @@ -161,6 +153,7 @@ private async Task LoadDataAsync() Service = SearchData.Service, Env = SearchData.Environment, Endpoint = SearchData.Endpoint!, + Method = SearchData.Method, //Queries = SearchData.Text, ComparisonType = SearchData.ComparisonType.ToComparisonType() }; @@ -241,7 +234,7 @@ private async Task LoadDistributionDataAsync() Service = SearchData.Service, Env = SearchData.Environment, Endpoint = SearchData.Endpoint!, - Method = SearchData.Method, + Method = SearchData.Method, //Queries = SearchData.Text, ComparisonType = SearchData.ComparisonType.ToComparisonType() }; 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 0b3747b8..a3cbde01 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 @@ -58,7 +58,7 @@ - + @code { @@ -75,7 +75,7 @@ { style = $"padding-left:{timeLine.Left}%"; } - else if (35 - timeLine.Process - timeLine.Right >= 0) + else if (40 - timeLine.Process - timeLine.Right >= 0) { className = "d-flex justify-end"; style = $"padding-right:{timeLine.Right}%"; 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 2f9d41e9..71077154 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 @@ -1,7 +1,7 @@ @namespace Masa.Tsc.Web.Admin.Rcl.Pages.Apm @inherits ApmComponentBase -
+
@I18n.Apm("Chart.ErrorOccurrences")
@@ -95,7 +95,26 @@ @currentName -
@value
+ +
+ @{ + if (string.Equals(currentName, StorageConst.Current.TraceId, StringComparison.CurrentCultureIgnoreCase)) + { + var resources = (Dictionary)dic["Resource"]; + var attributes = (Dictionary)dic["Attributes"]; + attributes.TryGetValue("RequestPath", out var path); + var time1 = (DateTime)dic["Timestamp"]; + DateTime start = time1.AddHours(-6), end = time1.AddHours(6); + var url = path?.ToString().Split('?')[0]; + @value + } + else + { + @value + } + } +
+ } else if (value is IDictionary dicValue) @@ -109,4 +128,4 @@ { return type.IsPrimitive || type.IsEnum || type.Equals(typeof(string)) || type.Equals(typeof(DateTime)); } - } \ No newline at end of file +} \ No newline at end of file diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Errors.razor b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Errors.razor index 50bc785e..061e79a8 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Errors.razor +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Errors.razor @@ -45,7 +45,7 @@ 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 d71adb4f..ea7e8f02 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 @@ -7,7 +7,7 @@ ValueChanged="LoadASync" /> + @context.Item.TraceId +
+ } + else + { + } } else if (context.Header.Value == nameof(LogResponseDto.SpanId)) { @@ -70,7 +81,7 @@ diff --git a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Service.razor b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Service.razor index 5a882746..34121add 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Service.razor +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Pages/Apm/Service.razor @@ -84,7 +84,7 @@ 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 dd4ee583..0dc3ce15 100644 --- a/src/Web/Masa.Tsc.Web.Admin.Rcl/Shared/ApmComponentBase.cs +++ b/src/Web/Masa.Tsc.Web.Admin.Rcl/Shared/ApmComponentBase.cs @@ -47,6 +47,7 @@ protected override void OnInitialized() { if (IsPage) { + Search.Method = default!; //Search.Text = default!; var uri = NavigationManager.ToAbsoluteUri(NavigationManager.Uri); var values = HttpUtility.ParseQueryString(uri.Query); @@ -93,7 +94,8 @@ public string GetUrlParam(string? service = default, string? exMsg = default, string? traceId = default, string? spanId = default, - string? search = default) + string? search = default, + string? method = default) { var text = new StringBuilder(); if (!string.IsNullOrEmpty(env)) @@ -118,6 +120,8 @@ public string GetUrlParam(string? service = default, text.AppendFormat("&spanId={0}", HttpUtility.UrlEncode(spanId)); if (!string.IsNullOrEmpty(search)) text.AppendFormat("&search={0}", HttpUtility.UrlEncode(search)); + if (!string.IsNullOrEmpty(method)) + text.AppendFormat("&method={0}", method); if (text.Length > 0) text.Remove(0, 1).Insert(0, "?");