@@ -396,3 +396,54 @@ def test_mem_from_cgroup2_max_handling(elasticapm_client, tmpdir):
396
396
397
397
assert "system.process.cgroup.memory.mem.limit.bytes" not in data ["samples" ]
398
398
assert "system.process.cgroup.memory.mem.usage.bytes" not in data ["samples" ]
399
+
400
+
401
+ def test_mem_from_cgroup_files_dont_exist (elasticapm_client , tmpdir ):
402
+ # it appears that on Google App engine, there is a possibility of
403
+ # memory.limit_in_bytes existing while memory.usage_in_bytes does not.
404
+ # See https://github.com/elastic/apm-agent-python/issues/985
405
+ proc_stat_self = os .path .join (tmpdir .strpath , "self-stat" )
406
+ proc_stat = os .path .join (tmpdir .strpath , "stat" )
407
+ proc_meminfo = os .path .join (tmpdir .strpath , "meminfo" )
408
+ cgroup_memory_limit = os .path .join (tmpdir .strpath , "memory" , "memory.limit_in_bytes" )
409
+ # intentionally commented out
410
+ # cgroup_memory_usage = os.path.join(tmpdir.strpath, "memory", "memory.usage_in_bytes")
411
+ cgroup_memory_stat = os .path .join (tmpdir .strpath , "memory" , "memory.stat" )
412
+ proc_self_cgroup = os .path .join (tmpdir .strpath , "cgroup" )
413
+ os .mkdir (os .path .join (tmpdir .strpath , "memory" ))
414
+ proc_self_mount = os .path .join (tmpdir .strpath , "mountinfo" )
415
+
416
+ for path , content in (
417
+ (proc_stat , TEMPLATE_PROC_STAT_DEBIAN .format (user = 0 , idle = 0 )),
418
+ (proc_stat_self , TEMPLATE_PROC_STAT_SELF .format (utime = 0 , stime = 0 )),
419
+ (proc_meminfo , TEMPLATE_PROC_MEMINFO ),
420
+ (cgroup_memory_limit , TEMPLATE_CGROUP_MEM_LIMIT_IN_BYTES_LIMITED ),
421
+ # intentionally commented out
422
+ # (cgroup_memory_usage, TEMPLATE_CGROUP_MEM_USAGE_IN_BYTES),
423
+ (cgroup_memory_stat , TEMPLATE_CGROUP_MEM_STAT ),
424
+ (proc_self_cgroup , "9:memory:/slice" ),
425
+ (
426
+ proc_self_mount ,
427
+ "39 30 0:35 / "
428
+ + tmpdir .strpath
429
+ + "/memory rw,nosuid,nodev,noexec,relatime shared:10 - cgroup cgroup rw,seclabel,memory\n " ,
430
+ ),
431
+ ):
432
+ with open (path , mode = "w" ) as f :
433
+ f .write (content )
434
+ metricset = CPUMetricSet (
435
+ MetricsRegistry (elasticapm_client ),
436
+ sys_stats_file = proc_stat ,
437
+ process_stats_file = proc_stat_self ,
438
+ memory_stats_file = proc_meminfo ,
439
+ proc_self_cgroup = proc_self_cgroup ,
440
+ mount_info = proc_self_mount ,
441
+ )
442
+
443
+ assert metricset .cgroup_files .limit is not None
444
+ assert metricset .cgroup_files .usage is None
445
+
446
+ data = next (metricset .collect ())
447
+
448
+ assert "system.process.cgroup.memory.mem.limit.bytes" in data ["samples" ]
449
+ assert "system.process.cgroup.memory.mem.usage.bytes" not in data ["samples" ]
0 commit comments