diff --git a/.circleci/config.yml b/.circleci/config.yml index 419abf1..3fc2710 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,7 +1,7 @@ version: 2.1 orbs: - circleci-maven-release-orb: sonatype-nexus-community/circleci-maven-release-orb@0.0.15 + circleci-maven-release-orb: sonatype-nexus-community/circleci-maven-release-orb@0.0.16 jobs: build-and-test: @@ -46,17 +46,21 @@ executors: machine: image: ubuntu-2004:202008-01 +parameters: + run_workflow_release: + default: false + type: boolean + workflows: version: 2 main: + jobs: + - build-and-test + release: + when: << pipeline.parameters.run_workflow_release >> jobs: - build-and-test - circleci-maven-release-orb/run-maven-release: - filters: - branches: - ignore: /.*/ - tags: - only: /.*/ requires: - build-and-test executor: new-java-maven-executor diff --git a/loki-log4j2-appender/pom.xml b/loki-log4j2-appender/pom.xml index 92a91ad..20f16cb 100644 --- a/loki-log4j2-appender/pom.xml +++ b/loki-log4j2-appender/pom.xml @@ -1,12 +1,11 @@ - + 4.0.0 pl.tkowalcz tjahzi - 0.7-SNAPSHOT + 0.8.2-SNAPSHOT tjahzi-log4j2-appender diff --git a/loki-log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/LokiAppenderLargeBatchesTestTest.java b/loki-log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/LokiAppenderLargeBatchesTestTest.java new file mode 100644 index 0000000..3393f5f --- /dev/null +++ b/loki-log4j2-appender/src/test/java/pl/tkowalcz/tjahzi/log4j2/LokiAppenderLargeBatchesTestTest.java @@ -0,0 +1,124 @@ +package pl.tkowalcz.tjahzi.log4j2; + +import io.restassured.RestAssured; +import io.restassured.http.ContentType; +import io.restassured.parsing.Parser; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.awaitility.Awaitility; +import org.awaitility.Durations; +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; +import org.junit.jupiter.api.Test; +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.net.URISyntaxException; +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 LokiAppenderLargeBatchesTestTest { + + @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 URISyntaxException { + // 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(); + + ((org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false)) + .setConfigLocation(uri); + + 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 = LogManager.getLogger(LokiAppenderLargeBatchesTestTest.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/loki-log4j2-appender/src/test/resources/appender-test-large-batches.xml b/loki-log4j2-appender/src/test/resources/appender-test-large-batches.xml new file mode 100644 index 0000000..79aa5a9 --- /dev/null +++ b/loki-log4j2-appender/src/test/resources/appender-test-large-batches.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + ${sys:loki.host} + ${sys:loki.port} + + + + %X{tid} [%t] %d{MM-dd HH:mm:ss.SSS} %5p %c{1} - %m%n%exception{full} + + +
+