diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsCollector.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsCollector.java index 9567b70470..7b07a15aec 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsCollector.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsCollector.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2017 Basis Technology Corp. + * Copyright 2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -29,14 +29,15 @@ import org.sleuthkit.autopsy.coreutils.Logger; * Collects metrics for an auto ingest cluster. */ final class AutoIngestMetricsCollector { - + private static final Logger LOGGER = Logger.getLogger(AutoIngestMetricsCollector.class.getName()); + private static final int MINIMUM_SUPPORTED_JOB_NODE_VERSION = 1; private CoordinationService coordinationService; - + /** * Creates an instance of the AutoIngestMetricsCollector. - * - * @throws AutoIngestMetricsCollector.AutoIngestMetricsCollectorException + * + * @throws AutoIngestMetricsCollector.AutoIngestMetricsCollectorException */ AutoIngestMetricsCollector() throws AutoIngestMetricsCollectorException { try { @@ -45,7 +46,7 @@ final class AutoIngestMetricsCollector { throw new AutoIngestMetricsCollectorException("Failed to get coordination service", ex); //NON-NLS } } - + /** * Gets a new metrics snapshot from the coordination service for an auto * ingest cluster. @@ -59,7 +60,7 @@ final class AutoIngestMetricsCollector { for (String node : nodeList) { try { AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, node)); - if (nodeData.getVersion() < 1) { + if (nodeData.getVersion() < MINIMUM_SUPPORTED_JOB_NODE_VERSION) { /* * Ignore version '0' nodes that have not been * "upgraded" since they don't carry enough data. @@ -78,7 +79,7 @@ final class AutoIngestMetricsCollector { */ break; case COMPLETED: - newMetricsSnapshot.addCompletedJobDate(job.getCompletedDate()); + newMetricsSnapshot.addCompletedJobMetric(job.getCompletedDate(), job.getDataSourceSize()); break; default: LOGGER.log(Level.SEVERE, "Unknown AutoIngestJobData.ProcessingStatus"); @@ -92,41 +93,80 @@ final class AutoIngestMetricsCollector { LOGGER.log(Level.SEVERE, String.format("Failed to create a job for '%s'", node), ex); } } - + return newMetricsSnapshot; - + } catch (CoordinationService.CoordinationServiceException ex) { LOGGER.log(Level.SEVERE, "Failed to get node list from coordination service", ex); return new MetricsSnapshot(); } } - + /** * A snapshot of metrics for an auto ingest cluster. */ static final class MetricsSnapshot { - - private final List completedJobDates = new ArrayList<>(); - + + private final List completedJobMetrics = new ArrayList<>(); + /** - * Gets a list of completed job dates, formatted in milliseconds. - * - * @return The completed job dates, formatted in milliseconds. + * Gets a list of completed job metrics. + * + * @return The completed job metrics. */ - List getCompletedJobDates() { - return new ArrayList<>(completedJobDates); + List getCompletedJobMetrics() { + return new ArrayList<>(completedJobMetrics); } - + /** - * Adds a new date to the list of completed job dates. - * - * @param date The date to be added. + * Adds a new metric to the list of completed job metrics. + * + * @param completedDate The completed job date. + * @param dataSourceSize The data source size. */ - void addCompletedJobDate(java.util.Date date) { - completedJobDates.add(date.getTime()); + void addCompletedJobMetric(java.util.Date completedDate, long dataSourceSize) { + completedJobMetrics.add(new JobMetric(completedDate, dataSourceSize)); } } - + + /** + * A single job metric for an auto ingest cluster. + */ + static final class JobMetric { + + private final long completedDate; + private final long dataSourceSize; + + /** + * Instantiates a job metric. + * + * @param completedDate The job completion date. + * @param dataSourceSize The data source size. + */ + JobMetric(java.util.Date completedDate, long dataSourceSize) { + this.completedDate = completedDate.getTime(); + this.dataSourceSize = dataSourceSize; + } + + /** + * Gets the job completion date, formatted in milliseconds. + * + * @return The job completion date. + */ + long getCompletedDate() { + return completedDate; + } + + /** + * Gets the data source size. + * + * @return The data source size. + */ + long getDataSourceSize() { + return dataSourceSize; + } + } + /** * Exception type thrown when there is an error completing an auto ingest * metrics collector operation. @@ -157,4 +197,4 @@ final class AutoIngestMetricsCollector { } } -} \ No newline at end of file +} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsDialog.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsDialog.form index 49e700ca21..cbe7b53c2f 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsDialog.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsDialog.form @@ -30,10 +30,14 @@ - - + + - + + + + + @@ -43,17 +47,17 @@ - + + + + + + + - - - - - - - + @@ -109,5 +113,12 @@ + + + + + + + diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsDialog.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsDialog.java index 80bcb6958b..af0679be5f 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsDialog.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMetricsDialog.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2017 Basis Technology Corp. + * Copyright 2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,24 +25,28 @@ import java.awt.Window; import java.sql.Date; import java.text.SimpleDateFormat; import java.time.ZoneOffset; +import java.util.List; import org.openide.util.NbBundle; import org.openide.util.NbBundle.Messages; +import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestMetricsCollector.JobMetric; /** * Displays auto ingest metrics for a cluster. */ final class AutoIngestMetricsDialog extends javax.swing.JDialog { - + + private static final int GIGABYTE_SIZE = 1073741824; + private final AutoIngestMetricsCollector autoIngestMetricsCollector; /** * Creates an instance of AutoIngestMetricsDialog - * + * * @param parent The parent container. */ @Messages({ "AutoIngestMetricsDialog.title.text=Auto Ingest Cluster Metrics", - "AutoIngestMetricsDialog.initReportText=Select a date below and click the 'Get Metrics Since...' button to generate\na metrics report." + "AutoIngestMetricsDialog.initReportText=Select a date above and click the 'Generate Metrics Report' button to generate\na metrics report." }) AutoIngestMetricsDialog(Container parent) throws AutoIngestMetricsDialogException { super((Window) parent, NbBundle.getMessage(AutoIngestMetricsDialog.class, "AutoIngestMetricsDialog.title.text"), ModalityType.MODELESS); @@ -58,34 +62,39 @@ final class AutoIngestMetricsDialog extends javax.swing.JDialog { setLocationRelativeTo(parent); setVisible(true); } - + /** * Update the metrics shown in the report text area. */ private void updateMetrics() { - if(datePicker.getDate() == null) { + if (datePicker.getDate() == null) { return; } - + AutoIngestMetricsCollector.MetricsSnapshot metricsSnapshot = autoIngestMetricsCollector.queryCoordinationServiceForMetrics(); - Object[] completedJobDates = metricsSnapshot.getCompletedJobDates().toArray(); - int count = 0; + List completedJobMetrics = metricsSnapshot.getCompletedJobMetrics(); + int jobsCompleted = 0; + long dataSourceSizeTotal = 0; long pickedDate = datePicker.getDate().atStartOfDay().toEpochSecond(ZoneOffset.UTC) * 1000; - for(int i = completedJobDates.length - 1; i >= 0; i--) { - if((Long)completedJobDates[i] >= pickedDate) { - count++; + + for (JobMetric jobMetric : completedJobMetrics) { + if (jobMetric.getCompletedDate() >= pickedDate) { + jobsCompleted++; + dataSourceSizeTotal += jobMetric.getDataSourceSize(); } } - + SimpleDateFormat dateFormatter = new SimpleDateFormat("MMM d, yyyy"); reportTextArea.setText(String.format( - "Since %s:\n" + - "\tNumber of Jobs Completed: %d\n", + "Since %s:\n" + + "Number of Jobs Completed: %d\n" + + "Total Size of Data Sources: %.1f GB\n", dateFormatter.format(Date.valueOf(datePicker.getDate())), - count + jobsCompleted, + (double) dataSourceSizeTotal / GIGABYTE_SIZE )); } - + /** * Exception type thrown when there is an error completing an auto ingest * metrics dialog operation. @@ -131,6 +140,7 @@ final class AutoIngestMetricsDialog extends javax.swing.JDialog { reportTextArea = new javax.swing.JTextArea(); metricsButton = new javax.swing.JButton(); datePicker = new DatePicker(); + startingDataLabel = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setAlwaysOnTop(true); @@ -158,6 +168,8 @@ final class AutoIngestMetricsDialog extends javax.swing.JDialog { datePicker.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestMetricsDialog.class, "AutoIngestMetricsDialog.datePicker.toolTipText")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(startingDataLabel, org.openide.util.NbBundle.getMessage(AutoIngestMetricsDialog.class, "AutoIngestMetricsDialog.startingDataLabel.text")); // NOI18N + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( @@ -167,24 +179,28 @@ final class AutoIngestMetricsDialog extends javax.swing.JDialog { .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane1) .addGroup(layout.createSequentialGroup() - .addComponent(metricsButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(startingDataLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(datePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 33, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 7, Short.MAX_VALUE) + .addComponent(metricsButton)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) .addComponent(closeButton, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGroup(layout.createSequentialGroup() .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(metricsButton) + .addComponent(datePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(startingDataLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 128, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(closeButton) - .addComponent(metricsButton)) - .addComponent(datePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(closeButton) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); @@ -208,5 +224,6 @@ final class AutoIngestMetricsDialog extends javax.swing.JDialog { private javax.swing.JScrollPane jScrollPane1; private javax.swing.JButton metricsButton; private javax.swing.JTextArea reportTextArea; + private javax.swing.JLabel startingDataLabel; // End of variables declaration//GEN-END:variables -} \ No newline at end of file +} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties index 5f335b1ba4..d953b0ceb3 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties @@ -228,10 +228,11 @@ AutoIngestDashboard.prioritizeCaseButton.toolTipText=Move all images associated AutoIngestDashboard.prioritizeCaseButton.text=Prioritize &Case AutoIngestMetricsDialog.reportTextArea.text= AutoIngestDashboard.clusterMetricsButton.text=Cluster Metrics -AutoIngestMetricsDialog.metricsButton.text=Get Metrics Since... +AutoIngestMetricsDialog.metricsButton.text=Generate Metrics Report AutoIngestMetricsDialog.closeButton.text=Close AutoIngestMetricsDialog.datePicker.toolTipText=Choose a date ArchiveFilePanel.pathLabel.text=Browse for an archive file: ArchiveFilePanel.browseButton.text=Browse ArchiveFilePanel.pathTextField.text= -ArchiveFilePanel.errorLabel.text=Error Label \ No newline at end of file +ArchiveFilePanel.errorLabel.text=Error Label +AutoIngestMetricsDialog.startingDataLabel.text=Starting Date: