记一次GO语言调取字节云监控SDK
安装SDK
新建一个Go项目,使用go mod作为软件依赖工具。
在go.mod中设置服务依赖。
require github.com/volcengine/volcengine-go-sdk v1.0.48
代码示例
package main
import (
"encoding/json"
"flag"
"fmt"
"github.com/sirupsen/logrus"
"github.com/volcengine/volcengine-go-sdk/volcengine"
"github.com/volcengine/volcengine-go-sdk/volcengine/credentials"
"github.com/volcengine/volcengine-go-sdk/volcengine/session"
"gopkg.in/yaml.v2"
"io"
"monitor/service/volcobserve"
"os"
"strings"
)
func main() {
var (
endTime int64
startTime int64
dimensions DimensionSlice
metricName string
period string
namespace string
subnamespace string
)
log := logrus.New()
file, err := os.OpenFile("logfile.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err == nil {
log.SetOutput(io.MultiWriter(os.Stdout, file))
} else {
log.Info("Failed to open log file, using default stderr")
}
defer file.Close()
flag.Int64Var(&endTime, "endTime", 0, "End time")
flag.Int64Var(&startTime, "startTime", 0, "Start time")
flag.Var(&dimensions, "dimensions", "Dimensions (name=value pairs, separated by comma)")
flag.StringVar(&metricName, "metricName", "", "metricName")
flag.StringVar(&period, "period", "", "Period")
flag.StringVar(&namespace, "namespace", "", "Namespace")
flag.StringVar(&subnamespace, "subnamespace", "", "subnamespace")
flag.Parse()
bagConfigPath := "metric.yaml"
bagConfigFile, err := os.ReadFile(bagConfigPath)
var bConfig config
err = yaml.Unmarshal(bagConfigFile, &bConfig)
config := volcengine.NewConfig().
WithRegion(bConfig.Region).
WithCredentials(credentials.NewStaticCredentials(bConfig.AccessKey, bConfig.SecretKey, "")).
WithEndpoint(bConfig.EndPoint)
sess, err := session.NewSession(config)
if err != nil {
log.Error(err)
}
svc := volcobserve.New(sess, bConfig.Service, bConfig.Service, bConfig.Version)
in := &volcobserve.GetMetricDataInput{
EndTime: volcengine.Int64(endTime),
StartTime: volcengine.Int64(startTime),
Instances: []*volcobserve.InstanceForGetMetricDataInput{
{
Dimensions: dimensions,
},
},
MetricName: volcengine.String(metricName),
Period: volcengine.String(period),
Namespace: volcengine.String(namespace),
SubNamespace: volcengine.String(subnamespace),
}
resp, err := svc.GetMetricData(in)
if err != nil {
log.Error(err)
}
b, _ := json.Marshal(resp)
log.Println(string(b))
}
type DimensionSlice []*volcobserve.DimensionForGetMetricDataInput
func (s *DimensionSlice) String() string {
result := make([]string, len(*s))
for i, dim := range *s {
result[i] = fmt.Sprintf("%s=%s", *dim.Name, *dim.Value)
}
return strings.Join(result, ",")
}
func (s *DimensionSlice) Set(value string) error {
pairs := strings.Split(value, ",")
for _, pair := range pairs {
kv := strings.SplitN(pair, "=", 2)
if len(kv) != 2 {
return fmt.Errorf("invalid dimension: %s", pair)
}
name := strings.TrimSpace(kv[0])
val := strings.TrimSpace(kv[1])
dim := &volcobserve.DimensionForGetMetricDataInput{
Name: volcengine.String(name),
Value: volcengine.String(val),
}
*s = append(*s, dim)
}
return nil
}
type config struct {
AccessKey string `yaml:"accessKey"`
SecretKey string `yaml:"secretKey"`
EndPoint string `yaml:"endPoint"`
Scheme string `yaml:"scheme"`
Region string `yaml:"region"`
Service string `yaml:"service"`
ServiceID string `yaml:"serviceID"`
Version string `yaml:"version"`
}
新建一个metric.yaml
accessKey : ""
secretKey : "=="
endPoint : ""
region : ""
version : ""
service : ""
serviceID : ""
代码完成
测试
go run main.go --endTime=1691579850 --startTime=1691493450
–subnamespace= --dimensions=“Namespace=test” --metricName=“Container_CPUUsed” --period=“1m” --namespace=“VCM_VKE”
编写Dockerfile
# builder image
FROM golang:1.20.7 as builder
RUN apt-get update && apt-get install -y vim
WORKDIR /standard-component
ADD . .
#编译linux环境
ENV GOOS=linux GOARCH=amd64
#golang 代理仓库
#ENV GOPROXY=https://goproxy.cn,https://goproxy.io,direct
ENV GOPROXY=https://proxy.golang.com.cn,direct
RUN go mod tidy
RUN go build -o component main.go
RUN chmod +x component
#runtime image
FROM golang:1.20.7
RUN apt-get update && apt-get install -y vim
#
WORKDIR /standard-component
COPY --from=builder /standard-component/component .
COPY --from=builder /standard-component/metric.yaml ./metric.yaml
打包镜像
docker build . -aa-test:1.0