Example #1
0
        public void OnPromotedMessageHandler(StoreDriverEventSource source, StoreDriverDeliveryEventArgs args)
        {
            this.wasMessageDelivered = false;
            this.logValues           = null;
            StoreDriverDeliveryEventArgsImpl storeDriverDeliveryEventArgsImpl = (StoreDriverDeliveryEventArgsImpl)args;
            Stopwatch                    stopwatch                    = Stopwatch.StartNew();
            InferencePropertyBag         inferencePropertyBag         = new InferencePropertyBag();
            MdbDocument                  mdbDocument                  = null;
            VariantConfigurationSnapshot variantConfigurationSnapshot = null;

            try
            {
                InferenceClassificationAgent.tracer.TraceDebug(0L, "Called InferenceClassificationAgent.OnPromotedMessageHandler");
                inferencePropertyBag.Add(InferenceSchema.MessageClassificationTime, ExDateTime.UtcNow);
                inferencePropertyBag.Add(InferenceSchema.ServerName, this.server.Name);
                if (storeDriverDeliveryEventArgsImpl.MailboxSession != null)
                {
                    inferencePropertyBag.Add(DocumentSchema.MailboxId, storeDriverDeliveryEventArgsImpl.MailboxSession.MailboxGuid.ToString());
                    inferencePropertyBag.Add(InferenceSchema.ClutterEnabled, storeDriverDeliveryEventArgsImpl.MailboxSession.Mailbox.GetValueOrDefault <bool>(MailboxSchema.InferenceClutterEnabled, false));
                    inferencePropertyBag.Add(InferenceSchema.ClassificationEnabled, storeDriverDeliveryEventArgsImpl.MailboxSession.Mailbox.GetValueOrDefault <bool>(MailboxSchema.InferenceClassificationEnabled, false));
                    inferencePropertyBag.Add(InferenceSchema.HasBeenClutterInvited, storeDriverDeliveryEventArgsImpl.MailboxSession.Mailbox.GetValueOrDefault <bool>(MailboxSchema.InferenceHasBeenClutterInvited, false));
                }
                inferencePropertyBag.Add(InferenceSchema.InternetMessageId, storeDriverDeliveryEventArgsImpl.ReplayItem.InternetMessageId);
                inferencePropertyBag.Add(InferenceSchema.Locale, InferenceClassificationAgent.GetLocale(storeDriverDeliveryEventArgsImpl));
                if (storeDriverDeliveryEventArgsImpl.MailboxOwner != null && storeDriverDeliveryEventArgsImpl.MailboxOwner.OrganizationId != null && storeDriverDeliveryEventArgsImpl.MailboxOwner.OrganizationId.OrganizationalUnit != null)
                {
                    inferencePropertyBag.Add(InferenceSchema.TenantName, storeDriverDeliveryEventArgsImpl.MailboxOwner.OrganizationId.OrganizationalUnit.Name);
                }
                if (!InferenceClassificationAgent.IsMailboxInteresting(storeDriverDeliveryEventArgsImpl))
                {
                    inferencePropertyBag.Add(InferenceSchema.ClassificationStatus, InferenceClassificationAgentLogger.Status.Skipped);
                    inferencePropertyBag.Add(InferenceSchema.ClassificationStatusMessage, "MailboxNotInteresting");
                }
                else if (!InferenceClassificationAgent.IsMessageInteresting(storeDriverDeliveryEventArgsImpl))
                {
                    inferencePropertyBag.Add(InferenceSchema.ClassificationStatus, InferenceClassificationAgentLogger.Status.Skipped);
                    inferencePropertyBag.Add(InferenceSchema.ClassificationStatusMessage, "MessageNotInteresting");
                }
                else
                {
                    storeDriverDeliveryEventArgsImpl.PropertiesForAllMessageCopies = (storeDriverDeliveryEventArgsImpl.PropertiesForAllMessageCopies ?? new Dictionary <PropertyDefinition, object>());
                    Guid guid = Guid.NewGuid();
                    storeDriverDeliveryEventArgsImpl.PropertiesForAllMessageCopies[MessageItemSchema.InferenceMessageIdentifier] = guid;
                    inferencePropertyBag.Add(InferenceSchema.MessageIdentifier, guid);
                    variantConfigurationSnapshot = FlightModule.GetFlightFeatures(storeDriverDeliveryEventArgsImpl.MailboxOwner);
                    if (variantConfigurationSnapshot != null)
                    {
                        inferencePropertyBag.Add(InferenceSchema.UserFlightFeatures, variantConfigurationSnapshot);
                    }
                    IDeliveryClassificationStrategy deliveryClassificationStrategy = ClassificationStrategyFactory.Create(storeDriverDeliveryEventArgsImpl.MailboxSession, variantConfigurationSnapshot);
                    inferencePropertyBag.Add(InferenceSchema.IsUiEnabled, deliveryClassificationStrategy != null);
                    OriginalDeliveryFolderInfo originalDeliveryFolderInfo = InferenceClassificationAgent.GetOriginalDeliveryFolderInfo(storeDriverDeliveryEventArgsImpl);
                    storeDriverDeliveryEventArgsImpl.PropertiesForAllMessageCopies[ItemSchema.OriginalDeliveryFolderInfo] = originalDeliveryFolderInfo.Serialize();
                    inferencePropertyBag.Add(InferenceSchema.OriginalDeliveryFolder, originalDeliveryFolderInfo);
                    if (!InferenceClassificationAgent.IsDeliveryFolderInteresting(originalDeliveryFolderInfo))
                    {
                        inferencePropertyBag.Add(InferenceSchema.ClassificationStatus, InferenceClassificationAgentLogger.Status.Skipped);
                        inferencePropertyBag.Add(InferenceSchema.ClassificationStatusMessage, "DeliveryFolderNotInteresting");
                    }
                    else if (!this.isPipelineEnabled)
                    {
                        inferencePropertyBag.Add(InferenceSchema.ClassificationStatus, InferenceClassificationAgentLogger.Status.Failed);
                        inferencePropertyBag.Add(InferenceSchema.ClassificationStatusMessage, "PipelineDisabled");
                        InferenceClassificationProcessing.NumberOfItemsSkippedDueToDisabledPipeline.Increment();
                    }
                    else
                    {
                        ConversationClutterInformation conversationClutterInformation = null;
                        bool flag = false;
                        InferenceClassificationResult inferenceClassificationResult = InferenceClassificationResult.None;
                        if (this.RunClassificationPipeline(storeDriverDeliveryEventArgsImpl, inferencePropertyBag, variantConfigurationSnapshot, out mdbDocument, out flag, out conversationClutterInformation))
                        {
                            if (flag)
                            {
                                inferenceClassificationResult |= InferenceClassificationResult.IsClutterModel;
                            }
                            string value = string.Empty;
                            bool   flag2 = false;
                            bool   flag3;
                            InferenceClassificationResult inferenceClassificationResult2;
                            string text;
                            bool   flag4;
                            if (InferenceClassificationAgent.CheckForRuleAndConversationOverrides(storeDriverDeliveryEventArgsImpl.SharedPropertiesBetweenAgents, originalDeliveryFolderInfo, out flag3, out inferenceClassificationResult2, out text, out flag4))
                            {
                                flag  = flag3;
                                value = text;
                            }
                            inferenceClassificationResult |= inferenceClassificationResult2;
                            if (flag4 && conversationClutterInformation != null)
                            {
                                flag = conversationClutterInformation.IsNewMessageClutter(flag, out flag2);
                            }
                            inferencePropertyBag.Add(InferenceSchema.IsClutter, flag);
                            if (flag)
                            {
                                inferenceClassificationResult |= InferenceClassificationResult.IsClutterFinal;
                            }
                            if (deliveryClassificationStrategy != null)
                            {
                                deliveryClassificationStrategy.ApplyClassification(storeDriverDeliveryEventArgsImpl, inferenceClassificationResult);
                                if (flag2 && conversationClutterInformation != null)
                                {
                                    conversationClutterInformation.MarkItemsAsNotClutter();
                                }
                            }
                            storeDriverDeliveryEventArgsImpl.PropertiesForAllMessageCopies[ItemSchema.InferenceClassificationResult] = inferenceClassificationResult;
                            inferencePropertyBag.Add(InferenceSchema.InferenceClassificationResult, inferenceClassificationResult);
                            inferencePropertyBag.Add(InferenceSchema.ClassificationStatus, InferenceClassificationAgentLogger.Status.Succeeded);
                            inferencePropertyBag.Add(InferenceSchema.ClassificationStatusMessage, value);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                if (ex is OutOfMemoryException || ex is StackOverflowException || ex is ThreadAbortException)
                {
                    throw;
                }
                Exception innerException = ex.InnerException;
                if (innerException is StorageTransientException)
                {
                    InferenceClassificationProcessing.NumberOfTransientExceptions.Increment();
                }
                else if (innerException is QuotaExceededException)
                {
                    InferenceClassificationProcessing.NumberOfQuotaExceededExceptions.Increment();
                }
                this.diagnosticsSession.LogDiagnosticsInfo(DiagnosticsLoggingTag.Failures, "Received exception {0}", new object[]
                {
                    ex
                });
                inferencePropertyBag.Add(InferenceSchema.ClassificationStatus, InferenceClassificationAgentLogger.Status.Failed);
                inferencePropertyBag.Add(InferenceSchema.ClassificationStatusMessage, "Exception");
                inferencePropertyBag.Add(InferenceSchema.ClassificationAgentException, ex);
            }
            finally
            {
                stopwatch.Stop();
                InferenceClassificationAgent.tracer.TraceDebug <long>((long)this.GetHashCode(), "InferenceClassification agent took {0} ms to process the item.", stopwatch.ElapsedMilliseconds);
                inferencePropertyBag.Add(InferenceSchema.TimeTakenToClassify, stopwatch.ElapsedMilliseconds);
                if (storeDriverDeliveryEventArgsImpl.MailboxSession != null)
                {
                    InferenceClassificationAgent.RecordPerformanceCounter(storeDriverDeliveryEventArgsImpl.MailboxSession.MdbGuid.ToString(), stopwatch.ElapsedMilliseconds);
                }
                InferenceClassificationTracking inferenceClassificationTracking = InferenceClassificationTracking.Create();
                this.logValues = this.classificationAgentLogger.ExtractClassificationProperties(inferencePropertyBag, mdbDocument, inferenceClassificationTracking);
                if (variantConfigurationSnapshot != null && variantConfigurationSnapshot.Inference.InferenceStampTracking.Enabled)
                {
                    storeDriverDeliveryEventArgsImpl.PropertiesForAllMessageCopies[MessageItemSchema.InferenceClassificationTrackingEx] = inferenceClassificationTracking.ToString();
                }
                if (mdbDocument != null)
                {
                    mdbDocument.Dispose();
                    mdbDocument = null;
                }
            }
        }
        internal IList <object> ExtractClassificationProperties(InferencePropertyBag classificationDiagnostics, IDocument document, InferenceClassificationTracking tracking)
        {
            object item   = null;
            object item2  = null;
            object obj    = null;
            object obj2   = null;
            object obj3   = null;
            object obj4   = null;
            object obj5   = null;
            object obj6   = null;
            object obj7   = null;
            object item3  = null;
            object item4  = null;
            object obj8   = null;
            string item5  = string.Empty;
            string item6  = string.Empty;
            string item7  = string.Empty;
            string item8  = string.Empty;
            string value  = null;
            string item9  = null;
            string text   = "Null";
            string item10 = null;
            string value2 = null;
            string item11 = null;
            object obj9   = null;
            object obj10  = null;
            string item12 = null;
            object item13 = null;
            object item14 = null;
            object item15 = null;
            object item16 = null;
            object item17 = null;
            object item18 = null;
            object item19 = null;
            object item20 = null;
            object obj11  = null;
            object item21 = null;

            if (classificationDiagnostics != null)
            {
                classificationDiagnostics.TryGetValue(InferenceSchema.InternetMessageId, out item2);
                classificationDiagnostics.TryGetValue(InferenceSchema.MessageClassificationTime, out obj);
                classificationDiagnostics.TryGetValue(InferenceSchema.OriginalDeliveryFolder, out obj2);
                classificationDiagnostics.TryGetValue(InferenceSchema.MarkedAsBulk, out obj3);
                classificationDiagnostics.TryGetValue(InferenceSchema.TimeTakenToClassify, out obj4);
                classificationDiagnostics.TryGetValue(InferenceSchema.ModelVersion, out obj5);
                classificationDiagnostics.TryGetValue(InferenceSchema.TimeTakenToInfer, out obj6);
                classificationDiagnostics.TryGetValue(InferenceSchema.ServerName, out obj7);
                classificationDiagnostics.TryGetValue(InferenceSchema.ClassificationStatus, out item3);
                classificationDiagnostics.TryGetValue(InferenceSchema.ClassificationStatusMessage, out item4);
                classificationDiagnostics.TryGetValue(InferenceSchema.ClassificationAgentException, out obj8);
                classificationDiagnostics.TryGetValue(DocumentSchema.MailboxId, out item);
                classificationDiagnostics.TryGetValue(InferenceSchema.ClutterValueBeforeOverride, out obj9);
                classificationDiagnostics.TryGetValue(InferenceSchema.ClutterValueAfterOverride, out obj10);
                classificationDiagnostics.TryGetValue(InferenceSchema.Locale, out item13);
                classificationDiagnostics.TryGetValue(InferenceSchema.IsClutter, out item14);
                classificationDiagnostics.TryGetValue(InferenceSchema.TenantName, out item15);
                classificationDiagnostics.TryGetValue(InferenceSchema.IsUiEnabled, out item16);
                classificationDiagnostics.TryGetValue(InferenceSchema.ClutterEnabled, out item18);
                classificationDiagnostics.TryGetValue(InferenceSchema.ClassificationEnabled, out item19);
                classificationDiagnostics.TryGetValue(InferenceSchema.MessageIdentifier, out item20);
                classificationDiagnostics.TryGetValue(InferenceSchema.HasBeenClutterInvited, out item21);
                classificationDiagnostics.TryGetValue(InferenceSchema.InferenceClassificationResult, out obj11);
                if (obj11 is InferenceClassificationResult)
                {
                    obj11 = (int)obj11;
                }
                if (obj8 != null)
                {
                    Exception ex = obj8 as Exception;
                    if (ex != null)
                    {
                        item8 = InferenceCommonUtility.StringizeException(ex);
                        if (ex.TargetSite != null)
                        {
                            item7 = ex.TargetSite.Name;
                        }
                        item5 = ex.GetType().Name;
                        if (ex.InnerException != null)
                        {
                            item6 = ex.InnerException.GetType().Name;
                        }
                    }
                }
                object obj12 = null;
                if (classificationDiagnostics.TryGetValue(InferenceSchema.PredictedActionsThresholds, out obj12))
                {
                    IDictionary <PredictedMessageAction, short> dictionary = obj12 as IDictionary <PredictedMessageAction, short>;
                    if (dictionary != null)
                    {
                        value = string.Join(",", from kvp in dictionary
                                            select string.Format("{0}:{1}", (int)kvp.Key, kvp.Value));
                        item9 = string.Join("#", from kvp in dictionary
                                            select string.Format("{0}:{1}", ActionSets.GetActionName(kvp.Key), kvp.Value));
                    }
                }
                obj12 = null;
                if (classificationDiagnostics.TryGetValue(InferenceSchema.ConversationClutterInformation, out obj12))
                {
                    ConversationClutterInformation conversationClutterInformation = obj12 as ConversationClutterInformation;
                    if (conversationClutterInformation != null)
                    {
                        text = conversationClutterInformation.State.ToString();
                    }
                }
                else
                {
                    text = null;
                }
                obj12 = null;
                IList <PredictedActionAndProbability> list = null;
                if (classificationDiagnostics.TryGetValue(InferenceSchema.PredictedActionsAll, out obj12))
                {
                    list = (obj12 as IList <PredictedActionAndProbability>);
                }
                if (list != null)
                {
                    StringBuilder stringBuilder  = new StringBuilder();
                    StringBuilder stringBuilder2 = new StringBuilder();
                    foreach (PredictedActionAndProbability predictedActionAndProbability in list)
                    {
                        stringBuilder2.Append(string.Format("{0}:{1},", (int)predictedActionAndProbability.Action, predictedActionAndProbability.Probability));
                        stringBuilder.Append(string.Format("{0}:{1}#", ActionSets.GetActionName(predictedActionAndProbability.Action), predictedActionAndProbability.Probability));
                    }
                    item10 = stringBuilder.ToString();
                    value2 = stringBuilder2.ToString();
                }
                obj12 = null;
                if (classificationDiagnostics.TryGetValue(InferenceSchema.UserFlightFeatures, out obj12))
                {
                    VariantConfigurationSnapshot variantConfigurationSnapshot = (VariantConfigurationSnapshot)obj12;
                    StringBuilder stringBuilder3 = new StringBuilder();
                    foreach (IFeature feature in variantConfigurationSnapshot.Inference.GetObjectsOfType <IFeature>().Values)
                    {
                        stringBuilder3.Append(string.Format("{0}:{1}#", feature.Name, feature.Enabled));
                    }
                    item12 = stringBuilder3.ToString();
                }
            }
            int?   num    = null;
            string item22 = null;
            string value3 = null;
            object item23 = null;
            object item24 = null;
            object item25 = null;
            object item26 = null;

            if (document != null)
            {
                object obj13 = null;
                obj13 = null;
                ModelData modelData = null;
                if (document.TryGetProperty(InferenceSchema.ActionModel, out obj13))
                {
                    modelData = (obj13 as ModelData);
                }
                obj13 = null;
                if (document.TryGetProperty(InferenceSchema.ConversationImportanceProperties, out obj13))
                {
                    IConversationProperties conversationProperties = obj13 as IConversationProperties;
                    if (conversationProperties != null)
                    {
                        num = new int?(conversationProperties.NumberOfPreviousMessages);
                    }
                }
                if (modelData != null)
                {
                    obj13 = null;
                    if (document.TryGetProperty(InferenceSchema.MessageFeatureVectorData, out obj13))
                    {
                        IMessageData messageData = obj13 as IMessageData;
                        if (messageData != null)
                        {
                            item22 = InferenceUtil.GetMessageFeatureValuesAsString(messageData.FeatureValues, modelData);
                            value3 = InferenceUtil.GetMessageFeatureValuesAsCompactString(messageData.FeatureValues, modelData);
                        }
                    }
                }
                obj13 = null;
                PredictedActionAndProbability[] array = null;
                if (document.TryGetProperty(InferenceSchema.PredictedActions, out obj13))
                {
                    array = (obj13 as PredictedActionAndProbability[]);
                }
                if (array != null)
                {
                    StringBuilder stringBuilder4 = new StringBuilder();
                    foreach (PredictedActionAndProbability predictedActionAndProbability2 in array)
                    {
                        stringBuilder4.Append(string.Format("{0}:{1}#", ActionSets.GetActionName(predictedActionAndProbability2.Action), predictedActionAndProbability2.Probability));
                    }
                    item11 = stringBuilder4.ToString();
                }
                document.TryGetProperty(InferenceSchema.ConversationId, out item23);
                document.TryGetProperty(InferenceSchema.ModelVersionBreadCrumb, out item26);
                obj13 = null;
                if (document.TryGetProperty(InferenceSchema.ModelVersionToLoad, out obj13))
                {
                    ModelVersionSelector.ModelVersionInfo modelVersionInfo = obj13 as ModelVersionSelector.ModelVersionInfo;
                    if (modelVersionInfo != null)
                    {
                        item24 = modelVersionInfo.Version;
                    }
                }
                document.TryGetProperty(InferenceSchema.ComputedClutterValue, out item25);
            }
            tracking.Trace("SV", InferenceCommonUtility.ServerVersion);
            tracking.Trace("CT", obj);
            tracking.Trace("ODF", obj2);
            tracking.Trace("MAB", obj3);
            tracking.Trace("TTC", obj4);
            tracking.Trace("SN", obj7);
            if (text != null)
            {
                tracking.Trace("CCS", text);
            }
            tracking.Trace("MV", obj5);
            tracking.Trace("CPMC", num ?? 0);
            tracking.Trace("PA", value2);
            tracking.Trace("TI", obj6);
            tracking.Trace("PAT", value);
            tracking.Trace("CVBOR", obj9);
            tracking.Trace("CVAOR", obj10);
            tracking.Trace("FVW", value3);
            return(new List <object>(this.columnCount)
            {
                DateTime.UtcNow,
                item,
                item2,
                item3,
                item4,
                obj7,
                InferenceCommonUtility.ServerVersion,
                item24,
                obj5,
                obj,
                obj4,
                obj2,
                obj3,
                text,
                num,
                item11,
                item10,
                item25,
                item9,
                obj6,
                item22,
                item5,
                item6,
                item7,
                item8,
                obj9,
                obj10,
                item12,
                item23,
                item14,
                item16,
                item15,
                item13,
                item26,
                item17,
                item18,
                item19,
                item20,
                obj11,
                item21
            });
        }