星尘监控用法标准化

This commit is contained in:
智能石头 2021-02-24 21:45:37 +08:00
parent 76f9e4faeb
commit e91e814459
16 changed files with 93 additions and 66 deletions

View File

@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net.Http;
using System.Text;
using System.Net.Http;
using NewLife.Log;
using Stardust.Monitors;
using Xunit;

View File

@ -31,7 +31,7 @@ namespace StarAgent
/// <summary>信息</summary>
/// <returns></returns>
[Api(nameof(Info))]
public AgentInfo Info()
public AgentInfo Info(AgentInfo info)
{
var p = Process.GetCurrentProcess();
var asmx = AssemblyX.Entry;
@ -44,6 +44,7 @@ namespace StarAgent
{
Version = asmx?.Version,
ProcessId = p.Id,
ProcessName = p.ProcessName,
FileName = fileName,
Arguments = args,
Server = set.Server,

View File

@ -10,11 +10,9 @@ using Microsoft.Extensions.Hosting;
using NewLife;
using NewLife.Cube.WebMiddleware;
using NewLife.Log;
using NewLife.Remoting;
using Stardust.Monitors;
using Stardust.Server.Common;
using Stardust.Server.Services;
using XCode.DataAccessLayer;
namespace Stardust.Server
{
@ -28,18 +26,8 @@ namespace Stardust.Server
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var set = Stardust.Setting.Current;
if (!set.Server.IsNullOrEmpty())
{
// APM跟踪器
var tracer = new StarTracer(set.Server) { Log = XTrace.Log };
DefaultTracer.Instance = tracer;
ApiHelper.Tracer = tracer;
DAL.GlobalTracer = tracer;
TracerMiddleware.Tracer = tracer;
services.AddSingleton<ITracer>(tracer);
}
var tracer = StarTracer.Register();
services.AddSingleton<ITracer>(tracer);
var set2 = Stardust.Server.Setting.Current;

View File

@ -23,18 +23,8 @@ namespace Stardust.Web
public void ConfigureServices(IServiceCollection services)
{
var set = Stardust.Setting.Current;
if (!set.Server.IsNullOrEmpty())
{
// APM跟踪器
var tracer = new StarTracer(set.Server) { Log = XTrace.Log };
DefaultTracer.Instance = tracer;
ApiHelper.Tracer = tracer;
DAL.GlobalTracer = tracer;
TracerMiddleware.Tracer = tracer;
services.AddSingleton<ITracer>(tracer);
}
var tracer = StarTracer.Register();
services.AddSingleton<ITracer>(tracer);
// 统计
var appService = new AppDayStatService();

View File

@ -17,7 +17,7 @@ namespace Stardust.DingTalk
/// <summary>服务地址</summary>
public String Url { get; set; } = "https://oapi.dingtalk.com/robot/send?access_token={access_token}";
/// <summary>性能踪</summary>
/// <summary>性能踪</summary>
public ITracer Tracer { get; set; } = DefaultTracer.Instance;
private HttpClient _Client;

View File

@ -9,6 +9,7 @@ using NewLife;
using NewLife.Http;
using NewLife.Log;
using NewLife.Net;
using NewLife.Reflection;
using NewLife.Remoting;
using Stardust.Models;
@ -21,10 +22,31 @@ namespace Stardust
/// <summary>代理信息</summary>
public AgentInfo Info { get; private set; }
private AgentInfo _local;
private ApiClient _client;
#endregion
#region
/// <summary>实例化</summary>
public LocalStarClient()
{
var p = Process.GetCurrentProcess();
var asmx = AssemblyX.Entry;
var fileName = p.MainModule.FileName;
var args = Environment.CommandLine.TrimStart(Path.ChangeExtension(fileName, ".dll")).Trim();
var set = Stardust.Setting.Current;
_local = new AgentInfo
{
Version = asmx?.Version,
ProcessId = p.Id,
ProcessName = p.ProcessName,
FileName = fileName,
Arguments = args,
Server = set.Server,
};
}
#endregion
#region
@ -48,7 +70,7 @@ namespace Stardust
{
Init();
return Info = _client.Invoke<AgentInfo>("Info");
return Info = _client.Invoke<AgentInfo>("Info", _local);
}
#endregion

View File

@ -8,6 +8,9 @@ namespace Stardust.Models
/// <summary>进程标识</summary>
public Int32 ProcessId { get; set; }
/// <summary>进程名称</summary>
public String ProcessName { get; set; }
/// <summary>版本</summary>
public String Version { get; set; }

View File

@ -12,7 +12,7 @@ namespace Stardust.Monitors
/// <summary>诊断监听器的观察者</summary>
public class DiagnosticListenerObserver : IObserver<DiagnosticListener>
{
/// <summary>踪器</summary>
/// <summary>踪器</summary>
public ITracer Tracer { get; set; }
private readonly Dictionary<String, TraceDiagnosticListener> _listeners = new Dictionary<String, TraceDiagnosticListener>();
@ -69,7 +69,7 @@ namespace Stardust.Monitors
}
}
/// <summary>踪诊断监听器</summary>
/// <summary>踪诊断监听器</summary>
public class TraceDiagnosticListener : IObserver<KeyValuePair<String, Object>>
{
#region
@ -85,7 +85,7 @@ namespace Stardust.Monitors
/// <summary>异常名称</summary>
public String ErrorName { get; set; }
/// <summary>踪器</summary>
/// <summary>踪器</summary>
public ITracer Tracer { get; set; }
#endregion

View File

@ -13,21 +13,12 @@ namespace Stardust.Monitors
public class HttpDiagnosticListener : TraceDiagnosticListener
{
/// <summary>实例化</summary>
public HttpDiagnosticListener()
{
Name = "HttpHandlerDiagnosticListener";
}
public HttpDiagnosticListener() => Name = "HttpHandlerDiagnosticListener";
/// <summary>下一步</summary>
/// <param name="value"></param>
public override void OnNext(KeyValuePair<String, Object> value)
{
//base.OnNext(value);
#if DEBUG
XTrace.WriteLine(value.Key);
#endif
switch (value.Key)
{
case "System.Net.Http.HttpRequestOut.Start":

View File

@ -12,7 +12,7 @@ using Stardust.Models;
namespace Stardust.Monitors
{
/// <summary>星尘性能跟踪器,跟踪数据提交到星尘平台</summary>
/// <summary>星尘性能追踪器,追踪数据提交到星尘平台</summary>
/// <remarks>其它项目有可能直接使用这个类代码,用于提交监控数据</remarks>
public class StarTracer : DefaultTracer
{
@ -70,7 +70,7 @@ namespace Stardust.Monitors
catch { }
}
/// <summary>指定服务端地址来实例化踪器</summary>
/// <summary>指定服务端地址来实例化踪器</summary>
/// <param name="server"></param>
public StarTracer(String server) : this()
{
@ -236,17 +236,51 @@ namespace Stardust.Monitors
#endregion
#region
/// <summary>全局注册星尘性能踪器</summary>
/// <param name="server">星尘监控中心地址</param>
/// <summary>全局注册星尘性能踪器</summary>
/// <param name="server">星尘监控中心地址,为空时自动从本地探测</param>
/// <returns></returns>
public static StarTracer Register(String server)
public static StarTracer Register(String server = null)
{
if (server.IsNullOrEmpty())
{
var set = Setting.Current;
server = set.Server;
}
if (server.IsNullOrEmpty())
{
var local = new LocalStarClient();
var inf = local.GetInfo();
server = inf?.Server;
if (!server.IsNullOrEmpty()) XTrace.WriteLine("星尘探测:{0}", server);
}
if (server.IsNullOrEmpty()) return null;
if (Instance is StarTracer tracer && tracer.Client is ApiHttpClient) return tracer;
tracer = new StarTracer(server) { Log = XTrace.Log };
DefaultTracer.Instance = tracer;
ApiHelper.Tracer = tracer;
#if NET50
// 订阅Http事件
var observer = new DiagnosticListenerObserver { Tracer = tracer };
observer.Subscribe(new HttpDiagnosticListener());
#endif
// 反射处理XCode追踪
{
var type = "XCode.DataAccessLayer.DAL".GetTypeEx(false);
var pi = type?.GetPropertyEx("GlobalTracer");
if (pi != null && pi.PropertyType == typeof(ITracer)) pi.SetValue(null, tracer);
}
// 反射处理Cube追踪
{
var type = "NewLife.Cube.WebMiddleware.TracerMiddleware".GetTypeEx(false);
var pi = type?.GetPropertyEx("Tracer");
if (pi != null && pi.PropertyType == typeof(ITracer)) pi.SetValue(null, tracer);
}
return tracer;
}

View File

@ -4,7 +4,7 @@ using Stardust.Models;
namespace Stardust.Monitors
{
/// <summary>踪请求模型</summary>
/// <summary>踪请求模型</summary>
public class TraceModel
{
/// <summary>应用标识</summary>
@ -22,11 +22,11 @@ namespace Stardust.Monitors
/// <summary>应用信息</summary>
public AppInfo Info { get; set; }
/// <summary>踪数据</summary>
/// <summary>踪数据</summary>
public ISpanBuilder[] Builders { get; set; }
}
/// <summary>踪响应模型</summary>
/// <summary>踪响应模型</summary>
public class TraceResponse
{
/// <summary>采样周期。默认15s</summary>

View File

@ -12,13 +12,13 @@ using System.Windows.Forms;
namespace Stardust.Services
{
/// <summary>踪服务</summary>
/// <summary>踪服务</summary>
public class TraceService
{
/// <summary>消息服务</summary>
public IQueueService<CommandModel> Queue { get; set; }
/// <summary>踪结果回调</summary>
/// <summary>踪结果回调</summary>
public Action<Int32, Byte[]> Callback { get; set; }
private String _clientId;

View File

@ -364,7 +364,7 @@ namespace Stardust
private async Task<PingResponse> PingAsync(PingInfo inf) => await PostAsync<PingResponse>("Node/Ping", inf);
private TraceService _trace;
/// <summary>使用踪服务</summary>
/// <summary>使用踪服务</summary>
public void UseTrace()
{
_trace = new TraceService

View File

@ -7,8 +7,8 @@
<Description>星尘,分布式服务框架。分布式资源调度,服务自动注册和发现,负载均衡,动态伸缩,故障转移,性能监控。</Description>
<Company>新生命开发团队</Company>
<Copyright>©2002-2021 NewLife</Copyright>
<Version>1.2.2021.0103</Version>
<FileVersion>1.2.2021.0103</FileVersion>
<Version>1.3.2021.0224-beta1</Version>
<FileVersion>1.3.2021.0224</FileVersion>
<AssemblyVersion>1.2.*</AssemblyVersion>
<Deterministic>false</Deterministic>
<OutputPath>..\Bin</OutputPath>
@ -24,7 +24,7 @@
<RepositoryUrl>https://github.com/NewLifeX/Stardust</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>新生命团队;X组件;NewLife;$(AssemblyName)</PackageTags>
<PackageReleaseNotes>支持.NET5.0;增加客户端连接本地代理</PackageReleaseNotes>
<PackageReleaseNotes>星尘监控用法标准化</PackageReleaseNotes>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
<PublishRepositoryUrl>true</PublishRepositoryUrl>

View File

@ -16,7 +16,7 @@ namespace Stardust.WeiXin
/// <summary>服务地址</summary>
public String Url { get; set; } = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={key}";
/// <summary>性能踪</summary>
/// <summary>性能踪</summary>
public ITracer Tracer { get; set; } = DefaultTracer.Instance;
private HttpClient _Client;

View File

@ -46,11 +46,13 @@ namespace Test
static void Test2()
{
var tracer = new StarTracer { Log = XTrace.Log };
var http = tracer.CreateHttpClient();
http.GetStringAsync("https://x.newlifex.com").Wait();
//var tracer = new StarTracer { Log = XTrace.Log };
//var http = tracer.CreateHttpClient();
//http.GetStringAsync("https://x.newlifex.com").Wait();
Thread.Sleep(10_000);
//Thread.Sleep(10_000);
var tracer = StarTracer.Register();
}
static void Test3()