Le graphite affiche «Aucun» pour tous les points de données même si je lui envoie des données

8

J'ai installé Graphite via Puppet ( https://forge.puppetlabs.com/dwerder/graphite ) avec nginx et PostgresSQL. Lorsque je lui envoie des données manuellement, il crée la métrique mais tous ses points de données sont "Aucun" (alias null). Cela se produit également si j'exécute le example-client.py fourni avec Graphite.

echo "jakub.test 42 $(date +%s)" | nc 0.0.0.0 2003 # Carbon listens at 2003
# A minute or so later:
$ whisper-fetch.py --pretty /opt/graphite/storage/whisper/jakub/test.wsp | head -n1
Sun May  4 12:19:00 2014    None
$ whisper-fetch.py --pretty /opt/graphite/storage/whisper/jakub/test.wsp | tail -n1
Mon May  5 12:09:00 2014    None
$ whisper-fetch.py --pretty /opt/graphite/storage/whisper/jakub/test.wsp | grep -v None | wc -l
0

Et:

$ python /opt/graphite/examples/example-client.py 
# Wait until it sends two batches of data ...
$ whisper-fetch.py /opt/graphite/storage/whisper/system/loadavg_15min.wsp | grep -v None | wc -l
0

Il s'agit, selon ngrep, des données qui arrivent sur le port [d'une tentative ultérieure] (ligne 3):

####
T 127.0.0.1:34696 -> 127.0.0.1:2003 [AP]
  jakub.test  45 1399362193. 
####^Cexit
23 received, 0 dropped

C'est la partie pertinente de /opt/graphite/conf/storage-schemas.conf:

[default]
pattern = .*
retentions = 1s:30m,1m:1d,5m:2y

Une idée de ce qui ne va pas? Les propres mesures et données de Carbon sont affichées dans l'interface utilisateur. Je vous remercie!

Environnement: Ubuntu 13.10 Saucy, graphite 0.9.12 (via pip).

PS: J'ai écrit sur mes tentatives de dépannage ici - Le graphite affiche des mesures mais pas de données - Dépannage

MISE À JOUR :

  1. Les points de données dans les fichiers chuchotés ne sont enregistrés que toutes les 1 min, même si la stratégie de rétention spécifie une précision plus élevée telle que «1s» ou «10s».
  2. Solution de contournement pour les données ignorées: utilisez un schéma d'agrégation avec xFilesFactor = 0.1(au lieu de 0,5) ou définissez la précision la plus faible sur 1 m au lieu de <nombre entre 1 à 49> s. - voir les commentaires sous la réponse acceptée ou la question Graphite Answers. Selon les documents : " xFilesFactordevrait être un nombre à virgule flottante compris entre 0 et 1, et spécifie quelle fraction des emplacements du niveau de rétention précédent doit avoir des valeurs non nulles pour agréger à une valeur non nulle. La valeur par défaut est 0,5. " Il semble donc que sans tenir compte de la précision spécifiée de 1, les données sont agrégées à 1 minute et finissent par être Aucune car moins de 50% des valeurs de la période minute sont non nulles.

SOLUTION

@Jlawrie m'a donc conduit à la solution. Il s'avère que les données sont réellement là mais sont agrégées à rien, la raison est double:

  1. L'interface utilisateur et l'extraction par chuchotement affichent des données agrégées avec la plus haute précision qui s'étend sur toute la période de requête, par défaut à 24h. C'est-à-dire que tout ce qui a une rétention <1d ne s'affichera jamais dans l'interface utilisateur ou ne sera récupéré que si vous sélectionnez une période plus courte. Étant donné que ma période de rétention pendant 1 s était de 30 minutes, je devrais sélectionner une période de <= 30 dernières minutes pour voir réellement les données brutes avec la plus haute précision collectées.
  2. Lors de l'agrégation de données (de 1 s à 1 min dans mon cas), Graphite requiert par défaut que 50% (xFilesFactor = 0,5) des points de données de la période ont une valeur. Sinon, il ignorera les valeurs existantes et les agrégera à Aucun. Donc, dans mon cas, j'aurais besoin d'envoyer des données au moins 30 fois en une minute (30 correspond à 50% des 60 = 1 min) pour qu'elles apparaissent dans la valeur agrégée de 1 min. Mais mon application n'envoie des données que toutes les 10 secondes, je n'ai donc que 6 des 60 valeurs possibles.

=> la solution consiste à changer la première précision de 1s à 10s et n'oubliez pas de sélectionner une période plus courte lorsque je veux voir les données brutes (ou étendre leur rétention à 24h pour les afficher par défaut).

Jakub Holý
la source
Le graphite Answers question Dataset rempli de null? est intéressant dans ce contexte (mentionne l'ajout par défaut de null toutes les 60s, dernières 24h uniquement) et b / c sa recommandation de ngrep pour le dépannage.
Jakub Holý
J'ai également demandé de l'aide sur Graphite Answers - answers.launchpad.net/graphite/+question/248242
Jakub Holý
Avez-vous vérifié les journaux? S'il y a un problème avec la métrique reçue (pas \ n ou utilisez \ r \ n à la place), vous devriez voir quelque chose dans console.log ou create.log. Ces journaux sont stockés dans / opt / graphite / storage / log / carbon-cache / carbon-cache-a / si vous avez utilisé le chemin d'installation par défaut.
mattsn0w
Oui, j'ai vérifié les journaux. Il n'y avait rien d'intéressant. Le journal de la console contenait essentiellement "[..] ServerFactory à partir de 7002 [..] Démarrage de la fabrique <instance twisted.internet.protocol.ServerFactory à 0x1bc4248>" et contenait des enregistrements de la création des mesures attendues, mais aucune mention des données - f. ex. (pour une autre mesure sans données) "[..] création d'un fichier de base de données /opt/graphite/storage/whisper/ring/handling-time/POST/15MinuteRate.wsp (archive = [(1, 1800), (60, 1440 ), (300, 210240)] xff = 0,5 agg = moyenne) "
Jakub Holý
@ JakubHolý Pourriez-vous mettre à jour la réponse de jlawrie ou publier une autre réponse car la question contient une réponse maintenant
030

Réponses:

8

J'ai rencontré le même problème en utilisant ce même module marionnette. Je ne sais pas exactement pourquoi, mais le changement de la politique de rétention par défaut semble le corriger, par exemple

class { 'graphite':
  gr_storage_schemas => [
    {
      name       => 'carbon',
      pattern    => '^carbon\.',
      retentions => '1m:90d'
    },
    {
      name       => 'default',
      pattern    => '.*',
      retentions => '1m:14d'
    }
  ],
}
jlawrie
la source
Merci beaucoup! Ce changement mystérieux a vraiment aidé. Il est intéressant de noter que le fait de changer la rétention de "1s: 30m, 1m: 1d, 5m: 2y" à "1m: 14d" le "corrige". Je vais essayer de jouer plus avec. Peut-être y a-t-il un problème avec la granularité 1s?
Jakub Holý
Il semble en effet être un problème avec la période s - alors que les '1m:1d,5m:2ytravaux (données enregistrées), 10s:30m,1m:1d,5m:2ynon. En fait, à partir du fichier .wsp, il semble que la granularité <1m soit ignorée depuis les horodatages pour les 10s: ... la configuration est toujours à des intervalles de 1 min - "08:17:00, 08:18:00, etc."
Jakub Holý
OK, donc le problème est lié à la politique d'agrégation et xFilesFactor, (par défaut) qui s'applique ici étant la moyenne et xFilesFactor=0.5(voir /opt/graphite/conf/storage-aggregation.conf). Lorsque je change pour sumet 0.1en changeant le nom, les données sont stockées (bien que le pointage soit toujours à 1m de fréquence):echo -e "jakub.test.10s30m+1m1d+5m2y.count 42 $(date +%s)" | nc 0.0.0.0 2003
Jakub Holý
J'ai joué avec diff. agrégat. schémas, les données sont enregistrées (à 1m d'intervalle) lorsque je mets xFilesFactor = 0.1, l'agg. la méthode n'a pas d'importance (au moins tout le travail moyen, dernier, somme).
Jakub Holý
Selon cela , les schémas d'agrégation n'entrent en jeu qu'avec plusieurs politiques de rétention. Si je n'ai qu'une seule politique de rétention, même à une résolution de 10 secondes (ce qui correspond à la fréquence à laquelle j'envoie des données), c'est la collecte de chaque point de données individuel. Avec plusieurs politiques de rétention, il choisit celle basée sur la plage de temps de la requête, qui avec whisper-fetch.py ​​est par défaut le dernier jour, c'est pourquoi je pense que vous ne voyez que les points de données toutes les 1 minute. Je ne sais toujours pas pourquoi ils afficheraient None, au lieu de la valeur agrégée.
jlawrie
1

Il existe de nombreuses façons dont Graphite perdra des données, c'est pourquoi j'essaie vraiment d'éviter de l'utiliser. Permettez-moi de commencer par un simple: essayez de connecter votre application, attendez une seconde (littéralement une seconde), puis affichez les données horodatées. J'ai trouvé dans de nombreuses circonstances que cela résoudrait ce problème exact. Une autre chose que vous devriez essayer est de soumettre des données à une fréquence bien supérieure à la fréquence à laquelle le graphite enregistre les données. J'y reviendrai un peu plus. Une autre erreur fréquente consiste à utiliser l'utilitaire whisper-resize.py, qui ne fonctionnait vraiment pas pour moi. Si vos données ne sont pas encore importantes, supprimez simplement les fichiers chuchotés et laissez-les être créés avec les nouveaux paramètres de rétention.

Les fichiers de stockage de Graphite, les fichiers chuchotés, au lieu de stocker les données sous forme de point avec une valeur et une heure (comme vous avez fourni le programme) les stockent réellement comme ayant une série d'emplacements dans lesquels la valeur est stockée. Le programme essaie ensuite de déterminer quel créneau correspond à une période de temps en utilisant le fichier de données de rétention. S'il obtient des données qui ne rentrent pas exactement dans un slot, je pensece qui se passe, c'est qu'il utilise une moyenne, min ou max selon un autre fichier dans le même répertoire que le fichier de rétention. J'ai trouvé que la meilleure façon de ne pas tout gâcher était de soumettre des données à une fréquence beaucoup plus élevée que la fréquence à laquelle le graphite stockait les données. Honnêtement, cela devient super compliqué - non seulement il y a des périodes de rétention pour le graphite et des algorithmes de moyenne qui remplissent les points (je pense), mais ces valeurs sont également appliquées aux fichiers de chuchotement. Des choses très étranges se produiront lorsque celles-ci ne correspondent pas, donc jusqu'à ce que votre configuration fonctionne, je suggère de supprimer vos fichiers chuchotés à plusieurs reprises et de laisser le graphite les recréer.

Ce programme m'a vraiment frappé comme agissant assez bogué, donc si vous rencontrez quelque chose comme ça, ne supposez pas que c'est de votre faute.

Certains nerd Linux
la source
Merci, je suppose que je devrais en savoir plus sur le fonctionnement de la récupération et de l'agrégation des données, c'est peut-être la cause du problème. Cependant, je pense que " soumettre des données à une fréquence qui était beaucoup plus élevée que la fréquence à laquelle le graphite stockait les données " est une solution sous-optimale car seul le dernier point de données reçu dans chaque période de graphite est enregistré, d'autres ignorés - c'est pourquoi f.ex . statsD flush period must = Période graphite .
Jakub Holý
1
BTW, les données de "perte" de graphite / carbone pourraient être liées à des paramètres de carbone tels que MAX_UPDATES_PER_SECOND = 500, MAX_CREATES_PER_MINUTE = 50 (je suppose que les points de données / métriques au-dessus de la limite sont simplement supprimés).
Jakub Holý
Il semble que je me sois trompé, la documentation - si je l'interprète correctement - dit que les paramètres ci-dessus limitent l'accès au disque mais les données / métriques sont toujours conservées en mémoire (bien que j'aimerais vraiment vérifier cela en premier).
Jakub Holý
Quelques-uns d'entre eux pourraient certainement expliquer certains des problèmes que j'ai rencontrés avec cette application.
Certains Linux Nerd