Example #1
0
        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);
        }
Example #2
0
        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();
        }
Example #3
0
        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);
            //}
        }
Example #4
0
        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);
            }
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #7
0
        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);
        }
Example #8
0
        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();
            }
        }
Example #9
0
        /*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;
        }
Example #10
0
        /*
        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);
 }