Contrôle et attribution des coûts

Le service Google Cloud Managed Service for Prometheus facture le nombre d'échantillons ingérés dans Cloud Monitoring et les requêtes de lecture adressées à l'API Monitoring. Le nombre d'échantillons ingérés est le principal facteur de coût.

Ce document explique comment contrôler les coûts associés à l'ingestion de métriques et comment identifier les sources d'ingestion volumineuse.

Pour en savoir plus sur la tarification de Managed Service pour Prometheus, consultez la section Récapitulatif des tarifs de Managed Service pour Prometheus.

Afficher une facture

Pour afficher une facture Google Cloud, procédez comme suit :

  1. Dans Google Cloud Console, accédez à la page Facturation.

    Accéder à Facturation

  2. Si vous disposez de plusieurs comptes de facturation, sélectionnez Go to linked billing account (Accéder au compte de facturation associé) pour consulter le compte de facturation du projet actuel. Pour rechercher un autre compte de facturation, sélectionnez Gérer les comptes de facturation, puis sélectionnez le compte pour lequel vous souhaitez afficher les rapports.

  3. Sélectionnez Rapports.

  4. Dans le menu Services, sélectionnez l'option Stackdriver Monitoring.

  5. Dans le menu Codes SKU, sélectionnez les options suivantes :

    • Échantillons Prometheus ingérés
    • Surveiller les requêtes API

La capture d'écran suivante montre le rapport de facturation de Managed Service pour Prometheus d'un projet :

Le rapport de facturation de Managed Service pour Prometheus indique l'utilisation actuelle et prévue.

Réduire vos coûts

Pour réduire les coûts associés à l'utilisation de Managed Service pour Prometheus, vous pouvez effectuer les opérations suivantes :

  • Réduisez le nombre de séries temporelles envoyées au service géré en filtrant les données de métriques que vous générez.
  • Réduisez le nombre d'échantillons collectés en modifiant l'intervalle de scraping.
  • Limitez le nombre d'échantillons de métriques à cardinalité élevée potentiellement mal configurées.

Réduire le nombre de séries temporelles

La documentation Open Source Prometheus recommande rarement de filtrer le volume de métriques, ce qui est raisonnable lorsque les coûts sont limités par les coûts des machines. Toutefois, lorsque vous payez un fournisseur de services gérés à l'unité, l'envoi de données illimitées peut entraîner des factures inutilement élevées.

Les exportateurs inclus dans le projet kube-prometheus, en particulier le service kube-state-metrics, peuvent émettre de nombreuses données de métriques. Par exemple, le service kube-state-metrics émet des centaines de métriques, dont la plupart peuvent être sans valeur pour vous en tant que consommateur. Un nouveau cluster à trois nœuds utilisant le projet kube-prometheus envoie environ 900 échantillons par seconde à Managed Service pour Prometheus. Le filtrage de ces métriques superflues peut suffire à maintenir votre facture à un niveau acceptable.

Pour réduire le nombre de métriques, vous pouvez effectuer les opérations suivantes :

Si vous utilisez le service kube-state-metrics, vous pouvez ajouter une règle de changement de libellé Prometheus avec une action keep. Pour les collections gérées, cette règle est comprise dans la définition PodMonitoring ou ClusterPodMonitoring. Pour la collection auto-déployée, cette règle se trouve dans votre configuration de scrape Prometheus ou dans votre définition ServiceMonitor (pour l'opérateur prometheus-operator).

Par exemple, l'utilisation du filtre suivant sur un nouveau cluster à trois nœuds réduit le volume d'échantillons d'environ 125 échantillons par seconde :

  metricRelabeling:
  - action: keep
    regex: kube_(daemonset|deployment|pod|namespace|node|statefulset)_.+
    sourceLabels: [__name__]

Il peut arriver qu'un exportateur entier ne soit pas important. Par exemple, le package kube-prometheus installe par défaut les moniteurs de service suivants, dont la plupart sont inutiles dans un environnement géré :

  • alertmanager
  • coredns
  • grafana
  • kube-apiserver
  • kube-controller-manager
  • kube-scheduler
  • kube-state-metrics
  • kubelet
  • node-exporter
  • prometheus
  • prometheus-adapter
  • prometheus-operator

Pour réduire le nombre de métriques que vous exportez, vous pouvez supprimer, désactiver ou arrêter les moniteurs de service dont vous n'avez pas besoin. Par exemple, la désactivation du moniteur de service kube-apiserver sur un nouveau cluster à trois nœuds réduit le volume d'échantillons d'environ 200 échantillons par seconde.

Réduire le nombre d'échantillons collectés

Managed Service pour Prometheus est facturé à l'échantillon. Vous pouvez réduire le nombre d'échantillons ingérés en augmentant la durée de la période d'échantillonnage. Exemple :

  • Le remplacement d'une période d'échantillonnage de 10 secondes par une période d'échantillonnage de 30 secondes peut réduire le volume d'échantillons de 66 %, sans perte importante d'informations.
  • Le remplacement d'une période d'échantillonnage de 10 secondes par une période d'échantillonnage de 60 secondes peut réduire le volume d'échantillons de 83 %.

Pour savoir comment les échantillons sont comptabilisés et l'incidence de la période d'échantillonnage sur le nombre d'échantillons, consultez la section Exemples de tarification basés sur les échantillons ingérés.

Vous pouvez généralement définir l'intervalle de scraping par tâche ou par cible.

Pour la collecte gérée, vous définissez l'intervalle de scraping dans la ressource PodMonitoring à l'aide du champ interval. Pour une collecte auto-déployée, vous définissez l'intervalle d'échantillonnage dans vos configurations de scraping, en définissant généralement un champ interval ou scrape_interval.

Configurer l'agrégation locale (collection auto-déployée uniquement)

Si vous configurez le service en utilisant une collection auto-déployée, par exemple avec kube-prometheus, prometheus-operator ou en déployant manuellement l'image, vous pouvez réduire vos exemples envoyés à Managed Service pour Prometheus en agrégeant localement des métriques à cardinalité élevée. Vous pouvez utiliser des règles d'enregistrement pour agréger des libellés tels que instance, et utiliser l'option --export.match ou la variable d'environnement EXTRA_ARGS pour envoyer uniquement des données agrégées à Monarch.

Par exemple, supposons que vous disposiez de trois métriques, high_cardinality_metric_1, high_cardinality_metric_2 et low_cardinality_metric. Vous souhaitez réduire les échantillons envoyés pour high_cardinality_metric_1 et éliminer tous les échantillons envoyés pour high_cardinality_metric_2, tout en conservant toutes les données brutes stockées localement (éventuellement à des fins d'alerte). Votre configuration devrait alors ressembler au tableau suivant :

  • Déployez l'image de Managed Service pour Prometheus.
  • Configurez vos configurations scrape pour scraper les données brutes dans le serveur local (en utilisant le moins de filtres possible).
  • Configurez vos règles d'enregistrement pour exécuter des agrégations locales sur high_cardinality_metric_1 et high_cardinality_metric_2, éventuellement en agrégeant le libellé instance ou un nombre illimité de libellés de métriques, en fonction de ce qui fournit la meilleure réduction du nombre de séries temporelles inutiles. Vous pouvez exécuter une règle semblable à celle-ci, qui supprime le libellé instance et additionne les séries temporelles obtenues par rapport aux libellés restants :

    record: job:high_cardinality_metric_1:sum
    expr: sum without (instance) (high_cardinality_metric_1)
    

    Pour plus d'options d'agrégation, consultez la section Opérateurs d'agrégation dans la documentation Prometheus.

  • Déployez l'image de Managed Service pour Prometheus avec l'option de filtre suivante, qui empêche l'envoi des données brutes des métriques répertoriées à Monarch :

    --export.match='{__name__!="high_cardinality_metric_1",__name__!="high_cardinality_metric_2"}'
    

    Cet exemple d'option export.match utilise des sélecteurs séparés par des virgules avec l'opérateur != pour filtrer les données brutes indésirables. Si vous ajoutez des règles d'enregistrement supplémentaires pour agréger d'autres métriques à cardinalité élevée, vous devez également ajouter un nouveau sélecteur __name__ au filtre afin que les données brutes soient supprimées. En utilisant un seul indicateur contenant plusieurs sélecteurs avec l'opérateur != pour filtrer les données indésirables, vous ne devez modifier le filtre que lorsque vous créez une agrégation au lieu de chaque modification ou ajout d'une configuration scrape.

    Certaines méthodes de déploiement, telles que Prometheus-operator, peuvent vous obliger à omettre les guillemets simples autour des crochets.

Ce workflow peut entraîner des coûts opérationnels lors de la création et de la gestion des règles d'enregistrement et des options export.match, mais il est probable que vous puissiez réduire un volume important en vous concentrant uniquement sur les métriques à cardinalité exceptionnellement élevée. Pour savoir quelles métriques peuvent bénéficier le plus d'une pré-agrégation locale, consultez la section Identifier les métriques volumineuses.

Ne mettez pas en œuvre la fédération lorsque vous utilisez Managed Service pour Prometheus. Ce workflow rend obsolète l'utilisation de serveurs de fédération, car un seul serveur Prometheus autodéployé peut effectuer toutes les agrégations au niveau du cluster dont vous avez besoin. La fédération peut provoquer des effets inattendus, tels que des métriques de type "inconnu" et un doublement du volume d'ingestion.

Limiter les échantillons à partir des métriques à cardinalité élevée (collection auto-déployée uniquement)

Vous pouvez créer des métriques à cardinalité extrêmement élevée en ajoutant des libellés avec un grand nombre de valeurs potentielles, comme un ID utilisateur ou une adresse IP. Ces métriques peuvent générer un très grand nombre d'échantillons. L'utilisation de libellés comportant un grand nombre de valeurs est généralement considérée comme une configuration incorrecte. Vous pouvez éviter les métriques à cardinalité élevée dans vos collecteurs auto-déployés en définissant une valeur sample_limit dans vos configurations de scraping.

Si vous utilisez cette limite, nous vous recommandons de la définir sur une valeur très élevée afin qu'elle ne détecte que les métriques mal configurées. Tous les échantillons dépassant la limite sont supprimés. Il peut s'avérer très difficile de diagnostiquer les problèmes causés par le dépassement de la limite.

L'utilisation d'une limite d'échantillons n'est pas un bon moyen de gérer l'ingestion des échantillons, mais elle peut vous protéger contre une erreur de configuration accidentelle. Pour en savoir plus, consultez la page Utiliser sample_limit pour éviter la surcharge.

Identifier et attribuer les coûts

Vous pouvez utiliser Cloud Monitoring pour identifier les métriques Prometheus qui écrivent le plus grand nombre d'échantillons. Ces métriques représentent la part la plus importante des coûts. Après avoir identifié les métriques les plus coûteuses, vous pouvez modifier vos configurations de scraping pour filtrer ces métriques de manière appropriée.

Les sections suivantes décrivent comment analyser le nombre d'échantillons que vous envoyez à Managed Service pour Prometheus et attribuer un volume élevé à des métriques spécifiques, à des espaces de noms Kubernetes et à des régions Google Cloud.

Identifier les métriques à volume élevé

Pour identifier les métriques Prometheus avec les volumes d'ingestion les plus importants, procédez comme suit :

  1. Dans Google Cloud Console, accédez à la page Monitoring.

    Accéder à Monitoring

  2. Dans le volet de navigation "Surveillance", cliquez sur  Explorateur de métriques.
  3. Sélectionnez l'onglet Configuration, puis utilisez les informations suivantes pour remplir les champs :
    1. Dans le champ Ressource et métrique saisissez ou sélectionnez Attribution pour l'ingestion de métriques et Exemples écrits par ID d'attribution.
    2. Dans le champ Grouper par, sélectionnez metric_type et attribution_dimension.
    3. Dans le champ Filtres, sélectionnez attribution_dimension = espace de noms. Cette opération doit être effectuée après le regroupement par attribution_dimension.
    4. Dans le champ Agrégateur, sélectionnez somme.

    Le graphique affiche maintenant les volumes d'ingestion pour chaque type de métrique.

  4. Pour identifier les métriques avec les volumes d'ingestion les plus importants, cliquez sur Valeur dans la légende du graphique.

Le graphique obtenu montre vos 300 premières métriques par volume, classées par moyenne. Il ressemble à la capture d'écran suivante :

Le graphique configuré indique le volume d'ingestion de métriques pour chaque métrique.

Identifier les espaces de noms à volume élevé

Vous pouvez également utiliser les types de métriques et de ressources de l'exemple précédent pour attribuer le volume d'ingestion à des espaces de noms Kubernetes spécifiques, puis prendre des mesures appropriées. Exemple :

  • Pour mettre en corrélation le volume d'ingestion global avec les espaces de noms, sélectionnez les libellés suivants dans le champ Grouper par, puis appliquez un filtre attribution_dimension = espace de noms :

    • attribution_dimension
    • attribution_id
  • Pour mettre en corrélation le volume d'ingestion de métriques individuelles avec des espaces de noms, sélectionnez les libellés suivants dans le champ Grouper par, puis appliquez un filtre attribution_dimension = espace de noms :

    • attribution_dimension
    • attribution_id
    • Type de métrique
  • Pour identifier les espaces de noms responsables d'une métrique à volume élevé spécifique, procédez comme suit :

    1. Identifiez le type de métrique à volume élevé à l'aide de l'un des autres exemples permettant de les identifier. Le type de métrique est la chaîne de la légende du graphique qui commence par prometheus.googleapis.com/.
    2. Pour limiter les données du graphique à un type de métrique spécifique, ajoutez un filtre pour le type de métrique dans le champ Filtres. Exemple :

      metric_type=prometheus.googleapis.com/container_tasks_state/gauge

    3. Sélectionnez les libellés suivants dans le champ Grouper par, puis appliquez un filtre attribution_dimension = espace de noms :

      • attribution_dimension
      • attribution_id
  • Pour afficher l'ingestion par région Google Cloud, ajoutez le libellé location au champ Grouper par.

  • Pour afficher l'ingestion par projet Cloud, ajoutez le libellé resource_container au champ Grouper par.