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