diff --git a/AppDynamics.Dexter.Core.csproj b/AppDynamics.Dexter.Core.csproj
index 13ae644..7a8ac5c 100644
--- a/AppDynamics.Dexter.Core.csproj
+++ b/AppDynamics.Dexter.Core.csproj
@@ -42,12 +42,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/AppDynamics.Dexter.csproj b/AppDynamics.Dexter.csproj
index 85b8328..5f077ee 100644
--- a/AppDynamics.Dexter.csproj
+++ b/AppDynamics.Dexter.csproj
@@ -66,20 +66,21 @@
packages\CommandLineParser.1.9.71\lib\net45\CommandLine.dll
-
- packages\CsvHelper.6.0.0\lib\net45\CsvHelper.dll
+
+ packages\CsvHelper.7.1.1\lib\net45\CsvHelper.dll
-
- packages\EPPlus.4.5.0.1-beta\lib\net40\EPPlus.dll
+
+ packages\EPPlus.4.5.2.1\lib\net40\EPPlus.dll
-
- packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll
+
+ packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll
- packages\NLog.4.5.0-beta07\lib\net45\NLog.dll
+ packages\NLog.4.5.6\lib\net45\NLog.dll
+
@@ -278,7 +279,7 @@
- Always
+ PreserveNewest
Designer
diff --git a/EPPlus/EPPlus-master.zip b/EPPlus/EPPlus-master.zip
index de1b10a..c494887 100644
Binary files a/EPPlus/EPPlus-master.zip and b/EPPlus/EPPlus-master.zip differ
diff --git a/Helpers/FileIOHelper.cs b/Helpers/FileIOHelper.cs
index 7206a8f..39ce577 100644
--- a/Helpers/FileIOHelper.cs
+++ b/Helpers/FileIOHelper.cs
@@ -370,6 +370,8 @@ public static bool WriteListToCSVFile(List listToWrite, ClassMap classM
public static bool WriteListToCSVFile(List listToWrite, ClassMap classMap, string csvFilePath, bool appendToExistingFile)
{
+ if (listToWrite == null) return true;
+
string folderPath = Path.GetDirectoryName(csvFilePath);
if (CreateFolder(folderPath) == true)
@@ -419,6 +421,8 @@ public static MemoryStream WriteListToMemoryStream(List listToWrite, Class
{
try
{
+ if (listToWrite == null) return null;
+
logger.Trace("Writing list with {0} elements containing type {1} to memory stream", listToWrite.Count, typeof(T));
MemoryStream ms = new MemoryStream(1024 * listToWrite.Count);
diff --git a/NLog.xsd b/NLog.xsd
index 676e629..1bd61d8 100644
--- a/NLog.xsd
+++ b/NLog.xsd
@@ -331,16 +331,11 @@
-
+
-
-
- Name of the target.
-
-
Delay the flush until the LogEvent has been confirmed as written
@@ -351,6 +346,11 @@
Condition expression. Log events who meet this condition will cause a flush on the wrapped target.
+
+
+ Name of the target.
+
+
Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit
@@ -366,8 +366,8 @@
-
+
@@ -385,14 +385,14 @@
Timeout (in milliseconds) after which the contents of buffer will be flushed if there's no write in the specified period of time. Use -1 to disable timed flushes.
-
+
- Indicates whether to use sliding timeout.
+ Action to take if the buffer overflows.
-
+
- Action to take if the buffer overflows.
+ Indicates whether to use sliding timeout.
@@ -420,23 +420,25 @@
-
+
-
+
+
+
-
+
-
+
@@ -474,9 +476,9 @@
Action that should be taken if the will be more connections than .
-
+
- Action that should be taken if the message is larger than maxMessageSize.
+ Maximum queue size.
@@ -499,9 +501,14 @@
Network address.
-
+
- Maximum queue size.
+ Action that should be taken if the message is larger than maxMessageSize.
+
+
+
+
+ NDLC item separator.
@@ -509,14 +516,14 @@
NDC item separator.
-
+
- Indicates whether to include source info (file name and line number) in the information sent over the network.
+ Indicates whether to include NLog-specific extensions to log4j schema.
-
+
- Indicates whether to include dictionary contents.
+ Indicates whether to include source info (file name and line number) in the information sent over the network.
@@ -529,6 +536,11 @@
Indicates whether to include stack contents.
+
+
+ Indicates whether to include dictionary contents.
+
+
Indicates whether to include dictionary contents.
@@ -549,9 +561,9 @@
AppInfo field. By default it's the friendly name of the current AppDomain.
-
+
- Indicates whether to include NLog-specific extensions to log4j schema.
+ Renderer for log4j:event logger-xml-attribute (Default ${logger})
@@ -600,12 +612,12 @@
-
-
-
+
+
+
@@ -628,11 +640,6 @@
Footer.
-
-
- Indicates whether to use default row highlighting rules.
-
-
Indicates whether to auto-check if the console is available. - Disables console writing if Environment.UserInteractive = False (Windows Service) - Disables console writing if Console Standard Input is not available (Non-Console-App)
@@ -648,6 +655,11 @@
Indicates whether the error stream (stderr) should be used instead of the output stream (stdout).
+
+
+ Indicates whether to use default row highlighting rules.
+
+
Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit
@@ -701,14 +713,19 @@
+
-
+
+
+ Compile the ? This can improve the performance, but at the costs of more memory usage. If false, the Regex Cache is used.
+
+
Indicates whether to ignore case when comparing texts.
@@ -729,11 +746,6 @@
Indicates whether to match whole words only.
-
-
- Compile the ? This can improve the performance, but at the costs of more memory usage. If false, the Regex Cache is used.
-
-
Background color.
@@ -753,9 +765,9 @@
-
+
@@ -778,11 +790,6 @@
Footer.
-
-
- Indicates whether to send the log messages to the standard error instead of the standard output.
-
-
Indicates whether to auto-check if the console is available - Disables console writing if Environment.UserInteractive = False (Windows Service) - Disables console writing if Console Standard Input is not available (Non-Console-App)
@@ -793,6 +800,11 @@
The encoding for writing messages to the .
+
+
+ Indicates whether to send the log messages to the standard error instead of the standard output.
+
+
Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit
@@ -1037,14 +1049,14 @@
+
-
-
-
+
+
@@ -1062,6 +1074,11 @@
Layout that renders event Category.
+
+
+ Optional entrytype. When not set, or when not convertable to then determined by
+
+
Layout that renders event ID.
@@ -1077,29 +1094,24 @@
Name of the machine on which Event Log service is running.
-
-
- Value to be used as the event Source.
-
-
-
+
- Action to take if the message is larger than the option.
+ Maximum Event log size in kilobytes. If null, the value won't be set. Default is 512 Kilobytes as specified by Eventlog API
-
+
- Optional entrytype. When not set, or when not convertable to then determined by
+ Message length limit to write to the Event Log.
-
+
- Maximum Event log size in kilobytes. If null, the value won't be set. Default is 512 Kilobytes as specified by Eventlog API
+ Value to be used as the event Source.
-
+
- Message length limit to write to the Event Log.
+ Action to take if the message is larger than the option.
@@ -1153,38 +1165,39 @@
+
+
-
-
-
-
-
-
-
-
+
+
-
-
+
+
-
+
+
+
+
-
+
+
-
+
+
@@ -1216,39 +1229,19 @@
Line ending mode.
-
-
- Way file archives are numbered.
-
-
-
-
- Name of the file to be used for an archive.
-
-
-
-
- Indicates whether to automatically archive log files every time the specified time passes.
-
-
-
-
- Size in bytes above which log files will be automatically archived. Warning: combining this with isn't supported. We cannot create multiple archive files, if they should have the same name. Choose:
-
-
Indicates whether to compress archive files into the zip archive format.
-
+
- Maximum number of archive files that should be kept.
+ Way file archives are numbered.
-
+
- Gets or set a value indicating whether a managed file stream is forced, instead of using the native implementation.
+ Name of the file to be used for an archive.
@@ -1256,24 +1249,24 @@
Is the an absolute or relative path?
-
+
- Cleanup invalid values in a filename, e.g. slashes in a filename. If set to true, this can impact the performance of massive writes. If set to false, nothing gets written when the filename is wrong.
+ Indicates whether to automatically archive log files every time the specified time passes.
-
+
- Whether or not this target should just discard all data that its asked to write. Mostly used for when testing NLog Stack except final write
+ Size in bytes above which log files will be automatically archived. Warning: combining this with isn't supported. We cannot create multiple archive files, if they should have the same name. Choose:
-
+
- Is the an absolute or relative path?
+ Maximum number of archive files that should be kept.
-
+
- Value indicationg whether file creation calls should be synchronized by a system global mutex.
+ Indicates whether the footer should be written only when the file is archived.
@@ -1281,11 +1274,6 @@
Maximum number of log filenames that should be stored as existing.
-
-
- Indicates whether the footer should be written only when the file is archived.
-
-
Name of the file to write to.
@@ -1301,19 +1289,34 @@
Indicates whether to archive old log file on startup.
+
+
+ Cleanup invalid values in a filename, e.g. slashes in a filename. If set to true, this can impact the performance of massive writes. If set to false, nothing gets written when the filename is wrong.
+
+
Indicates whether to create directories if they do not exist.
+
+
+ Indicates whether to delete old log file on startup.
+
+
File attributes (Windows only).
-
+
- Indicates whether to delete old log file on startup.
+ Indicates whether to write BOM (byte order mark) in created files
+
+
+
+
+ Indicates whether to enable log file(s) to be deleted.
@@ -1321,14 +1324,19 @@
Indicates whether to replace file contents on each write instead of appending log message at the end.
-
+
- Indicates whether to enable log file(s) to be deleted.
+ Value indicationg whether file creation calls should be synchronized by a system global mutex.
-
+
- Number of times the write is appended on the file before NLog discards the log message.
+ Gets or set a value indicating whether a managed file stream is forced, instead of using the native implementation.
+
+
+
+
+ Is the an absolute or relative path?
@@ -1336,9 +1344,14 @@
Indicates whether concurrent writes to the log file by multiple processes on the same host.
-
+
- Indicates whether to keep log file open instead of opening and closing it on each logging event.
+ Whether or not this target should just discard all data that its asked to write. Mostly used for when testing NLog Stack except final write
+
+
+
+
+ Delay in milliseconds to wait before attempting to write to the file again.
@@ -1371,9 +1384,14 @@
Indicates whether to automatically flush the file buffers after each log message.
-
+
- Delay in milliseconds to wait before attempting to write to the file again.
+ Number of times the write is appended on the file before NLog discards the log message.
+
+
+
+
+ Indicates whether to keep log file open instead of opening and closing it on each logging event.
@@ -1387,6 +1405,13 @@
+
+
+
+
+
+
+
@@ -1404,13 +1429,6 @@
-
-
-
-
-
-
-
@@ -1546,16 +1564,11 @@
-
-
-
-
-
-
- Name of the target.
-
-
+
+
+
+
Interval in which messages will be written up to the number of messages.
@@ -1566,6 +1579,11 @@
Maximum allowed number of messages written per .
+
+
+ Name of the target.
+
+
Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit
@@ -1637,7 +1655,6 @@
-
@@ -1659,11 +1676,6 @@
Type of the parameter. Obsolete alias for
-
-
- Parameter can combine multiple LogEvents into a single parameter value
-
-
@@ -1673,19 +1685,19 @@
-
+
+
-
-
-
+
+
+
+
-
-
-
-
+
+
@@ -1716,9 +1728,14 @@
Footer.
-
+
- Indicates whether to send message as HTML instead of plain text.
+ Indicates whether NewLine characters in the body should be replaced with tags.
+
+
+
+
+ Priority used for sending mails.
@@ -1726,9 +1743,9 @@
Encoding to be used for sending e-mail.
-
+
- Indicates whether to add new lines between log entries.
+ BCC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com).
@@ -1736,24 +1753,14 @@
CC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com).
-
-
- Recipients' email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com).
-
-
-
-
- BCC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com).
-
-
-
+
- Mail message body (repeated for each log message send in one mail).
+ Indicates whether to add new lines between log entries.
-
+
- Mail subject.
+ Indicates whether to send message as HTML instead of plain text.
@@ -1761,19 +1768,19 @@
Sender's email address (e.g. joe@domain.com).
-
+
- Indicates the SMTP client timeout.
+ Mail message body (repeated for each log message send in one mail).
-
+
- Priority used for sending mails.
+ Mail subject.
-
+
- Indicates whether NewLine characters in the body should be replaced with tags.
+ Recipients' email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com).
@@ -1781,6 +1788,11 @@
Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit
+
+
+ Indicates the SMTP client timeout.
+
+
SMTP Server to be used for sending.
@@ -1912,13 +1924,13 @@
-
-
+
+
@@ -1951,16 +1963,6 @@
Indicates whether to append newline at the end of log message.
-
-
- Action that should be taken if the will be more connections than .
-
-
-
-
- Action that should be taken if the message is larger than maxMessageSize.
-
-
Network address.
@@ -1986,6 +1988,16 @@
Maximum queue size.
+
+
+ Action that should be taken if the will be more connections than .
+
+
+
+
+ Action that should be taken if the message is larger than maxMessageSize.
+
+
Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit
@@ -2005,23 +2017,25 @@
-
+
-
+
+
+
-
+
-
+
@@ -2059,9 +2073,9 @@
Action that should be taken if the will be more connections than .
-
+
- Action that should be taken if the message is larger than maxMessageSize.
+ Maximum queue size.
@@ -2084,9 +2098,14 @@
Network address.
-
+
- Maximum queue size.
+ Action that should be taken if the message is larger than maxMessageSize.
+
+
+
+
+ NDLC item separator.
@@ -2094,14 +2113,14 @@
NDC item separator.
-
+
- Indicates whether to include source info (file name and line number) in the information sent over the network.
+ Indicates whether to include NLog-specific extensions to log4j schema.
-
+
- Indicates whether to include dictionary contents.
+ Indicates whether to include source info (file name and line number) in the information sent over the network.
@@ -2114,6 +2133,11 @@
Indicates whether to include stack contents.
+
+
+ Indicates whether to include dictionary contents.
+
+
Indicates whether to include dictionary contents.
@@ -2134,9 +2158,9 @@
AppInfo field. By default it's the friendly name of the current AppDomain.
-
+
- Indicates whether to include NLog-specific extensions to log4j schema.
+ Renderer for log4j:event logger-xml-attribute (Default ${logger})
@@ -2497,74 +2521,81 @@
-
-
-
-
-
+
-
+
+
+
+
+
+
+
Name of the target.
+
+
+ Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit
+
+
Should we include the BOM (Byte-order-mark) for UTF? Influences the property. This will only work for UTF-8.
-
+
- Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit
+ Web service method name. Only used with Soap.
-
+
- Encoding.
+ Web service namespace. Only used with Soap.
-
+
- Value whether escaping be done according to the old NLog style (Very non-standard)
+ Protocol to be used when calling web service.
-
+
- Value whether escaping be done according to Rfc3986 (Supports Internationalized Resource Identifiers - IRIs)
+ Custom proxy address, include port separated by a colon
-
+
- Web service method name. Only used with Soap.
+ Encoding.
-
+
- Web service namespace. Only used with Soap.
+ Web service URL.
-
+
- Indicates whether to pre-authenticate the HttpWebRequest (Requires 'Authorization' in parameters)
+ Value whether escaping be done according to the old NLog style (Very non-standard)
-
+
- Protocol to be used when calling web service.
+ Value whether escaping be done according to Rfc3986 (Supports Internationalized Resource Identifiers - IRIs)
-
+
- Web service URL.
+ Indicates whether to pre-authenticate the HttpWebRequest (Requires 'Authorization' in parameters)
@@ -2577,6 +2608,11 @@
(optional) root namespace of the XML document, if POST of XML document chosen. (see and ).
+
+
+ Proxy configuration when calling web service
+
+
@@ -2590,6 +2626,14 @@
+
+
+
+
+
+
+
+
@@ -2704,6 +2748,7 @@
+
@@ -2712,7 +2757,7 @@
- Option to include all properties from the log events
+ Option to include all properties from the log event (as JSON)
@@ -2735,16 +2780,32 @@
Option to suppress the extra spaces in the output json
+
+
+ How far should the JSON serializer follow object references before backing off
+
+
-
-
+
+
+
+
+
+ Layout that will be rendered as the attribute's value.
+
+
+
+
+ Name of the attribute.
+
+
Determines wether or not this attribute will be Json encoded.
@@ -2755,14 +2816,9 @@
Indicates whether to escape non-ascii characters
-
-
- Layout that will be rendered as the attribute's value.
-
-
-
+
- Name of the attribute.
+ Whether an attribute with empty value should be included in the output
@@ -3006,45 +3062,35 @@
-
-
-
+
+
-
+
+
Action to be taken when filter matches.
-
-
- Layout to be used to filter log messages.
-
-
Default number of unique filter values to expect, will automatically increase if needed
-
-
- Append FilterCount to the when an event is no longer filtered
-
-
-
+
- Insert FilterCount value into when an event is no longer filtered
+ Applies the configured action to the initial logevent that starts the timeout period. Used to configure that it should ignore all events until timeout.
-
+
- Applies the configured action to the initial logevent that starts the timeout period. Used to configure that it should ignore all events until timeout.
+ Layout to be used to filter log messages.
@@ -3057,6 +3103,11 @@
Max length of filter values, will truncate if above limit
+
+
+ How long before a filter expires, and logging is accepted again
+
+
Default buffer size for the internal buffers
@@ -3067,9 +3118,14 @@
Reuse internal buffers, and doesn't have to constantly allocate new buffers
-
+
- How long before a filter expires, and logging is accepted again
+ Append FilterCount to the when an event is no longer filtered
+
+
+
+
+ Insert FilterCount value into when an event is no longer filtered
diff --git a/ProcessingSteps/Extract/ExtractApplicationAndEntityFlowmaps.cs b/ProcessingSteps/Extract/ExtractApplicationAndEntityFlowmaps.cs
index a9f512a..6411f8c 100644
--- a/ProcessingSteps/Extract/ExtractApplicationAndEntityFlowmaps.cs
+++ b/ProcessingSteps/Extract/ExtractApplicationAndEntityFlowmaps.cs
@@ -327,6 +327,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
{
logger.Warn(ex);
loggerConsole.Warn(ex);
+
+ return false;
}
finally
{
diff --git a/ProcessingSteps/Extract/ExtractApplicationAndEntityMetrics.cs b/ProcessingSteps/Extract/ExtractApplicationAndEntityMetrics.cs
index 20153e8..e1fe86e 100644
--- a/ProcessingSteps/Extract/ExtractApplicationAndEntityMetrics.cs
+++ b/ProcessingSteps/Extract/ExtractApplicationAndEntityMetrics.cs
@@ -147,6 +147,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
{
logger.Warn(ex);
loggerConsole.Warn(ex);
+
+ return false;
}
finally
{
diff --git a/ProcessingSteps/Extract/ExtractControllerAndApplicationConfiguration.cs b/ProcessingSteps/Extract/ExtractControllerAndApplicationConfiguration.cs
index c94b40a..fc65957 100644
--- a/ProcessingSteps/Extract/ExtractControllerAndApplicationConfiguration.cs
+++ b/ProcessingSteps/Extract/ExtractControllerAndApplicationConfiguration.cs
@@ -98,6 +98,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
{
logger.Warn(ex);
loggerConsole.Warn(ex);
+
+ return false;
}
finally
{
diff --git a/ProcessingSteps/Extract/ExtractControllerApplicationsAndEntities.cs b/ProcessingSteps/Extract/ExtractControllerApplicationsAndEntities.cs
index 413247d..1cb7705 100644
--- a/ProcessingSteps/Extract/ExtractControllerApplicationsAndEntities.cs
+++ b/ProcessingSteps/Extract/ExtractControllerApplicationsAndEntities.cs
@@ -228,30 +228,6 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
}
);
- //Parallel.ForEach(
- // nodesList,
- // new ParallelOptions { MaxDegreeOfParallelism = NODE_PROPERTIES_EXTRACT_NUMBER_OF_THREADS },
- // () => 0,
- // (node, loop, subtotal) =>
- // {
- // ControllerApi controllerApiLocal = new ControllerApi(jobTarget.Controller, jobTarget.UserName, AESEncryptionHelper.Decrypt(jobTarget.UserPassword));
- // controllerApiLocal.PrivateApiLogin();
-
- // string nodePropertiesJSON = controllerApi.GetNodeProperties(node.id);
- // if (nodePropertiesJSON != String.Empty) FileIOHelper.SaveFileToPath(nodePropertiesJSON, FilePathMap.NodeRuntimePropertiesDataFilePath(jobTarget, jobConfiguration.Input.TimeRange, node));
-
- // return 1;
- // },
- // (finalResult) =>
- // {
- // Interlocked.Add(ref j, finalResult);
- // if (j % 10 == 0)
- // {
- // Console.Write("[{0}].", j);
- // }
- // }
- //);
-
loggerConsole.Info("Completed {0} Nodes", nodesList.Count);
}
@@ -261,6 +237,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
{
logger.Warn(ex);
loggerConsole.Warn(ex);
+
+ return false;
}
finally
{
diff --git a/ProcessingSteps/Extract/ExtractEventsAndHealthRuleViolations.cs b/ProcessingSteps/Extract/ExtractEventsAndHealthRuleViolations.cs
index c69a55b..d5383a6 100644
--- a/ProcessingSteps/Extract/ExtractEventsAndHealthRuleViolations.cs
+++ b/ProcessingSteps/Extract/ExtractEventsAndHealthRuleViolations.cs
@@ -113,6 +113,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
{
logger.Warn(ex);
loggerConsole.Warn(ex);
+
+ return false;
}
finally
{
diff --git a/ProcessingSteps/Extract/ExtractSnapshots.cs b/ProcessingSteps/Extract/ExtractSnapshots.cs
index 92d80b1..b64226d 100644
--- a/ProcessingSteps/Extract/ExtractSnapshots.cs
+++ b/ProcessingSteps/Extract/ExtractSnapshots.cs
@@ -465,6 +465,7 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
{
logger.Warn(ex);
loggerConsole.Warn(ex);
+ return false;
}
finally
{
diff --git a/ProcessingSteps/Index/IndexApplicationAndEntityFlowmaps.cs b/ProcessingSteps/Index/IndexApplicationAndEntityFlowmaps.cs
index c664bff..0e521ac 100644
--- a/ProcessingSteps/Index/IndexApplicationAndEntityFlowmaps.cs
+++ b/ProcessingSteps/Index/IndexApplicationAndEntityFlowmaps.cs
@@ -263,6 +263,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
{
logger.Warn(ex);
loggerConsole.Warn(ex);
+
+ return false;
}
finally
{
diff --git a/ProcessingSteps/Index/IndexApplicationAndEntityMetrics.cs b/ProcessingSteps/Index/IndexApplicationAndEntityMetrics.cs
index 86097dd..69d8280 100644
--- a/ProcessingSteps/Index/IndexApplicationAndEntityMetrics.cs
+++ b/ProcessingSteps/Index/IndexApplicationAndEntityMetrics.cs
@@ -984,6 +984,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
{
logger.Warn(ex);
loggerConsole.Warn(ex);
+
+ return false;
}
finally
{
diff --git a/ProcessingSteps/Index/IndexApplicationConfigurationDifferences.cs b/ProcessingSteps/Index/IndexApplicationConfigurationDifferences.cs
index f80f086..75bc246 100644
--- a/ProcessingSteps/Index/IndexApplicationConfigurationDifferences.cs
+++ b/ProcessingSteps/Index/IndexApplicationConfigurationDifferences.cs
@@ -326,6 +326,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
{
logger.Warn(ex);
loggerConsole.Warn(ex);
+
+ return false;
}
finally
{
diff --git a/ProcessingSteps/Index/IndexControllerAndApplicationConfiguration.cs b/ProcessingSteps/Index/IndexControllerAndApplicationConfiguration.cs
index 2c1716b..94557b1 100644
--- a/ProcessingSteps/Index/IndexControllerAndApplicationConfiguration.cs
+++ b/ProcessingSteps/Index/IndexControllerAndApplicationConfiguration.cs
@@ -918,6 +918,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
{
logger.Warn(ex);
loggerConsole.Warn(ex);
+
+ return false;
}
finally
{
diff --git a/ProcessingSteps/Index/IndexControllersApplicationsAndEntities.cs b/ProcessingSteps/Index/IndexControllersApplicationsAndEntities.cs
index 57cb37f..99e1903 100644
--- a/ProcessingSteps/Index/IndexControllersApplicationsAndEntities.cs
+++ b/ProcessingSteps/Index/IndexControllersApplicationsAndEntities.cs
@@ -941,6 +941,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
{
logger.Warn(ex);
loggerConsole.Warn(ex);
+
+ return false;
}
finally
{
diff --git a/ProcessingSteps/Index/IndexEventsAndHealthRuleViolations.cs b/ProcessingSteps/Index/IndexEventsAndHealthRuleViolations.cs
index 52044fe..15b6c36 100644
--- a/ProcessingSteps/Index/IndexEventsAndHealthRuleViolations.cs
+++ b/ProcessingSteps/Index/IndexEventsAndHealthRuleViolations.cs
@@ -358,6 +358,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
{
logger.Warn(ex);
loggerConsole.Warn(ex);
+
+ return false;
}
finally
{
diff --git a/ProcessingSteps/Index/IndexSnapshots.cs b/ProcessingSteps/Index/IndexSnapshots.cs
index f8e4f39..7773c55 100644
--- a/ProcessingSteps/Index/IndexSnapshots.cs
+++ b/ProcessingSteps/Index/IndexSnapshots.cs
@@ -636,6 +636,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
{
logger.Warn(ex);
loggerConsole.Warn(ex);
+
+ return false;
}
finally
{
diff --git a/ProcessingSteps/JobStepBase.cs b/ProcessingSteps/JobStepBase.cs
index 7a5cd60..f7d8acc 100644
--- a/ProcessingSteps/JobStepBase.cs
+++ b/ProcessingSteps/JobStepBase.cs
@@ -211,7 +211,7 @@ internal List getMetricsExtractMappingList(JobConfiguratio
internal Dictionary> populateMethodCallMappingDictionary(string methodCallLinesToFrameworkTypeMappingFilePath)
{
- List methodCallLineClassToFrameworkTypeMappingList = FileIOHelper.ReadListFromCSVFile(methodCallLinesToFrameworkTypeMappingFilePath, new MethodCallLineClassTypeMappingReportMap());
+ List methodCallLineClassToFrameworkTypeMappingList = FileIOHelper.ReadListFromCSVFile(methodCallLinesToFrameworkTypeMappingFilePath, new MethodCallLineClassTypeMappingReportMap());
methodCallLineClassToFrameworkTypeMappingList = methodCallLineClassToFrameworkTypeMappingList.OrderByDescending(m => m.ClassPrefix).ToList();
Dictionary> methodCallLineClassToFrameworkTypeMappingDictionary = new Dictionary>(26);
methodCallLineClassToFrameworkTypeMappingDictionary.Add("a", methodCallLineClassToFrameworkTypeMappingList.Where(m => m.ClassPrefix.Substring(0, 1).ToLower() == "a").ToList());
diff --git a/ProcessingSteps/Report/ReportApplicationAndEntityMetricGraphs.cs b/ProcessingSteps/Report/ReportApplicationAndEntityMetricGraphs.cs
index 0639378..52bc596 100644
--- a/ProcessingSteps/Report/ReportApplicationAndEntityMetricGraphs.cs
+++ b/ProcessingSteps/Report/ReportApplicationAndEntityMetricGraphs.cs
@@ -155,8 +155,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
List entityMetricExtractMappingListFiltered = entityMetricExtractMappingList.Where(m => m.EntityType == EntityApplication.ENTITY_TYPE && m.Graph.Length > 0).ToList();
fillMetricValueTablesForEntityType(excelReport, REPORT_METRICS_GRAPHS_SHEET_ENTITIES_METRICS, entityMetricExtractMappingListFiltered, jobTarget, EntityApplication.ENTITY_FOLDER);
- fillMetricGraphsForEntityType(excelReport, entityMetricExtractMappingList, applicationsList.OfType().ToList(), jobConfiguration, jobTarget, EntityApplication.ENTITY_FOLDER, EntityApplication.ENTITY_TYPE);
- fillTransactionalScatterPlotsForEntityType(excelReport, entityMetricExtractMappingList, applicationsList.OfType().ToList(), jobConfiguration, jobTarget, EntityApplication.ENTITY_FOLDER, EntityApplication.ENTITY_TYPE);
+ fillMetricGraphsForEntityType(excelReport, entityMetricExtractMappingListFiltered, applicationsList.OfType().ToList(), jobConfiguration, jobTarget, EntityApplication.ENTITY_FOLDER, EntityApplication.ENTITY_TYPE);
+ fillTransactionalScatterPlotsForEntityType(excelReport, entityMetricExtractMappingListFiltered, applicationsList.OfType().ToList(), jobConfiguration, jobTarget, EntityApplication.ENTITY_FOLDER, EntityApplication.ENTITY_TYPE);
finalizeAndSaveIndividualEntityMetricReport(excelReport, FilePathMap.EntityTypeMetricGraphsExcelReportFilePath(applicationsList[0], jobTarget, jobConfiguration.Input.TimeRange, true));
@@ -178,8 +178,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
List entityMetricExtractMappingListFiltered = entityMetricExtractMappingList.Where(m => m.EntityType == EntityTier.ENTITY_TYPE && m.Graph.Length > 0).ToList();
fillMetricValueTablesForEntityType(excelReport, REPORT_METRICS_GRAPHS_SHEET_ENTITIES_METRICS, entityMetricExtractMappingListFiltered, jobTarget, EntityTier.ENTITY_FOLDER);
- fillMetricGraphsForEntityType(excelReport, entityMetricExtractMappingList, tiersList.OfType().ToList(), jobConfiguration, jobTarget, EntityTier.ENTITY_FOLDER, EntityTier.ENTITY_TYPE);
- fillTransactionalScatterPlotsForEntityType(excelReport, entityMetricExtractMappingList, tiersList.OfType().ToList(), jobConfiguration, jobTarget, EntityTier.ENTITY_FOLDER, EntityTier.ENTITY_TYPE);
+ fillMetricGraphsForEntityType(excelReport, entityMetricExtractMappingListFiltered, tiersList.OfType().ToList(), jobConfiguration, jobTarget, EntityTier.ENTITY_FOLDER, EntityTier.ENTITY_TYPE);
+ fillTransactionalScatterPlotsForEntityType(excelReport, entityMetricExtractMappingListFiltered, tiersList.OfType().ToList(), jobConfiguration, jobTarget, EntityTier.ENTITY_FOLDER, EntityTier.ENTITY_TYPE);
finalizeAndSaveIndividualEntityMetricReport(excelReport, FilePathMap.EntityTypeMetricGraphsExcelReportFilePath(tiersList[0], jobTarget, jobConfiguration.Input.TimeRange, true));
@@ -199,10 +199,11 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
ExcelPackage excelReport = createIndividualEntityMetricGraphsReportTemplate(programOptions, jobConfiguration);
List entityMetricExtractMappingListFiltered = entityMetricExtractMappingList.Where(m => m.EntityType == EntityNode.ENTITY_TYPE && m.Graph.Length > 0).ToList();
+
fillMetricValueTablesForEntityType(excelReport, REPORT_METRICS_GRAPHS_SHEET_ENTITIES_METRICS, entityMetricExtractMappingListFiltered, jobTarget, EntityNode.ENTITY_FOLDER);
- fillMetricGraphsForEntityType(excelReport, entityMetricExtractMappingList, nodesList.OfType().ToList(), jobConfiguration, jobTarget, EntityNode.ENTITY_FOLDER, EntityNode.ENTITY_TYPE);
- fillTransactionalScatterPlotsForEntityType(excelReport, entityMetricExtractMappingList, nodesList.OfType().ToList(), jobConfiguration, jobTarget, EntityNode.ENTITY_FOLDER, EntityNode.ENTITY_TYPE);
+ fillMetricGraphsForEntityType(excelReport, entityMetricExtractMappingListFiltered, nodesList.OfType().ToList(), jobConfiguration, jobTarget, EntityNode.ENTITY_FOLDER, EntityNode.ENTITY_TYPE);
+ fillTransactionalScatterPlotsForEntityType(excelReport, entityMetricExtractMappingListFiltered, nodesList.OfType().ToList(), jobConfiguration, jobTarget, EntityNode.ENTITY_FOLDER, EntityNode.ENTITY_TYPE);
finalizeAndSaveIndividualEntityMetricReport(excelReport, FilePathMap.EntityTypeMetricGraphsExcelReportFilePath(nodesList[0], jobTarget, jobConfiguration.Input.TimeRange, true));
@@ -224,8 +225,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
List entityMetricExtractMappingListFiltered = entityMetricExtractMappingList.Where(m => m.EntityType == EntityBackend.ENTITY_TYPE && m.Graph.Length > 0).ToList();
fillMetricValueTablesForEntityType(excelReport, REPORT_METRICS_GRAPHS_SHEET_ENTITIES_METRICS, entityMetricExtractMappingListFiltered, jobTarget, EntityBackend.ENTITY_FOLDER);
- fillMetricGraphsForEntityType(excelReport, entityMetricExtractMappingList, backendsList.OfType().ToList(), jobConfiguration, jobTarget, EntityBackend.ENTITY_FOLDER, EntityBackend.ENTITY_TYPE);
- fillTransactionalScatterPlotsForEntityType(excelReport, entityMetricExtractMappingList, backendsList.OfType().ToList(), jobConfiguration, jobTarget, EntityBackend.ENTITY_FOLDER, EntityBackend.ENTITY_TYPE);
+ fillMetricGraphsForEntityType(excelReport, entityMetricExtractMappingListFiltered, backendsList.OfType().ToList(), jobConfiguration, jobTarget, EntityBackend.ENTITY_FOLDER, EntityBackend.ENTITY_TYPE);
+ fillTransactionalScatterPlotsForEntityType(excelReport, entityMetricExtractMappingListFiltered, backendsList.OfType().ToList(), jobConfiguration, jobTarget, EntityBackend.ENTITY_FOLDER, EntityBackend.ENTITY_TYPE);
finalizeAndSaveIndividualEntityMetricReport(excelReport, FilePathMap.EntityTypeMetricGraphsExcelReportFilePath(backendsList[0], jobTarget, jobConfiguration.Input.TimeRange, true));
@@ -247,8 +248,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
List entityMetricExtractMappingListFiltered = entityMetricExtractMappingList.Where(m => m.EntityType == EntityBusinessTransaction.ENTITY_TYPE && m.Graph.Length > 0).ToList();
fillMetricValueTablesForEntityType(excelReport, REPORT_METRICS_GRAPHS_SHEET_ENTITIES_METRICS, entityMetricExtractMappingListFiltered, jobTarget, EntityBusinessTransaction.ENTITY_FOLDER);
- fillMetricGraphsForEntityType(excelReport, entityMetricExtractMappingList, businessTransactionsList.OfType().ToList(), jobConfiguration, jobTarget, EntityBusinessTransaction.ENTITY_FOLDER, EntityBusinessTransaction.ENTITY_TYPE);
- fillTransactionalScatterPlotsForEntityType(excelReport, entityMetricExtractMappingList, businessTransactionsList.OfType().ToList(), jobConfiguration, jobTarget, EntityBusinessTransaction.ENTITY_FOLDER, EntityBusinessTransaction.ENTITY_TYPE);
+ fillMetricGraphsForEntityType(excelReport, entityMetricExtractMappingListFiltered, businessTransactionsList.OfType().ToList(), jobConfiguration, jobTarget, EntityBusinessTransaction.ENTITY_FOLDER, EntityBusinessTransaction.ENTITY_TYPE);
+ fillTransactionalScatterPlotsForEntityType(excelReport, entityMetricExtractMappingListFiltered, businessTransactionsList.OfType().ToList(), jobConfiguration, jobTarget, EntityBusinessTransaction.ENTITY_FOLDER, EntityBusinessTransaction.ENTITY_TYPE);
finalizeAndSaveIndividualEntityMetricReport(excelReport, FilePathMap.EntityTypeMetricGraphsExcelReportFilePath(businessTransactionsList[0], jobTarget, jobConfiguration.Input.TimeRange, true));
@@ -270,8 +271,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
List entityMetricExtractMappingListFiltered = entityMetricExtractMappingList.Where(m => m.EntityType == EntityServiceEndpoint.ENTITY_TYPE && m.Graph.Length > 0).ToList();
fillMetricValueTablesForEntityType(excelReport, REPORT_METRICS_GRAPHS_SHEET_ENTITIES_METRICS, entityMetricExtractMappingListFiltered, jobTarget, EntityServiceEndpoint.ENTITY_FOLDER);
- fillMetricGraphsForEntityType(excelReport, entityMetricExtractMappingList, serviceEndpointsList.OfType().ToList(), jobConfiguration, jobTarget, EntityServiceEndpoint.ENTITY_FOLDER, EntityServiceEndpoint.ENTITY_TYPE);
- fillTransactionalScatterPlotsForEntityType(excelReport, entityMetricExtractMappingList, serviceEndpointsList.OfType().ToList(), jobConfiguration, jobTarget, EntityServiceEndpoint.ENTITY_FOLDER, EntityServiceEndpoint.ENTITY_TYPE);
+ fillMetricGraphsForEntityType(excelReport, entityMetricExtractMappingListFiltered, serviceEndpointsList.OfType().ToList(), jobConfiguration, jobTarget, EntityServiceEndpoint.ENTITY_FOLDER, EntityServiceEndpoint.ENTITY_TYPE);
+ fillTransactionalScatterPlotsForEntityType(excelReport, entityMetricExtractMappingListFiltered, serviceEndpointsList.OfType().ToList(), jobConfiguration, jobTarget, EntityServiceEndpoint.ENTITY_FOLDER, EntityServiceEndpoint.ENTITY_TYPE);
finalizeAndSaveIndividualEntityMetricReport(excelReport, FilePathMap.EntityTypeMetricGraphsExcelReportFilePath(serviceEndpointsList[0], jobTarget, jobConfiguration.Input.TimeRange, true));
@@ -293,7 +294,7 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
List entityMetricExtractMappingListFiltered = entityMetricExtractMappingList.Where(m => m.EntityType == EntityError.ENTITY_TYPE && m.Graph.Length > 0).ToList();
fillMetricValueTablesForEntityType(excelReport, REPORT_METRICS_GRAPHS_SHEET_ENTITIES_METRICS, entityMetricExtractMappingListFiltered, jobTarget, EntityError.ENTITY_FOLDER);
- fillMetricGraphsForEntityType(excelReport, entityMetricExtractMappingList, errorsList.OfType().ToList(), jobConfiguration, jobTarget, EntityError.ENTITY_FOLDER, EntityError.ENTITY_TYPE);
+ fillMetricGraphsForEntityType(excelReport, entityMetricExtractMappingListFiltered, errorsList.OfType().ToList(), jobConfiguration, jobTarget, EntityError.ENTITY_FOLDER, EntityError.ENTITY_TYPE);
finalizeAndSaveIndividualEntityMetricReport(excelReport, FilePathMap.EntityTypeMetricGraphsExcelReportFilePath(errorsList[0], jobTarget, jobConfiguration.Input.TimeRange, true));
@@ -315,8 +316,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
List entityMetricExtractMappingListFiltered = entityMetricExtractMappingList.Where(m => m.EntityType == EntityInformationPoint.ENTITY_TYPE && m.Graph.Length > 0).ToList();
fillMetricValueTablesForEntityType(excelReport, REPORT_METRICS_GRAPHS_SHEET_ENTITIES_METRICS, entityMetricExtractMappingListFiltered, jobTarget, EntityInformationPoint.ENTITY_FOLDER);
- fillMetricGraphsForEntityType(excelReport, entityMetricExtractMappingList, informationPointsList.OfType().ToList(), jobConfiguration, jobTarget, EntityInformationPoint.ENTITY_FOLDER, EntityInformationPoint.ENTITY_TYPE);
- fillTransactionalScatterPlotsForEntityType(excelReport, entityMetricExtractMappingList, informationPointsList.OfType().ToList(), jobConfiguration, jobTarget, EntityInformationPoint.ENTITY_FOLDER, EntityInformationPoint.ENTITY_TYPE);
+ fillMetricGraphsForEntityType(excelReport, entityMetricExtractMappingListFiltered, informationPointsList.OfType().ToList(), jobConfiguration, jobTarget, EntityInformationPoint.ENTITY_FOLDER, EntityInformationPoint.ENTITY_TYPE);
+ fillTransactionalScatterPlotsForEntityType(excelReport, entityMetricExtractMappingListFiltered, informationPointsList.OfType().ToList(), jobConfiguration, jobTarget, EntityInformationPoint.ENTITY_FOLDER, EntityInformationPoint.ENTITY_TYPE);
finalizeAndSaveIndividualEntityMetricReport(excelReport, FilePathMap.EntityTypeMetricGraphsExcelReportFilePath(informationPointsList[0], jobTarget, jobConfiguration.Input.TimeRange, true));
@@ -333,6 +334,7 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
{
logger.Warn(ex);
loggerConsole.Warn(ex);
+ return false;
}
finally
{
@@ -600,19 +602,16 @@ private void fillMetricGraphsForEntityType(
{
ExcelWorksheet sheetMetrics = excelReportMetrics.Workbook.Worksheets[REPORT_METRICS_GRAPHS_SHEET_ENTITIES_METRICS];
- // Load metric index locations file for later use
- List entityMetricValuesLocations = FileIOHelper.ReadListFromCSVFile(FilePathMap.MetricsLocationIndexFilePath(jobTarget, entityFolderName), new EntityHourlyMetricValueLocationReportMap());
-
- // Process metrics in groups as indicated by their Graph column. All metrics with same Graph value go into same sheet, with as many sheets as necessary
- // Empty graph name means do not output
- List entityMetricExtractMappingListFiltered = entityMetricExtractMappingList.Where(m => m.EntityType == entityType && m.Graph.Length > 0).ToList();
+ Dictionary> entityMetricValuesLocationsDictionary = indexMetricValueLocationsForFasterAccess(jobConfiguration, jobTarget, entityFolderName, entityType);
// Output all graphs
- var metricMappingsGrouped = entityMetricExtractMappingListFiltered.GroupBy(m => new { m.Graph });
+ var metricMappingsGrouped = entityMetricExtractMappingList.GroupBy(m => new { m.Graph });
foreach (var metricMappingGroup in metricMappingsGrouped)
{
List entityMetricExtractMappingForThisGraph = metricMappingGroup.ToList();
+ Console.Write("{0} {1} starting for {2} entities ", entityFolderName, metricMappingGroup.Key.Graph, entityList.Count);
+
// Measure the width of the time range to be at least 16 cells
int numCellsPerHourRange = entityMetricExtractMappingForThisGraph.Count * 2;
if (numCellsPerHourRange < 16) numCellsPerHourRange = 16;
@@ -776,8 +775,6 @@ private void fillMetricGraphsForEntityType(
// Output entity one at a time
for (int indexOfEntity = 0; indexOfEntity < entityList.Count; indexOfEntity++)
{
- Console.Write(".");
-
EntityBase entity = entityList[indexOfEntity];
string entityNameForExcelTable = getShortenedEntityNameForExcelTable(entity.EntityName, entity.EntityID);
@@ -815,26 +812,26 @@ private void fillMetricGraphsForEntityType(
#endregion
- // Get indexed table location mapping for this specific metric/entity/timerange combo
- List entityMetricValuesLocationsForThisMetric = entityMetricValuesLocations.Where(m =>
- m.MetricName == metricExtractMapping.MetricName &&
- m.EntityID == entity.EntityID &&
- m.FromUtc >= jobTimeRange.From &&
- m.ToUtc < jobTimeRange.To).ToList();
- if (entityMetricValuesLocationsForThisMetric != null && entityMetricValuesLocationsForThisMetric.Count > 0)
+ EntityHourlyMetricValueLocation entityMetricValuesLocationForThisMetric = null;
+ if (entityMetricValuesLocationsDictionary.ContainsKey(entity.EntityID) == true &&
+ entityMetricValuesLocationsDictionary[entity.EntityID].ContainsKey(metricExtractMapping.MetricName) == true)
+ {
+ entityMetricValuesLocationForThisMetric = entityMetricValuesLocationsDictionary[entity.EntityID][metricExtractMapping.MetricName][indexOfTimeRange];
+ }
+
+ if (entityMetricValuesLocationForThisMetric != null)
{
// We must have some activity here
entityHasActivity = true;
// Output the numeric values
ExcelTable tableMetrics = sheetMetrics.Tables[String.Format(REPORT_METRICS_GRAPHS_METRIC_TABLE_METRIC_VALUES, entityFolderName, metricExtractMapping.FolderName)];
+
if (tableMetrics != null)
{
- // Should be only metric index for this value 1 in here
- EntityHourlyMetricValueLocation entityMetricValuesLocationForThisMetric = entityMetricValuesLocationsForThisMetric[0];
-
// Get the range that contains the Sum column of the metric
ExcelRangeBase rangeMetricValuesForSum = getSingleColumnRangeFromTable(tableMetrics, "Sum", entityMetricValuesLocationForThisMetric.RowStart, entityMetricValuesLocationForThisMetric.RowEnd);
+
if (rangeMetricValuesForSum != null)
{
sheetGraphs.Cells[currentMaxRow, columnIndexOfValueOfCurrentMetric].Formula = String.Format(@"=SUM({0})", rangeMetricValuesForSum.FullAddress);
@@ -996,6 +993,11 @@ private void fillMetricGraphsForEntityType(
currentMaxRow++;
#endregion
+
+ if (indexOfEntity % 50 == 0)
+ {
+ Console.Write("[{0}].", indexOfEntity);
+ }
}
#region Create tables for entities
@@ -1016,6 +1018,8 @@ private void fillMetricGraphsForEntityType(
}
#endregion
+
+ Console.WriteLine("{0} {1} complete", entityFolderName, metricMappingGroup.Key.Graph);
}
return;
@@ -1038,6 +1042,8 @@ private void fillTransactionalScatterPlotsForEntityType(
// Process metrics in the CPM, ART and EPM group
List entityMetricExtractMappingListFiltered = entityMetricExtractMappingList.Where(m => m.EntityType == entityType && m.Graph == TRANSACTIONS_METRICS_SET).ToList();
+ Dictionary> entityMetricValuesLocationsDictionary = indexMetricValueLocationsForFasterAccess(jobConfiguration, jobTarget, entityFolderName, entityType);
+
if (entityMetricExtractMappingListFiltered.Count > 0)
{
#region Set variables for the sheet output based on Entity Type
@@ -1201,6 +1207,8 @@ private void fillTransactionalScatterPlotsForEntityType(
#endregion
+ Console.Write("{0} {1} starting for {2} entities ", entityFolderName, sheetName, entityList.Count);
+
// Output entity one at a time
for (int indexOfEntity = 0; indexOfEntity < entityList.Count; indexOfEntity++)
{
@@ -1221,24 +1229,26 @@ private void fillTransactionalScatterPlotsForEntityType(
#endregion
- // Get indexed table location mapping for this specific metric/entity/timerange combo
- EntityHourlyMetricValueLocation entityMetricValuesLocationsForART = entityMetricValuesLocations.Where(m =>
- m.MetricName == memART.MetricName &&
- m.EntityID == entity.EntityID &&
- m.FromUtc >= jobTimeRange.From &&
- m.ToUtc < jobTimeRange.To).FirstOrDefault();
-
- EntityHourlyMetricValueLocation entityMetricValuesLocationsForCPM = entityMetricValuesLocations.Where(m =>
- m.MetricName == memCPM.MetricName &&
- m.EntityID == entity.EntityID &&
- m.FromUtc >= jobTimeRange.From &&
- m.ToUtc < jobTimeRange.To).FirstOrDefault();
-
- EntityHourlyMetricValueLocation entityMetricValuesLocationsForEPM = entityMetricValuesLocations.Where(m =>
- m.MetricName == memEPM.MetricName &&
- m.EntityID == entity.EntityID &&
- m.FromUtc >= jobTimeRange.From &&
- m.ToUtc < jobTimeRange.To).FirstOrDefault();
+ EntityHourlyMetricValueLocation entityMetricValuesLocationsForART = null;
+ if (entityMetricValuesLocationsDictionary.ContainsKey(entity.EntityID) == true &&
+ entityMetricValuesLocationsDictionary[entity.EntityID].ContainsKey(memART.MetricName) == true)
+ {
+ entityMetricValuesLocationsForART = entityMetricValuesLocationsDictionary[entity.EntityID][memART.MetricName][indexOfTimeRange];
+ }
+
+ EntityHourlyMetricValueLocation entityMetricValuesLocationsForCPM = null;
+ if (entityMetricValuesLocationsDictionary.ContainsKey(entity.EntityID) == true &&
+ entityMetricValuesLocationsDictionary[entity.EntityID].ContainsKey(memCPM.MetricName) == true)
+ {
+ entityMetricValuesLocationsForCPM = entityMetricValuesLocationsDictionary[entity.EntityID][memCPM.MetricName][indexOfTimeRange];
+ }
+
+ EntityHourlyMetricValueLocation entityMetricValuesLocationsForEPM = null;
+ if (entityMetricValuesLocationsDictionary.ContainsKey(entity.EntityID) == true &&
+ entityMetricValuesLocationsDictionary[entity.EntityID].ContainsKey(memEPM.MetricName) == true)
+ {
+ entityMetricValuesLocationsForEPM = entityMetricValuesLocationsDictionary[entity.EntityID][memEPM.MetricName][indexOfTimeRange];
+ }
// Get ranges with the metrics
ExcelRangeBase rangeARTValues = null;
@@ -1400,6 +1410,11 @@ private void fillTransactionalScatterPlotsForEntityType(
currentMaxRow++;
#endregion
+
+ if (indexOfEntity % 50 == 0)
+ {
+ Console.Write("[{0}].", indexOfEntity);
+ }
}
#region Create tables for entities
@@ -1420,6 +1435,8 @@ private void fillTransactionalScatterPlotsForEntityType(
}
#endregion
+
+ Console.WriteLine("{0} {1} complete", entityFolderName, sheetName);
}
}
@@ -1562,5 +1579,74 @@ private static void addScatterChartToEntityMetricSheet(ExcelWorksheet sheet, Exc
#endregion
}
+
+ private Dictionary> indexMetricValueLocationsForFasterAccess(
+ JobConfiguration jobConfiguration,
+ JobTarget jobTarget,
+ string entityFolderName,
+ string entityType)
+ {
+ // Load metric index locations file for later use
+ List entityMetricValuesLocations = FileIOHelper.ReadListFromCSVFile(FilePathMap.MetricsLocationIndexFilePath(jobTarget, entityFolderName), new EntityHourlyMetricValueLocationReportMap());
+
+ // Index the metric value locations into this funky dictionary of dictionaries with array in following hierarchy
+ // Entity ID (123)
+ // Metric Name (ART, CPM)
+ // Time range 0
+ // ...
+ // Time range N
+ Dictionary> entityMetricValuesLocationsDictionary = null;
+
+ // Group them by Entity ID first
+ var entityMetricValuesLocationsGroupedByEntityID = entityMetricValuesLocations.GroupBy(m => new { m.EntityID });
+ if (entityMetricValuesLocationsGroupedByEntityID != null)
+ {
+ entityMetricValuesLocationsDictionary = new Dictionary>(entityMetricValuesLocationsGroupedByEntityID.Count());
+ foreach (var entityMetricMappingsGroupForEntity in entityMetricValuesLocationsGroupedByEntityID)
+ {
+ List entityHourlyMetricValueLocationsForThisEntity = entityMetricMappingsGroupForEntity.ToList();
+
+ // Group them by Metric Name second
+ var entityMetricValuesLocationsGroupedByMetricName = entityHourlyMetricValueLocationsForThisEntity.GroupBy(m => new { m.MetricName });
+
+ long entityID = entityMetricMappingsGroupForEntity.Key.EntityID;
+ entityMetricValuesLocationsDictionary.Add(entityID, new Dictionary(5));
+ foreach (var entityMetricMappingsGroupForEntityMetric in entityMetricValuesLocationsGroupedByMetricName)
+ {
+ List entityHourlyMetricValueLocationsForThisEntityAndMetric = entityMetricMappingsGroupForEntityMetric.ToList();
+
+ // Preallocate the array for each of the timeranges in anticipation of metric data to be inserted there
+ EntityHourlyMetricValueLocation[] entityHourlyMetricValueLocationsForThisEntityAndMetricArray = new EntityHourlyMetricValueLocation[jobConfiguration.Input.HourlyTimeRanges.Count];
+ entityMetricValuesLocationsDictionary[entityID].Add(entityMetricMappingsGroupForEntityMetric.Key.MetricName, entityHourlyMetricValueLocationsForThisEntityAndMetricArray);
+
+ if (entityHourlyMetricValueLocationsForThisEntityAndMetric != null && entityHourlyMetricValueLocationsForThisEntityAndMetric.Count > 0)
+ {
+ // Roll through the array of all the time ranges populating the array slots for each hour that has data
+ int indexOfMetricValueLocation = 0;
+ for (int indexOfTimeRange = 0; indexOfTimeRange < jobConfiguration.Input.HourlyTimeRanges.Count; indexOfTimeRange++)
+ {
+ JobTimeRange jobTimeRange = jobConfiguration.Input.HourlyTimeRanges[indexOfTimeRange];
+ EntityHourlyMetricValueLocation entityHourlyMetricValueLocation = entityHourlyMetricValueLocationsForThisEntityAndMetric[indexOfMetricValueLocation];
+
+ if (entityHourlyMetricValueLocation.FromUtc >= jobTimeRange.From &&
+ entityHourlyMetricValueLocation.ToUtc < jobTimeRange.To)
+ {
+ // Found metric values for this entity for this metric in this time range
+ entityHourlyMetricValueLocationsForThisEntityAndMetricArray[indexOfTimeRange] = entityHourlyMetricValueLocation;
+
+ indexOfMetricValueLocation++;
+ }
+ if (indexOfMetricValueLocation >= entityHourlyMetricValueLocationsForThisEntityAndMetric.Count)
+ {
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return entityMetricValuesLocationsDictionary;
+ }
}
}
diff --git a/ProcessingSteps/Report/ReportFlameGraphs.cs b/ProcessingSteps/Report/ReportFlameGraphs.cs
index e6abd69..362e9c4 100644
--- a/ProcessingSteps/Report/ReportFlameGraphs.cs
+++ b/ProcessingSteps/Report/ReportFlameGraphs.cs
@@ -300,6 +300,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
{
logger.Warn(ex);
loggerConsole.Warn(ex);
+
+ return false;
}
finally
{
diff --git a/ProcessingSteps/Report/ReportIndividualApplicationAndEntityDetails.cs b/ProcessingSteps/Report/ReportIndividualApplicationAndEntityDetails.cs
index 7495a8c..bb3d4c1 100644
--- a/ProcessingSteps/Report/ReportIndividualApplicationAndEntityDetails.cs
+++ b/ProcessingSteps/Report/ReportIndividualApplicationAndEntityDetails.cs
@@ -155,7 +155,7 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
#region Preload all the reports that will be filtered by the subsequent entities
- loggerConsole.Info("Completed Entity Details Data Preloading");
+ loggerConsole.Info("Entity Details Data Preloading");
List eventsAllList = FileIOHelper.ReadListFromCSVFile(FilePathMap.EventsIndexFilePath(jobTarget), new EventReportMap());
List healthRuleViolationEventsAllList = FileIOHelper.ReadListFromCSVFile(FilePathMap.HealthRuleViolationsIndexFilePath(jobTarget), new HealthRuleViolationEventReportMap());
@@ -166,6 +166,8 @@ public override bool Execute(ProgramOptions programOptions, JobConfiguration job
List detectedErrorsAllList = FileIOHelper.ReadListFromCSVFile(FilePathMap.SnapshotsDetectedErrorsIndexFilePath(jobTarget), new DetectedErrorReportMap());
List businessDataAllList = FileIOHelper.ReadListFromCSVFile(FilePathMap.SnapshotsBusinessDataIndexFilePath(jobTarget), new BusinessDataReportMap());
+ loggerConsole.Info("Completed Entity Details Data Preloading");
+
string relativePathToReportsToRemoveFromLinks = Path.Combine(
FilePathMap.getFileSystemSafeString(new Uri(jobTarget.Controller).Host),
FilePathMap.getShortenedEntityNameForFileSystem(jobTarget.Application, jobTarget.ApplicationID));
diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs
index 78c40e3..a9f9942 100644
--- a/Properties/AssemblyInfo.cs
+++ b/Properties/AssemblyInfo.cs
@@ -31,5 +31,5 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.29")]
-[assembly: AssemblyFileVersion("1.0.0.29")]
+[assembly: AssemblyVersion("1.0.0.30")]
+[assembly: AssemblyFileVersion("1.0.0.30")]
diff --git a/ReportObjects/Configuration/HTTPDataCollector.cs b/ReportObjects/Configuration/HTTPDataCollector.cs
index badc473..346a831 100644
--- a/ReportObjects/Configuration/HTTPDataCollector.cs
+++ b/ReportObjects/Configuration/HTTPDataCollector.cs
@@ -65,7 +65,7 @@ public override string RuleSubType
public override String ToString()
{
return String.Format(
- "MethodInvocationDataCollector: {0}/{1}/{2}",
+ "HTTPDataCollector: {0}/{1}/{2}",
this.Controller,
this.ApplicationName,
this.CollectorName);
diff --git a/VisualAnalytics/PowerBI/Design/DetectedEntitiesDesign.pbix b/VisualAnalytics/PowerBI/Design/DetectedEntitiesDesign.pbix
index 060ed68..e084d3a 100644
Binary files a/VisualAnalytics/PowerBI/Design/DetectedEntitiesDesign.pbix and b/VisualAnalytics/PowerBI/Design/DetectedEntitiesDesign.pbix differ
diff --git a/VisualAnalytics/PowerBI/Design/EntityFlowmapsDesign.pbix b/VisualAnalytics/PowerBI/Design/EntityFlowmapsDesign.pbix
index 18f39a7..a861785 100644
Binary files a/VisualAnalytics/PowerBI/Design/EntityFlowmapsDesign.pbix and b/VisualAnalytics/PowerBI/Design/EntityFlowmapsDesign.pbix differ
diff --git a/VisualAnalytics/PowerBI/Design/EntityMetricsDesign.pbix b/VisualAnalytics/PowerBI/Design/EntityMetricsDesign.pbix
index 2b2ae1f..d402fa0 100644
Binary files a/VisualAnalytics/PowerBI/Design/EntityMetricsDesign.pbix and b/VisualAnalytics/PowerBI/Design/EntityMetricsDesign.pbix differ
diff --git a/VisualAnalytics/PowerBI/Design/EventsAndHealthRuleViolationsDesign.pbix b/VisualAnalytics/PowerBI/Design/EventsAndHealthRuleViolationsDesign.pbix
index 68dd684..e5c810a 100644
Binary files a/VisualAnalytics/PowerBI/Design/EventsAndHealthRuleViolationsDesign.pbix and b/VisualAnalytics/PowerBI/Design/EventsAndHealthRuleViolationsDesign.pbix differ
diff --git a/VisualAnalytics/PowerBI/Design/SnapshotMethodCallsDesign.pbix b/VisualAnalytics/PowerBI/Design/SnapshotMethodCallsDesign.pbix
index 9edea0e..9797276 100644
Binary files a/VisualAnalytics/PowerBI/Design/SnapshotMethodCallsDesign.pbix and b/VisualAnalytics/PowerBI/Design/SnapshotMethodCallsDesign.pbix differ
diff --git a/VisualAnalytics/PowerBI/Design/SnapshotsDesign.pbix b/VisualAnalytics/PowerBI/Design/SnapshotsDesign.pbix
index 602025a..8b788fa 100644
Binary files a/VisualAnalytics/PowerBI/Design/SnapshotsDesign.pbix and b/VisualAnalytics/PowerBI/Design/SnapshotsDesign.pbix differ
diff --git a/VisualAnalytics/PowerBI/Templates/DetectedEntities.pbit b/VisualAnalytics/PowerBI/Templates/DetectedEntities.pbit
index 87b20d3..c6d9e4e 100644
Binary files a/VisualAnalytics/PowerBI/Templates/DetectedEntities.pbit and b/VisualAnalytics/PowerBI/Templates/DetectedEntities.pbit differ
diff --git a/VisualAnalytics/PowerBI/Templates/EntityFlowmaps.pbit b/VisualAnalytics/PowerBI/Templates/EntityFlowmaps.pbit
index f67a1f7..92fdd45 100644
Binary files a/VisualAnalytics/PowerBI/Templates/EntityFlowmaps.pbit and b/VisualAnalytics/PowerBI/Templates/EntityFlowmaps.pbit differ
diff --git a/VisualAnalytics/PowerBI/Templates/EntityMetrics.pbit b/VisualAnalytics/PowerBI/Templates/EntityMetrics.pbit
index 8968396..3e91cf2 100644
Binary files a/VisualAnalytics/PowerBI/Templates/EntityMetrics.pbit and b/VisualAnalytics/PowerBI/Templates/EntityMetrics.pbit differ
diff --git a/VisualAnalytics/PowerBI/Templates/EventsAndHealthRuleViolations.pbit b/VisualAnalytics/PowerBI/Templates/EventsAndHealthRuleViolations.pbit
index a58cb65..2304df8 100644
Binary files a/VisualAnalytics/PowerBI/Templates/EventsAndHealthRuleViolations.pbit and b/VisualAnalytics/PowerBI/Templates/EventsAndHealthRuleViolations.pbit differ
diff --git a/VisualAnalytics/PowerBI/Templates/SnapshotMethodCalls.pbit b/VisualAnalytics/PowerBI/Templates/SnapshotMethodCalls.pbit
index 4c16c18..bb41d18 100644
Binary files a/VisualAnalytics/PowerBI/Templates/SnapshotMethodCalls.pbit and b/VisualAnalytics/PowerBI/Templates/SnapshotMethodCalls.pbit differ
diff --git a/VisualAnalytics/PowerBI/Templates/Snapshots.pbit b/VisualAnalytics/PowerBI/Templates/Snapshots.pbit
index 6ca1b9c..ad0d27c 100644
Binary files a/VisualAnalytics/PowerBI/Templates/Snapshots.pbit and b/VisualAnalytics/PowerBI/Templates/Snapshots.pbit differ
diff --git a/VisualAnalytics/Tableau/Design/DetectedEntities.twb b/VisualAnalytics/Tableau/Design/DetectedEntities.twb
deleted file mode 100644
index a41a5ff..0000000
--- a/VisualAnalytics/Tableau/Design/DetectedEntities.twb
+++ /dev/null
@@ -1,1019 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
- [applications.csv]
-
- Count
- true
-
- "UTF-8"
- "en_US"
- ","
- "true"
- "en_US"
- ""
-
-
-
- Controller
- 129
- [Controller]
- [applications.csv]
- Controller
- 0
- string
- Count
- 1
- 1073741823
- true
-
-
-
- ApplicationName
- 129
- [ApplicationName]
- [applications.csv]
- ApplicationName
- 1
- string
- Count
- 1
- 1073741823
- true
-
-
-
- Description
- 129
- [Description]
- [applications.csv]
- Description
- 2
- string
- Count
- 1
- 1073741823
- true
-
-
-
- NumTiers
- 20
- [NumTiers]
- [applications.csv]
- NumTiers
- 3
- integer
- Sum
- true
-
-
- NumNodes
- 20
- [NumNodes]
- [applications.csv]
- NumNodes
- 4
- integer
- Sum
- true
-
-
- NumBackends
- 20
- [NumBackends]
- [applications.csv]
- NumBackends
- 5
- integer
- Sum
- true
-
-
- NumBTs
- 20
- [NumBTs]
- [applications.csv]
- NumBTs
- 6
- integer
- Sum
- true
-
-
- NumSEPs
- 20
- [NumSEPs]
- [applications.csv]
- NumSEPs
- 7
- integer
- Sum
- true
-
-
- NumErrors
- 20
- [NumErrors]
- [applications.csv]
- NumErrors
- 8
- integer
- Sum
- true
-
-
- NumIPs
- 20
- [NumIPs]
- [applications.csv]
- NumIPs
- 9
- integer
- Sum
- true
-
-
- ApplicationID
- 20
- [ApplicationID]
- [applications.csv]
- ApplicationID
- 10
- integer
- Sum
- true
-
-
- DetailLink
- 129
- [DetailLink]
- [applications.csv]
- DetailLink
- 11
- string
- Count
- 1
- 1073741823
- true
-
-
-
- MetricGraphLink
- 129
- [MetricGraphLink]
- [applications.csv]
- MetricGraphLink
- 12
- string
- Count
- 1
- 1073741823
- true
-
-
-
- FlameGraphLink
- 129
- [FlameGraphLink]
- [applications.csv]
- FlameGraphLink
- 13
- string
- Count
- 1
- 1073741823
- true
-
-
-
- ControllerLink
- 129
- [ControllerLink]
- [applications.csv]
- ControllerLink
- 14
- string
- Count
- 1
- 1073741823
- true
-
-
-
- ApplicationLink
- 129
- [ApplicationLink]
- [applications.csv]
- ApplicationLink
- 15
- string
- Count
- 1
- 1073741823
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ([federated.0lgqmv80uc251u1f8c1pd1wblziy].[none:Controller:nk] / [federated.0lgqmv80uc251u1f8c1pd1wblziy].[none:ApplicationName:nk])
- ([federated.0lgqmv80uc251u1f8c1pd1wblziy].[sum:NumTiers:qk] + [federated.0lgqmv80uc251u1f8c1pd1wblziy].[sum:NumBTs:qk])
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- [federated.0lgqmv80uc251u1f8c1pd1wblziy].[:Measure Names]
- [federated.0lgqmv80uc251u1f8c1pd1wblziy].[none:ApplicationName:nk]
- [federated.0lgqmv80uc251u1f8c1pd1wblziy].[none:Controller:nk]
-
-
-
-
-
-
-
- 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
- /5AkBUWSUOSN9W70xtuGwvQ0hbUydv9edg/Y6+3woD5zEDvpe69UdA2p0cfY3ukQGQGIkB7q
- Jh0AORbHW7SwiyuY9KFw9XDP6xEBIAhtzwNsCvkiSzNT5MbP88qxy9eQYx6GsYZphXHRbnKD
- sahVm8zN1knu0QnFeiDSw+ef2X/Vmo5lvY/ncS02UGdmbIlmrJPUfY+yP+PDUCRk4HhtnFLs
- 6tExNyTLoCho3P5v6eTPT1FoyTgjT/PIYJi4oaICq6/MM+P6OXqDbTv2fI4OYN+lH3ou2Em8
- aQt7cQmLPiREAAiCcKvcFpjHOF8YpBge5X/8+qOkAf/F5VMsnlvmpT8/xNrDGdS4n95r3GFc
- u45nlzj27J9xttHBkeDn+P2sTuiOhoDeKQ+wsKQ4qi9KKqaieS3M4gq1/AxHz1to+nvDJG+J
- vxtd97O3/pdMzz7KgqrxxKYLfQA2+YafePjKerwHuFiWgaToJLNBDNWDeo5afo5DZ1YpBKPc
- /ivPEsQfZEvkBUL6u/yf3w7z8I4suwbjxOQW1aVpatUaK4m99F75IpjqFwEgCO3Oc2y81WXs
- aAovlCQmSWhcMtxTiuP3VxnoLlKu2+gVl96YDCyRm59l4tky59m4uUjgKpsJdHXySLpj/Un7
- 9oamvM9UIExPNyzXpjn6/BJjkoSi+1GNMEZQQr3tEaoaih5icN9WJssL5I4s8NwJBQkZxQgR
- 3nSAHYZ6jWq8RLIvjrlW4NxPfsALioSm6ii+EJKuovu1a/cb3Ii03p5w1xCdssTm8ZOsHD/D
- y6dkFElClg30QISBDpCvDG3pRm9oC4LQHhwHL5/Hi25C9nVyVR+kHMPvL9DfU+Vo06ZU8SAG
- kpyntLLA0TfOAiApfmQ9zJZHvshodwcHRjIY8s3fG5BkGSTpJuWU9Tq/rMgbf7Feh9/YVrps
- TQlkGVmC9SjT6O6RyZ9c5Mxr4+Qdg0B2M7GB/ewOqygB5WIfgCTL6/vk8nZLkowkKxtt1FE1
- iYG9W1l94RVmT43x7lIT9Cj+ZA+jqb0MpTyMjZFQsiSx3kMhkeiNU66vsvr868y2ZLxwB5G+
- PTwYM/AHfZQv62eQUeWbBagEqIQ6BzESSYbP/AnvThQ5u1yjiUGkawfp3iBbfeuVK0/a6C+R
- JGQUJM/zbtDtIAiCIPx9JeYDEARBaFMiAARBENqUCABBEIQ2JQJAEAShTYkAEARBaFMiAARB
- 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
- rkJggg==
-
-
-
diff --git a/nuget.config b/nuget.config
deleted file mode 100644
index f095aa1..0000000
--- a/nuget.config
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/packages.config b/packages.config
index 601c752..b9a114d 100644
--- a/packages.config
+++ b/packages.config
@@ -1,10 +1,10 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages_private/EPPlus.4.5.0.1-beta.nupkg b/packages_private/EPPlus.4.5.0.1-beta.nupkg
deleted file mode 100644
index 25aecc9..0000000
Binary files a/packages_private/EPPlus.4.5.0.1-beta.nupkg and /dev/null differ