From 6c2497e2febd19d43b1288a29cb12cdf0221ad93 Mon Sep 17 00:00:00 2001 From: Martijn Laarman Date: Mon, 8 Jul 2019 13:18:48 +0200 Subject: [PATCH] Integration tests for 6.x and refactored common bits --- .../Bootstrap/ClientTestClusterBase.cs | 4 - .../ElasticsearchSinkOptionsFactory.cs | 36 +++++++++ .../Bootstrap/EphemeralClusterExtensions.cs | 54 ------------- .../Bootstrap/ProxyDetection.cs | 15 ++++ .../Bootstrap/Elasticsearch6XCluster.cs | 19 +++++ .../Bootstrap/Elasticsearch6XTestBase.cs | 50 ++++++++++++ .../Elasticsearch6/Elasticsearch6X.cs | 71 +++++++++++++++++ .../Bootstrap/Elasticsearch7XCluster.cs} | 6 +- .../Bootstrap/Elasticsearch7XTestBase.cs | 51 ++++++++++++ .../Elasticsearch7/Elasticsearch7X.cs | 67 ++++++++++++++++ .../Elasticsearch7X.cs | 79 ------------------- ...inks.Elasticsearch.IntegrationTests.csproj | 9 ++- nuget.config | 2 + serilog-sinks-elasticsearch.sln.DotSettings | 4 + .../ElasticSearch/ElasticsearchSinkOptions.cs | 10 ++- 15 files changed, 331 insertions(+), 146 deletions(-) create mode 100644 Serilog.Sinks.Elasticsearch.IntegrationTests/Bootstrap/ElasticsearchSinkOptionsFactory.cs delete mode 100644 Serilog.Sinks.Elasticsearch.IntegrationTests/Bootstrap/EphemeralClusterExtensions.cs create mode 100644 Serilog.Sinks.Elasticsearch.IntegrationTests/Bootstrap/ProxyDetection.cs create mode 100644 Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch6/Bootstrap/Elasticsearch6XCluster.cs create mode 100644 Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch6/Bootstrap/Elasticsearch6XTestBase.cs create mode 100644 Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch6/Elasticsearch6X.cs rename Serilog.Sinks.Elasticsearch.IntegrationTests/{Clusters/Elasticsearch7xCluster.cs => Elasticsearch7/Bootstrap/Elasticsearch7XCluster.cs} (63%) create mode 100644 Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch7/Bootstrap/Elasticsearch7XTestBase.cs create mode 100644 Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch7/Elasticsearch7X.cs delete mode 100644 Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch7X.cs diff --git a/Serilog.Sinks.Elasticsearch.IntegrationTests/Bootstrap/ClientTestClusterBase.cs b/Serilog.Sinks.Elasticsearch.IntegrationTests/Bootstrap/ClientTestClusterBase.cs index c355ffbb..313b6f3a 100644 --- a/Serilog.Sinks.Elasticsearch.IntegrationTests/Bootstrap/ClientTestClusterBase.cs +++ b/Serilog.Sinks.Elasticsearch.IntegrationTests/Bootstrap/ClientTestClusterBase.cs @@ -8,10 +8,6 @@ namespace Serilog.Sinks.Elasticsearch.IntegrationTests.Bootstrap public abstract class ClientTestClusterBase : XunitClusterBase { protected ClientTestClusterBase(ClientTestClusterConfiguration configuration) : base(configuration) { } - - public IElasticClient Client => this.GetOrAddClient(s => ConnectionSettings(s)); - - protected virtual ConnectionSettings ConnectionSettings(ConnectionSettings s) => s; } public class ClientTestClusterConfiguration : XunitClusterConfiguration diff --git a/Serilog.Sinks.Elasticsearch.IntegrationTests/Bootstrap/ElasticsearchSinkOptionsFactory.cs b/Serilog.Sinks.Elasticsearch.IntegrationTests/Bootstrap/ElasticsearchSinkOptionsFactory.cs new file mode 100644 index 00000000..27279840 --- /dev/null +++ b/Serilog.Sinks.Elasticsearch.IntegrationTests/Bootstrap/ElasticsearchSinkOptionsFactory.cs @@ -0,0 +1,36 @@ +using System; +using Elasticsearch.Net; + +namespace Serilog.Sinks.Elasticsearch.IntegrationTests.Bootstrap +{ + public static class ElasticsearchSinkOptionsFactory + { + public static ElasticsearchSinkOptions Create(string indexPrefix, string templateName, Action alterOptions = null) + { + // make sure we run through `ipv4.fiddler` if `fiddler` or `mitmproxy` is running + // NOTE with the latter you need to add `ipv4.fiddler` as an alias to 127.0.0.1 in your HOSTS file manually + var pool = new SingleNodeConnectionPool(new Uri($"http://{ProxyDetection.LocalOrProxyHost}:9200")); + var options = new ElasticsearchSinkOptions(pool) + { + IndexFormat = indexPrefix + "{0:yyyy.MM.dd}", + TemplateName = templateName, + }; + + alterOptions?.Invoke(options); + // here we make sure we set a proxy on the elasticsearch connection + // when we detect `mitmproxy` running. This is a cli tool similar to fiddler + // on *nix systems which aids debugging what goes over the wire + var provided = options.ModifyConnectionSettings; + options.ModifyConnectionSettings = configuration => + { + if (ProxyDetection.RunningMitmProxy) + configuration.Proxy(ProxyDetection.MitmProxyAddress, null, (string) null); + configuration = provided?.Invoke(configuration) ?? configuration; + return configuration; + }; + + return options; + } + + } +} \ No newline at end of file diff --git a/Serilog.Sinks.Elasticsearch.IntegrationTests/Bootstrap/EphemeralClusterExtensions.cs b/Serilog.Sinks.Elasticsearch.IntegrationTests/Bootstrap/EphemeralClusterExtensions.cs deleted file mode 100644 index 6db19ae3..00000000 --- a/Serilog.Sinks.Elasticsearch.IntegrationTests/Bootstrap/EphemeralClusterExtensions.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Diagnostics; -using System.Linq; -using System.Security.Cryptography.X509Certificates; -using Elastic.Managed.Ephemeral; -using Elastic.Xunit; -using Elasticsearch.Net; -using Nest; - -namespace Serilog.Sinks.Elasticsearch.IntegrationTests.Bootstrap -{ - public static class EphemeralClusterExtensions - { - private static readonly bool RunningMitmProxy = Process.GetProcessesByName("mitmproxy").Any(); - private static readonly bool RunningFiddler = Process.GetProcessesByName("fiddler").Any(); - private static string LocalOrProxyHost => RunningFiddler || RunningMitmProxy ? "ipv4.fiddler" : "localhost"; - - public static ConnectionSettings CreateConnectionSettings(this IEphemeralCluster cluster) - where TConfig : EphemeralClusterConfiguration - { - var clusterNodes = cluster.NodesUris(LocalOrProxyHost); - return new ConnectionSettings(new StaticConnectionPool(clusterNodes)); - } - - public static IElasticClient GetOrAddClient( - this IEphemeralCluster cluster, - Func modifySettings = null - ) - where TConfig : EphemeralClusterConfiguration - { - modifySettings = modifySettings ?? (s => s); - return cluster.GetOrAddClient(c => - { - var settings = modifySettings(cluster.CreateConnectionSettings()); - - var current = (IConnectionConfigurationValues)settings; - var notAlreadyAuthenticated = current.BasicAuthenticationCredentials == null && current.ClientCertificates == null; - var noCertValidation = current.ServerCertificateValidationCallback == null; - - if (cluster.ClusterConfiguration.EnableSecurity && notAlreadyAuthenticated) - settings = settings.BasicAuthentication(ClusterAuthentication.Admin.Username, ClusterAuthentication.Admin.Password); - if (cluster.ClusterConfiguration.EnableSsl && noCertValidation) - { - //todo use CA callback instead of allow all - // ReSharper disable once UnusedVariable - var ca = new X509Certificate2(cluster.ClusterConfiguration.FileSystem.CaCertificate); - settings = settings.ServerCertificateValidationCallback(CertificateValidations.AllowAll); - } - var client = new ElasticClient(settings); - return client; - }); - } - } -} \ No newline at end of file diff --git a/Serilog.Sinks.Elasticsearch.IntegrationTests/Bootstrap/ProxyDetection.cs b/Serilog.Sinks.Elasticsearch.IntegrationTests/Bootstrap/ProxyDetection.cs new file mode 100644 index 00000000..0ba27742 --- /dev/null +++ b/Serilog.Sinks.Elasticsearch.IntegrationTests/Bootstrap/ProxyDetection.cs @@ -0,0 +1,15 @@ +using System; +using System.Diagnostics; +using System.Linq; + +namespace Serilog.Sinks.Elasticsearch.IntegrationTests.Bootstrap +{ + public static class ProxyDetection + { + public static readonly bool RunningMitmProxy = Process.GetProcessesByName("mitmproxy").Any(); + private static readonly bool RunningFiddler = Process.GetProcessesByName("fiddler").Any(); + public static string LocalOrProxyHost => RunningFiddler || RunningMitmProxy ? "ipv4.fiddler" : "localhost"; + + public static readonly Uri MitmProxyAddress = new Uri("http://localhost:8080"); + } +} \ No newline at end of file diff --git a/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch6/Bootstrap/Elasticsearch6XCluster.cs b/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch6/Bootstrap/Elasticsearch6XCluster.cs new file mode 100644 index 00000000..30d6d229 --- /dev/null +++ b/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch6/Bootstrap/Elasticsearch6XCluster.cs @@ -0,0 +1,19 @@ +using Serilog.Sinks.Elasticsearch.IntegrationTests.Bootstrap; + +namespace Serilog.Sinks.Elasticsearch.IntegrationTests.Elasticsearch6.Bootstrap +{ + public class Elasticsearch6XCluster : ClientTestClusterBase + { + public Elasticsearch6XCluster() : base(CreateConfiguration()) { } + + private static ClientTestClusterConfiguration CreateConfiguration() + { + return new ClientTestClusterConfiguration("6.6.0") + { + MaxConcurrency = 1 + }; + } + + protected override void SeedCluster() { } + } +} diff --git a/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch6/Bootstrap/Elasticsearch6XTestBase.cs b/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch6/Bootstrap/Elasticsearch6XTestBase.cs new file mode 100644 index 00000000..bc4f95d9 --- /dev/null +++ b/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch6/Bootstrap/Elasticsearch6XTestBase.cs @@ -0,0 +1,50 @@ +using System; +using System.Security.Cryptography.X509Certificates; +using Elastic.Managed.Ephemeral; +using Elastic.Xunit; +using Elastic.Xunit.XunitPlumbing; +using Elasticsearch.Net6; +using Nest6; +using Serilog.Sinks.Elasticsearch.IntegrationTests.Bootstrap; + +namespace Serilog.Sinks.Elasticsearch.IntegrationTests.Elasticsearch6.Bootstrap +{ + public abstract class Elasticsearch6XTestBase : IClusterFixture + { + protected Elasticsearch6XTestBase(Elasticsearch6XCluster cluster) => Cluster = cluster; + + private Elasticsearch6XCluster Cluster { get; } + + protected IElasticClient Client => this.CreateClient(); + + protected virtual ConnectionSettings SetClusterSettings(ConnectionSettings s) => s; + + private IElasticClient CreateClient() => + Cluster.GetOrAddClient(c => + { + var clusterNodes = c.NodesUris(ProxyDetection.LocalOrProxyHost); + var settings = new ConnectionSettings(new StaticConnectionPool(clusterNodes)); + if (ProxyDetection.RunningMitmProxy) + settings = settings.Proxy(new Uri("http://localhost:8080"), null, null); + settings = SetClusterSettings(settings); + + var current = (IConnectionConfigurationValues)settings; + var notAlreadyAuthenticated = current.BasicAuthenticationCredentials == null && current.ClientCertificates == null; + var noCertValidation = current.ServerCertificateValidationCallback == null; + + var config = Cluster.ClusterConfiguration; + if (config.EnableSecurity && notAlreadyAuthenticated) + settings = settings.BasicAuthentication(ClusterAuthentication.Admin.Username, ClusterAuthentication.Admin.Password); + if (config.EnableSsl && noCertValidation) + { + //todo use CA callback instead of allow all + // ReSharper disable once UnusedVariable + var ca = new X509Certificate2(config.FileSystem.CaCertificate); + settings = settings.ServerCertificateValidationCallback(CertificateValidations.AllowAll); + } + var client = new ElasticClient(settings); + return client; + }); + } + +} diff --git a/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch6/Elasticsearch6X.cs b/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch6/Elasticsearch6X.cs new file mode 100644 index 00000000..0ac38608 --- /dev/null +++ b/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch6/Elasticsearch6X.cs @@ -0,0 +1,71 @@ +using System.Linq; +using Elastic.Xunit.XunitPlumbing; +using FluentAssertions; +using Serilog.Sinks.Elasticsearch.IntegrationTests.Bootstrap; +using Serilog.Sinks.Elasticsearch.IntegrationTests.Elasticsearch6.Bootstrap; +using Xunit; + +namespace Serilog.Sinks.Elasticsearch.IntegrationTests.Elasticsearch6 +{ + public class Elasticsearch6X : Elasticsearch6XTestBase, IClassFixture + { + private readonly SetupSerilog _setup; + + public Elasticsearch6X(Elasticsearch6XCluster cluster, SetupSerilog setup) : base(cluster) => _setup = setup; + + + [I] public void AssertTemplate() + { + var templateResponse = Client.GetIndexTemplate(t=>t.Name(SetupSerilog.TemplateName)); + templateResponse.TemplateMappings.Should().NotBeEmpty(); + templateResponse.TemplateMappings.Keys.Should().Contain(SetupSerilog.TemplateName); + + var template = templateResponse.TemplateMappings[SetupSerilog.TemplateName]; + + template.IndexPatterns.Should().Contain(pattern => pattern.StartsWith(SetupSerilog.IndexPrefix)); + } + + [I] public void AssertLogs() + { + var refreshed = Client.Refresh(SetupSerilog.IndexPrefix + "*"); + + var search = Client.Search(s => s + .Index(SetupSerilog.IndexPrefix + "*") + .Type(ElasticsearchSinkOptions.DefaultTypeName) + ); + + // Informational should be filtered + search.Documents.Count().Should().Be(4); + } + + // ReSharper disable once ClassNeverInstantiated.Global + public class SetupSerilog + { + public const string IndexPrefix = "logs-6x-"; + public const string TemplateName = "serilog-logs-6x"; + + public SetupSerilog() + { + var loggerConfig = new LoggerConfiguration() + .MinimumLevel.Information() + .WriteTo.ColoredConsole() + .WriteTo.Elasticsearch( + ElasticsearchSinkOptionsFactory.Create(IndexPrefix, TemplateName, o => + { + o.AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv6; + o.AutoRegisterTemplate = true; + }) + ); + var logger = loggerConfig.CreateLogger(); + + logger.Information("Hello Information"); + logger.Debug("Hello Debug"); + logger.Warning("Hello Warning"); + logger.Error("Hello Error"); + logger.Fatal("Hello Fatal"); + + logger.Dispose(); + } + } + } +} \ No newline at end of file diff --git a/Serilog.Sinks.Elasticsearch.IntegrationTests/Clusters/Elasticsearch7xCluster.cs b/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch7/Bootstrap/Elasticsearch7XCluster.cs similarity index 63% rename from Serilog.Sinks.Elasticsearch.IntegrationTests/Clusters/Elasticsearch7xCluster.cs rename to Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch7/Bootstrap/Elasticsearch7XCluster.cs index 8961e016..b1f2ab50 100644 --- a/Serilog.Sinks.Elasticsearch.IntegrationTests/Clusters/Elasticsearch7xCluster.cs +++ b/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch7/Bootstrap/Elasticsearch7XCluster.cs @@ -1,11 +1,7 @@ using Serilog.Sinks.Elasticsearch.IntegrationTests.Bootstrap; -namespace Serilog.Sinks.Elasticsearch.IntegrationTests.Clusters +namespace Serilog.Sinks.Elasticsearch.IntegrationTests.Elasticsearch7.Bootstrap { - /// - /// Use this cluster for APIs that do writes. If they are however intrusive or long running consider IntrusiveOperationCluster - /// instead. - /// public class Elasticsearch7XCluster : ClientTestClusterBase { public Elasticsearch7XCluster() : base(CreateConfiguration()) { } diff --git a/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch7/Bootstrap/Elasticsearch7XTestBase.cs b/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch7/Bootstrap/Elasticsearch7XTestBase.cs new file mode 100644 index 00000000..281c88fd --- /dev/null +++ b/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch7/Bootstrap/Elasticsearch7XTestBase.cs @@ -0,0 +1,51 @@ +using System; +using System.Security.Cryptography.X509Certificates; +using Elastic.Managed.Ephemeral; +using Elastic.Xunit; +using Elastic.Xunit.XunitPlumbing; +using Elasticsearch.Net; +using Nest; +using Serilog.Sinks.Elasticsearch.IntegrationTests.Bootstrap; +using Xunit; + +namespace Serilog.Sinks.Elasticsearch.IntegrationTests.Elasticsearch7.Bootstrap +{ + public abstract class Elasticsearch7XTestBase : IClusterFixture + { + protected Elasticsearch7XTestBase(Elasticsearch7XCluster cluster) => Cluster = cluster; + + private Elasticsearch7XCluster Cluster { get; } + + protected IElasticClient Client => this.CreateClient(); + + protected virtual ConnectionSettings SetClusterSettings(ConnectionSettings s) => s; + + private IElasticClient CreateClient() => + Cluster.GetOrAddClient(c => + { + var clusterNodes = c.NodesUris(ProxyDetection.LocalOrProxyHost); + var settings = new ConnectionSettings(new StaticConnectionPool(clusterNodes)); + if (ProxyDetection.RunningMitmProxy) + settings = settings.Proxy(new Uri("http://localhost:8080"), null, (string)null); + settings = SetClusterSettings(settings); + + var current = (IConnectionConfigurationValues)settings; + var notAlreadyAuthenticated = current.BasicAuthenticationCredentials == null && current.ClientCertificates == null; + var noCertValidation = current.ServerCertificateValidationCallback == null; + + var config = Cluster.ClusterConfiguration; + if (config.EnableSecurity && notAlreadyAuthenticated) + settings = settings.BasicAuthentication(ClusterAuthentication.Admin.Username, ClusterAuthentication.Admin.Password); + if (config.EnableSsl && noCertValidation) + { + //todo use CA callback instead of allow all + // ReSharper disable once UnusedVariable + var ca = new X509Certificate2(config.FileSystem.CaCertificate); + settings = settings.ServerCertificateValidationCallback(CertificateValidations.AllowAll); + } + var client = new ElasticClient(settings); + return client; + }); + } + +} diff --git a/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch7/Elasticsearch7X.cs b/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch7/Elasticsearch7X.cs new file mode 100644 index 00000000..f025546d --- /dev/null +++ b/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch7/Elasticsearch7X.cs @@ -0,0 +1,67 @@ +using System.Linq; +using Elastic.Xunit.XunitPlumbing; +using FluentAssertions; +using Serilog.Sinks.Elasticsearch.IntegrationTests.Bootstrap; +using Serilog.Sinks.Elasticsearch.IntegrationTests.Elasticsearch7.Bootstrap; +using Xunit; + +namespace Serilog.Sinks.Elasticsearch.IntegrationTests.Elasticsearch7 +{ + public class Elasticsearch7X : Elasticsearch7XTestBase, IClassFixture + { + private readonly SetupSerilog _setup; + + public Elasticsearch7X(Elasticsearch7XCluster cluster, SetupSerilog setup) : base(cluster) => _setup = setup; + + [I] public void AssertTemplate() + { + var templateResponse = Client.Indices.GetTemplate(SetupSerilog.TemplateName); + templateResponse.TemplateMappings.Should().NotBeEmpty(); + templateResponse.TemplateMappings.Keys.Should().Contain(SetupSerilog.TemplateName); + + var template = templateResponse.TemplateMappings[SetupSerilog.TemplateName]; + + template.IndexPatterns.Should().Contain(pattern => pattern.StartsWith(SetupSerilog.IndexPrefix)); + } + + [I] public void AssertLogs() + { + var refreshed = Client.Indices.Refresh(SetupSerilog.IndexPrefix + "*"); + + var search = Client.Search(s => s.Index(SetupSerilog.IndexPrefix + "*")); + + // Informational should be filtered + search.Documents.Count().Should().Be(4); + } + + // ReSharper disable once ClassNeverInstantiated.Global + public class SetupSerilog + { + public const string IndexPrefix = "logs-7x-"; + public const string TemplateName = "serilog-logs-7x"; + + public SetupSerilog() + { + var loggerConfig = new LoggerConfiguration() + .MinimumLevel.Information() + .WriteTo.ColoredConsole() + .WriteTo.Elasticsearch( + ElasticsearchSinkOptionsFactory.Create(IndexPrefix, TemplateName, o => + { + o.AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv7; + o.AutoRegisterTemplate = true; + }) + ); + using (var logger = loggerConfig.CreateLogger()) + { + logger.Information("Hello Information"); + logger.Debug("Hello Debug"); + logger.Warning("Hello Warning"); + logger.Error("Hello Error"); + logger.Fatal("Hello Fatal"); + } + } + } + + } +} \ No newline at end of file diff --git a/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch7X.cs b/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch7X.cs deleted file mode 100644 index dd9d3249..00000000 --- a/Serilog.Sinks.Elasticsearch.IntegrationTests/Elasticsearch7X.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System.Linq; -using Elastic.Managed.Ephemeral; -using Elastic.Xunit; -using Elastic.Xunit.XunitPlumbing; -using FluentAssertions; -using Nest; -using Serilog.Core; -using Serilog.Sinks.Elasticsearch.IntegrationTests.Clusters; -using Xunit; - -namespace Serilog.Sinks.Elasticsearch.IntegrationTests -{ - public class Elasticsearch7XSetup - { - public const string IndexPrefix = "logs-7x-"; - public const string TemplateName = "serilog-logs-7x"; - public Elasticsearch7XSetup() - { - var loggerConfig = new LoggerConfiguration() - .MinimumLevel.Information() - .WriteTo.ColoredConsole() - .WriteTo.Elasticsearch(new ElasticsearchSinkOptions - { - - IndexFormat = IndexPrefix + "{0:yyyy.MM.dd}", - TemplateName = TemplateName, - AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv7, - AutoRegisterTemplate = true - }); - var logger = loggerConfig.CreateLogger(); - - logger.Information("Hello Information"); - logger.Debug("Hello Debug"); - logger.Warning("Hello Warning"); - logger.Error("Hello Error"); - logger.Fatal("Hello Fatal"); - - logger.Dispose(); - } - - } - - - public class Elasticsearch7X : IClusterFixture, IClassFixture - { - private readonly Elasticsearch7XCluster _cluster; - private IElasticClient _client; - - public Elasticsearch7X(Elasticsearch7XCluster cluster, Elasticsearch7XSetup setup) - { - _cluster = cluster; - _client = cluster.Client; - } - - - [I] public void AssertTemplate() - { - var templateResponse = _client.Indices.GetTemplate(Elasticsearch7XSetup.TemplateName); - templateResponse.TemplateMappings.Should().NotBeEmpty(); - templateResponse.TemplateMappings.Keys.Should().Contain(Elasticsearch7XSetup.TemplateName); - - var template = templateResponse.TemplateMappings[Elasticsearch7XSetup.TemplateName]; - - template.IndexPatterns.Should().Contain(pattern => pattern.StartsWith(Elasticsearch7XSetup.IndexPrefix)); - - } - [I] public void AssertLogs() - { - var refreshed = _client.Indices.Refresh(Elasticsearch7XSetup.IndexPrefix + "*"); - - var search = _client.Search(s => s.Index(Elasticsearch7XSetup.IndexPrefix + "*")); - - // Informational should be filtered - search.Documents.Count().Should().Be(4); - - - } - } -} \ No newline at end of file diff --git a/Serilog.Sinks.Elasticsearch.IntegrationTests/Serilog.Sinks.Elasticsearch.IntegrationTests.csproj b/Serilog.Sinks.Elasticsearch.IntegrationTests/Serilog.Sinks.Elasticsearch.IntegrationTests.csproj index a6a57003..fcd70c4e 100644 --- a/Serilog.Sinks.Elasticsearch.IntegrationTests/Serilog.Sinks.Elasticsearch.IntegrationTests.csproj +++ b/Serilog.Sinks.Elasticsearch.IntegrationTests/Serilog.Sinks.Elasticsearch.IntegrationTests.csproj @@ -12,15 +12,20 @@ + + - - + + + + + diff --git a/nuget.config b/nuget.config index 96116f07..a81fc3ec 100644 --- a/nuget.config +++ b/nuget.config @@ -11,5 +11,7 @@ + + \ No newline at end of file diff --git a/serilog-sinks-elasticsearch.sln.DotSettings b/serilog-sinks-elasticsearch.sln.DotSettings index 95859094..e62f9e23 100644 --- a/serilog-sinks-elasticsearch.sln.DotSettings +++ b/serilog-sinks-elasticsearch.sln.DotSettings @@ -1,4 +1,8 @@  + True True + True + True + True True True \ No newline at end of file diff --git a/src/Serilog.Sinks.Elasticsearch/Sinks/ElasticSearch/ElasticsearchSinkOptions.cs b/src/Serilog.Sinks.Elasticsearch/Sinks/ElasticSearch/ElasticsearchSinkOptions.cs index 29ccb503..fb3334d0 100644 --- a/src/Serilog.Sinks.Elasticsearch/Sinks/ElasticSearch/ElasticsearchSinkOptions.cs +++ b/src/Serilog.Sinks.Elasticsearch/Sinks/ElasticSearch/ElasticsearchSinkOptions.cs @@ -159,7 +159,7 @@ public class ElasticsearchSinkOptions public IElasticsearchSerializer Serializer { get; set; } /// - /// The connectionpool describing the cluster to write event to + /// The connection pool describing the cluster to write event to /// public IConnectionPool ConnectionPool { get; private set; } @@ -259,7 +259,7 @@ public ElasticsearchSinkOptions() { this.IndexFormat = "logstash-{0:yyyy.MM.dd}"; this.DeadLetterIndexName = "deadletter-{0:yyyy.MM.dd}"; - this.TypeName = "logevent"; + this.TypeName = DefaultTypeName; this.Period = TimeSpan.FromSeconds(2); this.BatchPostingLimit = 50; this.SingleEventSizePostingLimit = null; @@ -274,6 +274,12 @@ public ElasticsearchSinkOptions() this.ConnectionPool = new SingleNodeConnectionPool(_defaultNode); } + /// + /// The default Elasticsearch type name used for Elasticsearch versions prior to 7. + /// As of Elasticsearch 7 and up _type has been removed. + /// + public static string DefaultTypeName { get; } = "logevent"; + /// /// Configures the elasticsearch sink ///