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; } } }