prometheus httpapi
总结比较有用的一些查询
http://<url>/api/v1/label/__name__/values //看全部的指标
http://<url>/api/v1/label/job/values //看有哪些job
...等等很多类似的用法
http://<url>/api/v1/series?match[]=up{job="xxx"} //查某个指标里的key/value,例如这个就是查up这个指标里面job=xxx的内容
http://<url>/api/v1/query?query=up{instance=~"xxx|yyy"} //查多个,=~正则表达式匹配,例如这个就是查up指标里instance=xxx或yyy的内容
prometheus get query(算qps,go实现)
func getQps(data *types.Data) (*types.xxx, error) {
diff := data.To - data.From
var step int64
switch {
... //根据diff,自己设一下step
}
//项目中一般是写在config里面然后Replace的
url := "http://xxx/api/v1/query_range?query=round(sum(irate(指标{key=\"<value>\"}[2m]))by(key),0.001)&start=<start>&end=<end>&step=<step>"
data := struct {
Status string `json:"status"`
Data types.DomainQpsList `json:"data"`
ErrorType string `json:"error_type"`
Error string `json:"error"`
}{}
... //发http请求
return &xxx.Data, nil
}
func Qps(c *gin.Context) {
domainData := &types.DomainData{}
if err := c.ShouldBindJSON(domainData); err != nil {
log.Warnf("xxx %s", err.Error())
return
}
qps, err := getQps(domainData)
if err != nil {
xxx.ErrorResponse(c, err)
return
}
xxx.SuccessResponse(c, qps.Result[0].Values)
}
prometheus post query(使用go调用)
要注意的是prometheus的这个post接口只接受form-data数据
package main
import (
"fmt"
"bytes"
"mime/multipart"
"net/http"
"io/ioutil"
)
func main() {
url := "http://xxx/api/v1/query"
method := "POST" //url和请求类型
payload := &bytes.Buffer{}
writer := multipart.NewWriter(payload)
_ = writer.WriteField("query", "up{instance=~\"1.2.3.4:1234|4.3.2.1:4321\"}") //form-data数据类型传参
err := writer.Close()
if err != nil {
fmt.Println(err)
return
}
client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return
}
req.Header.Set("Content-Type", writer.FormDataContentType()) //申明一下传参类型
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}