public async void TestHttp3() { //var tracer = NewLife.Log.DefaultTracer.Instance; var tracer = new DefaultTracer(); var observer = new DiagnosticListenerObserver { Tracer = tracer }; observer.Subscribe("HttpHandlerDiagnosticListener", null, null, null); var http = new HttpClient(); await http.GetStringAsync("http://www.newlifex.com?id=1234"); var builders = tracer.TakeAll(); Assert.Single(builders); Assert.Single(builders[0].Samples); Assert.Null(builders[0].ErrorSamples); }
public void TestSamples() { var tracer = new DefaultTracer { MaxSamples = 2, MaxErrors = 11 }; // 正常采样 for (var i = 0; i < 10; i++) { using var span = tracer.NewSpan("test"); } var builder = tracer.BuildSpan("test"); var samples = builder.Samples; Assert.NotNull(samples); Assert.Equal(10, builder.Total); Assert.Equal(tracer.MaxSamples, samples.Count); Assert.NotEqual(samples[0].TraceId, samples[1].TraceId); Assert.NotEqual(samples[0].Id, samples[1].Id); // 异常采样 for (var i = 0; i < 20; i++) { using var span = tracer.NewSpan("test"); span.SetError(new Exception("My Error"), null); } var errors = builder.ErrorSamples; Assert.NotNull(errors); Assert.Equal(10 + 20, builder.Total); Assert.Equal(tracer.MaxErrors, errors.Count); Assert.NotEqual(errors[0].TraceId, errors[1].TraceId); Assert.NotEqual(errors[0].Id, errors[1].Id); var js = tracer.TakeAll().ToJson(); }
public void WebRequestUriTest() { var tracer = new DefaultTracer(); { var url = "http://sso.newlifex.com/user/query?id=12345"; var request = WebRequest.CreateHttp(url); var span = tracer.NewSpan(request) as DefaultSpan; Assert.Equal("http://sso.newlifex.com/user/query", span.Builder.Name); Assert.Equal("/user/query?id=12345", span.Tag); } //{ // var url = "user/query?id=12345"; // var request = WebRequest.CreateHttp(new Uri(url, UriKind.RelativeOrAbsolute)); // var span = tracer.NewSpan(request) as DefaultSpan; // Assert.Equal("http://sso.newlifex.com/user/query", span.Builder.Name); // Assert.Equal("/user/query?id=12345", span.Tag); //} }
public void HttpRequestMessageUriTest() { var tracer = new DefaultTracer(); { var url = "http://sso.newlifex.com/user/query?id=12345"; var request = new HttpRequestMessage(HttpMethod.Get, url); var span = tracer.NewSpan(request) as DefaultSpan; Assert.Equal("http://sso.newlifex.com/user/query", span.Builder.Name); Assert.Equal("/user/query?id=12345", span.Tag); } { var url = "user/query?id=12345"; var request = new HttpRequestMessage(HttpMethod.Get, url); var span = tracer.NewSpan(request) as DefaultSpan; Assert.Equal("user/query", span.Builder.Name); Assert.Equal("user/query?id=12345", span.Tag); } }
public void TestError() { var tracer = new DefaultTracer(); { using var span = tracer.NewSpan("test"); Thread.Sleep(100); { using var span2 = tracer.NewSpan("test"); Thread.Sleep(200); span2.SetError(new Exception("My Error"), null); } } var builder = tracer.BuildSpan("test"); Assert.Equal(2, builder.Total); Assert.Equal(1, builder.Errors); Assert.True(builder.Cost >= 100 + 200); Assert.True(builder.MaxCost >= 200); }
public void Test1() { var tracer = new DefaultTracer { MaxSamples = 2, MaxErrors = 11 }; //Assert.Throws<ArgumentNullException>(() => tracer.BuildSpan(null)); // 空名称 { var builder = tracer.BuildSpan(null); Assert.NotNull(builder); Assert.NotNull(builder.Name); Assert.Empty(builder.Name); } // 标准用法 { var builder = tracer.BuildSpan("test"); Assert.NotNull(builder); Assert.Equal(tracer, builder.Tracer); Assert.Equal("test", builder.Name); Assert.True(builder.StartTime > 0); Assert.Equal(0, builder.EndTime); using var span = builder.Start(); span.Tag = "任意业务数据"; Assert.NotEmpty(span.TraceId); Assert.NotEmpty(span.Id); Assert.Null(span.ParentId); Assert.Equal(DateTime.Today, span.StartTime.ToDateTime().ToLocalTime().Date); Assert.Equal(span, DefaultSpan.Current); Thread.Sleep(100); span.Dispose(); Assert.Null(DefaultSpan.Current); var cost = span.EndTime - span.StartTime; Assert.True(cost >= 100); Assert.Null(span.Error); Assert.Equal(1, builder.Total); Assert.Equal(0, builder.Errors); Assert.Equal(cost, builder.Cost); Assert.Equal(cost, builder.MaxCost); Assert.Equal(cost, builder.MinCost); } // 快速用法 { using var span2 = tracer.NewSpan("test2"); Thread.Sleep(200); span2.Dispose(); var cost = span2.EndTime - span2.StartTime; Assert.True(cost >= 200); Assert.Null(span2.Error); var builder2 = tracer.BuildSpan("test2"); Assert.Equal(1, builder2.Total); Assert.Equal(0, builder2.Errors); Assert.Equal(cost, builder2.Cost); Assert.Equal(cost, builder2.MaxCost); Assert.Equal(cost, builder2.MinCost); } var js = tracer.TakeAll().ToJson(); Assert.Contains("\"Tag\":\"任意业务数据\"", js); }
public void TestTracerId() { var tracer = new DefaultTracer(); // 内嵌片段,应该共用TraceId { using var span = tracer.NewSpan("test"); Thread.Sleep(100); { Assert.Equal(span, DefaultSpan.Current); using var span2 = tracer.NewSpan("test2"); Assert.Equal(span2, DefaultSpan.Current); Assert.Equal(span.TraceId, span2.TraceId); Assert.Equal(span.Id, span2.ParentId); Assert.NotEqual(span.Id, span2.Id); Thread.Sleep(100); { using var span3 = tracer.NewSpan("test3"); Assert.Equal(span3, DefaultSpan.Current); Assert.Equal(span.TraceId, span3.TraceId); Assert.Equal(span2.Id, span3.ParentId); Assert.NotEqual(span2.Id, span3.Id); // 检查强制采样 var ds1 = span as DefaultSpan; var ds2 = span2 as DefaultSpan; var ds3 = span3 as DefaultSpan; Assert.Equal(1, ds1.TraceFlag); Assert.Equal(1, ds2.TraceFlag); Assert.Equal(1, ds3.TraceFlag); } Assert.Equal(span2, DefaultSpan.Current); } Assert.Equal(span, DefaultSpan.Current); } // 内嵌片段,不同线程应该使用不同TraceId { using var span = tracer.NewSpan("test"); Thread.Sleep(100); // 另一个线程建立span,必须用UnsafeQueueUserWorkItem截断上下文传递,否则还是会建立父子关系 ISpan span2 = null; var e = new AutoResetEvent(false); ThreadPool.UnsafeQueueUserWorkItem(s => { span2 = tracer.NewSpan("test2"); e.Set(); }, null); //Thread.Sleep(100); e.WaitOne(); //using var span2 = Task.Factory.StartNew(() => tracer.NewSpan("test2"), TaskCreationOptions.LongRunning).Result; Assert.NotEqual(span.TraceId, span2.TraceId); Assert.NotEqual(span.Id, span2.ParentId); span2.Dispose(); // 检查强制采样 var ds1 = span as DefaultSpan; var ds2 = span2 as DefaultSpan; Assert.Equal(0, ds1.TraceFlag); Assert.Equal(0, ds2.TraceFlag); } var builder = tracer.BuildSpan("test"); Assert.Equal(2, builder.Total); Assert.Equal(0, builder.Errors); }
private static void Test3() { using var tracer = new DefaultTracer { Log = XTrace.Log }; tracer.MaxSamples = 100; tracer.MaxErrors = 100; if (Console.ReadLine() == "1") { var svr = new ApiServer(12345) //var svr = new ApiServer("http://*:1234") { Log = XTrace.Log, //EncoderLog = XTrace.Log, StatPeriod = 10, Tracer = tracer, }; // http状态 svr.UseHttpStatus = true; var ns = svr.EnsureCreate() as NetServer; ns.EnsureCreateServer(); var ts = ns.Servers.FirstOrDefault(e => e is TcpServer); //ts.ProcessAsync = true; svr.Start(); Console.ReadKey(); } else { var client = new ApiClient("tcp://127.0.0.1:335,tcp://127.0.0.1:12345") { Log = XTrace.Log, //EncoderLog = XTrace.Log, StatPeriod = 10, Tracer = tracer, UsePool = true, }; client.Open(); Task.Run(() => { var sw = Stopwatch.StartNew(); try { for (var i = 0; i < 10; i++) { client.InvokeAsync <Object>("Api/All", new { state = 111 }).Wait(); } } catch (Exception ex) { XTrace.WriteException(ex.GetTrue()); } sw.Stop(); XTrace.WriteLine("总耗时 {0:n0}ms", sw.ElapsedMilliseconds); }); Task.Run(() => { var sw = Stopwatch.StartNew(); try { for (var i = 0; i < 10; i++) { client.InvokeAsync <Object>("Api/All", new { state = 222 }).Wait(); } } catch (Exception ex) { XTrace.WriteException(ex.GetTrue()); } sw.Stop(); XTrace.WriteLine("总耗时 {0:n0}ms", sw.ElapsedMilliseconds); }); Task.Run(() => { var sw = Stopwatch.StartNew(); try { for (var i = 0; i < 10; i++) { client.InvokeAsync <Object>("Api/Info", new { state = 333 }).Wait(); } } catch (Exception ex) { XTrace.WriteException(ex.GetTrue()); } sw.Stop(); XTrace.WriteLine("总耗时 {0:n0}ms", sw.ElapsedMilliseconds); }); Task.Run(() => { var sw = Stopwatch.StartNew(); try { for (var i = 0; i < 10; i++) { client.InvokeAsync <Object>("Api/Info", new { state = 444 }).Wait(); } } catch (Exception ex) { XTrace.WriteException(ex.GetTrue()); } sw.Stop(); XTrace.WriteLine("总耗时 {0:n0}ms", sw.ElapsedMilliseconds); }); Console.ReadKey(); } }
/*public IPoderosaWorld PoderosaWorld { get { return this; } }*/ public IPoderosaWorld Start() { DefaultTracer tracer = new DefaultTracer(_stringResource); _startupContext.Tracer = tracer; //Step1 �v���O�C���̍\���Ə����� _pluginManager.InitializePlugins(_startupContext); //�G���[���|�[�g if (!tracer.Document.IsEmpty) ReportBootError(tracer.Document); //Step2 ���[�g�G�N�X�e���V�����̎��s RunRootExtensions(); return this; }
/* public StringResource StringResource { get { return _stringResource; } } */ #region IPoderosaApplication /*public IPoderosaWorld PoderosaWorld { get { return this; } }*/ public IPoderosaWorld Start() { DefaultTracer tracer = new DefaultTracer(_stringResource); _startupContext.Tracer = tracer; //Step1 プラグインの構成と初期化 _pluginManager.InitializePlugins(_startupContext); //エラーレポート if (!tracer.Document.IsEmpty) ReportBootError(tracer.Document); //Step2 ルートエクステンションの実行 RunRootExtensions(); return this; }
public IPoderosaWorld Start() { DefaultTracer tracer = new DefaultTracer(_stringResource); return Start(tracer); }