internal static RequestTelemetry CreateRequestTelemetryPrivate(
            this HttpContext platformContext)
        {
            if (platformContext == null)
            {
                throw new ArgumentException("platformContext");
            }

#if NET40
            var result = ActivityHelpers.ParseRequest(platformContext);
#else
            var result          = new RequestTelemetry();
            var currentActivity = Activity.Current;
            var requestContext  = result.Context.Operation;

            if (currentActivity == null)
            {
                // if there was no BeginRequest, ASP.NET HttpModule did not have a chance to set current activity (and will never do it).
                currentActivity = new Activity(ActivityHelpers.RequestActivityItemName);
                if (currentActivity.TryParse(platformContext.Request.Headers))
                {
                    requestContext.ParentId = currentActivity.ParentId;
                }
                else
                {
                    string rootId, parentId;
                    if (ActivityHelpers.TryParseCustomHeaders(platformContext.Request, out rootId, out parentId))
                    {
                        currentActivity.SetParentId(rootId);
                        if (!string.IsNullOrEmpty(parentId))
                        {
                            requestContext.ParentId = parentId;
                        }
                    }
                    else
                    {
                        // This is workaround for the issue https://github.com/Microsoft/ApplicationInsights-dotnet/issues/538
                        // if there is no parent Activity, ID Activity generates is not random enough to work well with
                        // ApplicationInsights sampling algorithm
                        // This code should go away when Activity is fixed: https://github.com/dotnet/corefx/issues/18418
                        currentActivity.SetParentId(result.Id);

                        // end of workaround
                    }
                }

                currentActivity.Start();
            }
            else
            {
                if (ActivityHelpers.IsHierarchicalRequestId(currentActivity.ParentId))
                {
                    requestContext.ParentId = currentActivity.ParentId;
                }
                else
                {
                    var parentId =
                        platformContext.Request.UnvalidatedGetHeader(ActivityHelpers.ParentOperationIdHeaderName);
                    if (!string.IsNullOrEmpty(parentId))
                    {
                        requestContext.ParentId = parentId;
                    }
                }
            }

            // we have Activity.Current, we need to properly initialize request telemetry and store it in HttpContext
            if (string.IsNullOrEmpty(requestContext.Id))
            {
                requestContext.Id = currentActivity.RootId;
                foreach (var item in currentActivity.Baggage)
                {
                    result.Context.Properties[item.Key] = item.Value;
                }
            }

            result.Id = currentActivity.Id;

            // save current activity in case it will be lost - we will use it in Web.OperationCorrelationTelemetryIntitalizer
            platformContext.Items[ActivityHelpers.RequestActivityItemName] = currentActivity;
#endif
            platformContext.Items.Add(RequestTrackingConstants.RequestTelemetryItemName, result);
            WebEventSource.Log.WebTelemetryModuleRequestTelemetryCreated();

            return(result);
        }