常见Redis操作增加记录埋点数值

This commit is contained in:
大石头 2025-07-23 11:17:19 +08:00
parent 18430f02ac
commit 903a8fa7ff
1 changed files with 91 additions and 37 deletions

View File

@ -1,4 +1,5 @@
using System.Buffers;
using System;
using System.Buffers;
using System.Collections.Concurrent;
using System.Net.Security;
using System.Net.Sockets;
@ -698,10 +699,24 @@ public class RedisClient : DisposeBase
var rs = ExecuteCommand(cmd, args);
if (rs == null) return default;
if (span != null && rs is Array ars) span.Value = ars.Length;
if (rs is TResult rs2) return rs2;
if (TryChangeType(rs, type, out var target))
{
// 埋点记录结果数值
if (span != null)
{
span.Value = target switch
{
Int32 n => n,
Int64 m => m,
String str => str.Length,
Array arr => arr.Length,
_ => 0,
};
}
//!!! 外部调用者可能需要直接使用内部申请的OwnerPacket所以这里不释放
// 释放内部申请的OwnerPacket
if (type != typeof(IPacket) && type != typeof(IPacket[])) rs.TryDispose();
@ -762,6 +777,7 @@ public class RedisClient : DisposeBase
try
{
var rs = ExecuteCommand(cmd, args);
if (span != null && rs is Array ars) span.Value = ars.Length;
if (rs is TResult rs2)
{
value = rs2;
@ -774,6 +790,19 @@ public class RedisClient : DisposeBase
var type = typeof(TResult);
if (TryChangeType(rs, type, out var target))
{
// 埋点记录结果数值
if (span != null)
{
span.Value = target switch
{
Int32 n => n,
Int64 m => m,
String str => str.Length,
Array arr => arr.Length,
_ => 0,
};
}
//!!! 外部调用者可能需要直接使用内部申请的OwnerPacket所以这里不释放
// 释放内部申请的OwnerPacket
if (type != typeof(IPacket) && type != typeof(IPacket[])) rs.TryDispose();
@ -790,26 +819,26 @@ public class RedisClient : DisposeBase
}
}
/// <summary>异步执行命令。返回字符串、IPacket、IPacket[]</summary>
/// <param name="cmd">命令</param>
/// <param name="args">参数数组</param>
/// <param name="cancellationToken">取消通知</param>
/// <returns></returns>
public virtual async Task<Object?> ExecuteAsync(String cmd, Object?[] args, CancellationToken cancellationToken = default)
{
// 埋点名称,支持二级命令
var act = cmd.EqualIgnoreCase("cluster", "xinfo", "xgroup", "xreadgroup") ? $"{cmd}-{args?.FirstOrDefault()}" : cmd;
using var span = cmd.IsNullOrEmpty() ? null : Host.Tracer?.NewSpan($"redis:{Name}:{act}", args);
try
{
return await ExecuteCommandAsync(cmd, args, cancellationToken).ConfigureAwait(false);
}
catch (Exception ex)
{
span?.SetError(ex, null);
throw;
}
}
///// <summary>异步执行命令。返回字符串、IPacket、IPacket[]</summary>
///// <param name="cmd">命令</param>
///// <param name="args">参数数组</param>
///// <param name="cancellationToken">取消通知</param>
///// <returns></returns>
//public virtual async Task<Object?> ExecuteAsync(String cmd, Object?[] args, CancellationToken cancellationToken = default)
//{
// // 埋点名称,支持二级命令
// var act = cmd.EqualIgnoreCase("cluster", "xinfo", "xgroup", "xreadgroup") ? $"{cmd}-{args?.FirstOrDefault()}" : cmd;
// using var span = cmd.IsNullOrEmpty() ? null : Host.Tracer?.NewSpan($"redis:{Name}:{act}", args);
// try
// {
// return await ExecuteCommandAsync(cmd, args, cancellationToken).ConfigureAwait(false);
// }
// catch (Exception ex)
// {
// span?.SetError(ex, null);
// throw;
// }
//}
/// <summary>异步执行命令。返回基本类型、对象、对象数组</summary>
/// <param name="cmd">命令</param>
@ -823,6 +852,11 @@ public class RedisClient : DisposeBase
/// <param name="cancellationToken">取消通知</param>
/// <returns></returns>
public virtual async Task<TResult?> ExecuteAsync<TResult>(String cmd, Object?[] args, CancellationToken cancellationToken)
{
// 埋点名称,支持二级命令
var act = cmd.EqualIgnoreCase("cluster", "xinfo", "xgroup", "xreadgroup") ? $"{cmd}-{args?.FirstOrDefault()}" : cmd;
using var span = cmd.IsNullOrEmpty() ? null : Host.Tracer?.NewSpan($"redis:{Name}:{act}", args);
try
{
// 管道模式
var type = typeof(TResult);
@ -832,12 +866,26 @@ public class RedisClient : DisposeBase
return default;
}
var rs = await ExecuteAsync(cmd, args, cancellationToken).ConfigureAwait(false);
var rs = await ExecuteCommandAsync(cmd, args, cancellationToken).ConfigureAwait(false);
if (rs == null) return default;
if (span != null && rs is Array ars) span.Value = ars.Length;
if (rs is TResult rs2) return rs2;
if (TryChangeType(rs, type, out var target))
{
// 埋点记录结果数值
if (span != null)
{
span.Value = target switch
{
Int32 n => n,
Int64 m => m,
String str => str.Length,
Array arr => arr.Length,
_ => 0,
};
}
//!!! 外部调用者可能需要直接使用内部申请的OwnerPacket所以这里不释放
// 释放内部申请的OwnerPacket
if (type != typeof(IPacket) && type != typeof(IPacket[])) rs.TryDispose();
@ -846,6 +894,12 @@ public class RedisClient : DisposeBase
return default;
}
catch (Exception ex)
{
span?.SetError(ex, null);
throw;
}
}
/// <summary>读取更多。用于PubSub等多次读取命令</summary>
/// <param name="cancellationToken">取消通知</param>