private Dictionary <string, string> ExtractContextProperties(IServiceRemotingRequestMessage message)
        {
            IServiceRemotingRequestMessageHeader headers = message.GetHeader();

            //DANGER!!! this is using reflection to get to internal dictionary of headers collection.
            if (getHeadersField == null)
            {
                getHeadersField = headers.GetType()
                                  .GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
                                  .First(f => f.Name == "headers");
            }
            var headersCollection = getHeadersField.GetValue(headers) as Dictionary <string, byte[]>;

            if (headersCollection == null)
            {
                return(null);
            }

            var result = headersCollection.ToDictionary(
                e => e.Key,
                e => e.Value == null ? null : Enc.GetString(e.Value));

            // ActivityId becomes parent here
            if (result.TryGetValue(KnownProperty.ActivityId, out string activityId))
            {
                result[KnownProperty.ParentActivityId] = activityId;
                result.Remove(KnownProperty.ActivityId);
            }

            return(result);
        }
Пример #2
0
        private static void InjectContext(PropagationContext context, IServiceRemotingRequestMessageHeader messageHeaders)
        {
            if (context.TraceId == 0 || context.ParentSpanId == 0)
            {
                return;
            }

            try
            {
                messageHeaders.TryAddHeader(HttpHeaderNames.TraceId, context, ctx => BitConverter.GetBytes(ctx.TraceId));

                messageHeaders.TryAddHeader(HttpHeaderNames.ParentId, context, ctx => BitConverter.GetBytes(ctx.ParentSpanId));

                if (context.SamplingPriority != null)
                {
                    messageHeaders.TryAddHeader(HttpHeaderNames.SamplingPriority, context, ctx => BitConverter.GetBytes((int)ctx.SamplingPriority !));
                }

                if (!string.IsNullOrEmpty(context.Origin))
                {
                    messageHeaders.TryAddHeader(HttpHeaderNames.Origin, context, ctx => Encoding.UTF8.GetBytes(ctx.Origin !));
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Error injecting message headers.");
            }
        }
        private Task <IServiceRemotingResponseMessage> OnDispatch(
            IServiceRemotingRequestMessageHeader requestMessageHeaders,
            IServiceRemotingRequestMessageBody requestBody, CancellationToken cancellationToken)
        {
            MethodDispatcherBase methodDispatcher;

            if (!this.methodDispatcherMap.TryGetValue(requestMessageHeaders.InterfaceId, out methodDispatcher))
            {
                throw new NotImplementedException(string.Format(CultureInfo.CurrentCulture,
                                                                SR.ErrorInterfaceNotImplemented, requestMessageHeaders.InterfaceId, this.serviceImplementation));
            }
            Task <IServiceRemotingResponseMessageBody> dispatchTask = null;
            var stopwatch = Stopwatch.StartNew();

            try
            {
                dispatchTask = methodDispatcher.DispatchAsync(this.serviceImplementation,
                                                              requestMessageHeaders.MethodId,
                                                              requestBody,
                                                              this.GetRemotingMessageBodyFactory(),
                                                              cancellationToken);
            }
            catch (Exception e)
            {
                var info = ExceptionDispatchInfo.Capture(e);
                this.servicePerformanceCounterProvider.OnServiceMethodFinish
                    (requestMessageHeaders.InterfaceId,
                    requestMessageHeaders.MethodId,
                    stopwatch.Elapsed, e);
                info.Throw();
            }

            return(dispatchTask.ContinueWith(
                       t =>
            {
                object responseBody = null;
                try
                {
                    responseBody = t.GetAwaiter().GetResult();
                }
                catch (Exception e)
                {
                    var info = ExceptionDispatchInfo.Capture(e);

                    this.servicePerformanceCounterProvider.OnServiceMethodFinish
                        (requestMessageHeaders.InterfaceId,
                        requestMessageHeaders.MethodId,
                        stopwatch.Elapsed, e);
                    info.Throw();
                }

                this.servicePerformanceCounterProvider.OnServiceMethodFinish(
                    requestMessageHeaders.InterfaceId,
                    requestMessageHeaders.MethodId,
                    stopwatch.Elapsed);
                return (IServiceRemotingResponseMessage) new ServiceRemotingResponseMessage(null,
                                                                                            (IServiceRemotingResponseMessageBody)responseBody);
            },
                       TaskContinuationOptions.ExecuteSynchronously));
        }
 private static IEnumerable <string?> GetHeaders(IServiceRemotingRequestMessageHeader headers, string headerName)
 {
     if (headers.TryGetHeaderValueString(headerName, out var headerValue))
     {
         yield return(headerValue);
     }
 }
        public override async Task <IServiceRemotingResponseMessage> HandleRequestResponseAsync(
            IServiceRemotingRequestContext requestContext,
            IServiceRemotingRequestMessage requestMessage)
        {
            IServiceRemotingRequestMessageHeader headers = requestMessage.GetHeader();

            if (headers.TryGetHeaderValue(ActivityServiceRemoting.OperationIdHeaderName, out byte[] operationIdBytes))
Пример #6
0
        private static PropagationContext?ExtractContext(IServiceRemotingRequestMessageHeader messageHeaders)
        {
            try
            {
                ulong traceId = messageHeaders.TryGetHeaderValueUInt64(HttpHeaderNames.TraceId) ?? 0;

                if (traceId > 0)
                {
                    ulong parentSpanId = messageHeaders.TryGetHeaderValueUInt64(HttpHeaderNames.ParentId) ?? 0;

                    if (parentSpanId > 0)
                    {
                        SamplingPriority?samplingPriority = (SamplingPriority?)messageHeaders.TryGetHeaderValueInt32(HttpHeaderNames.SamplingPriority);
                        string?          origin           = messageHeaders.TryGetHeaderValueString(HttpHeaderNames.Origin);

                        return(new PropagationContext(traceId, parentSpanId, samplingPriority, origin));
                    }
                }

                return(null);
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Error extracting message headers.");
                return(default);
        public static string?TryGetHeaderValueString(this IServiceRemotingRequestMessageHeader headers, string headerName)
        {
            if (headers.TryGetHeaderValue(headerName, out var bytes) && bytes is not null)
            {
                return(Encoding.UTF8.GetString(bytes));
            }

            return(null);
        }
Пример #8
0
        /// <summary>
        /// Extract activity information from incoming remoting request headers
        /// </summary>
        public static void ExtractActivityFromIncomingRequest(this IServiceRemotingRequestMessage requestMessage, Activity?activity)
        {
            if (activity == null)
            {
                return;
            }

            IServiceRemotingRequestMessageHeader headers = requestMessage.GetHeader();

            if (headers.TryGetHeaderValue(TraceParentHeaderName, out byte[] idBytes))
Пример #9
0
 private static void ExtractAndSetAllCorrelationHeaderValues(IServiceRemotingRequestMessageHeader header)
 {
     foreach (var headerName in Constants.ExecutionTree.All)
     {
         if (header.TryGetHeaderValue(headerName, out var headerValue))
         {
             DecodeHeaderAndSetCallContext(headerName, headerValue);
         }
     }
 }
Пример #10
0
 internal static void FromRemotingMessageHeader(IServiceRemotingRequestMessageHeader header)
 {
     foreach (var customHeader in header.GetCustomHeaders().Where(h => h.Key != CustomHeaders.ReservedHeaderServiceUri))
     {
         if (customHeader.Key != null)
         {
             SetData(customHeader.Key, customHeader.Value);
         }
     }
 }
        /// <summary>
        /// Attach activity information to outgoing remoting request headers
        /// </summary>
        public static void AttachActivityToOutgoingRequest(this IServiceRemotingRequestMessage requestMessage, Activity?activity)
        {
            if (activity == null || string.IsNullOrWhiteSpace(activity.Id))
            {
                return;
            }

            IServiceRemotingRequestMessageHeader header = requestMessage.GetHeader();

            if (!header.TryGetHeaderValue(TraceParentHeaderName, out byte[] _))             // header update not supported
        public static bool TryAddHeader(this IServiceRemotingRequestMessageHeader headers, string headerName, PropagationContext context, Func <PropagationContext, byte[]> headerValue)
        {
            if (!headers.TryGetHeaderValue(headerName, out _))
            {
                byte[] bytes = headerValue(context);
                headers.AddHeader(headerName, bytes);
                return(true);
            }

            return(false);
        }
Пример #13
0
        public static bool TryAddHeader(this IServiceRemotingRequestMessageHeader headers, string headerName, string headerValue)
        {
            if (!headers.TryGetHeaderValue(headerName, out _))
            {
                byte[] bytes = Encoding.UTF8.GetBytes(headerValue);
                headers.AddHeader(headerName, bytes);
                return(true);
            }

            return(false);
        }
Пример #14
0
        public static bool TryGetHeaderValueString(this IServiceRemotingRequestMessageHeader headers, string headerName, out string?headerValue)
        {
            if (headers.TryGetHeaderValue(headerName, out var bytes) && bytes is not null)
            {
                headerValue = Encoding.UTF8.GetString(bytes);
                return(true);
            }

            headerValue = default;
            return(false);
        }
Пример #15
0
        /// <summary>
        /// Attach activity information to outgoing remoting request headers
        /// </summary>
        public static void AttachActivityToOutgoingRequest(this IServiceRemotingRequestMessage requestMessage, Activity?activity)
        {
            if (activity == null)
            {
                return;
            }

            IServiceRemotingRequestMessageHeader header = requestMessage.GetHeader();

            header.AddHeader(TraceParentHeaderName, s_encoding.GetBytes(activity.Id));
            header.AddHeader(TraceStateHeaderName, SerializeBaggage(activity.Baggage.ToArray()));
        }
        internal bool IsCancellationRequest(IServiceRemotingRequestMessageHeader requestMessageHeaders)
        {
            byte[] headerValue;
            if (requestMessageHeaders.InvocationId != null &&
                requestMessageHeaders.TryGetHeaderValue(ServiceRemotingRequestMessageHeader.CancellationHeaderName,
                                                        out headerValue))
            {
                return(true);
            }

            return(false);
        }
        private async Task <IServiceRemotingResponseMessageBody> HandleRequestResponseAsync(
            IServiceRemotingRequestMessageHeader remotingRequestMessageHeader,
            IServiceRemotingRequestMessageBody requestMessageBody,
            CancellationToken cancellationToken)
        {
            IServiceRemotingResponseMessage retval = await this.OnDispatch(remotingRequestMessageHeader, requestMessageBody,
                                                                           cancellationToken);

            if (retval != null)
            {
                return(retval.GetBody());
            }
            return(null);
        }
Пример #18
0
        public void Enrich(IServiceRemotingRequestMessage message)
        {
            Dictionary <string, string> context = L.GetContextValues();

            if (context.Count == 0)
            {
                return;
            }

            IServiceRemotingRequestMessageHeader headers = message.GetHeader();

            foreach (KeyValuePair <string, string> cv in context)
            {
                AddHeader(headers, cv);
            }
        }
        public static IServiceRemotingRequestMessage ProcessRequest(IServiceRemotingRequestMessage requestMessage)
        {
            if (requestMessage == null)
            {
                throw new ArgumentNullException(nameof(requestMessage));
            }

            IServiceRemotingRequestMessageHeader requestMessageHeader = requestMessage.GetHeader();

            if (requestMessageHeader == null)
            {
                return(requestMessage);
            }

            // Retrieve the tracking context from the message header, if it exists.
            if (requestMessageHeader.TryGetHeaderValue(TrackingContext.FullName, out byte[] byteArray))
        public IMessageHeader SerializeRequestHeader(IServiceRemotingRequestMessageHeader serviceRemotingRequestMessageHeader)
        {
            if (serviceRemotingRequestMessageHeader == null)
            {
                return(null);
            }


            using (var stream = new SegmentedPoolMemoryStream(this.bufferPoolManager))
            {
                using (var writer = XmlDictionaryWriter.CreateBinaryWriter(stream))
                {
                    this.requestHeaderSerializer.WriteObject(writer, serviceRemotingRequestMessageHeader);
                    writer.Flush();
                    return(new OutgoingMessageHeader(stream.GetBuffers()));
                }
            }
        }
        public IMessageHeader SerializeRequestHeader(IServiceRemotingRequestMessageHeader serviceRemotingRequestMessageHeader)
        {
            if (serviceRemotingRequestMessageHeader == null)
            {
                return(null);
            }


            using (var stream = new MemoryStream())
            {
                using (var writer = XmlDictionaryWriter.CreateBinaryWriter(stream))
                {
                    this.requestHeaderSerializer.WriteObject(writer, serviceRemotingRequestMessageHeader);
                    writer.Flush();
                    var buffer = stream.ToArray();
                    return(new OutgoingMessageHeader(new ArraySegment <byte>(buffer)));
                }
            }
        }
Пример #22
0
        private async Task <IServiceRemotingResponseMessage> HandleSubscriptionRequestsAsync(
            IServiceRemotingRequestContext requestContext,
            IServiceRemotingRequestMessageHeader messageHeaders,
            IServiceRemotingRequestMessageBody requestMsgBody)
        {
            var actorHeaders = (IActorRemotingMessageHeaders)messageHeaders;

            if (actorHeaders.MethodId == Runtime.ActorEventSubscription.SubscribeMethodId)
            {
                var castedRequestMsgBody =
                    (EventSubscriptionRequestBody)requestMsgBody.GetParameter(0, "Value",
                                                                              typeof(EventSubscriptionRequestBody));

                await this.actorService.ActorManager
                .SubscribeAsync(
                    actorHeaders.ActorId,
                    castedRequestMsgBody.eventInterfaceId,
                    new ActorEventSubscriberProxy(
                        castedRequestMsgBody.subscriptionId,
                        requestContext.GetCallBackClient()));

                return(null);
            }

            if (messageHeaders.MethodId == Runtime.ActorEventSubscription.UnSubscribeMethodId)
            {
                var castedRequestMsgBody =
                    (Actors.Remoting.EventSubscriptionRequestBody)requestMsgBody.GetParameter(0, "Value",
                                                                                              typeof(Actors.Remoting.EventSubscriptionRequestBody));

                await this.actorService.ActorManager
                .UnsubscribeAsync(
                    actorHeaders.ActorId,
                    castedRequestMsgBody.eventInterfaceId,
                    castedRequestMsgBody.subscriptionId);

                return(null);
            }

            throw new MissingMethodException(string.Format(CultureInfo.CurrentCulture, SR.ErrorInvalidMethodId,
                                                           messageHeaders.MethodId));
        }
Пример #23
0
        private Dictionary <string, string> ExtractContextProperties(IServiceRemotingRequestMessage message)
        {
            IServiceRemotingRequestMessageHeader headers = message.GetHeader();

            //DANGER!!! this is using reflection to get to internal dictionary of headers collection.
            if (getHeadersField == null)
            {
                getHeadersField = headers.GetType()
                                  .GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
                                  .First(f => f.Name == "headers");
            }
            var headersCollection = getHeadersField.GetValue(headers) as Dictionary <string, byte[]>;

            if (headersCollection == null)
            {
                return(null);
            }

            return(headersCollection.ToDictionary(
                       e => e.Key,
                       e => e.Value == null ? null : Enc.GetString(e.Value)));
        }
        internal static CustomHeaders GetCustomHeaders(this IServiceRemotingRequestMessageHeader header)
        {
            var customHeaders = new CustomHeaders();

            if (header.TryGetHeaderValue(CustomHeaders.CustomHeader, out byte[] headerValue))
 public static int?TryGetHeaderValueInt32(this IServiceRemotingRequestMessageHeader headers, string headerName)
 {
     if (headers.TryGetHeaderValue(headerName, out byte[] bytes) && bytes?.Length == sizeof(int))
Пример #26
0
        public static string GetMethodName(IServiceRemotingRequestMessage message)
        {
            IServiceRemotingRequestMessageHeader header = message.GetHeader();

            return(GetMethodName(header.InterfaceId, header.MethodId));
        }
 internal static bool TryGetHeaderValue(this IServiceRemotingRequestMessageHeader messageHeaders, string headerName, out string headerValue)
 {
     headerValue = null;
     if (!messageHeaders.TryGetHeaderValue(headerName, out byte[] headerValueBytes))
 internal static void AddHeader(this IServiceRemotingRequestMessageHeader messageHeaders, string headerName, string value)
 {
     messageHeaders.AddHeader(headerName, Encoding.UTF8.GetBytes(value));
 }
Пример #29
0
 private static void AddHeader(IServiceRemotingRequestMessageHeader headers, KeyValuePair <string, string> header)
 {
     //don't add a header if it already exists
     //todo: figure out why it already exists
     if (headers.TryGetHeaderValue(header.Key, out byte[] headerValue))
Пример #30
0
 public ServiceRemotingRequestMessage(IServiceRemotingRequestMessageHeader header, IServiceRemotingRequestMessageBody msgBody)
 {
     this.header  = header;
     this.msgBody = msgBody;
 }