From 808c0a7ee0dbd8744feb1a98d2f4c5f1a3d4bbb8 Mon Sep 17 00:00:00 2001 From: Maarten Date: Fri, 23 Jul 2021 09:02:08 +0200 Subject: [PATCH] added dcos --- README.md | 2 + docs/streams-diagram.graphml | 970 ++++++++++++++++++ docs/streams-diagram.pdf | Bin 0 -> 61295 bytes docs/streams-diagram.svg | 305 ++++++ .../entrada/support/PerformanceTest.java | 108 -- 5 files changed, 1277 insertions(+), 108 deletions(-) create mode 100644 docs/streams-diagram.graphml create mode 100644 docs/streams-diagram.pdf create mode 100644 docs/streams-diagram.svg diff --git a/README.md b/README.md index 2942db9..dbfbc8b 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,8 @@ ENTRADA handles the required workflow actions such as: For more information see the [ENTRADA website](https://entrada.sidnlabs.nl/). +ENTRADA uses [Akka Streams](https://doc.akka.io/docs/akka/current/stream/index.html) see image below for an overview of the Akka Streams graph created by ENTRADA. [ENTRADA Akka Streams flow](https://raw.githubusercontent.com/SIDN/entrada/master/docs/entrada-streams-diagram.svg) + ## How to use ENTRADA is deployed using [Docker Compose](https://docs.docker.com/compose/), download one of the example [Docker Compose scripts](https://github.com/SIDN/entrada/tree/master/docker-compose) and save it as `docker-compose.yml` and then edit the script to configure the environment variables to fit your requirements. diff --git a/docs/streams-diagram.graphml b/docs/streams-diagram.graphml new file mode 100644 index 0000000..09d9753 --- /dev/null +++ b/docs/streams-diagram.graphml @@ -0,0 +1,970 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Partition + + + + + + + + + + + + + + + + + + + Merge + + + + + + + + + + + + + + + + + + + Partition + + + + + + + + + + + + + + + + + + + MapAsync + + + + + + + + + + + + + + + + + + + Join + + + + + + + + + + + + + + + + + + + Unzip + + + + + + + + + + + + + + + + + + + Balance + + + + + + + + + + + + + + + + + + + MapAsync + + + + + + + + + + + + + + + + + + + Unzip + + + + + + + + + + + + + + + + + + + Merge + + + + + + + + + + + + + + + + + + + Balance + + + + + + + + + + + + + + Async + + + + + + + + + + Folder 1 + + + + + + + + + + + + + + + + + + + + + + + + RowBuilder + + + + + + + + + + + + + + + + + + + RowBuilder + + + + + + + + + + + + + + + + + + + RowBuilder + + + + + + + + + + + + + + + + Async + + + + + + + + + + Folder 2 + + + + + + + + + + + + + + + + + + + + + + + + RowBuilder + + + + + + + + + + + + + + + + + + + RowBuilder + + + + + + + + + + + + + + + + + + + RowBuilder + + + + + + + + + + + + + + + + Async + + + + + + + + + + Folder 3 + + + + + + + + + + + + + + + + + + + + + + + + Decoder + + + + + + + + + + + + + + + + + + + Decoder + + + + + + + + + + + + + + + + + + + Decoder + + + + + + + + + + + + + + + + Async + + + + + + + + + + Folder 4 + + + + + + + + + + + + + + + + + + + + + + + + Parquet Sink + + + + + + + + + + + + + + + + + + + Parquet Sink + + + + + + + + + + + + + + + + Async + + + + + + + + + + Folder 6 + + + + + + + + + + + + + + + + + + + + + + + + PCAP Source + + + + + + + + + + + + + + + + + + + + + Graphite Sink + + + + + + + + + + + + + + + + + + + Parquet Sink + + + + + + + + + + + + + + + + + + + Parquet Sink + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Packet + + + + + + + + + + + DNSPacket + + + + + + + + + + + ICMPPacket + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Row + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <Row, Metric> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Metric + + + + + + + + + + + Row + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <Row, Metric> + + + + + + + + + + + Metric + + + + + + + + + + + byte[] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/streams-diagram.pdf b/docs/streams-diagram.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3ed38226faed5dca0b9ac1274e5fcd5cd198f60c GIT binary patch literal 61295 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

3ydoI9<+lu`@@_ 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 literal 0 HcmV?d00001 diff --git a/docs/streams-diagram.svg b/docs/streams-diagram.svg new file mode 100644 index 0000000..7880227 --- /dev/null +++ b/docs/streams-diagram.svg @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + + + + + Partition + + + + + + + Merge + + + + + + + Partition + + + + + + + MapAsync + + + + + + + Join + + + + + + + Unzip + + + + + + + Balance + + + + + + + MapAsync + + + + + + + Unzip + + + + + + + Merge + + + + + + + Balance + + + Packet + + + ICMPPacket + + + DNSPacket + + + <Row, Metric> + + + Row + + + + + <Row, Metric> + + + Metric + + + Metric + + + Row + + + + + + + Async + + + + + + + + RowBuilder + + + + + + + RowBuilder + + + + + + + RowBuilder + + + + + + + + + + + + + Async + + + + + + + + RowBuilder + + + + + + + RowBuilder + + + + + + + RowBuilder + + + + + + + + + + + + + Async + + + + + + + + Decoder + + + + + + + Decoder + + + + + + + Decoder + + + + + + + + + + + + + + + + + + + Async + + + + + + + + Parquet Sink + + + + + + + Parquet Sink + + + + + + + + + + + Async + + + + + + + + PCAP Source + + + + + + + Graphite Sink + + + + + + + Parquet Sink + + + + + + + Parquet Sink + + + byte[] + + + + + + + + + diff --git a/src/test/java/nl/sidnlabs/entrada/support/PerformanceTest.java b/src/test/java/nl/sidnlabs/entrada/support/PerformanceTest.java index 78bab2d..95d4e66 100644 --- a/src/test/java/nl/sidnlabs/entrada/support/PerformanceTest.java +++ b/src/test/java/nl/sidnlabs/entrada/support/PerformanceTest.java @@ -1,16 +1,9 @@ package nl.sidnlabs.entrada.support; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.io.IOException; import java.net.InetAddress; -import java.util.Date; -import org.apache.avro.Schema; -import org.apache.avro.Schema.Parser; -import org.apache.avro.generic.GenericData; -import org.apache.avro.generic.GenericRecord; import org.jboss.netty.handler.ipfilter.CIDR; import org.junit.jupiter.api.Test; -import org.springframework.core.io.ClassPathResource; import com.google.common.net.InetAddresses; import com.googlecode.ipv6.IPv6Address; import com.googlecode.ipv6.IPv6AddressRange; @@ -18,9 +11,6 @@ import nl.sidnlabs.dnslib.util.InternetDomainName; import nl.sidnlabs.dnslib.util.NameUtil; import nl.sidnlabs.dnslib.util.RegisteredDomain; -import nl.sidnlabs.entrada.exception.ApplicationException; -import nl.sidnlabs.entrada.metric.HistoricalMetricManager; -import nl.sidnlabs.entrada.model.DnsMetricValues; public class PerformanceTest { @@ -83,103 +73,5 @@ public void testIpv6() throws Exception { } - @Test - public void testAutoboxing() throws Exception { - - long start = System.currentTimeMillis(); - Integer counter1 = 0; - for (int i = 0; i < 1000000; i++) { - counter1 = counter1 + (int) i; - } - long time1 = System.currentTimeMillis() - start; - System.out.println(time1); - - start = System.currentTimeMillis(); - int counter2 = 0; - for (int i = 0; i < 1000000; i++) { - counter2 = counter2 + i; - } - long time2 = System.currentTimeMillis() - start; - System.out.println(time2); - - - start = System.currentTimeMillis(); - Integer counter3 = 0; - for (int i = 0; i < 1000000; i++) { - counter3 = Integer.valueOf((int) i); - } - long time3 = System.currentTimeMillis() - start; - System.out.println(time3); - - Integer counter4 = 0; - for (int i = 0; i < 1000000; i++) { - counter3 = i; - } - long time4 = System.currentTimeMillis() - start; - System.out.println(time4); - - - assertTrue(time2 < time1); - } - - public class FieldMapping { - public int time = 0; - } - - @Test - public void testAvroRecordg() throws Exception { - Schema schema = schema("/avro/dns-query.avsc"); - GenericRecord record = new GenericData.Record(schema); - - FieldMapping fm = new FieldMapping(); - - - long start = System.currentTimeMillis(); - for (int i = 0; i < 20000000; i++) { - for (int i2 = 0; i2 < 20; i2++) { - record.put("time", Integer.valueOf(0)); - } - } - long time1 = System.currentTimeMillis() - start; - System.out.println(time1); - - start = System.currentTimeMillis(); - for (int i = 0; i < 20000000; i++) { - for (int i2 = 0; i2 < 20; i2++) { - record.put(fm.time, Integer.valueOf(0)); - } - } - long time2 = System.currentTimeMillis() - start; - System.out.println(time2); - } - - public Schema schema(String schema) { - try { - Parser parser = new Schema.Parser().setValidate(true); - return parser.parse(new ClassPathResource(schema, getClass()).getInputStream()); - } catch (IOException e) { - throw new ApplicationException("Cannot load schema from file: " + schema, e); - } - } - - @Test - public void testMetrics() throws Exception { - HistoricalMetricManager mm = new HistoricalMetricManager(null); - mm.setMetricsEnabled(true); - - long start = System.currentTimeMillis(); - DnsMetricValues dmv = new DnsMetricValues(new Date().getTime()); - dmv.dnsQuery = true; - dmv.dnsResponse = true; - for (int i = 0; i < 1000000; i++) { - if (i % 10000 == 0) { - dmv.time = dmv.time + 5; - } - mm.update(dmv); - } - long time1 = System.currentTimeMillis() - start; - System.out.println(time1); - } - }