Tous les produits
Search
Centre de documentation

Simple Log Service:API HTTP de MetricStore

Dernière mise à jour :Oct 10, 2026

Simple Log Service (SLS) propose des API compatibles avec Prometheus pour interroger les métriques de séries temporelles et écrire des données dans un MetricStore. Cette rubrique détaille les endpoints, les paramètres de requête, les méthodes d'authentification ainsi que la gestion des erreurs.

Présentation

Les API Prometheus sont exposées via le chemin /api/v1. Les API de MetricStore suivent cette même convention. Le format complet de l'URL est : https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/.

Paramètre

Obligatoire

Description

{sls-endpoint}

Oui

Un endpoint de service correspond au nom de domaine utilisé pour accéder à SLS. L'endpoint dépend de la région où réside le projet. Pour en savoir plus, consultez la page Endpoints de service.

{project}

Oui

Project name : un projet constitue l'unité de gestion des ressources dans SLS et définit la limite principale pour l'isolation multi-utilisateurs et le contrôle d'accès. Pour plus d'informations, reportez-vous à la section Gérer des projets.

{metricstore}

Oui

Nom de votre MetricStore. Pour connaître la procédure de création, consultez la page Créer un MetricStore.

Important

Ces API nécessitent une authentification Basic. Définissez le champ Username avec votre AccessKey ID et le champ Password avec votre AccessKey Secret. Par mesure de sécurité, utilisez la paire de clés d'un utilisateur RAM. Accordez à cet utilisateur les autorisations nécessaires sur le projet cible. Pour plus de détails, consultez la page Configurer l'Assistant d'autorisation.

L'authentification STS est également prise en charge. Lorsque vous utilisez STS, définissez le champ Password dans l'en-tête BasicAuth selon le format {AccessKey Secret}${STS token}. Pour en savoir plus, reportez-vous à la documentation Présentation de STS.

API d'interrogation des métriques de séries temporelles

Les API d'interrogation des métriques de séries temporelles comprennent l'API d'interrogation instantanée et l'API d'interrogation par plage.

API d'interrogation instantanée

L'API d'interrogation instantanée permet de récupérer les données de métriques à un instant précis.

GET https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/query
POST https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/query

Paramètres :

Paramètre

Obligatoire

Description

query

Oui

Expression PromQL. Pour plus d'informations, consultez la section Syntaxe PromQL.

time

Non

Horodatage d'évaluation exprimé en secondes (format Unix). Valeur par défaut : heure actuelle.

timeout

Non

Délai d'expiration de la requête, en secondes.

Prend également en charge les formats de durée tels que 1s, 2m ou 3h. Exemple : timeout=10s.

lookback_delta

Non

Remplace l'indicateur Prometheus query.lookback-delta pour cette requête. Cet indicateur définit la période maximale de rétrospection pour la recherche de points de données lors de l'évaluation PromQL. Indiquez une valeur de durée, par exemple lookback_delta=1m. Valeur par défaut : 3m.

Cette API renvoie les quatre types de résultats suivants :

  • vector

    • Exemple de code

      curl -X GET 'http://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/query?query=up&time=1676700699' \
      -u username:password \
      -H 'Content-Type: application/x-www-form-urlencoded'
      
      # Set username to your AccessKey ID and password to your AccessKey Secret.
    • Résultat

      {
          "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"
                      ]
                  }
              ]
          }
      }
  • scalar

    • Exemple de code

      curl -X GET 'http://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/query?query=2-1&time=1676700699' \
      -u username:password \
      -H 'Content-Type: application/x-www-form-urlencoded'
      
      # Set username to your AccessKey ID and password to your AccessKey Secret.
    • Résultat

      {
          "status": "success",
          "data": {
              "resultType": "scalar",
              "result": [
                  1676700699,
                  "0"
              ]
          }
      }
  • string

    • Exemple de code

      curl -X GET 'http://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/query?query="test_string"&time=1676700699' \
      -u username:password \
      -H 'Content-Type: application/x-www-form-urlencoded'
      
      # Set username to your AccessKey ID and password to your AccessKey Secret.
    • Résultat

      {
          "status": "success",
          "data": {
              "resultType": "string",
              "result": [
                  1676700699,
                  "test_string"
              ]
          }
      }
  • matrix

    • Exemple de code

      curl -X GET 'http://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/query?query=up[1m]&time=1743414624' \
      -u username:password \
      -H 'Content-Type: application/x-www-form-urlencoded'
      
      # Set username to your AccessKey ID and password to your AccessKey Secret.
    • Résultat

      {
          "status": "success",
          "data": {
              "resultType": "matrix",
              "result": [
                  {
                      "metric": {
                          "__name__": "up",
                          "instance": "demo.promlabs.com:10000",
                          "job": "demo"
                      },
                      "values": [
                          [
                              1743414609.803,
                              "1"
                          ],
                          [
                              1743414614.803,
                              "1"
                          ],
                          [
                              1743414619.803,
                              "1"
                          ]
                      ]
                  },
                  {
                      "metric": {
                          "__name__": "up",
                          "instance": "demo.promlabs.com:10001",
                          "job": "demo"
                      },
                      "values": [
                          [
                              1743414611.078,
                              "1"
                          ],
                          [
                              1743414616.078,
                              "1"
                          ],
                          [
                              1743414621.078,
                              "1"
                          ]
                      ]
                  }
              ]
          }
      }

API d'interrogation par plage

L'API d'interrogation par plage permet de récupérer les données de métriques à plusieurs instants au sein d'une plage temporelle donnée.

GET https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/query_range
POST https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/query_range

Paramètres :

Paramètre

Obligatoire

Description

query

Oui

Expression PromQL. Pour plus d'informations, consultez la section Syntaxe PromQL.

start

Non

Début de la plage d'interrogation, exprimé en secondes (horodatage Unix).

end

Non

Fin de la plage d'interrogation, exprimée en secondes (horodatage Unix).

step

Non

Pas de résolution de la requête, en secondes.

Prend également en charge les formats de durée tels que 1s, 2m ou 3h. Exemple : step=2m.

timeout

Non

Délai d'expiration de la requête, en secondes.

Prend également en charge les formats de durée tels que 1s, 2m et 3h. Exemple : timeout=10s.

lookback_delta

Non

Remplace l'indicateur Prometheus query.lookback-delta pour cette requête. Cet indicateur définit la période maximale de rétrospection pour la recherche de points de données lors de l'évaluation PromQL. Indiquez une valeur de durée, par exemple lookback_delta=1m. Valeur par défaut : 3m.

  • Exemple de code

    Interrogez les données de métriques du 18 février 2023 à 14:09:59 jusqu'au 18 février 2023 à 14:16:39, avec un step de 60 s.

    curl -X GET 'https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/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 to your AccessKey ID and password to your AccessKey Secret.
  • Résultat

    {
      "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 d'interrogation des métadonnées

SLS prend également en charge les API d'interrogation des métadonnées compatibles avec les endpoints Prometheus dédiés à l'interrogation des métadonnées. Ces API permettent de récupérer les noms de métriques, les libellés et les valeurs de libellés sur une plage temporelle donnée, à l'exclusion des horodatages et des valeurs d'échantillons.

API d'interrogation des séries

L'API d'interrogation des séries récupère tous les noms de métriques ainsi que leurs paires clé-valeur de libellés correspondant à des sélecteurs spécifiques sur une plage temporelle donnée.

GET https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/series
POST https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/series

Paramètres :

Paramètre

Obligatoire

Description

match[]

Oui

Sélecteurs de séries à faire correspondre. Par exemple, match[]=up{instance="demo.*"}.

Prend en charge un ou plusieurs paramètres match[].

start

Non

Début de la plage d'interrogation, exprimé en secondes (horodatage Unix).

Valeur par défaut : 5 minutes avant l'heure actuelle.

end

Non

Fin de la plage d'interrogation, exprimée en secondes (horodatage Unix).

Valeur par défaut : heure actuelle.

Important

Si vous spécifiez des valeurs personnalisées pour les paramètres start et end, l'API limite la requête à l'intervalle de 5 minutes précédant l'heure end. La plage effective de la requête est [end - 5 minutes, end].

x-sls-disable-range-limit

Non

Définissez ce paramètre sur true pour contourner la limite de requête de 5 minutes et utiliser la plage complète spécifiée par start et end.

forceMaxMetaTimeRangeSeconds

Non

Plage temporelle maximale de la requête, en secondes. Si la durée entre end et start dépasse cette valeur, la plage de requête est ajustée à (end - forceMaxMetaTimeRangeSeconds, end).

Définissez ce paramètre pour améliorer l'efficacité des requêtes.

  • Exemple de requête

    curl -g -X GET 'https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/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 to your AccessKey ID and password to your AccessKey Secret.
  • Résultat

    {
        "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 d'interrogation des noms de libellés

L'API d'interrogation des noms de libellés récupère tous les noms de libellés issus des séries correspondant aux sélecteurs spécifiés sur une plage temporelle donnée.

GET https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/labels
POST https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/labels

Paramètres :

Paramètre

Obligatoire

Description

match[]

Oui

Sélecteurs de séries à faire correspondre. Par exemple, match[]=up{instance="demo.*"}.

Prend en charge zéro, un ou plusieurs paramètres match[].

start

Non

Début de la plage d'interrogation, exprimé en secondes (horodatage Unix).

Valeur par défaut : 5 minutes avant l'heure actuelle.

end

Non

Fin de la plage d'interrogation, exprimée en secondes (horodatage Unix).

Valeur par défaut : heure actuelle.

Important

Si vous spécifiez des valeurs personnalisées pour les paramètres start et end, l'API limite la requête à l'intervalle de 5 minutes précédant l'heure end. La plage effective de la requête est [end - 5 minutes, end].

x-sls-disable-range-limit

Non

Définissez ce paramètre sur true pour contourner la limite de requête de 5 minutes et utiliser la plage complète spécifiée par start et end.

forceMaxMetaTimeRangeSeconds

Non

Plage temporelle maximale de la requête, en secondes. Si la durée entre end et start dépasse cette valeur, la plage de requête est ajustée à (end - forceMaxMetaTimeRangeSeconds, end).

Définissez ce paramètre pour améliorer l'efficacité des requêtes.

  • Exemple de requête

    Récupérez tous les noms de libellés pour toutes les métriques sur la plage temporelle spécifiée.

    curl -X GET 'https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/labels?start=1676700599&end=1676700999' \
    -u username:password \
    -H 'Content-Type: application/x-www-form-urlencoded'
    
    # Set username to your AccessKey ID and password to your AccessKey Secret.
  • Résultat

    {
        "status": "success",
        "data": [
            "code",
            "instance",
            "job",
            "le",
            "method",
            "mode",
            "path",
            "quantile",
            "status",
            "type",
            "version",
            "__name__"
        ]
    }

API d'interrogation des valeurs de libellés

L'API d'interrogation des valeurs de libellés récupère toutes les valeurs associées à un nom de libellé spécifique, issues des séries correspondant aux sélecteurs spécifiés sur une plage temporelle donnée.

Important

Remplacez <label_name> dans l'URL de l'API par un nom de libellé spécifique.

GET https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/label/<label_name>/values

Paramètres :

Paramètre

Obligatoire

Description

match[]

Oui

Sélecteurs de séries à faire correspondre. Par exemple, match[]=up{instance="demo.*"}.

Prend en charge un ou plusieurs paramètres match[].

start

Non

Début de la plage d'interrogation, exprimé en secondes (horodatage Unix).

Valeur par défaut : 5 minutes avant l'heure actuelle.

end

Non

Fin de la plage d'interrogation, exprimée en secondes (horodatage Unix).

Valeur par défaut : heure actuelle.

Important

Si vous spécifiez des valeurs personnalisées pour les paramètres start et end, l'API limite la requête à l'intervalle de 5 minutes précédant l'heure end. La plage effective de la requête est [end - 5 minutes, end].

x-sls-disable-range-limit

Non

Définissez ce paramètre sur true pour contourner la limite de requête de 5 minutes et utiliser la plage complète spécifiée par start et end.

forceMaxMetaTimeRangeSeconds

Non

Plage temporelle maximale de la requête, en secondes. Si la durée entre end et start dépasse cette valeur, la plage de requête est ajustée à (end - forceMaxMetaTimeRangeSeconds, end).

Définissez ce paramètre pour améliorer l'efficacité des requêtes.

  • Exemple de requête

    Récupérez toutes les valeurs du libellé instance pour la métrique up sur la plage temporelle spécifiée.

    curl -X GET 'https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/label/instance/values?match[]=up&start=1676700599&end=1676700999' \
    -u username:password \
    -H 'Content-Type: application/x-www-form-urlencoded'
    
    # Set username to your AccessKey ID and password to your AccessKey Secret.
  • Résultat

    {
        "status": "success",
        "data": [
            "demo.promlabs.com:10000",
            "demo.promlabs.com:10001",
            "demo.promlabs.com:10002"
        ]
    }

API d'écriture de données

Pour ingérer des données de séries temporelles dans un MetricStore, configurez le paramètre remote_write dans votre fichier de configuration Prometheus. Pour plus de détails, consultez la page Utiliser le protocole remote write pour ingérer les données de surveillance Prometheus. MetricStore est compatible avec le protocole remote write de Prometheus. Il est également possible d'envoyer des requêtes HTTP directement vers l'endpoint remote write, sans avoir besoin d'exécuter un processus Prometheus.

MetricStore met à disposition l'endpoint remote write suivant pour analyser et stocker les données de séries temporelles.

Important

Lors de l'écriture de données de séries temporelles dans la base de données de séries temporelles SLS via le protocole remote write, SLS utilise par défaut le nom de la métrique et les libellés comme clé de hachage. Cette approche achemine les données provenant de différentes séries temporelles vers des shards spécifiques, améliorant ainsi la localité des données dans le stockage backend.

POST https://{project}.{sls-endpoint}/prometheus/{project}/{metricstore}/api/v1/write

Exemple d'implémentation Go pour l'API remote 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", "") // Your AccessKey ID.
	akKey := flag.String("aksecret", "xxxx", "") // Your AccessKey Secret.
	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 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) // The response body must be fully read.
	if err != nil {
		panic(err)
	}
	return resp.Status, string(body)
}

Exemples SDK

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 a number sign (#) to separate 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)
	}
}

SDK Prometheus

L'exemple suivant utilise la bibliothèque 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)
}

Structure de réponse

Les API d'interrogation et d'écriture renvoient des réponses structurées comme suit :

{
  "status": "success" | "error",
  "data": <data>,

  // Returned when a query evaluation error occurs.
  "errorType": "<string>",
  "error": "<string>",
  
  // Returned to indicate a potentially incomplete query.
  "warnings": ["<string>"]
}

Gestion des erreurs

Les sections suivantes décrivent les erreurs courantes et leurs résolutions.

Échec d'authentification

  • La réponse suivante indique un échec d'authentification. Vérifiez que vos identifiants AccessKey sont corrects.

    {
        "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}"
    }
  • Cette erreur peut également survenir si l'adresse IP source ne figure pas dans la liste blanche des blocs CIDR VPC. Ajoutez l'adresse IP à la liste blanche des blocs CIDR VPC.

    {
        "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}"
    }

Erreur de syntaxe PromQL

La réponse suivante indique une expression PromQL invalide. Corrigez l'expression dans le paramètre 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"
}

Erreur de délai d'expiration

La réponse suivante indique un dépassement du délai d'attente de la requête. Augmentez la valeur du paramètre timeout.

{
    "status": "error",
    "errorType": "timeout",
    "error": "query timed out in expression evaluation"
}

Requête incomplète

Une réponse accompagnée d'avertissements signale un résultat incomplet. Réduisez la plage temporelle et relancez la requête.

{
    "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"
    ]
}