From 842a2ec00e77b9581884b1167a2ae1676212f229 Mon Sep 17 00:00:00 2001 From: Bo Tran Date: Tue, 26 Jan 2021 18:44:06 +0700 Subject: [PATCH] add gpu collector --- collector/gpu_common.go | 242 ++++++++++++++++++++++++++++++++++++++++ go.mod | 4 +- go.sum | 16 +++ 3 files changed, 261 insertions(+), 1 deletion(-) create mode 100644 collector/gpu_common.go diff --git a/collector/gpu_common.go b/collector/gpu_common.go new file mode 100644 index 0000000000..323697d4be --- /dev/null +++ b/collector/gpu_common.go @@ -0,0 +1,242 @@ +// This file is part of bizfly-agent +// +// Copyright (C) 2020 BizFly Cloud +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see + +// +build !nogpu + +package collector + +import ( + "strconv" + "time" + + "github.com/go-kit/kit/log" + "github.com/go-kit/kit/log/level" + "github.com/prometheus/client_golang/prometheus" + + "github.com/mindprince/gonvml" +) + +var ( + averageDuration = 10 * time.Second +) + +type gpuCollector struct { + gpuMinorNumber *prometheus.Desc + gpuName *prometheus.Desc + gpuUUID *prometheus.Desc + gpuTemperature *prometheus.Desc + gpuPowerUsage *prometheus.Desc + gpuFanSpeed *prometheus.Desc + gpuMemoryTotal *prometheus.Desc + gpuMemoryUsed *prometheus.Desc + gpuUtilizationMemory *prometheus.Desc + gpuUtilizationGPU *prometheus.Desc + gpuUtilizationGPUAverage *prometheus.Desc + logger log.Logger +} + +type gpuDevice struct { + Index string + MinorNumber string + Name string + UUID string + Temperature float64 + PowerUsage float64 + FanSpeed float64 + MemoryTotal float64 + MemoryUsed float64 + UtilizationMemory float64 + UtilizationGPU float64 + UtilizationGPUAverage float64 +} + +type gpuMetrics struct { + Version string + Devices []gpuDevice +} + +func init() { + registerCollector("gpu", defaultEnabled, NewGPUCollector) +} + +// NewGPUCollector returns a new Collector exposing CPU stats. +func NewGPUCollector(logger log.Logger) (Collector, error) { + subsystem := "gpu" + return &gpuCollector{ + gpuTemperature: prometheus.NewDesc( + prometheus.BuildFQName(namespace, subsystem, "Temperature"), + "Temperature of GPU device in system", + []string{"minornumber", "name", "uuid", "system_driver_version"}, nil, + ), + gpuPowerUsage: prometheus.NewDesc( + prometheus.BuildFQName(namespace, subsystem, "PowerUsage"), + "Power Usage of GPU device in system", + []string{"minornumber", "name", "uuid", "system_driver_version"}, nil, + ), + gpuFanSpeed: prometheus.NewDesc( + prometheus.BuildFQName(namespace, subsystem, "FanSpeed"), + "Fan Speed of GPU device in system", + []string{"minornumber", "name", "uuid", "system_driver_version"}, nil, + ), + gpuMemoryTotal: prometheus.NewDesc( + prometheus.BuildFQName(namespace, subsystem, "MemoryTotal_Bytes"), + "Memory Total of GPU device in system", + []string{"minornumber", "name", "uuid", "system_driver_version"}, nil, + ), + gpuMemoryUsed: prometheus.NewDesc( + prometheus.BuildFQName(namespace, subsystem, "MemoryUsed_Bytes"), + "Memory Used of GPU device in system", + []string{"minornumber", "name", "uuid", "system_driver_version"}, nil, + ), + gpuUtilizationMemory: prometheus.NewDesc( + prometheus.BuildFQName(namespace, subsystem, "UtilizationMemory"), + "Utilization Memory of GPU device in system", + []string{"minornumber", "name", "uuid", "system_driver_version"}, nil, + ), + gpuUtilizationGPU: prometheus.NewDesc( + prometheus.BuildFQName(namespace, subsystem, "UtilizationGPU"), + "Utilization of GPU device in system", + []string{"minornumber", "name", "uuid", "system_driver_version"}, nil, + ), + gpuUtilizationGPUAverage: prometheus.NewDesc( + prometheus.BuildFQName(namespace, subsystem, "UtilizationGPUAverage"), + "Utilization Average of GPU device in system", + []string{"minornumber", "name", "uuid", "system_driver_version"}, nil, + ), + logger: logger, + }, nil +} + +func (g *gpuCollector) Update(ch chan<- prometheus.Metric) error { + gpu, err := collectMetricDevice() + if err != nil { + level.Debug(g.logger).Log("msg", "gpu information is unavailable to collect") + return nil + } + + for _, metrics := range gpu.Devices { + ch <- prometheus.MustNewConstMetric( + g.gpuTemperature, prometheus.GaugeValue, metrics.Temperature, metrics.MinorNumber, metrics.Name, metrics.UUID, gpu.Version) + ch <- prometheus.MustNewConstMetric( + g.gpuPowerUsage, prometheus.GaugeValue, metrics.PowerUsage, metrics.MinorNumber, metrics.Name, metrics.UUID, gpu.Version) + ch <- prometheus.MustNewConstMetric( + g.gpuFanSpeed, prometheus.GaugeValue, metrics.FanSpeed, metrics.MinorNumber, metrics.Name, metrics.UUID, gpu.Version) + ch <- prometheus.MustNewConstMetric( + g.gpuMemoryTotal, prometheus.CounterValue, metrics.MemoryTotal, metrics.MinorNumber, metrics.Name, metrics.UUID, gpu.Version) + ch <- prometheus.MustNewConstMetric( + g.gpuMemoryUsed, prometheus.GaugeValue, metrics.MemoryUsed, metrics.MinorNumber, metrics.Name, metrics.UUID, gpu.Version) + ch <- prometheus.MustNewConstMetric( + g.gpuUtilizationMemory, prometheus.GaugeValue, metrics.UtilizationMemory, metrics.MinorNumber, metrics.Name, metrics.UUID, gpu.Version) + ch <- prometheus.MustNewConstMetric( + g.gpuUtilizationGPU, prometheus.GaugeValue, metrics.UtilizationGPU, metrics.MinorNumber, metrics.Name, metrics.UUID, gpu.Version) + ch <- prometheus.MustNewConstMetric( + g.gpuUtilizationGPUAverage, prometheus.GaugeValue, metrics.UtilizationGPUAverage, metrics.MinorNumber, metrics.Name, metrics.UUID, gpu.Version) + } + + return nil +} + +func collectMetricDevice() (*gpuMetrics, error) { + if err := gonvml.Initialize(); err != nil { + return nil, err + } + defer gonvml.Shutdown() + + version, err := gonvml.SystemDriverVersion() + if err != nil { + return nil, err + } + + metrics := &gpuMetrics{ + Version: version, + } + + numDevices, err := gonvml.DeviceCount() + if err != nil { + return nil, err + } + + for index := 0; index < int(numDevices); index++ { + device, err := gonvml.DeviceHandleByIndex(uint(index)) + if err != nil { + return nil, err + } + + uuid, err := device.UUID() + if err != nil { + return nil, err + } + + name, err := device.Name() + if err != nil { + return nil, err + } + + minorNumber, err := device.MinorNumber() + if err != nil { + return nil, err + } + + temperature, err := device.Temperature() + if err != nil { + return nil, err + } + + powerUsage, err := device.PowerUsage() + if err != nil { + return nil, err + } + + fanSpeed, err := device.FanSpeed() + if err != nil { + return nil, err + } + + memoryTotal, memoryUsed, err := device.MemoryInfo() + if err != nil { + return nil, err + } + + utilizationGPU, utilizationMemory, err := device.UtilizationRates() + if err != nil { + return nil, err + } + + utilizationGPUAverage, err := device.AverageGPUUtilization(averageDuration) + if err != nil { + return nil, err + } + + metrics.Devices = append(metrics.Devices, + gpuDevice{ + Index: strconv.Itoa(index), + MinorNumber: strconv.Itoa(int(minorNumber)), + Name: name, + UUID: uuid, + Temperature: float64(temperature), + PowerUsage: float64(powerUsage), + FanSpeed: float64(fanSpeed), + MemoryTotal: float64(memoryTotal), + MemoryUsed: float64(memoryUsed), + UtilizationMemory: float64(utilizationMemory), + UtilizationGPU: float64(utilizationGPU), + UtilizationGPUAverage: float64(utilizationGPUAverage), + }) + } + + return metrics, nil +} diff --git a/go.mod b/go.mod index ce482f53eb..45484422b1 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/prometheus/node_exporter +module github.com/bizflycloud/node_exporter require ( github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect @@ -14,10 +14,12 @@ require ( github.com/mattn/go-xmlrpc v0.0.3 github.com/mdlayher/genetlink v1.0.0 // indirect github.com/mdlayher/wifi v0.0.0-20200527114002-84f0b9457fdd + github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989 github.com/prometheus/client_golang v1.7.1 github.com/prometheus/client_model v0.2.0 github.com/prometheus/common v0.15.0 github.com/prometheus/exporter-toolkit v0.5.0 + github.com/prometheus/node_exporter v1.0.1 github.com/prometheus/procfs v0.2.0 github.com/shirou/gopsutil v3.20.10+incompatible github.com/siebenmann/go-kstat v0.0.0-20200303194639-4e8294f9e9d5 diff --git a/go.sum b/go.sum index 99971e1d3b..0fffceb967 100644 --- a/go.sum +++ b/go.sum @@ -62,6 +62,7 @@ github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= github.com/ema/qdisc v0.0.0-20200603082823-62d0308e3e00 h1:0GHzegkDz/zSrt+Zph1OueNImPdUxoToypnkhhRYTjI= github.com/ema/qdisc v0.0.0-20200603082823-62d0308e3e00/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= @@ -109,6 +110,7 @@ github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:x github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -175,6 +177,7 @@ github.com/jsimonetti/rtnetlink v0.0.0-20201125080424-8bebea019a6c/go.mod h1:cR7 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= @@ -215,9 +218,12 @@ github.com/mdlayher/netlink v1.1.0 h1:mpdLgm+brq10nI9zM1BpX1kpDbh3NLl3RSnVq6ZSkf github.com/mdlayher/netlink v1.1.0/go.mod h1:H4WCitaheIsdF9yOYu8CFmCgQthAPIWZmcKp9uZHgmY= github.com/mdlayher/netlink v1.1.1 h1:VqG+Voq9V4uZ+04vjIrcSCWDpf91B1xxbP4QBUmUJE8= github.com/mdlayher/netlink v1.1.1/go.mod h1:WTYpFb/WTvlRJAyKhZL5/uy69TDDpHHu2VZmb2XgV7o= +github.com/mdlayher/wifi v0.0.0-20190303161829-b1436901ddee/go.mod h1:Evt/EIne46u9PtQbeTx2NTcqURpr5K4SvKtGmBuDPN8= github.com/mdlayher/wifi v0.0.0-20200527114002-84f0b9457fdd h1:50p1vPNK43pzCVX10+5MmiOerbBzC1vR6+sLB3FZewE= github.com/mdlayher/wifi v0.0.0-20200527114002-84f0b9457fdd/go.mod h1:Evt/EIne46u9PtQbeTx2NTcqURpr5K4SvKtGmBuDPN8= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989 h1:PS1dLCGtD8bb9RPKJrc8bS7qHL6JnW1CZvwzH9dPoUs= +github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989/go.mod h1:2eu9pRWp8mo84xCg6KswZ+USQHjwgRhNp06sozOdsTY= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= @@ -276,6 +282,7 @@ github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 h1:idejC8f05m9MGOsuEi1ATq9shN03HrxNkD/luQvxCv8= @@ -292,17 +299,21 @@ github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/exporter-toolkit v0.5.0 h1:GwrxhCviqOl8Mm0vKqkh7Xy54m+FPlHEJacFs48M3gY= github.com/prometheus/exporter-toolkit v0.5.0/go.mod h1:OCkM4805mmisBhLmVFw858QYi3v0wKdY6/UxrT0pZVg= +github.com/prometheus/node_exporter v1.0.1 h1:xTBtauxuNCMhuF4FKiNo2wDCuCAWgS3PoTlVbXLzNO0= +github.com/prometheus/node_exporter v1.0.1/go.mod h1:IC23eAmBHxDOtCRUgP9uqJewluDPwjStnbvWJEYtisQ= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4= @@ -374,6 +385,7 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9 h1:sYNJzB4J8toYPQTM6pAkcmBRgw9SnQKP9oXCHfgy604= golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= @@ -414,6 +426,7 @@ golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201010224723-4f7140c49acb h1:mUVeFHoDKis5nxCAzoAi7E8Ghb86EXh/RK6wtvJIqRY= @@ -459,6 +472,8 @@ golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -521,6 +536,7 @@ google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=