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