From 403fae42ec6181f4d2a3f9f06196c16f117e9c85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awomir=20Andreasik?= Date: Tue, 17 Jun 2025 19:05:06 +0200 Subject: [PATCH 01/12] chore: bump version to 0.2.0-SNAPSHOT for development --- .github/workflows/ci.yml | 4 ++-- README.md | 8 ++++---- check-deployed-package/pom.xml | 4 ++-- examples/example-simple-java/pom.xml | 4 ++-- pom.xml | 2 +- src/main/java/io/logdash/sdk/transport/HttpTransport.java | 2 +- .../java/io/logdash/sdk/transport/HttpTransportTest.java | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 33b8b9f..5e80f78 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,10 +2,10 @@ name: CI/CD Pipeline on: push: - branches: [ main ] + branches: [ main, dev ] tags: [ 'v*' ] pull_request: - branches: [ main ] + branches: [ main, dev ] permissions: contents: write diff --git a/README.md b/README.md index 65372e7..baf1075 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Add the dependency to your project: io.logdash logdash - 0.1.3 + 0.2.0-SNAPSHOT ``` @@ -45,7 +45,7 @@ Add the dependency to your project: ```gradle dependencies { - implementation 'io.logdash:logdash:0.1.3' + implementation 'io.logdash:logdash:0.2.0-SNAPSHOT' } ``` @@ -53,7 +53,7 @@ dependencies { ```kotlin dependencies { - implementation("io.logdash:logdash:0.1.3") + implementation("io.logdash:logdash:0.2.0-SNAPSHOT") } ``` @@ -72,7 +72,7 @@ Then use in your project: io.logdash logdash - 0.1.3 + 0.2.0-SNAPSHOT ``` diff --git a/check-deployed-package/pom.xml b/check-deployed-package/pom.xml index 5c00c13..97cbe09 100644 --- a/check-deployed-package/pom.xml +++ b/check-deployed-package/pom.xml @@ -3,7 +3,7 @@ 4.0.0 io.logdash check - 1.0.0 + 0.2.0-SNAPSHOT 17 @@ -15,7 +15,7 @@ io.logdash logdash - 0.1.3 + 0.2.0-SNAPSHOT diff --git a/examples/example-simple-java/pom.xml b/examples/example-simple-java/pom.xml index ad72762..73501d8 100644 --- a/examples/example-simple-java/pom.xml +++ b/examples/example-simple-java/pom.xml @@ -4,7 +4,7 @@ com.example logdash-example - 0.1.3 + 0.2.0-SNAPSHOT jar Logdash Example Application @@ -16,7 +16,7 @@ UTF-8 21 - 0.1.3 + 0.2.0-SNAPSHOT 3.12.1 3.1.1 diff --git a/pom.xml b/pom.xml index 505e95e..443ee42 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ io.logdash logdash - 0.1.3 + 0.2.0-SNAPSHOT jar Logdash Java SDK diff --git a/src/main/java/io/logdash/sdk/transport/HttpTransport.java b/src/main/java/io/logdash/sdk/transport/HttpTransport.java index c649b72..07894f4 100644 --- a/src/main/java/io/logdash/sdk/transport/HttpTransport.java +++ b/src/main/java/io/logdash/sdk/transport/HttpTransport.java @@ -38,7 +38,7 @@ public final class HttpTransport implements LogdashTransport, AutoCloseable { private static final String METRICS_ENDPOINT = "/metrics"; private static final String API_KEY_HEADER = "project-api-key"; - private static final String USER_AGENT = "logdash-java-sdk/0.1.3"; + private static final String USER_AGENT = "logdash-java-sdk/0.2.0-SNAPSHOT"; private static final String CONTENT_TYPE = "application/json"; private final LogdashConfig config; diff --git a/src/test/java/io/logdash/sdk/transport/HttpTransportTest.java b/src/test/java/io/logdash/sdk/transport/HttpTransportTest.java index ed5c620..56b03b0 100644 --- a/src/test/java/io/logdash/sdk/transport/HttpTransportTest.java +++ b/src/test/java/io/logdash/sdk/transport/HttpTransportTest.java @@ -82,7 +82,7 @@ void should_successfully_send_log_entry() { postRequestedFor(urlEqualTo("/logs")) .withHeader("Content-Type", equalTo("application/json")) .withHeader("project-api-key", equalTo("test-api-key")) - .withHeader("User-Agent", equalTo("logdash-java-sdk/0.1.3"))); + .withHeader("User-Agent", equalTo("logdash-java-sdk/0.2.0-SNAPSHOT"))); } @Test @@ -105,7 +105,7 @@ void should_successfully_send_metric_entry() { putRequestedFor(urlEqualTo("/metrics")) .withHeader("Content-Type", equalTo("application/json")) .withHeader("project-api-key", equalTo("test-api-key")) - .withHeader("User-Agent", equalTo("logdash-java-sdk/0.1.3"))); + .withHeader("User-Agent", equalTo("logdash-java-sdk/0.2.0-SNAPSHOT"))); } @ParameterizedTest From 12c49ed9704fefe87243f9a841ec967831339335 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awomir=20Andreasik?= Date: Wed, 18 Jun 2025 19:29:05 +0200 Subject: [PATCH 02/12] ci(snapshot): add snapshot workflow --- .github/workflows/ci.yml | 42 +++- .github/workflows/develop-snapshots.yml | 283 ++++++++++++++++++++++++ examples/example-simple-java/pom.xml | 26 ++- pom.xml | 60 +++-- 4 files changed, 390 insertions(+), 21 deletions(-) create mode 100644 .github/workflows/develop-snapshots.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5e80f78..79f6326 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -263,12 +263,9 @@ jobs: exit 1 fi - - name: Check if version exists + - name: Check if version exists in GitHub Packages run: | - VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout) - echo "version=$VERSION" >> $GITHUB_OUTPUT - echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - + VERSION=${{ steps.version.outputs.version }} # Check if version already exists in GitHub Packages if gh api /orgs/logdash-io/packages/maven/io.logdash.logdash/versions --jq '.[] | .name' | grep -q "^$VERSION$"; then echo "::warning::Version $VERSION already exists in GitHub Packages" @@ -346,6 +343,21 @@ jobs: exit 1 fi + - name: Check if version exists on Maven Central + run: | + VERSION=${{ steps.version.outputs.version }} + # Check if version exists on Maven Central using search API + SEARCH_RESULT=$(curl -s "https://search.maven.org/solrsearch/select?q=g:io.logdash+AND+a:logdash+AND+v:$VERSION&rows=1&wt=json") + COUNT=$(echo "$SEARCH_RESULT" | jq -r '.response.numFound') + + if [[ "$COUNT" != "0" ]]; then + echo "::error::Version $VERSION already exists on Maven Central" + echo "Cannot redeploy existing version to Maven Central" + exit 1 + else + echo "✅ Version $VERSION is available for Maven Central release" + fi + - name: Build and Deploy to Maven Central run: | mvn clean deploy -B --no-transfer-progress \ @@ -356,12 +368,24 @@ jobs: CENTRAL_TOKEN_USERNAME: ${{ secrets.CENTRAL_TOKEN_USERNAME }} CENTRAL_TOKEN_PASSWORD: ${{ secrets.CENTRAL_TOKEN_PASSWORD }} GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + GPG_KEY_ID: ${{ secrets.GPG_KEY_ID }} + + - name: Verify Maven Central Deployment + run: | + VERSION=${{ steps.version.outputs.version }} + # Check if artifact appears in Central Portal (deployment confirmation) + if curl -s -f "https://central.sonatype.com/api/internal/browse/component?namespace=io.logdash&name=logdash&version=$VERSION" > /dev/null; then + echo "✅ Deployment confirmed via Central Portal API" + else + echo "⚠️ Not yet visible via Central Portal API (may take time to propagate)" + fi - name: Notify Maven Central Success run: | echo "✅ Successfully deployed logdash:${{ steps.version.outputs.version }} to Maven Central" echo "📦 Will be available at: https://central.sonatype.com/artifact/io.logdash/logdash/${{ steps.version.outputs.version }}" echo "🌐 Maven Central: https://search.maven.org/artifact/io.logdash/logdash/${{ steps.version.outputs.version }}" + echo "⏱️ Note: It may take up to 2 hours for the artifact to be searchable via Maven Central" create-github-release: name: Create GitHub Release @@ -469,6 +493,14 @@ jobs: _See below for full release notes and change log._ + - name: Deployment Summary + run: | + echo "📋 Deployment Status Summary:" + echo "✅ GitHub Packages: ${{ needs.github-release.result }}" + echo "✅ Maven Central: ${{ needs.maven-central-release.result }}" + echo "📦 Version: ${{ steps.version.outputs.version }}" + echo "🔗 Maven Central: https://central.sonatype.com/artifact/io.logdash/logdash/${{ steps.version.outputs.version }}" + notification: name: Notification runs-on: ubuntu-latest diff --git a/.github/workflows/develop-snapshots.yml b/.github/workflows/develop-snapshots.yml new file mode 100644 index 0000000..d80fa41 --- /dev/null +++ b/.github/workflows/develop-snapshots.yml @@ -0,0 +1,283 @@ +name: Develop Branch Snapshots + +on: + push: + branches: [ develop ] + schedule: + - cron: '0 2 * * *' + workflow_dispatch: + +env: + JAVA_VERSION: '17' + JAVA_DISTRIBUTION: 'temurin' + +jobs: + validate-develop: + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/develop' + timeout-minutes: 15 + outputs: + snapshot-version: ${{ steps.version.outputs.snapshot-version }} + + steps: + - name: Checkout develop + uses: actions/checkout@v4 + with: + ref: develop + fetch-depth: 0 + + - name: Setup JDK ${{ env.JAVA_VERSION }} + uses: actions/setup-java@v4 + with: + java-version: ${{ env.JAVA_VERSION }} + distribution: ${{ env.JAVA_DISTRIBUTION }} + + - name: Cache Maven dependencies + uses: actions/cache@v3 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-develop-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven-develop- + ${{ runner.os }}-maven- + + - name: Verify snapshot version + id: version + run: | + VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout) + if [[ ! $VERSION =~ .*-SNAPSHOT$ ]]; then + echo "❌ Error: Develop branch must have SNAPSHOT version, found: $VERSION" + exit 1 + fi + echo "✅ Snapshot version verified: $VERSION" + echo "snapshot-version=$VERSION" >> $GITHUB_OUTPUT + + - name: Run quick validation + run: | + mvn clean validate compile -B --no-transfer-progress \ + -DskipTests=true \ + -Dspotless.check.skip=true + + maven-central-snapshot: + runs-on: ubuntu-latest + needs: validate-develop + timeout-minutes: 25 + if: github.ref == 'refs/heads/develop' + + steps: + - name: Checkout develop + uses: actions/checkout@v4 + with: + ref: develop + fetch-depth: 0 + + - name: Setup JDK ${{ env.JAVA_VERSION }} + uses: actions/setup-java@v4 + with: + java-version: ${{ env.JAVA_VERSION }} + distribution: ${{ env.JAVA_DISTRIBUTION }} + + - name: Cache Maven dependencies + uses: actions/cache@v3 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-develop-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven-develop- + ${{ runner.os }}-maven- + + - name: Configure Maven Central Snapshots + uses: whelk-io/maven-settings-xml-action@v22 + with: + servers: | + [ + { + "id": "central", + "username": "${{ secrets.CENTRAL_TOKEN_USERNAME }}", + "password": "${{ secrets.CENTRAL_TOKEN_PASSWORD }}" + } + ] + + - name: Display snapshot version + run: | + echo "📦 Deploying snapshot version: ${{ needs.validate-develop.outputs.snapshot-version }}" + + - name: Run comprehensive tests + run: | + mvn clean verify -B --no-transfer-progress \ + -Dmaven.test.failure.ignore=false \ + -Dfailsafe.rerunFailingTestsCount=2 + + - name: Deploy to Maven Central Snapshots + run: | + mvn deploy -B --no-transfer-progress \ + -Pmaven-central-release \ + -DskipTests=true \ + -Dcentral.autoPublish=true + env: + SONATYPE_USERNAME: ${{ secrets.CENTRAL_TOKEN_USERNAME }} + SONATYPE_PASSWORD: ${{ secrets.CENTRAL_TOKEN_PASSWORD }} + + - name: Verify Maven Central snapshot deployment + run: | + VERSION="${{ needs.validate-develop.outputs.snapshot-version }}" + echo "⏳ Waiting for snapshot propagation..." + sleep 10 + + # Check if snapshot metadata is available + METADATA_URL="https://central.sonatype.com/repository/maven-snapshots/io/logdash/logdash/$VERSION/maven-metadata.xml" + if curl -s -f "$METADATA_URL" > /dev/null; then + echo "✅ Snapshot metadata confirmed at Maven Central" + else + echo "⚠️ Snapshot metadata not yet available (may take time to propagate)" + fi + + - name: Display deployment info + run: | + VERSION="${{ needs.validate-develop.outputs.snapshot-version }}" + echo "✅ Successfully deployed $VERSION to Maven Central Snapshots" + echo "📦 Available at: https://central.sonatype.com/repository/maven-snapshots/io/logdash/logdash/$VERSION/" + echo "" + echo "🔍 Maven dependency:" + echo "" + echo " io.logdash" + echo " logdash" + echo " $VERSION" + echo "" + echo "" + echo "🔍 Gradle dependency:" + echo "implementation 'io.logdash:logdash:$VERSION'" + + - name: Notify deployment status + if: failure() + run: | + VERSION="${{ needs.validate-develop.outputs.snapshot-version }}" + echo "❌ Snapshot deployment failed for version $VERSION" + echo "Check logs above for deployment errors" + + github-packages-snapshot: + runs-on: ubuntu-latest + needs: validate-develop + timeout-minutes: 15 + if: github.ref == 'refs/heads/develop' + + permissions: + contents: read + packages: write + + steps: + - name: Checkout develop + uses: actions/checkout@v4 + with: + ref: develop + + - name: Setup JDK ${{ env.JAVA_VERSION }} + uses: actions/setup-java@v4 + with: + java-version: ${{ env.JAVA_VERSION }} + distribution: ${{ env.JAVA_DISTRIBUTION }} + + - name: Cache Maven dependencies + uses: actions/cache@v3 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-develop-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven-develop- + ${{ runner.os }}-maven- + + - name: Configure Maven Settings for GitHub Packages + uses: whelk-io/maven-settings-xml-action@v22 + with: + servers: | + [ + { + "id": "github", + "username": "${env.GITHUB_ACTOR}", + "password": "${env.GITHUB_TOKEN}" + } + ] + + - name: Deploy to GitHub Packages (Backup) + run: | + mvn deploy -B --no-transfer-progress \ + -Pgithub-release \ + -DperformRelease=true \ + -DskipTests=true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Verify GitHub Packages deployment + run: | + VERSION="${{ needs.validate-develop.outputs.snapshot-version }}" + echo "✅ Backup snapshot deployed to GitHub Packages: $VERSION" + echo "📦 Available at: https://github.com/logdash-io/java-sdk/packages" + + verify-deployments: + runs-on: ubuntu-latest + needs: [ maven-central-snapshot, github-packages-snapshot ] + timeout-minutes: 10 + if: github.ref == 'refs/heads/develop' + + steps: + - name: Final verification + run: | + VERSION="${{ needs.validate-develop.outputs.snapshot-version }}" + echo "🔍 Final verification for snapshot: $VERSION" + + # Wait a bit more for propagation + echo "⏳ Waiting for complete propagation..." + sleep 10 + + # Check Maven Central snapshots + METADATA_URL="https://central.sonatype.com/repository/maven-snapshots/io/logdash/logdash/$VERSION/maven-metadata.xml" + if curl -s -f "$METADATA_URL" > /dev/null; then + echo "✅ Maven Central snapshot confirmed and accessible" + else + echo "⚠️ Maven Central snapshot metadata not accessible yet" + fi + + echo "" + echo "📋 Deployment Summary:" + echo "🏗️ Maven Central Snapshots: ${{ needs.maven-central-snapshot.result }}" + echo "📦 GitHub Packages: ${{ needs.github-packages-snapshot.result }}" + echo "🔢 Version: $VERSION" + echo "🌐 Repository: https://central.sonatype.com/repository/maven-snapshots/" + + notification: + runs-on: ubuntu-latest + needs: [ validate-develop, maven-central-snapshot, github-packages-snapshot, verify-deployments ] + if: always() && github.ref == 'refs/heads/develop' + + steps: + - name: Workflow status summary + run: | + VERSION="${{ needs.validate-develop.outputs.snapshot-version }}" + + echo "📊 Develop Branch Snapshot Workflow Summary" + echo "=============================================" + echo "🔢 Version: $VERSION" + echo "📅 Triggered: ${{ github.event_name }}" + echo "" + echo "Job Results:" + echo "✓ Validation: ${{ needs.validate-develop.result }}" + echo "✓ Maven Central: ${{ needs.maven-central-snapshot.result }}" + echo "✓ GitHub Packages: ${{ needs.github-packages-snapshot.result }}" + echo "✓ Verification: ${{ needs.verify-deployments.result }}" + echo "" + + # Check overall success + if [[ "${{ needs.validate-develop.result }}" == "success" && + "${{ needs.maven-central-snapshot.result }}" == "success" && + "${{ needs.github-packages-snapshot.result }}" == "success" ]]; then + echo "🎉 All snapshot deployments completed successfully!" + echo "📦 $VERSION is now available for testing" + else + echo "⚠️ Some deployments may have failed. Check individual job results above." + fi + + echo "" + echo "🔗 Quick Access:" + echo "- Maven Central: https://central.sonatype.com/repository/maven-snapshots/io/logdash/logdash/$VERSION/" + echo "- GitHub Packages: https://github.com/logdash-io/java-sdk/packages" + echo "- Workflow: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" \ No newline at end of file diff --git a/examples/example-simple-java/pom.xml b/examples/example-simple-java/pom.xml index 73501d8..e3474c8 100644 --- a/examples/example-simple-java/pom.xml +++ b/examples/example-simple-java/pom.xml @@ -16,16 +16,17 @@ UTF-8 21 - 0.2.0-SNAPSHOT 3.12.1 3.1.1 + + 0.2.0-SNAPSHOT io.logdash logdash - ${logdash-sdk.version} + ${logdash.version} @@ -53,4 +54,25 @@ + + + + snapshot-repo + + + logdash.version + *-SNAPSHOT + + + + + + true + + github-snapshots + https://maven.pkg.github.com/logdash-io/java-sdk + + + + diff --git a/pom.xml b/pom.xml index 443ee42..8124c77 100644 --- a/pom.xml +++ b/pom.xml @@ -35,19 +35,6 @@ https://github.com/logdash-io/java-sdk - - - github - GitHub Packages - https://maven.pkg.github.com/logdash-io/java-sdk - - - github - GitHub Packages - https://maven.pkg.github.com/logdash-io/java-sdk - - - 17 ${java.version} @@ -483,6 +470,29 @@ + + local-dev + + true + + + false + false + + + + + org.apache.maven.plugins + maven-deploy-plugin + ${maven-deploy-plugin.version} + + true + + + + + + github-release @@ -492,6 +502,18 @@ true + + + github + GitHub Packages + https://maven.pkg.github.com/logdash-io/java-sdk + + + github + GitHub Packages + https://maven.pkg.github.com/logdash-io/java-sdk + + @@ -501,6 +523,7 @@ ${maven-deploy-plugin.version} true + false @@ -519,7 +542,7 @@ central Central Repository Snapshots - https://central.sonatype.com/api/v1/publisher + https://central.sonatype.com/repository/maven-snapshots/ @@ -563,6 +586,15 @@ + + + org.apache.maven.plugins + maven-deploy-plugin + ${maven-deploy-plugin.version} + + false + + From a24e090c2379de426d91645eaa8317491abf394e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awomir=20Andreasik?= Date: Tue, 17 Jun 2025 19:52:29 +0200 Subject: [PATCH 03/12] feat(example): add Spring Boot example --- examples/example-springboot/Dockerfile | 7 + .../example-springboot/docker-compose.yml | 14 ++ examples/example-springboot/pom.xml | 62 ++++++++ examples/example-springboot/requests.http | 23 +++ .../example/SpringBootExampleApplication.java | 14 ++ .../example/config/LogdashConfiguration.java | 51 +++++++ .../example/controller/PetController.java | 144 ++++++++++++++++++ .../java/io/logdash/example/domain/Pet.java | 16 ++ .../io/logdash/example/domain/PetType.java | 5 + .../example/service/MonitoringService.java | 88 +++++++++++ .../logdash/example/service/PetService.java | 58 +++++++ .../src/main/resources/application.yml | 28 ++++ 12 files changed, 510 insertions(+) create mode 100644 examples/example-springboot/Dockerfile create mode 100644 examples/example-springboot/docker-compose.yml create mode 100644 examples/example-springboot/pom.xml create mode 100644 examples/example-springboot/requests.http create mode 100644 examples/example-springboot/src/main/java/io/logdash/example/SpringBootExampleApplication.java create mode 100644 examples/example-springboot/src/main/java/io/logdash/example/config/LogdashConfiguration.java create mode 100644 examples/example-springboot/src/main/java/io/logdash/example/controller/PetController.java create mode 100644 examples/example-springboot/src/main/java/io/logdash/example/domain/Pet.java create mode 100644 examples/example-springboot/src/main/java/io/logdash/example/domain/PetType.java create mode 100644 examples/example-springboot/src/main/java/io/logdash/example/service/MonitoringService.java create mode 100644 examples/example-springboot/src/main/java/io/logdash/example/service/PetService.java create mode 100644 examples/example-springboot/src/main/resources/application.yml diff --git a/examples/example-springboot/Dockerfile b/examples/example-springboot/Dockerfile new file mode 100644 index 0000000..536bdbc --- /dev/null +++ b/examples/example-springboot/Dockerfile @@ -0,0 +1,7 @@ +FROM eclipse-temurin:21-jre-alpine + +WORKDIR /app +COPY target/springboot-example-*.jar app.jar + +EXPOSE 8080 +ENTRYPOINT ["java", "-jar", "app.jar"] diff --git a/examples/example-springboot/docker-compose.yml b/examples/example-springboot/docker-compose.yml new file mode 100644 index 0000000..a86a90e --- /dev/null +++ b/examples/example-springboot/docker-compose.yml @@ -0,0 +1,14 @@ +version: '3.8' +services: + app: + build: . + ports: + - '8080:8080' + environment: + - LOGDASH_API_KEY=${LOGDASH_API_KEY:-your-api-key} + - SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE:-dev} + healthcheck: + test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8080/actuator/health"] + interval: 30s + timeout: 10s + retries: 3 \ No newline at end of file diff --git a/examples/example-springboot/pom.xml b/examples/example-springboot/pom.xml new file mode 100644 index 0000000..aeda8e5 --- /dev/null +++ b/examples/example-springboot/pom.xml @@ -0,0 +1,62 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 3.4.6 + + + + io.logdash.example + springboot-example + 0.2.0-SNAPSHOT + jar + + Logdash Spring Boot Example + Spring Boot application demonstrating Logdash Java SDK usage + + + 21 + 0.2.0-SNAPSHOT + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-actuator + + + + + io.logdash + logdash + ${logdash-sdk.version} + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + io.logdash.example.SpringBootExampleApplication + + + + + diff --git a/examples/example-springboot/requests.http b/examples/example-springboot/requests.http new file mode 100644 index 0000000..69eed80 --- /dev/null +++ b/examples/example-springboot/requests.http @@ -0,0 +1,23 @@ +### Variables +@baseUrl = http://localhost:8080 + +### Get all pets +GET {{baseUrl}}/api/pets + +### Get pet by ID +GET {{baseUrl}}/api/pets/1 + +### Create a new pet +POST {{baseUrl}}/api/pets +Content-Type: application/json + +{ + "name": "Fluffy", + "type": "DOG" +} + +### Create a random pet +POST {{baseUrl}}/api/pets/random + +### Delete a pet by ID +DELETE {{baseUrl}}/api/pets/3 diff --git a/examples/example-springboot/src/main/java/io/logdash/example/SpringBootExampleApplication.java b/examples/example-springboot/src/main/java/io/logdash/example/SpringBootExampleApplication.java new file mode 100644 index 0000000..7b570be --- /dev/null +++ b/examples/example-springboot/src/main/java/io/logdash/example/SpringBootExampleApplication.java @@ -0,0 +1,14 @@ +package io.logdash.example; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +@SpringBootApplication +@EnableScheduling +public class SpringBootExampleApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringBootExampleApplication.class, args); + } +} diff --git a/examples/example-springboot/src/main/java/io/logdash/example/config/LogdashConfiguration.java b/examples/example-springboot/src/main/java/io/logdash/example/config/LogdashConfiguration.java new file mode 100644 index 0000000..f77b6fd --- /dev/null +++ b/examples/example-springboot/src/main/java/io/logdash/example/config/LogdashConfiguration.java @@ -0,0 +1,51 @@ +package io.logdash.example.config; + +import io.logdash.sdk.Logdash; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import static io.logdash.example.config.LogdashConfiguration.LogdashProperties; + +@Configuration +@EnableConfigurationProperties(LogdashProperties.class) +public class LogdashConfiguration { + + @Bean + public Logdash logdash(LogdashProperties properties) { + return Logdash.builder() + .apiKey(properties.apiKey()) + .baseUrl(properties.baseUrl()) + .enableConsoleOutput(properties.enableConsoleOutput()) + .enableVerboseLogging(properties.enableVerboseLogging()) + .requestTimeoutMs(properties.requestTimeoutMs()) + .maxConcurrentRequests(properties.maxConcurrentRequests()) + .build(); + } + + @ConfigurationProperties(prefix = "logdash") + public record LogdashProperties( + String apiKey, + String baseUrl, + boolean enableConsoleOutput, + boolean enableVerboseLogging, + long requestTimeoutMs, + int maxConcurrentRequests + ) { + public LogdashProperties { + if (apiKey == null || apiKey.isBlank()) { + throw new IllegalArgumentException("Logdash API key is required"); + } + if (baseUrl == null || baseUrl.isBlank()) { + baseUrl = "https://api.logdash.io"; + } + if (requestTimeoutMs <= 0) { + requestTimeoutMs = 10000L; + } + if (maxConcurrentRequests <= 0) { + maxConcurrentRequests = 20; + } + } + } +} diff --git a/examples/example-springboot/src/main/java/io/logdash/example/controller/PetController.java b/examples/example-springboot/src/main/java/io/logdash/example/controller/PetController.java new file mode 100644 index 0000000..d6bd4c1 --- /dev/null +++ b/examples/example-springboot/src/main/java/io/logdash/example/controller/PetController.java @@ -0,0 +1,144 @@ +package io.logdash.example.controller; + +import io.logdash.example.domain.Pet; +import io.logdash.example.domain.PetType; +import io.logdash.example.service.PetService; +import io.logdash.sdk.Logdash; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api/pets") +public class PetController { + + private final PetService petService; + private final Logdash logdash; + + public PetController(PetService petService, Logdash logdash) { + this.petService = petService; + this.logdash = logdash; + } + + @GetMapping + public ResponseEntity> getAllPets() { + var logger = logdash.logger(); + var metrics = logdash.metrics(); + + var pets = petService.getAllPets(); + + logger.info("Retrieved all pets", Map.of( + "count", pets.size(), + "endpoint", "/api/pets", + "timestamp", LocalDateTime.now() + )); + + metrics.mutate("api.requests.total", 1); + metrics.mutate("api.pets.list.requests", 1); + metrics.set("pets.total.count", pets.size()); + + return ResponseEntity.ok(pets); + } + + @GetMapping("/{id}") + public ResponseEntity getPet(@PathVariable Long id) { + var logger = logdash.logger(); + var metrics = logdash.metrics(); + + var pet = petService.findById(id); + + if (pet.isPresent()) { + logger.debug("Pet retrieved successfully", Map.of( + "petId", id, + "name", pet.get().name(), + "type", pet.get().type().name() + )); + metrics.mutate("api.pets.get.success", 1); + return ResponseEntity.ok(pet.get()); + } else { + logger.warn("Pet not found", Map.of( + "petId", id + )); + metrics.mutate("api.pets.get.not_found", 1); + return ResponseEntity.notFound().build(); + } + } + + @PostMapping + public ResponseEntity createPet(@RequestBody CreatePetRequest request) { + var logger = logdash.logger(); + var metrics = logdash.metrics(); + + try { + var pet = petService.addPet(request.name(), request.type()); + + logger.info("Pet created successfully", Map.of( + "petId", pet.id(), + "name", pet.name(), + "type", pet.type().name() + )); + + metrics.mutate("pets.created.total", 1); + metrics.mutate("api.pets.create.success", 1); + metrics.set("pets.total.count", petService.getTotalCount()); + + return ResponseEntity.ok(pet); + + } catch (IllegalArgumentException e) { + logger.error("Pet creation failed", Map.of( + "error", e.getMessage(), + "requestName", request.name(), + "requestType", request.type() + )); + metrics.mutate("api.pets.create.validation_error", 1); + return ResponseEntity.badRequest().build(); + } + } + + @PostMapping("/random") + public ResponseEntity createRandomPet() { + var logger = logdash.logger(); + var metrics = logdash.metrics(); + + var pet = petService.createRandomPet(); + + logger.info("Random pet created", Map.of( + "petId", pet.id(), + "name", pet.name(), + "type", pet.type().name() + )); + + metrics.mutate("pets.created.random", 1); + metrics.mutate("api.requests.total", 1); + metrics.set("pets.total.count", petService.getTotalCount()); + + return ResponseEntity.ok(pet); + } + + @DeleteMapping("/{id}") + public ResponseEntity deletePet(@PathVariable Long id) { + var logger = logdash.logger(); + var metrics = logdash.metrics(); + + boolean deleted = petService.deletePet(id); + + if (deleted) { + logger.info("Pet deleted successfully", Map.of( + "petId", id + )); + metrics.mutate("pets.deleted.total", 1); + metrics.set("pets.total.count", petService.getTotalCount()); + return ResponseEntity.noContent().build(); + } else { + logger.warn("Delete failed - pet not found", Map.of("petId", id)); + metrics.mutate("api.pets.delete.not_found", 1); + return ResponseEntity.notFound().build(); + } + } + + public record CreatePetRequest(String name, PetType type) { + } +} diff --git a/examples/example-springboot/src/main/java/io/logdash/example/domain/Pet.java b/examples/example-springboot/src/main/java/io/logdash/example/domain/Pet.java new file mode 100644 index 0000000..004fbd5 --- /dev/null +++ b/examples/example-springboot/src/main/java/io/logdash/example/domain/Pet.java @@ -0,0 +1,16 @@ +package io.logdash.example.domain; + +public record Pet( + Long id, + String name, + PetType type +) { + public Pet { + if (name == null || name.isBlank()) { + throw new IllegalArgumentException("Pet name is required"); + } + if (type == null) { + throw new IllegalArgumentException("Pet type is required"); + } + } +} diff --git a/examples/example-springboot/src/main/java/io/logdash/example/domain/PetType.java b/examples/example-springboot/src/main/java/io/logdash/example/domain/PetType.java new file mode 100644 index 0000000..20cda4b --- /dev/null +++ b/examples/example-springboot/src/main/java/io/logdash/example/domain/PetType.java @@ -0,0 +1,5 @@ +package io.logdash.example.domain; + +public enum PetType { + DOG, CAT, BIRD, RABBIT, FISH +} diff --git a/examples/example-springboot/src/main/java/io/logdash/example/service/MonitoringService.java b/examples/example-springboot/src/main/java/io/logdash/example/service/MonitoringService.java new file mode 100644 index 0000000..c640ae5 --- /dev/null +++ b/examples/example-springboot/src/main/java/io/logdash/example/service/MonitoringService.java @@ -0,0 +1,88 @@ +package io.logdash.example.service; + +import io.logdash.sdk.Logdash; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.lang.management.ManagementFactory; +import java.util.Map; +import java.util.concurrent.ThreadLocalRandom; + +@Service +public class MonitoringService { + + private final Logdash logdash; + private final PetService petService; + private int monitoringCycles = 0; + + public MonitoringService(Logdash logdash, PetService petService) { + this.logdash = logdash; + this.petService = petService; + } + + @Scheduled(fixedRate = 10000) // Every 10 seconds + public void recordSystemMetrics() { + var logger = logdash.logger(); + var metrics = logdash.metrics(); + + monitoringCycles++; + + // JVM metrics + var memoryBean = ManagementFactory.getMemoryMXBean(); + var heapUsage = memoryBean.getHeapMemoryUsage(); + + var heapUsedMB = heapUsage.getUsed() / (1024 * 1024); + + // Simulated application metrics + var activeUsers = ThreadLocalRandom.current().nextInt(50, 300); + var errorRate = ThreadLocalRandom.current().nextDouble(0.1, 8.0); + + logger.verbose("System monitoring cycle", Map.of( + "cycle", monitoringCycles, + "activeUsers", activeUsers + )); + + // Send metrics to Logdash + metrics.set("jvm.memory.heap.used_mb", heapUsedMB); + metrics.set("app.users.active", activeUsers); + + // Business metrics + var petCount = petService.getTotalCount(); + metrics.set("pets.total.count", petCount); + + // Increment counters + metrics.mutate("monitoring.cycles.total", 1); + + // Simulate random events + if (ThreadLocalRandom.current().nextDouble() < 0.3) { // 30% chance + logger.info("Random application event", Map.of( + "activeUsers", activeUsers + )); + metrics.mutate("app.events.user_activity", 1); + } + + if (errorRate > 3.0) { + logger.warn("High error rate detected", Map.of( + "errorRate", errorRate + )); + metrics.mutate("alerts.performance.slow_response", 1); + } + } + + @Scheduled(fixedRate = 30000) // Every 30 seconds + public void simulateBusinessEvents() { + var logger = logdash.logger(); + var metrics = logdash.metrics(); + + // Simulate random pet creation + if (ThreadLocalRandom.current().nextBoolean()) { + var pet = petService.createRandomPet(); + + logger.info(String.format("Background pet creation: petId=%s, name=%s, type=%s", pet.id(), pet.name(), + pet.type().name())); + + metrics.mutate("pets.created.background", 1); + metrics.set("pets.total.count", petService.getTotalCount()); + } + } +} diff --git a/examples/example-springboot/src/main/java/io/logdash/example/service/PetService.java b/examples/example-springboot/src/main/java/io/logdash/example/service/PetService.java new file mode 100644 index 0000000..2899050 --- /dev/null +++ b/examples/example-springboot/src/main/java/io/logdash/example/service/PetService.java @@ -0,0 +1,58 @@ +package io.logdash.example.service; + +import io.logdash.example.domain.Pet; +import io.logdash.example.domain.PetType; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.atomic.AtomicLong; + +@Service +public class PetService { + + private final Map pets = new ConcurrentHashMap<>(); + private final AtomicLong idGenerator = new AtomicLong(1); + + public PetService() { + addPet("Burek", PetType.DOG); + addPet("Mruczek", PetType.CAT); + addPet("Rex", PetType.DOG); + } + + public Pet addPet(String name, PetType type) { + var pet = new Pet(idGenerator.getAndIncrement(), name, type); + pets.put(pet.id(), pet); + return pet; + } + + public List getAllPets() { + return new ArrayList<>(pets.values()); + } + + public Optional findById(Long id) { + return Optional.ofNullable(pets.get(id)); + } + + public Pet createRandomPet() { + var names = List.of("Azor", "Bella", "Charlie", "Luna", "Max", "Molly", "Oscar"); + var types = PetType.values(); + + var randomName = names.get(ThreadLocalRandom.current().nextInt(names.size())); + var randomType = types[ThreadLocalRandom.current().nextInt(types.length)]; + + return addPet(randomName, randomType); + } + + public int getTotalCount() { + return pets.size(); + } + + public boolean deletePet(Long id) { + return pets.remove(id) != null; + } +} diff --git a/examples/example-springboot/src/main/resources/application.yml b/examples/example-springboot/src/main/resources/application.yml new file mode 100644 index 0000000..e4339c1 --- /dev/null +++ b/examples/example-springboot/src/main/resources/application.yml @@ -0,0 +1,28 @@ +server: + port: 8080 + +spring: + application: + name: logdash-petclinic-demo + +logdash: + api-key: ${LOGDASH_API_KEY:your-api-key} + base-url: https://api.logdash.io + enable-console-output: true + enable-verbose-logging: false + request-timeout-ms: 10000 + max-concurrent-requests: 20 + +management: + endpoints: + web: + exposure: + include: health,info,metrics + endpoint: + health: + show-details: always + +logging: + level: + io.logdash.example: INFO + root: WARN \ No newline at end of file From 7e4b19a5fcf13427e2d318b0da456c8e4ddbf63f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awomir=20Andreasik?= Date: Tue, 17 Jun 2025 21:35:11 +0200 Subject: [PATCH 04/12] build(format): reconfigure spotless plugin --- check-deployed-package/Check.java | 17 ++++++++--------- pom.xml | 9 +++++++++ 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/check-deployed-package/Check.java b/check-deployed-package/Check.java index 4b2229b..48e50c3 100644 --- a/check-deployed-package/Check.java +++ b/check-deployed-package/Check.java @@ -2,28 +2,27 @@ import io.logdash.sdk.Logdash; -import java.util.Map; public class Check { public static void main(String[] args) { System.out.println("=== LogDash Java SDK Demo ==="); - + // Get package version (would need to be handled differently in a real scenario) System.out.println("Using logdash package version: " + getLogdashVersion()); System.out.println(); - + String apiKey = System.getenv("LOGDASH_API_KEY"); String logsSeed = System.getenv().getOrDefault("LOGS_SEED", "default"); String metricsSeed = System.getenv().getOrDefault("METRICS_SEED", "1"); - + System.out.println("Using API Key: " + apiKey); System.out.println("Using Logs Seed: " + logsSeed); System.out.println("Using Metrics Seed: " + metricsSeed); - + try (Logdash logdash = Logdash.create(apiKey)) { var logger = logdash.logger(); var metrics = logdash.metrics(); - + // Log some messages with seed appended logger.info("This is an info log " + logsSeed); logger.error("This is an error log " + logsSeed); @@ -33,7 +32,7 @@ public static void main(String[] args) { logger.silly("This is a silly log " + logsSeed); logger.info("This is an info log " + logsSeed); logger.verbose("This is a verbose log " + logsSeed); - + // Set and mutate metrics with seed int seedValue = Integer.parseInt(metricsSeed); metrics.set("users", seedValue); @@ -47,7 +46,7 @@ public static void main(String[] args) { } } } - + private static String getLogdashVersion() { try { return Check.class.getPackage().getImplementationVersion(); @@ -55,4 +54,4 @@ private static String getLogdashVersion() { return "unknown"; } } -} \ No newline at end of file +} diff --git a/pom.xml b/pom.xml index 8124c77..d9ec198 100644 --- a/pom.xml +++ b/pom.xml @@ -416,6 +416,13 @@ true 4 + + src/main/java/**/*.java + src/test/java/**/*.java + examples/**/src/main/java/**/*.java + examples/**/src/test/java/**/*.java + check-deployed-package/**/*.java + **/target/** **/generated/** @@ -425,6 +432,7 @@ **/*.md + examples/**/*.md @@ -446,6 +454,7 @@ pom.xml **/pom.xml + examples/**/pom.xml false From 11c8affe063181aac5b98881471d69479655a138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awomir=20Andreasik?= Date: Wed, 18 Jun 2025 20:00:13 +0200 Subject: [PATCH 05/12] test(spring-boot-example): add integration and controller tests --- .../example/controller/PetController.java | 23 +-- .../SpringBootExampleApplicationTest.java | 72 ++++++++ .../example/controller/PetControllerTest.java | 167 ++++++++++++++++++ .../src/test/resources/application-test.yml | 17 ++ 4 files changed, 262 insertions(+), 17 deletions(-) create mode 100644 examples/example-springboot/src/test/java/io/logdash/example/SpringBootExampleApplicationTest.java create mode 100644 examples/example-springboot/src/test/java/io/logdash/example/controller/PetControllerTest.java create mode 100644 examples/example-springboot/src/test/resources/application-test.yml diff --git a/examples/example-springboot/src/main/java/io/logdash/example/controller/PetController.java b/examples/example-springboot/src/main/java/io/logdash/example/controller/PetController.java index d6bd4c1..adc240f 100644 --- a/examples/example-springboot/src/main/java/io/logdash/example/controller/PetController.java +++ b/examples/example-springboot/src/main/java/io/logdash/example/controller/PetController.java @@ -4,6 +4,8 @@ import io.logdash.example.domain.PetType; import io.logdash.example.service.PetService; import io.logdash.sdk.Logdash; +import io.logdash.sdk.log.LogdashLogger; +import io.logdash.sdk.metrics.LogdashMetrics; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -16,18 +18,17 @@ public class PetController { private final PetService petService; - private final Logdash logdash; + private final LogdashLogger logger; + private final LogdashMetrics metrics; public PetController(PetService petService, Logdash logdash) { this.petService = petService; - this.logdash = logdash; + this.logger = logdash.logger(); + this.metrics = logdash.metrics(); } @GetMapping public ResponseEntity> getAllPets() { - var logger = logdash.logger(); - var metrics = logdash.metrics(); - var pets = petService.getAllPets(); logger.info("Retrieved all pets", Map.of( @@ -45,9 +46,6 @@ public ResponseEntity> getAllPets() { @GetMapping("/{id}") public ResponseEntity getPet(@PathVariable Long id) { - var logger = logdash.logger(); - var metrics = logdash.metrics(); - var pet = petService.findById(id); if (pet.isPresent()) { @@ -69,9 +67,6 @@ public ResponseEntity getPet(@PathVariable Long id) { @PostMapping public ResponseEntity createPet(@RequestBody CreatePetRequest request) { - var logger = logdash.logger(); - var metrics = logdash.metrics(); - try { var pet = petService.addPet(request.name(), request.type()); @@ -100,9 +95,6 @@ public ResponseEntity createPet(@RequestBody CreatePetRequest request) { @PostMapping("/random") public ResponseEntity createRandomPet() { - var logger = logdash.logger(); - var metrics = logdash.metrics(); - var pet = petService.createRandomPet(); logger.info("Random pet created", Map.of( @@ -120,9 +112,6 @@ public ResponseEntity createRandomPet() { @DeleteMapping("/{id}") public ResponseEntity deletePet(@PathVariable Long id) { - var logger = logdash.logger(); - var metrics = logdash.metrics(); - boolean deleted = petService.deletePet(id); if (deleted) { diff --git a/examples/example-springboot/src/test/java/io/logdash/example/SpringBootExampleApplicationTest.java b/examples/example-springboot/src/test/java/io/logdash/example/SpringBootExampleApplicationTest.java new file mode 100644 index 0000000..8191621 --- /dev/null +++ b/examples/example-springboot/src/test/java/io/logdash/example/SpringBootExampleApplicationTest.java @@ -0,0 +1,72 @@ +package io.logdash.example; + +import io.logdash.sdk.Logdash; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.http.HttpStatus; +import org.springframework.test.context.TestPropertySource; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@TestPropertySource(properties = { + "logdash.api-key=test-key", + "logdash.enable-console-output=false", + "logdash.enable-verbose-logging=false" +}) +class SpringBootExampleApplicationTest { + + @LocalServerPort + private int port; + + @Autowired + private TestRestTemplate restTemplate; + + @Autowired + private Logdash logdash; + + @Test + void should_start_application_context() { + assertThat(logdash).isNotNull(); + assertThat(logdash.logger()).isNotNull(); + assertThat(logdash.metrics()).isNotNull(); + } + + @Test + void should_get_all_pets() { + var response = restTemplate.getForEntity( + "http://localhost:" + port + "/api/pets", + String.class + ); + + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(response.getBody()).contains("Burek", "Mruczek", "Rex"); + } + + @Test + void should_create_random_pet() { + var response = restTemplate.postForEntity( + "http://localhost:" + port + "/api/pets/random", + null, + String.class + ); + + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(response.getBody()).isNotBlank(); + } + + @Test + void should_expose_actuator_health_endpoint() { + var response = restTemplate.getForEntity( + "http://localhost:" + port + "/actuator/health", + String.class + ); + + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(response.getBody()).contains("\"status\":\"UP\""); + } + +} diff --git a/examples/example-springboot/src/test/java/io/logdash/example/controller/PetControllerTest.java b/examples/example-springboot/src/test/java/io/logdash/example/controller/PetControllerTest.java new file mode 100644 index 0000000..09ac17a --- /dev/null +++ b/examples/example-springboot/src/test/java/io/logdash/example/controller/PetControllerTest.java @@ -0,0 +1,167 @@ +package io.logdash.example.controller; + +import io.logdash.example.domain.Pet; +import io.logdash.example.domain.PetType; +import io.logdash.example.service.PetService; +import io.logdash.sdk.log.LogdashLogger; +import io.logdash.sdk.metrics.LogdashMetrics; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.test.web.servlet.MockMvc; + +import java.util.List; +import java.util.Optional; + +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@WebMvcTest(PetController.class) +@TestPropertySource(properties = { + "logdash.api-key=test-key", + "logdash.enable-console-output=false" +}) +class PetControllerTest { + + @Autowired + private MockMvc mockMvc; + + @MockitoBean + private PetService petService; + + @MockitoBean + private LogdashLogger logger; + + @MockitoBean + private LogdashMetrics metrics; + + @Test + void should_get_all_pets() throws Exception { + // Given + var pets = List.of( + new Pet(1L, "Burek", PetType.DOG), + new Pet(2L, "Mruczek", PetType.CAT) + ); + given(petService.getAllPets()).willReturn(pets); + + // When & Then + mockMvc.perform(get("/api/pets")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$.length()").value(2)) + .andExpect(jsonPath("$[0].name").value("Burek")) + .andExpect(jsonPath("$[1].name").value("Mruczek")); + + // Verify logging and metrics + verify(logger).info(eq("Retrieved all pets"), anyMap()); + verify(metrics).mutate("api.requests.total", 1); + verify(metrics).mutate("api.pets.list.requests", 1); + verify(metrics).set("pets.total.count", 2); + } + + @Test + void should_get_pet_by_id() throws Exception { + // Given + var pet = new Pet(1L, "Burek", PetType.DOG); + given(petService.findById(1L)).willReturn(Optional.of(pet)); + + // When & Then + mockMvc.perform(get("/api/pets/1")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(1)) + .andExpect(jsonPath("$.name").value("Burek")) + .andExpect(jsonPath("$.type").value("DOG")); + + // Verify logging and metrics + verify(logger).debug(eq("Fetching pet with id: {}"), anyMap()); + verify(logger).info(eq("Pet found"), anyMap()); + verify(metrics).mutate("api.pets.found", 1); + } + + @Test + void should_return_not_found_for_non_existent_pet() throws Exception { + // Given + given(petService.findById(999L)).willReturn(Optional.empty()); + + // When & Then + mockMvc.perform(get("/api/pets/999")) + .andExpect(status().isNotFound()); + + // Verify logging and metrics + verify(logger).debug(eq("Fetching pet with id: {}"), anyMap()); + verify(logger).warn(eq("Pet not found"), anyMap()); + verify(metrics).mutate("api.pets.not_found", 1); + } + + @Test + void should_create_random_pet() throws Exception { + // Given + var pet = new Pet(3L, "Lucky", PetType.DOG); + given(petService.createRandomPet()).willReturn(pet); + + // When & Then + mockMvc.perform(post("/api/pets/random")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(3)) + .andExpect(jsonPath("$.name").value("Lucky")) + .andExpect(jsonPath("$.type").value("DOG")); + + // Verify logging and metrics + verify(logger).info(eq("Created random pet"), anyMap()); + verify(metrics).mutate("api.pets.created", 1); + verify(metrics).mutate("api.pets.random.created", 1); + } + + @Test + void should_create_pet_with_valid_request() throws Exception { + // Given + var pet = new Pet(4L, "Bella", PetType.CAT); + given(petService.addPet("Bella", PetType.CAT)).willReturn(pet); + + // When & Then + mockMvc.perform(post("/api/pets") + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "name": "Bella", + "type": "CAT" + } + """)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(4)) + .andExpect(jsonPath("$.name").value("Bella")) + .andExpect(jsonPath("$.type").value("CAT")); + + // Verify logging and metrics + verify(logger).info(eq("Created pet"), anyMap()); + verify(metrics).mutate("api.pets.created", 1); + verify(metrics).mutate("api.pets.manual.created", 1); + } + + @Test + void should_handle_delete_pet() throws Exception { + // Given + given(petService.deletePet(1L)).willReturn(true); + + // When & Then + mockMvc.perform(delete("/api/pets/1")) + .andExpect(status().isNoContent()); + } + + @Test + void should_handle_delete_non_existent_pet() throws Exception { + // Given + given(petService.deletePet(999L)).willReturn(false); + + // When & Then + mockMvc.perform(delete("/api/pets/999")) + .andExpect(status().isNotFound()); + } +} diff --git a/examples/example-springboot/src/test/resources/application-test.yml b/examples/example-springboot/src/test/resources/application-test.yml new file mode 100644 index 0000000..4e99e94 --- /dev/null +++ b/examples/example-springboot/src/test/resources/application-test.yml @@ -0,0 +1,17 @@ +spring: + main: + banner-mode: off + output: + ansi: + enabled: never + +logdash: + api-key: test-key + enable-console-output: false + enable-verbose-logging: false + +logging: + level: + io.logdash.example: WARN + org.springframework: WARN + org.mockito: WARN From 94d1715bf5decaa3dcbbbac591d82adce9ff77ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awomir=20Andreasik?= Date: Wed, 18 Jun 2025 20:01:02 +0200 Subject: [PATCH 06/12] build(spring-boot-example): update compiler settings and add snapshot repo --- examples/example-springboot/pom.xml | 86 +++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/examples/example-springboot/pom.xml b/examples/example-springboot/pom.xml index aeda8e5..83fb5e4 100644 --- a/examples/example-springboot/pom.xml +++ b/examples/example-springboot/pom.xml @@ -19,6 +19,11 @@ 21 + 21 + 21 + 21 + + 0.2.0-SNAPSHOT @@ -48,6 +53,22 @@ + + + + + false + + + true + interval:60 + + maven-central-snapshots + Maven Central Snapshots + https://central.sonatype.com/repository/maven-snapshots/ + + + @@ -57,6 +78,71 @@ io.logdash.example.SpringBootExampleApplication + + + org.apache.maven.plugins + maven-compiler-plugin + + 21 + + -parameters + -Xlint:unchecked + -Xlint:deprecation + + + + + + org.apache.maven.plugins + maven-help-plugin + 3.5.1 + + + + + local-dev + + true + + + + + never + + maven-central-snapshots + https://central.sonatype.com/repository/maven-snapshots/ + + + + + + force-remote + + + + org.apache.maven.plugins + maven-dependency-plugin + + + purge-local-logdash + + purge-local-repository + + initialize + + + io.logdash:logdash + + true + + + + + + + + + From 42123826cc771493e22a4aa972aeb2a3c477b6a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awomir=20Andreasik?= Date: Wed, 18 Jun 2025 20:30:07 +0200 Subject: [PATCH 07/12] build(spring-boot-example): update Maven plugin versions and compiler args --- check-deployed-package/pom.xml | 21 +++++++++++++------ examples/example-simple-java/pom.xml | 6 +++++- examples/example-springboot/pom.xml | 17 ++++++++++----- .../logdash/example/service/PetService.java | 2 +- .../SpringBootExampleApplicationTest.java | 2 +- pom.xml | 2 +- 6 files changed, 35 insertions(+), 15 deletions(-) diff --git a/check-deployed-package/pom.xml b/check-deployed-package/pom.xml index 97cbe09..fbcf5cc 100644 --- a/check-deployed-package/pom.xml +++ b/check-deployed-package/pom.xml @@ -1,13 +1,16 @@ 4.0.0 + io.logdash check 0.2.0-SNAPSHOT - 17 - 17 + 17 + ${java.version} + ${java.version} + ${java.version} UTF-8 @@ -38,16 +41,22 @@ org.apache.maven.plugins maven-compiler-plugin - 3.11.0 + 3.12.1 - 17 - 17 + ${java.version} + + -parameters + -Xlint:unchecked + -Xlint:deprecation + -Werror + + org.codehaus.mojo exec-maven-plugin - 3.1.0 + 3.1.1 io.logdash.check.Check diff --git a/examples/example-simple-java/pom.xml b/examples/example-simple-java/pom.xml index e3474c8..9a0afe3 100644 --- a/examples/example-simple-java/pom.xml +++ b/examples/example-simple-java/pom.xml @@ -1,5 +1,5 @@ - + 4.0.0 com.example @@ -32,6 +32,7 @@ + org.apache.maven.plugins maven-compiler-plugin @@ -40,6 +41,9 @@ ${maven.compiler.release} -parameters + -Xlint:unchecked + -Xlint:deprecation + -Werror diff --git a/examples/example-springboot/pom.xml b/examples/example-springboot/pom.xml index 83fb5e4..e5fbe15 100644 --- a/examples/example-springboot/pom.xml +++ b/examples/example-springboot/pom.xml @@ -19,12 +19,16 @@ 21 - 21 - 21 - 21 + ${java.version} + ${java.version} + ${java.version} + UTF-8 0.2.0-SNAPSHOT + + + 3.5.1 @@ -79,15 +83,18 @@ + org.apache.maven.plugins maven-compiler-plugin + ${maven-compiler-plugin.version} - 21 + ${java.version} -parameters -Xlint:unchecked -Xlint:deprecation + -Werror @@ -95,7 +102,7 @@ org.apache.maven.plugins maven-help-plugin - 3.5.1 + ${maven-help-plugin.version} diff --git a/examples/example-springboot/src/main/java/io/logdash/example/service/PetService.java b/examples/example-springboot/src/main/java/io/logdash/example/service/PetService.java index 2899050..c346210 100644 --- a/examples/example-springboot/src/main/java/io/logdash/example/service/PetService.java +++ b/examples/example-springboot/src/main/java/io/logdash/example/service/PetService.java @@ -21,7 +21,7 @@ public class PetService { public PetService() { addPet("Burek", PetType.DOG); addPet("Mruczek", PetType.CAT); - addPet("Rex", PetType.DOG); + addPet("Olek", PetType.BIRD); } public Pet addPet(String name, PetType type) { diff --git a/examples/example-springboot/src/test/java/io/logdash/example/SpringBootExampleApplicationTest.java b/examples/example-springboot/src/test/java/io/logdash/example/SpringBootExampleApplicationTest.java index 8191621..a996ba5 100644 --- a/examples/example-springboot/src/test/java/io/logdash/example/SpringBootExampleApplicationTest.java +++ b/examples/example-springboot/src/test/java/io/logdash/example/SpringBootExampleApplicationTest.java @@ -43,7 +43,7 @@ void should_get_all_pets() { ); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(response.getBody()).contains("Burek", "Mruczek", "Rex"); + assertThat(response.getBody()).contains("Burek", "Mruczek", "Olek"); } @Test diff --git a/pom.xml b/pom.xml index d9ec198..eba0d35 100644 --- a/pom.xml +++ b/pom.xml @@ -178,7 +178,7 @@ maven-compiler-plugin ${maven-compiler-plugin.version} - ${java.version} + ${maven.compiler.release} -parameters -Xlint:unchecked From a299ec58b3f4663cb42f8584e7c570d1b0182644 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awomir=20Andreasik?= Date: Wed, 18 Jun 2025 20:31:17 +0200 Subject: [PATCH 08/12] chore(scripts): add dev-cycle.sh for local build and test --- scripts/dev-cycle.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100755 scripts/dev-cycle.sh diff --git a/scripts/dev-cycle.sh b/scripts/dev-cycle.sh new file mode 100755 index 0000000..4322e7f --- /dev/null +++ b/scripts/dev-cycle.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -e + +echo "🔧 Building local Logdash SDK..." +mvn clean install -DskipTests + +echo "🚀 Testing SpringBoot example with local snapshot..." +cd examples/example-springboot +mvn clean spring-boot:run -Plocal-dev + +echo "✅ Development cycle completed!" From a9d84623c7336fc89ff4bc27833047ab32e0a10f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awomir=20Andreasik?= Date: Wed, 18 Jun 2025 20:59:15 +0200 Subject: [PATCH 09/12] docs: update readme --- README.md | 69 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index baf1075..67a784e 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,19 @@ # Logdash Java SDK [![GitHub Release](https://img.shields.io/github/v/release/logdash-io/java-sdk)](https://github.com/logdash-io/java-sdk/releases) +[![Maven Central](https://img.shields.io/maven-central/v/io.logdash/logdash)](https://central.sonatype.com/artifact/io.logdash/logdash) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Java Version](https://img.shields.io/badge/Java-17+-blue.svg)](https://openjdk.java.net/projects/jdk/17/) [![CI/CD](https://github.com/logdash-io/java-sdk/workflows/CI/CD%20Pipeline/badge.svg)](https://github.com/logdash-io/java-sdk/actions) +[![Coverage](https://img.shields.io/codecov/c/github/logdash-io/java-sdk)](https://codecov.io/gh/logdash-io/java-sdk) -Official Java SDK for [Logdash.io](https://logdash.io/) - Zero-configuration observability platform designed for developers working on side projects and prototypes. +> **Official Java SDK for [Logdash.io](https://logdash.io/) - Zero-configuration observability platform designed for developers working on side projects and prototypes.** ## Why Logdash? -Most observability solutions feel overwhelming for hobby projects. Logdash provides instant logging and real-time -metrics without complex configurations. Just add the SDK and start monitoring your application immediately. +Most observability solutions feel overwhelming for small projects and prototypes. Logdash provides **instant logging and real-time metrics** without complex configurations. Just add the SDK and start monitoring your application immediately. -## Features +## Key Features - **🚀 Zero Configuration**: Start logging and tracking metrics in seconds - **📊 Real-time Dashboard**: Cloud-hosted interface with live data updates @@ -23,15 +24,13 @@ metrics without complex configurations. Just add the SDK and start monitoring yo - **🔧 Framework Agnostic**: Works with Spring Boot, Quarkus, Micronaut, or standalone apps - **☕ Java 17+ Compatible**: Supports Java 17, 21, and all newer versions -## Quick Start - -### Installation +## Pre-requisites -**Maven Central** +Setup your free project in less than 2 minutes at [logdash.io](https://logdash.io/) -Add the dependency to your project: +## Installation -**Maven:** +### Maven Central ```xml @@ -41,15 +40,15 @@ Add the dependency to your project: ``` -**Gradle:** +### Gradle -```gradle +```groovy dependencies { implementation 'io.logdash:logdash:0.2.0-SNAPSHOT' } ``` -**Gradle (Kotlin DSL):** +### Gradle (Kotlin DSL) ```kotlin dependencies { @@ -57,7 +56,7 @@ dependencies { } ``` -**Local Installation** +### Local Installation ```bash # Clone and install locally @@ -76,6 +75,8 @@ Then use in your project: ``` +## Quick Start + ### Basic Usage ```java @@ -270,10 +271,10 @@ Track business and technical metrics to monitor application performance: var metrics = logdash.metrics(); // Counters - track events and occurrences -metrics.mutate("page_views",1); -metrics.mutate("api_requests",5); -metrics.mutate("response_time_ms",-100); -metrics.mutate("available_licenses",-1); +metrics.mutate("page_views", 1); +metrics.mutate("api_requests", 5); +metrics.mutate("response_time_ms", -100); +metrics.mutate("available_licenses", -1); // Gauges - track current values metrics.set("active_users", 1_250); @@ -281,6 +282,14 @@ metrics.set("memory_usage_mb", 512.5); metrics.set("queue_size", 0); ``` +## View Your Data + +To see the logs or metrics, go to your project dashboard at [logdash.io](https://logdash.io/app/clusters) + +![Logs Dashboard](docs/images/logs.png) + +![Metrics Dashboard](docs/images/delta.png) + ## Configuration ### Development Configuration @@ -306,9 +315,11 @@ Logdash logdash = Logdash.builder() .build(); ``` +## Configuration + ### All Configuration Options -| Option | Default | Description | +| Parameter | Default | Description | |-------------------------|--------------------------|----------------------------------| | `apiKey` | `null` | Your Logdash API key (required) | | `baseUrl` | `https://api.logdash.io` | Logdash API endpoint | @@ -371,7 +382,7 @@ Check out the [`examples/`](./examples) directory for a complete sample applicat - **Java 17 or higher** (tested on Java 17, 21, 22) - **Internet connection** for sending data to Logdash -- **Valid API key** from [Logdash.io](https://logdash.io) +- **Valid API key** from [logdash.io](https://logdash.io) ## Contributing @@ -383,7 +394,6 @@ We welcome contributions! Here's how to get started: git clone https://github.com/logdash-io/java-sdk.git cd java-sdk mvn clean compile -mvn test ``` ### Running Tests @@ -401,11 +411,26 @@ mvn clean verify ### Code Quality -- Follow existing code style (checkstyle configuration included) +- Follow existing code style - Ensure all tests pass - Add tests for new features - Update documentation as needed +### GitFlow Workflow + +```bash +# Start new feature +git checkout develop && git pull origin develop +git checkout -b feat/awesome-feature + +# Development and testing +mvn clean verify +git add . && git commit -m "feat: add awesome feature" +git push origin feat/awesome-feature + +# Create pull request to develop branch +``` + ## License This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. From 06c767ec937db580995e0e109f46d1f7d672c6bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awomir=20Andreasik?= Date: Wed, 18 Jun 2025 21:01:33 +0200 Subject: [PATCH 10/12] docs: update readme --- README.md | 14 +++++++------- docs/images/delta.png | Bin 0 -> 85468 bytes docs/images/logs.png | Bin 0 -> 66488 bytes 3 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 docs/images/delta.png create mode 100644 docs/images/logs.png diff --git a/README.md b/README.md index 67a784e..33ff72c 100644 --- a/README.md +++ b/README.md @@ -409,13 +409,6 @@ mvn failsafe:integration-test mvn clean verify ``` -### Code Quality - -- Follow existing code style -- Ensure all tests pass -- Add tests for new features -- Update documentation as needed - ### GitFlow Workflow ```bash @@ -431,6 +424,13 @@ git push origin feat/awesome-feature # Create pull request to develop branch ``` +### Code Quality + +- Follow existing code style +- Ensure all tests pass +- Add tests for new features +- Update documentation as needed + ## License This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. diff --git a/docs/images/delta.png b/docs/images/delta.png new file mode 100644 index 0000000000000000000000000000000000000000..b311d3d127514adad88a80a67757593026ef71db GIT binary patch literal 85468 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�~{`P3`0E@5ZTVu>fZdXIseTSwY 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 Date: Wed, 18 Jun 2025 21:12:53 +0200 Subject: [PATCH 11/12] docs: update readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 33ff72c..68574c2 100644 --- a/README.md +++ b/README.md @@ -288,7 +288,7 @@ To see the logs or metrics, go to your project dashboard at [logdash.io](https:/ ![Logs Dashboard](docs/images/logs.png) -![Metrics Dashboard](docs/images/delta.png) +![Metrics Dashboard](docs/images/delta.png) ## Configuration @@ -413,7 +413,7 @@ mvn clean verify ```bash # Start new feature -git checkout develop && git pull origin develop +git checkout dev && git pull origin dev git checkout -b feat/awesome-feature # Development and testing @@ -421,7 +421,7 @@ mvn clean verify git add . && git commit -m "feat: add awesome feature" git push origin feat/awesome-feature -# Create pull request to develop branch +# Create pull request to dev branch ``` ### Code Quality From fddecf26d2f923bff8b88561b14e6df3141775a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awomir=20Andreasik?= Date: Wed, 18 Jun 2025 21:34:22 +0200 Subject: [PATCH 12/12] chore: prepare release 0.2.0 --- README.md | 8 ++++---- check-deployed-package/pom.xml | 4 ++-- examples/example-simple-java/pom.xml | 4 ++-- examples/example-springboot/pom.xml | 4 ++-- pom.xml | 2 +- src/main/java/io/logdash/sdk/transport/HttpTransport.java | 2 +- .../java/io/logdash/sdk/transport/HttpTransportTest.java | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 68574c2..af05125 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Setup your free project in less than 2 minutes at [logdash.io](https://logdash.i io.logdash logdash - 0.2.0-SNAPSHOT + 0.2.0 ``` @@ -44,7 +44,7 @@ Setup your free project in less than 2 minutes at [logdash.io](https://logdash.i ```groovy dependencies { - implementation 'io.logdash:logdash:0.2.0-SNAPSHOT' + implementation 'io.logdash:logdash:0.2.0' } ``` @@ -52,7 +52,7 @@ dependencies { ```kotlin dependencies { - implementation("io.logdash:logdash:0.2.0-SNAPSHOT") + implementation("io.logdash:logdash:0.2.0") } ``` @@ -71,7 +71,7 @@ Then use in your project: io.logdash logdash - 0.2.0-SNAPSHOT + 0.2.0 ``` diff --git a/check-deployed-package/pom.xml b/check-deployed-package/pom.xml index fbcf5cc..9bed4ed 100644 --- a/check-deployed-package/pom.xml +++ b/check-deployed-package/pom.xml @@ -4,7 +4,7 @@ io.logdash check - 0.2.0-SNAPSHOT + 0.2.0 17 @@ -18,7 +18,7 @@ io.logdash logdash - 0.2.0-SNAPSHOT + 0.2.0 diff --git a/examples/example-simple-java/pom.xml b/examples/example-simple-java/pom.xml index 9a0afe3..ff4b4f7 100644 --- a/examples/example-simple-java/pom.xml +++ b/examples/example-simple-java/pom.xml @@ -4,7 +4,7 @@ com.example logdash-example - 0.2.0-SNAPSHOT + 0.2.0 jar Logdash Example Application @@ -19,7 +19,7 @@ 3.12.1 3.1.1 - 0.2.0-SNAPSHOT + 0.2.0 diff --git a/examples/example-springboot/pom.xml b/examples/example-springboot/pom.xml index e5fbe15..79788d6 100644 --- a/examples/example-springboot/pom.xml +++ b/examples/example-springboot/pom.xml @@ -11,7 +11,7 @@ io.logdash.example springboot-example - 0.2.0-SNAPSHOT + 0.2.0 jar Logdash Spring Boot Example @@ -25,7 +25,7 @@ UTF-8 - 0.2.0-SNAPSHOT + 0.2.0 3.5.1 diff --git a/pom.xml b/pom.xml index eba0d35..dbc609e 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ io.logdash logdash - 0.2.0-SNAPSHOT + 0.2.0 jar Logdash Java SDK diff --git a/src/main/java/io/logdash/sdk/transport/HttpTransport.java b/src/main/java/io/logdash/sdk/transport/HttpTransport.java index 07894f4..217537b 100644 --- a/src/main/java/io/logdash/sdk/transport/HttpTransport.java +++ b/src/main/java/io/logdash/sdk/transport/HttpTransport.java @@ -38,7 +38,7 @@ public final class HttpTransport implements LogdashTransport, AutoCloseable { private static final String METRICS_ENDPOINT = "/metrics"; private static final String API_KEY_HEADER = "project-api-key"; - private static final String USER_AGENT = "logdash-java-sdk/0.2.0-SNAPSHOT"; + private static final String USER_AGENT = "logdash-java-sdk/0.2.0"; private static final String CONTENT_TYPE = "application/json"; private final LogdashConfig config; diff --git a/src/test/java/io/logdash/sdk/transport/HttpTransportTest.java b/src/test/java/io/logdash/sdk/transport/HttpTransportTest.java index 56b03b0..1f73fd0 100644 --- a/src/test/java/io/logdash/sdk/transport/HttpTransportTest.java +++ b/src/test/java/io/logdash/sdk/transport/HttpTransportTest.java @@ -82,7 +82,7 @@ void should_successfully_send_log_entry() { postRequestedFor(urlEqualTo("/logs")) .withHeader("Content-Type", equalTo("application/json")) .withHeader("project-api-key", equalTo("test-api-key")) - .withHeader("User-Agent", equalTo("logdash-java-sdk/0.2.0-SNAPSHOT"))); + .withHeader("User-Agent", equalTo("logdash-java-sdk/0.2.0"))); } @Test @@ -105,7 +105,7 @@ void should_successfully_send_metric_entry() { putRequestedFor(urlEqualTo("/metrics")) .withHeader("Content-Type", equalTo("application/json")) .withHeader("project-api-key", equalTo("test-api-key")) - .withHeader("User-Agent", equalTo("logdash-java-sdk/0.2.0-SNAPSHOT"))); + .withHeader("User-Agent", equalTo("logdash-java-sdk/0.2.0"))); } @ParameterizedTest