Esempio n. 1
0
        public void ExecuteExplainPlan(SqlObfuscator obfuscator)
        {
            // Don't re-run an explain plan if one already exists
            if (_explainPlan != null)
            {
                return;
            }

            try
            {
                // Using invoke for thread safety, DoExplainPlanCondition is nullable
                if (DoExplainPlanCondition?.Invoke() == true)
                {
                    var explainPlan = GenerateExplainPlan?.Invoke(_explainPlanResources);
                    if (explainPlan != null)
                    {
                        foreach (var data in explainPlan.ExplainPlanDatas)
                        {
                            foreach (var index in explainPlan.ObfuscatedHeaders)
                            {
                                data[index] = obfuscator.GetObfuscatedSql(data[index].ToString(), DatastoreVendorName);
                            }
                        }

                        _explainPlan = new ExplainPlan(explainPlan.ExplainPlanHeaders, explainPlan.ExplainPlanDatas, explainPlan.ObfuscatedHeaders);
                    }
                }
            }
            catch (Exception exception)
            {
                Log.DebugFormat("Unable to execute explain plan: {0}", exception);
            }
        }
 private void TryGenerateExplainPlans(IEnumerable <Segment> segments)
 {
     if (!_configurationService.Configuration.SqlExplainPlansEnabled)
     {
         return;
     }
     try
     {
         using (new IgnoreWork())
         {
             short count = 0;
             var   sqlExplainPlansMax = _configurationService.Configuration.SqlExplainPlansMax;
             var   threshold          = _configurationService.Configuration.SqlExplainPlanThreshold;
             var   obfuscator         = SqlObfuscator.GetSqlObfuscator(_configurationService.Configuration.TransactionTracerEnabled, _configurationService.Configuration.TransactionTracerRecordSql);
             foreach (var segment in segments.Where(s => s.Data is DatastoreSegmentData))
             {
                 if (segment.Duration > threshold)
                 {
                     var datastoreSegmentData = (DatastoreSegmentData)segment.Data;
                     if (datastoreSegmentData.DoExplainPlanCondition?.Invoke() == true)
                     {
                         datastoreSegmentData.ExecuteExplainPlan(obfuscator);
                         if (++count >= sqlExplainPlansMax)
                         {
                             return;
                         }
                     }
                 }
             }
         }
     }
     catch (Exception exception)
     {
         Log.DebugFormat("Exception occurred while generating explain plan: {0}", exception);
     }
 }