修改磁盘使用率判断,使用cli库来识别coredump-tool参数

This commit is contained in:
linxin
2023-05-10 19:36:15 +08:00
parent 58a162f1b3
commit 480f64e0d5
5 changed files with 196 additions and 103 deletions

View File

@@ -10,58 +10,77 @@ import (
"flag"
"fmt"
"io"
"math"
"os"
"regexp"
"strconv"
"strings"
"syscall"
"github.com/containerd/containerd"
"github.com/containerd/containerd/namespaces"
"github.com/coreos/go-systemd/v22/journal"
"github.com/shirou/gopsutil/disk"
)
const chunkSize = 1024 * 1024 * 1024 // 1GB
var coredump_config types.Coredump_config
func argsJudge() error {
if coredump_config.Initial_ns_pid == "" || coredump_config.Process_ns_pid == "" || coredump_config.Corepipe_config_path == "" || coredump_config.Timestamp == 0 || coredump_config.Process_exe_path == "" || coredump_config.GID == "" || coredump_config.Hostname == "" || coredump_config.UID == "" || coredump_config.Signal == -1 {
err := fmt.Sprintf("Failed to initialize command line parameters. -P=%s -p=%s -E=%s -configpath=%s -t=%d -g=%s -h=%s -s=%d -u=%s", coredump_config.Initial_ns_pid, coredump_config.Process_ns_pid, coredump_config.Process_exe_path, coredump_config.Corepipe_config_path, coredump_config.Timestamp, coredump_config.GID, coredump_config.Hostname, coredump_config.Signal, coredump_config.UID)
if coredump_config.Initial_ns_pid == "" ||
coredump_config.Process_ns_pid == "" ||
coredump_config.Corepipe_config_path == "" ||
coredump_config.Timestamp == 0 ||
coredump_config.Process_exe_path == "" ||
coredump_config.GID == "" ||
coredump_config.Hostname == "" ||
coredump_config.UID == "" ||
coredump_config.Signal == -1 {
err := fmt.Sprintf("Failed to initialize command line parameters. -P=%s -p=%s -E=%s -configpath=%s -t=%d -g=%s -h=%s -s=%d -u=%s",
coredump_config.Initial_ns_pid,
coredump_config.Process_ns_pid,
coredump_config.Process_exe_path,
coredump_config.Corepipe_config_path,
coredump_config.Timestamp,
coredump_config.GID,
coredump_config.Hostname,
coredump_config.Signal,
coredump_config.UID)
return errors.New(err)
}
return nil
}
func isDiskSufficient(pipe_config types.Pipeconfig) (bool, error) {
percent, err := strconv.ParseFloat(pipe_config.Total_file_mem_limit[:len(pipe_config.Total_file_mem_limit)-1], 64)
percent, err := strconv.ParseInt(pipe_config.Total_file_mem_limit[:len(pipe_config.Total_file_mem_limit)-1], 10, 32)
if err != nil {
return false, err
}
percent = percent / 100.0
var stat syscall.Statfs_t
wd, err := syscall.Getwd()
// var stat syscall.Statfs_t
wd := pipe_config.Storage
if err != nil {
fmt.Println(err)
return false, err
}
syscall.Statfs(wd, &stat)
// 剩余空间的大小为块的数量 * 每个块的大小
// stat.Bfree表示可用的块的数量stat.Bsize表示每个块的大小
usedSpace := (int64(stat.Blocks) - int64(stat.Bfree))
totalSpace := int64(stat.Blocks)
usage := float64(usedSpace) / float64(totalSpace)
diskinfo, err := disk.Usage(wd)
if err != nil {
return false, err
}
data, err := json.MarshalIndent(diskinfo, "", " ")
if err != nil {
info := fmt.Sprintf("diskinfo:%s", string(data))
journal.Print(journal.PriInfo, info)
}
usage := int64(math.Floor(diskinfo.UsedPercent + 0.5))
info := fmt.Sprintf("usage:%d,limited:%d", usage, percent)
journal.Print(journal.PriInfo, info)
if usage >= percent {
return false, nil
}
return true, nil
}
func createCoreDumpDir(pipe_config *types.Pipeconfig, args types.Coredump_config) error {
if _, err := os.Stat(pipe_config.Storage); os.IsNotExist(err) {
// 目录不存在,创建目录
if err := os.MkdirAll(pipe_config.Storage, os.ModePerm); err != nil {
return err
}
}
pipe_config.Storage = fmt.Sprintf("%s/%s_%s_%d_coredump", pipe_config.Storage, args.Initial_ns_pid, args.Process_ns_pid, args.Timestamp)
pipe_config.Storage = fmt.Sprintf("%s/coredump_%s_%s_%d", pipe_config.Storage, args.Initial_ns_pid, args.Process_ns_pid, args.Timestamp)
dirName := pipe_config.Storage
if _, err := os.Stat(dirName); os.IsNotExist(err) {
// 目录不存在,创建目录
@@ -114,7 +133,7 @@ func getImageName(container_id string, sock_path string) (string, error) {
return imageRef.Name(), nil
}
func writeCoreConfig(config types.Coredump_config) error {
filename := fmt.Sprintf("%s_%s_%d_coredump.config", config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp)
filename := fmt.Sprintf("%s_%s_%d.info", config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp)
file, err := os.Create(filename)
if err != nil {
return err
@@ -127,7 +146,7 @@ func writeCoreConfig(config types.Coredump_config) error {
return nil
}
func writeCoreDumpToFile(config types.Coredump_config) error {
filename := fmt.Sprintf("%s_%s_%d_coredump.info", config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp)
filename := fmt.Sprintf("%s_%s_%d.coredump", config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp)
file, err := os.Create(filename)
if err != nil {
return err
@@ -147,7 +166,7 @@ func writeCoreDumpToFile(config types.Coredump_config) error {
return nil
}
func writeMiniDumpToFile(config types.Coredump_config) error {
filename := fmt.Sprintf("%s_%s_%d_minidump.info", config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp)
filename := fmt.Sprintf("%s_%s_%d.minidump", config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp)
file, err := os.Create(filename)
if err != nil {
return err
@@ -168,7 +187,7 @@ func writeMiniDumpToFile(config types.Coredump_config) error {
}
func compress(config types.Coredump_config) error {
// Create a new zip archive.
filename := fmt.Sprintf("%s_%s_%d_coredump.info", config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp)
filename := fmt.Sprintf("%s_%s_%d.coredump", config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp)
zipfile, err := os.Create(filename + ".zip")
if err != nil {
return err
@@ -228,6 +247,14 @@ func main() {
if pipe_config.Storage_type == 0 {
return
}
//生成coredump存放文件夹
if _, err := os.Stat(pipe_config.Storage); os.IsNotExist(err) {
// 目录不存在,创建目录
if err := os.MkdirAll(pipe_config.Storage, os.ModePerm); err != nil {
journal.Print(journal.PriErr, err.Error())
return
}
}
//判断硬盘使用率
flag, err := isDiskSufficient(pipe_config)
if err != nil {
@@ -269,13 +296,13 @@ func main() {
if err != nil {
journal.Print(journal.PriErr, err.Error())
}
coredump_config.Storage = fmt.Sprintf("%s/%s_%s_%d_coredump.info", pipe_config.Storage, coredump_config.Initial_ns_pid, coredump_config.Process_ns_pid, coredump_config.Timestamp)
} else if pipe_config.Compress == true {
coredump_config.Storage = fmt.Sprintf("%s/%s_%s_%d.coredump", pipe_config.Storage, coredump_config.Initial_ns_pid, coredump_config.Process_ns_pid, coredump_config.Timestamp)
} else {
err = compress(coredump_config)
if err != nil {
journal.Print(journal.PriErr, err.Error())
}
coredump_config.Storage = fmt.Sprintf("%s/%s_%s_%d_coredump.info.zip", pipe_config.Storage, coredump_config.Initial_ns_pid, coredump_config.Process_ns_pid, coredump_config.Timestamp)
coredump_config.Storage = fmt.Sprintf("%s/%s_%s_%d.coredump.zip", pipe_config.Storage, coredump_config.Initial_ns_pid, coredump_config.Process_ns_pid, coredump_config.Timestamp)
}
//将image name写入coredump config
err = writeCoreConfig(coredump_config)

View File

@@ -5,7 +5,6 @@ import (
"coredump-tools/types"
"encoding/json"
"errors"
"flag"
"fmt"
"os"
"os/exec"
@@ -14,6 +13,7 @@ import (
"time"
"github.com/google/uuid"
"github.com/urfave/cli/v2"
"golang.org/x/term"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -115,6 +115,10 @@ func debugInpod(conf *rest.Config, clientset *kubernetes.Clientset, config types
Name: "src-debuginfo-dir",
MountPath: "/usr/src/debug",
},
{
Name: "mrzcpd",
MountPath: "/opt/tsg/mrzcpd",
},
},
SecurityContext: &v1.SecurityContext{
Privileged: &[]bool{true}[0],
@@ -146,6 +150,14 @@ func debugInpod(conf *rest.Config, clientset *kubernetes.Clientset, config types
},
},
},
{
Name: "mrzcpd",
VolumeSource: v1.VolumeSource{
HostPath: &v1.HostPathVolumeSource{
Path: "/opt/tsg/mrzcpd",
},
},
},
},
RestartPolicy: v1.RestartPolicyNever,
},
@@ -230,7 +242,7 @@ func WalkDirectory(dir string) {
}
if !info.IsDir() {
if strings.HasSuffix(info.Name(), ".config") {
if strings.HasSuffix(info.Name(), ".info") {
data, err := os.ReadFile(path)
if err != nil {
return err
@@ -276,76 +288,111 @@ func list(pid string) {
fmt.Println("Total", total, "coredumps")
}
// Help 打印使用帮助
func Help() {
fmt.Println("Usage: coredump-ctl [list | debug | help] [options] ")
fmt.Println("list options:")
fmt.Println(" -dir string")
fmt.Println(" Directory path")
fmt.Println(" -p string")
fmt.Println(" Pid to matching")
fmt.Println("debug options:")
fmt.Println(" -dir string")
fmt.Println(" Directory path")
fmt.Println(" -p string")
fmt.Println(" Pid to matching")
fmt.Println(" -command string")
fmt.Println(" exe command when attach to pod")
}
// // Help 打印使用帮助
// func Help() {
// fmt.Println("Usage: coredump-ctl [list | debug | help] [options] ")
// fmt.Println("list options:")
// fmt.Println(" -dir string")
// fmt.Println(" Directory path")
// fmt.Println(" -p string")
// fmt.Println(" Pid to matching")
// fmt.Println("debug options:")
// fmt.Println(" -dir string")
// fmt.Println(" Directory path")
// fmt.Println(" -p string")
// fmt.Println(" Pid to matching")
// fmt.Println(" -command string")
// fmt.Println(" exe command when attach to pod")
// }
func main() {
listCmd := flag.NewFlagSet("list", flag.ExitOnError)
debugCmd := flag.NewFlagSet("debug", flag.ExitOnError)
helpCmd := flag.NewFlagSet("help", flag.ExitOnError)
var dirPath, pid, command string
listCmd.StringVar(&pid, "p", "", "Pid to matching")
debugCmd.StringVar(&pid, "p", "", "Pid to matching")
listCmd.StringVar(&dirPath, "dir", "", "Directory path")
debugCmd.StringVar(&dirPath, "dir", "", "Directory path")
debugCmd.StringVar(&command, "command", "", "")
if len(os.Args) == 1 {
Help()
os.Exit(1)
var (
pid string
dirPath string
command string
)
app := &cli.App{
Name: "coredump",
Usage: "Manage coredump files in Kubernetes clusters",
Commands: []*cli.Command{
{
Name: "list",
Aliases: []string{"ls"},
Usage: "List all coredump files",
Flags: []cli.Flag{
&cli.StringFlag{
Name: "pid",
Aliases: []string{"p"},
Usage: "Pid to match",
Value: "",
Destination: &pid,
},
&cli.StringFlag{
Name: "dir",
Usage: "Directory path",
Value: "/var/lib/coredump",
Destination: &dirPath,
},
},
Action: func(c *cli.Context) error {
fmt.Println(dirPath)
WalkDirectory(dirPath)
list(pid)
return nil
},
},
{
Name: "debug",
Usage: "Start a debugging session for a coredump",
Flags: []cli.Flag{
&cli.StringFlag{
Name: "pid",
Aliases: []string{"p"},
Usage: "Pid to match",
Value: "",
Destination: &pid,
},
&cli.StringFlag{
Name: "dir",
Usage: "Directory path",
Value: "/var/lib/coredump",
Destination: &dirPath,
},
&cli.StringFlag{
Name: "command",
Usage: "Debugger command (default: gdb)",
Value: "gdb",
Destination: &command,
},
},
Action: func(c *cli.Context) error {
WalkDirectory(dirPath)
for _, config := range configs {
if strings.Compare(config.Initial_ns_pid, pid) == 0 || pid == "" {
err := debug(config, command)
if err != nil {
fmt.Println(err)
} else {
break
}
}
}
return nil
},
},
{
Name: "help",
Usage: "Show help message",
Action: func(c *cli.Context) error {
cli.ShowAppHelp(c)
return nil
},
},
},
}
switch os.Args[1] {
case "list":
listCmd.Parse(os.Args[2:])
case "debug":
debugCmd.Parse(os.Args[2:])
case "help":
helpCmd.Parse(os.Args[2:])
Help()
default:
fmt.Printf("%q is not a valid command.\n", os.Args[1])
os.Exit(1)
}
if listCmd.Parsed() {
if dirPath == "" {
dirPath = "/var/lib/coredump"
}
WalkDirectory(dirPath)
list(pid)
return
}
if debugCmd.Parsed() {
if dirPath == "" {
dirPath = "/var/lib/coredump"
}
if command == "" {
command = "gdb"
}
WalkDirectory(dirPath)
for _, config := range configs {
fmt.Println(config)
if strings.Compare(config.Initial_ns_pid, pid) == 0 || pid == "" {
err := debug(config, command)
if err != nil {
fmt.Println(err)
} else {
break
}
}
}
return
err := app.Run(os.Args)
if err != nil {
fmt.Println(err)
}
}

View File

@@ -1,2 +1,2 @@
#Type Path Mode User Group Age Argument
d /var/tmp/*_coredump 0755 - - 7d -
d /var/lib/coredump/coredump_* 0755 - - 7d -

10
go.mod
View File

@@ -6,7 +6,9 @@ require (
github.com/containerd/containerd v1.7.0
github.com/coreos/go-systemd/v22 v22.5.0
github.com/google/uuid v1.3.0
golang.org/x/crypto v0.1.0
github.com/shirou/gopsutil v2.21.11+incompatible
github.com/urfave/cli/v2 v2.25.3
golang.org/x/term v0.5.0
k8s.io/api v0.26.2
k8s.io/apimachinery v0.26.2
k8s.io/client-go v0.26.2
@@ -22,12 +24,14 @@ require (
github.com/containerd/fifo v1.1.0 // indirect
github.com/containerd/ttrpc v1.2.1 // indirect
github.com/containerd/typeurl/v2 v2.1.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
github.com/cyphar/filepath-securejoin v0.2.3 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect
github.com/emicklei/go-restful/v3 v3.10.1 // indirect
github.com/go-logr/logr v1.2.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.20.0 // indirect
github.com/go-openapi/swag v0.19.14 // indirect
@@ -56,8 +60,11 @@ require (
github.com/opencontainers/runtime-spec v1.1.0-rc.1 // indirect
github.com/opencontainers/selinux v1.11.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/sirupsen/logrus v1.9.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
github.com/yusufpapurcu/wmi v1.2.2 // indirect
go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/otel v1.14.0 // indirect
go.opentelemetry.io/otel/trace v1.14.0 // indirect
@@ -66,7 +73,6 @@ require (
golang.org/x/oauth2 v0.4.0 // indirect
golang.org/x/sync v0.1.0 // indirect
golang.org/x/sys v0.6.0 // indirect
golang.org/x/term v0.5.0 // indirect
golang.org/x/text v0.7.0 // indirect
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect
golang.org/x/tools v0.5.0 // indirect

17
go.sum
View File

@@ -31,6 +31,8 @@ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI=
github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
@@ -55,6 +57,8 @@ github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
@@ -169,7 +173,11 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg=
github.com/shirou/gopsutil v2.21.11+incompatible h1:lOGOyCG67a5dv2hq5Z1BLDUqqKp3HkbjPcz5j6XMS0U=
github.com/shirou/gopsutil v2.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
@@ -191,10 +199,16 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/urfave/cli/v2 v2.25.3 h1:VJkt6wvEBOoSjPFQvOkv6iWIrsJyCrKGtCtxXWwmGeY=
github.com/urfave/cli/v2 v2.25.3/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc=
github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=
github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM=
@@ -204,8 +218,6 @@ go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+go
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
@@ -242,6 +254,7 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=