You need to enable JavaScript to run this app.
文档中心
托管 Prometheus

托管 Prometheus

复制全文
下载 pdf
工作区数据写入和查询
使用 Go 语言实现工作区数据写入和查询
复制全文
下载 pdf
使用 Go 语言实现工作区数据写入和查询
托管 Prometheus 工作区兼容原生 Prom,支持通过 Go 语言进行数据写入和查询。本文介绍使用 Go 语言在工作区进行进行数据写入和查询的方法和示例。​
写入指标数据​
使用 BasicAuth 写入指标​
​
package main​
​
import (​
"context"​
"encoding/base64"​
"fmt"​
"net/http"​
"time"​
"github.com/castai/promwrite"​
)​
​
// NewRoundTripper ...​
func NewRoundTripper(username, password string) http.RoundTripper {​
return &basicAuthTransport{​
transport: http.DefaultTransport,​
basicAuth: "Basic " + base64.StdEncoding.EncodeToString([]byte(username+":"+password)),​
}​
​
}​
​
type basicAuthTransport struct {​
transport http.RoundTripper​
basicAuth string​
}​
​
func (bat *basicAuthTransport) RoundTrip(req *http.Request) (*http.Response, error) {​
req.Header.Add("Authorization", bat.basicAuth)​
return bat.transport.RoundTrip(req)​
​
}​
​
func main() {​
username := "username" // 在 vmp 工作区配置的 basicAuth username​
password := "password" // 在 vmp 工作区配置的 basicAuth password​
remotewriteURL := "remotewrite 地址" // 可在 vmp 工作区详情页复制​
c := promwrite.NewClient(remotewriteURL, promwrite.HttpClient(&http.Client{​
Transport: NewRoundTripper(username, password),​
}))​
resp, err := c.Write(context.Background(), &promwrite.WriteRequest{​
TimeSeries: []promwrite.TimeSeries{​
{​
Labels: []promwrite.Label{​
{​
Name: "__name__",​
Value: "my_metric_name",​
},​
},​
Sample: promwrite.Sample{​
Time: time.Now(),​
Value: 123,​
},​
},​
},​
})​
fmt.Println(resp, err)​
​
}​
​
使用 AK/SK 写入指标​
​
package main​
​
import (​
"context"​
"fmt"​
"net/http"​
"time"​
​
"github.com/castai/promwrite"​
​
"github.com/volcengine/volc-sdk-golang/base"​
)​
​
// Config is the configuration for signing remote write requests with​
// volcengine verification process. Empty values will be retrieved using the​
// volcengine default credentials chain.​
type Config struct {​
Region string​
AccessKey string​
SecretKey string​
Service string​
}​
​
// NewRoundTripper returns a new http.RoundTripper that will sign requests​
// using Volcengine's Signature Verification signing procedure. ​
// Credentials for signing are retrieved using the the default volcengine credential​
// chain. If credentials cannot be found, an error will be returned.​
func NewRoundTripper(cfg *Config) (http.RoundTripper, error) {​
rt := &volcRoundTripper{​
next: http.DefaultTransport,​
signer: &base.Credentials{​
AccessKeyID: cfg.AccessKey,​
SecretAccessKey: cfg.SecretKey,​
Region: cfg.Region,​
Service: cfg.Service,​
},​
}​
​
return rt, nil​
}​
​
type volcRoundTripper struct {​
next http.RoundTripper​
signer *base.Credentials​
}​
​
func (rt *volcRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {​
q := req.URL.Query()​
req.URL.RawQuery = q.Encode()​
return rt.next.RoundTrip(rt.signer.Sign(req))​
}​
​
func main() {​
rt, err := NewRoundTripper(&Config{​
Region: "region", // workspace 地域​
AccessKey: "ak", // 具有 vmp remotewrite 访问权限的用户 ak​
SecretKey: "sk", // 具有 vmp remotewrite 访问权限的用户 sk​
Service: "vmp",​
})​
if err != nil {​
panic(err)​
}​
​
remotewriteURL := "remotewrite 地址" // 可在 vmp 工作区详情页复制​
c := promwrite.NewClient(remotewriteURL, promwrite.HttpClient(&http.Client{​
Transport: rt,​
}))​
resp, err := c.Write(context.Background(), &promwrite.WriteRequest{​
TimeSeries: []promwrite.TimeSeries{​
{​
Labels: []promwrite.Label{​
{​
Name: "__name__",​
Value: "my_metric_name",​
},​
},​
Sample: promwrite.Sample{​
Time: time.Now(),​
Value: 123,​
},​
},​
},​
})​
fmt.Println(resp, err)​
}​
​
查询指标数据​
支持查询的接口​
使用 BasicAuth 查询指标​
由于托管 Prometheus 产品接口兼容原生 Prom,因此在调用接口时可以使用现成的 Prom SDK,以下是基于 client_go 的实现样例。​
​
import (​
"net/http"​
"strconv"​
"github.com/prometheus/client_golang/api"​
promv1 "github.com/prometheus/client_golang/api/prometheus/v1"​
)​
​
// NewPromAPI ...​
func NewPromAPI(queryAddress, username, password string) (promv1.API, error) {​
promClient, err := api.NewClient(api.Config{​
Address: queryAddress,​
RoundTripper: NewBasicAuthRoundTripper(http.DefaultTransport, username, password),​
})​
if err != nil {​
return nil, err​
}​
return promv1.NewAPI(promClient), nil​
}​
​
// NewBasicAuthRoundTripper ...​
func NewBasicAuthRoundTripper(next http.RoundTripper, username, password string) http.RoundTripper {​
if next == nil {​
next = http.DefaultTransport​
}​
return &basicAuthTransport{​
transport: http.DefaultTransport,​
basicAuth: "Basic " + base64.StdEncoding.EncodeToString([]byte(username+":"+password)),​
}​
​
}​
​
type basicAuthTransport struct {​
transport http.RoundTripper​
basicAuth string​
}​
​
func (bat *basicAuthTransport) RoundTrip(req *http.Request) (*http.Response, error) {​
req.Header.Add("Authorization", bat.basicAuth)​
return bat.transport.RoundTrip(req)​
​
}​
​
func main(){​
address := "vmp query 地址" // 可在 vmp 工作区详情页复制​
username := "username" // 在 vmp 工作区配置的 basicAuth username​
password := "password" // 在 vmp 工作区配置的 basicAuth password​
​
api, err := NewPromAPI(address, username, password)​
​
res, _, err := api.Query(context.TODO(), "up", time.Now())​
fmt.Println(res, err)​
}​
​
使用 AK/SK 查询指标​
​
import (​
"context"​
"fmt"​
"net/http"​
"time"​
"github.com/prometheus/client_golang/api"​
promv1 "github.com/prometheus/client_golang/api/prometheus/v1"​
"github.com/volcengine/volc-sdk-golang/base"​
)​
​
// Config is the configuration for signing query requests with​
// volcengine verification process. Empty values will be retrieved using the​
// volcengine default credentials chain.​
type Config struct {​
Region string // 访问地区​
AccessKey string // 服务ak​
SecretKey string // 服务sk​
Service string // vmp 服务名,为 vmp​
}​
​
type volcRoundTripper struct {​
next http.RoundTripper​
signer *base.Credentials​
​
}​
​
// NewRoundTripper returns a new http.RoundTripper that will sign requests​
// using Volcengine's Signature Verification signing procedure.​
//​
// Credentials for signing are retrieved using the the default volcengine credential​
// chain. If credentials cannot be found, an error will be returned.​
func NewRoundTripper(cfg *Config) (http.RoundTripper, error) {​
rt := &volcRoundTripper{​
next: http.DefaultTransport,​
signer: &base.Credentials{​
AccessKeyID: cfg.AccessKey,​
SecretAccessKey: cfg.SecretKey,​
Region: cfg.Region,​
Service: cfg.Service,​
},​
}​
​
return rt, nil​
}​
​
func (rt *volcRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {​
q := req.URL.Query()​
req.URL.RawQuery = q.Encode()​
return rt.next.RoundTrip(rt.signer.Sign(req))​
​
}​
​
// NewPromClient ...​
func NewPromClient(cfg *Config, queryAddress string) (promv1.API, error) {​
rt, err := NewRoundTripper(cfg)​
if err != nil {​
return nil, err​
}​
promClient, err := api.NewClient(api.Config{​
Address: queryAddress,​
RoundTripper: rt,​
})​
if err != nil {​
return nil, err​
}​
return promv1.NewAPI(promClient), nil​
}​
​
func main() {​
api, err := NewPromClient(&Config{​
Region: "region",​
AccessKey: "ak",​
SecretKey: "sk",​
Service: "vmp",​
}, "query地址") ​
if err != nil {​
fmt.Println(err.Error())​
}​
​
res, _, err := api.Query(context.TODO(), "up", time.Now())​
fmt.Println(res, err)​
}​
​
结果处理​
Query 的结果一般是 ValVector 和 ValScalar 类型,可参考下面对结果进行处理。另外 QueryRange 的查询类型是 prommodel.Matrix,可依据下面做扩展。​
​
func parseQueryResp(value prommodel.Value) (prommodel.Vector, error) {​
var samples prommodel.Vector​
var ok bool​
switch value.Type() {​
case prommodel.ValVector:​
samples, ok = value.(prommodel.Vector)​
if !ok {​
return nil, errors.New("convert result to \"model.Vector\"")​
}​
case prommodel.ValScalar:​
var scalar *prommodel.Scalar​
scalar, ok = value.(*prommodel.Scalar)​
if !ok {​
return nil, errors.New("convert result to \"model.Scalar\"")​
}​
samples = append(samples, &prommodel.Sample{​
Timestamp: scalar.Timestamp,​
Value: scalar.Value,​
})​
default:​
return nil, errors.New("invalid query result")​
}​
return samples, nil​
}​
​
​
最近更新时间:2025.09.03 15:13:02
这个页面对您有帮助吗?
有用
有用
无用
无用