diff --git a/spf4j/pom.xml b/spf4j/pom.xml
new file mode 100644
index 0000000000..43a8028dc4
--- /dev/null
+++ b/spf4j/pom.xml
@@ -0,0 +1,21 @@
+
+
+ 4.0.0
+ com.baeldung.spf4j
+ spf4j
+ spf4j
+ pom
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+
+
+ spf4j-core-app
+ spf4j-aspects-app
+
+
+
diff --git a/spf4j/spf4j-aspects-app/pom.xml b/spf4j/spf4j-aspects-app/pom.xml
new file mode 100644
index 0000000000..9fccec673a
--- /dev/null
+++ b/spf4j/spf4j-aspects-app/pom.xml
@@ -0,0 +1,83 @@
+
+ 4.0.0
+ spf4j-aspects-app
+ 0.0.1-SNAPSHOT
+ jar
+ spf4j-aspects-app
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+ ../../
+
+
+
+ org.spf4j
+ spf4j-aspects
+ ${spf4j.version}
+
+
+ org.spf4j
+ spf4j-ui
+ ${spf4j.version}
+
+
+ org.slf4j
+ slf4j-api
+ ${org.slf4j.version}
+
+
+
+ spf4j-aspects-app
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+ 1.8
+ 1.8
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+ 3.1.1
+
+
+ copy-dependencies
+ package
+
+ copy-dependencies
+
+
+
+ ${project.build.directory}/dependency-jars/
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+
+ com.baeldung.spf4j.aspects.App
+ true
+ dependency-jars/
+
+
+
+
+
+
+
+ UTF-8
+ 8.6.10
+ 1.7.21
+
+
diff --git a/spf4j/spf4j-aspects-app/src/main/java/com/baeldung/spf4j/aspects/App.java b/spf4j/spf4j-aspects-app/src/main/java/com/baeldung/spf4j/aspects/App.java
new file mode 100644
index 0000000000..6d74292c75
--- /dev/null
+++ b/spf4j/spf4j-aspects-app/src/main/java/com/baeldung/spf4j/aspects/App.java
@@ -0,0 +1,28 @@
+package com.baeldung.spf4j.aspects;
+
+import java.util.Random;
+
+import org.spf4j.annotations.PerformanceMonitor;
+
+public class App {
+
+ public static void main(String[] args) throws InterruptedException {
+ Spf4jConfig.initialize();
+ Random random = new Random();
+ for (int i = 0; i < 100; i++) {
+ long numberToCheck = random.nextInt(999_999_999 - 100_000_000 + 1) + 100_000_000;
+ isPrimeNumber(numberToCheck);
+ }
+ System.exit(0);
+ }
+
+ @PerformanceMonitor(warnThresholdMillis = 1, errorThresholdMillis = 100, recorderSource = Spf4jConfig.RecorderSourceForIsPrimeNumber.class)
+ public static boolean isPrimeNumber(long number) {
+ for (long i = 2; i <= number / 2; i++) {
+ if (number % i == 0)
+ return false;
+ }
+ return true;
+ }
+
+}
diff --git a/spf4j/spf4j-aspects-app/src/main/java/com/baeldung/spf4j/aspects/Spf4jConfig.java b/spf4j/spf4j-aspects-app/src/main/java/com/baeldung/spf4j/aspects/Spf4jConfig.java
new file mode 100644
index 0000000000..a12213f0cd
--- /dev/null
+++ b/spf4j/spf4j-aspects-app/src/main/java/com/baeldung/spf4j/aspects/Spf4jConfig.java
@@ -0,0 +1,37 @@
+package com.baeldung.spf4j.aspects;
+
+import java.io.File;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.spf4j.annotations.RecorderSourceInstance;
+import org.spf4j.perf.MeasurementRecorderSource;
+import org.spf4j.perf.impl.RecorderFactory;
+
+public class Spf4jConfig {
+ private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
+
+ public static void initialize() {
+ String tsDbFile = System.getProperty("user.dir") + File.separator + "spf4j-performance-monitoring.tsdb2";
+ String tsTextFile = System.getProperty("user.dir") + File.separator + "spf4j-performance-monitoring.txt";
+
+ LOGGER.info("\nTime Series DB (TSDB) : {}\nTime Series text file : {}", tsDbFile, tsTextFile);
+ System.setProperty("spf4j.perf.ms.config", "TSDB@" + tsDbFile + "," + "TSDB_TXT@" + tsTextFile);
+ }
+
+ public static final class RecorderSourceForIsPrimeNumber extends RecorderSourceInstance {
+ public static final MeasurementRecorderSource INSTANCE;
+
+ static {
+ Object forWhat = App.class + " isPrimeNumber";
+ String unitOfMeasurement = "ms";
+ int sampleTimeMillis = 1_000;
+ int factor = 10;
+ int lowerMagnitude = 0;
+ int higherMagnitude = 4;
+ int quantasPerMagnitude = 10;
+ INSTANCE = RecorderFactory.createScalableQuantizedRecorderSource(forWhat, unitOfMeasurement,
+ sampleTimeMillis, factor, lowerMagnitude, higherMagnitude, quantasPerMagnitude);
+ }
+ }
+}
diff --git a/spf4j/spf4j-aspects-app/src/main/resources/META-INF/aop.xml b/spf4j/spf4j-aspects-app/src/main/resources/META-INF/aop.xml
new file mode 100644
index 0000000000..1643f5fba9
--- /dev/null
+++ b/spf4j/spf4j-aspects-app/src/main/resources/META-INF/aop.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spf4j/spf4j-aspects-app/src/main/resources/logback.xml b/spf4j/spf4j-aspects-app/src/main/resources/logback.xml
new file mode 100644
index 0000000000..4677fac9bf
--- /dev/null
+++ b/spf4j/spf4j-aspects-app/src/main/resources/logback.xml
@@ -0,0 +1,11 @@
+
+
+
+ [%level] %msg%n
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spf4j/spf4j-core-app/pom.xml b/spf4j/spf4j-core-app/pom.xml
new file mode 100644
index 0000000000..ae346065ef
--- /dev/null
+++ b/spf4j/spf4j-core-app/pom.xml
@@ -0,0 +1,83 @@
+
+ 4.0.0
+ spf4j-core-app
+ 0.0.1-SNAPSHOT
+ jar
+ spf4j-core-app
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+ ../../
+
+
+
+ org.spf4j
+ spf4j-core
+ ${spf4j.version}
+
+
+ org.spf4j
+ spf4j-ui
+ ${spf4j.version}
+
+
+ org.slf4j
+ slf4j-api
+ ${org.slf4j.version}
+
+
+
+ spf4j-core-app
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+ 1.8
+ 1.8
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+ 3.1.1
+
+
+ copy-dependencies
+ package
+
+ copy-dependencies
+
+
+
+ ${project.build.directory}/dependency-jars/
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+
+ com.baeldung.spf4j.core.App
+ true
+ dependency-jars/
+
+
+
+
+
+
+
+ UTF-8
+ 8.6.10
+ 1.7.21
+
+
diff --git a/spf4j/spf4j-core-app/src/main/java/com/baeldung/spf4j/core/App.java b/spf4j/spf4j-core-app/src/main/java/com/baeldung/spf4j/core/App.java
new file mode 100644
index 0000000000..fa107d8e4f
--- /dev/null
+++ b/spf4j/spf4j-core-app/src/main/java/com/baeldung/spf4j/core/App.java
@@ -0,0 +1,34 @@
+package com.baeldung.spf4j.core;
+
+import java.util.Random;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.spf4j.perf.MeasurementRecorder;
+
+public class App {
+ private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
+
+ public static void main(String[] args) throws InterruptedException {
+ Spf4jConfig.initialize();
+ MeasurementRecorder measurementRecorder = Spf4jConfig.getMeasurementRecorder(App.class + " isPrimeNumber");
+ Random random = new Random();
+ for (int i = 0; i < 100; i++) {
+ long numberToCheck = random.nextInt(999_999_999 - 100_000_000 + 1) + 100_000_000;
+ long startTime = System.currentTimeMillis();
+ boolean isPrime = isPrimeNumber(numberToCheck);
+ measurementRecorder.record(System.currentTimeMillis() - startTime);
+ LOGGER.info("{}. {} is prime? {}", i + 1, numberToCheck, isPrime);
+ }
+ System.exit(0);
+ }
+
+ private static boolean isPrimeNumber(long number) {
+ for (long i = 2; i <= number / 2; i++) {
+ if (number % i == 0)
+ return false;
+ }
+ return true;
+ }
+
+}
diff --git a/spf4j/spf4j-core-app/src/main/java/com/baeldung/spf4j/core/Spf4jConfig.java b/spf4j/spf4j-core-app/src/main/java/com/baeldung/spf4j/core/Spf4jConfig.java
new file mode 100644
index 0000000000..0f806e1576
--- /dev/null
+++ b/spf4j/spf4j-core-app/src/main/java/com/baeldung/spf4j/core/Spf4jConfig.java
@@ -0,0 +1,31 @@
+package com.baeldung.spf4j.core;
+
+import java.io.File;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.spf4j.perf.MeasurementRecorder;
+import org.spf4j.perf.impl.RecorderFactory;
+
+public class Spf4jConfig {
+ private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
+
+ public static void initialize() {
+ String tsDbFile = System.getProperty("user.dir") + File.separator + "spf4j-performance-monitoring.tsdb2";
+ String tsTextFile = System.getProperty("user.dir") + File.separator + "spf4j-performance-monitoring.txt";
+
+ LOGGER.info("\nTime Series DB (TSDB) : {}\nTime Series text file : {}", tsDbFile, tsTextFile);
+ System.setProperty("spf4j.perf.ms.config", "TSDB@" + tsDbFile + "," + "TSDB_TXT@" + tsTextFile);
+ }
+
+ public static MeasurementRecorder getMeasurementRecorder(Object forWhat) {
+ String unitOfMeasurement = "ms";
+ int sampleTimeMillis = 1_000;
+ int factor = 10;
+ int lowerMagnitude = 0;
+ int higherMagnitude = 4;
+ int quantasPerMagnitude = 10;
+
+ return RecorderFactory.createScalableQuantizedRecorder(forWhat, unitOfMeasurement, sampleTimeMillis, factor, lowerMagnitude, higherMagnitude, quantasPerMagnitude);
+ }
+}
diff --git a/spf4j/spf4j-core-app/src/main/resources/logback.xml b/spf4j/spf4j-core-app/src/main/resources/logback.xml
new file mode 100644
index 0000000000..4677fac9bf
--- /dev/null
+++ b/spf4j/spf4j-core-app/src/main/resources/logback.xml
@@ -0,0 +1,11 @@
+
+
+
+ [%level] %msg%n
+
+
+
+
+
+
\ No newline at end of file