Re #87: Mirroring tests from logback side.

This commit is contained in:
tomasz.kowalczewski committed 2022-05-04 23:07:04 +02:00
1 parent 846eacb492
commit cdbf9e46bc
12 files changed
+326 -6

No files matched your search

+6
View File
@@ -102,6 +102,12 @@
<version>1.14.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>nginx</artifactId>
<version>1.14.3</version>
<scope>test</scope>
</dependency>
</dependencies>
<profiles>
@@ -4,7 +4,6 @@ import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginElement;
import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
import org.apache.logging.log4j.status.StatusLogger;
import pl.tkowalcz.tjahzi.LoggingSystem;
import pl.tkowalcz.tjahzi.TjahziInitializer;
@@ -48,6 +47,9 @@ public class LokiAppenderBuilder<B extends LokiAppenderBuilder<B>> extends Abstr
@PluginBuilderAttribute
private int port;
@PluginBuilderAttribute
private boolean useSSL;
@PluginBuilderAttribute
private String username;
@@ -103,6 +105,7 @@ public class LokiAppenderBuilder<B extends LokiAppenderBuilder<B>> extends Abstr
.withLogEndpoint(logEndpoint)
.withHost(host)
.withPort(port)
.withUseSSL(useSSL)
.withUsername(username)
.withPassword(password)
.withConnectionTimeoutMillis(connectTimeoutMillis)
@@ -174,6 +177,46 @@ public class LokiAppenderBuilder<B extends LokiAppenderBuilder<B>> extends Abstr
return host;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getLogEndpoint() {
return logEndpoint;
}
public void setLogEndpoint(String logEndpoint) {
this.logEndpoint = logEndpoint;
}
public boolean isUseSSL() {
return useSSL;
}
public void setUseSSL(boolean useSSL) {
this.useSSL = useSSL;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getConnectTimeoutMillis() {
return connectTimeoutMillis;
}
@@ -3,15 +3,13 @@ package pl.tkowalcz.tjahzi.log4j2;
import org.apache.logging.log4j.core.LoggerContext;
import org.junit.jupiter.api.Test;
import java.net.URISyntaxException;
import static org.assertj.core.api.Assertions.assertThat;
import static pl.tkowalcz.tjahzi.log4j2.infra.IntegrationTest.loadConfig;
class BufferSizeConfigurationTest {
@Test
void shouldUseDefaultWhenLogBufferSizeIsNotSetViaConfiguration() throws URISyntaxException {
void shouldUseDefaultWhenLogBufferSizeIsNotSetViaConfiguration() {
// When
LoggerContext context = loadConfig("appender-test-with-buffer-size-megabytes-unset.xml");
@@ -22,7 +20,7 @@ class BufferSizeConfigurationTest {
}
@Test
void shouldSetLogBufferSizeViaConfiguration() throws URISyntaxException {
void shouldSetLogBufferSizeViaConfiguration() {
// When
LoggerContext context = loadConfig("appender-test-with-buffer-size-megabytes-set-to-64.xml");
@@ -0,0 +1,75 @@
package pl.tkowalcz.tjahzi.log4j2;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.BindMode;
import org.testcontainers.containers.NginxContainer;
import org.testcontainers.containers.wait.strategy.HttpWaitStrategy;
import org.testcontainers.junit.jupiter.Container;
import pl.tkowalcz.tjahzi.log4j2.infra.IntegrationTest;
import pl.tkowalcz.tjahzi.log4j2.infra.LokiAssert;
import static org.hamcrest.CoreMatchers.*;
class LokiAppenderHttpsCustomEndpointTest extends IntegrationTest {
@Container
public NginxContainer<?> nginx = new NginxContainer<>("nginx:latest")
.withNetwork(network)
.withClasspathResourceMapping("loki.reverse.nginx.conf",
"/etc/nginx/conf.d/loki.reverse.conf",
BindMode.READ_ONLY
)
.withClasspathResourceMapping("nginx/nginx-selfsigned.crt",
"/etc/nginx/nginx-selfsigned.crt",
BindMode.READ_ONLY
)
.withClasspathResourceMapping("nginx/nginx-selfsigned.key",
"/etc/nginx/nginx-selfsigned.key",
BindMode.READ_ONLY
)
.withClasspathResourceMapping("nginx/passwords",
"/etc/nginx/passwords",
BindMode.READ_ONLY
)
.waitingFor(new HttpWaitStrategy())
.withExposedPorts(81);
@Override
@BeforeEach
public void setUp() {
System.setProperty("loki.host", nginx.getHost());
System.setProperty("loki.port", nginx.getFirstMappedPort().toString());
}
@Test
void shouldSendData() {
// Given
loadConfig("appender-test-custom-endpoint-configuration.xml");
Logger logger = LogManager.getLogger(LokiAppenderHttpsCustomEndpointTest.class);
String expectedLogLine = "Hello World";
// When
logger.info(expectedLogLine);
// Then
LokiAssert.assertThat(loki)
.returns(response -> response
.body("data.result.size()", equalTo(1))
.body("data.result[0].stream.server", equalTo("127.0.0.1"))
.body(
"data.result.values",
hasItems(
hasItems(
hasItems(
containsString("INFO LokiAppenderHttpsCustomEndpointTest - " + expectedLogLine)
)
)
)
)
);
}
}
@@ -0,0 +1,75 @@
package pl.tkowalcz.tjahzi.log4j2;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.BindMode;
import org.testcontainers.containers.NginxContainer;
import org.testcontainers.containers.wait.strategy.HttpWaitStrategy;
import org.testcontainers.junit.jupiter.Container;
import pl.tkowalcz.tjahzi.log4j2.infra.IntegrationTest;
import pl.tkowalcz.tjahzi.log4j2.infra.LokiAssert;
import static org.hamcrest.CoreMatchers.*;
class LokiAppenderHttpsUrlConnectionReverseProxyTest extends IntegrationTest {
@Container
public NginxContainer<?> nginx = new NginxContainer<>("nginx:latest")
.withNetwork(network)
.withClasspathResourceMapping("loki.reverse.nginx.conf",
"/etc/nginx/conf.d/loki.reverse.conf",
BindMode.READ_ONLY
)
.withClasspathResourceMapping("nginx/nginx-selfsigned.crt",
"/etc/nginx/nginx-selfsigned.crt",
BindMode.READ_ONLY
)
.withClasspathResourceMapping("nginx/nginx-selfsigned.key",
"/etc/nginx/nginx-selfsigned.key",
BindMode.READ_ONLY
)
.withClasspathResourceMapping("nginx/passwords",
"/etc/nginx/passwords",
BindMode.READ_ONLY
)
.waitingFor(new HttpWaitStrategy())
.withExposedPorts(81);
@Override
@BeforeEach
public void setUp() {
System.setProperty("loki.host", nginx.getHost());
System.setProperty("loki.port", nginx.getFirstMappedPort().toString());
}
@Test
void shouldSendData() {
// Given
loadConfig("appender-test-url-configuration.xml");
Logger logger = LogManager.getLogger(LokiAppenderHttpsUrlConnectionReverseProxyTest.class);
String expectedLogLine = "Hello World";
// When
logger.info(expectedLogLine);
// Then
LokiAssert.assertThat(loki)
.returns(response -> response
.body("data.result.size()", equalTo(1))
.body("data.result[0].stream.server", equalTo("127.0.0.1"))
.body(
"data.result.values",
hasItems(
hasItems(
hasItems(
containsString("INFO LokiAppenderHttpsUrlConnectionReverseProxyTest - " + expectedLogLine)
)
)
)
)
);
}
}
@@ -6,6 +6,7 @@ import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.testcontainers.containers.BindMode;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.Network;
import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
@@ -17,8 +18,12 @@ import java.net.URL;
@Testcontainers
public class IntegrationTest {
public static Network network = Network.newNetwork();
@Container
public GenericContainer loki = new GenericContainer("grafana/loki:2.3.0")
.withNetwork(network)
.withNetworkAliases("loki")
.withCommand("-config.file=/etc/loki-config.yaml")
.withClasspathResourceMapping("loki-config.yaml",
"/etc/loki-config.yaml",
@@ -31,7 +36,7 @@ public class IntegrationTest {
.withExposedPorts(3100);
@BeforeEach
void setUp() {
public void setUp() {
System.setProperty("loki.host", loki.getHost());
System.setProperty("loki.port", loki.getFirstMappedPort().toString());
}
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration packages="pl.tkowalcz.tjahzi.log4j2">
<Loggers>
<Root level="OFF">
</Root>
<Logger name="pl.tkowalcz" level="ALL">
<AppenderRef ref="Loki"/>
</Logger>
</Loggers>
<appenders>
<Loki name="Loki">
<host>${sys:loki.host}</host>
<port>${sys:loki.port}</port>
<useSSL>true</useSSL>
<logEndpoint>/monitoring/loki/api/v1/push</logEndpoint>
<username>tjahzi</username>
<password>tjahzi</password>
<ThresholdFilter level="ALL"/>
<PatternLayout>
<Pattern>[%t] %d{DEFAULT} %5p %c{1} - %m%n%exception{full}</Pattern>
</PatternLayout>
<Header name="server" value="127.0.0.1"/>
<Label name="server" value="127.0.0.1"/>
</Loki>
</appenders>
</configuration>
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration packages="pl.tkowalcz.tjahzi.log4j2">
<Loggers>
<Root level="OFF">
</Root>
<Logger name="pl.tkowalcz" level="ALL">
<AppenderRef ref="Loki"/>
</Logger>
</Loggers>
<appenders>
<Loki name="Loki">
<url>https://${sys:loki.host}:${sys:loki.port}/monitoring/loki/api/v1/push</url>
<username>tjahzi</username>
<password>tjahzi</password>
<ThresholdFilter level="ALL"/>
<PatternLayout>
<Pattern>[%t] %d{DEFAULT} %5p %c{1} - %m%n%exception{full}</Pattern>
</PatternLayout>
<Header name="server" value="127.0.0.1"/>
<Label name="server" value="127.0.0.1"/>
</Loki>
</appenders>
</configuration>
@@ -0,0 +1,12 @@
server {
listen 81 ssl;
ssl_certificate nginx-selfsigned.crt;
ssl_certificate_key nginx-selfsigned.key;
location /monitoring/ {
proxy_pass http://loki:3100/;
}
auth_basic "loki auth";
auth_basic_user_file /etc/nginx/passwords;
}
@@ -0,0 +1,16 @@
-----BEGIN CERTIFICATE-----
MIICljCCAX4CCQDDkzDNweN3/jANBgkqhkiG9w0BAQsFADANMQswCQYDVQQGEwJQ
TDAeFw0yMjA1MDMyMjA0MzRaFw0yMzA1MDMyMjA0MzRaMA0xCzAJBgNVBAYTAlBM
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx6glTZOdvg9TbDu6fk/L
pZkWFegPALIkCf+ckk+yDSpyg+kuD4XR96NdcxRrMfQBCJGfTBRnpEI4VyZD5aBf
xRoqN6DwRrE8fN7r25C5wi3O7Xewz1NKmVnll+RnjZH84UuC3g+5RMVg7xDM8jrw
pdQnw8EY2bBfT8G+1JLWdFBdQDByblMJv+w0LdisqbV0A/bTdLMD8a2Pw7lbciMC
s0rrdlfcga0QsI7PsraOjVzjl29Cm09YNUjeiR4dD6ZNSAC73qdi1n9OPfrct648
Q/kbR2jiwHzvnQUwj/UCKncs1Vxc84YDaCxiMQYyaHxvaukUFWzE3SLu/OKtpHcE
7wIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBBRVyWs2RLG3WJoqx7ArSXAg43uikv
D7Tvo+ZIRuX7GRtQTk5N3nhyG5EVY85j9LX1MlaTkLeuAjHFuWjgRXe6cSFThnrA
qZRMH19jIDlTsd1YOurGrNQCST6R6YJ3rrPrcRDuLow/nO+4hD903DzzuLSjqoWw
TRIRwEcKuX/YrXX81/uFLEonuL97N4HkDnIhPZy/ndS8qAdrH6T47XZ6jh4WYInC
q0FNEmIjbGgTqwOh5wARP83aR6azXpS8Wb6ms2LYBd1BDuoAkqX4Hw5/iHcsqBQ8
UNp7qAH4UQj+cgUL0MQUL07NhJpbcAuAjz6iUXyFv/bb9WR2t2h2qLOu
-----END CERTIFICATE-----
@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDHqCVNk52+D1Ns
O7p+T8ulmRYV6A8AsiQJ/5yST7INKnKD6S4PhdH3o11zFGsx9AEIkZ9MFGekQjhX
JkPloF/FGio3oPBGsTx83uvbkLnCLc7td7DPU0qZWeWX5GeNkfzhS4LeD7lExWDv
EMzyOvCl1CfDwRjZsF9Pwb7UktZ0UF1AMHJuUwm/7DQt2KyptXQD9tN0swPxrY/D
uVtyIwKzSut2V9yBrRCwjs+yto6NXOOXb0KbT1g1SN6JHh0Ppk1IALvep2LWf049
+ty3rjxD+RtHaOLAfO+dBTCP9QIqdyzVXFzzhgNoLGIxBjJofG9q6RQVbMTdIu78
4q2kdwTvAgMBAAECggEANRmdQjKeY2wEDeccxHdIfDRo0U60nsTCHP6kj60ud53w
cvDTVUGMBEaolfC6ScDRfYvtR/itT9xky5jbufibP/qje8QL42FD6xoGtJCbNu+j
9zg8CAfo8TwdefY/LEHFdc31ckXQSmAMVcisGUhftFrmcIOsrkjgMIAg1rxu2OQG
gLhC5CCESLcGJdHnWnxuQCb81u51b5gftRgoCTRqOBiHf+uopn/cYjCOCCHIwh2I
Dr8yVDcxUIeXzaTnUk3epR4AcYePI8A41KCqIlhQPDy6VbbZmDwHUROMD05ON88z
/PsTUrhAvlAuYXDioxkDXCmU7/4ccUZtg+tVsQe3EQKBgQDmzjimW0RMLKvx5f9V
PTgqrWuQssE1CuDqZAyqianyjkFzE4MteIXVzBh0JreDpKipyUcGu8QnlrS+LCsj
W0DczdIq+WZmTFE8MmMxx5EFxEgXbyidV9P+VeBLgQ5kGYTAOfb6M8oHbSuo9mnQ
6WZDWUwSJ5k5YFFXVjZZp4V1fQKBgQDdc3v1mr9sRwiy5AD641AgeCjmYCMm90j4
QEZr25IgyueT7tA13O/Yi56ggiiQtkN0OjVCqtpF+piWIyEjXprUGf/0c/w16yew
Cfv4j2+DGYqsNrPXU3yBWCOseFm221E/obmvvi8F9aSftTs83dMw9QSYgnnbkmVz
5aPQrZT/2wKBgC3pxhEpxKtWk5naQ/HD7OFogCZXuOGBWX6nCnH+UqVisRhgQE8S
U6VVJWQts4HnhnnIBW4MehfZ/fh6ttYguAV0mCNeW4VsFxjfeSYU6f94rVKkFTM/
nndQw/6hHKjC/spyfXQGS2Ew0WeaJTCezW4GXICcCfoE9AloqAUrsvvNAoGBANV6
4MLxvRtalw4tMqypubKzY2pCv2Bu/s8i10Be2U33jKtViy6BoE22uuKs1wI6UmiX
PITaQ7U2USZbEzUPnF5f+hjkPvyThxzzYw5I6A0P8Fj4GwK3Hs1p9GntUz8tyfN3
qpO62YX7OgokIckZZuBJM3b6QRLk3ByQAg3HaF4FAoGBANUMBR3oUC5Eb7Uzr2oy
xY5mQ9YpN3ePzVUPc1tV8UCILksnJmobL4MFLfH0DWMQpysxBhjKwoYm1UxgYnWK
FtJcYxAybkPvon+cCzOeVcZKQY5Kq5cjBGRKAA79fDQjiFR+mtwVY7JcaDfK8hff
OW7UOrsm/EpNhyG4IYjH8cLd
-----END PRIVATE KEY-----
@@ -0,0 +1 @@
tjahzi:$apr1$7WwaD0YV$Z3WwsmYhmHM9Vsp7euiO21