Skip to content

Commit ae64809

Browse files
Merge pull request #1 from peter-lawrey/main
Tuned the Chronicle Benchmark
2 parents 1bd92cf + 045d864 commit ae64809

File tree

21 files changed

+489
-288
lines changed

21 files changed

+489
-288
lines changed

chronicle-logger/pom.xml

Lines changed: 0 additions & 35 deletions
This file was deleted.

chronicle-logger/src/main/java/com/openelements/logger/chronicle/ChronicleLogger.java

Lines changed: 0 additions & 73 deletions
This file was deleted.

chronicle-logger/src/main/java/module-info.java

Lines changed: 0 additions & 5 deletions
This file was deleted.

chronicle-queue/pom.xml

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<parent>
8+
<groupId>com.open-elements.logging</groupId>
9+
<artifactId>java-logger-benchmark</artifactId>
10+
<version>1.0-SNAPSHOT</version>
11+
</parent>
12+
13+
<artifactId>chronicle-queue</artifactId>
14+
<version>1.0-SNAPSHOT</version>
15+
16+
<properties>
17+
<!-- Required JVM args for Java 17+ -->
18+
<jvm.requiredArgs>
19+
--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED
20+
--add-exports=java.base/jdk.internal.ref=ALL-UNNAMED
21+
--add-exports=java.base/jdk.internal.util=ALL-UNNAMED
22+
--add-exports=java.base/sun.nio.ch=ALL-UNNAMED
23+
--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
24+
--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
25+
--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED
26+
--add-opens=java.base/java.io=ALL-UNNAMED
27+
--add-opens=java.base/java.lang=ALL-UNNAMED
28+
--add-opens=java.base/java.lang.reflect=ALL-UNNAMED
29+
--add-opens=java.base/java.util=ALL-UNNAMED
30+
--add-opens=jdk.compiler/com.sun.tools.javac=ALL-UNNAMED
31+
</jvm.requiredArgs>
32+
</properties>
33+
34+
<dependencies>
35+
<dependency>
36+
<groupId>${groupId}</groupId>
37+
<artifactId>logger-api</artifactId>
38+
<version>${version}</version>
39+
</dependency>
40+
<dependency>
41+
<groupId>net.openhft</groupId>
42+
<artifactId>chronicle-queue</artifactId>
43+
<version>5.24ea25</version>
44+
</dependency>
45+
46+
<dependency>
47+
<groupId>org.slf4j</groupId>
48+
<artifactId>slf4j-simple</artifactId>
49+
<version>2.0.7</version>
50+
<scope>test</scope>
51+
</dependency>
52+
53+
<dependency>
54+
<groupId>org.junit.jupiter</groupId>
55+
<artifactId>junit-jupiter</artifactId>
56+
<version>RELEASE</version>
57+
<scope>test</scope>
58+
</dependency>
59+
</dependencies>
60+
61+
<build>
62+
<plugins>
63+
<plugin>
64+
<groupId>org.apache.maven.plugins</groupId>
65+
<artifactId>maven-surefire-plugin</artifactId>
66+
<version>3.1.2</version>
67+
<configuration>
68+
<argLine>${jvm.requiredArgs}</argLine>
69+
</configuration>
70+
</plugin>
71+
</plugins>
72+
</build>
73+
74+
</project>
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package com.openelements.logger.chronicle;
2+
3+
import com.openelements.logger.api.Logger;
4+
import net.openhft.chronicle.bytes.Bytes;
5+
import net.openhft.chronicle.bytes.DistributedUniqueTimeProvider;
6+
import net.openhft.chronicle.core.time.TimeProvider;
7+
import net.openhft.chronicle.queue.ChronicleQueue;
8+
import net.openhft.chronicle.wire.BinaryWire;
9+
import net.openhft.chronicle.wire.Wire;
10+
11+
import java.util.LinkedHashMap;
12+
import java.util.Map;
13+
14+
public class ChronicleQueueLogger implements Logger {
15+
16+
static final ThreadLocal<Wire> WIRE_TL = ThreadLocal.withInitial(() -> new BinaryWire(Bytes.allocateElasticOnHeap()));
17+
// provides a unique id across a cluster
18+
public static final TimeProvider CLOCK = DistributedUniqueTimeProvider.forHostId(1);
19+
20+
private final Map<String, String> metadata = new LinkedHashMap<>();
21+
private String metadataStr = "[]";
22+
23+
private final ChronicleQueue queue;
24+
private final String name;
25+
26+
public ChronicleQueueLogger(ChronicleQueue queue, Class source) {
27+
this.queue = queue;
28+
this.name = source.getSimpleName();
29+
}
30+
31+
@Override
32+
public void log(String message) {
33+
Wire wire = WIRE_TL.get();
34+
wire.clear();
35+
writeMessage(message, wire);
36+
writeToQueue(wire);
37+
}
38+
39+
private void writeToQueue(Wire wire) {
40+
Bytes<?> bytes = wire.bytes();
41+
queue.acquireAppender().writeBytes(bytes);
42+
}
43+
44+
private void writeMessage(String message, Wire wire) {
45+
String threadName = getSimpleThreadName();
46+
wire.write("lvl").text("INFO")
47+
.write("ts").int64(CLOCK.currentTimeNanos())
48+
.write("th").text(threadName)
49+
.write("name").text(name)
50+
.write("msg").text(message)
51+
.write("md").text(metadataStr);
52+
}
53+
54+
private static String getSimpleThreadName() {
55+
String threadName = Thread.currentThread().getName();
56+
int end = threadName.lastIndexOf('.');
57+
if (end > 0)
58+
threadName = threadName.substring(end);
59+
return threadName;
60+
}
61+
62+
@Override
63+
public void log(String message, Throwable throwable) {
64+
Wire wire = WIRE_TL.get();
65+
wire.clear();
66+
writeMessage(message, wire);
67+
wire.write("thrown").object(throwable);
68+
writeToQueue(wire);
69+
}
70+
71+
@Override
72+
public void log(String message, Object... args) {
73+
Wire wire = WIRE_TL.get();
74+
wire.clear();
75+
writeMessage(message, wire);
76+
wire.write("args").object(args);
77+
writeToQueue(wire);
78+
}
79+
80+
@Override
81+
public void log(String message, Throwable throwable, Object... args) {
82+
Wire wire = WIRE_TL.get();
83+
wire.clear();
84+
writeMessage(message, wire);
85+
wire.write("thrown").object(throwable);
86+
wire.write("args").object(args);
87+
writeToQueue(wire);
88+
}
89+
90+
@Override
91+
public Logger withMetadata(String key, Object value) {
92+
metadata.put(key, value.toString());
93+
metadataStr = metadata.entrySet().stream()
94+
.map(e -> e.getKey() + "=" + e.getValue())
95+
.reduce((a, b) -> a + ", " + b)
96+
.orElse("");
97+
return this;
98+
}
99+
100+
@Override
101+
public Logger withMarker(String marker) {
102+
String markerValue = metadata.get("marker");
103+
if (markerValue == null) {
104+
markerValue = marker;
105+
} else {
106+
markerValue = markerValue + "&" + marker;
107+
}
108+
withMetadata("marker", markerValue);
109+
return this;
110+
}
111+
112+
@Override
113+
public void reset() {
114+
metadata.clear();
115+
metadataStr = "[]";
116+
}
117+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.openelements.logger.chronicle;
2+
3+
import com.openelements.logger.api.LogLikeHell;
4+
import com.openelements.logger.api.Logger;
5+
import net.openhft.chronicle.core.io.IOTools;
6+
import net.openhft.chronicle.queue.ChronicleQueue;
7+
import org.junit.jupiter.api.Test;
8+
9+
class ChronicleQueueLoggerTest {
10+
@Test
11+
public void runAll() {
12+
String pathName = "target/queue";
13+
ChronicleQueue queue = ChronicleQueue.single(pathName);
14+
Logger logger = new ChronicleQueueLogger(queue, ChronicleQueueLoggerTest.class);
15+
new LogLikeHell(logger, false).run();
16+
IOTools.deleteDirWithFiles(pathName);
17+
}
18+
19+
}

0 commit comments

Comments
 (0)