Skip to content

Commit 339af3f

Browse files
committed
feat: SqlQuery 增加 诊断信息
1 parent 86b9118 commit 339af3f

File tree

7 files changed

+255
-23
lines changed

7 files changed

+255
-23
lines changed

Bing.All.sln

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,9 +228,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bing.Test.Shared", "framewo
228228
EndProject
229229
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bing.Ddd.Domain.Tests", "framework\tests\Bing.Ddd.Domain.Tests\Bing.Ddd.Domain.Tests.csproj", "{8B581529-D7D2-4DCF-824A-2AAFB58F8C94}"
230230
EndProject
231-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bing.EventBus", "framework\src\Bing.EventBus\Bing.EventBus.csproj", "{5E8AD211-7AEF-4D9D-AFA8-C85B6F3D7C6A}"
231+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bing.EventBus", "framework\src\Bing.EventBus\Bing.EventBus.csproj", "{5E8AD211-7AEF-4D9D-AFA8-C85B6F3D7C6A}"
232232
EndProject
233-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bing.EventBus.Tests", "framework\tests\Bing.EventBus.Tests\Bing.EventBus.Tests.csproj", "{0A5D1639-8EEE-4BC9-94A5-04F354FEFBFD}"
233+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bing.EventBus.Tests", "framework\tests\Bing.EventBus.Tests\Bing.EventBus.Tests.csproj", "{0A5D1639-8EEE-4BC9-94A5-04F354FEFBFD}"
234234
EndProject
235235
Global
236236
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
using System;
2+
using Bing.Data.Enums;
3+
4+
namespace Bing.Data.Sql.Diagnostics
5+
{
6+
/// <summary>
7+
/// 诊断消息
8+
/// </summary>
9+
public class DiagnosticsMessage
10+
{
11+
/// <summary>
12+
/// 操作时间戳
13+
/// </summary>
14+
public long? OperationTimestamp { get; set; }
15+
16+
/// <summary>
17+
/// 操作
18+
/// </summary>
19+
public string Operation { get; set; }
20+
21+
/// <summary>
22+
/// 操作标识
23+
/// </summary>
24+
public string OperationId { get; set; } = Guid.NewGuid().ToString();
25+
26+
/// <summary>
27+
/// Sql语句
28+
/// </summary>
29+
public string Sql { get; set; }
30+
31+
/// <summary>
32+
/// Sql参数
33+
/// </summary>
34+
public object Parameters { get; set; }
35+
36+
/// <summary>
37+
/// 数据库类型
38+
/// </summary>
39+
public DatabaseType DatabaseType { get; set; }
40+
41+
/// <summary>
42+
/// 数据库数据源
43+
/// </summary>
44+
public string DataSource { get; set; }
45+
46+
/// <summary>
47+
/// 耗时
48+
/// </summary>
49+
public long? ElapsedMilliseconds { get; set; }
50+
51+
/// <summary>
52+
/// 异常
53+
/// </summary>
54+
public Exception Exception { get; set; }
55+
}
56+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
namespace Bing.Data.Sql.Diagnostics
2+
{
3+
/// <summary>
4+
/// 诊断常量
5+
/// </summary>
6+
public class SqlQueryDiagnosticListenerNames
7+
{
8+
/// <summary>
9+
/// 前缀
10+
/// </summary>
11+
public const string Prefix = "Bing.SqlQuery.";
12+
13+
/// <summary>
14+
/// 监听名称
15+
/// </summary>
16+
public const string DiagnosticListenerName = "SqlQueryDiagnosticListener";
17+
18+
/// <summary>
19+
/// 执行前
20+
/// </summary>
21+
public const string BeforeExecute = Prefix + "ExecuteBefore";
22+
23+
/// <summary>
24+
/// 执行后
25+
/// </summary>
26+
public const string AfterExecute = Prefix + "ExecuteAfter";
27+
28+
/// <summary>
29+
/// 执行异常
30+
/// </summary>
31+
public const string ErrorExecute = Prefix + "ExecuteError";
32+
33+
/// <summary>
34+
/// 执行数据库连接释放
35+
/// </summary>
36+
public const string DisposeExecute = Prefix + "ExecuteDispose";
37+
38+
/// <summary>
39+
/// 数据库连接释放异常
40+
/// </summary>
41+
public const string DisposeException = Prefix + "DisposeException";
42+
}
43+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
using System;
2+
using System.Diagnostics;
3+
using Bing.Data.Sql.Diagnostics;
4+
5+
namespace Bing.Data.Sql.Queries
6+
{
7+
// Sql查询对象 - 诊断相关
8+
public abstract partial class SqlQueryBase
9+
{
10+
/// <summary>
11+
/// 诊断日志
12+
/// </summary>
13+
// ReSharper disable once InconsistentNaming
14+
private static readonly DiagnosticListener _diagnosticListener = new DiagnosticListener(SqlQueryDiagnosticListenerNames.DiagnosticListenerName);
15+
16+
/// <summary>
17+
/// 执行前诊断
18+
/// </summary>
19+
/// <param name="sql">Sql语句</param>
20+
/// <param name="parameter">Sql参数</param>
21+
/// <param name="dataSource">数据源</param>
22+
protected virtual DiagnosticsMessage ExecuteBefore(string sql, object parameter, string dataSource = null)
23+
{
24+
if (!_diagnosticListener.IsEnabled(SqlQueryDiagnosticListenerNames.BeforeExecute))
25+
return null;
26+
var message = new DiagnosticsMessage
27+
{
28+
Sql = sql,
29+
Parameters = parameter,
30+
DataSource = dataSource,
31+
OperationTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
32+
Operation = SqlQueryDiagnosticListenerNames.BeforeExecute,
33+
DatabaseType = SqlOptions.DatabaseType,
34+
};
35+
_diagnosticListener.Write(SqlQueryDiagnosticListenerNames.BeforeExecute, message);
36+
return message;
37+
}
38+
39+
/// <summary>
40+
/// 执行后诊断
41+
/// </summary>
42+
/// <param name="message">诊断消息</param>
43+
protected virtual void ExecuteAfter(DiagnosticsMessage message)
44+
{
45+
if (message?.OperationTimestamp != null && _diagnosticListener.IsEnabled(SqlQueryDiagnosticListenerNames.AfterExecute))
46+
{
47+
message.Operation = SqlQueryDiagnosticListenerNames.AfterExecute;
48+
message.ElapsedMilliseconds = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - message.OperationTimestamp.Value;
49+
_diagnosticListener.Write(SqlQueryDiagnosticListenerNames.AfterExecute, message);
50+
}
51+
}
52+
53+
/// <summary>
54+
/// 执行异常诊断
55+
/// </summary>
56+
/// <param name="message">诊断消息</param>
57+
/// <param name="exception">异常</param>
58+
protected virtual void ExecuteError(DiagnosticsMessage message, Exception exception)
59+
{
60+
if (exception != null && message?.OperationTimestamp != null && _diagnosticListener.IsEnabled(SqlQueryDiagnosticListenerNames.ErrorExecute))
61+
{
62+
message.Exception = exception;
63+
message.Operation = SqlQueryDiagnosticListenerNames.ErrorExecute;
64+
message.ElapsedMilliseconds = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - message.OperationTimestamp.Value;
65+
66+
_diagnosticListener.Write(SqlQueryDiagnosticListenerNames.ErrorExecute, message);
67+
}
68+
}
69+
}
70+
}

framework/src/Bing.Data.Sql/Bing/Data/Sql/Queries/SqlQueryBase.cs

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Threading.Tasks;
55
using Bing.Data.Sql.Builders;
66
using Bing.Data.Sql.Builders.Core;
7+
using Bing.Data.Sql.Diagnostics;
78
using Bing.DependencyInjection;
89
using Bing.Helpers;
910
using Microsoft.Extensions.Options;
@@ -13,7 +14,7 @@ namespace Bing.Data.Sql.Queries
1314
/// <summary>
1415
/// Sql查询对象基类
1516
/// </summary>
16-
public abstract class SqlQueryBase : ISqlQuery, IClauseAccessor, IUnionAccessor, ICteAccessor
17+
public abstract partial class SqlQueryBase : ISqlQuery, IClauseAccessor, IUnionAccessor, ICteAccessor
1718
{
1819
#region 属性
1920

@@ -320,11 +321,26 @@ public abstract Task<PagerList<TResult>> PagerQueryAsync<TResult>(Func<Task<List
320321
/// <param name="connection">数据库连接</param>
321322
public TResult Query<TResult>(Func<IDbConnection, string, IReadOnlyDictionary<string, object>, TResult> func, IDbConnection connection = null)
322323
{
323-
var sql = GetSql();
324-
WriteTraceLog(sql, Params, GetDebugSql());
325-
var result = func(GetConnection(connection), sql, Params);
326-
ClearAfterExecution();
327-
return result;
324+
DiagnosticsMessage message = null;
325+
try
326+
{
327+
var sql = GetSql();
328+
329+
message = ExecuteBefore(sql, Params);
330+
331+
WriteTraceLog(sql, Params, GetDebugSql());
332+
var result = func(GetConnection(connection), sql, Params);
333+
ClearAfterExecution();
334+
335+
ExecuteAfter(message);
336+
return result;
337+
}
338+
catch (Exception e)
339+
{
340+
ExecuteError(message, e);
341+
throw;
342+
}
343+
328344
}
329345

330346
/// <summary>
@@ -335,11 +351,26 @@ public TResult Query<TResult>(Func<IDbConnection, string, IReadOnlyDictionary<st
335351
/// <param name="connection">数据库连接</param>
336352
public async Task<TResult> QueryAsync<TResult>(Func<IDbConnection, string, IReadOnlyDictionary<string, object>, Task<TResult>> func, IDbConnection connection = null)
337353
{
338-
var sql = GetSql();
339-
WriteTraceLog(sql, Params, GetDebugSql());
340-
var result = await func(GetConnection(connection), sql, Params);
341-
ClearAfterExecution();
342-
return result;
354+
DiagnosticsMessage message = null;
355+
try
356+
{
357+
var sql = GetSql();
358+
359+
message = ExecuteBefore(sql, Params);
360+
361+
WriteTraceLog(sql, Params, GetDebugSql());
362+
var result = await func(GetConnection(connection), sql, Params);
363+
ClearAfterExecution();
364+
365+
ExecuteAfter(message);
366+
return result;
367+
}
368+
catch (Exception e)
369+
{
370+
ExecuteError(message, e);
371+
throw;
372+
}
373+
343374
}
344375

345376
/// <summary>

framework/src/Bing.Datas.Dapper/Bing/Data/Sql/Queries/SqlQuery.cs

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Data;
44
using System.Linq;
55
using System.Threading.Tasks;
6+
using Bing.Data.Sql.Diagnostics;
67
using Bing.Helpers;
78
using Bing.Logs;
89
using Dapper;
@@ -133,11 +134,25 @@ public override PagerList<TResult> PagerQuery<TResult>(Func<List<TResult>> func,
133134
/// <param name="connection">数据库连接</param>
134135
protected int GetCount(IDbConnection connection)
135136
{
136-
var builder = GetCountBuilder();
137-
var sql = builder.ToSql();
138-
WriteTraceLog(sql, builder.GetParams(), builder.ToDebugSql());
139-
var result = GetConnection(connection).ExecuteScalar(sql, builder.GetParams());
140-
return Conv.ToInt(result);
137+
DiagnosticsMessage message = null;
138+
try
139+
{
140+
var builder = GetCountBuilder();
141+
var sql = builder.ToSql();
142+
143+
message = ExecuteBefore(sql, Params);
144+
145+
WriteTraceLog(sql, builder.GetParams(), builder.ToDebugSql());
146+
var result = GetConnection(connection).ExecuteScalar(sql, builder.GetParams());
147+
148+
ExecuteAfter(message);
149+
return Conv.ToInt(result);
150+
}
151+
catch (Exception e)
152+
{
153+
ExecuteError(message, e);
154+
throw;
155+
}
141156
}
142157

143158
/// <summary>
@@ -191,11 +206,26 @@ public override async Task<PagerList<TResult>> PagerQueryAsync<TResult>(Func<Tas
191206
/// <param name="connection">数据库连接</param>
192207
protected async Task<int> GetCountAsync(IDbConnection connection)
193208
{
194-
var builder = GetCountBuilder();
195-
var sql = builder.ToSql();
196-
WriteTraceLog(sql, builder.GetParams(), builder.ToDebugSql());
197-
var result = await GetConnection(connection).ExecuteScalarAsync(sql, builder.GetParams());
198-
return Conv.ToInt(result);
209+
DiagnosticsMessage message = null;
210+
try
211+
{
212+
var builder = GetCountBuilder();
213+
var sql = builder.ToSql();
214+
215+
message = ExecuteBefore(sql, Params);
216+
217+
WriteTraceLog(sql, builder.GetParams(), builder.ToDebugSql());
218+
var result = await GetConnection(connection).ExecuteScalarAsync(sql, builder.GetParams());
219+
220+
ExecuteAfter(message);
221+
return Conv.ToInt(result);
222+
}
223+
catch (Exception e)
224+
{
225+
ExecuteError(message, e);
226+
throw;
227+
}
228+
199229
}
200230

201231
/// <summary>

framework/src/Bing/project.dependency.props

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,7 @@
1212
<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="$(MicrosoftPackageVersion)" />
1313
<PackageReference Include="Microsoft.Extensions.Localization" Version="$(MicrosoftPackageVersion)" />
1414
<PackageReference Include="Microsoft.Extensions.PlatformAbstractions" Version="1.1.0" />
15+
16+
<PackageReference Include="System.Diagnostics.DiagnosticSource" Version="4.5.1" />
1517
</ItemGroup>
1618
</Project>

0 commit comments

Comments
 (0)