using System.Diagnostics;
using TrackCenter.Repository.Otel.Options;
namespace TrackCenter.Repository.Otel
{
///
/// ActivityHelper
///
public static class ActivityHelper
{
///
/// 是否初始化
///
private static bool _initialized = false;
///
/// 获取ActivitySource
///
public static ActivitySource ActivitySource { get; private set; }
///
/// 获取OTelOptions
///
public static OTelOptions OTelOptions { get; private set; }
///
/// 初始化服务名称
///
/// OTelOptions 配置信息
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");
}
}
///
/// 创建SpanActivity
///
/// span 名称
/// 类型
///
public static Activity CreateSpanActivity(string spanName, ActivityKind kind = ActivityKind.Internal)
{
return ActivitySource.StartActivity(spanName, kind);
}
///
/// 启动SpanActivity
///
/// span名称
/// 标签
/// 类型
public static void StartSpanActivity(string spanName, Dictionary 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);
}
}
}
}
///
/// 启动SpanActivity
///
/// span名称
/// 代理Activity
/// 类型
public static void StartSpanActivity(string spanName, Action 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());
}
}
}
///
/// 对象转字符串
///
///
///
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;
}
}
}