| /* |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| namespace DotPulsar.Internal; |
| |
| using DotPulsar.Abstractions; |
| using System.Collections.Generic; |
| using System.Diagnostics; |
| |
| public static class DotPulsarActivitySource |
| { |
| private const string _traceParent = "traceparent"; |
| private const string _traceState = "tracestate"; |
| |
| static DotPulsarActivitySource() |
| { |
| ActivitySource = new ActivitySource(Constants.ClientName, Constants.ClientVersion); |
| } |
| |
| public static ActivitySource ActivitySource { get; } |
| |
| public static Activity? StartConsumerActivity(IMessage message, string operationName, KeyValuePair<string, object?>[] tags) |
| { |
| if (!ActivitySource.HasListeners()) |
| return null; |
| |
| var properties = message.Properties; |
| |
| if (properties.TryGetValue(_traceParent, out var traceparent)) |
| { |
| var tracestate = properties.ContainsKey(_traceState) ? properties[_traceState] : null; |
| if (ActivityContext.TryParse(traceparent, tracestate, out var activityContext)) |
| return ActivitySource.StartActivity(operationName, ActivityKind.Consumer, activityContext, tags); |
| } |
| |
| var activity = ActivitySource.StartActivity(operationName, ActivityKind.Consumer); |
| |
| if (activity is not null && activity.IsAllDataRequested) |
| { |
| for (var i = 0; i < tags.Length; ++i) |
| { |
| var tag = tags[i]; |
| activity.SetTag(tag.Key, tag.Value); |
| } |
| } |
| |
| return activity; |
| } |
| |
| public static Activity? StartProducerActivity(MessageMetadata metadata, string operationName, KeyValuePair<string, object?>[] tags) |
| { |
| if (!ActivitySource.HasListeners()) |
| return null; |
| |
| var activity = ActivitySource.StartActivity(operationName, ActivityKind.Producer); |
| |
| if (activity is not null && activity.IsAllDataRequested) |
| { |
| metadata[_traceParent] = activity.TraceId.ToHexString(); |
| metadata[_traceState] = activity.TraceStateString; |
| |
| for (var i = 0; i < tags.Length; ++i) |
| { |
| var tag = tags[i]; |
| activity.SetTag(tag.Key, tag.Value); |
| } |
| } |
| |
| return activity; |
| } |
| } |