Skip to main content

Java / Spring Boot Integration Guide

Overview

This guide explains how to integrate the AmpliServ Backend SDK with your Spring Boot application. The integration enables JSON logging, correlation ID propagation, and automatic log collection.

Prerequisites

  • Java 11 or higher
  • Spring Boot 2.x or 3.x
  • Maven or Gradle
  • AmpliServ SDK binary

Step 1: Add Dependencies

Maven (pom.xml)

<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- JSON Logging - Required for AmpliServ SDK -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.4</version>
</dependency>

<!-- For Correlation ID (Optional but Recommended) -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
</dependencies>

Gradle (build.gradle)

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'net.logstash.logback:logstash-logback-encoder:7.4'
}

Step 2: Configure JSON Logging

Create src/main/resources/logback-spring.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- JSON appender for AmpliServ SDK -->
<appender name="JSON_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<includeMdc>true</includeMdc>
<includeCallerData>true</includeCallerData>
</encoder>
</appender>

<!-- Console appender for debugging -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>

<root level="INFO">
<appender-ref ref="JSON_FILE"/>
<appender-ref ref="CONSOLE"/>
</root>
</configuration>

Step 3: Configure application.yml

spring:
application:
name: your-springboot-app

server:
port: 8080

logging:
file:
name: ./app.log
level:
root: INFO
com.yourcompany: DEBUG

Step 4: Add Correlation ID Filter (Optional)

Create src/main/java/com/yourcompany/filter/CorrelationIdFilter.java:

package com.yourcompany.filter;

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.MDC;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.UUID;

@Component
@Order(1)
public class CorrelationIdFilter implements Filter {

private static final String CORRELATION_ID_HEADER = "X-Correlation-ID";
private static final String CORRELATION_ID_MDC = "correlation_id";

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {

HttpServletRequest httpRequest = (HttpServletRequest) request;

String correlationId = httpRequest.getHeader(CORRELATION_ID_HEADER);
if (correlationId == null || correlationId.isEmpty()) {
correlationId = UUID.randomUUID().toString();
}

MDC.put(CORRELATION_ID_MDC, correlationId);

if (response instanceof HttpServletResponse httpResponse) {
httpResponse.setHeader(CORRELATION_ID_HEADER, correlationId);
}

try {
chain.doFilter(request, response);
} finally {
MDC.clear();
}
}
}

Step 5: Add Global Exception Handler

Create src/main/java/com/yourcompany/exception/GlobalExceptionHandler.java:

package com.yourcompany.exception;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

@RestControllerAdvice
public class GlobalExceptionHandler {

private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

@ExceptionHandler(Exception.class)
public ResponseEntity<Map<String, Object>> handleAllExceptions(Exception ex) {
// Full stack trace will be captured here
logger.error("Exception occurred: {}", ex.getMessage(), ex);

Map<String, Object> response = new HashMap<>();
response.put("timestamp", LocalDateTime.now());
response.put("message", ex.getMessage());
response.put("status", HttpStatus.INTERNAL_SERVER_ERROR.value());

return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
}
}

Step 6: Add Test Endpoint (Optional)

Create src/main/java/com/yourcompany/controller/TestController.java:

package com.yourcompany.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
@RequestMapping("/api/test")
public class TestController {

private static final Logger logger = LoggerFactory.getLogger(TestController.class);

@GetMapping("/error")
public ResponseEntity<Map<String, Object>> testError() {
logger.info("Test error endpoint called");

try {
simulateDeepError();
} catch (Exception e) {
logger.error("Test error occurred: {}", e.getMessage(), e);
return ResponseEntity.status(500).body(Map.of("message", "Error triggered"));
}

return ResponseEntity.ok(Map.of("message", "No error"));
}

private void simulateDeepError() {
throw new RuntimeException("This is a test error with deep stack trace!");
}
}

Step 7: Configure AmpliServ SDK

Create run-agent.bat (Windows) or run-agent.sh (Linux/Mac):

#!/bin/bash
export AMPLISERV_API_KEY="your-api-key-here"
export AMPLISERV_COLLECTOR_MODE="file"
export AMPLISERV_ENDPOINT="http://dev-backend.ampliserv.com/api/ingestion/v1/ingest"
export AMPLISERV_SERVICE_NAME="ingestion-service"
export AMPLISERV_ENV="development"
export AMPLISERV_LOG_PATH="./app.log"
export AMPLISERV_BATCH_SIZE="50"
export AMPLISERV_FLUSH_INTERVAL_SEC="5"
export AMPLISERV_INCIDENT_ENABLED="true"

./ampliserv-agent

Step 8: Run the Integration

Terminal 1: Start Spring Boot Application

mvn spring-boot:run
# OR
java -jar target/your-app.jar

Terminal 2: Start AmpliServ SDK

chmod +x run-agent.sh
./run-agent.sh

Terminal 3: Test the Integration

# Test normal endpoint
curl http://localhost:8080/api/test/info

# Test error endpoint (generates stack trace)
curl http://localhost:8080/api/test/error

Sample JSON Log Output

{
"@timestamp": "2026-03-23T10:30:45.123+05:30",
"message": "Test error occurred: This is a test error with deep stack trace!",
"logger_name": "com.yourcompany.controller.TestController",
"level": "ERROR",
"correlation_id": "a1270278-7ef9-4e59-803e-e9862c257d73",
"stack_trace": "java.lang.RuntimeException: This is a test error...\n\tat com.yourcompany.controller.TestController.simulateDeepError(TestController.java:45)\n\t..."
}

Verification Checklist

  • Spring Boot starts without errors
  • app.log file is created with JSON content
  • AmpliServ SDK shows "Starting AmpliServ Agent"
  • SDK displays "Mode: file"
  • Test endpoint logs appear in SDK terminal
  • Stack traces are visible in logs

Common Issues

IssueSolution
Log file not createdCheck write permissions in application directory
JSON parsing errorsEnsure logback-spring.xml uses LogstashEncoder
SDK can't read fileRun SDK with same user as Spring Boot
Correlation ID missingVerify CorrelationIdFilter is registered

Next Steps

  • Configure production deployment
  • Set up alerting on incidents
  • Create custom dashboards