Skip to content

Commit

Permalink
Removing metric
Browse files Browse the repository at this point in the history
  • Loading branch information
stevejgordon committed Nov 9, 2023
1 parent 539fdb5 commit 4737bdc
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 122 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,14 @@ private static void UnlimitedMaxMemoryFiles(CgroupPaths paths)
public void Cleanup()
=> Directory.Delete(_cgroupPaths.RootPath, true);

//[Benchmark]
//public void GetSamples()
//{
// foreach (var metricSet in _cgroupMetricsProvider.GetSamples())
// {
// metricSet.Samples.Consume(_consumer);
// }
//}
[Benchmark]
public void GetSamples()
{
foreach (var metricSet in _cgroupMetricsProvider.GetSamples())
{
metricSet.Samples.Consume(_consumer);
}
}

// WINDOWS:
//| Method | Mean | Error | StdDev | Ratio | RatioSD | Gen0 | Allocated | Alloc Ratio |
Expand Down
102 changes: 7 additions & 95 deletions src/Elastic.Apm/Metrics/MetricsProvider/CgroupMetricsProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
#endif

#if NET6_0_OR_GREATER
using System.Buffers;
using System.Buffers.Text;
using System.Runtime.CompilerServices;
using System.Text;
Expand All @@ -44,7 +43,6 @@ internal class CgroupMetricsProvider : IMetricsProvider

internal const string SystemProcessCgroupMemoryMemLimitBytes = "system.process.cgroup.memory.mem.limit.bytes";
internal const string SystemProcessCgroupMemoryMemUsageBytes = "system.process.cgroup.memory.mem.usage.bytes";
internal const string SystemProcessCgroupMemoryStatsInactiveFileBytes = "system.process.cgroup.memory.stats.inactive_file.bytes";

internal static readonly Regex Cgroup1MountPoint = new("^\\d+? \\d+? .+? .+? (.*?) .*cgroup.*memory.*");
internal static readonly Regex Cgroup2MountPoint = new("^\\d+? \\d+? .+? .+? (.*?) .*cgroup2.*cgroup.*");
Expand All @@ -57,7 +55,6 @@ internal class CgroupMetricsProvider : IMetricsProvider
private readonly CgroupFiles _cGroupFiles;
private readonly bool _collectMemLimitBytes;
private readonly bool _collectMemUsageBytes;
private readonly bool _collectStatsInactiveFileBytes;
private readonly bool _collectTotalMemory;

private readonly string _pathPrefix;
Expand Down Expand Up @@ -90,7 +87,7 @@ private CgroupMetricsProvider(IApmLogger logger, IReadOnlyList<WildcardMatcher>
_collectMemLimitBytes = IsSystemProcessCgroupMemoryMemLimitBytesEnabled(disabledMetrics);
_collectMemUsageBytes = IsSystemProcessCgroupMemoryMemUsageBytesEnabled(disabledMetrics);
_collectTotalMemory = IsTotalMemoryEnabled(disabledMetrics);
_collectStatsInactiveFileBytes = IsSystemProcessCgroupMemoryStatsInactiveFileBytesEnabled(disabledMetrics);

_logger = logger.Scoped(nameof(CgroupMetricsProvider));

if (!RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && !_ignoreOs)
Expand Down Expand Up @@ -291,13 +288,6 @@ public IEnumerable<MetricSet> GetSamples()

private IEnumerable<MetricSample> GetSamplesCore()
{
if (_collectStatsInactiveFileBytes)
{
var sample = GetStatsInactiveFileBytesMetric();
if (sample is not null)
yield return sample;
}

if (_collectMemUsageBytes)
{
var sample = GetMemoryMemUsageBytes();
Expand Down Expand Up @@ -390,95 +380,17 @@ private MetricSample GetLongValueFromFile(string path, string sampleName)
private static ReadOnlySpan<byte> _totalInactiveFile => "total_inactive_file"u8;
private static ReadOnlySpan<byte> _inactiveFile => "inactive_file"u8;

private MetricSample GetStatsInactiveFileBytesMetric()
{
try
{
#if NET6_0_OR_GREATER // Optimised code for newer runtimes
using var fs = new FileStream(_cGroupFiles.StatMemoryFile, Options);
var buffer = ArrayPool<byte>.Shared.Rent((int)fs.Length);
public bool IsEnabled(IReadOnlyList<WildcardMatcher> disabledMetrics) =>
IsSystemProcessCgroupMemoryMemLimitBytesEnabled(disabledMetrics) ||
IsSystemProcessCgroupMemoryMemUsageBytesEnabled(disabledMetrics);

try
{
var read = fs.Read(buffer);
if (read == 0)
return null;

var span = buffer.AsSpan().Slice(0, read);
long parsedValue = -1;
var inactiveFile = span.IndexOf(_inactiveFile);

if (inactiveFile >= 0)
{
var slice = span.Slice(inactiveFile + _inactiveFile.Length + 1);
if (Utf8Parser.TryParse(slice, out long value, out _))
parsedValue = value;
}

var totalInactiveFiles = span.IndexOf(_totalInactiveFile);
if (totalInactiveFiles >= 0)
{
var slice = span.Slice(totalInactiveFiles + _totalInactiveFile.Length + 1);
if (Utf8Parser.TryParse(slice, out long value, out _))
parsedValue = value;
}

if (parsedValue > -1)
return new MetricSample(SystemProcessCgroupMemoryStatsInactiveFileBytes, parsedValue);

return null;
}
finally
{
ArrayPool<byte>.Shared.Return(buffer);
}
#else
using var reader = new StreamReader(_cGroupFiles.StatMemoryFile);
string statLine;
string inactiveBytes = null;
while ((statLine = reader.ReadLine()) != null)
{
var statLineSplit = statLine.Split(' ');
if (statLineSplit.Length > 1)
{
if ("total_inactive_file".Equals(statLineSplit[0]))
{
inactiveBytes = statLineSplit[1];
break;
}

if ("inactive_file".Equals(statLineSplit[0]))
inactiveBytes = statLineSplit[1];
}
}

if (inactiveBytes != null && double.TryParse(inactiveBytes, NumberStyles.Integer, CultureInfo.InvariantCulture, out var value))
return new MetricSample(SystemProcessCgroupMemoryStatsInactiveFileBytes, value);
#endif
}
catch (IOException e)
{
_logger.Info()?.LogException(e, "error collecting {Metric} metric", SystemProcessCgroupMemoryStatsInactiveFileBytes);
}

return null;
}

public bool IsEnabled(IReadOnlyList<WildcardMatcher> disabledMetrics) => IsSystemProcessCgroupMemoryMemLimitBytesEnabled(disabledMetrics) ||
IsSystemProcessCgroupMemoryMemUsageBytesEnabled(disabledMetrics)
|| IsSystemProcessCgroupMemoryStatsInactiveFileBytesEnabled(disabledMetrics);

private bool IsSystemProcessCgroupMemoryMemLimitBytesEnabled(IReadOnlyList<WildcardMatcher> disabledMetrics) => !WildcardMatcher.IsAnyMatch(
private static bool IsSystemProcessCgroupMemoryMemLimitBytesEnabled(IReadOnlyList<WildcardMatcher> disabledMetrics) => !WildcardMatcher.IsAnyMatch(
disabledMetrics, SystemProcessCgroupMemoryMemLimitBytes);

private bool IsSystemProcessCgroupMemoryMemUsageBytesEnabled(IReadOnlyList<WildcardMatcher> disabledMetrics) => !WildcardMatcher.IsAnyMatch(
private static bool IsSystemProcessCgroupMemoryMemUsageBytesEnabled(IReadOnlyList<WildcardMatcher> disabledMetrics) => !WildcardMatcher.IsAnyMatch(
disabledMetrics, SystemProcessCgroupMemoryMemUsageBytes);

private bool IsSystemProcessCgroupMemoryStatsInactiveFileBytesEnabled(IReadOnlyList<WildcardMatcher> disabledMetrics) =>
!WildcardMatcher.IsAnyMatch(
disabledMetrics, SystemProcessCgroupMemoryStatsInactiveFileBytes);

private bool IsTotalMemoryEnabled(IReadOnlyList<WildcardMatcher> disabledMetrics) =>
private static bool IsTotalMemoryEnabled(IReadOnlyList<WildcardMatcher> disabledMetrics) =>
!WildcardMatcher.IsAnyMatch(disabledMetrics, FreeAndTotalMemoryProvider.TotalMemory);
}

Expand Down
19 changes: 0 additions & 19 deletions test/Elastic.Apm.Tests/Metrics/CgroupMetricsProviderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,25 +32,6 @@ public void TestCgroup2Regex()
actual.Should().Be("/sys/fs/cgroup/memory");
}

[Theory]
// stat have different values to inactive_file and total_inactive_file
[InlineData(500, 10407936, false)]
// stat have different values to inactive_file and total_inactive_file different order
[InlineData(500, 10407936, true)]
public void TestInactiveFileBytes(double inactiveFiles, double totalInactiveFiles, bool inactiveFirst)
{
using var paths = CreateDefaultCgroupFiles(CgroupVersion.CgroupV1);
ReplaceMemStatInactiveFile(paths, inactiveFiles, totalInactiveFiles, inactiveFirst);

var sut = TestableCgroupMetricsProvider(new NoopLogger(), new List<WildcardMatcher>(), paths.RootPath, true);
var samples = sut.GetSamples().ToList();
samples.First().Samples.Should().HaveCount(3);

var inactiveFileBytesSample = samples.First().Samples.SingleOrDefault(s => s.KeyValue.Key == SystemProcessCgroupMemoryStatsInactiveFileBytes);
inactiveFileBytesSample.Should().NotBeNull();
inactiveFileBytesSample.KeyValue.Value.Should().Be(10407936);
}

[Fact]
public void TestLimitedCgroup1()
{
Expand Down

0 comments on commit 4737bdc

Please sign in to comment.