O Simple Log Service oferece diversas APIs para consultar métricas de séries temporais ou gravar dados de métricas em um MetricStore. Essas APIs são compatíveis com o protocolo Prometheus open source.
Visão geral
As APIs do Prometheus residem no diretório /api/v1/. As APIs do MetricStore seguem a mesma convenção. O formato completo da URL é https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/.
|
Parâmetro |
Obrigatório |
Descrição |
|
{sls-endpoint} |
Sim |
O endpoint do Simple Log Service. Este endpoint corresponde ao nome de domínio usado para acessar o serviço e varia conforme a região onde o projeto está localizado. Para mais informações, consulte Endpoints. |
|
{project} |
Sim |
Project Name: O projeto é a unidade de gerenciamento de recursos do Simple Log Service e atua como limite principal para isolamento multiusuário e controle de acesso. Para mais informações, consulte Gerencie Projects. |
|
{metricstore} |
Sim |
Nome do MetricStore. Para mais informações, consulte Crie a MetricStore. |
Essas APIs exigem autenticação BasicAuth. Defina Username como seu AccessKey ID e Password como seu AccessKey secret. Recomendamos usar o par de AccessKeys de um usuário do Resource Access Management (RAM) com permissões de consulta no projeto especificado. Para mais informações, consulte Configure a permission assistant.
Essas APIs também suportam autenticação via Security Token Service (STS). Nesse caso, defina o Password do BasicAuth no formato {AccessKey Secret}${STS Token}. Para mais informações, consulte What is STS?.
APIs de consulta de métricas de séries temporais
As APIs de consulta de métricas de séries temporais incluem a API Instant Queries e a API Range Queries.
API Instant Queries
A API Instant Queries consulta dados de métricas em um ponto específico no tempo.
GET https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/query
POST https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/query
A tabela a seguir descreve os parâmetros.
|
Parâmetro |
Obrigatório |
Descrição |
|
query |
Sim |
Expressão da Prometheus Query Language (PromQL). Para mais informações, consulte PromQL syntax. |
|
time |
Não |
Ponto no tempo para a consulta. O valor é um timestamp UNIX em segundos. Valor padrão: hora atual. |
|
timeout |
Não |
Período de tempo limite da consulta em segundos. Formatos de duração como 1s, 2m, 3h e 4d também são suportados. Exemplo: timeout=10s. Para mais informações, consulte Time Durations. |
|
lookback_delta |
Não |
Substitui a flag |
-
Exemplo
curl -X GET 'https://haoqi-sls-metric-test.pub-cn-hangzhou.log.aliyuncs.com/prometheus/haoqi-sls-metric-test/prometheus-metrics/api/v1/query?query=up&time=1676700699' \ -u username:password \ -H 'Content-Type: application/x-www-form-urlencoded' # Set username and password to your Alibaba Cloud AccessKey. -
Resposta de exemplo
{ "status": "success", "data": { "resultType": "vector", "result": [ { "metric": { "__name__": "up", "instance": "demo.promlabs.com:10001", "job": "demo" }, "value": [ 1676700550.696, "1" ] }, { "metric": { "__name__": "up", "instance": "demo.promlabs.com:10000", "job": "demo" }, "value": [ 1676700550.696, "1" ] } ] } }
API Range Queries
A API Range Queries consulta dados de métricas em múltiplos pontos dentro de um intervalo de tempo especificado.
GET https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/query_range
POST https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/query_range
A tabela a seguir descreve os parâmetros.
|
Parâmetro |
Obrigatório |
Descrição |
|
query |
Sim |
Expressão PromQL. Para mais informações, consulte PromQL syntax. |
|
start |
Não |
Hora inicial do intervalo de consulta. O valor é um timestamp UNIX em segundos. |
|
end |
Não |
Hora final do intervalo de consulta. O valor é um timestamp UNIX em segundos. |
|
step |
Não |
Intervalo de passo da consulta em segundos. Formatos de duração como 1s, 2m, 3h e 4d também são suportados. Exemplo: |
|
timeout |
Não |
Período de tempo limite da consulta em segundos. Formatos de duração como 1s, 2m, 3h e 4d também são suportados. Exemplo: timeout=10s. Para mais informações, consulte Time Durations. |
|
lookback_delta |
Não |
Substitui a flag |
-
Exemplo
Este exemplo consulta dados de métricas das 14:09:59 às 14:16:39 em 2023-02-18 com um passo de 60s.
curl -X GET 'https://haoqi-sls-metric-test.pub-cn-hangzhou.log.aliyuncs.com/prometheus/haoqi-sls-metric-test/prometheus-metrics/api/v1/query_range?query=up&start=1676700599&end=1676700999&step=60s' \ -u username:password \ -H 'Content-Type: application/x-www-form-urlencoded' # Set username and password to your Alibaba Cloud AccessKey. -
Resposta de exemplo
{ "status": "success", "data": { "resultType": "matrix", "result": [ { "metric": { "__name__": "up", "instance": "demo.promlabs.com:10000", "job": "demo" }, "values": [ [ 1676700599, "1" ], [ 1676700659, "1" ], [ 1676700719, "0" ], [ 1676700779, "0" ], [ 1676700839, "1" ], [ 1676700899, "0" ], [ 1676700959, "1" ] ] }, { "metric": { "__name__": "up", "instance": "demo.promlabs.com:10001", "job": "demo" }, "values": [ [ 1676700599, "1" ], [ 1676700659, "1" ], [ 1676700719, "0" ], [ 1676700779, "0" ], [ 1676700839, "1" ], [ 1676700899, "1" ], [ 1676700959, "1" ] ] } ] } }
APIs de consulta de metadados
O Simple Log Service também suporta a consulta de metadados, como rótulos e valores de rótulos. As APIs de consulta de metadados do SLS são compatíveis com as APIs de Querying metadata do Prometheus. Use essas APIs para recuperar todas as métricas, rótulos e valores de rótulos dentro de um período específico. A resposta não inclui timestamps ou valores numéricos.
API Query Series
A API Query Series recupera todos os nomes de métricas e seus pares rótulo-valor correspondentes que atendem a condições específicas dentro de um período determinado.
GET https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/series
POST https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/series
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
match[] |
Sim |
Condição de filtro. Exemplo: match[]=up{instance="demo.*"}. É possível especificar um ou mais valores. |
|
start |
Não |
Hora inicial do intervalo de consulta. O valor é um timestamp UNIX em segundos. Valor padrão: 5 minutos antes da hora atual. |
|
end |
Não |
Hora final do intervalo de consulta. O valor é um timestamp UNIX em segundos. Valor padrão: hora atual. Importante
Mesmo que você especifique valores personalizados para start e end, esta API consulta apenas dados dentro dos 5 minutos anteriores à hora end. O intervalo real de consulta é |
|
x-sls-disable-range-limit |
Não |
Defina este parâmetro como true para remover o limite de intervalo de consulta de 5 minutos e usar os valores de início e fim especificados. |
|
forceMaxMetaTimeRangeSeconds |
Não |
Intervalo máximo de consulta em segundos. Quando (end - start) excede esse valor, o intervalo de consulta é ajustado para (end - forceMaxMetaTimeRangeSeconds, end). Para obter desempenho ideal de consulta, recomendamos sempre incluir este parâmetro. |
-
Exemplo
curl -g -X GET 'https://haoqi-sls-metric-test.pub-cn-hangzhou.log.aliyuncs.com/prometheus/haoqi-sls-metric-test/prometheus-metrics/api/v1/series?match[]=up{instance="demo.promlabs.com:10000"}&match[]=go_sched_latencies_seconds_bucket&start=1676700599&end=1676700999' \ -u username:password \ -H 'Content-Type: application/x-www-form-urlencoded' # Set username and password to your Alibaba Cloud AccessKey. -
Resposta de exemplo
{ "status": "success", "data": [ { "__name__": "go_gc_duration_seconds_count", "instance": "demo.promlabs.com:10000", "job": "demo" }, { "__name__": "go_gc_duration_seconds_count", "instance": "demo.promlabs.com:10001", "job": "demo" }, { "__name__": "up", "instance": "demo.promlabs.com:10000", "job": "demo" } ] }
API Query Label Names
A API Query Label Names recupera todos os nomes de rótulos que correspondem a condições específicas dentro de um período determinado.
GET https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/labels
POST https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/labels
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
match[] |
Sim |
Condição de filtro. Exemplo: É possível especificar zero, um ou mais valores. |
|
start |
Não |
Hora inicial do intervalo de consulta. O valor é um timestamp UNIX em segundos. Valor padrão: 5 minutos antes da hora atual. |
|
end |
Não |
Hora final do intervalo de consulta. O valor é um timestamp UNIX em segundos. Valor padrão: hora atual. Importante
Mesmo que você especifique valores personalizados para start e end, esta API consulta apenas dados dentro dos 5 minutos anteriores à hora end. O intervalo real de consulta é |
|
x-sls-disable-range-limit |
Não |
Defina este parâmetro como true para remover o limite de intervalo de consulta de 5 minutos e usar os valores de início e fim especificados. |
|
forceMaxMetaTimeRangeSeconds |
Não |
Intervalo máximo de consulta em segundos. Quando (end - start) excede esse valor, o intervalo de consulta é ajustado para (end - forceMaxMetaTimeRangeSeconds, end). Para obter desempenho ideal de consulta, recomendamos sempre incluir este parâmetro. |
-
Exemplo
Este exemplo consulta todos os nomes de rótulos de todas as métricas dentro de um período especificado.
curl -X GET 'https://haoqi-sls-metric-test.pub-cn-hangzhou.log.aliyuncs.com/prometheus/haoqi-sls-metric-test/prometheus-metrics/api/v1/labels?start=1676700599&end=1676700999' \ -u username:password \ -H 'Content-Type: application/x-www-form-urlencoded' # Set username and password to your Alibaba Cloud AccessKey. -
Resposta de exemplo
{ "status": "success", "data": [ "code", "instance", "job", "le", "method", "mode", "path", "quantile", "status", "type", "version", "__name__" ] }
API Query Label Values
A API Query Label Values recupera todos os valores de um nome de rótulo específico que correspondem a condições determinadas dentro de um período definido.
Na URL da API, substitua <label_name> pelo nome real do rótulo.
GET https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/label/<label_name>/values
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
match[] |
Sim |
Condição de filtro. Exemplo: É possível especificar um ou mais valores. |
|
start |
Não |
Hora inicial do intervalo de consulta. O valor é um timestamp UNIX em segundos. Valor padrão: 5 minutos antes da hora atual. |
|
end |
Não |
Hora final do intervalo de consulta. O valor é um timestamp UNIX em segundos. Valor padrão: hora atual. Importante
Mesmo que você especifique valores personalizados para start e end, esta API consulta apenas dados dentro dos 5 minutos anteriores à hora end. O intervalo real de consulta é |
|
x-sls-disable-range-limit |
Não |
Defina este parâmetro como true para remover o limite de intervalo de consulta de 5 minutos e usar os valores de início e fim especificados. |
|
forceMaxMetaTimeRangeSeconds |
Não |
Intervalo máximo de consulta em segundos. Quando (end - start) excede esse valor, o intervalo de consulta é ajustado para (end - forceMaxMetaTimeRangeSeconds, end). Para obter desempenho ideal de consulta, recomendamos sempre incluir este parâmetro. |
-
Exemplo
Este exemplo consulta todos os valores do rótulo instance da métrica up dentro de um período especificado.
curl -X GET 'https://haoqi-sls-metric-test.pub-cn-hangzhou.log.aliyuncs.com/prometheus/haoqi-sls-metric-test/prometheus-metrics/api/v1/label/instance/values?match[]=up&start=1676700599&end=1676700999' \ -u username:password \ -H 'Content-Type: application/x-www-form-urlencoded' # Set username and password to your Alibaba Cloud AccessKey. -
Resposta de exemplo
{ "status": "success", "data": [ "demo.promlabs.com:10000", "demo.promlabs.com:10001", "demo.promlabs.com:10002" ] }
API de gravação de dados
Ingira dados de séries temporais em um MetricStore configurando o parâmetro remote_write no arquivo de configuração do Prometheus. Para mais informações, consulte Ingest Prometheus monitoring data using the remote write protocol. Como o MetricStore é compatível com o protocolo de remote write do Prometheus, você também pode gravar dados em um MetricStore chamando diretamente a API remote_write via HTTP, sem um processo do Prometheus.
O MetricStore fornece a seguinte API compatível com remote write que analisa dados de séries temporais e os grava no armazenamento de backend.
Quando dados de séries temporais são gravados em um SLS MetricStore usando o protocolo remote write, o SLS usa MetricName e Labels como chave de hash por padrão. Isso roteia dados de diferentes séries temporais para shards específicos, melhorando a localidade dos dados no armazenamento.
POST https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/write
O código a seguir mostra um exemplo.
import (
"bytes"
"flag"
"fmt"
"github.com/gogo/protobuf/proto"
"github.com/golang/snappy"
"github.com/prometheus/prometheus/prompb"
"io/ioutil"
"net/http"
"time"
)
func MockRemoteWrite() {
project := flag.String("project", "xxxx", "")
metricStore := flag.String("metricstore", "xxxx", "")
endpoint := flag.String("endpoint", "xxxx", "")
akId := flag.String("akid", "xxxx", "") // AccessKey information.
akKey := flag.String("aksecret", "xxxx", "")
flag.Parse()
Url := fmt.Sprintf("https://%s.%s/prometheus/%s/%s/api/v1/write", *project, *endpoint, *project, *metricStore)
timestamp := time.Now().UnixNano()
timeSeries := []prompb.TimeSeries{
{
Labels: []prompb.Label{
{Name: "__name__", Value: "test_metric"},
{Name: "app", Value: "HOST"},
{Name: "device", Value: "vda"},
},
Samples: []prompb.Sample{
{Timestamp: timestamp / 1000000, Value: 100},
{Timestamp: timestamp/1000000 + 10000, Value: 200},
{Timestamp: timestamp/1000000 + 20000, Value: 400},
{Timestamp: timestamp/1000000 + 30000, Value: 300},
},
},
{
Labels: []prompb.Label{
{Name: "__name__", Value: "test_metric"},
{Name: "app", Value: "HOST"},
{Name: "device", Value: "vda"},
{Name: "uid", Value: "123456"},
},
Samples: []prompb.Sample{
{Timestamp: timestamp / 1000000, Value: 100},
{Timestamp: timestamp/1000000 + 10000, Value: 200},
{Timestamp: timestamp/1000000 + 20000, Value: 400},
{Timestamp: timestamp/1000000 + 30000, Value: 600},
},
},
}
data, _ := proto.Marshal(&prompb.WriteRequest{Timeseries: timeSeries})
bufBody := snappy.Encode(nil, data)
rwR, err := http.NewRequest("POST", Url, ioutil.NopCloser(bytes.NewReader(bufBody)))
rwR.Header.Add("Content-Encoding", "snappy")
rwR.Header.Set("Content-Type", "application/x-protobuf")
rwR.SetBasicAuth(*akId, *akKey) // Set the basic auth information.
if err != nil {
fmt.Println(err.Error())
return
}
start := time.Now().UnixNano() / 1000000 // ms
do, err := client.Do(rwR)
end := time.Now().UnixNano() / 1000000 // ms
if err != nil {
panic(err)
}
status, result := parseResp(do)
fmt.Println("status:", status, "result:", result, "duration:", end-start)
}
func parseResp(resp *http.Response) (status, data string) {
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body) // The body content must be read completely.
if err != nil {
panic(err)
}
return resp.Status, string(body)
}
Exemplos de SDK
Acessar a API de consulta via HTTP
import (
"flag"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"strconv"
"strings"
"time"
)
const separator = "#"
func http_main() {
project := flag.String("project", "xxxx", "")
metricStore := flag.String("metricstore", "xxxx", "")
endpoint := flag.String("endpoint", "xxxx", "")
akId := flag.String("akid", "xxxx", "")
akKey := flag.String("aksecret", "xxxx", "")
query := flag.String("query", "avg(up)", "")
queryType := flag.String("type", "values", "range or query or labels or values or series")
matches := flag.String("match", "up", "") // Use the # symbol to concatenate multiple match[] parameters.
labelName := flag.String("label", "instance", "")
step := flag.String("step", "1m", "")
fromtime := flag.String("from", "2023-02-15T00:00:00Z", "time 2006-01-02T15:04:05Z07:00")
totime := flag.String("to", "2023-02-15T00:15:00Z", "time 2006-01-02T15:04:05Z07:00")
flag.Parse()
timeFrom, err := time.Parse(time.RFC3339, *fromtime)
if err != nil {
panic(err)
}
timeTo, err := time.Parse(time.RFC3339, *totime)
if err != nil {
panic(err)
}
// URL: https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}
prometheusEndpoint := fmt.Sprintf("https://%s/prometheus/%s/%s", *project+"."+*endpoint, *project, *metricStore)
var uri string
urlVal := url.Values{}
urlVal.Add("start", strconv.FormatInt(timeFrom.Unix(), 10))
urlVal.Add("end", strconv.FormatInt(timeTo.Unix(), 10))
switch *queryType {
case "range":
urlVal.Add("query", *query)
urlVal.Add("step", *step)
uri = fmt.Sprintf("%s/api/v1/query_range?%v", prometheusEndpoint, urlVal.Encode())
case "query":
urlVal.Add("query", *query)
urlVal.Add("time", strconv.FormatInt(timeTo.Unix(), 10))
uri = fmt.Sprintf("%s/api/v1/query?%v", prometheusEndpoint, urlVal.Encode())
case "labels":
extractAddMatches(*matches, urlVal)
uri = fmt.Sprintf("%s/api/v1/labels?%v", prometheusEndpoint, urlVal.Encode())
case "values":
extractAddMatches(*matches, urlVal)
uri = fmt.Sprintf("%s/api/v1/label/%s/values?%v", prometheusEndpoint, *labelName, urlVal.Encode())
case "series":
extractAddMatches(*matches, urlVal)
uri = fmt.Sprintf("%s/api/v1/series?%v", prometheusEndpoint, urlVal.Encode())
}
req, _ := http.NewRequest(http.MethodGet, uri, nil)
req.SetBasicAuth(*akId, *akKey)
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
buf, err := ioutil.ReadAll(resp.Body)
resp.Body.Close()
if err != nil {
panic(err)
}
fmt.Println(string(buf))
}
func extractAddMatches(matches string, uVal url.Values) {
splits := strings.Split(matches, separator)
for _, match := range splits {
uVal.Add("match[]", match)
}
}
Acessar a API de consulta usando o SDK do Prometheus
Este exemplo usa o Prometheus client_golang v1.14.0.
import (
"context"
"flag"
"fmt"
"github.com/prometheus/client_golang/api"
v1 "github.com/prometheus/client_golang/api/prometheus/v1"
"net"
"net/http"
"net/url"
"time"
)
func main() {
project := flag.String("project", "xxxx", "")
metricStore := flag.String("metricstore", "xxxx", "")
endpoint := flag.String("endpoint", "xxxx", "")
akId := flag.String("akid", "xxxx", "")
akKey := flag.String("aksecret", "xxxx", "")
flag.Parse()
// URL: https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}
prometheusEndpoint := fmt.Sprintf("https://%s.%s/prometheus/%s/%s", *project, *endpoint, *project, *metricStore)
client, err := api.NewClient(api.Config{
Address: prometheusEndpoint,
RoundTripper: &http.Transport{
// set basic auth
Proxy: func(req *http.Request) (*url.URL, error) {
req.SetBasicAuth(*akId, *akKey)
return nil, nil
},
DialContext: (&net.Dialer{
Timeout: 60 * time.Second,
KeepAlive: 60 * time.Second,
}).DialContext,
TLSHandshakeTimeout: 10 * time.Second,
},
})
if err != nil {
panic(err)
}
v1api := v1.NewAPI(client)
ctx, _ := context.WithTimeout(context.Background(), 60*time.Second)
r := v1.Range{
Start: time.Now().Add(-15 * time.Minute),
End: time.Now(),
Step: time.Minute,
}
// query range
result, warnings, err := v1api.QueryRange(ctx, "avg(up)", r)
if err != nil {
panic(err)
}
if len(warnings) > 0 {
fmt.Printf("Warnings: %v %v\n", warnings, result)
}
fmt.Println(result)
// query
result, warnings, err = v1api.Query(ctx, "avg(up)", time.Now())
if err != nil {
panic(err)
}
if len(warnings) > 0 {
fmt.Printf("Warnings: %v %v\n", warnings, result)
}
fmt.Println(result)
// series
series, warnings, err := v1api.Series(ctx, []string{"up"}, time.Now().Add(-15*time.Minute), time.Now())
if err != nil {
panic(err)
}
if len(warnings) > 0 {
fmt.Printf("Warnings: %v %v\n", warnings, result)
}
fmt.Println(series)
// labels
names, warnings, err := v1api.LabelNames(ctx, []string{"up"}, time.Now().Add(-15*time.Minute), time.Now())
if err != nil {
panic(err)
}
if len(warnings) > 0 {
fmt.Printf("Warnings: %v %v\n", warnings, result)
}
fmt.Println(names)
// labelValues
values, warnings, err := v1api.LabelValues(ctx, "instance", []string{"up"}, time.Now().Add(-15*time.Minute), time.Now())
if err != nil {
panic(err)
}
if len(warnings) > 0 {
fmt.Printf("Warnings: %v %v\n", warnings, result)
}
fmt.Println(values)
}
Estrutura da resposta
As APIs de consulta e gravação retornam respostas na seguinte estrutura:
{
"status": "success" | "error",
"data": <data>,
// The following two items are returned when an error occurs during query analysis.
"errorType": "<string>",
"error": "<string>",
// A warning message is returned, usually for an incomplete query.
"warnings": ["<string>"]
}
Tratamento de erros
Veja a seguir os erros comuns e suas soluções.
Falha na autenticação
-
Se a resposta a seguir for retornada, a autenticação falhou. Verifique seu par de AccessKeys.
{ "status": "error", "code": "401", "errorType": "unauthorized", "error": "get query instance error: {\n \"httpCode\": 401,\n \"errorCode\": \"Unauthorized\",\n \"errorMessage\": \"AccessKeyId not found: xxxx\",\n \"requestID\": \"xxxx\"\n}" } -
Se a resposta a seguir for retornada, o endereço IP de origem não está na lista de permissões do bloco CIDR da VPC. Adicione o endereço IP à lista de permissões.
{ "status": "error", "code": "401", "errorType": "unauthorized", "error": "get query instance error: {\n \"httpCode\": 401,\n \"errorCode\": \"Unauthorized\",\n \"errorMessage\": \"AccessKeyId not found: xxxx\",\n \"requestID\": \"xxxx\"\n}" }
Erro na expressão PromQL
Se a resposta a seguir for retornada, a expressão PromQL contém um erro. Corrija a expressão no parâmetro query.
--> /api/v1/query_range?query=up[2m]&start=1676700599&end=1676700999&step=60s
{
"status": "error",
"errorType": "bad_data",
"error": "invalid expression type \"range vector\" for range query, must be Scalar or instant Vector"
}
Erro de tempo limite
Se a resposta a seguir for retornada, a consulta atingiu o tempo limite. Aumente o valor de timeout.
{
"status": "error",
"errorType": "timeout",
"error": "query timed out in expression evaluation"
}
Resultados de consulta incompletos
Se a resposta a seguir for retornada, o resultado da consulta está incompleto. Reduza o intervalo de tempo da consulta e tente novamente.
{
"status": "success",
"data": {
"resultType": "matrix",
"result": [
{
"metric": {},
"values": [
[
1673798460,
"11111111"
],
[
1673799060,
"22222222"
],
[
1673799660,
"33333333"
]
]
}
]
},
"warnings": [
"Request to Sls partial incompleted, incomplete task count : 11, total : 108"
]
}