13 Commits

Author SHA1 Message Date
Greg Lutz
91a69cbfe2 versioning 2015-07-02 12:44:22 -04:00
Greg Lutz
8a08e8ef65 choco build 2 2015-07-02 10:59:55 -04:00
Greg Lutz
435fa501f0 choco build 2015-07-02 10:54:17 -04:00
Greg Lutz
421a5b8e0b IDiagnosable 2015-06-26 14:20:04 -04:00
Greg Lutz
569b2711cc moved wait to finally block 2015-06-26 09:31:31 -04:00
Greg Lutz
460aa3229e Merge branch 'rel-1.3.27.0' of https://github.com/Cimpress-MCP/TimberWinR into rel-1.3.27.0 2015-06-25 13:27:17 -04:00
Greg Lutz
b9758affac correct assembly version 2015-06-25 13:26:33 -04:00
Greg Lutz
c90869592b Merge pull request #54 from Cimpress-MCP/rel-2.0.0
Backing off plan for rel 2.0.0
2015-06-25 13:19:56 -04:00
Greg Lutz
2c9d998794 moved wait to finally block 2015-06-25 07:32:11 -04:00
Greg Lutz
7d43c2cb67 backing off 2.0 plan 2015-06-25 06:48:12 -04:00
Greg Lutz
45e4e80488 typo aka sloppy cut and paste 2015-06-23 09:59:56 -04:00
Greg Lutz
097ffd34c3 version 2 2015-06-23 06:54:36 -04:00
Greg Lutz
8694ede85d redis last output time and refactored diagnostics 2015-06-19 11:33:56 -04:00
11 changed files with 171 additions and 51 deletions

View File

@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.3.26.0")] [assembly: AssemblyVersion("1.3.27.0")]
[assembly: AssemblyFileVersion("1.3.26.0")] [assembly: AssemblyFileVersion("1.3.27.0")]

View File

@@ -8,7 +8,7 @@ using System.Threading;
using System.Net; using System.Net;
using System.Net.Sockets; using System.Net.Sockets;
using System.IO; using System.IO;
using System.Linq.Expressions;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using NLog; using NLog;
@@ -52,29 +52,48 @@ namespace TimberWinR.Diagnostics
public JObject DiagnosticsOutput() public JObject DiagnosticsOutput()
{ {
JObject json = new JObject( JObject json = new JObject(
new JProperty("timberwinr", new JProperty("timberwinr",
new JObject( new JObject(
new JProperty("version", Assembly.GetEntryAssembly().GetName().Version.ToString()), new JProperty("version", Assembly.GetEntryAssembly().GetName().Version.ToString()),
new JProperty("messages", Manager.NumMessages), new JProperty("messages", Manager.NumMessages),
new JProperty("startedon", Manager.StartedOn), new JProperty("startedon", Manager.StartedOn),
new JProperty("configfile", Manager.JsonConfig), new JProperty("configfile", Manager.JsonConfig),
new JProperty("logdir", Manager.LogfileDir), new JProperty("logdir", Manager.LogfileDir),
new JProperty("logginglevel", LogManager.GlobalThreshold.ToString()), new JProperty("logginglevel", LogManager.GlobalThreshold.ToString())
new JProperty("inputs", )));
new JArray( AddDiagnosis(json);
from i in Manager.Listeners
select new JObject(i.ToJson()))),
new JProperty("filters",
new JArray(
from f in Manager.Config.Filters
select new JObject(f.ToJson()))),
new JProperty("outputs",
new JArray(
from o in Manager.Outputs
select new JObject(o.ToJson()))))));
return json; return json;
} }
protected void AddDiagnosis(JObject wrapper)
{
wrapper.Add("inputs", GetDiagnosisByType("inputs", Manager.Listeners.ToList<IDiagnosable>()));
wrapper.Add("filters", GetDiagnosisByType("filters", Manager.Config.Filters.ToList<IDiagnosable>()));
wrapper.Add("outputs", GetDiagnosisByType("inputs", Manager.Outputs.ToList<IDiagnosable>()));
}
protected JObject GetDiagnosisByType(String type, List<IDiagnosable> diags)
{
JObject category = new JObject();
foreach(IDiagnosable diag in diags)
{
JArray array = GetTypeArray(diag.GetType().Name.ToString(), category);
array.Add(diag.ToJson());
}
return category;
}
protected JArray GetTypeArray(String name, JObject category)
{
JArray ret = (JArray)category.GetValue(name);
if (ret == null)
{
ret = new JArray();
category.Add(new JProperty(name, ret));
}
return ret;
}
private void DiagnosticCallback(IAsyncResult result) private void DiagnosticCallback(IAsyncResult result)
{ {
if (web == null) if (web == null)

View File

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json.Linq;
namespace TimberWinR.Diagnostics
{
public interface IDiagnosable
{
JObject ToJson();
}
}

View File

@@ -135,8 +135,6 @@ namespace TimberWinR.Inputs
rs.close(); rs.close();
GC.Collect(); GC.Collect();
} }
if (!Stop)
syncHandle.Wait(TimeSpan.FromSeconds(_pollingIntervalInSeconds), CancelToken);
} }
catch (OperationCanceledException) catch (OperationCanceledException)
{ {
@@ -145,7 +143,18 @@ namespace TimberWinR.Inputs
catch (Exception ex) catch (Exception ex)
{ {
LogManager.GetCurrentClassLogger().Error(ex); LogManager.GetCurrentClassLogger().Error(ex);
} }
finally
{
try
{
if (!Stop)
syncHandle.Wait(TimeSpan.FromSeconds(_pollingIntervalInSeconds), CancelToken);
}
catch (Exception)
{
}
}
} }
} }
} }

View File

@@ -8,10 +8,11 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using NLog; using NLog;
using TimberWinR.Diagnostics;
namespace TimberWinR.Inputs namespace TimberWinR.Inputs
{ {
public abstract class InputListener public abstract class InputListener: IDiagnosable
{ {
public CancellationToken CancelToken { get; set; } public CancellationToken CancelToken { get; set; }
public event Action<JObject> OnMessageRecieved; public event Action<JObject> OnMessageRecieved;

View File

@@ -8,6 +8,7 @@ using TimberWinR.Parser;
using LogQuery = Interop.MSUtil.LogQueryClassClass; using LogQuery = Interop.MSUtil.LogQueryClassClass;
using EventLogInputFormat = Interop.MSUtil.COMEventLogInputContextClassClass; using EventLogInputFormat = Interop.MSUtil.COMEventLogInputContextClassClass;
using LogRecordSet = Interop.MSUtil.ILogRecordset; using LogRecordSet = Interop.MSUtil.ILogRecordset;
using System.IO;
namespace TimberWinR.Inputs namespace TimberWinR.Inputs
{ {
@@ -97,12 +98,13 @@ namespace TimberWinR.Inputs
// Execute the query // Execute the query
if (!CancelToken.IsCancellationRequested) if (!CancelToken.IsCancellationRequested)
{ {
var oLogQuery = new LogQuery();
try try
{ {
var oLogQuery = new LogQuery();
var qfiles = string.Format("SELECT Distinct [EventLog] FROM {0}", location); var qfiles = string.Format("SELECT Distinct [EventLog] FROM {0}", location);
var rsfiles = oLogQuery.Execute(qfiles, iFmt); var rsfiles = oLogQuery.Execute(qfiles, iFmt);
for (; !rsfiles.atEnd(); rsfiles.moveNext()) for (; !rsfiles.atEnd(); rsfiles.moveNext())
{ {
var record = rsfiles.getRecord(); var record = rsfiles.getRecord();
@@ -113,7 +115,7 @@ namespace TimberWinR.Inputs
logName); logName);
var rcount = oLogQuery.Execute(qcount, iFmt); var rcount = oLogQuery.Execute(qcount, iFmt);
var qr = rcount.getRecord(); var qr = rcount.getRecord();
var lrn = (Int64)qr.getValueEx("MaxRecordNumber"); var lrn = (Int64) qr.getValueEx("MaxRecordNumber");
logFileMaxRecords[logName] = lrn; logFileMaxRecords[logName] = lrn;
} }
} }
@@ -137,12 +139,13 @@ namespace TimberWinR.Inputs
object v = record.getValue(field.Name); object v = record.getValue(field.Name);
if (field.Name == "Data") if (field.Name == "Data")
v = ToPrintable(v.ToString()); v = ToPrintable(v.ToString());
if ((field.Name == "TimeGenerated" || field.Name == "TimeWritten") && field.DataType == typeof (DateTime)) if ((field.Name == "TimeGenerated" || field.Name == "TimeWritten") &&
field.DataType == typeof (DateTime))
v = ((DateTime) v).ToUniversalTime(); v = ((DateTime) v).ToUniversalTime();
json.Add(new JProperty(field.Name, v)); json.Add(new JProperty(field.Name, v));
} }
var lrn = (Int64)record.getValueEx("RecordNumber"); var lrn = (Int64) record.getValueEx("RecordNumber");
logFileMaxRecords[fileName] = lrn; logFileMaxRecords[fileName] = lrn;
ProcessJson(json); ProcessJson(json);
@@ -163,6 +166,24 @@ namespace TimberWinR.Inputs
{ {
LogManager.GetCurrentClassLogger().Error(ex); LogManager.GetCurrentClassLogger().Error(ex);
} }
finally
{
try
{
oLogQuery = null;
// Sleep
if (!Stop)
syncHandle.Wait(TimeSpan.FromSeconds(_pollingIntervalInSeconds), CancelToken);
}
catch (OperationCanceledException)
{
}
catch (Exception ex1)
{
LogManager.GetCurrentClassLogger().Warn(ex1);
}
}
} }
} }
Finished(); Finished();

View File

@@ -4,11 +4,12 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using TimberWinR.Diagnostics;
using TimberWinR.Inputs; using TimberWinR.Inputs;
namespace TimberWinR.Outputs namespace TimberWinR.Outputs
{ {
public abstract class OutputSender public abstract class OutputSender : IDiagnosable
{ {
public CancellationToken CancelToken { get; private set; } public CancellationToken CancelToken { get; private set; }
private List<InputListener> _inputs; private List<InputListener> _inputs;

View File

@@ -132,6 +132,7 @@ namespace TimberWinR.Outputs
private long _errorCount; private long _errorCount;
private long _redisDepth; private long _redisDepth;
private DateTime? _lastErrorTimeUTC; private DateTime? _lastErrorTimeUTC;
private DateTime? _lastSentTimeUTC;
private readonly int _maxQueueSize; private readonly int _maxQueueSize;
private readonly bool _queueOverflowDiscardOldest; private readonly bool _queueOverflowDiscardOldest;
private BatchCounter _batchCounter; private BatchCounter _batchCounter;
@@ -180,6 +181,7 @@ namespace TimberWinR.Outputs
new JProperty("host", string.Join(",", _redisHosts)), new JProperty("host", string.Join(",", _redisHosts)),
new JProperty("errors", _errorCount), new JProperty("errors", _errorCount),
new JProperty("lastErrorTimeUTC", _lastErrorTimeUTC), new JProperty("lastErrorTimeUTC", _lastErrorTimeUTC),
new JProperty("lastSentTimeUTC", _lastSentTimeUTC),
new JProperty("redisQueueDepth", _redisDepth), new JProperty("redisQueueDepth", _redisDepth),
new JProperty("sentMessageCount", _sentMessages), new JProperty("sentMessageCount", _sentMessages),
new JProperty("queuedMessageCount", _jsonQueue.Count), new JProperty("queuedMessageCount", _jsonQueue.Count),
@@ -317,9 +319,13 @@ namespace TimberWinR.Outputs
_batchCounter.SampleQueueDepth(_jsonQueue.Count); _batchCounter.SampleQueueDepth(_jsonQueue.Count);
// Re-compute current batch size // Re-compute current batch size
LogManager.GetCurrentClassLogger().Trace("{0}: Average Queue Depth: {1}, Current Length: {2}", Thread.CurrentThread.ManagedThreadId, _batchCounter.AverageQueueDepth(), _jsonQueue.Count); LogManager.GetCurrentClassLogger()
.Trace("{0}: Average Queue Depth: {1}, Current Length: {2}",
_currentBatchCount = _batchCounter.UpdateCurrentBatchCount(_jsonQueue.Count, _currentBatchCount); Thread.CurrentThread.ManagedThreadId, _batchCounter.AverageQueueDepth(),
_jsonQueue.Count);
_currentBatchCount = _batchCounter.UpdateCurrentBatchCount(_jsonQueue.Count,
_currentBatchCount);
messages = _jsonQueue.Take(_currentBatchCount).ToArray(); messages = _jsonQueue.Take(_currentBatchCount).ToArray();
_jsonQueue.RemoveRange(0, messages.Length); _jsonQueue.RemoveRange(0, messages.Length);
@@ -340,7 +346,9 @@ namespace TimberWinR.Outputs
{ {
client.StartPipe(); client.StartPipe();
LogManager.GetCurrentClassLogger() LogManager.GetCurrentClassLogger()
.Debug("{0}: Sending {1} Messages to {2}", Thread.CurrentThread.ManagedThreadId, messages.Length, client.Host); .Debug("{0}: Sending {1} Messages to {2}",
Thread.CurrentThread.ManagedThreadId, messages.Length,
client.Host);
try try
{ {
@@ -348,6 +356,7 @@ namespace TimberWinR.Outputs
Interlocked.Add(ref _sentMessages, messages.Length); Interlocked.Add(ref _sentMessages, messages.Length);
client.EndPipe(); client.EndPipe();
sentSuccessfully = true; sentSuccessfully = true;
_lastSentTimeUTC = DateTime.UtcNow;
if (messages.Length > 0) if (messages.Length > 0)
_manager.IncrementMessageCount(messages.Length); _manager.IncrementMessageCount(messages.Length);
} }
@@ -391,9 +400,7 @@ namespace TimberWinR.Outputs
_jsonQueue.InsertRange(0, messages); _jsonQueue.InsertRange(0, messages);
} }
} }
} }
if (!Stop)
syncHandle.Wait(TimeSpan.FromMilliseconds(_interval), CancelToken);
} }
catch (OperationCanceledException) catch (OperationCanceledException)
{ {
@@ -409,6 +416,17 @@ namespace TimberWinR.Outputs
Interlocked.Increment(ref _errorCount); Interlocked.Increment(ref _errorCount);
LogManager.GetCurrentClassLogger().Error(ex); LogManager.GetCurrentClassLogger().Error(ex);
} }
finally
{
try
{
if (!Stop)
syncHandle.Wait(TimeSpan.FromMilliseconds(_interval), CancelToken);
}
catch (Exception)
{
}
}
} }
} }
} }

View File

@@ -15,6 +15,7 @@ using NLog;
using NLog.Config; using NLog.Config;
using TimberWinR.Outputs; using TimberWinR.Outputs;
using System.CodeDom.Compiler; using System.CodeDom.Compiler;
using TimberWinR.Diagnostics;
namespace TimberWinR.Parser namespace TimberWinR.Parser
{ {
@@ -26,7 +27,7 @@ namespace TimberWinR.Parser
} }
public abstract class LogstashFilter : IValidateSchema public abstract class LogstashFilter : IValidateSchema, IDiagnosable
{ {
public abstract bool Apply(JObject json); public abstract bool Apply(JObject json);

View File

@@ -96,6 +96,7 @@
<Compile Include="Configuration.cs" /> <Compile Include="Configuration.cs" />
<Compile Include="ConfigurationErrors.cs" /> <Compile Include="ConfigurationErrors.cs" />
<Compile Include="Diagnostics\Diagnostics.cs" /> <Compile Include="Diagnostics\Diagnostics.cs" />
<Compile Include="Diagnostics\IDiagnosable.cs" />
<Compile Include="Filters\DateFilter.cs" /> <Compile Include="Filters\DateFilter.cs" />
<Compile Include="Filters\FilterBase.cs" /> <Compile Include="Filters\FilterBase.cs" />
<Compile Include="Filters\GrokFilter.cs" /> <Compile Include="Filters\GrokFilter.cs" />

View File

@@ -1,14 +1,50 @@
version: 1.2.{build} version: build_number_{build}
configuration: Release
build: skip_tags: true
verbosity: minimal init:
- ps: "$v = [regex]::match($env:APPVEYOR_REPO_BRANCH,'release/(.*)').Groups[1].Value\nWrite-Host \"On branch $($env:APPVEYOR_REPO_BRANCH)\"\nIF($v) { \n $env:VERSION_FROM_BRANCH = \"$($v).$($env:APPVEYOR_BUILD_NUMBER)\"\n} else {\n $env:VERSION_FROM_BRANCH = \"0.0.0.$($env:APPVEYOR_BUILD_NUMBER)\"\n}\nWrite-Host \"Set version to $($env:VERSION_FROM_BRANCH)\""
assembly_info: assembly_info:
patch: true patch: true
file: AssemblyInfo.* file: '**\AssemblyInfo.*'
assembly_version: "1.2.{build}" assembly_version: $(VERSION_FROM_BRANCH)
assembly_file_version: "{version}" assembly_file_version: $(VERSION_FROM_BRANCH)
assembly_informational_version: "{version}" assembly_informational_version: $(VERSION_FROM_BRANCH)
before_build:
- ps: >-
mkdir tools
NuGet.exe restore TimberWinR.sln
build:
verbosity: normal
after_build:
- ps: >-
cat chocolateyInstall.ps1.template|%{$_-replace "\$\{version\}",$env:VERSION_FROM_BRANCH} > tools\chocolateyInstall.ps1
cat chocolateyUninstall.ps1.template|%{$_-replace "\$\{version\}",$env:VERSION_FROM_BRANCH} > tools\chocolateyUninstall.ps1
cat tools\chocolateyUninstall.ps1
cat timberwinr.nuspec.template|%{$_-replace "\$\{version\}",$env:VERSION_FROM_BRANCH} > timberwinr.nuspec
choco pack timberwinr.nuspec
artifacts: artifacts:
- path: '**\*.msi' - path: .\*.nupkg
name: NuGet
- path: TimberWinR.ServiceHost\bin\*\*.dll
name: Dlls
- path: TimberWinR.ServiceHost\bin\*\*.exe
name: Exes
- path: TimberWix\bin\*\*.msi
name: MSI
deploy:
- provider: NuGet
server: https://chocolatey.org/
skip_symbols: true
artifact: NuGet
on:
branch: /release/.*/
- provider: GitHub
release: $(VERSION_FROM_BRANCH)
artifact: Dlls, Exes, MSI
on:
branch: /release/.*/