Simple Log Serviceは、メトリクスのクエリやメトリクスのMetricstoreへの書き込みに使用できる複数のAPI操作を提供します。 API操作は、オープンソースのPrometheusプロトコルと互換性があります。 このトピックでは、API操作を呼び出す方法について説明します。
概要
Prometheusによって提供されるAPI操作は、/api/v1ディレクトリに格納されます。 Log Serviceが提供するMetricstore関連のAPI操作もディレクトリに保存されます。 次のURLを使用して、Log Serviceが提供するMetricstore関連のAPI操作を呼び出すことができます: https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1 /。
変数 | 必須 | 説明 |
{sls-endpoint} | 課金されます | Log Serviceエンドポイント。 詳細については、「エンドポイント」をご参照ください。 |
{project} | 課金されます | 作成されたプロジェクト。 詳細については、「プロジェクトの作成」をご参照ください。 |
{metricstore} | 課金されます | 作成されるMetricstore。The Metricstore that is created. 詳細については、「Metricstoreの作成」をご参照ください。 |
API呼び出し中は、基本的な認証が必要です。 UsernameをAccessKey IDに、PasswordをAccessKey secretに設定する必要があります。 RAM ユーザーの AccessKey ペアを使用することを推奨します。 指定したプロジェクトを照会するために必要な権限をRAMユーザーに付与する必要があります。 詳細については、「権限アシスタント機能の設定」をご参照ください。
API操作は、Security Token Service (STS) 認証もサポートしています。 STS認証を実行するには、認証関連の基本設定で {AccessKey Secret }${ STS Token}
形式で [パスワード] を指定します。 詳細については、「」をご参照ください。STSとは何ですか?
メトリッククエリのAPI操作
Instant Queries APIおよびRange Queries API操作は、メトリクスのクエリに使用されます。
インスタントクエリAPI
Instant Queries APIは、指定された時点でのメトリックのクエリに使用されます。
GET https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/query
POST https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/query
次の表に変数を示します。
変数 | 必須 | 説明 |
query | 課金されます | PromQLステートメント。 詳細については、「PromQL」をご参照ください。 |
時間 | 課金されません | 照会する時点。The point in time to query. この値は、秒単位の正確なUNIXタイムスタンプです。 デフォルト値は現在の時刻です。 |
タイムアウト | 課金されません | クエリのタイムアウト期間。 単位は秒です。 タイムアウト期間は、1s、2m、3h、または4d形式で指定できます。 値1sは1秒を示し、値2mは2分を示し、値3hは3時間を示し、値4dは4日を示す。 詳細については、「期間」をご参照ください。 |
lookback-デルタ | 課金されません | query.lookback-delta flagパラメーターのカスタム値を指定するために使用できる変数。 この値は、現在のクエリに対してのみ有効です。 値は期間の指定に従わなければなりません。 詳細については、「期間」をご参照ください。 この変数は、PromQLが計算中に特定の時点を識別するときの最大バックトラック範囲を指定します。 Simple Log Service MetricStoresの変数には、デフォルト値である3mが使用されます。 |
サンプルコード
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ユーザー名: パスワード \ -H「コンテンツタイプ: application/x-www-form-urlencoded」 # ユーザー名とパスワードには、Alibaba CloudアカウントまたはRAMユーザーのAccessKeyペアを指定します。
クエリと分析結果
{ "status": "success" 、 "data": { "resultType": "vector" 、 "result": [ { "metric": { "__name__": "up" 、 "インスタンス": "demo.promlabs.com:10001" 、 "仕事": "デモ" }, "value": [ 1676700550.696, "1" ] }, { "metric": { "__name__": "up" 、 "インスタンス": "demo.promlabs.com:10000" 、 "仕事": "デモ" }, "value": [ 1676700550.696, "1" ] } ] } }
範囲クエリAPI
Range Queries APIは、指定された時間範囲内の複数の時点でメトリクスをクエリするために使用されます。
GET https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/query_range
POST https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/query_range
次の表に変数を示します。
変数 | 必須 | 説明 |
query | 課金されます | PromQLステートメント。 詳細については、「PromQL」をご参照ください。 |
start | NOT | 照会する期間の開始時刻です。 この値は、秒単位の正確なUNIXタイムスタンプです。 |
終了 | NOT | 照会する期間の終了時刻を設定します。 この値は、秒単位の正確なUNIXタイムスタンプです。 |
ステップ | NOT | クエリが実行される間隔。 単位は秒です。 タイムアウト期間は、1s、2m、3h、または4d形式で指定できます。 値1sは1秒を示し、値2mは2分を示し、値3hは3時間を示し、値4dは4日を示す。 詳細については、「期間」をご参照ください。 |
タイムアウト | NOT | クエリのタイムアウト期間。 単位は秒です。 タイムアウト期間は、1s、2m、3h、または4d形式で指定できます。 値1sは1秒を示し、値2mは2分を示し、値3hは3時間を示し、値4dは4日を示す。 詳細については、「期間」をご参照ください。 |
lookback-デルタ | NOT | query.lookback-delta flagパラメーターのカスタム値を指定するために使用できる変数。 この値は、現在のクエリに対してのみ有効です。 値は期間の指定に従わなければなりません。 詳細については、「期間」をご参照ください。 この変数は、PromQLが計算中に特定の時点を識別するときの最大バックトラック範囲を指定します。 Simple Log Service MetricStoresの変数には、デフォルト値である3mが使用されます。 |
サンプルコード
次のサンプルコードは、2023-02-18 14:09:59から2023-02-18 14:16:39までのメトリックをクエリする方法の例を示しています。 間隔は60秒です。
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' # Specify the AccessKey pair of an Alibaba Cloud account or a RAM user for the username and password.
クエリと分析結果
{ "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" ] ] } ] } }
メタデータクエリのAPI操作
Log Serviceでは、ラベル名やラベル値などのメタデータを照会できます。 メタデータクエリをサポートするために、Log Serviceはプロメテウスが提供するメタデータクエリのAPI操作と互換性があります。 メタデータクエリのAPI操作の詳細については、「メタデータのクエリ」をご参照ください。 メタデータクエリのAPI操作を使用して、すべてのメトリック、ラベル名、およびラベル値を取得できます。 メタデータクエリのAPI操作を使用して、タイムスタンプまたは数値を取得することはできません。
クエリシリーズAPI
クエリシリーズAPI操作は、指定された期間内に指定された条件を満たすすべてのメトリック名とラベルベースの数値ペアをクエリするために使用されます。
GET https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/series
POST https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/series
次の表に変数を示します。
変数 | 必須 | 説明 |
match[] | 課金されます | The filter condition. 例: up{instance="demo.*"} 。 1つ以上の条件を指定できます。 |
start | NOT | 照会する期間の開始時刻です。 この値は、秒単位の正確なUNIXタイムスタンプです。 デフォルト値は、現在時刻の5分前です。 |
終了 | NOT | 照会する期間の終了時刻を設定します。 この値は、秒単位の正確なUNIXタイムスタンプです。 デフォルト値は現在の時刻です。 重要 startおよびend変数の値を指定した場合、この操作を呼び出して、end変数で指定された時間の5分以内に生成されたデータのみを照会できます。 |
設定例
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' # Specify the AccessKey pair of an Alibaba Cloud account or a RAM user for the username and password.
クエリと分析結果
{ "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
[ラベル名の照会] APIは、指定された期間内に指定された条件を満たすすべてのラベル名を照会するために使用されます。
GET https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/labels
POST https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/labels
次の表に変数を示します。
変数 | 必須 | 説明 |
match[] | 課金されます | The filter condition. 例: up{instance="demo.*"} 。 1つ以上の条件を指定できます。 変数を空のままにすることもできます。 |
start | NOT | 照会する期間の開始時刻です。 この値は、秒単位の正確なUNIXタイムスタンプです。 デフォルト値は、現在時刻の5分前です。 |
終了 | NOT | 照会する期間の終了時刻を設定します。 この値は、秒単位の正確なUNIXタイムスタンプです。 デフォルト値は現在の時刻です。 重要 startおよびend変数の値を指定した場合、この操作を呼び出して、end変数で指定された時間の5分以内に生成されたデータのみを照会できます。 |
設定例
次のサンプルコードは、指定した期間内にすべてのメトリックのラベル名を照会する方法の例を示しています。
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' # Specify the AccessKey pair of an Alibaba Cloud account or a RAM user for username and password.
クエリと分析結果
{ "status": "success", "data": [ "code", "instance", "job", "le", "method", "mode", "path", "quantile", "status", "type", "version", "__name__" ] }
クエリラベル値API
ラベル値の照会API操作は、指定された期間内に指定された条件を満たす指定されたラベル名のすべてのラベル値を照会するために使用されます。
ラベル値クエリAPIのURLの <label_name> を実際のラベル名に置き換えます。
GET https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/label/<label_name>/values
次の表に変数を示します。
変数 | 必須 | 説明 |
match[] | 課金されます | The filter condition. 例: up{instance="demo.*"} 。 1つ以上の条件を指定できます。 |
start | NOT | 照会する期間の開始時刻です。 この値は、秒単位の正確なUNIXタイムスタンプです。 デフォルト値は、現在時刻の5分前です。 |
終了 | NOT | 照会する期間の終了時刻を設定します。 この値は、秒単位の正確なUNIXタイムスタンプです。 デフォルト値は現在の時刻です。 重要 startおよびend変数に値を指定した場合、この操作を呼び出して、end変数で指定された時間の5分以内に生成されたデータのみを照会できます。 |
設定例
次のサンプルコードは、指定された期間内にupメトリックのインスタンスラベルのすべての値を照会する方法の例を示しています。
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' # Specify the AccessKey pair of an Alibaba Cloud account or a RAM user for the username and password.
クエリと分析結果
{ "status": "success", "data": [ "demo.promlabs.com:10000", "demo.promlabs.com:10001", "demo.promlabs.com:10002" ] }
データ書き込みのAPI操作
Prometheusプロセスの設定ファイルでremote_writeパラメーターを設定して、Metricstoresにメトリックを収集できます。 詳細については、「リモート書き込みプロトコルを使用したPrometheusからのメトリックデータの収集」をご参照ください。 Metricstoreはリモート書き込みプロトコルと互換性があります。 HTTP経由でremote_write操作を呼び出して、Prometheusプロセスを使用せずにMetricstoresにデータを書き込むことができます。 リモート書き込みプロトコルの詳細については、「リモート書き込み」をご参照ください。
remote_write API操作は、メトリクスを解析し、解析後に取得したデータをバックエンドストレージに書き込むために使用されます。
POST https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/write
サンプルコード:
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", "") // The AccessKey ID.
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) // The information that is used for basic authentication.
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) // Specifies that all content in the request body must be read.
if err != nil {
panic(err)
}
return resp.Status, string(body)
}
SDK サンプルコード
HTTPを介したクエリAPI操作の呼び出し
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", "") // Concatenate multiple parameters of the match[] method by using number signs (#).
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-enpoint}/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)
}
}
SDK for Prometheusを使用したクエリAPI操作の呼び出し
この例では、使用されているPrometheus用SDKのバージョンはv1.14.0です。 詳細については、「Prometheus client_golang」をご参照ください。
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-enpoint}/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)
}
構造の応答
次のコードは、クエリAPI操作とデータ書き込みAPI操作に対する応答の構造を示しています。
{
"status": "success" | "error",
"data": <data>,
// The following code is returned if an error occurs in a query:
"errorType": "<string>",
"error": "<string>",
// The following warning information is returned if the query results are incomplete:
"warnings": ["<string>"]
}
エラー処理
以下の説明に基づいて、一般的なエラーを処理できます。
認証失敗
次の情報が返された場合、認証は失敗します。 有効なAccessKeyペアを指定することを推奨します。
{
"status": "error",
"errorType": "unauthorized",
"error": "get query instance error: {\n \"httpCode\": 401,\n \"errorCode\": \"Unauthorized\",\n \"errorMessage\": \"AccessKeyId not found: xxxx\",\n \"requestID\": \"xxxx\"\n}"
}
無効なPromQLステートメント
次の情報が返された場合、PromQLステートメントは無効です。 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"
}
タイムアウトエラー
次の情報が返された場合、クエリはタイムアウトします。 timeoutパラメーターの値を増やすことを推奨します。
{
"status": "error",
"errorType": "timeout",
"error": "query timed out in expression evaluation"
}
不完全なクエリ結果
次の情報が返された場合、クエリ結果は不完全です。 クエリの時間範囲を狭めて、再度クエリを実行することを推奨します。
{
"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"
]
}