1// Copyright (C) 2016 Space Monkey, Inc. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15package environment 16 17import ( 18 "fmt" 19 "io/ioutil" 20 21 "github.com/spacemonkeygo/monkit/v3" 22) 23 24func proc(cb func(key monkit.SeriesKey, field string, val float64)) { 25 var stat procSelfStat 26 err := readProcSelfStat(&stat) 27 if err == nil { 28 monkit.StatSourceFromStruct(monkit.NewSeriesKey("proc_stat"), &stat).Stats(cb) 29 } 30 31 var statm procSelfStatm 32 err = readProcSelfStatm(&statm) 33 if err == nil { 34 monkit.StatSourceFromStruct(monkit.NewSeriesKey("proc_statm"), &statm).Stats(cb) 35 } 36} 37 38type procSelfStat struct { 39 Pid int64 40 Comm string 41 State byte 42 Ppid int64 43 Pgrp int64 44 Session int64 45 TtyNr int64 46 Tpgid int64 47 Flags uint64 48 Minflt uint64 49 Cminflt uint64 50 Majflt uint64 51 Cmajflt uint64 52 Utime uint64 53 Stime uint64 54 Cutime int64 55 Cstime int64 56 Priority int64 57 Nice int64 58 NumThreads int64 59 Itrealvalue int64 60 Starttime uint64 61 Vsize uint64 62 Rss int64 63 Rsslim uint64 64 Startcode uint64 65 Endcode uint64 66 Startstack uint64 67 Kstkesp uint64 68 Kstkeip uint64 69 Signal uint64 70 Blocked uint64 71 Sigignore uint64 72 Sigcatch uint64 73 Wchan uint64 74 Nswap uint64 75 Cnswap uint64 76 ExitSignal int64 77 Processor int64 78 RtPriority uint64 79 Policy uint64 80 DelayAcctBlkioTicks uint64 81 GuestTime uint64 82 CguestTime int64 83} 84 85func readProcSelfStat(s *procSelfStat) error { 86 data, err := ioutil.ReadFile("/proc/self/stat") 87 if err != nil { 88 return err 89 } 90 _, err = fmt.Sscanf(string(data), "%d %s %c %d %d %d %d %d %d %d %d "+ 91 "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d "+ 92 "%d %d %d %d %d %d %d %d %d %d", &s.Pid, &s.Comm, &s.State, &s.Ppid, 93 &s.Pgrp, &s.Session, &s.TtyNr, &s.Tpgid, &s.Flags, &s.Minflt, &s.Cminflt, 94 &s.Majflt, &s.Cmajflt, &s.Utime, &s.Stime, &s.Cutime, &s.Cstime, 95 &s.Priority, &s.Nice, &s.NumThreads, &s.Itrealvalue, &s.Starttime, 96 &s.Vsize, &s.Rss, &s.Rsslim, &s.Startcode, &s.Endcode, &s.Startstack, 97 &s.Kstkesp, &s.Kstkeip, &s.Signal, &s.Blocked, &s.Sigignore, &s.Sigcatch, 98 &s.Wchan, &s.Nswap, &s.Cnswap, &s.ExitSignal, &s.Processor, &s.RtPriority, 99 &s.Policy, &s.DelayAcctBlkioTicks, &s.GuestTime, &s.CguestTime) 100 return err 101} 102 103type procSelfStatm struct { 104 Size int 105 Resident int 106 Share int 107 Text int 108 Lib int 109 Data int 110 Dt int 111} 112 113func readProcSelfStatm(s *procSelfStatm) error { 114 data, err := ioutil.ReadFile("/proc/self/statm") 115 if err != nil { 116 return err 117 } 118 _, err = fmt.Sscanf(string(data), "%d %d %d %d %d %d %d", &s.Size, 119 &s.Resident, &s.Share, &s.Text, &s.Lib, &s.Data, &s.Dt) 120 return err 121} 122