[JAVA] [Apache Camel] Einfacher Durchsatz in einem Protokoll ausgeben

Protokollieren Sie einfach den Durchsatz

Erfahren Sie, wie Sie den Root-Durchsatz von Apache Camel einfach messen können. Mithilfe der Protokollkomponente in Camel kann die Anzahl der von der Route innerhalb der angegebenen Zeit verarbeiteten Daten in das Protokoll ausgegeben werden.

Geben Sie die Protokollkomponente für den TO-Endpunkt wie folgt an, um den Durchsatz auszugeben.

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

Der "example.camelbegginer.throughput.PutThroughput" in diesem Beispiel wird als Protokollierungskategorie bezeichnet und kann mit einem beliebigen Namen versehen werden. Da die Protokollierungskategorie in das Protokoll ausgegeben wird, ist es zweckmäßig, den Namen für jeden zu messenden Prozess zu trennen. Die Option groupInterval gibt den Durchsatz alle 1 Sekunde (1000 Millisekunden) aus.

Ausgabebeispiel für Durchsatz

Das Folgende ist ein Beispiel für die Durchsatzausgabe.

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

Zunächst gibt "ThroughputLogger, example.camelbegginer.throughput.PutThroughput" den Namen der angegebenen Protokollierungskategorie aus. "Eingegangen: 100 neue Nachrichten, insgesamt 300 bisher. Letzte Gruppe: 1001 Millis" bedeutet, dass 100 neue Nachrichten in 1001 Millisekunden verarbeitet wurden, was insgesamt 300 verarbeitet. Ich habe den Durchsatz so eingestellt, dass er alle 1000 Millisekunden ausgegeben wird, aber er kann um 1 Millisekunde abweichen. "99,9 Nachrichten pro Sekunde. Durchschnitt: 103,199" zeigt an, dass 99,9 Nachrichten in 1 Sekunde verarbeitet werden können und 103,199 Nachrichten im Durchschnitt verarbeitet werden können. Auf diese Weise erleichtert die LOG-Komponente die Ausgabe des Durchsatzes.

Liste der Durchsatzausgabeoptionen

Die Optionen für die Durchsatzausgabe sind in der folgenden Tabelle aufgeführt. Zusätzlich zu der folgenden Tabelle verfügt die Protokollkomponente über Optionen wie die Protokollstufe, die jedoch weggelassen werden, da sie nicht direkt mit dem Durchsatz zusammenhängen.

Extras Standardwert Erläuterung
groupInterval null Gibt das Intervall (Millisekunden) an, in dem der Durchsatz ausgegeben wird."1000"Wenn angegeben, wird der Durchsatz pro Sekunde in das Protokoll ausgegeben. groupActiveOnly und groupDelay werden nur verwendet, wenn diese Option angegeben ist.
groupActiveOnly true "true"Wenn diese Option aktiviert ist, wird das Protokoll nur ausgegeben, wenn die Daten während des Ausgabeintervalls gültig sind (mehr als 0).
groupDelay 0 Erste Verzögerungszeit(Millisekunde)Angegeben.
groupSize null Wenn Sie die angegebene Anzahl von Fällen verarbeiten, wird der Durchsatz in das Protokoll ausgegeben."100"Wenn angegeben, wird jedes Mal, wenn 100 Elemente verarbeitet werden, ein Protokoll ausgegeben. Wenn groupSize angegeben ist, ist der für groupInterval angegebene Wert ungültig.

Implementierungsbeispiel

Hier möchte ich tatsächlich 1000 Daten fließen lassen und sehen, wie der Durchsatz ausgegeben wird.

Bereiten Sie zunächst 1000 Daten vor. Im folgenden Code wird die SimpleDataSet-Klasse verwendet und 1000 Daten werden von der setSize-Methode angegeben. Die SimpleDataSet-Klasse ist eine Testkomponente, mit der Sie auf einfache Weise eine große Datenmenge zur Verwendung in Systemlasttests erstellen können.

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

Registrieren Sie als Nächstes eine Instanz der SimpleDataSet-Klasse in der Registrierung und erstellen Sie eine Instanz von CamelContext. Ich habe ein SimpleDataSet mit den 1000 zuvor generierten Daten zur Registrierung hinzugefügt.

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

            CamelContext context = new DefaultCamelContext(registry);

Fügen Sie schließlich eine Route zum CamelContext hinzu, um 1000 Daten zu verarbeiten.

	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");
			}
        };
    }

In "from (" Dataset: testDataSet? ProduceDelay = -1 ")" werden die 1000 zuvor generierten Daten als from-Endpunkt angegeben. In "split (). Simple (" $ {header.CamelDataSetIndex} "). Throttle (100)" wird angegeben, dass 1000 Nachrichten durch den CamelDataSetIndex des Headers aufgeteilt werden und 100 Nachrichten pro Sekunde gesendet werden. Ich werde. CamelDataSetIndex wird von SimpleDataSet automatisch von 1 nummeriert.

Das Ausgabebeispiel für die Protokollausgabe von log4j2 nach Ausführung der Anwendung lautet wie folgt. Sie können sehen, dass das Protokoll jede Sekunde ausgegeben wird und der Durchsatz zu diesem Zeitpunkt angezeigt wird.

[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

Das gesamte Beispielprogramm ist diesmal wie folgt.

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");
			}
        };
    }
}

Schließlich

Mit Apache Camel konnten wir den Durchsatz wie oben beschrieben einfach protokollieren. Ich denke, dass diese Durchsatzausgabe in den folgenden Fällen verwendet werden kann.

--Überprüfen Sie den Durchsatz probeweise während eines Unit-Tests. Sie können überprüfen, ob eine Parallelverarbeitung möglich ist.

Da die Durchsatzleistung gering ist, kann diese Funktion auch in einer Produktionsumgebung voll genutzt werden.

Referenz

Recommended Posts

[Apache Camel] Einfacher Durchsatz in einem Protokoll ausgeben
Geben Sie den HTTP-Header des zu protokollierenden Google-http-Clients aus
Ich möchte die Protokollausgabeeinstellung von UtilLoggingJdbcLogger ändern
Protokollausgabe in Datei in Java
Protokollausgabe der WebServiceTemplate-Anforderung / Antwort
So geben Sie Jetty-Protokolle in ein beliebiges Verzeichnis aus
Ausgabe des Buches "Einführung in Java"
Einfache Möglichkeit, eine Implementierung von java.util.stream.Stream zu erstellen
Ausgabe der Verwendung der Slice-Methode
Transaktionsmanagement des integrierten Frameworks "Apache Camel"
Format der Protokollausgabe von Tomcat selbst in Tomcat 8
Konvertieren Sie das Array von error.full_messages in Zeichen und geben Sie es aus
Protokoll mit slf4j + Logback mit Maven in externe Datei ausgeben
So laden Sie eine ältere Version von Apache Tomcat herunter
Ich möchte die Protokollausgabe unter Android vereinfachen