116 lines
3.8 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|