Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
0e72806
feat: upgrade Spring Boot to v4.0.0 and Spring AI to v2.0.0-M1, refac…
adityamparikh Dec 13, 2025
d4b1729
chore: jspecify is now built in to spring boot 4
adityamparikh Dec 13, 2025
d93cb7a
fix: update JsonDocumentCreator to return value asString instead of a…
adityamparikh Dec 13, 2025
c197dbe
feat: Add security and docs (#17)
adityamparikh Dec 16, 2025
8573ecd
chore: spotless apply (#27)
adityamparikh Dec 16, 2025
5e8a549
feat: spring-boot 4.0.2, spring-ai 2.0.0-M2, mcp-server-security 0.0.6
adityamparikh Jan 25, 2026
61119c0
fix: stateless now works
adityamparikh Jan 25, 2026
12e55c3
feat(observability): add OpenTelemetry for metrics, traces, and logs …
adityamparikh Jan 8, 2026
40e01aa
fix(observability): disable Spring Boot auto-config for lgtm service
adityamparikh Jan 8, 2026
fe1cd96
fix(observability): use Docker Compose auto-configuration for OTLP
adityamparikh Jan 8, 2026
a09dd6a
fix(observability): resolve OTLP configuration and add security bypass
adityamparikh Jan 8, 2026
48168b7
fix: exclude MongoDB from spring-ai-docker-compose dependency
adityamparikh Jan 8, 2026
143d335
fix: resolve protobuf NoSuchMethodError with opentelemetry-proto
adityamparikh Jan 8, 2026
0fc55db
feat(observability): add AspectJ for @Observed support and fix logging
adityamparikh Jan 8, 2026
d503966
fix: migrate ObjectMapper imports from Jackson 2 to Jackson 3
adityamparikh Feb 4, 2026
1411dee
feat: upgrade Spring Boot to v4.0.0 and Spring AI to v2.0.0-M1, refac…
adityamparikh Dec 13, 2025
5138f6d
chore: jspecify is now built in to spring boot 4
adityamparikh Dec 13, 2025
aa4c26c
fix: update JsonDocumentCreator to return value asString instead of a…
adityamparikh Dec 13, 2025
12357b8
feat: Add security and docs (#17)
adityamparikh Dec 16, 2025
baf5362
chore: spotless apply (#27)
adityamparikh Dec 16, 2025
098b552
feat: spring-boot 4.0.2, spring-ai 2.0.0-M2, mcp-server-security 0.0.6
adityamparikh Jan 25, 2026
c0cc1b8
feat(observability): add OpenTelemetry for metrics, traces, and logs …
adityamparikh Jan 8, 2026
73f2335
fix(observability): disable Spring Boot auto-config for lgtm service
adityamparikh Jan 8, 2026
793fed3
fix(observability): use Docker Compose auto-configuration for OTLP
adityamparikh Jan 8, 2026
41c07ec
fix(observability): resolve OTLP configuration and add security bypass
adityamparikh Jan 8, 2026
f20b590
fix: exclude MongoDB from spring-ai-docker-compose dependency
adityamparikh Jan 8, 2026
084818b
fix: resolve protobuf NoSuchMethodError with opentelemetry-proto
adityamparikh Jan 8, 2026
bfc27c2
feat(observability): add AspectJ for @Observed support and fix logging
adityamparikh Jan 8, 2026
a03ca9d
fix: migrate ObjectMapper imports from Jackson 2 to Jackson 3
adityamparikh Feb 4, 2026
23e2c40
fix(observability): update OTLP endpoint configuration for LGTM conta…
adityamparikh Feb 4, 2026
3ee09ab
Merge remote-tracking branch 'origin/sb4' into sb4
adityamparikh Feb 4, 2026
9a771dd
chore: add .worktrees/ to .gitignore for isolated workspaces
adityamparikh Feb 5, 2026
a5ec103
feat(observability): add distributed tracing tests and tracing utilities
adityamparikh Feb 5, 2026
42eab18
feat(observability): enhance OpenTelemetry integration with new depen…
adityamparikh Feb 5, 2026
6d4c4db
feat(observability): add tests for logs and metrics for http mode
adityamparikh Feb 5, 2026
2aed980
feat(observability): migrate HttpClient to RestClient for LGTM stack …
adityamparikh Feb 5, 2026
db3af4d
fix(quality): add logging for swallowed exceptions, fix type safety, …
claude Feb 6, 2026
86a97de
fix(quality): resolve SonarQube violations
adityamparikh Mar 9, 2026
c86684f
merge: sync with upstream/main (observability + docs)
adityamparikh Mar 10, 2026
c32234f
fix(build): remove duplicate entries in libs.versions.toml
adityamparikh Mar 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,6 @@ out/
.env
.auth-token
*.token

### Git worktrees ###
.worktrees/
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ A Spring AI Model Context Protocol (MCP) server that provides tools for interact
- 🔧 Inspect schema
- 🔌 Transports: STDIO (Claude Desktop) and HTTP (MCP Inspector)
- 🔐 OAuth2 security with Auth0 (HTTP mode only)
- 📈 OpenTelemetry observability: metrics, traces, logs (HTTP mode only)
- 🐳 Docker images built with Jib

## Get started (users)
Expand Down Expand Up @@ -379,6 +380,7 @@ The `solr://{collection}/schema` resource supports autocompletion for the `{coll
## Documentation

- [Auth0 Setup (OAuth2 configuration)](docs/AUTH0_SETUP.md)
- [Observability Guide (metrics, traces, logs)](dev-docs/Observability.md)

## Contributing

Expand Down
Empty file added arconia-cli.log
Empty file.
34 changes: 28 additions & 6 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -87,22 +87,25 @@ configurations {

repositories {
mavenCentral()
maven { url = uri("https://repo.spring.io/milestone") }
}

dependencies {

developmentOnly(libs.bundles.spring.boot.dev)
developmentOnly(libs.spring.boot.docker.compose)
developmentOnly(libs.spring.ai.spring.boot.docker.compose) {
exclude(group = "org.springframework.boot", module = "spring-boot-starter-mongodb")
}

implementation(libs.spring.boot.starter.web)
implementation(libs.spring.boot.starter.webmvc)
implementation(libs.spring.boot.starter.json)
implementation(libs.spring.boot.starter.actuator)
implementation(libs.spring.boot.starter.aop)
implementation(libs.spring.ai.starter.mcp.server.webmvc)
implementation(libs.solr.solrj) {
exclude(group = "org.apache.httpcomponents")
}
implementation(libs.commons.csv)
// JSpecify for nullability annotations
implementation(libs.jspecify)

implementation(platform("io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom:2.11.0"))
implementation("io.opentelemetry.instrumentation:opentelemetry-spring-boot-starter")
Expand All @@ -115,6 +118,15 @@ dependencies {
implementation(libs.spring.boot.starter.security)
implementation(libs.spring.boot.starter.oauth2.resource.server)

// OpenTelemetry (HTTP mode only - for metrics, tracing, and log export)
implementation(libs.spring.boot.starter.opentelemetry)
implementation(libs.opentelemetry.logback.appender)
implementation("io.micrometer:micrometer-tracing-bridge-otel")
runtimeOnly(libs.micrometer.registry.otlp)

// AspectJ (required for @Observed annotation support in Spring Boot 4)
implementation(libs.spring.boot.starter.aspectj)

// Error Prone and NullAway for null safety analysis
errorprone(libs.errorprone.core)
errorprone(libs.nullaway)
Expand All @@ -126,8 +138,18 @@ dependencies {
dependencyManagement {
imports {
mavenBom("org.springframework.ai:spring-ai-bom:${libs.versions.spring.ai.get()}")
// Align Jetty family to 10.x compatible with SolrJ 9.x
mavenBom("org.eclipse.jetty:jetty-bom:${libs.versions.jetty.get()}")
}
}

// Force opentelemetry-proto to a version compiled with protobuf 3.x
// This resolves NoSuchMethodError with protobuf 4.x
// See: https://github.com/micrometer-metrics/micrometer/issues/5658
configurations.all {
resolutionStrategy.eachDependency {
if (requested.group == "io.opentelemetry.proto" && requested.name == "opentelemetry-proto") {
useVersion("1.3.2-alpha")
because("Version 1.8.0-alpha has protobuf 4.x incompatibility causing NoSuchMethodError")
}
}
}

Expand Down
46 changes: 26 additions & 20 deletions compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -35,27 +35,33 @@ services:
environment:
ZOO_4LW_COMMANDS_WHITELIST: "mntr,conf,ruok"

# =============================================================================
# LGTM Stack - Grafana observability backend (Loki, Grafana, Tempo, Mimir)
# =============================================================================
# This all-in-one container provides:
# - Loki: Log aggregation (LogQL queries)
# - Grafana: Visualization at http://localhost:3000 (no auth required)
# - Tempo: Distributed tracing (TraceQL queries)
# - Mimir: Prometheus-compatible metrics storage
# - OpenTelemetry Collector: Receives OTLP data on ports 4317 (gRPC) and 4318 (HTTP)
#
# Spring Boot auto-configures OTLP endpoints when this container is running.
# =============================================================================
# OpenTelemetry LGTM Stack (HTTP mode only)
# =============================================================================
# Provides a complete observability stack for local development:
# - Grafana: Visualization dashboards (http://localhost:3000)
# - Loki: Log aggregation
# - Tempo: Distributed tracing
# - Mimir: Metrics storage (Prometheus-compatible)
# - OpenTelemetry Collector: Receives OTLP data on ports 4317 (gRPC) and 4318 (HTTP)
#
# Usage:
# docker compose up -d lgtm # Start only the observability stack
# docker compose up -d # Start everything including Solr
#
# Access Grafana at http://localhost:3000 (no authentication required)
# Pre-configured datasources for Loki, Tempo, and Mimir are available.
lgtm:
image: grafana/otel-lgtm:latest
ports:
- "3000:3000" # Grafana UI
- "4317:4317" # OTLP gRPC receiver
- "4318:4318" # OTLP HTTP receiver
networks: [ search ]
labels:
# Prevent Spring Boot auto-configuration from trying to manage this service
org.springframework.boot.ignore: "true"
image: grafana/otel-lgtm:latest
ports:
- "3000:3000" # Grafana UI
- "4317:4317" # OTLP gRPC receiver
- "4318:4318" # OTLP HTTP receiver
networks: [ search ]
environment:
# Disable authentication for local development
GF_AUTH_ANONYMOUS_ENABLED: "true"
GF_AUTH_ANONYMOUS_ORG_ROLE: "Admin"

volumes:
data:
Expand Down
Loading