[JAVA] [Apache Camel] Sortie facile du débit dans un journal

Enregistrez facilement le débit

Apprenez à mesurer facilement le débit racine d'Apache Camel. En utilisant le composant Log dans Camel, le nombre de données traitées par l'itinéraire dans le délai spécifié peut être envoyé au journal.

Pour sortir le débit, spécifiez le composant de journal pour le point de terminaison TO comme suit.

to("log:example.camelbegginer.throughput.PutThroughput?groupInterval=1000")

Le "example.camelbegginer.throughput.PutThroughput" dans cet exemple est appelé la catégorie de journalisation et peut recevoir n'importe quel nom. Puisque la catégorie de journalisation est sortie dans le journal, il est pratique de séparer le nom de chaque processus à mesurer. L'option groupInterval est définie pour afficher le débit toutes les 1 seconde (1000 millisecondes).

Exemple de sortie de débit

Voici un exemple de sortie de débit.

ThroughputLogger, example.camelbegginer.throughput.PutThroughput, Received: 100 new messages, with total 300 so far. Last group took: 1001 millis which is: 99.9 messages per second. average: 103.199

Tout d'abord, «ThroughputLogger, example.camelbegginer.throughput.PutThroughput» renvoie le nom de la catégorie de journalisation spécifiée. "Reçu: 100 nouveaux messages, avec un total de 300 à ce jour. Dernier groupe pris: 1001 millis" indique que 100 nouveaux messages ont été traités en 1001 millisecondes, pour un total de 300 traités. J'ai défini le débit pour qu'il soit émis toutes les 1000 millisecondes, mais il peut s'écarter de 1 milliseconde. "99,9 messages par seconde. Moyenne: 103.199" indique que 99,9 messages peuvent être traités en 1 seconde et 103.199 messages peuvent être traités en moyenne. De cette manière, le composant LOG facilite la sortie du débit.

Liste des options de sortie de débit

Les options à spécifier pour la sortie de débit sont indiquées dans le tableau ci-dessous. En plus du tableau ci-dessous, le composant Journal propose des options telles que le niveau de journalisation, mais elles sont omises car elles ne sont pas directement liées au débit.

Éléments facultatifs Valeur par défaut La description
groupInterval null Spécifie l'intervalle (en millisecondes) auquel le débit est émis."1000"Si est spécifié, le débit par seconde est sorti dans le journal. groupActiveOnly et groupDelay ne sont utilisés que lorsque cette option est spécifiée.
groupActiveOnly true "true"S'il est défini sur, le journal sera généré uniquement si les données sont valides (plus de 0) pendant l'intervalle de sortie.
groupDelay 0 Premier temps de retard(milliseconde)Est spécifié.
groupSize null Si vous traitez le nombre de cas spécifié, le débit sera sorti dans le journal."100"Si est spécifié, un journal sera généré chaque fois que 100 éléments sont traités. Si groupSize est spécifié, la valeur spécifiée pour groupInterval sera invalide.

Exemple d'implémentation

Ici, je voudrais faire circuler 1000 données et voir comment le débit est généré.

Tout d'abord, préparez 1000 données. Dans le code ci-dessous, la classe SimpleDataSet est utilisée et 1000 données sont spécifiées par la méthode setSize. La classe SimpleDataSet est un composant de test qui vous permet de créer facilement une grande quantité de données à utiliser dans les tests de charge système.

            SimpleDataSet dataSet = new SimpleDataSet();
            dataSet.setSize(1000);

Ensuite, enregistrez une instance de la classe SimpleDataSet dans le registre et créez une instance de CamelContext. J'ai ajouté un SimpleDataSet avec les 1000 données générées plus tôt dans le registre.

            SimpleRegistry registry = new SimpleRegistry();
            registry.put("testDataSet", dataSet);

            CamelContext context = new DefaultCamelContext(registry);

Enfin, ajoutez une route au CamelContext pour traiter 1000 données.

	static RouteBuilder createRouteBuilder() {
        return new RouteBuilder() {
			public void configure() throws Exception {
				from("dataset:testDataSet?produceDelay=-1")
					.split().simple("${header.CamelDataSetIndex}")
						.throttle(100)
						.to("log:example.camelbegginer.throughput.PutThroughput?level=INFO&groupInterval=1000");
			}
        };
    }

Dans "from (" dataset: testDataSet? ProduceDelay = -1 ")", les 1 000 données générées précédemment sont spécifiées comme point de terminaison from. Dans "split (). Simple (" $ {header.CamelDataSetIndex} "). Throttle (100)", il est spécifié que 1000 messages sont divisés par le CamelDataSetIndex de l'en-tête et 100 messages sont envoyés par seconde. Je vais. CamelDataSetIndex est automatiquement numéroté à partir de 1 par SimpleDataSet.

L'exemple de sortie de la sortie du journal par log4j2 après l'exécution de l'application est le suivant. Vous pouvez voir que le journal est sorti toutes les secondes et le débit à ce moment-là est affiché.

[2019-01-13 08:27:46.429], [INFO ], e.c.t.PutThroughput, Camel (camel-1) thread #1 - ThroughputLogger, example.camelbegginer.throughput.PutThroughput, Received: 100 new messages, with total 100 so far. Last group took: 906 millis which is: 110.375 messages per second. average: 110.375
[2019-01-13 08:27:47.422], [INFO ], e.c.t.PutThroughput, Camel (camel-1) thread #1 - ThroughputLogger, example.camelbegginer.throughput.PutThroughput, Received: 100 new messages, with total 200 so far. Last group took: 1000 millis which is: 100 messages per second. average: 104.932
[2019-01-13 08:27:48.423], [INFO ], e.c.t.PutThroughput, Camel (camel-1) thread #1 - ThroughputLogger, example.camelbegginer.throughput.PutThroughput, Received: 100 new messages, with total 300 so far. Last group took: 1001 millis which is: 99.9 messages per second. average: 103.199
[2019-01-13 08:27:49.421], [INFO ], e.c.t.PutThroughput, Camel (camel-1) thread #1 - ThroughputLogger, example.camelbegginer.throughput.PutThroughput, Received: 100 new messages, with total 400 so far. Last group took: 998 millis which is: 100.2 messages per second. average: 102.433
[2019-01-13 08:27:50.422], [INFO ], e.c.t.PutThroughput, Camel (camel-1) thread #1 - ThroughputLogger, example.camelbegginer.throughput.PutThroughput, Received: 100 new messages, with total 500 so far. Last group took: 1001 millis which is: 99.9 messages per second. average: 101.916
[2019-01-13 08:27:51.423], [INFO ], e.c.t.PutThroughput, Camel (camel-1) thread #1 - ThroughputLogger, example.camelbegginer.throughput.PutThroughput, Received: 100 new messages, with total 600 so far. Last group took: 1001 millis which is: 99.9 messages per second. average: 101.574
[2019-01-13 08:27:52.421], [INFO ], e.c.t.PutThroughput, Camel (camel-1) thread #1 - ThroughputLogger, example.camelbegginer.throughput.PutThroughput, Received: 100 new messages, with total 700 so far. Last group took: 998 millis which is: 100.2 messages per second. average: 101.376

L'exemple de programme entier cette fois-ci est le suivant.

package example.camelbegginer.throughput;

import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.dataset.SimpleDataSet;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.impl.SimpleRegistry;

public class PutThroughput {

	public static void main(String[] args) {
		try {
			SimpleDataSet dataSet = new SimpleDataSet();
			dataSet.setSize(1000);

			SimpleRegistry registry = new SimpleRegistry();
			registry.put("testDataSet", dataSet);

			CamelContext context = new DefaultCamelContext(registry);
			context.addRoutes(createRouteBuilder());

			context.start();
			Thread.sleep(20000);
			context.stop();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	static RouteBuilder createRouteBuilder() {
        return new RouteBuilder() {
			public void configure() throws Exception {
				from("dataset:testDataSet?produceDelay=-1")
					.split().simple("${header.CamelDataSetIndex}")
						.throttle(100)
						.to("log:example.camelbegginer.throughput.PutThroughput?level=INFO&groupInterval=1000");
			}
        };
    }
}

finalement

Avec Apache Camel, nous avons pu facilement enregistrer le débit comme décrit ci-dessus. Je pense que cette sortie de débit peut être utilisée dans les cas suivants.

--Vérifiez le débit à titre d'essai lors d'un test unitaire. Vous pouvez vérifier que le traitement parallèle est possible.

Étant donné que la charge sur la sortie de débit est faible, il s'agit d'une fonction qui peut être pleinement utilisée même dans un environnement de production.

référence

Recommended Posts

[Apache Camel] Sortie facile du débit dans un journal
Sortie de l'en-tête HTTP de google-http-client à journaliser
Je souhaite modifier le paramètre de sortie du journal de UtilLoggingJdbcLogger
Enregistrer la sortie dans un fichier en Java
Sortie du journal de la requête / réponse WebServiceTemplate
Comment générer des journaux Jetty dans n'importe quel répertoire
Sortie du livre "Introduction à Java"
Un moyen simple de créer une implémentation de java.util.stream.Stream
Sortie de la façon d'utiliser la méthode slice
Gestion des transactions du framework intégré "Apache Camel"
Format de la sortie du journal par Tomcat lui-même dans Tomcat 8
Convertit le tableau d'erreurs.full_messages en caractères et sortie
Journal de sortie vers un fichier externe avec slf4j + logback avec Maven
Comment télécharger une ancienne version d'Apache Tomcat
Je souhaite simplifier la sortie du journal sur Android