2016-06-21 1 views
-1

J'ai travaillé sur une application à boîte unique qui utilise fortement les mesures codées pour l'instrumentation. À l'heure actuelle, nous passons au cloud et j'ai ci-dessous des questions sur la façon dont je peux surveiller les métriques lorsque l'application est distribuée. Y a-t-il un rapporteur métrique capable d'écrire des données métriques sur Cassandra?Métriques distribuées

  • Quand et comment l'agrégation se produit-il s'il y a des enregistrements par serveur dans la base de données?
  • Puis-je définir l'intervalle de temps pendant lequel les données métriques sont enregistrées dans la base de données?
  • Y a-t-il des frameworks intégrés disponibles pour cela?

Merci beaucoup et appréciez toute votre aide.

Répondre

0

Je réponds d'abord à vos questions, mais je pense que vous ne comprenez pas comment utiliser Metrics.

  1. Vous pouvez google assez facilement. Je n'en connais pas (je ne comprends pas non plus ce que tu en feras avec Cassandra?). Vous utiliseriez normalement quelque chose comme du graphite pour cela. En tout cas, une implémentation de journaliste est très simple et directe.

  2. Cette question n'a pas beaucoup de sens. Pourquoi regrouperiez-vous sur 2 serveurs différents - ils sont indépendants. Chacune de vos instances surveillées doit être autonome. L'agrégation se produit du côté réception (par exemple graphite)

  3. Vous pouvez - voir 1. Ecrire un rapporteur et le configurer en conséquence.

  4. Pas que je sache.

maintenant aux mesures en général:

Je pense que vous avez une mauvaise idée. Vous pouvez surveiller les serveurs X, ce n'est pas du tout un problème, mais vous ne devriez pas agréger cela du côté client (ou du côté de la base de données). Comment cela fonctionnerait-il? Redémarre zéro les clients, ce qui signifie essentiellement que vous devez suivre l'état de chacun de vos serveurs pour que votre agrégation fonctionne. Comment gérez-vous les pannes?

La façon dont vous devez surveiller vos serveurs avec des paramètres.

  1. créer un espace de noms

io.my.server {nom d'hôte} .my.metric

maintenant vous avoir X espaces de noms différents, mais ils ont tous un préfixe commun. Cela signifie que vous les avez regroupés.

  1. Envoyez-les à votre solution de surveillance préférée.

Il existe des tas là-bas. Je ne comprends pas pourquoi tu veux que ce soit cassandra - quel genre d'avantage en retire-tu? http://graphite.wikidot.com/ par exemple est une solution graphique.Vos applications peuvent automatiquement soumettre des données là-bas (graphite est livré avec un journaliste en Java que vous pouvez utiliser). Voir http://graphite.wikidot.com/screen-shots sur comment il ressemble.

Le point principal est que le graphite (et tous ou la plupart des fournisseurs) savent comment gérer vos espaces de noms. Par exemple. Regardez aussi Zabix, qui peut faire la même chose.

  1. agrégations

Maintenant, l'agrégation se produit du côté de la réception. Votre fournisseur sait comment faire cela et vous pouvez définir des règles.

Par exemple, vous pouvez wildcard des alertes comme:

io.my.server.{hostname}.my.metric.count > X 

graphite (je crois) soutient même les opérations, par exemple:

sum(io.my.server.{hostname}.my.metric.request) - which would sum up ALL your hosts's requests 

C'est là l'agrégation arrive. À ce stade, vos serveurs sont à nouveau autonomes (comme ils le devraient), et n'ont aucune dépendance les uns envers les autres ou une base de données de surveillance, etc. Ils rapportent simplement leurs propres métriques (ce qu'ils doivent faire) et vous - en tant que consommateur de ces métriques - sont responsables de faire les bonnes alertes/agrégations/formulaires à la réception.

Agrégation ce côté serveur impliquerait:

  • Découvrez tous les autres serveurs
  • surveiller leur état
  • recevoir/envoyer des mesures avant et en arrière
  • Synchronisez ce qu'ils rapportent, etc.

Cela ressemble à un cauchemar pour la maintenance :) J'espère que cela vous donne quelques idées/intérieur.

(Avertissement: Ni les mesures dev nur un dev graphite - c'est exactement comme je l'ai fait dans le passé/et l'approche que je l'utilise encore)

Edit:

votre commentaire à l'esprit, voici mes deux solutions revenions sur ce que vous voulez atteindre:

  1. DB

vous pouvez utiliser la base de données et stocker des dates par exemple pour démarrer le message et terminer le message. Ce n'est pas vraiment une mesure métrique, donc peut-être pas préféré. Selon votre question, vous pourriez écrire votre propre journaliste à ce sujet, mais cela deviendrait compliqué en ce qui concerne les upserts/mises à jour, etc. Je pense que l'option 2 est plus facile et a plus de potentiel.

  1. Journaux

C'est je pense que ce dont vous avez besoin. Vos serveurs se connectent indépendamment sur Démarrer/Arrêter/Pause, etc., quel que soit le type de rapport. Vous configurez ensuite logstash et collectez ces journaux. Logstash vous permet de suivre ces événements au fil du temps et de créer des mesures à ce sujet, voir:

https://www.elastic.co/guide/en/logstash/current/plugins-filters-metrics.html

Ou:

https://github.com/logstash-plugins/logstash-filter-elapsed

La première utilise des mesures réelles. Le second est un plugin différent qui mesure juste les temps entre les événements de démarrage/arrêt.

C'est l'option qui a le plus de potentiel car elle ne repose sur aucun format/magasin de données ou autre. Vous obtenez même Kibana pour tracer hors de la boîte si vous utilisez l'ensemble de la pile ELK.

Dites que vous vouliez mesurer vos messages. Vous pouvez simplement rechercher les journaux, il n'y a pas de changements d'application impliqués. La solution ne touche même pas votre application (par exemple, stocker vos données de reporting manuellement prend en charge les threads et le traitement dans vos applications, donc si vous avez besoin d'être compatible en temps réel, cela réduira vos performances globales) Solution. Plus tard, lorsque vous voulez mesurer d'autres métriques, vous pouvez facilement ajouter à votre configuration logstash et commencer à faire d'autres métriques. Je souhaite que cela aide

+0

Merci pour votre réponse. Je regarde l'instrumentation au niveau de l'application plutôt que les métriques au niveau du système. Disons que je veux capturer combien de temps le système a pris pour traiter un seul message entrant et s'il y a un groupe de serveurs, je ne serais pas en mesure de savoir quel serveur a traité quel message et combien de temps cela a pris. Dans l'ensemble, pour chaque client, je devrais pouvoir dire que le système a traité tant de messages par seconde. Désolé si ma question initiale n'a pas été la même. Merci de votre aide. – Neoster

+0

@Neoster J'ai mis à jour ma réponse avec quelques informations supplémentaires – pandaadb