web-dev-qa-db-fra.com

Est-il possible d'avoir une moyenne mobile à Grafana?

Je n'ai pas trouvé de fonctionnalité «moyenne mobile» et je me demande s'il existe une solution de contournement.

J'utilise influxdb comme back-end.

7
brunoqc

Grafana ne fait pas de calcul lui-même, il interroge simplement un serveur et trace des graphiques de Nice. Donc, l'agrégation des capacités dépend uniquement de votre backend. Bien que Graphite prenne en charge les fonctions de fenêtrage telles que la moyenne mobile, InfluxDB ne le prend actuellement pas en charge.

Il y a beaucoup de demandes de moyenne mobile dans influxdb sur le Web. Vous pouvez laisser votre "+1" et suivre les progrès de ce ticket https://github.com/influxdb/influxdb/issues/77

La solution possible (mais pas si facile) consiste à créer un script personnalisé (cron, démon, peu importe) qui précalculera MA et le sauvegarde dans une série influxdb distincte.

10
Sergey Martynov

Grafana prend en charge l’ajout d’une movingAverage(). J'ai également eu du mal à le trouver dans la documentation, mais vous pouvez (un peu hilarant) voir son utilisation sur la page d'introduction de feature :

screenshot showing movingAverage() call

Comme d’habitude, cliquez sur le titre du graphique, modifiez-le, ajoutez la métrique movingAverage () comme décrit dans la documentation graphite :

movingAverage(seriesList, windowSize)

Représente graphiquement la moyenne mobile d'une métrique (ou de plusieurs métriques) sur un nombre déterminé de points passés ou sur un intervalle de temps.

Prend une métrique ou une série de caractères génériques suivie par un nombre N de points de données ou une chaîne de caractères avec une durée telle que ‘1 heure’ ou ‘5min’ (voir from/jusqu’à dans le render_api_ pour des exemples de formats de temps). Graphiques la moyenne des points de données précédents pour chaque point du graphique. Tous les points de données précédents sont définis sur Aucun au début du graphique.

Exemple:

&target=movingAverage(Server.instance01.threads.busy,10)
&target=movingAverage(Server.instance*.threads.idle,'5min')
14
user559633

La méthode et la capacité pour cela dépendent de votre source de données.

Comme vous avez spécifié InfluxDB, votre requête devra envelopper une 'fonction d'agrégation' [telle que mean ($ field)] dans moving_average ($ aggregation_function, $ num_of_points) 'Fonction de transformation'.

Dans l'onglet "Métriques", vous trouverez les deux fonctions "Transformation" dans la partie "Sélectionner" du menu.

Définissez d'abord votre requête avec la 'fonction d'agrégation' (moyenne, min, max, etc.). Ainsi, vous pourrez vous assurer que les données ont l'apparence que vous attendez.

Après cela, cliquez simplement sur le bouton "+" à côté de "Fonction d'agrégation", et sous le menu "Transformations", sélectionnez "moving_average".

Le nombre entre parenthèses correspond au nombre de points pour lesquels vous souhaitez que la moyenne soit prise en compte.

Capture d'écran:

Screenshot

1
klc

Une autre option consiste à déclarer les données sous forme de mesures "chronologiques" et non comptées. Ceci est facile à faire, en particulier si Statsd se trouve dans votre pile. les points de données rapportés sont déjà intégrés.

1
odedfos

Je me suis retrouvé ici à essayer de faire une moyenne mobile dans Grafana avec une base de données PostgreSQL. Je vais donc ajouter un moyen de le faire avec une requête SQL:

SELECT
  date as time,
  AVG(daily_average_column) 
    OVER(ORDER BY date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) 
    AS value,
  '5 Day Moving Average' as metric
FROM daily_average_table
ORDER BY time ASC;

Ceci utilise une fonction "fenêtre" pour faire la moyenne des 4 dernières lignes (plus la ligne actuelle).

Je suis sûr qu'il existe des moyens de faire cela avec MySQL également.

1
thaddeusmt