Exemple #1
0
        public static ElasticSDResult FromResult(SDResult result, BundleMetainfo bundleInfo, DumpMetainfo dumpInfo)
        {
            ElasticSDResult eResult = new ElasticSDResult()
            {
                BundleId                        = dumpInfo.BundleId,
                DumpId                          = dumpInfo.DumpId,
                Timestamp                       = dumpInfo.Created,
                Type                            = dumpInfo.DumpType.ToString(),
                Executable                      = (result.SystemContext as SDCDSystemContext)?.FileName ?? "",
                IsManaged                       = result.IsManagedProcess,
                ProcessArchitecture             = result.SystemContext.ProcessArchitecture,
                SystemArchitecture              = result.SystemContext.SystemArchitecture,
                NrThreads                       = result.ThreadInformation.Count,
                LastEventDescription            = result.LastEvent?.Description,
                LoadedModules                   = result.SystemContext.DistinctModules().Select(m => m.FileName).Aggregate("", (m1, m2) => m1 + " " + m2),
                LoadedModulesVersioned          = result.SystemContext.DistinctModules().Select(m => $"{m.FileName}:{m.Version ?? "-"}").Aggregate("", (m1, m2) => m1 + " " + m2),
                DynatraceLoadedModulesVersioned = result.SystemContext.DistinctModules().Where(m => m.Tags.Contains(SDTag.DynatraceAgentTag)).Select(m => $"{m.FileName}:{m.Version ?? "-"}").Aggregate("", (m1, m2) => m1 + " " + m2),
                ExitType                        = result.LastEvent?.Type ?? ""
            };

            bundleInfo.CustomProperties.TryGetValue("ref", out string reference);
            eResult.Reference = reference;

            if (dumpInfo.Finished != null && dumpInfo.Started != null)
            {
                int durationSecs = (int)dumpInfo.Finished.Subtract(dumpInfo.Started).TotalSeconds;
                if (durationSecs > 0)
                {
                    // Only if a valid duration is present
                    eResult.AnalyzationDuration = durationSecs;
                }
            }
            return(eResult);
        }
Exemple #2
0
        private async Task SearchBundleAsync(BundleMetainfo bundle, bool force)
        {
            IList <JiraIssueModel> jiraIssues;

            if (!force && bundle.CustomProperties.TryGetValue(settings.CustomPropertyJiraIssueKey, out string jiraIssue))
            {
                jiraIssues = new List <JiraIssueModel>()
                {
                    new JiraIssueModel {
                        Key = jiraIssue
                    }
                };
            }
            else
            {
                jiraIssues = (await apiService.GetJiraIssues(bundle.BundleId)).ToList();
            }
            if (jiraIssues.Any())
            {
                bundleIssues[bundle.BundleId] = jiraIssues;
                await jiraIssueStorage.Store(bundle.BundleId, jiraIssues);
            }
            else
            {
                bundleIssues.Remove(bundle.BundleId, out var val);
                await jiraIssueStorage.Store(bundle.BundleId, Enumerable.Empty <JiraIssueModel>());
            }
        }
Exemple #3
0
 public BundleMetainfo Create(string filename, DumpAnalysisInput input)
 {
     lock (sync) {
         string bundleId   = CreateUniqueBundleId();
         var    bundleInfo = new BundleMetainfo()
         {
             BundleId       = bundleId,
             BundleFileName = filename,
             Created        = DateTime.Now,
             Status         = BundleStatus.Created
         };
         bundleInfo.CustomProperties = input.CustomProperties;
         if (!string.IsNullOrEmpty(input.JiraIssue))
         {
             bundleInfo.CustomProperties["ref"] = input.JiraIssue;
         }
         if (!string.IsNullOrEmpty(input.FriendlyName))
         {
             bundleInfo.CustomProperties["note"] = input.FriendlyName;
         }
         bundles[bundleId] = bundleInfo;
         storage.Store(bundleInfo);
         return(bundleInfo);
     }
 }
Exemple #4
0
        private static long ComputeDumpFileSizeKb(BundleMetainfo bundleInfo, DumpMetainfo dumpInfo, PathHelper pathHelper)
        {
            long   dumpSize      = -1;
            string dumpDirectory = pathHelper.GetDumpDirectory(bundleInfo.BundleId, dumpInfo.DumpId);

            if (!Directory.Exists(dumpDirectory))
            {
                return(-1);
            }
            foreach (var file in Directory.EnumerateFiles(dumpDirectory))
            {
                if (file.EndsWith(".core.gz") || file.EndsWith(".dmp"))
                {
                    FileInfo fi = new FileInfo(file);
                    dumpSize = fi.Length;
                    break;
                }
            }
            if (dumpSize == -1)
            {
                // No dump found
                return(-1);
            }
            return(dumpSize / 1024);
        }
Exemple #5
0
 public static ElasticSDResult FromResultOrDefault(SDResult result, BundleMetainfo bundleInfo, DumpMetainfo dumpInfo, PathHelper pathHelper)
 {
     try {
         return(FromResult(result, bundleInfo, dumpInfo, pathHelper));
     } catch (Exception e) {
         Console.Error.WriteLine($"ElasticSDResult.FromResult failed for {dumpInfo.Id}: {e.ToString()}");
     }
     return(null);
 }
Exemple #6
0
 public BundleViewModel(BundleMetainfo bundleInfo, IEnumerable <DumpMetainfo> dumpInfos)
 {
     this.BundleId         = bundleInfo.BundleId;
     this.Created          = bundleInfo.Created;
     this.Status           = bundleInfo.Status;
     this.CustomProperties = bundleInfo.CustomProperties;
     this.DumpInfos        = dumpInfos ?? new List <DumpMetainfo>();
     this.ErrorMessage     = bundleInfo.ErrorMessage;
 }
        public IActionResult TriggerSimilarityAnalysis(string bundleId, string dumpId)
        {
            BundleMetainfo bundleInfo = bundleRepository.Get(bundleId);

            if (bundleInfo == null)
            {
                logger.LogNotFound("TriggerSimilarityAnalysis: Bundle not found", HttpContext, "BundleId", bundleId);
                return(View(null));
            }
            logger.LogDumpAccess("TriggerSimilarityAnalysis", HttpContext, bundleInfo, dumpId);             //TODO check if bundle exists
            similarityService.ScheduleSimilarityAnalysis(new DumpIdentifier(bundleId, dumpId), true, DateTime.MinValue);
            return(RedirectToAction("Report", "Home", new { bundleId = bundleId, dumpId = dumpId }));       // View("/Home/Report", new ReportViewModel(bundleId, dumpId));
        }
        public async Task <bool> PushResultAsync(SDResult result, BundleMetainfo bundleInfo, DumpMetainfo dumpInfo)
        {
            if (elasticClient != null)
            {
                var response = await elasticClient.CreateAsync(ElasticSDResult.FromResult(result, bundleInfo, dumpInfo, pathHelper));

                if (!response.Created)
                {
                    return(false);
                }
            }
            return(true);
        }
Exemple #9
0
        public static ElasticSDResult FromResult(SDResult result, BundleMetainfo bundleInfo, DumpMetainfo dumpInfo, PathHelper pathHelper)
        {
            if (result == null)
            {
                throw new ArgumentNullException("result");
            }
            var eResult = new ElasticSDResult()
            {
                BundleId                        = dumpInfo.BundleId,
                DumpId                          = dumpInfo.DumpId,
                Timestamp                       = dumpInfo.Created,
                Type                            = dumpInfo.DumpType.ToString(),
                Executable                      = (result.SystemContext as SDCDSystemContext)?.FileName ?? "",
                IsManaged                       = result.IsManagedProcess,
                ProcessArchitecture             = result.SystemContext?.ProcessArchitecture,
                SystemArchitecture              = result.SystemContext?.SystemArchitecture,
                NrThreads                       = result.ThreadInformation != null ? result.ThreadInformation.Count : 0,
                LastEventDescription            = result.LastEvent?.Description,
                LoadedModules                   = result.SystemContext?.DistinctModules().Select(m => m.FileName).Aggregate("", (m1, m2) => m1 + " " + m2),
                LoadedModulesVersioned          = result.SystemContext?.DistinctModules().Select(m => $"{m.FileName}:{m.Version ?? "-"}").Aggregate("", (m1, m2) => m1 + " " + m2),
                DynatraceLoadedModulesVersioned = result.SystemContext?.DistinctModules().Where(m => m.Tags.Contains(SDTag.DynatraceAgentTag)).Select(m => $"{m.FileName}:{m.Version ?? "-"}").Aggregate("", (m1, m2) => m1 + " " + m2),
                ExitType                        = result.LastEvent?.Type ?? ""
            };

            bundleInfo.CustomProperties.TryGetValue("ref", out string reference);
            eResult.Reference = reference;

            bundleInfo.CustomProperties.TryGetValue("tenantId", out string tenantId);
            eResult.TenantId = tenantId;

            eResult.FaultingStacktrace = result.GetErrorOrLastExecutingThread()?.ToText();
            eResult.Stacktraces        = "";      // TODO

            if (dumpInfo.Finished != null && dumpInfo.Started != null)
            {
                int durationSecs = (int)dumpInfo.Finished.Subtract(dumpInfo.Started).TotalSeconds;
                if (durationSecs > 0)
                {
                    // Only if a valid duration is present
                    eResult.AnalyzationDuration = durationSecs;
                }
            }

            long dumpSize = ComputeDumpFileSizeKb(bundleInfo, dumpInfo, pathHelper);

            if (dumpSize >= 0)
            {
                eResult.DumpSizeKb = dumpSize;
            }
            return(eResult);
        }
Exemple #10
0
        public async Task <bool> PushResultAsync(SDResult result, BundleMetainfo bundleInfo, DumpMetainfo dumpInfo)
        {
            if (elasticClient != null)
            {
                new Nest.CreateRequest <ElasticSDResult>(RESULT_IDX);
                var response = await elasticClient.CreateAsync(new CreateDescriptor <ElasticSDResult>(ElasticSDResult.FromResult(result, bundleInfo, dumpInfo, pathHelper)));

                if (response.Result != Result.Created)
                {
                    return(false);
                }
            }
            return(true);
        }
        public override async void AnalyzeDump(DumpMetainfo dumpInfo)
        {
            BundleMetainfo bundle = bundleRepo.Get(dumpInfo.BundleId);

            try {
                SDResult result = await dumpRepo.GetResultAndThrow(dumpInfo.Id);

                if (result != null)
                {
                    await elasticSearch.PushResultAsync(result, bundle, dumpInfo);
                }
            } catch (Exception ex) {
                Console.WriteLine(ex.Message);
            }
        }
Exemple #12
0
 public BundleMetainfo Create(string filename, IDictionary <string, string> properties)
 {
     lock (sync) {
         string bundleId   = CreateUniqueBundleId();
         var    bundleInfo = new BundleMetainfo()
         {
             BundleId       = bundleId,
             BundleFileName = filename,
             Created        = DateTime.Now,
             Status         = BundleStatus.Created
         };
         bundleInfo.CustomProperties = properties;
         bundles[bundleId]           = bundleInfo;
         storage.Store(bundleInfo);
         return(bundleInfo);
     }
 }
        public async Task <bool> PushResultAsync(SDResult result, BundleMetainfo bundleInfo, DumpMetainfo dumpInfo)
        {
            try {
                if (elasticClient != null && result != null)
                {
                    new Nest.CreateRequest <ElasticSDResult>(RESULT_IDX);
                    var response = await elasticClient.CreateAsync(new CreateDescriptor <ElasticSDResult>(ElasticSDResult.FromResult(result, bundleInfo, dumpInfo, pathHelper)));

                    if (response.Result != Result.Created)
                    {
                        return(false);
                    }
                }
                return(true);
            } catch (Exception e) {
                Console.WriteLine($"PushResultAsync failed for {dumpInfo.Id} with exception: {e}");
                return(false);
            }
        }
Exemple #14
0
        /// <summary>
        /// Older storage did not have metainfo files. We need to read full results, create new metainfo file and store it.
        /// </summary>
        /// <param name="bundleId"></param>
        private async Task CreateBundleMetainfoForCompat(string bundleId)
        {
            var metainfo = new BundleMetainfo()
            {
                BundleId = bundleId
            };
            // use storage directly, not repo. repo might not be initialized yet
            // back then, every dump had the same information encoded. take the first dump and use it from there.

            var dumps = await dumpStorage.ReadDumpMetainfoForBundle(bundleId);

            // loop through all dumps and hope to find a good one.
            foreach (var dump in dumps)
            {
                if (dump != null)
                {
                    metainfo.Created  = dump.Created;
                    metainfo.Finished = dump.Created;                     // can't do better.
                    metainfo.Status   = BundleStatus.Finished;
                    var fullresult = await dumpStorage.ReadResults(bundleId, dump.DumpId);

                    if (fullresult != null)
                    {
                        if (!string.IsNullOrEmpty(fullresult.AnalysisInfo.JiraIssue))
                        {
                            metainfo.CustomProperties["ref"] = fullresult.AnalysisInfo.JiraIssue;
                        }
                        if (!string.IsNullOrEmpty(fullresult.AnalysisInfo.FriendlyName))
                        {
                            metainfo.CustomProperties["note"] = fullresult.AnalysisInfo.FriendlyName;
                        }
                        break;
                    }
                }
            }
            WriteMetainfoFile(metainfo, pathHelper.GetBundleMetadataPath(bundleId));
        }
Exemple #15
0
 private static void WriteMetainfoFile(BundleMetainfo metaInfo, string filename)
 {
     File.WriteAllText(filename, JsonConvert.SerializeObject(metaInfo, Formatting.Indented));
 }
Exemple #16
0
 internal void Store(BundleMetainfo bundleInfo)
 {
     Directory.CreateDirectory(pathHelper.GetBundleDirectory(bundleInfo.BundleId));
     WriteMetainfoFile(bundleInfo, pathHelper.GetBundleMetadataPath(bundleInfo.BundleId));
 }
Exemple #17
0
 public static void LogFileAccess(this ILogger logger, string text, HttpContext context, BundleMetainfo bundleInfo, string dumpId, string filename)
 {
     logger.LogInformation(FileLogText, text, context.Connection.RemoteIpAddress.ToString(), context.User.Identity.Name,
                           bundleInfo.BundleId, GetCustomPropertyString(bundleInfo.CustomProperties), dumpId, filename);
 }
Exemple #18
0
 public void Store(BundleMetainfo bundleInfo)
 {
     throw new NotImplementedException();
 }