spec/elastic_apm/metrics/cpu_mem_set_spec.rb (89 lines of code) (raw):

# Licensed to Elasticsearch B.V. under one or more contributor # license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright # ownership. Elasticsearch B.V. licenses this file to you under # the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # frozen_string_literal: true require 'spec_helper' module ElasticAPM module Metrics RSpec.describe CpuMemSet do let(:config) { Config.new } subject { described_class.new config } context 'Linux' do before { allow(Metrics).to receive(:os) { 'linux-musl' } } describe 'collect' do it 'collects all metrics' do mock_proc_files(user: 0, idle: 0, utime: 0, stime: 0) subject # read values in init to allow delta calculation mock_proc_files( user: 400_000, idle: 600_000, utime: 100_000, stime: 100_000 ) set, = subject.collect expect(set.samples).to match( 'system.cpu.total.norm.pct': 0.4, 'system.memory.actual.free': 2_750_062_592, 'system.memory.total': 4_042_711_040, 'system.process.cpu.total.norm.pct': 0.2, 'system.process.memory.size': 53_223_424, 'system.process.memory.rss.bytes': 25_477_120 ) end context 'on RHEL' do it "doesn't explode from missing numbers" do mock_proc_files( proc_stat_format: :rhel, user: 0, idle: 0, utime: 0, stime: 0 ) subject # read values in init to allow delta calculation mock_proc_files( proc_stat_format: :rhel, user: 400_000, idle: 600_000, utime: 100_000, stime: 100_000 ) set, = subject.collect expect(set.samples).to match( 'system.cpu.total.norm.pct': 0.4, 'system.memory.actual.free': 2_750_062_592, 'system.memory.total': 4_042_711_040, 'system.process.cpu.total.norm.pct': 0.2, 'system.process.memory.size': 53_223_424, 'system.process.memory.rss.bytes': 25_477_120 ) end end context 'on Debian Wheezy (kernel 3.2)' do it 'builds MemAvailable from others' do mock_proc_files proc_meminfo_format: :wheezy set, = subject.collect expect(set.samples[:'system.memory.total']).to eq 4_042_711_040 expect(set.samples[:'system.memory.actual.free']) .to eq 2_443_145_216 end end end end # rubocop:disable Metrics/ParameterLists def mock_proc_files( user: 6_410_558, idle: 329_434_672, utime: 7, stime: 0, proc_stat_format: :debian, proc_meminfo_format: nil ) allow_any_instance_of(ElasticAPM::Metrics::CpuMemSet::Linux::Meminfo). to receive(:`).with('getconf PAGESIZE').and_return('8192') { '/proc/stat' => ["proc_stat_#{proc_stat_format}", { user: user, idle: idle }], '/proc/self/stat' => ['proc_self_stat', { utime: utime, stime: stime }], '/proc/meminfo' => [ "proc_meminfo#{proc_meminfo_format && "_#{proc_meminfo_format}"}", {} ] }.each do |file, (fixture, updates)| allow(IO).to receive(:readlines).with(file) do text = File.read("spec/fixtures/#{fixture}") updates.each { |key, val| text.gsub!("{#{key}}", val.to_s) } text.split("\n") end end end # rubocop:enable Metrics/ParameterLists end end end