Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib/gitlab/metrics/system_spec.rb')
-rw-r--r--spec/lib/gitlab/metrics/system_spec.rb363
1 files changed, 0 insertions, 363 deletions
diff --git a/spec/lib/gitlab/metrics/system_spec.rb b/spec/lib/gitlab/metrics/system_spec.rb
deleted file mode 100644
index e4f53ab3f49..00000000000
--- a/spec/lib/gitlab/metrics/system_spec.rb
+++ /dev/null
@@ -1,363 +0,0 @@
-# frozen_string_literal: true
-
-require 'fast_spec_helper'
-
-RSpec.describe Gitlab::Metrics::System do
- context 'when /proc files exist' do
- # Modified column 22 to be 1000 (starttime ticks)
- let(:proc_stat) do
- <<~SNIP
- 2095 (ruby) R 0 2095 2095 34818 2095 4194560 211267 7897 2 0 287 51 10 1 20 0 5 0 1000 566210560 80885 18446744073709551615 94736211292160 94736211292813 140720919612064 0 0 0 0 0 1107394127 0 0 0 17 3 0 0 0 0 0 94736211303768 94736211304544 94736226689024 140720919619473 140720919619513 140720919619513 140720919621604 0
- SNIP
- end
-
- # Fixtures pulled from:
- # Linux carbon 5.3.0-7648-generic #41~1586789791~19.10~9593806-Ubuntu SMP Mon Apr 13 17:50:40 UTC x86_64 x86_64 x86_64 GNU/Linux
- let(:proc_status) do
- # most rows omitted for brevity
- <<~SNIP
- Name: less
- VmHWM: 2468 kB
- VmRSS: 2468 kB
- RssAnon: 260 kB
- RssFile: 1024 kB
- SNIP
- end
-
- let(:proc_smaps_rollup) do
- # full snapshot
- <<~SNIP
- Rss: 2564 kB
- Pss: 503 kB
- Pss_Anon: 312 kB
- Pss_File: 191 kB
- Pss_Shmem: 0 kB
- Shared_Clean: 2100 kB
- Shared_Dirty: 0 kB
- Private_Clean: 152 kB
- Private_Dirty: 312 kB
- Referenced: 2564 kB
- Anonymous: 312 kB
- LazyFree: 0 kB
- AnonHugePages: 0 kB
- ShmemPmdMapped: 0 kB
- Shared_Hugetlb: 0 kB
- Private_Hugetlb: 0 kB
- Swap: 0 kB
- SwapPss: 0 kB
- Locked: 0 kB
- SNIP
- end
-
- let(:proc_limits) do
- # full snapshot
- <<~SNIP
- Limit Soft Limit Hard Limit Units
- Max cpu time unlimited unlimited seconds
- Max file size unlimited unlimited bytes
- Max data size unlimited unlimited bytes
- Max stack size 8388608 unlimited bytes
- Max core file size 0 unlimited bytes
- Max resident set unlimited unlimited bytes
- Max processes 126519 126519 processes
- Max open files 1024 1048576 files
- Max locked memory 67108864 67108864 bytes
- Max address space unlimited unlimited bytes
- Max file locks unlimited unlimited locks
- Max pending signals 126519 126519 signals
- Max msgqueue size 819200 819200 bytes
- Max nice priority 0 0
- Max realtime priority 0 0
- Max realtime timeout unlimited unlimited us
- SNIP
- end
-
- let(:mem_info) do
- # full snapshot
- <<~SNIP
- MemTotal: 15362536 kB
- MemFree: 3403136 kB
- MemAvailable: 13044528 kB
- Buffers: 272188 kB
- Cached: 8171312 kB
- SwapCached: 0 kB
- Active: 3332084 kB
- Inactive: 6981076 kB
- Active(anon): 1603868 kB
- Inactive(anon): 9044 kB
- Active(file): 1728216 kB
- Inactive(file): 6972032 kB
- Unevictable: 18676 kB
- Mlocked: 18676 kB
- SwapTotal: 0 kB
- SwapFree: 0 kB
- Dirty: 6808 kB
- Writeback: 0 kB
- AnonPages: 1888300 kB
- Mapped: 166164 kB
- Shmem: 12932 kB
- KReclaimable: 1275120 kB
- Slab: 1495480 kB
- SReclaimable: 1275120 kB
- SUnreclaim: 220360 kB
- KernelStack: 7072 kB
- PageTables: 11936 kB
- NFS_Unstable: 0 kB
- Bounce: 0 kB
- WritebackTmp: 0 kB
- CommitLimit: 7681268 kB
- Committed_AS: 4976100 kB
- VmallocTotal: 34359738367 kB
- VmallocUsed: 25532 kB
- VmallocChunk: 0 kB
- Percpu: 23200 kB
- HardwareCorrupted: 0 kB
- AnonHugePages: 202752 kB
- ShmemHugePages: 0 kB
- ShmemPmdMapped: 0 kB
- FileHugePages: 0 kB
- FilePmdMapped: 0 kB
- CmaTotal: 0 kB
- CmaFree: 0 kB
- HugePages_Total: 0
- HugePages_Free: 0
- HugePages_Rsvd: 0
- HugePages_Surp: 0
- Hugepagesize: 2048 kB
- Hugetlb: 0 kB
- DirectMap4k: 4637504 kB
- DirectMap2M: 11087872 kB
- DirectMap1G: 2097152 kB
- SNIP
- end
-
- describe '.memory_usage_rss' do
- context 'without PID' do
- it "returns a hash containing RSS metrics in bytes for current process" do
- mock_existing_proc_file('/proc/self/status', proc_status)
-
- expect(described_class.memory_usage_rss).to eq(
- total: 2527232,
- anon: 266240,
- file: 1048576
- )
- end
- end
-
- context 'with PID' do
- it "returns a hash containing RSS metrics in bytes for given process" do
- mock_existing_proc_file('/proc/7/status', proc_status)
-
- expect(described_class.memory_usage_rss(pid: 7)).to eq(
- total: 2527232,
- anon: 266240,
- file: 1048576
- )
- end
- end
- end
-
- describe '.file_descriptor_count' do
- it 'returns the amount of open file descriptors' do
- expect(Dir).to receive(:glob).and_return(['/some/path', '/some/other/path'])
-
- expect(described_class.file_descriptor_count).to eq(2)
- end
- end
-
- describe '.max_open_file_descriptors' do
- it 'returns the max allowed open file descriptors' do
- mock_existing_proc_file('/proc/self/limits', proc_limits)
-
- expect(described_class.max_open_file_descriptors).to eq(1024)
- end
- end
-
- describe '.memory_usage_uss_pss' do
- context 'without PID' do
- it "returns the current process' unique and porportional set size (USS/PSS) in bytes" do
- mock_existing_proc_file('/proc/self/smaps_rollup', proc_smaps_rollup)
-
- # (Private_Clean (152 kB) + Private_Dirty (312 kB) + Private_Hugetlb (0 kB)) * 1024
- expect(described_class.memory_usage_uss_pss).to eq(uss: 475136, pss: 515072)
- end
- end
-
- context 'with PID' do
- it "returns the given process' unique and porportional set size (USS/PSS) in bytes" do
- mock_existing_proc_file('/proc/7/smaps_rollup', proc_smaps_rollup)
-
- # (Private_Clean (152 kB) + Private_Dirty (312 kB) + Private_Hugetlb (0 kB)) * 1024
- expect(described_class.memory_usage_uss_pss(pid: 7)).to eq(uss: 475136, pss: 515072)
- end
- end
- end
-
- describe '.memory_total' do
- it "returns the current process' resident set size (RSS) in bytes" do
- mock_existing_proc_file('/proc/meminfo', mem_info)
-
- expect(described_class.memory_total).to eq(15731236864)
- end
- end
-
- describe '.process_runtime_elapsed_seconds' do
- it 'returns the seconds elapsed since the process was started' do
- # sets process starttime ticks to 1000
- mock_existing_proc_file('/proc/self/stat', proc_stat)
- # system clock ticks/sec
- expect(Etc).to receive(:sysconf).with(Etc::SC_CLK_TCK).and_return(100)
- # system uptime in seconds
- expect(::Process).to receive(:clock_gettime).and_return(15)
-
- # uptime - (starttime_ticks / ticks_per_sec)
- expect(described_class.process_runtime_elapsed_seconds).to eq(5)
- end
-
- context 'when inputs are not available' do
- it 'returns 0' do
- mock_missing_proc_file
- expect(::Process).to receive(:clock_gettime).and_raise(NameError)
-
- expect(described_class.process_runtime_elapsed_seconds).to eq(0)
- end
- end
- end
-
- describe '.summary' do
- it 'contains a selection of the available fields' do
- stub_const('RUBY_DESCRIPTION', 'ruby-3.0-patch1')
- mock_existing_proc_file('/proc/self/status', proc_status)
- mock_existing_proc_file('/proc/self/smaps_rollup', proc_smaps_rollup)
-
- summary = described_class.summary
-
- expect(summary[:version]).to eq('ruby-3.0-patch1')
- expect(summary[:gc_stat].keys).to eq(GC.stat.keys)
- expect(summary[:memory_rss]).to eq(2527232)
- expect(summary[:memory_uss]).to eq(475136)
- expect(summary[:memory_pss]).to eq(515072)
- expect(summary[:time_cputime]).to be_a(Float)
- expect(summary[:time_realtime]).to be_a(Float)
- expect(summary[:time_monotonic]).to be_a(Float)
- end
- end
- end
-
- context 'when /proc files do not exist' do
- before do
- mock_missing_proc_file
- end
-
- describe '.memory_usage_rss' do
- it 'returns 0 for all components' do
- expect(described_class.memory_usage_rss).to eq(
- total: 0,
- anon: 0,
- file: 0
- )
- end
- end
-
- describe '.memory_usage_uss_pss' do
- it "returns 0 for all components" do
- expect(described_class.memory_usage_uss_pss).to eq(uss: 0, pss: 0)
- end
- end
-
- describe '.file_descriptor_count' do
- it 'returns 0' do
- expect(Dir).to receive(:glob).and_return([])
-
- expect(described_class.file_descriptor_count).to eq(0)
- end
- end
-
- describe '.max_open_file_descriptors' do
- it 'returns 0' do
- expect(described_class.max_open_file_descriptors).to eq(0)
- end
- end
-
- describe '.summary' do
- it 'returns only available fields' do
- summary = described_class.summary
-
- expect(summary[:version]).to be_a(String)
- expect(summary[:gc_stat].keys).to eq(GC.stat.keys)
- expect(summary[:memory_rss]).to eq(0)
- expect(summary[:memory_uss]).to eq(0)
- expect(summary[:memory_pss]).to eq(0)
- expect(summary[:time_cputime]).to be_a(Float)
- expect(summary[:time_realtime]).to be_a(Float)
- expect(summary[:time_monotonic]).to be_a(Float)
- end
- end
- end
-
- describe '.cpu_time' do
- it 'returns a Float' do
- expect(described_class.cpu_time).to be_an(Float)
- end
- end
-
- describe '.real_time' do
- it 'returns a Float' do
- expect(described_class.real_time).to be_an(Float)
- end
- end
-
- describe '.monotonic_time' do
- it 'returns a Float' do
- expect(described_class.monotonic_time).to be_an(Float)
- end
- end
-
- describe '.thread_cpu_time' do
- it 'returns cpu_time on supported platform' do
- stub_const("Process::CLOCK_THREAD_CPUTIME_ID", 16)
-
- expect(Process).to receive(:clock_gettime)
- .with(16, kind_of(Symbol)) { 0.111222333 }
-
- expect(described_class.thread_cpu_time).to eq(0.111222333)
- end
-
- it 'returns nil on unsupported platform' do
- hide_const("Process::CLOCK_THREAD_CPUTIME_ID")
-
- expect(described_class.thread_cpu_time).to be_nil
- end
- end
-
- describe '.thread_cpu_duration' do
- let(:start_time) { described_class.thread_cpu_time }
-
- it 'returns difference between start and current time' do
- stub_const("Process::CLOCK_THREAD_CPUTIME_ID", 16)
-
- expect(Process).to receive(:clock_gettime)
- .with(16, kind_of(Symbol))
- .and_return(
- 0.111222333,
- 0.222333833
- )
-
- expect(described_class.thread_cpu_duration(start_time)).to eq(0.1111115)
- end
-
- it 'returns nil on unsupported platform' do
- hide_const("Process::CLOCK_THREAD_CPUTIME_ID")
-
- expect(described_class.thread_cpu_duration(start_time)).to be_nil
- end
- end
-
- def mock_existing_proc_file(path, content)
- allow(File).to receive(:open).with(path) { |_path, &block| block.call(StringIO.new(content)) }
- end
-
- def mock_missing_proc_file
- allow(File).to receive(:open).and_raise(Errno::ENOENT)
- end
-end