diff --git a/logback-appender/src/test/java/pl/tkowalcz/tjahzi/logback/LokiAppenderLargeBatchesTest.java b/logback-appender/src/test/java/pl/tkowalcz/tjahzi/logback/LokiAppenderLargeBatchesTest.java new file mode 100644 index 0000000..0e1adc5 --- /dev/null +++ b/logback-appender/src/test/java/pl/tkowalcz/tjahzi/logback/LokiAppenderLargeBatchesTest.java @@ -0,0 +1,130 @@ +package pl.tkowalcz.tjahzi.logback; + +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.joran.JoranConfigurator; +import io.restassured.RestAssured; +import io.restassured.http.ContentType; +import io.restassured.parsing.Parser; +import org.awaitility.Awaitility; +import org.awaitility.Durations; +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; +import org.junit.jupiter.api.Test; +import org.slf4j.LoggerFactory; +import org.testcontainers.containers.BindMode; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +import java.net.URI; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.hasItems; + +@Testcontainers +class LokiAppenderLargeBatchesTest { + + @Container + public GenericContainer loki = new GenericContainer("grafana/loki:latest") + .withCommand("-config.file=/etc/loki-config.yaml") + .withClasspathResourceMapping("loki-config.yaml", + "/etc/loki-config.yaml", + BindMode.READ_ONLY) + .waitingFor( + Wait.forHttp("/ready") + .forPort(3100) + ) + .withExposedPorts(3100); + + @Test + void shouldSendData() throws Exception { + // Given + System.setProperty("loki.host", loki.getHost()); + System.setProperty("loki.port", loki.getFirstMappedPort().toString()); + + URI uri = getClass() + .getClassLoader() + .getResource("appender-test-large-batches.xml") + .toURI(); + + LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); + + JoranConfigurator configurator = new JoranConfigurator(); + configurator.setContext(context); + + context.reset(); + configurator.doConfigure(uri.toURL()); + + String expectedLogLine = "Cupcake ipsum dolor sit amet cake wafer. " + + "Souffle jelly beans biscuit topping. " + + "Danish bonbon gummies powder caramels. " + + "Danish jelly beans sweet roll topping jelly beans oat cake toffee. " + + "Chocolate cake sesame snaps brownie biscuit cheesecake. " + + "Ice cream dessert sweet donut marshmallow. " + + "Muffin bear claw cookie jelly-o sugar plum jelly beans apple pie fruitcake cookie. " + + "Tootsie roll carrot cake pastry jujubes jelly beans chupa chups. " + + "Souffle cake muffin liquorice tart souffle pie sesame snaps."; + + long expectedTimestamp = System.currentTimeMillis(); + Logger logger = context.getLogger(LokiAppenderLargeBatchesTest.class); + + // When + for (int i = 0; i < 1000; i++) { + logger.info(i + " " + expectedLogLine); + } + + // Then + RestAssured.port = loki.getFirstMappedPort(); + RestAssured.baseURI = "http://" + loki.getHost(); + RestAssured.registerParser("text/plain", Parser.JSON); + + Awaitility + .await() + .atMost(Durations.ONE_MINUTE) + .pollInterval(Durations.ONE_SECOND) + .ignoreExceptions() + .untilAsserted(() -> { + given() + .contentType(ContentType.URLENC) + .urlEncodingEnabled(false) + .formParam("&start=" + expectedTimestamp + "&limit=1000&query=%7Bserver%3D%22127.0.0.1%22%7D") + .when() + .get("/loki/api/v1/query_range") + .then() + .log() + .all() + .statusCode(200) + .body("status", equalTo("success")) + .body("data.result.size()", equalTo(1)) + .body("data.result[0].stream.server", equalTo("127.0.0.1")) + .body("data.result[0].values.size()", equalTo(1000)) + .body("data.result[0].values", hasItems(new BaseMatcher<>() { + @Override + public boolean matches(Object o) { + List list = (List) o; + if (list.size() != 2) { + return false; + } + + long actualTimestamp = Long.parseLong(list.get(0).toString()); + String actualLogLine = list.get(1).toString(); + + return actualLogLine.contains(expectedLogLine) + && (expectedTimestamp - actualTimestamp) < TimeUnit.MINUTES.toMillis(1); + } + + @Override + public void describeTo(Description description) { + + } + } + + )); + }); + } +} diff --git a/logback-appender/src/test/java/pl/tkowalcz/tjahzi/logback/LokiAppenderTest.java b/logback-appender/src/test/java/pl/tkowalcz/tjahzi/logback/LokiAppenderTest.java index 61c6c87..0e6dd65 100644 --- a/logback-appender/src/test/java/pl/tkowalcz/tjahzi/logback/LokiAppenderTest.java +++ b/logback-appender/src/test/java/pl/tkowalcz/tjahzi/logback/LokiAppenderTest.java @@ -2,7 +2,6 @@ package pl.tkowalcz.tjahzi.logback; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.joran.JoranConfigurator; -import ch.qos.logback.core.joran.spi.JoranException; import io.restassured.RestAssured; import io.restassured.http.ContentType; import io.restassured.parsing.Parser; @@ -19,9 +18,7 @@ import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import java.net.MalformedURLException; import java.net.URI; -import java.net.URISyntaxException; import java.util.List; import java.util.concurrent.TimeUnit; @@ -45,14 +42,14 @@ class LokiAppenderTest { .withExposedPorts(3100); @Test - void shouldSendData() throws URISyntaxException, MalformedURLException, JoranException { + void shouldSendData() throws Exception { // Given System.setProperty("loki.host", loki.getHost()); System.setProperty("loki.port", loki.getFirstMappedPort().toString()); URI uri = getClass() .getClassLoader() - .getResource("logback-configuration.xml") + .getResource("basic-appender-test-configuration.xml") .toURI(); LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); diff --git a/logback-appender/src/test/resources/appender-test-large-batches.xml b/logback-appender/src/test/resources/appender-test-large-batches.xml new file mode 100644 index 0000000..6d87c8e --- /dev/null +++ b/logback-appender/src/test/resources/appender-test-large-batches.xml @@ -0,0 +1,29 @@ + + + + 2 + 10000 + 1048576 + + ${loki.host} + ${loki.port} + + + %-4relative [%thread] %-5level %logger{35} - %msg%n + + +
+ X-Org-Id + Circus +
+ + +
+ + + + +
diff --git a/logback-appender/src/test/resources/appender-test-with-buffer-size-megabytes-set-to-64.xml b/logback-appender/src/test/resources/appender-test-with-buffer-size-megabytes-set-to-64.xml new file mode 100644 index 0000000..6296203 --- /dev/null +++ b/logback-appender/src/test/resources/appender-test-with-buffer-size-megabytes-set-to-64.xml @@ -0,0 +1,27 @@ + + + + 64 + + ${loki.host} + ${loki.port} + + + %-4relative [%thread] %-5level %logger{35} - %msg%n + + +
+ X-Org-Id + Circus +
+ + +
+ + + + +
diff --git a/logback-appender/src/test/resources/appender-test-with-buffer-size-megabytes-unset.xml b/logback-appender/src/test/resources/appender-test-with-buffer-size-megabytes-unset.xml new file mode 100644 index 0000000..6e9255b --- /dev/null +++ b/logback-appender/src/test/resources/appender-test-with-buffer-size-megabytes-unset.xml @@ -0,0 +1,24 @@ + + + ${loki.host} + ${loki.port} + + + %-4relative [%thread] %-5level %logger{35} - %msg%n + + +
+ X-Org-Id + Circus +
+ + +
+ + + + +
diff --git a/logback-appender/src/test/resources/appender-test-with-log-label-set.xml b/logback-appender/src/test/resources/appender-test-with-log-label-set.xml new file mode 100644 index 0000000..917af93 --- /dev/null +++ b/logback-appender/src/test/resources/appender-test-with-log-label-set.xml @@ -0,0 +1,28 @@ + + + ${loki.host} + ${loki.port} + + + %-4relative [%thread] %-5level %logger{35} - %msg%n + + +
+ X-Org-Id + Circus +
+ + + + + log_level + +
+ + + + +
diff --git a/logback-appender/src/test/resources/appender-test-with-log-label-unset.xml b/logback-appender/src/test/resources/appender-test-with-log-label-unset.xml new file mode 100644 index 0000000..6e9255b --- /dev/null +++ b/logback-appender/src/test/resources/appender-test-with-log-label-unset.xml @@ -0,0 +1,24 @@ + + + ${loki.host} + ${loki.port} + + + %-4relative [%thread] %-5level %logger{35} - %msg%n + + +
+ X-Org-Id + Circus +
+ + +
+ + + + +
diff --git a/logback-appender/src/test/resources/basic-appender-test-configuration.xml b/logback-appender/src/test/resources/basic-appender-test-configuration.xml new file mode 100644 index 0000000..6e9255b --- /dev/null +++ b/logback-appender/src/test/resources/basic-appender-test-configuration.xml @@ -0,0 +1,24 @@ + + + ${loki.host} + ${loki.port} + + + %-4relative [%thread] %-5level %logger{35} - %msg%n + + +
+ X-Org-Id + Circus +
+ + +
+ + + + +