Merge pull request 'feature/performance-test' (#3) from feature/performance-test into develop

Reviewed-on: bvn13/OpenFeign-NormalizedLogger#3
This commit is contained in:
bvn13 2022-08-16 14:34:55 +03:00
commit 27b4ad81e1
11 changed files with 378 additions and 48 deletions

View File

@ -83,6 +83,15 @@ x-xss-protection: 1; mode=block
] ]
``` ```
# Performance
```
Benchmark Mode Cnt Score Error Units
NormalizedFeignLoggerBenchmarkTest.testFeignWithoutLogger thrpt 25 16281.625 ± 279.774 ops/s
NormalizedFeignLoggerBenchmarkTest.testNormalizedFeignLogger thrpt 25 6081.675 ± 229.912 ops/s
NormalizedFeignLoggerBenchmarkTest.testSlf4jFeignLogger thrpt 25 16593.059 ± 151.327 ops/s
```
# How to use # How to use
In order to use Normalized Logger into the application they must the following. In order to use Normalized Logger into the application they must the following.
@ -99,7 +108,7 @@ for Maven
<dependency> <dependency>
<groupId>me.bvn13.openfeign.logger</groupId> <groupId>me.bvn13.openfeign.logger</groupId>
<artifactId>feign-normalized-logger</artifactId> <artifactId>feign-normalized-logger</artifactId>
<version>0.1.4</version> <version>0.2.1</version>
</dependency> </dependency>
``` ```

91
logger-testing/pom.xml Normal file
View File

@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>me.bvn13.openfeign.logger</groupId>
<artifactId>feign-normalized-logger</artifactId>
<version>0.2.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>me.bvn13.openfeign.logger.test</groupId>
<artifactId>logger-testing</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>me.bvn13.openfeign.logger</groupId>
<artifactId>feign-normalized-logger</artifactId>
<version>0.2.1-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>${slf4j.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>${jetty-server.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>${jetty-server.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>${jmh.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
<version>${feign.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-gson</artifactId>
<version>${feign.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-slf4j</artifactId>
<version>${feign.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,107 @@
package me.bvn13.openfeign.logger.normalized;
import feign.Feign;
import feign.Logger;
import feign.gson.GsonDecoder;
import feign.slf4j.Slf4jLogger;
import org.junit.jupiter.api.Assertions;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.TearDown;
import org.openjdk.jmh.annotations.Warmup;
import static me.bvn13.openfeign.logger.normalized.TestJettyServer.PORT;
public class NormalizedFeignLoggerBenchmarkTest {
@State(Scope.Benchmark)
public static class BenchmarkStateWithoutLogging {
TestJettyServer jettyServer;
TestFeignClient feignClient;
@Setup
public void init() {
jettyServer = new TestJettyServer();
jettyServer.start();
feignClient = Feign.builder()
.decoder(new GsonDecoder())
.target(TestFeignClient.class, "http://localhost:" + PORT);
}
@TearDown
public void tearDown() {
jettyServer.stop();
}
}
@State(Scope.Benchmark)
public static class BenchmarkStateWithSlf4jLogging {
TestJettyServer jettyServer;
TestFeignClient feignClient;
@Setup
public void init() {
jettyServer = new TestJettyServer();
jettyServer.start();
feignClient = Feign.builder()
.logger(new Slf4jLogger())
.logLevel(Logger.Level.FULL)
.decoder(new GsonDecoder())
.target(TestFeignClient.class, "http://localhost:" + PORT);
}
@TearDown
public void tearDown() {
jettyServer.stop();
}
}
@State(Scope.Benchmark)
public static class BenchmarkStateWithNormalizedLogging {
TestJettyServer jettyServer;
TestFeignClient feignClient;
@Setup
public void init() {
jettyServer = new TestJettyServer();
jettyServer.start();
feignClient = Feign.builder()
.logger(new NormalizedFeignLogger())
.logLevel(Logger.Level.FULL)
.decoder(new GsonDecoder())
.target(TestFeignClient.class, "http://localhost:" + PORT);
}
@TearDown
public void tearDown() {
jettyServer.stop();
}
}
@Benchmark
@Warmup(iterations = 3)
public void testFeignLogger(BenchmarkStateWithoutLogging benchmarkState) {
final ResponseDto status = benchmarkState.feignClient.getStatus();
Assertions.assertEquals("ok", status.getStatus());
}
@Benchmark
@Warmup(iterations = 3)
public void testSlf4jFeignLogger(BenchmarkStateWithSlf4jLogging benchmarkState) {
final ResponseDto status = benchmarkState.feignClient.getStatus();
Assertions.assertEquals("ok", status.getStatus());
}
@Benchmark
@Warmup(iterations = 3)
public void testNormalizedFeignLogger(BenchmarkStateWithNormalizedLogging benchmarkState) {
final ResponseDto status = benchmarkState.feignClient.getStatus();
Assertions.assertEquals("ok", status.getStatus());
}
public static void main(String[] args) throws Exception {
org.openjdk.jmh.Main.main(args);
}
}

View File

@ -0,0 +1,15 @@
package me.bvn13.openfeign.logger.normalized;
public class ResponseDto {
private String status;
public String getStatus() {
return status;
}
public ResponseDto setStatus(String status) {
this.status = status;
return this;
}
}

View File

@ -0,0 +1,19 @@
package me.bvn13.openfeign.logger.normalized;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class TestBlockingServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("application/json");
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().println("{ \"status\": \"ok\"}");
}
}

View File

@ -0,0 +1,11 @@
package me.bvn13.openfeign.logger.normalized;
import feign.RequestLine;
public interface TestFeignClient {
@RequestLine("GET /status")
ResponseDto getStatus();
}

View File

@ -0,0 +1,51 @@
package me.bvn13.openfeign.logger.normalized;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.ServletHandler;
public class TestJettyServer {
public static final int PORT = 8090;
private Server server;
public TestJettyServer() {
server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(PORT);
server.setConnectors(new Connector[] {connector});
}
public void start() {
ServletHandler servletHandler = new ServletHandler();
server.setHandler(servletHandler);
servletHandler.addServletWithMapping(TestBlockingServlet.class, "/status");
new Thread(() -> {
try {
server.start();
} catch (Exception e) {
throw new RuntimeException(e);
}
}).start();
}
public void stop() {
try {
server.stop();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
TestJettyServer jettyServer;
jettyServer = new TestJettyServer();
try {
jettyServer.start();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

35
logger/pom.xml Normal file
View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>me.bvn13.openfeign.logger</groupId>
<artifactId>feign-normalized-logger</artifactId>
<version>0.2.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>logger</artifactId>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
<version>${feign.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@ -6,6 +6,7 @@ import org.slf4j.LoggerFactory;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
@ -18,7 +19,7 @@ import java.util.concurrent.ConcurrentHashMap;
* <pre> * <pre>
* {@code * {@code
* *
* normalized feign request (HERE-IS-CLASS-AND-METHOD): [ * Normalized feign request (HERE-ARE-CLASS-AND-METHOD): [
* *
* ] has response [ * ] has response [
* *
@ -69,16 +70,16 @@ public class NormalizedFeignLogger extends feign.Logger {
private void init() { private void init() {
if (isResponse.get() == null) { if (isResponse.get() == null) {
isResponse.set(new ConcurrentHashMap<>()); isResponse.set(new HashMap<>());
} }
if (methodName.get() == null) { if (methodName.get() == null) {
methodName.set(new ConcurrentHashMap<>()); methodName.set(new HashMap<>());
} }
if (logsRequest.get() == null) { if (logsRequest.get() == null) {
logsRequest.set(new ConcurrentHashMap<>()); logsRequest.set(new HashMap<>());
} }
if (logsResponse.get() == null) { if (logsResponse.get() == null) {
logsResponse.set(new ConcurrentHashMap<>()); logsResponse.set(new HashMap<>());
} }
} }

73
pom.xml
View File

@ -7,9 +7,14 @@
<groupId>me.bvn13.openfeign.logger</groupId> <groupId>me.bvn13.openfeign.logger</groupId>
<artifactId>feign-normalized-logger</artifactId> <artifactId>feign-normalized-logger</artifactId>
<version>0.1.5-SNAPSHOT</version> <version>0.2.1-SNAPSHOT</version>
<packaging>jar</packaging> <modules>
<module>logger</module>
<module>logger-testing</module>
</modules>
<packaging>pom</packaging>
<name>OpenFeign Normalized Logger</name> <name>OpenFeign Normalized Logger</name>
<description>Normalized Logger for OpenFeign</description> <description>Normalized Logger for OpenFeign</description>
@ -42,8 +47,32 @@
<nexus-staging-maven-plugin.version>1.6.13</nexus-staging-maven-plugin.version> <nexus-staging-maven-plugin.version>1.6.13</nexus-staging-maven-plugin.version>
<maven-gpg-plugin.version>1.6</maven-gpg-plugin.version> <maven-gpg-plugin.version>1.6</maven-gpg-plugin.version>
<gitflow-maven-plugin.version>1.18.0</gitflow-maven-plugin.version> <gitflow-maven-plugin.version>1.18.0</gitflow-maven-plugin.version>
<!-- Testing -->
<junit.version>5.9.0</junit.version>
<jetty-server.version>11.0.11</jetty-server.version>
<jmh.version>1.35</jmh.version>
<httpclient.version>4.5.13</httpclient.version>
</properties> </properties>
<developers>
<developer>
<id>bvn13</id>
<name>Vyacheslav Boyko</name>
<email>dev@bvn13.me</email>
<roles>
<role>Developer</role>
</roles>
</developer>
</developers>
<scm>
<connection>scm:git:git://github.com/bvn13/OpenFeign-NormalizedLogger.git</connection>
<developerConnection>scm:git:ssh://git@github.com:bvn13/OpenFeign-NormalizedLogger.git</developerConnection>
<tag>HEAD</tag>
<url>https://github.com/bvn13/OpenFeign-NormalizedLogger.git</url>
</scm>
<distributionManagement> <distributionManagement>
<repository> <repository>
@ -53,28 +82,6 @@
</repository> </repository>
</distributionManagement> </distributionManagement>
<dependencies>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
<version>${feign.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build> <build>
<finalName>feign-normalized-logger</finalName> <finalName>feign-normalized-logger</finalName>
@ -112,24 +119,6 @@
</pluginManagement> </pluginManagement>
</build> </build>
<developers>
<developer>
<id>bvn13</id>
<name>Vyacheslav Boyko</name>
<email>dev@bvn13.me</email>
<roles>
<role>Developer</role>
</roles>
</developer>
</developers>
<scm>
<connection>scm:git:git://github.com/bvn13/OpenFeign-NormalizedLogger.git</connection>
<developerConnection>scm:git:ssh://git@github.com:bvn13/OpenFeign-NormalizedLogger.git</developerConnection>
<tag>HEAD</tag>
<url>https://github.com/bvn13/OpenFeign-NormalizedLogger.git</url>
</scm>
<profiles> <profiles>
<profile> <profile>
<id>release</id> <id>release</id>

View File

@ -8,6 +8,8 @@ git push --tags
git push origin develop git push origin develop
git checkout master
read -p "Which version to publish? > " version read -p "Which version to publish? > " version
git checkout $version git checkout $version