From c9fcd03019efe5e6613fcc5f8ce96d70cb7ec332 Mon Sep 17 00:00:00 2001 From: Makazeu Date: Fri, 14 Mar 2025 12:49:54 +0800 Subject: [PATCH 1/4] Memory usage in Slice path could be 0 --- .../Linux/LinuxUtilizationParserCgroupV2.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/Linux/LinuxUtilizationParserCgroupV2.cs b/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/Linux/LinuxUtilizationParserCgroupV2.cs index 113b6b3ad6a..98a8d0d7dbc 100644 --- a/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/Linux/LinuxUtilizationParserCgroupV2.cs +++ b/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/Linux/LinuxUtilizationParserCgroupV2.cs @@ -257,11 +257,11 @@ public long GetMemoryUsageInBytesFromSlices(string pattern) ReadOnlySpan memoryUsageFile = bufferWriter.Buffer.WrittenSpan; int next = GetNextNumber(memoryUsageFile, out long containerMemoryUsage); - if (containerMemoryUsage == 0 || containerMemoryUsage == -1) + if (containerMemoryUsage == -1) { memoryUsageInBytesTotal = 0; Throw.InvalidOperationException( - $"We tried to read '{memoryUsageInBytesFile}', and we expected to get a positive number but instead it was: '{memoryUsageFile}'."); + $"We tried to read '{memoryUsageInBytesFile}', and we expected to get a non-negative number but instead it was: '{memoryUsageFile}'."); } memoryUsageInBytesTotal += containerMemoryUsage; From 264f97fc96b68184b21482dcfeafef4362f8bcfd Mon Sep 17 00:00:00 2001 From: Makazeu Date: Fri, 14 Mar 2025 13:02:18 +0800 Subject: [PATCH 2/4] Update memory usage test to handle zero values and refine method name --- .../LinuxUtilizationParserCgroupV2Tests.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/test/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests/Linux/LinuxUtilizationParserCgroupV2Tests.cs b/test/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests/Linux/LinuxUtilizationParserCgroupV2Tests.cs index 6c009980987..92bbd46f766 100644 --- a/test/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests/Linux/LinuxUtilizationParserCgroupV2Tests.cs +++ b/test/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests/Linux/LinuxUtilizationParserCgroupV2Tests.cs @@ -166,7 +166,7 @@ public Task Throws_When_UsageInBytes_Doesnt_Contain_A_Number() } [ConditionalFact] - public void Returns_Memory_Usage_When_Memory_Usage_Is_Valid() + public void Returns_Memory_Usage_When_Memory_Usage_Is_Postive_Number() { var regexPatternforSlices = @"\w+.slice"; var f = new HardcodedValueFileSystem(new Dictionary @@ -180,6 +180,21 @@ public void Returns_Memory_Usage_When_Memory_Usage_Is_Valid() Assert.Equal(5_342_342, r); } + [ConditionalFact] + public void Returns_Memory_Usage_When_Memory_Usage_Is_Zero() + { + var regexPatternforSlices = @"\w+.slice"; + var f = new HardcodedValueFileSystem(new Dictionary + { + { new FileInfo("/sys/fs/cgroup/system.slice/memory.current"), "0"}, + }); + + var p = new LinuxUtilizationParserCgroupV2(f, new FakeUserHz(100)); + var r = p.GetMemoryUsageInBytesFromSlices(regexPatternforSlices); + + Assert.Equal(0, r); + } + [ConditionalTheory] [InlineData(104343, 1)] [InlineData(23423, 22)] From a50f85d5f29a3b67f849340b36c83b371102e43a Mon Sep 17 00:00:00 2001 From: Makazeu Date: Fri, 14 Mar 2025 14:01:25 +0800 Subject: [PATCH 3/4] Update error message for memory usage exception to clarify non-negative expectation --- ...hrows_When_UsageInBytes_Doesnt_Contain_A_Number.verified.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests/Linux/Verified/LinuxUtilizationParserCgroupV2Tests.Throws_When_UsageInBytes_Doesnt_Contain_A_Number.verified.txt b/test/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests/Linux/Verified/LinuxUtilizationParserCgroupV2Tests.Throws_When_UsageInBytes_Doesnt_Contain_A_Number.verified.txt index 97269271308..1b94cfbe0a6 100644 --- a/test/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests/Linux/Verified/LinuxUtilizationParserCgroupV2Tests.Throws_When_UsageInBytes_Doesnt_Contain_A_Number.verified.txt +++ b/test/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests/Linux/Verified/LinuxUtilizationParserCgroupV2Tests.Throws_When_UsageInBytes_Doesnt_Contain_A_Number.verified.txt @@ -1,6 +1,6 @@ { Type: InvalidOperationException, - Message: We tried to read '/sys/fs/cgroup/system.slice/memory.current', and we expected to get a positive number but instead it was: 'dasda'., + Message: We tried to read '/sys/fs/cgroup/system.slice/memory.current', and we expected to get a non-negative number but instead it was: 'dasda'., StackTrace: at Microsoft.Shared.Diagnostics.Throw.InvalidOperationException(String message) at Microsoft.Extensions.Diagnostics.ResourceMonitoring.Linux.LinuxUtilizationParserCgroupV2.GetMemoryUsageInBytesFromSlices(String pattern) From 404f9e06276ad2054e99cf26c0dee2f89b2cd5f2 Mon Sep 17 00:00:00 2001 From: Makazeu Date: Fri, 14 Mar 2025 14:24:35 +0800 Subject: [PATCH 4/4] Merge test cases --- .../Linux/LinuxUtilizationParserCgroupV2Tests.cs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/test/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests/Linux/LinuxUtilizationParserCgroupV2Tests.cs b/test/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests/Linux/LinuxUtilizationParserCgroupV2Tests.cs index 92bbd46f766..7ff1a00fb29 100644 --- a/test/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests/Linux/LinuxUtilizationParserCgroupV2Tests.cs +++ b/test/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring.Tests/Linux/LinuxUtilizationParserCgroupV2Tests.cs @@ -166,8 +166,9 @@ public Task Throws_When_UsageInBytes_Doesnt_Contain_A_Number() } [ConditionalFact] - public void Returns_Memory_Usage_When_Memory_Usage_Is_Postive_Number() + public void Returns_Memory_Usage_When_Memory_Usage_Is_Valid() { + // When memory usage is a positive number var regexPatternforSlices = @"\w+.slice"; var f = new HardcodedValueFileSystem(new Dictionary { @@ -178,20 +179,15 @@ public void Returns_Memory_Usage_When_Memory_Usage_Is_Postive_Number() var r = p.GetMemoryUsageInBytesFromSlices(regexPatternforSlices); Assert.Equal(5_342_342, r); - } - [ConditionalFact] - public void Returns_Memory_Usage_When_Memory_Usage_Is_Zero() - { - var regexPatternforSlices = @"\w+.slice"; - var f = new HardcodedValueFileSystem(new Dictionary + // When memory usage is zero + f = new HardcodedValueFileSystem(new Dictionary { { new FileInfo("/sys/fs/cgroup/system.slice/memory.current"), "0"}, }); - var p = new LinuxUtilizationParserCgroupV2(f, new FakeUserHz(100)); - var r = p.GetMemoryUsageInBytesFromSlices(regexPatternforSlices); - + p = new LinuxUtilizationParserCgroupV2(f, new FakeUserHz(100)); + r = p.GetMemoryUsageInBytesFromSlices(regexPatternforSlices); Assert.Equal(0, r); }