From 66b07e71c7f097bb460a5617224e93dcda2ac4c8 Mon Sep 17 00:00:00 2001 From: Steve Gordon Date: Wed, 3 May 2023 12:19:28 +0100 Subject: [PATCH] Add initial benchmarks and profiling projects --- .../Benchmarks/BulkIngestion.cs | 69 ++++++++++++++ ...tic.Ingest.Elasticsearch.Benchmarks.csproj | 22 +++++ .../Program.cs | 28 ++++++ .../Results/BulkAll.txt | 34 +++++++ ...stic.Ingest.Elasticsearch.Profiling.csproj | 19 ++++ .../Program.cs | 82 +++++++++++++++++ .../Performance.Common.csproj | 9 ++ benchmarks/Performance.Common/StockData.cs | 90 +++++++++++++++++++ elastic-ingest-dotnet.sln | 88 ++++++++++++------ 9 files changed, 413 insertions(+), 28 deletions(-) create mode 100644 benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks/Benchmarks/BulkIngestion.cs create mode 100644 benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks.csproj create mode 100644 benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks/Program.cs create mode 100644 benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks/Results/BulkAll.txt create mode 100644 benchmarks/Elastic.Ingest.Elasticsearch.Profiling/Elastic.Ingest.Elasticsearch.Profiling.csproj create mode 100644 benchmarks/Elastic.Ingest.Elasticsearch.Profiling/Program.cs create mode 100644 benchmarks/Performance.Common/Performance.Common.csproj create mode 100644 benchmarks/Performance.Common/StockData.cs diff --git a/benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks/Benchmarks/BulkIngestion.cs b/benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks/Benchmarks/BulkIngestion.cs new file mode 100644 index 0000000..9632089 --- /dev/null +++ b/benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks/Benchmarks/BulkIngestion.cs @@ -0,0 +1,69 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information + +using BenchmarkDotNet.Engines; +using Performance.Common; + +namespace Elastic.Ingest.Elasticsearch.Benchmarks; + +[SimpleJob(RunStrategy.Monitoring, invocationCount: 20, id: "BulkIngestionJob")] +public class BulkIngestion +{ + private static readonly int MaxExportSize = 5_000; + + private readonly ManualResetEvent _waitHandle = new(false); + private StockData[] _data = Array.Empty(); + private IndexChannelOptions? _options; + +#if DEBUG + private long _responses; +#endif + + //[Params(100_000)] + public int DocumentsToIndex { get; set; } = 100_000; + + [ParamsAllValues] + public bool DisableDiagnostics { get; set; } + + [GlobalSetup] + public void Setup() + { + _data = StockData.CreateSampleData(DocumentsToIndex); + + var transport = new DefaultHttpTransport( + new TransportConfiguration( + new SingleNodePool(new("http://localhost:9200")), + new InMemoryConnection(StockData.CreateSampleDataSuccessWithFilterPathResponseBytes(MaxExportSize)))); + + _options = new IndexChannelOptions(transport) + { + BufferOptions = new Channels.BufferOptions + { + OutboundBufferMaxSize = MaxExportSize + }, + DisableDiagnostics = DisableDiagnostics, + IndexFormat = "stock-data-v8", + OutboundChannelExitedCallback = () => _waitHandle.Set(), +#if DEBUG + ExportResponseCallback = (response, a) => + { + Interlocked.Add(ref _responses, a.Count); + Console.WriteLine(_responses); + }, + PublishToOutboundChannelCallback = () => Console.WriteLine("PUBLISHED") +#endif + }; + } + + [Benchmark] + public void BulkAll() + { + var channel = new IndexChannel(_options!); + + channel.TryWriteMany(_data); + channel.TryComplete(); + + _waitHandle.WaitOne(); + } +} diff --git a/benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks.csproj b/benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks.csproj new file mode 100644 index 0000000..5889769 --- /dev/null +++ b/benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks.csproj @@ -0,0 +1,22 @@ + + + + Exe + net6.0 + enable + enable + true + pdbonly + true + + + + + + + + + + + + diff --git a/benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks/Program.cs b/benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks/Program.cs new file mode 100644 index 0000000..f6e7e3d --- /dev/null +++ b/benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks/Program.cs @@ -0,0 +1,28 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information + +global using Elastic.Transport; +global using Elastic.Ingest.Elasticsearch.Benchmarks; +global using Elastic.Ingest.Elasticsearch.Indices; +global using BenchmarkDotNet.Attributes; + +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Diagnosers; +using BenchmarkDotNet.Reports; +using BenchmarkDotNet.Running; +using System.Globalization; + +#if DEBUG +// MANUALLY RUN A BENCHMARKED METHOD DURING DEBUGGING +//var bm = new BulkIngestion(); +//bm.Setup(); +//await bm.BulkAllAsync(); +//Console.WriteLine("DONE"); +#else +var config = ManualConfig.Create(DefaultConfig.Instance); +config.SummaryStyle = new SummaryStyle(CultureInfo.CurrentCulture, true, BenchmarkDotNet.Columns.SizeUnit.B, null!, ratioStyle: BenchmarkDotNet.Columns.RatioStyle.Percentage); +config.AddDiagnoser(MemoryDiagnoser.Default); + +BenchmarkRunner.Run(config); +#endif diff --git a/benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks/Results/BulkAll.txt b/benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks/Results/BulkAll.txt new file mode 100644 index 0000000..4107a59 --- /dev/null +++ b/benchmarks/Elastic.Ingest.Elasticsearch.Benchmarks/Results/BulkAll.txt @@ -0,0 +1,34 @@ +FUTURE: Automate benchmarks and export to Elasticsearch as part of CI (GitHub actions) such that we can identify and flag any potential regressions and track improvements over time. +FUTURE: Introduce micro benchmarks for specific areas of ingestion as we target optimisations. + +BulkIngestion.BulkAll +--------------------- + +An end-to-end (in-memory) macro benchmark of indexing many events, including channel creation. +This has some variance between runs and is configured with the monitoring strategy. + +Baseline for commit 8eef0e1dfbee8c5198ec0ab975b5d826e2356fcd (from 2023-05-02) in main. + +50k events + +| Method | DisableDiagnostics | Mean [ms] | Error [ms] | StdDev [ms] | Gen0 | Gen1 | Gen2 | Allocated [B] | +|-------- |------------------- |----------:|-----------:|------------:|----------:|----------:|---------:|--------------:| +| BulkAll | False | 91.34 ms | 4.409 ms | 12.79 ms | 6187.5000 | 2562.5000 | 437.5000 | 57612712 B | +| BulkAll | True | 92.43 ms | 5.235 ms | 15.27 ms | 6875.0000 | 2750.0000 | 625.0000 | 63323152 B | + +| Method | DisableDiagnostics | Mean [ms] | Error [ms] | StdDev [ms] | Gen0 | Gen1 | Gen2 | Allocated [B] | +|-------- |------------------- |----------:|-----------:|------------:|----------:|----------:|---------:|--------------:| +| BulkAll | False | 68.40 ms | 18.58 ms | 12.29 ms | 7300.0000 | 2900.0000 | 800.0000 | 65352481 B | +| BulkAll | True | 65.23 ms | 20.96 ms | 13.86 ms | 6800.0000 | 3000.0000 | 700.0000 | 61077358 B | + +100k events + +| Method | DisableDiagnostics | Mean [ms] | Error [ms] | StdDev [ms] | Gen0 | Gen1 | Gen2 | Allocated [B] | +|-------- |------------------- |----------:|-----------:|------------:|----------:|----------:|---------:|--------------:| +| BulkAll | False | 83.54 ms | 15.04 ms | 9.947 ms | 7600.0000 | 2800.0000 | 300.0000 | 78001143 B | +| BulkAll | True | 74.30 ms | 11.69 ms | 7.734 ms | 7500.0000 | 2800.0000 | 300.0000 | 76354498 B | + +| Method | DisableDiagnostics | Mean [ms] | Error [ms] | StdDev [ms] | Gen0 | Gen1 | Gen2 | Allocated [B] | +|-------- |------------------- |----------:|-----------:|------------:|----------:|----------:|---------:|--------------:| +| BulkAll | False | 86.79 ms | 18.78 ms | 12.423 ms | 8150.0000 | 3250.0000 | 300.0000 | 83103930 B | +| BulkAll | True | 94.95 ms | 14.55 ms | 9.627 ms | 7250.0000 | 2950.0000 | 250.0000 | 74070402 B | \ No newline at end of file diff --git a/benchmarks/Elastic.Ingest.Elasticsearch.Profiling/Elastic.Ingest.Elasticsearch.Profiling.csproj b/benchmarks/Elastic.Ingest.Elasticsearch.Profiling/Elastic.Ingest.Elasticsearch.Profiling.csproj new file mode 100644 index 0000000..898d10d --- /dev/null +++ b/benchmarks/Elastic.Ingest.Elasticsearch.Profiling/Elastic.Ingest.Elasticsearch.Profiling.csproj @@ -0,0 +1,19 @@ + + + + Exe + net6.0 + enable + enable + + + + + + + + + + + + diff --git a/benchmarks/Elastic.Ingest.Elasticsearch.Profiling/Program.cs b/benchmarks/Elastic.Ingest.Elasticsearch.Profiling/Program.cs new file mode 100644 index 0000000..80b8410 --- /dev/null +++ b/benchmarks/Elastic.Ingest.Elasticsearch.Profiling/Program.cs @@ -0,0 +1,82 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information + +using Elastic.Channels; +using Elastic.Ingest.Elasticsearch.Indices; +using Performance.Common; +using Elastic.Transport; +using JetBrains.Profiler.Api; + +#if DEBUG +long responses = 0; +#endif + +var disableDiagnostics = true; + +var waitHandle = new ManualResetEvent(false); +var stockData = StockData.CreateSampleData(100_000); + +var cloudId = Environment.GetEnvironmentVariable("APM_CLOUD_ID"); +var elasticPassword = Environment.GetEnvironmentVariable("APM_CLOUD_PASSWORD"); + +if (string.IsNullOrEmpty(cloudId) || string.IsNullOrEmpty(elasticPassword)) + throw new Exception("Missing environment variables for cloud connection"); + +MemoryProfiler.ForceGc(); +MemoryProfiler.CollectAllocations(true); + +var configuration = new TransportConfiguration(cloudId, new BasicAuthentication("elastic", elasticPassword)) + .ServerCertificateValidationCallback((a,b,c,d) => true); // Trust the local certificate if we're passing through Fiddler with SSL decryption + +var transport = new DefaultHttpTransport(configuration); + +MemoryProfiler.GetSnapshot("Before"); + +var channelOptions = new IndexChannelOptions(transport) +{ + BufferOptions = new BufferOptions { OutboundBufferMaxSize = 5_000 }, + DisableDiagnostics = disableDiagnostics, + IndexFormat = "stock-data-v8", + OutboundChannelExitedCallback = () => + { + waitHandle.Set(); + }, +#if DEBUG + ExportResponseCallback = (response, a) => + { + Interlocked.Add(ref responses, a.Count); + Console.WriteLine(responses); + }, + PublishToOutboundChannelCallback = () => Console.WriteLine("PUBLISHED") +#endif +}; + +var indexChannel = new IndexChannel(channelOptions); + +MemoryProfiler.GetSnapshot("Before write"); + +#if DEBUG +Console.WriteLine("Write data."); +#endif + +indexChannel.TryWriteMany(stockData); +indexChannel.TryComplete(); + +#if DEBUG +Console.WriteLine("Awaiting completion."); +#endif + +waitHandle.WaitOne(); + +#if DEBUG +Console.WriteLine("Completed."); +#endif + +MemoryProfiler.GetSnapshot("After write and flush"); + +if (!disableDiagnostics) +{ + var diagnostics = indexChannel.ToString(); + MemoryProfiler.GetSnapshot("After diagnostics"); +} diff --git a/benchmarks/Performance.Common/Performance.Common.csproj b/benchmarks/Performance.Common/Performance.Common.csproj new file mode 100644 index 0000000..132c02c --- /dev/null +++ b/benchmarks/Performance.Common/Performance.Common.csproj @@ -0,0 +1,9 @@ + + + + net6.0 + enable + enable + + + diff --git a/benchmarks/Performance.Common/StockData.cs b/benchmarks/Performance.Common/StockData.cs new file mode 100644 index 0000000..ccddba3 --- /dev/null +++ b/benchmarks/Performance.Common/StockData.cs @@ -0,0 +1,90 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information + +using System.Text; + +namespace Performance.Common; + +public sealed class StockData +{ + private static readonly byte[] FilterPathStartResponseBytes = Encoding.UTF8.GetBytes("{\"items\":["); + private static readonly byte[] FilterPathItemResponseBytes = Encoding.UTF8.GetBytes("{\"create\":{\"status\":201}}"); + private static readonly byte Comma = (byte)','; + private static readonly byte[] EndResponseBytes = Encoding.UTF8.GetBytes("]}"); + + public DateTime Date { get; init; } + public double Open { get; init; } + public double Close { get; init; } + public double High { get; init; } + public double Low { get; init; } + public int Volume { get; init; } + public string? Symbol { get; init; } + + public static StockData ParseFromFileLine(string dataLine) + { + var columns = dataLine.Split(',', StringSplitOptions.TrimEntries); + + var date = DateTime.Parse(columns[0]); + + _ = float.TryParse(columns[1], out var open); + _ = float.TryParse(columns[1], out var high); + _ = float.TryParse(columns[1], out var low); + _ = float.TryParse(columns[1], out var close); + + var volume = int.Parse(columns[5]); + var symbol = columns[6]; + + return new StockData + { + Date = date, + Open = open, + Close = close, + High = high, + Low = low, + Volume = volume, + Symbol = symbol + }; + } + + public static StockData[] CreateSampleData(long count) + { + var data = new StockData[100_000]; + + for (var i = 0; i < count; i++) + { + data[i] = ParseFromFileLine("2013-02-08,15.07,15.12,14.63,14.75,8407500,AAL"); + } + + return data; + } + + public static byte[] CreateSampleDataSuccessWithFilterPathResponseBytes(long count) + { + var responseBytesSize = ((FilterPathItemResponseBytes.Length + 1) * count) - 1 + FilterPathStartResponseBytes.Length + EndResponseBytes.Length; + var responseBytes = new byte[responseBytesSize]; + + FilterPathStartResponseBytes.CopyTo(responseBytes, 0); + + var offset = FilterPathStartResponseBytes.Length; + + for (var i = 0; i < count; i++) + { + FilterPathItemResponseBytes.CopyTo(responseBytes, offset); + + if (i < count - 1) + { + responseBytes[offset + FilterPathItemResponseBytes.Length] = Comma; + offset += (FilterPathItemResponseBytes.Length + 1); + } + else + { + offset += (FilterPathItemResponseBytes.Length); + } + } + + EndResponseBytes.CopyTo(responseBytes, offset); + + return responseBytes; + } +} diff --git a/elastic-ingest-dotnet.sln b/elastic-ingest-dotnet.sln index 0b226de..5144a12 100644 --- a/elastic-ingest-dotnet.sln +++ b/elastic-ingest-dotnet.sln @@ -1,5 +1,8 @@  Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.6.33620.401 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A60DDBBB-4BF4-4B3B-A13A-E0B409917433}" ProjectSection(SolutionItems) = preProject src\Directory.Build.props = src\Directory.Build.props @@ -26,57 +29,50 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{8A402CB0 tests\Directory.Build.props = tests\Directory.Build.props EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elastic.Channels", "src\Elastic.Channels\Elastic.Channels.csproj", "{9F529525-E8E3-463D-A920-4D6E34150FC5}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elastic.Channels", "src\Elastic.Channels\Elastic.Channels.csproj", "{9F529525-E8E3-463D-A920-4D6E34150FC5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elastic.Ingest.Apm", "src\Elastic.Ingest.Apm\Elastic.Ingest.Apm.csproj", "{418D3648-BB35-49FC-B06C-09E4C62CC4E8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elastic.Ingest.Apm", "src\Elastic.Ingest.Apm\Elastic.Ingest.Apm.csproj", "{418D3648-BB35-49FC-B06C-09E4C62CC4E8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elastic.Ingest.Elasticsearch", "src\Elastic.Ingest.Elasticsearch\Elastic.Ingest.Elasticsearch.csproj", "{C3ADB8C6-60BD-47BA-B984-1F9D36BDDDD1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elastic.Ingest.Elasticsearch", "src\Elastic.Ingest.Elasticsearch\Elastic.Ingest.Elasticsearch.csproj", "{C3ADB8C6-60BD-47BA-B984-1F9D36BDDDD1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elastic.Ingest.Transport", "src\Elastic.Ingest.Transport\Elastic.Ingest.Transport.csproj", "{33B3D196-4CC8-408A-8364-5B3DC2EA4A73}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elastic.Ingest.Transport", "src\Elastic.Ingest.Transport\Elastic.Ingest.Transport.csproj", "{33B3D196-4CC8-408A-8364-5B3DC2EA4A73}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elastic.Channels.Tests", "tests\Elastic.Channels.Tests\Elastic.Channels.Tests.csproj", "{F6A52569-8F07-4E1E-935E-7AE9D664EF77}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elastic.Channels.Tests", "tests\Elastic.Channels.Tests\Elastic.Channels.Tests.csproj", "{F6A52569-8F07-4E1E-935E-7AE9D664EF77}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elastic.Ingest.Elasticsearch.IntegrationTests", "tests\Elastic.Ingest.Elasticsearch.IntegrationTests\Elastic.Ingest.Elasticsearch.IntegrationTests.csproj", "{E09CEEE6-DD3A-4603-890D-6364C7E4639F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elastic.Ingest.Elasticsearch.IntegrationTests", "tests\Elastic.Ingest.Elasticsearch.IntegrationTests\Elastic.Ingest.Elasticsearch.IntegrationTests.csproj", "{E09CEEE6-DD3A-4603-890D-6364C7E4639F}" EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "scripts", "build\scripts\scripts.fsproj", "{8AFDD165-F5B1-4555-97E3-A376B30236D3}" +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "scripts", "build\scripts\scripts.fsproj", "{8AFDD165-F5B1-4555-97E3-A376B30236D3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elastic.Ingest.Elasticsearch.Tests", "tests\Elastic.Ingest.Elasticsearch.Tests\Elastic.Ingest.Elasticsearch.Tests.csproj", "{DF02EDE5-1DBD-487B-BFA3-006407B6392D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elastic.Ingest.Elasticsearch.Tests", "tests\Elastic.Ingest.Elasticsearch.Tests\Elastic.Ingest.Elasticsearch.Tests.csproj", "{DF02EDE5-1DBD-487B-BFA3-006407B6392D}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{B67CBB46-74C1-47EB-9E41-D55C5E0E0D85}" ProjectSection(SolutionItems) = preProject examples\Directory.Build.props = examples\Directory.Build.props EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elastic.Channels.Example", "examples\Elastic.Channels.Example\Elastic.Channels.Example.csproj", "{D584C7ED-A2F5-472F-9DEE-5F36B88B558E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elastic.Channels.Example", "examples\Elastic.Channels.Example\Elastic.Channels.Example.csproj", "{D584C7ED-A2F5-472F-9DEE-5F36B88B558E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elastic.Ingest.OpenTelemetry", "src\Elastic.Ingest.OpenTelemetry\Elastic.Ingest.OpenTelemetry.csproj", "{92F87F85-3028-4E98-A1C7-6CCEC4392AB4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elastic.Ingest.OpenTelemetry", "src\Elastic.Ingest.OpenTelemetry\Elastic.Ingest.OpenTelemetry.csproj", "{92F87F85-3028-4E98-A1C7-6CCEC4392AB4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elastic.Ingest.Apm.Example", "examples\Elastic.Ingest.Apm.Example\Elastic.Ingest.Apm.Example.csproj", "{81F91C49-F590-47E2-AA69-AA713E840DD6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elastic.Ingest.Apm.Example", "examples\Elastic.Ingest.Apm.Example\Elastic.Ingest.Apm.Example.csproj", "{81F91C49-F590-47E2-AA69-AA713E840DD6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elastic.Ingest.OpenTelemetry.Example", "examples\Elastic.Ingest.OpenTelemetry.Example\Elastic.Ingest.OpenTelemetry.Example.csproj", "{F2F1FC18-C30F-4D9E-9EF0-F1E89EE71D17}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elastic.Ingest.OpenTelemetry.Example", "examples\Elastic.Ingest.OpenTelemetry.Example\Elastic.Ingest.OpenTelemetry.Example.csproj", "{F2F1FC18-C30F-4D9E-9EF0-F1E89EE71D17}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elastic.Channels.Continuous", "examples\Elastic.Channels.Continuous\Elastic.Channels.Continuous.csproj", "{42069F63-6AB0-43D1-AF8B-C7DD521F64C5}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "benchmarks", "benchmarks", "{1C174D50-20D2-4006-9681-FDDB39351D99}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elastic.Channels.Continuous", "examples\Elastic.Channels.Continuous\Elastic.Channels.Continuous.csproj", "{42069F63-6AB0-43D1-AF8B-C7DD521F64C5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elastic.Ingest.Elasticsearch.Benchmarks", "benchmarks\Elastic.Ingest.Elasticsearch.Benchmarks\Elastic.Ingest.Elasticsearch.Benchmarks.csproj", "{1609BC01-FEA6-4818-9C86-9DB7B82FCB48}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elastic.Ingest.Elasticsearch.Profiling", "benchmarks\Elastic.Ingest.Elasticsearch.Profiling\Elastic.Ingest.Elasticsearch.Profiling.csproj", "{DE05C98F-C410-4ED0-A77B-36B66C784105}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Performance.Common", "benchmarks\Performance.Common\Performance.Common.csproj", "{077B0564-26D1-4FF1-98A5-633EAA9BE051}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {9F529525-E8E3-463D-A920-4D6E34150FC5} = {A60DDBBB-4BF4-4B3B-A13A-E0B409917433} - {418D3648-BB35-49FC-B06C-09E4C62CC4E8} = {A60DDBBB-4BF4-4B3B-A13A-E0B409917433} - {C3ADB8C6-60BD-47BA-B984-1F9D36BDDDD1} = {A60DDBBB-4BF4-4B3B-A13A-E0B409917433} - {33B3D196-4CC8-408A-8364-5B3DC2EA4A73} = {A60DDBBB-4BF4-4B3B-A13A-E0B409917433} - {F6A52569-8F07-4E1E-935E-7AE9D664EF77} = {8A402CB0-CB84-4F7D-9F97-EFEC23F36814} - {E09CEEE6-DD3A-4603-890D-6364C7E4639F} = {8A402CB0-CB84-4F7D-9F97-EFEC23F36814} - {8AFDD165-F5B1-4555-97E3-A376B30236D3} = {B284B3C8-2592-4B5D-B287-207285E4B7F9} - {DF02EDE5-1DBD-487B-BFA3-006407B6392D} = {8A402CB0-CB84-4F7D-9F97-EFEC23F36814} - {D584C7ED-A2F5-472F-9DEE-5F36B88B558E} = {B67CBB46-74C1-47EB-9E41-D55C5E0E0D85} - {92F87F85-3028-4E98-A1C7-6CCEC4392AB4} = {A60DDBBB-4BF4-4B3B-A13A-E0B409917433} - {81F91C49-F590-47E2-AA69-AA713E840DD6} = {B67CBB46-74C1-47EB-9E41-D55C5E0E0D85} - {F2F1FC18-C30F-4D9E-9EF0-F1E89EE71D17} = {B67CBB46-74C1-47EB-9E41-D55C5E0E0D85} - {42069F63-6AB0-43D1-AF8B-C7DD521F64C5} = {B67CBB46-74C1-47EB-9E41-D55C5E0E0D85} - EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {9F529525-E8E3-463D-A920-4D6E34150FC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9F529525-E8E3-463D-A920-4D6E34150FC5}.Debug|Any CPU.Build.0 = Debug|Any CPU @@ -130,5 +126,41 @@ Global {42069F63-6AB0-43D1-AF8B-C7DD521F64C5}.Debug|Any CPU.Build.0 = Debug|Any CPU {42069F63-6AB0-43D1-AF8B-C7DD521F64C5}.Release|Any CPU.ActiveCfg = Release|Any CPU {42069F63-6AB0-43D1-AF8B-C7DD521F64C5}.Release|Any CPU.Build.0 = Release|Any CPU + {1609BC01-FEA6-4818-9C86-9DB7B82FCB48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1609BC01-FEA6-4818-9C86-9DB7B82FCB48}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1609BC01-FEA6-4818-9C86-9DB7B82FCB48}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1609BC01-FEA6-4818-9C86-9DB7B82FCB48}.Release|Any CPU.Build.0 = Release|Any CPU + {DE05C98F-C410-4ED0-A77B-36B66C784105}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DE05C98F-C410-4ED0-A77B-36B66C784105}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DE05C98F-C410-4ED0-A77B-36B66C784105}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DE05C98F-C410-4ED0-A77B-36B66C784105}.Release|Any CPU.Build.0 = Release|Any CPU + {077B0564-26D1-4FF1-98A5-633EAA9BE051}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {077B0564-26D1-4FF1-98A5-633EAA9BE051}.Debug|Any CPU.Build.0 = Debug|Any CPU + {077B0564-26D1-4FF1-98A5-633EAA9BE051}.Release|Any CPU.ActiveCfg = Release|Any CPU + {077B0564-26D1-4FF1-98A5-633EAA9BE051}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {9F529525-E8E3-463D-A920-4D6E34150FC5} = {A60DDBBB-4BF4-4B3B-A13A-E0B409917433} + {418D3648-BB35-49FC-B06C-09E4C62CC4E8} = {A60DDBBB-4BF4-4B3B-A13A-E0B409917433} + {C3ADB8C6-60BD-47BA-B984-1F9D36BDDDD1} = {A60DDBBB-4BF4-4B3B-A13A-E0B409917433} + {33B3D196-4CC8-408A-8364-5B3DC2EA4A73} = {A60DDBBB-4BF4-4B3B-A13A-E0B409917433} + {F6A52569-8F07-4E1E-935E-7AE9D664EF77} = {8A402CB0-CB84-4F7D-9F97-EFEC23F36814} + {E09CEEE6-DD3A-4603-890D-6364C7E4639F} = {8A402CB0-CB84-4F7D-9F97-EFEC23F36814} + {8AFDD165-F5B1-4555-97E3-A376B30236D3} = {B284B3C8-2592-4B5D-B287-207285E4B7F9} + {DF02EDE5-1DBD-487B-BFA3-006407B6392D} = {8A402CB0-CB84-4F7D-9F97-EFEC23F36814} + {D584C7ED-A2F5-472F-9DEE-5F36B88B558E} = {B67CBB46-74C1-47EB-9E41-D55C5E0E0D85} + {92F87F85-3028-4E98-A1C7-6CCEC4392AB4} = {A60DDBBB-4BF4-4B3B-A13A-E0B409917433} + {81F91C49-F590-47E2-AA69-AA713E840DD6} = {B67CBB46-74C1-47EB-9E41-D55C5E0E0D85} + {F2F1FC18-C30F-4D9E-9EF0-F1E89EE71D17} = {B67CBB46-74C1-47EB-9E41-D55C5E0E0D85} + {42069F63-6AB0-43D1-AF8B-C7DD521F64C5} = {B67CBB46-74C1-47EB-9E41-D55C5E0E0D85} + {1609BC01-FEA6-4818-9C86-9DB7B82FCB48} = {1C174D50-20D2-4006-9681-FDDB39351D99} + {DE05C98F-C410-4ED0-A77B-36B66C784105} = {1C174D50-20D2-4006-9681-FDDB39351D99} + {077B0564-26D1-4FF1-98A5-633EAA9BE051} = {1C174D50-20D2-4006-9681-FDDB39351D99} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {87AD3256-8FD8-4C94-AB66-5ADBAC939722} EndGlobalSection EndGlobal