youtubebeat/vendor/github.com/elastic/beats/metricbeat/module/system/process/cgroup.go

220 lines
5.6 KiB
Go

// 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.
package process
import (
"strconv"
"github.com/elastic/beats/libbeat/common"
"github.com/elastic/gosigar/cgroup"
)
// cgroupStatsToMap returns a MapStr containing the data from the stats object.
// If stats is nil then nil is returned.
func cgroupStatsToMap(stats *cgroup.Stats) common.MapStr {
if stats == nil {
return nil
}
cgroup := common.MapStr{}
// id and path are only available when all subsystems share a common path.
if stats.ID != "" {
cgroup["id"] = stats.ID
}
if stats.Path != "" {
cgroup["path"] = stats.Path
}
if cpu := cgroupCPUToMapStr(stats.CPU); cpu != nil {
cgroup["cpu"] = cpu
}
if cpuacct := cgroupCPUAccountingToMapStr(stats.CPUAccounting); cpuacct != nil {
cgroup["cpuacct"] = cpuacct
}
if memory := cgroupMemoryToMapStr(stats.Memory); memory != nil {
cgroup["memory"] = memory
}
if blkio := cgroupBlockIOToMapStr(stats.BlockIO); blkio != nil {
cgroup["blkio"] = blkio
}
return cgroup
}
// cgroupCPUToMapStr returns a MapStr containing CPUSubsystem data. If the
// cpu parameter is nil then nil is returned.
func cgroupCPUToMapStr(cpu *cgroup.CPUSubsystem) common.MapStr {
if cpu == nil {
return nil
}
return common.MapStr{
"id": cpu.ID,
"path": cpu.Path,
"cfs": common.MapStr{
"period": common.MapStr{
"us": cpu.CFS.PeriodMicros,
},
"quota": common.MapStr{
"us": cpu.CFS.QuotaMicros,
},
"shares": cpu.CFS.Shares,
},
"rt": common.MapStr{
"period": common.MapStr{
"us": cpu.RT.PeriodMicros,
},
"runtime": common.MapStr{
"us": cpu.RT.RuntimeMicros,
},
},
"stats": common.MapStr{
"periods": cpu.Stats.Periods,
"throttled": common.MapStr{
"periods": cpu.Stats.ThrottledPeriods,
"ns": cpu.Stats.ThrottledTimeNanos,
},
},
}
}
// cgroupCPUAccountingToMapStr returns a MapStr containing
// CPUAccountingSubsystem data. If the cpuacct parameter is nil then nil is
// returned.
func cgroupCPUAccountingToMapStr(cpuacct *cgroup.CPUAccountingSubsystem) common.MapStr {
if cpuacct == nil {
return nil
}
perCPUUsage := common.MapStr{}
for i, usage := range cpuacct.UsagePerCPU {
perCPUUsage[strconv.Itoa(i+1)] = usage
}
return common.MapStr{
"id": cpuacct.ID,
"path": cpuacct.Path,
"total": common.MapStr{
"ns": cpuacct.TotalNanos,
},
"percpu": perCPUUsage,
"stats": common.MapStr{
"system": common.MapStr{
"ns": cpuacct.Stats.SystemNanos,
},
"user": common.MapStr{
"ns": cpuacct.Stats.UserNanos,
},
},
}
}
// cgroupMemoryToMapStr returns a MapStr containing MemorySubsystem data. If the
// memory parameter is nil then nil is returned.
func cgroupMemoryToMapStr(memory *cgroup.MemorySubsystem) common.MapStr {
if memory == nil {
return nil
}
addMemData := func(key string, m common.MapStr, data cgroup.MemoryData) {
m[key] = common.MapStr{
"failures": data.FailCount,
"limit": common.MapStr{
"bytes": data.Limit,
},
"usage": common.MapStr{
"bytes": data.Usage,
"max": common.MapStr{
"bytes": data.MaxUsage,
},
},
}
}
memMap := common.MapStr{
"id": memory.ID,
"path": memory.Path,
}
addMemData("mem", memMap, memory.Mem)
addMemData("memsw", memMap, memory.MemSwap)
addMemData("kmem", memMap, memory.Kernel)
addMemData("kmem_tcp", memMap, memory.KernelTCP)
memMap["stats"] = common.MapStr{
"active_anon": common.MapStr{
"bytes": memory.Stats.ActiveAnon,
},
"active_file": common.MapStr{
"bytes": memory.Stats.ActiveFile,
},
"cache": common.MapStr{
"bytes": memory.Stats.Cache,
},
"hierarchical_memory_limit": common.MapStr{
"bytes": memory.Stats.HierarchicalMemoryLimit,
},
"hierarchical_memsw_limit": common.MapStr{
"bytes": memory.Stats.HierarchicalMemswLimit,
},
"inactive_anon": common.MapStr{
"bytes": memory.Stats.InactiveAnon,
},
"inactive_file": common.MapStr{
"bytes": memory.Stats.InactiveFile,
},
"mapped_file": common.MapStr{
"bytes": memory.Stats.MappedFile,
},
"page_faults": memory.Stats.PageFaults,
"major_page_faults": memory.Stats.MajorPageFaults,
"pages_in": memory.Stats.PagesIn,
"pages_out": memory.Stats.PagesOut,
"rss": common.MapStr{
"bytes": memory.Stats.RSS,
},
"rss_huge": common.MapStr{
"bytes": memory.Stats.RSSHuge,
},
"swap": common.MapStr{
"bytes": memory.Stats.Swap,
},
"unevictable": common.MapStr{
"bytes": memory.Stats.Unevictable,
},
}
return memMap
}
// cgroupBlockIOToMapStr returns a MapStr containing BlockIOSubsystem data.
// If the blockIO parameter is nil then nil is returned.
func cgroupBlockIOToMapStr(blockIO *cgroup.BlockIOSubsystem) common.MapStr {
if blockIO == nil {
return nil
}
return common.MapStr{
"id": blockIO.ID,
"path": blockIO.Path,
"total": common.MapStr{
"bytes": blockIO.Throttle.TotalBytes,
"ios": blockIO.Throttle.TotalIOs,
},
}
}