コード例 #1
0
        public static IApplicationBuilder UseCocohub(this IApplicationBuilder builder)
        {
            var httpContextAccessor = builder.ApplicationServices.GetService(typeof(IHttpContextAccessor)) as IHttpContextAccessor;

            TracerContext.Configure(httpContextAccessor);
            return(builder.UseMiddleware <CocohubMiddleware>());
        }
コード例 #2
0
        public Task Send(IList <IClientSpan> entities)
        {
            //1 group and convert trace span trees
            //2 send spans by relations
            var sameTraceSpanGroups = entities.OrderBy(x => x.StartUtc)
                                      .GroupBy(x => new { x.TracerId, x.TraceId });

            var tracerContext = TracerContext.Resolve();

            foreach (var sameTraceSpanGroup in sameTraceSpanGroups)
            {
                var logger = SimpleLogSingleton <JaegerTracerFactory> .Instance.Logger;
                logger.LogInfo(string.Format("Send ClientSpans => {0}: {1}", sameTraceSpanGroup.Key, sameTraceSpanGroup.Count()));

                //var groupKey = sameTraceSpanGroup.Key;
                var sameTraceSpans = sameTraceSpanGroup.ToList();
                var myTreeConvert  = MyTreeConvert.Instance;
                var myTrees        = myTreeConvert
                                     .MakeTrees(sameTraceSpans, span => span.ToLocateCurrentKey(), span => span.ToLocateParentKey())
                                     .OrderBy(x => x.Value.StartUtc).ToList();

                foreach (var myTree in myTrees)
                {
                    SendSpanTree(tracerContext, myTree);
                }
            }

            return(Task.FromResult(0));
        }
コード例 #3
0
        public void SomeWorkNeedTrace()
        {
            //will use "FooService-GetUserInfo" span
            var tracer = TracerContext.GetCurrent();

            tracer.ActiveSpan.Log("another log from FooService's SomeWork");
            Task.Delay(100).Wait();
        }
コード例 #4
0
        private static void SetupJaeger()
        {
            var jaegerTracerConfig = new JaegerTracerConfig();

            jaegerTracerConfig.DefaultTracerId = "Default-Tracer";
            jaegerTracerConfig.TraceEndPoint   = "http://localhost:14268/api/traces";
            var tracerFactory = new JaegerTracerFactory(jaegerTracerConfig);

            //replace null
            var tracerContext = new TracerContext(tracerFactory);

            TracerContext.Resolve = () => tracerContext;
        }
コード例 #5
0
ファイル: FooData.cs プロジェクト: congzw/CommonTrace
        public string GetUserInfo(string username)
        {
            var tracer = TracerContext.GetCurrent();

            using (var scope = tracer.BuildSpan("FooData-GetUserInfo").StartActive(true))
            {
                //按需使用
                scope.Span.Log("a log from FooData");
                scope.Span.SetTag("username", username);

                Task.Delay(20).Wait();
                var result = $"some info of {username}";
                return(result);
            }
        }
コード例 #6
0
ファイル: FooApi.cs プロジェクト: congzw/CommonTrace
        public string GetUserInfo(string username)
        {
            var tracer = TracerContext.GetCurrent();

            using (var scope = tracer.BuildSpan("FooApi-GetUserInfo").StartActive(true))
            {
                var result = _fooService.GetUserInfo(username);

                //按需使用
                scope.Span.Log("a log from FooApi");
                scope.Span.SetTag("username", username);

                return(result);
            }
        }
コード例 #7
0
ファイル: LoggerAdapter.cs プロジェクト: clawit/CocoHub
        public void TraceLeave(string methodInfo, long startTicks, long endTicks, string[] paramNames,
                               object[] paramValues)
        {
            string returnValue = null;

            if (paramNames != null)
            {
                StringBuilder parameters = new StringBuilder();
                for (int i = 0; i < paramNames.Length; i++)
                {
                    if (paramNames[i] == "$exception")
                    {
                        var value = paramValues[i].ToString();
                        paramValues[i] = value;
                    }
                    parameters.AppendFormat("{0}={1}", paramNames[i] ?? "$return",
                                            paramValues[i] == null ? NullString : paramValues[i].ToString()
                                            .Replace("\r\n", string.Empty)
                                            .Replace("\"", string.Empty)
                                            .Replace(@"\", @"/"));
                    if (i < paramNames.Length - 1)
                    {
                        parameters.Append(", ");
                    }
                }
                returnValue = parameters.ToString();
            }

            double timeTaken = ConvertTicksToMilliseconds(endTicks - startTicks);

            string message = String.Empty;

            if (TracerContext.Tracer == null)
            {
                message = String.Format(_textReturn, methodInfo, returnValue, timeTaken);
            }
            else
            {
                message = String.Format(_textReturnWithTracer, methodInfo, returnValue, timeTaken, TracerContext.Tracer.TracerId, TracerContext.Tracer.SpanId);
            }

            Log.Info(message);
            TracerContext.Leave();
        }
コード例 #8
0
        public void Can_trace_command_trees()
        {
            using (var context = new TracerContext())
            {
                context.TracerEntities.Add(
                    new TracerEntity
                    {
                        Id = 1,
                        Name = "Pineapple Lumps"
                    });
                
                using (var commandTracer = new CommandTracer(context))
                {
                    context.SaveChanges();

                    var interceptedCommandTree = commandTracer.CommandTrees.Single();

                    Assert.IsType<DbInsertCommandTree>(interceptedCommandTree);
                }
            }
        }
コード例 #9
0
        public void Can_trace_command_trees()
        {
            using (var context = new TracerContext())
            {
                context.TracerEntities.Add(
                    new TracerEntity
                {
                    Id   = 1,
                    Name = "Pineapple Lumps"
                });

                using (var commandTracer = new CommandTracer(context))
                {
                    context.SaveChanges();

                    var interceptedCommandTree = commandTracer.CommandTrees.Single();

                    Assert.IsType <DbInsertCommandTree>(interceptedCommandTree);
                }
            }
        }
コード例 #10
0
        public void Can_trace_commands_and_execution_cancelled()
        {
            using (var context = new TracerContext())
            {
                context.TracerEntities.Add(
                    new TracerEntity
                {
                    Id   = 1,
                    Name = "Pineapple Lumps"
                });

                CommandTracer commandTracer;

                using (commandTracer = new CommandTracer(context))
                {
                    context.SaveChanges();

                    var interceptedCommand = commandTracer.DbCommands.Single();

                    Assert.Equal(
                        "INSERT [dbo].[TracerEntities]([Id], [Name])\r\nVALUES (@0, @1)\r\n",
                        interceptedCommand.CommandText);

                    Assert.Equal(2, interceptedCommand.Parameters.Count);
                }

                context.TracerEntities.Add(
                    new TracerEntity
                {
                    Id   = 2,
                    Name = "Orange squash gums"
                });

                context.SaveChanges();

                Assert.Equal(1, commandTracer.DbCommands.Count());
                Assert.Null(context.TracerEntities.SingleOrDefault(p => p.Id == 1));
                Assert.NotNull(context.TracerEntities.SingleOrDefault(p => p.Id == 2));
            }
        }
コード例 #11
0
        public void Can_trace_commands_and_execution_cancelled()
        {
            using (var context = new TracerContext())
            {
                context.TracerEntities.Add(
                    new TracerEntity
                        {
                            Id = 1,
                            Name = "Pineapple Lumps"
                        });

                CommandTracer commandTracer;

                using (commandTracer = new CommandTracer(context))
                {
                    context.SaveChanges();

                    var interceptedCommand = commandTracer.DbCommands.Single();

                    Assert.Equal(
                        "INSERT [dbo].[TracerEntities]([Id], [Name])\r\nVALUES (@0, @1)\r\n",
                        interceptedCommand.CommandText);

                    Assert.Equal(2, interceptedCommand.Parameters.Count);
                }

                context.TracerEntities.Add(
                    new TracerEntity
                        {
                            Id = 2,
                            Name = "Orange squash gums"
                        });

                context.SaveChanges();

                Assert.Equal(1, commandTracer.DbCommands.Count());
                Assert.Null(context.TracerEntities.SingleOrDefault(p => p.Id == 1));
                Assert.NotNull(context.TracerEntities.SingleOrDefault(p => p.Id == 2));
            }
        }
コード例 #12
0
        /// <summary>
        /// Starts the new trace.
        /// </summary>
        private void startNewTrace()
        {
            traceBindingList.Clear();
            fileContentBindingList.Clear();
            traceElementList.Clear();

            traceFileContentListBox.ActiveLineNumber = -1;
            traceFileContentListBox.ActualFileName   = "null";

            labelTraceCount.Text = "0";

            getUserContext().ComportSelection  = comportWindow.Comport;
            getUserContext().BaudrateSelection = comportWindow.Baudrate;

            TracerContext.getInstance().Comport     = comportWindow.Comport;
            TracerContext.getInstance().Baudrate    = comportWindow.Baudrate;
            TracerContext.getInstance().TraceActive = true;

            TracerFactory.getInstance().getInterface().startTracing();

            progressTraceWindow.StartPosition = FormStartPosition.CenterParent;
            progressTraceWindow.ShowDialog(this);
        }
コード例 #13
0
ファイル: LoggerAdapter.cs プロジェクト: clawit/CocoHub
        public void TraceEnter(string methodInfo, string[] paramNames, object[] paramValues)
        {
            string argInfo = string.Empty;

            if (paramNames != null)
            {
                StringBuilder parameters = new StringBuilder();
                for (int i = 0; i < paramNames.Length; i++)
                {
                    parameters.AppendFormat("{0}={1}", paramNames[i],
                                            paramValues[i] == null ? NullString : paramValues[i].ToString()
                                            .Replace("\r\n", string.Empty)
                                            .Replace("\"", string.Empty)
                                            .Replace(@"\", @"/"));
                    if (i < paramNames.Length - 1)
                    {
                        parameters.Append(", ");
                    }
                }
                argInfo = parameters.ToString();
            }

            TracerContext.Enter();
            string message = String.Empty;

            if (TracerContext.Tracer == null)
            {
                message = String.Format(_textEnter, methodInfo, argInfo);
            }
            else
            {
                message = String.Format(_textEnterWithTracer, methodInfo, argInfo, TracerContext.Tracer.TracerId, TracerContext.Tracer.SpanId, TracerContext.IP);
            }

            Log.Info(message);
        }
コード例 #14
0
 /// <summary>
 /// Gets the context.
 /// </summary>
 /// <returns></returns>
 protected TracerContext getContext()
 {
     return(TracerContext.getInstance());
 }
コード例 #15
0
        private void SendSpanTree(TracerContext tracerContext, MyTree <IClientSpan> spanTree)
        {
            var clientSpan = spanTree.Value;
            var tracer     = tracerContext.Current(clientSpan.TracerId);

            using (var scope = tracer.BuildSpan(clientSpan.OpName)
                               .WithStartTimestamp(clientSpan.StartUtc)
                               .StartActive(false))
            {
                foreach (var bag in clientSpan.Bags)
                {
                    if (bag.Value == null)
                    {
                        scope.Span.SetTag(bag.Key, null);
                        continue;
                    }
                    scope.Span.SetTag(bag.Key, bag.Value);
                }

                var logGroups = clientSpan.Logs.GroupBy(x => x.Value.CreateAt).ToList();
                foreach (var logGroup in logGroups)
                {
                    var createAt = logGroup.Key;
                    var logInfos = logGroup.Select(x => new KeyValuePair <string, object>(x.Key, x.Value.Value)).ToList();
                    scope.Span.Log(createAt, logInfos);
                }


                foreach (var tag in clientSpan.Tags)
                {
                    if (tag.Value == null)
                    {
                        scope.Span.SetTag(tag.Key, null);
                        continue;
                    }

                    if (tag.Value is bool boolValue)
                    {
                        scope.Span.SetTag(tag.Key, boolValue);
                    }
                    else if (tag.Value is int intValue)
                    {
                        scope.Span.SetTag(tag.Key, intValue);
                    }
                    else if (tag.Value is double doubleValue)
                    {
                        scope.Span.SetTag(tag.Key, doubleValue);
                    }
                    scope.Span.SetTag(tag.Key, tag.Value.ToString());
                }

                //cascade process children
                foreach (var childTree in spanTree.Children)
                {
                    SendSpanTree(tracerContext, childTree);
                }

                if (clientSpan.FinishUtc != null)
                {
                    //throw ex?
                    scope.Span.Finish(clientSpan.FinishUtc.Value);
                }
            }
        }
コード例 #16
0
        /// <summary>
        /// Ons the selected index changed.
        /// </summary>
        /// <param name="o">The o.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        private void onTraceListBoxSelectedIndexChanged(object o, EventArgs e)
        {
            debug("MainWindow.onTraceListBoxSelectedIndexChanged()");

            TraceGuiListItem traceItem = traceListBox.SelectedItem as TraceGuiListItem;

            if (traceItem == null)
            {
                return;
            }

            if (traceFileContentListBox.ActualFileName.CompareTo(traceItem.FileName) == 0)
            {
                labelTraceFileLine.Text = Convert.ToString(traceItem.LineNumber + 1);
                traceFileContentListBox.ActiveLineNumber = traceItem.LineNumber + 1;
                // ---------------------------------traceFileContentListBox.SelectedIndex = traceItem.LineNumber;
                //traceFileContentListBox.Refresh();
                //return;
            }

            labelTraceFilePath.Text = traceItem.FileName;
            labelTraceFileLine.Text = Convert.ToString(traceItem.LineNumber + 1);

            traceFileContentListBox.ActiveLineNumber = traceItem.LineNumber + 1;
            traceFileContentListBox.ActualFileName   = traceItem.FileName;
            //fileContentBindingList.Clear(); ------------------------------------------------------
            this.traceFileContentTextBox.Clear();

            string[] fileContent = File_Factory.FileFactory.getInstance().getFileContentAsLineArray(TracerContext.getInstance().BasicFilePath + traceItem.FileName);

            for (int i = 0; i < fileContent.Length; i++)
            {
                // -------------------------fileContentBindingList.Add(new TraceFileContentElement(i + 1, fileContent[i]));
                if (i == traceItem.LineNumber)
                {
                    this.traceFileContentTextBox.SelectionBackColor = Color.Blue;
                }
                else
                {
                    this.traceFileContentTextBox.SelectionBackColor = Color.DarkBlue;
                }

                this.traceFileContentTextBox.AppendText((i + 1) + "\t");
                this.traceFileContentTextBox.AppendText(fileContent[i]);
                this.traceFileContentTextBox.AppendText("\n");
            }

            traceFileContentTextBox.SelectionStart = traceFileContentTextBox.Find(traceFileContentTextBox.Lines[traceItem.LineNumber]);
            traceFileContentTextBox.ScrollToCaret();

            return;
        }
コード例 #17
0
        private static void AddTraceClients(IServiceCollection services, IConfiguration configuration)
        {
            services.AddSingleton <IClientTracerApi, ClientTracerApi>();
            services.AddSingleton <CommandQueue>();
            services.AddSingleton <CommandQueueTask>();

            //SimpleTrace.dll
            var assemblyToScan = Assembly.GetAssembly(typeof(ICommandLogistic));

            //All IClientSpanProcess
            services.AddSingletonFromAssembly(assemblyToScan, typeof(IClientSpanProcess));
            //All ICommandLogistic and KnownCommands
            services.AddSingletonFromAssembly(assemblyToScan, typeof(ICommandLogistic));
            services.AddSingleton(sp =>
            {
                var knownCommands = KnownCommands.Instance;

                var commandLogistics = sp.GetServices <ICommandLogistic>().ToList();
                foreach (var commandLogistic in commandLogistics)
                {
                    knownCommands.Register(commandLogistic);
                }

                return(knownCommands);
            });

            //TraceConfig
            var traceConfig = TryLoadTraceConfig(configuration);

            services.AddSingleton(traceConfig);

            //CommandQueueTaskLoop
            services.AddSingleton(sp =>
            {
                var commandQueueTaskLoop = new CommandQueueTaskLoop();

                var queueTask        = sp.GetService <CommandQueueTask>();
                var knownCommands    = sp.GetService <KnownCommands>();
                var commandLogistics = sp.GetServices <ICommandLogistic>().ToList();
                foreach (var commandLogistic in commandLogistics)
                {
                    knownCommands.Register(commandLogistic);
                }

                commandQueueTaskLoop.Init(
                    TimeSpan.FromSeconds(traceConfig.FlushIntervalSecond),
                    queueTask,
                    sp.GetService <CommandQueue>(),
                    sp.GetServices <ICommandLogistic>(),
                    sp.GetServices <IClientSpanProcess>(),
                    DateHelper.Instance.GetDateNow);

                return(commandQueueTaskLoop);
            });
            services.AddSingleton(CommandQueueProcessLogs.Instance);


            //IClientSpanRepository
            if (traceConfig.TraceSaveProcessEnabled)
            {
                services.AddSingleton <IClientSpanRepository, ClientSpanRepository>();
            }
            else
            {
                services.AddSingleton <IClientSpanRepository, NullClientSpanRepository>();
            }

            //TracerContext
            var tracerContext = TracerContext.Resolve();

            services.AddSingleton <TracerContext>(tracerContext);

            if (traceConfig.TraceSendProcessEnabled)
            {
                //JaegerTracerConfig
                var jaegerTracerConfig = new JaegerTracerConfig();
                jaegerTracerConfig.DefaultTracerId = traceConfig.DefaultTracerId;
                jaegerTracerConfig.TraceEndPoint   = traceConfig.TraceEndPoint;
                services.AddSingleton(jaegerTracerConfig);

                //ITracerFactory and TracerContext
                var tracerFactory = new JaegerTracerFactory(jaegerTracerConfig);
                services.AddSingleton <ITracerFactory>(tracerFactory);
                tracerContext.Factory = tracerFactory;

                //ITraceSender
                services.AddSingleton <ITraceSender, JaegerTraceSender>();

                //log TraceConfig
                var tracer = tracerContext.Current();
                using (var scope = tracer.BuildSpan("LogObject").StartActive(true))
                {
                    scope.Span.SetTag("Name", "TraceConfig");
                    var dictionary = MyModelHelper.GetKeyValueDictionary(traceConfig);
                    foreach (var kv in dictionary)
                    {
                        scope.Span.Log(kv.Key + " : " + kv.Value);
                    }
                }
            }
            else
            {
                services.AddSingleton <ITracerFactory, NullTracerFactory>();
                services.AddSingleton <ITraceSender, NullTraceSender>();
            }
        }
コード例 #18
0
 /// <summary>
 /// Starts the tracing.
 /// </summary>
 public void startTracing()
 {
     TracerContext.getInstance().TraceActive = true;
     engine.start(50);
 }
コード例 #19
0
 public void setConnectionInterface(ICommonConnectionInterface iConnection)
 {
     TracerContext.getInstance().Connection = iConnection;
 }
コード例 #20
0
 /// <summary>
 /// Stops the tracing.
 /// </summary>
 public void stopTracing()
 {
     TracerContext.getInstance().TraceActive = false;
     engine.stop();
 }