public void ExecuteBefore([Object] DiagnosticsMessage message)
        {
            if (message == null || message.Sql.IsNullOrEmpty())
            {
                return;
            }

            var parameterJson = string.Empty;

            if (message.Parameters is DynamicParameters dynamicParameters)
            {
                parameterJson = dynamicParameters
                                .ParameterNames?
                                .ToDictionary(k => k, v => dynamicParameters.Get <object>(v))
                                .ToJson();
            }
            else if (message.Parameters is OracleDynamicParameters oracleDynamicParameters)
            {
                parameterJson = oracleDynamicParameters
                                .OracleParameters
                                .ToDictionary(k => k.ParameterName, v => v.Value)
                                .ToJson();
            }
            else
            {
                parameterJson = message.Parameters.ToJson();
            }

            var newLine = Environment.NewLine;
            var context = CreateExitSegmentContext(message.Sql, message.DataSource);

            context.Span.AddLog(LogEvent.Event($"{DiagnosticStrings.BeforeExecute.Split(' ').Last()}: {DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}"));
            context.Span.AddLog(LogEvent.Message($"sql: {message.Sql}{newLine}parameters: {parameterJson}{newLine}databaseType: {message.DatabaseType}{newLine}dataSource: {message.DataSource}{newLine}timestamp: {message.Timestamp}"));
        }
Пример #2
0
        public void SendDiagnosticsEnable(bool enable)
        {
            var msg = new DiagnosticsMessage();

            msg.EnableDiagnostics = enable;
            PushMessage(msg);
        }
Пример #3
0
        public void ExecuteBefore([Object] DiagnosticsMessage message)
        {
            if (message != null && !message.Sql.IsNullOrEmpty())
            {
                var parameterJson = string.Empty;
                if (message.Parameters is DynamicParameters dynamicParameters)
                {
                    parameterJson = dynamicParameters
                                    .ParameterNames?
                                    .ToDictionary(k => k, v => dynamicParameters.Get <object>(v))
                                    .ToJson();
                }
                else if (message.Parameters is OracleDynamicParameters oracleDynamicParameters)
                {
                    parameterJson = oracleDynamicParameters
                                    .OracleParameters
                                    .ToDictionary(k => k.ParameterName, v => v.Value)
                                    .ToJson();
                }
                else
                {
                    parameterJson = message.Parameters.ToJson();
                }

                var context = CreateExitSegmentContext(message.Sql, message.DataSource);

                context.Span.AddLog(LogEvent.Event(DiagnosticStrings.BeforeExecute.Split(' ').Last()));
                context.Span.AddLog(LogEvent.Message($"sql语句:{message.Sql}"));
                context.Span.AddLog(LogEvent.Message($"sql参数:{parameterJson}"));
            }
        }
        public static BuildResult ToBuildResult(this DiagnosticsMessage message)
        {
            var result = new BuildResult();

            AddErrors(result.AddWarning, message.Warnings);
            AddErrors(result.AddError, message.Errors);
            return(result);
        }
Пример #5
0
 /// <summary>
 /// 执行后诊断
 /// </summary>
 /// <param name="message">诊断消息</param>
 protected virtual void ExecuteAfter(DiagnosticsMessage message)
 {
     if (message?.OperationTimestamp != null && _diagnosticListener.IsEnabled(SqlQueryDiagnosticListenerNames.AfterExecute))
     {
         message.Operation           = SqlQueryDiagnosticListenerNames.AfterExecute;
         message.ElapsedMilliseconds = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - message.OperationTimestamp.Value;
         _diagnosticListener.Write(SqlQueryDiagnosticListenerNames.AfterExecute, message);
     }
 }
Пример #6
0
    protected override void OnOpen()
    {
        var inputs = ControllerServer.Instance.GetInputs();

        var msg = new DiagnosticsMessage()
        {
            // Report, which players currently lost their connection
            playersWithLostConnection =
                inputs.Where(input => !input.IsConnected()).Select(input => input.PlayerName).ToList()
        };

        // Send the diagnostic information
        Send(msg.ToJson());
        // Close the connection
        Close();
    }
Пример #7
0
        public async Task SubscribeAsync(string resource, bool monitor)
        {
            string monitorUriString = null;
            string logUriString     = null;

            string[] parts = resource.Split(new[] { "-" }, StringSplitOptions.RemoveEmptyEntries);
            if (parts.Length == 1)
            {
                //virtual rtu
                monitorUriString = UriGenerator.GetVirtualRtuDiagnosticsPiSystem(hostname, parts[0]);
                logUriString     = UriGenerator.GetVirtualRtuTelemetryPiSystem(hostname, parts[0]);
            }
            else if (parts.Length == 2)
            {
                //module
                monitorUriString = UriGenerator.GetDeviceDiagnosticsPiSystem(hostname, parts[0], parts[1]);
                logUriString     = UriGenerator.GetDeviceTelemetryPiSystem(hostname, parts[0], parts[1]);
            }

            DiagnosticsMessage mevent = new DiagnosticsMessage
            {
                Type = monitor ? DiagnosticsEventType.Native : DiagnosticsEventType.None
            };

            string jsonString = JsonConvert.SerializeObject(mevent);
            await client.PublishAsync(QualityOfServiceLevelType.AtMostOnce, monitorUriString, "application/json",
                                      Encoding.UTF8.GetBytes(jsonString));

            if (monitor)
            {
                if (!subscriptions.Contains(logUriString))
                {
                    subscriptions.Add(logUriString);
                    await client.SubscribeAsync(logUriString, QualityOfServiceLevelType.AtMostOnce, ReceiveLog);
                }
            }
            else
            {
                if (subscriptions.Contains(logUriString))
                {
                    subscriptions.Remove(logUriString);
                    await client.UnsubscribeAsync(logUriString);
                }
            }
        }
Пример #8
0
        /// <summary>
        /// 执行前诊断
        /// </summary>
        /// <param name="sql">Sql语句</param>
        /// <param name="parameter">Sql参数</param>
        /// <param name="dataSource">数据源</param>
        protected virtual DiagnosticsMessage ExecuteBefore(string sql, object parameter, string dataSource = null)
        {
            if (!_diagnosticListener.IsEnabled(SqlQueryDiagnosticListenerNames.BeforeExecute))
            {
                return(null);
            }
            var message = new DiagnosticsMessage
            {
                Sql                = sql,
                Parameters         = parameter,
                DataSource         = dataSource,
                OperationTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
                Operation          = SqlQueryDiagnosticListenerNames.BeforeExecute,
                DatabaseType       = SqlOptions.DatabaseType,
            };

            _diagnosticListener.Write(SqlQueryDiagnosticListenerNames.BeforeExecute, message);
            return(message);
        }
Пример #9
0
        /// <summary>
        /// 查询
        /// </summary>
        /// <typeparam name="TResult">实体类型</typeparam>
        /// <param name="func">查询操作</param>
        /// <param name="connection">数据库连接</param>
        public TResult Query <TResult>(Func <IDbConnection, string, IReadOnlyDictionary <string, object>, TResult> func, IDbConnection connection = null)
        {
            DiagnosticsMessage message = null;

            try
            {
                var sql = GetSql();

                message = ExecuteBefore(sql, Params);

                WriteTraceLog(sql, Params, GetDebugSql());
                var result = func(GetConnection(connection), sql, Params);
                ClearAfterExecution();

                ExecuteAfter(message);
                return(result);
            }
            catch (Exception e)
            {
                ExecuteError(message, e);
                throw;
            }
        }
Пример #10
0
        /// <summary>
        /// 获取行数
        /// </summary>
        /// <param name="connection">数据库连接</param>
        protected async Task <int> GetCountAsync(IDbConnection connection)
        {
            DiagnosticsMessage message = null;

            try
            {
                var builder = GetCountBuilder();
                var sql     = builder.ToSql();

                message = ExecuteBefore(sql, Params);

                WriteTraceLog(sql, builder.GetParams(), builder.ToDebugSql());
                var result = await GetConnection(connection).ExecuteScalarAsync(sql, builder.GetParams());

                ExecuteAfter(message);
                return(Conv.ToInt(result));
            }
            catch (Exception e)
            {
                ExecuteError(message, e);
                throw;
            }
        }
Пример #11
0
        public async Task SubscribeAppInsightsAsync(string resource, bool monitor)
        {
            string monitorUriString = null;

            string[] parts = resource.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries);
            if (parts.Length == 1)
            {
                //virtual rtu
                monitorUriString = UriGenerator.GetVirtualRtuDiagnosticsPiSystem(hostname, parts[0]);
            }
            else if (parts.Length == 3)
            {
                //module
                monitorUriString = UriGenerator.GetDeviceDiagnosticsPiSystem(hostname, parts[0], parts[1]);
            }

            DiagnosticsMessage mevent = new DiagnosticsMessage()
            {
                Type = monitor ? DiagnosticsEventType.AppInsights : DiagnosticsEventType.None
            };
            string jsonString = JsonConvert.SerializeObject(mevent);
            await client.PublishAsync(QualityOfServiceLevelType.AtMostOnce, monitorUriString, "application/json", Encoding.UTF8.GetBytes(jsonString));
        }
Пример #12
0
        public static void DiagnosticSourceTest()
        {
            #region DiagnosticSource
            var diagnosticListener =
                new DiagnosticListener(DiagnosticStrings.DiagnosticListenerName);

            ////订阅方法一
            //DiagnosticListener.AllListeners.Subscribe(new MyObserver<DiagnosticListener>(listener =>
            //{
            //    //判断发布者的名字
            //    if (listener.Name == DiagnosticStrings.DiagnosticListenerName)
            //    {
            //        //获取订阅信息
            //        listener.Subscribe(new MyObserver<KeyValuePair<string, object>>(listenerData =>
            //        {
            //            Console.WriteLine($"监听名称:{listenerData.Key}");
            //            dynamic data = listenerData.Value;
            //            Console.WriteLine(data.Sql);
            //        }));
            //    }
            //}));

            ////订阅方法二
            DiagnosticListener.AllListeners.Subscribe(new MyObserver <DiagnosticListener>(listener =>
            {
                if (listener.Name == DiagnosticStrings.DiagnosticListenerName)
                {
                    //适配订阅
                    listener.SubscribeWithAdapter(new MyDiagnosticListener());
                }
            }));

            //订阅方法三
            //diagnosticListener.SubscribeWithAdapter(new MyDiagnosticListener());
            diagnosticListener.SubscribeWithAdapter(new SqlBuilderDiagnosticListener(null));

            //发送日志诊断消息
            if (diagnosticListener.IsEnabled(DiagnosticStrings.BeforeExecute) &&
                diagnosticListener.IsEnabled(DiagnosticStrings.AfterExecute) &&
                diagnosticListener.IsEnabled(DiagnosticStrings.ErrorExecute))
            {
                var message = new DiagnosticsMessage
                {
                    Sql        = "select * from table",
                    Parameters = new Dictionary <string, object>
                    {
                        ["key"] = "123"
                    },
                    Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                };
                diagnosticListener.Write(
                    DiagnosticStrings.BeforeExecute,
                    message);

                message.ElapsedMilliseconds = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - message.Timestamp;
                diagnosticListener.Write(
                    DiagnosticStrings.AfterExecute,
                    message);

                message.ElapsedMilliseconds = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - message.Timestamp;
                message.Exception           = new Exception("测试异常");
                diagnosticListener.Write(
                    DiagnosticStrings.ErrorExecute,
                    message);
            }
            #endregion
        }
Пример #13
0
 private bool IsDifferent(DiagnosticsMessage local, DiagnosticsMessage remote)
 {
     return(true);
 }
Пример #14
0
 public DiagnosticsEventArgs(int contextId, DiagnosticsMessage message)
     : base(contextId)
 {
     _message = message;
 }