diff --git a/connector/collector/kubernetes.go b/connector/collector/kubernetes.go index 7404ab4..ead039b 100644 --- a/connector/collector/kubernetes.go +++ b/connector/collector/kubernetes.go @@ -1,14 +1,13 @@ package collector import ( + "encoding/json" "time" - "k8s.io/metrics/pkg/apis/metrics/v1alpha1" clientset "k8s.io/metrics/pkg/client/clientset/versioned" "github.com/bcicen/ctop/config" "github.com/bcicen/ctop/models" - "k8s.io/api/core/v1" "k8s.io/client-go/kubernetes" ) @@ -25,6 +24,17 @@ type Kubernetes struct { lastCpu float64 lastSysCpu float64 scaleCpu bool + interval time.Duration +} + +type Metric struct { + Timestamp time.Time `json:"timestamp"` + Value int64 `json:"value"` +} + +type Response struct { + Metrics []Metric `json:"metrics"` + LatestTimestamp time.Time `json:"latest_timestamp"` } func NewKubernetes(client *kubernetes.Clientset, name string) *Kubernetes { @@ -34,9 +44,14 @@ func NewKubernetes(client *kubernetes.Clientset, name string) *Kubernetes { client: clientset.New(client.RESTClient()), clientset: client, scaleCpu: config.GetSwitchVal("scaleCpu"), + interval: time.Duration(30) * time.Second, } } +func buildURL(namespace, podName string) string { + return "/api/v1/namespaces/kube-system/services/heapster/proxy/api/v1/model/namespaces/" + namespace + "/pods/" + podName +} + func (k *Kubernetes) Start() { k.done = make(chan bool) k.stream = make(chan models.Metrics) @@ -44,18 +59,14 @@ func (k *Kubernetes) Start() { go func() { k.running = false for { - - result := &v1alpha1.PodMetrics{} - err := k.clientset.RESTClient().Get().AbsPath("/api/v1/namespaces/kube-system/services/http:heapster:/proxy/apis/metrics/v1alpha1/namespaces/" + config.GetVal("namespace") + "/pods/" + k.name).Do().Into(result) - - if err != nil { - log.Errorf("has error %s here %s", k.name, err.Error()) - time.Sleep(1 * time.Second) - continue - } - k.ReadCPU(result) - k.ReadMem(result) + log.Debugf("collect k8s metrics %s\n", k.name) + k.ReadCPU() + k.ReadMem() + k.ReadNetRx() + k.ReadNetTx() + k.ReadUptime() k.stream <- k.Metrics + time.Sleep(k.interval) } }() @@ -80,40 +91,92 @@ func (c *Kubernetes) Stop() { c.done <- true } -func (k *Kubernetes) ReadCPU(metrics *v1alpha1.PodMetrics) { - all := int64(0) - for _, c := range metrics.Containers { - v := c.Usage[v1.ResourceCPU] - all += v.Value() +func (k *Kubernetes) ReadCPU() { + cpu, err := k.read("/cpu/usage_rate") + + if err != nil { + log.Errorf("collecte network cpu metric has error %s here %s", k.name, err.Error()) + time.Sleep(1 * time.Second) + return } - if all != 0 { - k.CPUUtil = round(float64(all)) + + // TODO: heapster returning usage CPU in micro values without point so 0.004 is 4 + // because k8s calculate percent usage of all available CPU in cluster + if cpu != 0 { + k.CPUUtil = round(float64(cpu)) } } -func (k *Kubernetes) ReadMem(metrics *v1alpha1.PodMetrics) { - all := int64(0) - for _, c := range metrics.Containers { - v := c.Usage[v1.ResourceMemory] - a, ok := v.AsInt64() - if ok { - all += a - } +func (k *Kubernetes) ReadMem() { + usage, err := k.read("/memory/usage") + if err != nil { + log.Errorf("collecte network memory metric has error %s here %s", k.name, err.Error()) + time.Sleep(1 * time.Second) + return + } + cache, err := k.read("/memory/cache") + if err != nil { + log.Errorf("collecte network memory metric has error %s here %s", k.name, err.Error()) + time.Sleep(1 * time.Second) + return } - k.MemUsage = all - k.MemLimit = int64(0) + k.MemUsage = usage - cache + + limit, err := k.read("/memory/limit") + if err != nil { + log.Errorf("collecte network memory metric has error %s here %s", k.name, err.Error()) + time.Sleep(1 * time.Second) + return + } + k.MemLimit = limit //k.MemPercent = percent(float64(k.MemUsage), float64(k.MemLimit)) } -//func (c *Kubernetes) ReadNet(stats *api.Stats) { -// var rx, tx int64 -// for _, network := range stats.Networks { -// rx += int64(network.RxBytes) -// tx += int64(network.TxBytes) -// } -// c.NetRx, c.NetTx = rx, tx -//} -// +func (k *Kubernetes) ReadNetRx() { + rx, err := k.read("/network/rx_rate") + if err != nil { + log.Errorf("collecte network rx_rate metric has error %s here %s", k.name, err.Error()) + time.Sleep(1 * time.Second) + return + } + k.NetRx = rx +} + +func (k *Kubernetes) ReadNetTx() { + tx, err := k.read("/network/tx_rate") + if err != nil { + log.Errorf("collecte network tx_rate metric has error %s here %s", k.name, err.Error()) + time.Sleep(1 * time.Second) + return + } + k.NetTx = tx +} + +func (k *Kubernetes) ReadUptime() { + uptime, err := k.read("/uptime") + if err != nil { + log.Errorf("collecte network uptime metric has error %s here %s", k.name, err.Error()) + time.Sleep(1 * time.Second) + return + } + k.Uptime = uptime +} + +func (k *Kubernetes) read(name string) (int64, error) { + m := &Response{} + url := buildURL(config.GetVal("namespace"), k.name) + "/metrics" + name + log.Debugf("get metrics: %s", url) + b, err := k.clientset.RESTClient().Get().AbsPath(url).Do().Raw() + if err != nil { + return 0, err + } + err = json.Unmarshal(b, m) + if err != nil { + return 0, err + } + return m.Metrics[len(m.Metrics)-1].Value, nil +} + //func (c *Kubernetes) ReadIO(stats *api.Stats) { // var read, write int64 // for _, blk := range stats.BlkioStats.IOServiceBytesRecursive { diff --git a/cwidgets/compact/header.go b/cwidgets/compact/header.go index 6dbd298..74f8e96 100644 --- a/cwidgets/compact/header.go +++ b/cwidgets/compact/header.go @@ -12,7 +12,7 @@ type CompactHeader struct { } func NewCompactHeader() *CompactHeader { - fields := []string{"", "NAME", "CID", "CPU", "MEM", "NET RX/TX", "IO R/W", "PIDS"} + fields := []string{"", "NAME", "CID", "CPU", "MEM", "NET RX/TX", "IO R/W", "PIDS", "UPTIME"} ch := &CompactHeader{} ch.Height = 2 for _, f := range fields { diff --git a/cwidgets/compact/main.go b/cwidgets/compact/main.go index af948fc..31ba38e 100644 --- a/cwidgets/compact/main.go +++ b/cwidgets/compact/main.go @@ -18,6 +18,7 @@ type Compact struct { Net *TextCol IO *TextCol Pids *TextCol + Uptime *TextCol Bg *RowBg X, Y int Width int @@ -38,6 +39,7 @@ func NewCompact(id string) *Compact { Net: NewTextCol("-"), IO: NewTextCol("-"), Pids: NewTextCol("-"), + Uptime: NewTextCol("-"), Bg: NewRowBg(), X: 1, Height: 1, @@ -70,6 +72,7 @@ func (row *Compact) SetMetrics(m models.Metrics) { row.SetMem(m.MemUsage, m.MemLimit, m.MemPercent) row.SetIO(m.IOBytesRead, m.IOBytesWrite) row.SetPids(m.Pids) + row.SetUptime(m.Uptime) } // Set gauges, counters to default unread values @@ -79,6 +82,7 @@ func (row *Compact) Reset() { row.Net.Reset() row.IO.Reset() row.Pids.Reset() + row.Uptime.Reset() } func (row *Compact) GetHeight() int { @@ -137,6 +141,7 @@ func (row *Compact) Buffer() ui.Buffer { buf.Merge(row.Net.Buffer()) buf.Merge(row.IO.Buffer()) buf.Merge(row.Pids.Buffer()) + buf.Merge(row.Uptime.Buffer()) return buf } @@ -150,6 +155,7 @@ func (row *Compact) all() []ui.GridBufferer { row.Net, row.IO, row.Pids, + row.Uptime, } } @@ -163,6 +169,7 @@ func (row *Compact) Highlight() { row.Net.Highlight() row.IO.Highlight() row.Pids.Highlight() + row.Uptime.Highlight() } } @@ -176,6 +183,7 @@ func (row *Compact) UnHighlight() { row.Net.UnHighlight() row.IO.UnHighlight() row.Pids.UnHighlight() + row.Uptime.UnHighlight() } } diff --git a/cwidgets/compact/setters.go b/cwidgets/compact/setters.go index 779991e..db5d2bf 100644 --- a/cwidgets/compact/setters.go +++ b/cwidgets/compact/setters.go @@ -3,6 +3,7 @@ package compact import ( "fmt" "strconv" + "time" "github.com/bcicen/ctop/cwidgets" ui "github.com/gizak/termui" @@ -23,6 +24,19 @@ func (row *Compact) SetPids(val int) { row.Pids.Set(label) } +func (row *Compact) SetUptime(val int64) { + d := time.Duration(val) * time.Millisecond + label := "- h" + if d.Hours() < 1.0 { + label = fmt.Sprintf("%.0fm", d.Minutes()) + } else if d.Hours() < 24.0 { + label = fmt.Sprintf("%.0fh", d.Hours()) + } else { + label = fmt.Sprintf("%dd", int(d.Hours())%24) + } + row.Uptime.Set(label) +} + func (row *Compact) SetCPU(val int) { row.Cpu.BarColor = colorScale(val) row.Cpu.Label = fmt.Sprintf("%s%%", strconv.Itoa(val)) diff --git a/cwidgets/compact/util.go b/cwidgets/compact/util.go index e634ed9..a7dd1e9 100644 --- a/cwidgets/compact/util.go +++ b/cwidgets/compact/util.go @@ -19,7 +19,8 @@ var colWidths = []int{ 0, // memory 0, // net 0, // io - 4, // pids + 0, // pids + 6, // uptime } // Calculate per-column width, given total width diff --git a/go.mod b/go.mod index 1d36d0f..bbc1adb 100644 --- a/go.mod +++ b/go.mod @@ -36,6 +36,7 @@ require ( github.com/opencontainers/runc v0.1.1 github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/sah4ez/ctop v0.6.1 // indirect github.com/seccomp/libseccomp-golang v0.0.0-20150813023252-1b506fc7c24e // indirect github.com/spf13/pflag v1.0.3 // indirect github.com/stretchr/testify v1.2.2 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..55d5105 --- /dev/null +++ b/go.sum @@ -0,0 +1,109 @@ +github.com/Azure/go-ansiterm v0.0.0-20160622173216-fa152c58bc15/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/BurntSushi/toml v0.3.0 h1:e1/Ivsx3Z0FVTV0NSOv/aVgbUWyQuzj7DDnFblkRvsY= +github.com/BurntSushi/toml v0.3.0/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Microsoft/go-winio v0.3.8/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= +github.com/Sirupsen/logrus v0.0.0-20150423025312-26709e271410 h1:RxP6uUzJlS1Qa3+HYls3u+nQMKlnqC3RhL7wWC4Y4+E= +github.com/Sirupsen/logrus v0.0.0-20150423025312-26709e271410/go.mod h1:rmk17hk6i8ZSAJkSDa7nOxamrG+SP4P0mm+DAvExv4U= +github.com/bcicen/termui v0.0.0-20180326052246-4eb80249d3f5 h1:2pI3ZsoefWIi++8EqmANoC7Px/v2lRwnleVUcCuFgLg= +github.com/bcicen/termui v0.0.0-20180326052246-4eb80249d3f5/go.mod h1:yIA9ITWZD1p4/DvCQ44xvhyVb9XEUlVnY1rzGSHwbiM= +github.com/c9s/goprocinfo v0.0.0-20170609001544-b34328d6e0cd h1:xqaBnULC8wEnQpRDXAsDgXkU/STqoluz1REOoegSfNU= +github.com/c9s/goprocinfo v0.0.0-20170609001544-b34328d6e0cd/go.mod h1:uEyr4WpAH4hio6LFriaPkL938XnrvLpNPmQHBdrmbIE= +github.com/coreos/go-systemd v0.0.0-20151104194251-b4a58d95188d h1:MJ4ge3i0lehw+gE3JcGUUp8TmWjsLAlQlhmdASs/9wk= +github.com/coreos/go-systemd v0.0.0-20151104194251-b4a58d95188d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/docker/docker v0.0.0-20170502054910-90d35abf7b35 h1:zQuy/ry/KtSvCczhEPo+ud47S8alruA/Z9NDlz7EzVo= +github.com/docker/docker v0.0.0-20170502054910-90d35abf7b35/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.0.0-20170301234100-a2afab980204 h1:JYhQLEn7v7EtrpA9ByRz51gwlk8qt12EGP9XlbX/qw4= +github.com/docker/go-connections v0.0.0-20170301234100-a2afab980204/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.3.2 h1:Kjm80apys7gTtfVmCvVY8gwu10uofaFSrmAKOVrtueE= +github.com/docker/go-units v0.3.2/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/fsouza/go-dockerclient v0.0.0-20170307141636-318513eb1ab2 h1:JuVaWSoRMBrstn2l8cxKXjK8l/qurk5qyJ9dq7EIQmU= +github.com/fsouza/go-dockerclient v0.0.0-20170307141636-318513eb1ab2/go.mod h1:KpcjM623fQYE9MZiTGzKhjfxXAV9wbyX2C1cyRHfhl0= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55 h1:oIgNYSrSUbNH5DJh6DMhU1PiOKOYIHNxrV3djLsLpEI= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/gogo/protobuf v1.1.1 h1:72R+M5VuhED/KujmZVcIquuo8mBgX4oVda//DQb3PXo= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf h1:+RRA9JqSOZFfKrOeqr2z77+8R2RKyh8PG66dcu1V0ck= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/googleapis/gnostic v0.2.0 h1:l6N3VoaVzTncYYW+9yOz2LJJammFZGBO13sqgEhpy9g= +github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f h1:ShTPMJQes6tubcjzGMODIVG5hlrCeImaBnZzKF2N8SM= +github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/hashicorp/go-cleanhttp v0.0.0-20170211013415-3573b8b52aa7 h1:67fHcS+inUoiIqWCKIqeDuq2AlPHNHPiTqp97LdQ+bc= +github.com/hashicorp/go-cleanhttp v0.0.0-20170211013415-3573b8b52aa7/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= +github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/jgautheron/codename-generator v0.0.0-20150829203204-16d037c7cc3c h1:/hc+TxW4Q1v6aqNPHE5jiaNF2xEK0CzWTgo25RQhQ+U= +github.com/jgautheron/codename-generator v0.0.0-20150829203204-16d037c7cc3c/go.mod h1:FJRkXmPrkHw0WDjB/LXMUhjWJ112Y6JUYnIVBOy8oH8= +github.com/json-iterator/go v1.1.5 h1:gL2yXlmiIo4+t+y32d4WGwOjKGYcGOuyrg46vadswDE= +github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/mattn/go-runewidth v0.0.0-20170201023540-14207d285c6c h1:eFzthqtg3W6Pihj3DMTXLAF4f+ge5r5Ie5g6HLIZAF0= +github.com/mattn/go-runewidth v0.0.0-20170201023540-14207d285c6c/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= +github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/nsf/termbox-go v0.0.0-20180303152453-e2050e41c884 h1:fcs71SMqqDhUD+PbpIv9xf3EH9F9s6HfiLwr6jKm1VA= +github.com/nsf/termbox-go v0.0.0-20180303152453-e2050e41c884/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ= +github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ= +github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= +github.com/op/go-logging v0.0.0-20160211212156-b2cb9fa56473 h1:J1QZwDXgZ4dJD2s19iqR9+U00OWM2kDzbf1O/fmvCWg= +github.com/op/go-logging v0.0.0-20160211212156-b2cb9fa56473/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/runc v0.1.1 h1:GlxAyO6x8rfZYN9Tt0Kti5a/cP41iuiO2yYT0IJGY8Y= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sah4ez/ctop v0.6.1 h1:NXP9v10ZgBq8bHzX2UyOSjzPrmrTIUk4YofKWcxO84c= +github.com/sah4ez/ctop v0.6.1/go.mod h1:Q74wOU81+00gag3YQ7OoJXZauj/epEE2c73q5CaNfzU= +github.com/seccomp/libseccomp-golang v0.0.0-20150813023252-1b506fc7c24e/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/syndtr/gocapability v0.0.0-20150716010906-2c00daeb6c3b h1:UzwAjzrPQVJoxLfb26YI2WRrhD3g09ZHt9vAQckWiPY= +github.com/syndtr/gocapability v0.0.0-20150716010906-2c00daeb6c3b/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/vishvananda/netlink v0.0.0-20150820014904-1e2e08e8a2dc h1:0HAHLwEY4k1VqaO1SzBi4XxT0KA06Cv+QW2LXknBk9g= +github.com/vishvananda/netlink v0.0.0-20150820014904-1e2e08e8a2dc/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85 h1:et7+NAX3lLIk5qUCTA9QelBjGE/NkhzYw/mhnr0s7nI= +golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225 h1:kNX+jCowfMYzvlSvJu5pQWEmyWFrBXJ3PBy10xKMXK8= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/oauth2 v0.0.0-20181128211412-28207608b838 h1:Tfp63pG3E68J3jSmfXHbBoEgU5jJm6bGQCcDvQr1Yb0= +golang.org/x/oauth2 v0.0.0-20181128211412-28207608b838/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35 h1:YAFjXN64LMvktoUZH9zgY4lGc/msGN7HQfoSuKCgaDU= +golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +k8s.io/api v0.0.0-20181130031204-d04500c8c3dd h1:5aHsneN62ehs/tdtS9tWZlhVk68V7yms/Qw7nsGmvCA= +k8s.io/api v0.0.0-20181130031204-d04500c8c3dd/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= +k8s.io/apimachinery v0.0.0-20181201231028-18a5ff3097b4 h1:JbAkABSztlJL76bNqKsGGBXf9++ZHClITsuRKrZ8wfw= +k8s.io/apimachinery v0.0.0-20181201231028-18a5ff3097b4/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= +k8s.io/client-go v9.0.0+incompatible h1:NXWpDuPFeVB5lYP1fTqJUtwigjtmRXJNtndnN53ldGI= +k8s.io/client-go v9.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= +k8s.io/klog v0.1.0 h1:I5HMfc/DtuVaGR1KPwUrTc476K8NCqNBldC7H4dYEzk= +k8s.io/klog v0.1.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/metrics v0.0.0-20181121073115-d8618695b08f h1:HyUoIBzks9xTaSnMJ6kv/SSmwaQQccokuiriu2cV0aA= +k8s.io/metrics v0.0.0-20181121073115-d8618695b08f/go.mod h1:a25VAbm3QT3xiVl1jtoF1ueAKQM149UdZ+L93ePfV3M= +sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/models/main.go b/models/main.go index feb23ce..90b0e22 100644 --- a/models/main.go +++ b/models/main.go @@ -17,6 +17,7 @@ type Metrics struct { IOBytesRead int64 IOBytesWrite int64 Pids int + Uptime int64 } func NewMetrics() Metrics { @@ -29,5 +30,6 @@ func NewMetrics() Metrics { IOBytesRead: -1, IOBytesWrite: -1, Pids: -1, + Uptime: -1, } }