Java

Java remains a core language for enterprise DevOps and SRE teams, powering cloud-native microservices, automation tools, and CI/CD pipelines across AWS, Azure, and GCP. Its mature ecosystem, JVM portability, and robust frameworks make it ideal for building scalable, observable, and secure applications.

Why DevOps & SREs Should Learn Java

  • Cloud-Native: Java frameworks (Spring Boot, Quarkus, Micronaut) are optimized for Kubernetes, Docker, and serverless deployments.

  • Observability: Strong support for metrics (Micrometer, Prometheus), distributed tracing (OpenTelemetry, Jaeger), and logging (SLF4J, Logback).

  • CI/CD Integration: Java projects integrate seamlessly with GitHub Actions, Azure Pipelines, and GitLab CI/CD.

  • Cross-Platform: JVM runs on Linux, NixOS, WSL, and all major clouds.

  • LLM Integration: Java can call LLM APIs (OpenAI, Azure OpenAI) for automation, code review, and incident summarization.

Real-Life DevOps & SRE Examples

1. Spring Boot REST API with Health Checks

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;

@RestController
public class HealthController {
    @GetMapping("/health")
    public String health() {
        return "OK";
    }
}

2. Dockerfile for Cloud-Native Java App

FROM eclipse-temurin:17-jre-alpine
COPY target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

3. Prometheus Metrics with Micrometer

import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;

@RestController
public class MetricsController {
    private final MeterRegistry registry;
    public MetricsController(MeterRegistry registry) {
        this.registry = registry;
    }
    @GetMapping("/custom-metric")
    public String customMetric() {
        registry.counter("custom_requests_total").increment();
        return "Metric incremented!";
    }
}

4. CI/CD Pipeline (GitHub Actions)

name: Java CI/CD
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-java@v3
        with:
          distribution: 'temurin'
          java-version: '17'
      - name: Build with Maven
        run: mvn clean install
      - name: Run Tests
        run: mvn test
      - name: Build Docker Image
        run: docker build -t myorg/myapp:${{ github.sha }} .

5. LLM Integration for Incident Summaries

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class LLMIntegration {
    public static void main(String[] args) throws Exception {
        String logContents = "Example incident log contents";
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://api.openai.com/v1/chat/completions"))
            .header("Authorization", "Bearer sk-...")
            .header("Content-Type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString("{" +
                "\"model\":\"gpt-4\"," +
                "\"messages\":[{" +
                    "\"role\":\"system\",\"content\":\"Summarize this incident log for SREs.\"},{" +
                    "\"role\":\"user\",\"content\":\"" + logContents + "\"}]}"))
            .build();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}

Best Practices (2025)

  • Use Spring Boot or Quarkus for cloud-native microservices

  • Containerize apps with multi-stage Dockerfiles

  • Expose health and metrics endpoints for observability

  • Integrate with CI/CD for automated testing and deployment

  • Store secrets in environment variables or secret managers

  • Use OpenTelemetry for distributed tracing

  • Write unit and integration tests (JUnit, Testcontainers)

Common Pitfalls

  • Hardcoding credentials in code or configs

  • Not exposing health/metrics endpoints

  • Ignoring JVM resource limits in containers

  • Overlooking dependency updates (use Dependabot or Renovate)

  • Not monitoring application logs and metrics

References


Java Joke: Why did the SRE refuse to use Java for their scripts? Too many exceptions in production!

Last updated