track/src/TrackCenter.Repository/Otel/ActivityHelper.cs
2025-07-14 15:01:31 +08:00

116 lines
3.8 KiB
C#

using System.Diagnostics;
using TrackCenter.Repository.Otel.Options;
namespace TrackCenter.Repository.Otel
{
/// <summary>
/// ActivityHelper
/// </summary>
public static class ActivityHelper
{
/// <summary>
/// 是否初始化
/// </summary>
private static bool _initialized = false;
/// <summary>
/// 获取ActivitySource
/// </summary>
public static ActivitySource ActivitySource { get; private set; }
/// <summary>
/// 获取OTelOptions
/// </summary>
public static OTelOptions OTelOptions { get; private set; }
/// <summary>
/// 初始化服务名称
/// </summary>
/// <param name="options"> OTelOptions 配置信息</param>
public static void InitActivitySource(OTelOptions options)
{
if (_initialized == false)
{
ActivitySource = new ActivitySource(options.ServiceName, options.ServiceVersion);
OTelOptions = options;
_initialized = true;
}
else
{
Debug.WriteLine("ActivityHelper has been initialized");
}
}
/// <summary>
/// 创建SpanActivity
/// </summary>
/// <param name="spanName"> span 名称 </param>
/// <param name="kind"> 类型 </param>
/// <returns></returns>
public static Activity CreateSpanActivity(string spanName, ActivityKind kind = ActivityKind.Internal)
{
return ActivitySource.StartActivity(spanName, kind);
}
/// <summary>
/// 启动SpanActivity
/// </summary>
/// <param name="spanName"> span名称 </param>
/// <param name="tags"> 标签 </param>
/// <param name="kind"> 类型 </param>
public static void StartSpanActivity(string spanName, Dictionary<string, object> tags, ActivityKind kind = ActivityKind.Internal)
{
using (var activity = ActivitySource.StartActivity(spanName, kind))
{
if (tags != null)
{
foreach (var tag in tags)
{
activity.SetTag(tag.Key, tag.Value);
}
}
}
}
/// <summary>
/// 启动SpanActivity
/// </summary>
/// <param name="spanName"> span名称 </param>
/// <param name="proxyActivity"> 代理Activity </param>
/// <param name="kind"> 类型 </param>
public static void StartSpanActivity(string spanName, Action<Activity> proxyActivity, ActivityKind kind = ActivityKind.Internal)
{
using (var activity = ActivitySource.StartActivity(spanName, kind))
{
try
{
proxyActivity?.Invoke(activity);
}
catch (Exception ex)
{
activity.SetStatus(ActivityStatusCode.Error, ex.ToString());
}
}
}
/// <summary>
/// 对象转字符串
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static string ToString(this object obj)
{
string value;
try
{
if (OTelOptions != null && OTelOptions.Serializer != null && obj != null)
{
value = OTelOptions.Serializer(obj);
}
else
{
value = obj?.ToString();
}
}
catch
{
value = $"Type: {obj?.GetType().FullName}";
}
return value;
}
}
}