├── .gradle ├── 9.2.1 │ ├── gc.properties │ ├── fileChanges │ │ └── last-build.bin │ ├── checksums │ │ ├── checksums.lock │ │ ├── md5-checksums.bin │ │ └── sha1-checksums.bin │ ├── fileHashes │ │ ├── fileHashes.bin │ │ ├── fileHashes.lock │ │ └── resourceHashesCache.bin │ └── executionHistory │ │ ├── executionHistory.bin │ │ └── executionHistory.lock ├── vcs-1 │ └── gc.properties ├── buildOutputCleanup │ ├── cache.properties │ ├── outputFiles.bin │ └── buildOutputCleanup.lock ├── file-system.probe └── noVersion │ └── buildLogic.lock ├── docs ├── modules │ ├── integrations │ │ └── nav.adoc │ ├── kubernetes │ │ ├── nav.adoc │ │ └── pages │ │ │ └── index.adoc │ ├── observability │ │ ├── nav.adoc │ │ └── pages │ │ │ └── index.adoc │ ├── opentelemetry │ │ ├── images │ │ │ └── arconia-otel.png │ │ ├── nav.adoc │ │ ├── partials │ │ │ └── opentelemetry-environment-variables.adoc │ │ └── pages │ │ │ └── migration.adoc │ ├── ROOT │ │ ├── partials │ │ │ ├── nav-end.adoc │ │ │ └── app-run.adoc │ │ ├── nav.adoc │ │ └── pages │ │ │ ├── system-requirements.adoc │ │ │ ├── index.adoc │ │ │ └── core-features │ │ │ └── index.adoc │ └── dev-services │ │ ├── partials │ │ ├── disabling-dev-service.adoc │ │ ├── running-application.adoc │ │ └── initializing-a-jdbc-database.adoc │ │ ├── nav.adoc │ │ └── pages │ │ ├── mongodb.adoc │ │ ├── redis.adoc │ │ ├── lldap.adoc │ │ ├── pulsar.adoc │ │ ├── rabbitmq.adoc │ │ ├── kafka.adoc │ │ ├── mongodb-atlas.adoc │ │ └── ollama.adoc └── antora.yml ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── bootkit-core ├── src │ └── main │ │ └── java │ │ └── io │ │ └── bootkit │ │ └── core │ │ ├── support │ │ ├── package-info.java │ │ ├── Internal.java │ │ └── Incubating.java │ │ └── config │ │ └── adapter │ │ └── package-info.java └── build.gradle ├── bootkit-integrations └── bootkit-docling │ ├── src │ ├── test │ │ ├── resources │ │ │ └── story.pdf │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── docling │ │ │ ├── Images.java │ │ │ ├── testcontainers │ │ │ ├── DoclingTestcontainers.java │ │ │ └── DoclingServeContainerConnectionDetailsFactoryTests.java │ │ │ └── autoconfigure │ │ │ └── DoclingPropertiesTests.java │ └── main │ │ ├── java │ │ └── io │ │ │ └── bootkit │ │ │ └── docling │ │ │ ├── client │ │ │ ├── package-info.java │ │ │ └── DoclingServeClient.java │ │ │ ├── actuate │ │ │ ├── package-info.java │ │ │ └── DoclingServeHealthIndicator.java │ │ │ ├── autoconfigure │ │ │ ├── package-info.java │ │ │ ├── actuate │ │ │ │ └── package-info.java │ │ │ ├── DoclingServeConnectionDetails.java │ │ │ └── DoclingProperties.java │ │ │ └── testcontainers │ │ │ └── package-info.java │ │ └── resources │ │ └── META-INF │ │ ├── spring │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── spring.factories │ └── build.gradle ├── bootkit-spring-boot ├── src │ ├── main │ │ ├── java │ │ │ └── io │ │ │ │ └── bootkit │ │ │ │ └── boot │ │ │ │ ├── bootstrap │ │ │ │ ├── package-info.java │ │ │ │ └── BootstrapMode.java │ │ │ │ └── autoconfigure │ │ │ │ └── bootstrap │ │ │ │ ├── package-info.java │ │ │ │ ├── dev │ │ │ │ ├── package-info.java │ │ │ │ ├── BootstrapDevConfiguration.java │ │ │ │ └── BootstrapDevProperties.java │ │ │ │ ├── test │ │ │ │ ├── package-info.java │ │ │ │ ├── BootstrapTestConfiguration.java │ │ │ │ └── BootstrapTestProperties.java │ │ │ │ ├── BootstrapAutoConfiguration.java │ │ │ │ └── BootstrapProperties.java │ │ └── resources │ │ │ └── META-INF │ │ │ ├── spring │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── spring.factories │ └── test │ │ └── java │ │ └── io │ │ └── bootkit │ │ └── boot │ │ └── bootstrap │ │ └── BootstrapModeTests.java └── build.gradle ├── bootkit-dev └── bootkit-dev-services │ ├── bootkit-dev-services-oracle-xe │ ├── src │ │ ├── test │ │ │ └── resources │ │ │ │ └── sql │ │ │ │ └── init.sql │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── spring │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── dev │ │ │ └── services │ │ │ └── oracle │ │ │ └── package-info.java │ └── build.gradle │ ├── bootkit-dev-services-oracle │ ├── src │ │ ├── test │ │ │ └── resources │ │ │ │ └── sql │ │ │ │ └── init.sql │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── spring │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── dev │ │ │ └── services │ │ │ └── oracle │ │ │ └── package-info.java │ └── build.gradle │ ├── bootkit-dev-services-mariadb │ ├── src │ │ ├── test │ │ │ └── resources │ │ │ │ └── sql │ │ │ │ └── init.sql │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── spring │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── dev │ │ │ └── services │ │ │ └── mariadb │ │ │ └── package-info.java │ └── build.gradle │ ├── bootkit-dev-services-mysql │ ├── src │ │ ├── test │ │ │ └── resources │ │ │ │ └── sql │ │ │ │ └── init.sql │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── spring │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── dev │ │ │ └── services │ │ │ └── mysql │ │ │ └── package-info.java │ └── build.gradle │ ├── bootkit-dev-services-postgresql │ ├── src │ │ ├── test │ │ │ └── resources │ │ │ │ └── sql │ │ │ │ └── init.sql │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── spring │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── dev │ │ │ └── services │ │ │ └── postgresql │ │ │ └── package-info.java │ └── build.gradle │ ├── bootkit-dev-services-kafka │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── spring │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── dev │ │ │ └── services │ │ │ └── kafka │ │ │ └── package-info.java │ └── build.gradle │ ├── bootkit-dev-services-lgtm │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── spring │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── dev │ │ │ └── services │ │ │ └── lgtm │ │ │ └── package-info.java │ └── build.gradle │ ├── bootkit-dev-services-lldap │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── spring │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── dev │ │ │ └── services │ │ │ └── lldap │ │ │ └── package-info.java │ └── build.gradle │ ├── bootkit-dev-services-redis │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── spring │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── dev │ │ │ └── services │ │ │ └── redis │ │ │ └── package-info.java │ └── build.gradle │ ├── bootkit-dev-services-artemis │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── spring │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── dev │ │ │ └── services │ │ │ └── artemis │ │ │ └── package-info.java │ └── build.gradle │ ├── bootkit-dev-services-docling │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── spring │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── dev │ │ │ └── services │ │ │ └── docling │ │ │ └── package-info.java │ └── build.gradle │ ├── bootkit-dev-services-mongodb │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── spring │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── dev │ │ │ └── services │ │ │ └── mongodb │ │ │ └── package-info.java │ └── build.gradle │ ├── bootkit-dev-services-ollama │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── spring │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── dev │ │ │ └── services │ │ │ └── ollama │ │ │ └── package-info.java │ └── build.gradle │ ├── bootkit-dev-services-phoenix │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── spring │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── dev │ │ │ └── services │ │ │ └── phoenix │ │ │ └── package-info.java │ └── build.gradle │ ├── bootkit-dev-services-pulsar │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── spring │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── dev │ │ │ └── services │ │ │ └── pulsar │ │ │ └── package-info.java │ └── build.gradle │ ├── bootkit-dev-services-rabbitmq │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── spring │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── dev │ │ │ └── services │ │ │ └── rabbitmq │ │ │ └── package-info.java │ └── build.gradle │ ├── bootkit-dev-services-core │ ├── src │ │ └── main │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── dev │ │ │ └── services │ │ │ └── core │ │ │ └── config │ │ │ ├── package-info.java │ │ │ └── JdbcDevServicesProperties.java │ └── build.gradle │ ├── bootkit-dev-services-mongodb-atlas │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── spring │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── dev │ │ │ └── services │ │ │ └── mongodb │ │ │ └── atlas │ │ │ └── package-info.java │ └── build.gradle │ └── bootkit-dev-services-otel-collector │ ├── src │ └── main │ │ ├── resources │ │ └── META-INF │ │ │ └── spring │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── java │ │ └── io │ │ └── bootkit │ │ └── dev │ │ └── services │ │ └── opentelemetry │ │ └── package-info.java │ └── build.gradle ├── SECURITY.md ├── devbox.json ├── bootkit-multitenancy ├── bootkit-multitenancy-core │ ├── src │ │ ├── main │ │ │ ├── resources │ │ │ │ └── META-INF │ │ │ │ │ └── spring │ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── bootkit │ │ │ │ └── multitenancy │ │ │ │ └── core │ │ │ │ ├── cache │ │ │ │ ├── package-info.java │ │ │ │ ├── TenantKeyGenerator.java │ │ │ │ └── DefaultTenantKeyGenerator.java │ │ │ │ ├── events │ │ │ │ ├── package-info.java │ │ │ │ ├── TenantEventPublisher.java │ │ │ │ ├── TenantEventListener.java │ │ │ │ ├── TenantEvent.java │ │ │ │ └── DefaultTenantEventPublisher.java │ │ │ │ ├── context │ │ │ │ ├── package-info.java │ │ │ │ ├── events │ │ │ │ │ ├── package-info.java │ │ │ │ │ ├── TenantContextClosedEvent.java │ │ │ │ │ ├── HolderTenantContextEventListener.java │ │ │ │ │ └── TenantContextAttachedEvent.java │ │ │ │ └── resolvers │ │ │ │ │ ├── package-info.java │ │ │ │ │ ├── TenantResolver.java │ │ │ │ │ └── FixedTenantResolver.java │ │ │ │ ├── exceptions │ │ │ │ ├── package-info.java │ │ │ │ ├── TenantNotFoundException.java │ │ │ │ └── TenantResolutionException.java │ │ │ │ ├── autoconfigure │ │ │ │ ├── package-info.java │ │ │ │ ├── tenantdetails │ │ │ │ │ └── package-info.java │ │ │ │ └── FixedTenantResolutionProperties.java │ │ │ │ └── tenantdetails │ │ │ │ ├── package-info.java │ │ │ │ ├── TenantDetailsService.java │ │ │ │ └── TenantDetails.java │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── multitenancy │ │ │ └── core │ │ │ ├── exceptions │ │ │ ├── TenantNotFoundExceptionTests.java │ │ │ └── TenantResolutionExceptionTests.java │ │ │ ├── tenantdetails │ │ │ └── TenantTests.java │ │ │ ├── events │ │ │ └── TenantEventTests.java │ │ │ └── context │ │ │ └── events │ │ │ └── HolderTenantContextEventListenerTests.java │ └── build.gradle └── bootkit-multitenancy-web │ ├── src │ └── main │ │ ├── resources │ │ └── META-INF │ │ │ ├── spring │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── additional-spring-configuration-metadata.json │ │ └── java │ │ └── io │ │ └── bootkit │ │ └── multitenancy │ │ └── web │ │ ├── autoconfigure │ │ ├── package-info.java │ │ ├── MultitenancyWebAutoConfiguration.java │ │ └── WebMvcConfiguration.java │ │ └── context │ │ ├── filters │ │ └── package-info.java │ │ ├── resolvers │ │ ├── package-info.java │ │ ├── HttpRequestTenantResolver.java │ │ ├── HeaderTenantResolver.java │ │ └── CookieTenantResolver.java │ │ └── annotations │ │ ├── package-info.java │ │ └── TenantIdentifier.java │ └── build.gradle ├── bootkit-observability ├── bootkit-opentelemetry │ └── src │ │ ├── main │ │ ├── java │ │ │ └── io │ │ │ │ └── bootkit │ │ │ │ └── opentelemetry │ │ │ │ ├── autoconfigure │ │ │ │ ├── package-info.java │ │ │ │ ├── logs │ │ │ │ │ ├── package-info.java │ │ │ │ │ ├── exporter │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ ├── otlp │ │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ │ └── OtlpLoggingConnectionDetails.java │ │ │ │ │ │ ├── console │ │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ │ └── ConsoleLoggingExporterConfiguration.java │ │ │ │ │ │ ├── ConditionalOnOpenTelemetryLoggingExporter.java │ │ │ │ │ │ ├── OpenTelemetryLoggingExporterAutoConfiguration.java │ │ │ │ │ │ └── OpenTelemetryLoggingExporterProperties.java │ │ │ │ │ ├── OpenTelemetryLoggerProviderBuilderCustomizer.java │ │ │ │ │ ├── ConditionalOnOpenTelemetryLogging.java │ │ │ │ │ └── OnOpenTelemetryLoggingCondition.java │ │ │ │ ├── config │ │ │ │ │ └── package-info.java │ │ │ │ ├── exporter │ │ │ │ │ ├── package-info.java │ │ │ │ │ ├── otlp │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ ├── Compression.java │ │ │ │ │ │ ├── Protocol.java │ │ │ │ │ │ └── OtlpConnectionDetails.java │ │ │ │ │ ├── ExporterType.java │ │ │ │ │ └── OpenTelemetryExporterAutoConfiguration.java │ │ │ │ ├── metrics │ │ │ │ │ ├── package-info.java │ │ │ │ │ ├── exporter │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ ├── otlp │ │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ │ └── OtlpMetricsConnectionDetails.java │ │ │ │ │ │ ├── console │ │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ │ └── ConsoleMetricsExporterConfiguration.java │ │ │ │ │ │ ├── HistogramAggregationStrategy.java │ │ │ │ │ │ ├── AggregationTemporalityStrategy.java │ │ │ │ │ │ └── ConditionalOnOpenTelemetryMetricsExporter.java │ │ │ │ │ ├── OpenTelemetryMeterProviderBuilderCustomizer.java │ │ │ │ │ ├── ConditionalOnOpenTelemetryMetrics.java │ │ │ │ │ └── OnOpenTelemetryMetricsCondition.java │ │ │ │ ├── resource │ │ │ │ │ ├── package-info.java │ │ │ │ │ ├── contributor │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ ├── ResourceContributor.java │ │ │ │ │ │ └── BuildResourceContributor.java │ │ │ │ │ ├── OpenTelemetryResourceBuilderCustomizer.java │ │ │ │ │ └── ConditionalOnOpenTelemetryResourceContributor.java │ │ │ │ ├── traces │ │ │ │ │ ├── package-info.java │ │ │ │ │ ├── exporter │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ ├── otlp │ │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ │ └── OtlpTracingConnectionDetails.java │ │ │ │ │ │ ├── console │ │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ │ └── ConsoleTracingExporterConfiguration.java │ │ │ │ │ │ ├── ConditionalOnOpenTelemetryTracingExporter.java │ │ │ │ │ │ ├── OpenTelemetryTracingExporterAutoConfiguration.java │ │ │ │ │ │ └── OpenTelemetryTracingExporterProperties.java │ │ │ │ │ ├── OpenTelemetryTracerProviderBuilderCustomizer.java │ │ │ │ │ ├── ConditionalOnOpenTelemetryTracing.java │ │ │ │ │ └── OnOpenTelemetryTracingCondition.java │ │ │ │ ├── OpenTelemetryProperties.java │ │ │ │ └── ConditionalOnOpenTelemetry.java │ │ │ │ └── testcontainers │ │ │ │ └── package-info.java │ │ └── resources │ │ │ └── META-INF │ │ │ ├── spring │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── spring.factories │ │ └── test │ │ ├── resources │ │ ├── application-otel.properties │ │ ├── application-otel.yml │ │ ├── application-otel-disabled.properties │ │ └── application-otel-disabled.yml │ │ └── java │ │ └── io │ │ └── bootkit │ │ └── opentelemetry │ │ ├── testcontainers │ │ ├── Images.java │ │ ├── LgtmTestcontainers.java │ │ ├── PhoenixTestcontainers.java │ │ └── OtelCollectorTestcontainers.java │ │ └── autoconfigure │ │ ├── logs │ │ └── exporter │ │ │ └── OpenTelemetryLoggingExporterPropertiesTests.java │ │ └── traces │ │ └── exporter │ │ └── OpenTelemetryTracingExporterPropertiesTests.java ├── bootkit-openinference-semantic-conventions │ └── src │ │ ├── main │ │ ├── java │ │ │ └── io │ │ │ │ └── bootkit │ │ │ │ └── openinference │ │ │ │ └── observation │ │ │ │ ├── package-info.java │ │ │ │ ├── autoconfigure │ │ │ │ └── ai │ │ │ │ │ ├── package-info.java │ │ │ │ │ └── OpenInferenceResourceConfiguration.java │ │ │ │ └── instrumentation │ │ │ │ └── ai │ │ │ │ ├── package-info.java │ │ │ │ ├── OpenInferenceGenerativeAiOnlyObservationPredicate.java │ │ │ │ └── OpenInferenceResourceContributor.java │ │ └── resources │ │ │ └── META-INF │ │ │ ├── spring │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── spring.factories │ │ └── test │ │ └── java │ │ └── io │ │ └── bootkit │ │ └── openinference │ │ └── observation │ │ ├── autoconfigure │ │ └── ai │ │ │ └── OpenInferencePropertiesTests.java │ │ └── instrumentation │ │ └── ai │ │ └── OpenInferenceGenerativeAiOnlyObservationPredicateTests.java ├── bootkit-opentelemetry-logback-bridge │ ├── src │ │ ├── main │ │ │ ├── resources │ │ │ │ └── META-INF │ │ │ │ │ ├── spring │ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ │ │ └── spring.factories │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── bootkit │ │ │ │ └── opentelemetry │ │ │ │ └── logback │ │ │ │ └── autoconfigure │ │ │ │ ├── package-info.java │ │ │ │ └── LogbackOpenTelemetryBridgeProperties.java │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── opentelemetry │ │ │ └── logback │ │ │ └── autoconfigure │ │ │ └── LogbackOpenTelemetryBridgePropertiesTests.java │ └── build.gradle ├── bootkit-opentelemetry-micrometer-registry-otlp │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── spring │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── java │ │ │ └── io │ │ │ └── bootkit │ │ │ └── opentelemetry │ │ │ └── micrometer │ │ │ └── registry │ │ │ └── otlp │ │ │ └── autoconfigure │ │ │ └── package-info.java │ └── build.gradle └── bootkit-opentelemetry-micrometer-metrics-bridge │ ├── src │ └── main │ │ ├── resources │ │ └── META-INF │ │ │ └── spring │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── java │ │ └── io │ │ └── bootkit │ │ └── opentelemetry │ │ └── micrometer │ │ └── metrics │ │ └── autoconfigure │ │ └── package-info.java │ └── build.gradle ├── renovate.json ├── .sdkmanrc ├── .gitattributes ├── gradle.properties ├── catalog-info.yaml ├── .editorconfig ├── bootkit-kubernetes └── bootkit-kubernetes-service-binding │ └── build.gradle ├── spring-boot-starters ├── bootkit-spring-boot-starter │ └── build.gradle ├── bootkit-multitenancy-web-spring-boot-starter │ └── build.gradle ├── bootkit-docling-spring-boot-starter │ └── build.gradle └── bootkit-opentelemetry-spring-boot-starter │ └── build.gradle └── .gitignore /.gradle/9.2.1/gc.properties: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gradle/vcs-1/gc.properties: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gradle/9.2.1/fileChanges/last-build.bin: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/modules/integrations/nav.adoc: -------------------------------------------------------------------------------- 1 | .Integrations 2 | * xref:docling.adoc[Docling] 3 | -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/cache.properties: -------------------------------------------------------------------------------- 1 | #Sun Nov 30 23:46:14 CST 2025 2 | gradle.version=9.2.1 3 | -------------------------------------------------------------------------------- /.gradle/file-system.probe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bootkit-io/bootkit/HEAD/.gradle/file-system.probe -------------------------------------------------------------------------------- /.gradle/noVersion/buildLogic.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bootkit-io/bootkit/HEAD/.gradle/noVersion/buildLogic.lock -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bootkit-io/bootkit/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /.gradle/9.2.1/checksums/checksums.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bootkit-io/bootkit/HEAD/.gradle/9.2.1/checksums/checksums.lock -------------------------------------------------------------------------------- /.gradle/9.2.1/fileHashes/fileHashes.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bootkit-io/bootkit/HEAD/.gradle/9.2.1/fileHashes/fileHashes.bin -------------------------------------------------------------------------------- /docs/modules/kubernetes/nav.adoc: -------------------------------------------------------------------------------- 1 | .Kubernetes 2 | * xref:index.adoc[Introduction] 3 | * xref:service-binding.adoc[Service Binding] 4 | -------------------------------------------------------------------------------- /.gradle/9.2.1/checksums/md5-checksums.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bootkit-io/bootkit/HEAD/.gradle/9.2.1/checksums/md5-checksums.bin -------------------------------------------------------------------------------- /.gradle/9.2.1/checksums/sha1-checksums.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bootkit-io/bootkit/HEAD/.gradle/9.2.1/checksums/sha1-checksums.bin -------------------------------------------------------------------------------- /.gradle/9.2.1/fileHashes/fileHashes.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bootkit-io/bootkit/HEAD/.gradle/9.2.1/fileHashes/fileHashes.lock -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/outputFiles.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bootkit-io/bootkit/HEAD/.gradle/buildOutputCleanup/outputFiles.bin -------------------------------------------------------------------------------- /docs/modules/observability/nav.adoc: -------------------------------------------------------------------------------- 1 | .Observability 2 | * xref:index.adoc[Introduction] 3 | * xref:generative-ai.adoc[Generative AI] 4 | -------------------------------------------------------------------------------- /.gradle/9.2.1/fileHashes/resourceHashesCache.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bootkit-io/bootkit/HEAD/.gradle/9.2.1/fileHashes/resourceHashesCache.bin -------------------------------------------------------------------------------- /.gradle/9.2.1/executionHistory/executionHistory.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bootkit-io/bootkit/HEAD/.gradle/9.2.1/executionHistory/executionHistory.bin -------------------------------------------------------------------------------- /.gradle/9.2.1/executionHistory/executionHistory.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bootkit-io/bootkit/HEAD/.gradle/9.2.1/executionHistory/executionHistory.lock -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/buildOutputCleanup.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bootkit-io/bootkit/HEAD/.gradle/buildOutputCleanup/buildOutputCleanup.lock -------------------------------------------------------------------------------- /docs/modules/opentelemetry/images/arconia-otel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bootkit-io/bootkit/HEAD/docs/modules/opentelemetry/images/arconia-otel.png -------------------------------------------------------------------------------- /bootkit-core/src/main/java/io/bootkit/core/support/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.core.support; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-core/src/main/java/io/bootkit/core/config/adapter/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.core.config.adapter; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-integrations/bootkit-docling/src/test/resources/story.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bootkit-io/bootkit/HEAD/bootkit-integrations/bootkit-docling/src/test/resources/story.pdf -------------------------------------------------------------------------------- /bootkit-spring-boot/src/main/java/io/bootkit/boot/bootstrap/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.boot.bootstrap; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /docs/modules/ROOT/partials/nav-end.adoc: -------------------------------------------------------------------------------- 1 | * https://github.com/arconia-io/arconia-examples[Examples] 2 | * https://github.com/arconia-io/arconia/blob/main/CONTRIBUTING.md[Contributing] 3 | -------------------------------------------------------------------------------- /bootkit-spring-boot/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.boot.autoconfigure.bootstrap.BootstrapAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-oracle-xe/src/test/resources/sql/init.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE BOOK ( 2 | ID NUMBER(10) PRIMARY KEY, 3 | TITLE VARCHAR2(255) NOT NULL 4 | ); 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-oracle/src/test/resources/sql/init.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE BOOK ( 2 | ID NUMBER(10) PRIMARY KEY, 3 | TITLE VARCHAR2(255) NOT NULL 4 | ); 5 | -------------------------------------------------------------------------------- /docs/modules/kubernetes/pages/index.adoc: -------------------------------------------------------------------------------- 1 | = Arconia Kubernetes 2 | 3 | Arconia Kubernetes is a collection of projects to help you build Kubernetes-native applications with Java and Spring Boot. 4 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-mariadb/src/test/resources/sql/init.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS BOOK ( 2 | ID INT PRIMARY KEY, 3 | TITLE VARCHAR(255) NOT NULL 4 | ); 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-mysql/src/test/resources/sql/init.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS BOOK ( 2 | ID INT PRIMARY KEY, 3 | TITLE VARCHAR(255) NOT NULL 4 | ); 5 | -------------------------------------------------------------------------------- /bootkit-integrations/bootkit-docling/src/main/java/io/bootkit/docling/client/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.docling.client; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-postgresql/src/test/resources/sql/init.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS BOOK ( 2 | ID SERIAL PRIMARY KEY, 3 | TITLE VARCHAR(255) NOT NULL 4 | ); 5 | -------------------------------------------------------------------------------- /bootkit-integrations/bootkit-docling/src/main/java/io/bootkit/docling/actuate/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.docling.actuate; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-spring-boot/src/main/java/io/bootkit/boot/autoconfigure/bootstrap/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.boot.autoconfigure.bootstrap; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Reporting a Vulnerability 4 | 5 | If you know of a vulnerability in this project, please reach out to security@bootkit.io, and we will get back to you as soon as possible. 6 | -------------------------------------------------------------------------------- /bootkit-integrations/bootkit-docling/src/main/java/io/bootkit/docling/autoconfigure/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.docling.autoconfigure; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-integrations/bootkit-docling/src/main/java/io/bootkit/docling/testcontainers/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.docling.testcontainers; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-spring-boot/src/main/java/io/bootkit/boot/autoconfigure/bootstrap/dev/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.boot.autoconfigure.bootstrap.dev; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-spring-boot/src/main/java/io/bootkit/boot/autoconfigure/bootstrap/test/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.boot.autoconfigure.bootstrap.test; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /devbox.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.16.0/.schema/devbox.schema.json", 3 | "packages": [ 4 | "graalvmPackages.graalvm-ce@25", 5 | "httpie@latest" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-kafka/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.dev.services.kafka.KafkaDevServicesAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-lgtm/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.dev.services.lgtm.LgtmDevServicesAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-lldap/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.dev.services.lldap.LldapDevServicesAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-mysql/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.dev.services.mysql.MySqlDevServicesAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.dev.services.redis.RedisDevServicesAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.multitenancy.core.autoconfigure.MultitenancyCoreAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.multitenancy.web.autoconfigure.MultitenancyWebAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-artemis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.dev.services.artemis.ArtemisDevServicesAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-docling/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.dev.services.docling.DoclingDevServicesAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-kafka/src/main/java/io/bootkit/dev/services/kafka/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.dev.services.kafka; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-lgtm/src/main/java/io/bootkit/dev/services/lgtm/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.dev.services.lgtm; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-lldap/src/main/java/io/bootkit/dev/services/lldap/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.dev.services.lldap; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-mariadb/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.dev.services.mariadb.MariaDbDevServicesAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-mongodb/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.dev.services.mongodb.MongoDbDevServicesAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-mysql/src/main/java/io/bootkit/dev/services/mysql/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.dev.services.mysql; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-ollama/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.dev.services.ollama.OllamaDevServicesAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-oracle/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.dev.services.oracle.OracleDevServicesAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-phoenix/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.dev.services.phoenix.PhoenixDevServicesAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-pulsar/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.dev.services.pulsar.PulsarDevServicesAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-redis/src/main/java/io/bootkit/dev/services/redis/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.dev.services.redis; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-integrations/bootkit-docling/src/main/java/io/bootkit/docling/autoconfigure/actuate/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.docling.autoconfigure.actuate; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/cache/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.multitenancy.core.cache; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/events/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.multitenancy.core.events; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-ollama/src/main/java/io/bootkit/dev/services/ollama/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.dev.services.ollama; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-oracle-xe/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.dev.services.oracle.OracleXeDevServicesAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-oracle/src/main/java/io/bootkit/dev/services/oracle/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.dev.services.oracle; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-pulsar/src/main/java/io/bootkit/dev/services/pulsar/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.dev.services.pulsar; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-rabbitmq/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.dev.services.rabbitmq.RabbitMqDevServicesAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/context/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.multitenancy.core.context; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.autoconfigure; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/testcontainers/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.testcontainers; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-spring-boot/src/main/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | # Environment Post Processors 2 | org.springframework.boot.env.EnvironmentPostProcessor=\ 3 | io.arconia.boot.autoconfigure.bootstrap.BootstrapEnvironmentPostProcessor 4 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-artemis/src/main/java/io/bootkit/dev/services/artemis/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.dev.services.artemis; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-docling/src/main/java/io/bootkit/dev/services/docling/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.dev.services.docling; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-mariadb/src/main/java/io/bootkit/dev/services/mariadb/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.dev.services.mariadb; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-mongodb/src/main/java/io/bootkit/dev/services/mongodb/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.dev.services.mongodb; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-oracle-xe/src/main/java/io/bootkit/dev/services/oracle/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.dev.services.oracle; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-phoenix/src/main/java/io/bootkit/dev/services/phoenix/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.dev.services.phoenix; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-postgresql/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.dev.services.postgresql.PostgresqlDevServicesAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-rabbitmq/src/main/java/io/bootkit/dev/services/rabbitmq/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.dev.services.rabbitmq; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/exceptions/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.multitenancy.core.exceptions; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-web/src/main/java/io/bootkit/multitenancy/web/autoconfigure/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.multitenancy.web.autoconfigure; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/test/resources/application-otel.properties: -------------------------------------------------------------------------------- 1 | otel.sdk.disabled=true 2 | otel.service.name=test-service 3 | otel.logs.exporter=otlp 4 | otel.metrics.exporter=otlp 5 | otel.traces.exporter=otlp 6 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-core/src/main/java/io/bootkit/dev/services/core/config/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.dev.services.core.config; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-postgresql/src/main/java/io/bootkit/dev/services/postgresql/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.dev.services.postgresql; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/autoconfigure/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.multitenancy.core.autoconfigure; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/context/events/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.multitenancy.core.context.events; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/tenantdetails/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.multitenancy.core.tenantdetails; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-web/src/main/java/io/bootkit/multitenancy/web/context/filters/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.multitenancy.web.context.filters; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/logs/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.autoconfigure.logs; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-mongodb-atlas/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.dev.services.mongodb.atlas.MongoDbAtlasDevServicesAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-otel-collector/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.dev.services.opentelemetry.OpenTelemetryDevServicesAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-web/src/main/java/io/bootkit/multitenancy/web/context/resolvers/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.multitenancy.web.context.resolvers; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-openinference-semantic-conventions/src/main/java/io/bootkit/openinference/observation/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.openinference.observation; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-openinference-semantic-conventions/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.openinference.observation.autoconfigure.ai.OpenInferenceAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry-logback-bridge/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.opentelemetry.logback.autoconfigure.LogbackOpenTelemetryBridgeAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/config/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.autoconfigure.config; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/exporter/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.autoconfigure.exporter; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/metrics/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.autoconfigure.metrics; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/resource/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.autoconfigure.resource; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/traces/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.autoconfigure.traces; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "prConcurrentLimit": 5, 3 | "extends": [ 4 | "config:best-practices", 5 | ":gitSignOff" 6 | ], 7 | "assigneesFromCodeOwners": true, 8 | "commitBodyTable": true, 9 | "configMigration": true 10 | } 11 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-mongodb-atlas/src/main/java/io/bootkit/dev/services/mongodb/atlas/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.dev.services.mongodb.atlas; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-otel-collector/src/main/java/io/bootkit/dev/services/opentelemetry/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.dev.services.opentelemetry; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/context/resolvers/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.multitenancy.core.context.resolvers; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-web/src/main/java/io/bootkit/multitenancy/web/context/annotations/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.multitenancy.web.context.annotations; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/exporter/otlp/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.autoconfigure.exporter.otlp; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/logs/exporter/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.autoconfigure.logs.exporter; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry-logback-bridge/src/main/java/io/bootkit/opentelemetry/logback/autoconfigure/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.logback.autoconfigure; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/traces/exporter/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.autoconfigure.traces.exporter; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/logs/exporter/otlp/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.autoconfigure.logs.exporter.otlp; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/metrics/exporter/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.autoconfigure.metrics.exporter; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/autoconfigure/tenantdetails/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.multitenancy.core.autoconfigure.tenantdetails; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry-micrometer-registry-otlp/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.opentelemetry.micrometer.registry.otlp.autoconfigure.MicrometerRegistryOtlpAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/resource/contributor/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.autoconfigure.resource.contributor; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/traces/exporter/otlp/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.autoconfigure.traces.exporter.otlp; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry-logback-bridge/src/main/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | # Application Listeners 2 | org.springframework.context.ApplicationListener=\ 3 | io.arconia.opentelemetry.logback.autoconfigure.LogbackOpenTelemetryBridgeApplicationListener 4 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/logs/exporter/console/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.autoconfigure.logs.exporter.console; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/metrics/exporter/otlp/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.autoconfigure.metrics.exporter.otlp; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/traces/exporter/console/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.autoconfigure.traces.exporter.console; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /docs/modules/observability/pages/index.adoc: -------------------------------------------------------------------------------- 1 | = Arconia Observability 2 | 3 | Arconia Observability is a collection of projects to help you instrument and observe your Spring Boot applications for different purposes, including: 4 | 5 | * xref:generative-ai.adoc[Generative AI] 6 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-openinference-semantic-conventions/src/main/java/io/bootkit/openinference/observation/autoconfigure/ai/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.openinference.observation.autoconfigure.ai; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry-micrometer-metrics-bridge/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.opentelemetry.micrometer.metrics.autoconfigure.MicrometerMetricsOpenTelemetryBridgeAutoConfiguration 2 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/metrics/exporter/console/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.autoconfigure.metrics.exporter.console; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /.sdkmanrc: -------------------------------------------------------------------------------- 1 | # Use sdkman to run "sdk env" to initialize with correct JDK version 2 | # Enable auto-env through the sdkman_auto_env config 3 | # See https://sdkman.io/usage#config 4 | # A summary is to add the following to ~/.sdkman/etc/config 5 | # sdkman_auto_env=true 6 | java=25-graalce 7 | -------------------------------------------------------------------------------- /bootkit-integrations/bootkit-docling/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.docling.autoconfigure.actuate.DoclingServeHealthContributorAutoConfiguration 2 | io.arconia.docling.autoconfigure.DoclingAutoConfiguration 3 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-openinference-semantic-conventions/src/main/java/io/bootkit/openinference/observation/instrumentation/ai/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.openinference.observation.instrumentation.ai; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/test/resources/application-otel.yml: -------------------------------------------------------------------------------- 1 | otel: 2 | sdk: 3 | disabled: true 4 | service: 5 | name: test-service 6 | logs: 7 | exporter: otlp 8 | metrics: 9 | exporter: otlp 10 | traces: 11 | exporter: otlp 12 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-openinference-semantic-conventions/src/main/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | # Environment Post Processors 2 | org.springframework.boot.env.EnvironmentPostProcessor=\ 3 | io.arconia.openinference.observation.autoconfigure.ai.OpenInferenceEnvironmentPostProcessor 4 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry-micrometer-metrics-bridge/src/main/java/io/bootkit/opentelemetry/micrometer/metrics/autoconfigure/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.micrometer.metrics.autoconfigure; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry-micrometer-registry-otlp/src/main/java/io/bootkit/opentelemetry/micrometer/registry/otlp/autoconfigure/package-info.java: -------------------------------------------------------------------------------- 1 | @NullMarked 2 | package io.bootkit.opentelemetry.micrometer.registry.otlp.autoconfigure; 3 | 4 | import org.jspecify.annotations.NullMarked; 5 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/test/resources/application-otel-disabled.properties: -------------------------------------------------------------------------------- 1 | bootkit.otel.compatibility.environment-variable-specification=false 2 | otel.sdk.disabled=true 3 | otel.service.name=test-service 4 | otel.logs.exporter=otlp 5 | otel.metrics.exporter=otlp 6 | otel.traces.exporter=otlp 7 | -------------------------------------------------------------------------------- /docs/modules/ROOT/partials/app-run.adoc: -------------------------------------------------------------------------------- 1 | [tabs] 2 | ====== 3 | CLI:: 4 | + 5 | [source,shell] 6 | ---- 7 | arconia dev 8 | ---- 9 | 10 | Gradle:: 11 | + 12 | [source,shell] 13 | ---- 14 | ./gradlew bootRun 15 | ---- 16 | 17 | Maven:: 18 | + 19 | [source, shell] 20 | ---- 21 | ./mvnw spring-boot:run 22 | ---- 23 | ====== 24 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # 2 | # https://help.github.com/articles/dealing-with-line-endings/ 3 | # 4 | # Linux start script should use lf 5 | /gradlew text eol=lf 6 | 7 | # These are Windows script files and should use crlf 8 | *.bat text eol=crlf 9 | 10 | # Binary files should be left untouched 11 | *.jar binary 12 | -------------------------------------------------------------------------------- /docs/antora.yml: -------------------------------------------------------------------------------- 1 | name: bootkit 2 | title: BootKit Framework 3 | nav: 4 | - modules/ROOT/nav.adoc 5 | - modules/dev-services/nav.adoc 6 | - modules/kubernetes/nav.adoc 7 | - modules/observability/nav.adoc 8 | - modules/opentelemetry/nav.adoc 9 | - modules/integrations/nav.adoc 10 | - modules/ROOT/partials/nav-end.adoc 11 | -------------------------------------------------------------------------------- /bootkit-integrations/bootkit-docling/src/test/java/io/bootkit/docling/Images.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.docling; 2 | 3 | /** 4 | * Images used in tests. 5 | */ 6 | public class Images { 7 | 8 | public static final String DOCLING = "ghcr.io/docling-project/docling-serve:v1.8.0"; 9 | 10 | private Images() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/exporter/otlp/Compression.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.exporter.otlp; 2 | 3 | /** 4 | * Compression type to use for OTLP requests. 5 | */ 6 | public enum Compression { 7 | 8 | GZIP, 9 | 10 | NONE 11 | 12 | } 13 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/exporter/otlp/Protocol.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.exporter.otlp; 2 | 3 | /** 4 | * Transport protocol to use for OTLP requests. 5 | */ 6 | public enum Protocol { 7 | 8 | GRPC, 9 | 10 | HTTP_PROTOBUF 11 | 12 | } 13 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/exporter/ExporterType.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.exporter; 2 | 3 | /** 4 | * Type of OpenTelemetry exporter. 5 | */ 6 | public enum ExporterType { 7 | 8 | CONSOLE, 9 | 10 | OTLP, 11 | 12 | NONE 13 | 14 | } 15 | -------------------------------------------------------------------------------- /docs/modules/ROOT/nav.adoc: -------------------------------------------------------------------------------- 1 | * xref:index.adoc[Introduction] 2 | * xref:what-is-new.adoc[What's New] 3 | * xref:system-requirements.adoc[System Requirements] 4 | * xref:upgrading-arconia.adoc[Upgrading Arconia] 5 | * xref:core-features/index.adoc[Core Features] 6 | ** xref:core-features/bootstrap-mode.adoc[Bootstrap Mode] 7 | ** xref:core-features/profiles.adoc[Profiles] 8 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/events/TenantEventPublisher.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.events; 2 | 3 | /** 4 | * A contract for publishing {@link TenantEvent}s. 5 | */ 6 | @FunctionalInterface 7 | public interface TenantEventPublisher { 8 | 9 | void publishTenantEvent(TenantEvent tenantEvent); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/test/resources/application-otel-disabled.yml: -------------------------------------------------------------------------------- 1 | bootkit: 2 | otel: 3 | compatibility: 4 | environment-variable-specification: false 5 | 6 | otel: 7 | sdk: 8 | disabled: true 9 | service: 10 | name: test-service 11 | logs: 12 | exporter: otlp 13 | metrics: 14 | exporter: otlp 15 | traces: 16 | exporter: otlp 17 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionSha256Sum=72f44c9f8ebcb1af43838f45ee5c4aa9c5444898b3468ab3f4af7b6076c5bc3f 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip 5 | networkTimeout=10000 6 | validateDistributionUrl=true 7 | zipStoreBase=GRADLE_USER_HOME 8 | zipStorePath=wrapper/dists 9 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/events/TenantEventListener.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.events; 2 | 3 | import org.springframework.context.ApplicationListener; 4 | 5 | /** 6 | * A listener for {@link TenantEvent}s. 7 | */ 8 | @FunctionalInterface 9 | public interface TenantEventListener extends ApplicationListener {} 10 | -------------------------------------------------------------------------------- /bootkit-integrations/bootkit-docling/src/main/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | # Runtime Hints Registrars 2 | org.springframework.aot.hint.RuntimeHintsRegistrar=\ 3 | io.arconia.docling.aot.DoclingRuntimeHints 4 | 5 | # Connection Details Factories 6 | org.springframework.boot.autoconfigure.service.connection.ConnectionDetailsFactory=\ 7 | io.arconia.docling.testcontainers.DoclingServeContainerConnectionDetailsFactory 8 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-web/src/main/resources/META-INF/additional-spring-configuration-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "properties": [ 3 | { 4 | "name": "bootkit.multitenancy.resolution.http.filter.ignore-paths", 5 | "defaultValue": [ 6 | "\/actuator\/**", 7 | "\/webjars\/**", 8 | "\/css\/**", 9 | "\/js\/**", 10 | ".ico" 11 | ] 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /docs/modules/dev-services/partials/disabling-dev-service.adoc: -------------------------------------------------------------------------------- 1 | You can enable/disable the Dev Service selectively for a specific application mode (development, test), relying on one of the profiles which are automatically configured by Arconia (see xref:ROOT:core-features/profiles.adoc[Profiles]). 2 | 3 | TIP: You can enable/disable the Dev Service for a specific test class by using the `@TestProperty` annotation or equivalent Spring testing utilities. 4 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/cache/TenantKeyGenerator.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.cache; 2 | 3 | import org.springframework.cache.interceptor.KeyGenerator; 4 | 5 | /** 6 | * Cache key generator. Used for creating a tenant-aware key based on the given method 7 | * (used as context) and its parameters. 8 | */ 9 | @FunctionalInterface 10 | public interface TenantKeyGenerator extends KeyGenerator {} 11 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | group=io.bootkit 2 | version=0.19.1-SNAPSHOT 3 | 4 | org.gradle.configuration-cache=false 5 | org.gradle.caching=true 6 | org.gradle.parallel=true 7 | 8 | org.gradle.jvmargs=-Xmx8g 9 | 10 | datasourceMicrometerSpringBootVersion=1.2.0 11 | doclingVersion=0.1.4 12 | jSpecifyVersion=1.0.0 13 | openInferenceVersion=0.1.9 14 | openTelemetryInstrumentationVersion=2.22.0 15 | openTelemetrySemanticConventionsVersion=1.37.0 16 | springAiVersion=1.1.0 17 | springCloudBindingsVersion=2.0.4 18 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/exporter/otlp/OtlpConnectionDetails.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.exporter.otlp; 2 | 3 | import org.springframework.boot.autoconfigure.service.connection.ConnectionDetails; 4 | 5 | /** 6 | * Connection details to establish a connection to an OTLP endpoint. 7 | */ 8 | public interface OtlpConnectionDetails extends ConnectionDetails { 9 | 10 | String getUrl(Protocol protocol); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /bootkit-integrations/bootkit-docling/src/main/java/io/bootkit/docling/autoconfigure/DoclingServeConnectionDetails.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.docling.autoconfigure; 2 | 3 | import java.net.URI; 4 | 5 | import org.springframework.boot.autoconfigure.service.connection.ConnectionDetails; 6 | 7 | /** 8 | * Connection details to establish a connection to Docling Serve. 9 | */ 10 | public interface DoclingServeConnectionDetails extends ConnectionDetails { 11 | 12 | int DEFAULT_PORT = 5001; 13 | 14 | URI getUrl(); 15 | 16 | } 17 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/resource/contributor/ResourceContributor.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.resource.contributor; 2 | 3 | import io.opentelemetry.sdk.resources.Resource; 4 | import io.opentelemetry.sdk.resources.ResourceBuilder; 5 | 6 | /** 7 | * Contributes additional attributes to a {@link Resource}. 8 | */ 9 | @FunctionalInterface 10 | public interface ResourceContributor { 11 | 12 | void contribute(ResourceBuilder builder); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /bootkit-spring-boot/src/main/java/io/bootkit/boot/autoconfigure/bootstrap/dev/BootstrapDevConfiguration.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.boot.autoconfigure.bootstrap.dev; 2 | 3 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 4 | import org.springframework.context.annotation.Configuration; 5 | 6 | /** 7 | * Configuration for bootstrapping the development mode. 8 | */ 9 | @Configuration(proxyBeanMethods = false) 10 | @EnableConfigurationProperties(BootstrapDevProperties.class) 11 | public final class BootstrapDevConfiguration {} 12 | -------------------------------------------------------------------------------- /bootkit-spring-boot/src/main/java/io/bootkit/boot/autoconfigure/bootstrap/test/BootstrapTestConfiguration.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.boot.autoconfigure.bootstrap.test; 2 | 3 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 4 | import org.springframework.context.annotation.Configuration; 5 | 6 | /** 7 | * Configuration for bootstrapping the test mode. 8 | */ 9 | @Configuration(proxyBeanMethods = false) 10 | @EnableConfigurationProperties(BootstrapTestProperties.class) 11 | public final class BootstrapTestConfiguration {} 12 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/exceptions/TenantNotFoundException.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.exceptions; 2 | 3 | /** 4 | * Thrown when no tenant information is found in a given context. 5 | */ 6 | public class TenantNotFoundException extends IllegalStateException { 7 | 8 | public TenantNotFoundException() { 9 | super("No tenant found in the current context"); 10 | } 11 | 12 | public TenantNotFoundException(String message) { 13 | super(message); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/test/java/io/bootkit/opentelemetry/testcontainers/Images.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.testcontainers; 2 | 3 | /** 4 | * Images used in tests. 5 | */ 6 | public final class Images { 7 | 8 | public static final String LGTM = "grafana/otel-lgtm:0.11.17"; 9 | 10 | public static final String OTEL_COLLECTOR = "otel/opentelemetry-collector-contrib:0.140.1"; 11 | 12 | public static final String PHOENIX = "arizephoenix/phoenix:version-12.9-nonroot"; 13 | 14 | private Images() { 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /catalog-info.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: backstage.io/v1alpha1 3 | kind: Component 4 | metadata: 5 | name: bootkit 6 | description: BootKit is a framework to build modern applications using Java and Spring Boot. It provides support for multitenancy and AI/Large Language Models. 7 | annotations: 8 | backstage.io/techdocs-ref: dir:. 9 | endoflife.date/products: spring-boot 10 | github.com/project-slug: bootkit-io/bootkit 11 | sonarqube.org/project-key: bootkit-io_bootkit 12 | spec: 13 | type: library 14 | lifecycle: experimental 15 | owner: bootkit 16 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/context/resolvers/TenantResolver.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.context.resolvers; 2 | 3 | import org.jspecify.annotations.Nullable; 4 | 5 | /** 6 | * Strategy used to resolve the current tenant from a given source context. 7 | */ 8 | @FunctionalInterface 9 | public interface TenantResolver { 10 | 11 | /** 12 | * Resolves a tenant identifier from the given source. 13 | */ 14 | @Nullable 15 | String resolveTenantIdentifier(T source); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/tenantdetails/TenantDetailsService.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.tenantdetails; 2 | 3 | import java.util.List; 4 | 5 | import org.jspecify.annotations.Nullable; 6 | 7 | /** 8 | * Loads tenant-specific data. It is used throughout the framework as a tenant DAO. 9 | */ 10 | public interface TenantDetailsService { 11 | 12 | List loadAllTenants(); 13 | 14 | @Nullable 15 | TenantDetails loadTenantByIdentifier(String identifier); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/resource/OpenTelemetryResourceBuilderCustomizer.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.resource; 2 | 3 | import io.opentelemetry.sdk.resources.Resource; 4 | import io.opentelemetry.sdk.resources.ResourceBuilder; 5 | 6 | /** 7 | * Customizes the {@link ResourceBuilder} used to build the autoconfigured {@link Resource}. 8 | */ 9 | @FunctionalInterface 10 | public interface OpenTelemetryResourceBuilderCustomizer { 11 | 12 | void customize(ResourceBuilder builder); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/exceptions/TenantResolutionException.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.exceptions; 2 | 3 | /** 4 | * Thrown when an error occurred during the tenant resolution process. 5 | */ 6 | public class TenantResolutionException extends IllegalStateException { 7 | 8 | public TenantResolutionException() { 9 | super("Error when trying to resolve the current tenant"); 10 | } 11 | 12 | public TenantResolutionException(String message) { 13 | super(message); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/logs/OpenTelemetryLoggerProviderBuilderCustomizer.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.logs; 2 | 3 | import io.opentelemetry.sdk.logs.SdkLoggerProvider; 4 | import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder; 5 | 6 | /** 7 | * Customizes the {@link SdkLoggerProviderBuilder} used to build the autoconfigured {@link SdkLoggerProvider}. 8 | */ 9 | @FunctionalInterface 10 | public interface OpenTelemetryLoggerProviderBuilderCustomizer { 11 | 12 | void customize(SdkLoggerProviderBuilder builder); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/metrics/OpenTelemetryMeterProviderBuilderCustomizer.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.metrics; 2 | 3 | import io.opentelemetry.sdk.metrics.SdkMeterProvider; 4 | import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder; 5 | 6 | /** 7 | * Customizes the {@link SdkMeterProviderBuilder} used to build the autoconfigured {@link SdkMeterProvider}. 8 | */ 9 | @FunctionalInterface 10 | public interface OpenTelemetryMeterProviderBuilderCustomizer { 11 | 12 | void customize(SdkMeterProviderBuilder builder); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/traces/OpenTelemetryTracerProviderBuilderCustomizer.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.traces; 2 | 3 | import io.opentelemetry.sdk.trace.SdkTracerProvider; 4 | import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder; 5 | 6 | /** 7 | * Customizes the {@link SdkTracerProviderBuilder} used to build the autoconfigured {@link SdkTracerProvider}. 8 | */ 9 | @FunctionalInterface 10 | public interface OpenTelemetryTracerProviderBuilderCustomizer { 11 | 12 | void customize(SdkTracerProviderBuilder builder); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_style = space 7 | insert_final_newline = true 8 | 9 | [*.gradle] 10 | indent_size = 4 11 | ij_continuation_indent_size = 8 12 | 13 | [*.java] 14 | indent_size = 4 15 | max_line_length = 120 16 | trim_trailing_whitespace=true 17 | ij_continuation_indent_size = 8 18 | ij_java_imports_layout = java.**, |, javax.**, |, jakarta.**, |, com.**, |, dev.**, |, io.**, |, org.**, |, *, |, io.arconia.**, |, $* 19 | ij_java_class_count_to_use_import_on_demand = 99 20 | ij_java_names_count_to_use_import_on_demand = 99 21 | 22 | [*.{yaml,yml}] 23 | indent_size = 2 24 | -------------------------------------------------------------------------------- /docs/modules/opentelemetry/nav.adoc: -------------------------------------------------------------------------------- 1 | .xref:index.adoc[OpenTelemetry] 2 | * xref:resource.adoc[Resource] 3 | * xref:logs.adoc[Logs] 4 | * xref:metrics.adoc[Metrics] 5 | * xref:traces.adoc[Traces] 6 | * xref:instrumentation.adoc[Instrumentation] 7 | * Dev Services 8 | ** xref:dev-services:phoenix.adoc[Arize Phoenix] 9 | ** xref:dev-services:lgtm.adoc[Grafana LGTM] 10 | ** xref:dev-services:otel-collector.adoc[OpenTelemetry Collector] 11 | * xref:migration.adoc[Migration Guides] 12 | ** xref:migration/migration-opentelemetry.adoc[OpenTelemetry Spring Boot Starter] 13 | ** xref:migration/migration-spring-boot.adoc[Spring Boot OpenTelemetry/OTLP] 14 | -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/system-requirements.adoc: -------------------------------------------------------------------------------- 1 | = System Requirements 2 | 3 | This page describes the compatibility requirements for Arconia. 4 | 5 | == Java 6 | 7 | [options="header"] 8 | |=== 9 | |Arconia |Java 10 | |0.5+ |21+ 11 | |1.0 (under development) |25+ 12 | |=== 13 | 14 | == Spring Boot 15 | 16 | Arconia follows the Spring Boot release cadence and relies on Spring Boot's https://docs.spring.io/spring-boot/appendix/dependency-versions/coordinates.html[managed dependency versions]. 17 | 18 | [options="header"] 19 | |=== 20 | |Arconia |Spring Boot 21 | |0.5-0.12 |3.4 22 | |0.13+ |3.5 23 | |1.0 (under development) |4.0+ 24 | |=== 25 | -------------------------------------------------------------------------------- /bootkit-core/src/main/java/io/bootkit/core/support/Internal.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.core.support; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * Indicates that a feature is not part of the public API and may change in future 11 | * releases without notice, a deprecation period, or guarantees of backward compatibility. 12 | */ 13 | @Retention(RetentionPolicy.RUNTIME) 14 | @Target({ ElementType.TYPE, ElementType.METHOD }) 15 | @Documented 16 | public @interface Internal {} 17 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-web/src/main/java/io/bootkit/multitenancy/web/context/annotations/TenantIdentifier.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.web.context.annotations; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * Annotation that is used to resolve the current tenant identifier as a method argument. 11 | */ 12 | @Target(ElementType.PARAMETER) 13 | @Retention(RetentionPolicy.RUNTIME) 14 | @Documented 15 | public @interface TenantIdentifier { 16 | 17 | } 18 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/context/events/TenantContextClosedEvent.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.context.events; 2 | 3 | import io.bootkit.core.support.Incubating; 4 | import io.bootkit.multitenancy.core.events.TenantEvent; 5 | 6 | /** 7 | * A {@link TenantEvent} which indicates the context for the current tenant has been 8 | * closed. 9 | */ 10 | @Incubating(since = "0.1.0") 11 | public final class TenantContextClosedEvent extends TenantEvent { 12 | 13 | public TenantContextClosedEvent(String tenantIdentifier, Object object) { 14 | super(tenantIdentifier, object); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /docs/modules/dev-services/partials/running-application.adoc: -------------------------------------------------------------------------------- 1 | When using the Arconia Dev Services, you can keep running your application as you normally would. The Dev Services will automatically start when you run your application. 2 | 3 | include::ROOT:partial$app-run.adoc[] 4 | 5 | NOTE: Unlike the lower-level Testcontainers support in Spring Boot, Arconia doesn't require special tasks to run your application when using Dev Services (`./gradlew bootTestRun` or `./mvnw spring-boot:test-run`) nor requires you to define a separate `@SpringBootApplication` class for configuring Testcontainers. 6 | 7 | Your integration tests will automatically use the Dev Services without any additional configuration. 8 | -------------------------------------------------------------------------------- /bootkit-kubernetes/bootkit-kubernetes-service-binding/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | api "org.springframework.cloud:spring-cloud-bindings:${springCloudBindingsVersion}" 10 | api "org.springframework.ai:spring-ai-spring-cloud-bindings:${springAiVersion}" 11 | } 12 | 13 | publishing { 14 | publications { 15 | mavenJava(MavenPublication) { 16 | pom { 17 | name = "BootKit Kubernetes Service Binding" 18 | description = "BootKit Kubernetes Service Binding." 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/exporter/OpenTelemetryExporterAutoConfiguration.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.exporter; 2 | 3 | import org.springframework.boot.autoconfigure.AutoConfiguration; 4 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 5 | 6 | import io.bootkit.opentelemetry.autoconfigure.ConditionalOnOpenTelemetry; 7 | 8 | /** 9 | * Auto-configuration for OpenTelemetry exporters. 10 | */ 11 | @AutoConfiguration 12 | @ConditionalOnOpenTelemetry 13 | @EnableConfigurationProperties(OpenTelemetryExporterProperties.class) 14 | public final class OpenTelemetryExporterAutoConfiguration { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /spring-boot-starters/bootkit-spring-boot-starter/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | api project(":bootkit-spring-boot") 10 | 11 | implementation "org.springframework.boot:spring-boot-starter" 12 | 13 | testImplementation "org.springframework.boot:spring-boot-starter-test" 14 | } 15 | 16 | publishing { 17 | publications { 18 | mavenJava(MavenPublication) { 19 | pom { 20 | name = "BootKit Spring Boot Starter" 21 | description = "BootKit Spring Boot Starter." 22 | } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/tenantdetails/TenantDetails.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.tenantdetails; 2 | 3 | import java.io.Serializable; 4 | import java.util.Map; 5 | 6 | /** 7 | * Provides core tenant information. 8 | */ 9 | public interface TenantDetails extends Serializable { 10 | 11 | /** 12 | * Identifier for the tenant. 13 | */ 14 | String getIdentifier(); 15 | 16 | /** 17 | * Whether the tenant is enabled. 18 | */ 19 | boolean isEnabled(); 20 | 21 | /** 22 | * Additional information about the tenant. 23 | */ 24 | default Map getAttributes() { 25 | return Map.of(); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-web/src/main/java/io/bootkit/multitenancy/web/context/resolvers/HttpRequestTenantResolver.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.web.context.resolvers; 2 | 3 | import jakarta.servlet.http.HttpServletRequest; 4 | 5 | import org.jspecify.annotations.Nullable; 6 | 7 | import io.bootkit.multitenancy.core.context.resolvers.TenantResolver; 8 | 9 | /** 10 | * Strategy used to resolve the current tenant from an HTTP request. 11 | */ 12 | public interface HttpRequestTenantResolver extends TenantResolver { 13 | 14 | /** 15 | * Resolves a tenant identifier from an HTTP request. 16 | */ 17 | @Nullable 18 | String resolveTenantIdentifier(HttpServletRequest request); 19 | 20 | } 21 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/OpenTelemetryProperties.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure; 2 | 3 | import org.springframework.boot.context.properties.ConfigurationProperties; 4 | 5 | /** 6 | * Configuration properties for OpenTelemetry. 7 | */ 8 | @ConfigurationProperties(prefix = OpenTelemetryProperties.CONFIG_PREFIX) 9 | public class OpenTelemetryProperties { 10 | 11 | public static final String CONFIG_PREFIX = "bootkit.otel"; 12 | 13 | private boolean enabled = true; 14 | 15 | public boolean isEnabled() { 16 | return enabled; 17 | } 18 | 19 | public void setEnabled(boolean enabled) { 20 | this.enabled = enabled; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /docs/modules/dev-services/nav.adoc: -------------------------------------------------------------------------------- 1 | .xref:index.adoc[Dev Services] 2 | * Data Stores 3 | ** xref:mariadb.adoc[MariaDB] 4 | ** xref:mongodb.adoc[MongoDB] 5 | ** xref:mongodb-atlas.adoc[MongoDB Atlas] 6 | ** xref:mysql.adoc[MySQL] 7 | ** xref:oracle.adoc[Oracle] 8 | ** xref:oracle-xe.adoc[Oracle XE] 9 | ** xref:postgresql.adoc[PostgreSQL] 10 | ** xref:redis.adoc[Redis] 11 | * Event Brokers 12 | ** xref:artemis.adoc[Artemis] 13 | ** xref:kafka.adoc[Kafka] 14 | ** xref:pulsar.adoc[Pulsar] 15 | ** xref:rabbitmq.adoc[RabbitMQ] 16 | * OpenTelemetry 17 | ** xref:lgtm.adoc[Grafana LGTM] 18 | ** xref:otel-collector.adoc[OpenTelemetry Collector] 19 | ** xref:phoenix.adoc[Phoenix] 20 | * xref:docling.adoc[Docling] 21 | * xref:lldap.adoc[LLDAP] 22 | * xref:ollama.adoc[Ollama] 23 | -------------------------------------------------------------------------------- /docs/modules/opentelemetry/partials/opentelemetry-environment-variables.adoc: -------------------------------------------------------------------------------- 1 | Arconia supports the https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/[OpenTelemetry Environment Variable Specification] for configuring the OpenTelemetry integration. If both the OpenTelemetry Environment Variables and the Arconia configuration properties are set, the OpenTelemetry Environment Variables will take precedence. 2 | 3 | This support is especially useful during deployment, where you can use the same set of standard environment variables to configure OpenTelemetry across different languages and frameworks. 4 | 5 | You can disable this support by setting the `arconia.otel.compatibility.environment-variable-specification` configuration property to `false`. 6 | -------------------------------------------------------------------------------- /bootkit-core/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | api "org.jspecify:jspecify:${jSpecifyVersion}" 10 | 11 | implementation "org.slf4j:slf4j-api" 12 | implementation "org.springframework:spring-context" 13 | 14 | testImplementation "org.springframework.boot:spring-boot-starter-test" 15 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 16 | } 17 | 18 | publishing { 19 | publications { 20 | mavenJava(MavenPublication) { 21 | pom { 22 | name = "BootKit Core" 23 | description = "BootKit Core." 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-core/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | api project(":bootkit-spring-boot") 10 | 11 | implementation "org.springframework:spring-context" 12 | 13 | testImplementation "org.springframework.boot:spring-boot-starter-test" 14 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 15 | } 16 | 17 | publishing { 18 | publications { 19 | mavenJava(MavenPublication) { 20 | pom { 21 | name = "BootKit Dev Services Core" 22 | description = "BootKit Dev Services Core." 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /bootkit-core/src/main/java/io/bootkit/core/support/Incubating.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.core.support; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * Indicates that a feature is incubating and may change in future releases 11 | * without notice, a deprecation period, or guarantees of backward compatibility. 12 | */ 13 | @Retention(RetentionPolicy.RUNTIME) 14 | @Target({ ElementType.TYPE, ElementType.METHOD }) 15 | @Documented 16 | public @interface Incubating { 17 | 18 | /** 19 | * The version at which the feature was introduced. 20 | */ 21 | String since() default ""; 22 | 23 | } 24 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/test/java/io/bootkit/opentelemetry/testcontainers/LgtmTestcontainers.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.testcontainers; 2 | 3 | import java.time.Duration; 4 | 5 | import org.springframework.boot.testcontainers.service.connection.ServiceConnection; 6 | import org.testcontainers.grafana.LgtmStackContainer; 7 | import org.testcontainers.junit.jupiter.Container; 8 | import org.testcontainers.junit.jupiter.Testcontainers; 9 | 10 | @Testcontainers(disabledWithoutDocker = true, parallel = true) 11 | public class LgtmTestcontainers { 12 | 13 | @Container 14 | @ServiceConnection 15 | public static LgtmStackContainer lgtmContainer = new LgtmStackContainer(Images.LGTM) 16 | .withStartupTimeout(Duration.ofMinutes(2)); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/logs/exporter/otlp/OtlpLoggingConnectionDetails.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.logs.exporter.otlp; 2 | 3 | import io.bootkit.opentelemetry.autoconfigure.exporter.otlp.OtlpConnectionDetails; 4 | 5 | /** 6 | * Connection details to establish a connection to an OTLP endpoint for logging. 7 | */ 8 | public interface OtlpLoggingConnectionDetails extends OtlpConnectionDetails { 9 | 10 | String LOGS_PATH = "/v1/logs"; 11 | 12 | int DEFAULT_GRPC_PORT = 4317; 13 | int DEFAULT_HTTP_PORT = 4318; 14 | 15 | String DEFAULT_GRPC_ENDPOINT = "http://localhost:" + DEFAULT_GRPC_PORT; 16 | String DEFAULT_HTTP_PROTOBUF_ENDPOINT = "http://localhost:" + DEFAULT_HTTP_PORT + LOGS_PATH; 17 | 18 | } 19 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/traces/exporter/otlp/OtlpTracingConnectionDetails.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.traces.exporter.otlp; 2 | 3 | import io.bootkit.opentelemetry.autoconfigure.exporter.otlp.OtlpConnectionDetails; 4 | 5 | /** 6 | * Connection details to establish a connection to an OTLP endpoint for tracing. 7 | */ 8 | public interface OtlpTracingConnectionDetails extends OtlpConnectionDetails { 9 | 10 | String TRACES_PATH = "/v1/traces"; 11 | 12 | int DEFAULT_GRPC_PORT = 4317; 13 | int DEFAULT_HTTP_PORT = 4318; 14 | 15 | String DEFAULT_GRPC_ENDPOINT = "http://localhost:" + DEFAULT_GRPC_PORT; 16 | String DEFAULT_HTTP_PROTOBUF_ENDPOINT = "http://localhost:" + DEFAULT_HTTP_PORT + TRACES_PATH; 17 | 18 | } 19 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/metrics/exporter/otlp/OtlpMetricsConnectionDetails.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.metrics.exporter.otlp; 2 | 3 | import io.bootkit.opentelemetry.autoconfigure.exporter.otlp.OtlpConnectionDetails; 4 | 5 | /** 6 | * Connection details to establish a connection to an OTLP endpoint for metrics. 7 | */ 8 | public interface OtlpMetricsConnectionDetails extends OtlpConnectionDetails { 9 | 10 | String METRICS_PATH = "/v1/metrics"; 11 | 12 | int DEFAULT_GRPC_PORT = 4317; 13 | int DEFAULT_HTTP_PORT = 4318; 14 | 15 | String DEFAULT_GRPC_ENDPOINT = "http://localhost:" + DEFAULT_GRPC_PORT; 16 | String DEFAULT_HTTP_PROTOBUF_ENDPOINT = "http://localhost:" + DEFAULT_HTTP_PORT + METRICS_PATH; 17 | 18 | } 19 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/ConditionalOnOpenTelemetry.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | import org.springframework.context.annotation.Conditional; 10 | 11 | /** 12 | * Indicates when OpenTelemetry support is eligible for registration. 13 | */ 14 | @Retention(RetentionPolicy.RUNTIME) 15 | @Target({ ElementType.TYPE, ElementType.METHOD }) 16 | @Documented 17 | @Conditional(OnEnabledOpenTelemetryCondition.class) 18 | public @interface ConditionalOnOpenTelemetry { 19 | 20 | boolean enabled() default true; 21 | 22 | } 23 | -------------------------------------------------------------------------------- /spring-boot-starters/bootkit-multitenancy-web-spring-boot-starter/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | api project(":bootkit-spring-boot") 10 | 11 | api project(":bootkit-multitenancy:bootkit-multitenancy-core") 12 | api project(":bootkit-multitenancy:bootkit-multitenancy-web") 13 | 14 | implementation "org.springframework.boot:spring-boot-starter" 15 | } 16 | 17 | publishing { 18 | publications { 19 | mavenJava(MavenPublication) { 20 | pom { 21 | name = "BootKit Multitenancy Web Spring Boot Starter" 22 | description = "BootKit Multitenancy Web Spring Boot Starter." 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-openinference-semantic-conventions/src/main/java/io/bootkit/openinference/observation/instrumentation/ai/OpenInferenceGenerativeAiOnlyObservationPredicate.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.openinference.observation.instrumentation.ai; 2 | 3 | import io.micrometer.observation.Observation; 4 | import io.micrometer.observation.ObservationPredicate; 5 | 6 | import org.springframework.util.StringUtils; 7 | 8 | /** 9 | * Removes all observations that are not part of the Spring AI workflows. 10 | */ 11 | public class OpenInferenceGenerativeAiOnlyObservationPredicate implements ObservationPredicate { 12 | 13 | @Override 14 | public boolean test(String observationName, Observation.Context context) { 15 | return StringUtils.hasText(observationName) && observationName.startsWith("spring.ai"); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-web/src/main/java/io/bootkit/multitenancy/web/autoconfigure/MultitenancyWebAutoConfiguration.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.web.autoconfigure; 2 | 3 | import org.springframework.boot.autoconfigure.AutoConfiguration; 4 | import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; 5 | import org.springframework.context.annotation.Import; 6 | 7 | import io.bootkit.multitenancy.core.autoconfigure.MultitenancyCoreAutoConfiguration; 8 | 9 | /** 10 | * Auto-configuration for web multitenancy. 11 | */ 12 | @AutoConfiguration(after = MultitenancyCoreAutoConfiguration.class) 13 | @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) 14 | @Import({ HttpTenantResolutionConfiguration.class, WebMvcConfiguration.class }) 15 | public final class MultitenancyWebAutoConfiguration {} 16 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry-logback-bridge/src/main/java/io/bootkit/opentelemetry/logback/autoconfigure/LogbackOpenTelemetryBridgeProperties.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.logback.autoconfigure; 2 | 3 | import org.springframework.boot.context.properties.ConfigurationProperties; 4 | 5 | @ConfigurationProperties(prefix = LogbackOpenTelemetryBridgeProperties.CONFIG_PREFIX) 6 | public class LogbackOpenTelemetryBridgeProperties { 7 | 8 | public static final String CONFIG_PREFIX = "bootkit.otel.logs.logback-bridge"; 9 | 10 | /** 11 | * Whether to enable the Logback OpenTelemetry Bridge. 12 | */ 13 | private boolean enabled = true; 14 | 15 | public boolean isEnabled() { 16 | return enabled; 17 | } 18 | 19 | public void setEnabled(boolean enabled) { 20 | this.enabled = enabled; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/test/java/io/bootkit/opentelemetry/testcontainers/PhoenixTestcontainers.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.testcontainers; 2 | 3 | import org.springframework.boot.testcontainers.service.connection.ServiceConnection; 4 | import org.testcontainers.containers.GenericContainer; 5 | import org.testcontainers.junit.jupiter.Container; 6 | import org.testcontainers.junit.jupiter.Testcontainers; 7 | 8 | @Testcontainers(disabledWithoutDocker = true, parallel = true) 9 | public class PhoenixTestcontainers { 10 | 11 | static final int GRPC_PORT = 4317; 12 | static final int HTTP_PORT = 6006; 13 | 14 | @Container 15 | @ServiceConnection("phoenix") 16 | public static final GenericContainer phoenixContainer = new GenericContainer<>(Images.PHOENIX) 17 | .withExposedPorts(GRPC_PORT, HTTP_PORT); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /bootkit-spring-boot/src/main/java/io/bootkit/boot/autoconfigure/bootstrap/BootstrapAutoConfiguration.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.boot.autoconfigure.bootstrap; 2 | 3 | import org.springframework.boot.autoconfigure.AutoConfiguration; 4 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 5 | import org.springframework.context.annotation.Import; 6 | 7 | import io.bootkit.boot.autoconfigure.bootstrap.dev.BootstrapDevConfiguration; 8 | import io.bootkit.boot.autoconfigure.bootstrap.test.BootstrapTestConfiguration; 9 | 10 | /** 11 | * Auto-configuration for bootstrapping an BootKit-flavored Spring Boot application. 12 | */ 13 | @AutoConfiguration 14 | @Import({ 15 | BootstrapDevConfiguration.class, 16 | BootstrapTestConfiguration.class 17 | }) 18 | @EnableConfigurationProperties(BootstrapProperties.class) 19 | public final class BootstrapAutoConfiguration {} 20 | -------------------------------------------------------------------------------- /bootkit-spring-boot/src/main/java/io/bootkit/boot/autoconfigure/bootstrap/test/BootstrapTestProperties.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.boot.autoconfigure.bootstrap.test; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.boot.context.properties.ConfigurationProperties; 6 | 7 | /** 8 | * Properties for bootstrapping the test mode. 9 | */ 10 | @ConfigurationProperties(prefix = BootstrapTestProperties.CONFIG_PREFIX) 11 | public class BootstrapTestProperties { 12 | 13 | public static final String CONFIG_PREFIX = "bootkit.test"; 14 | 15 | /** 16 | * Name of the profiles to activate in test mode. 17 | */ 18 | private List profiles = List.of("test"); 19 | 20 | public List getProfiles() { 21 | return profiles; 22 | } 23 | 24 | public void setProfiles(List profiles) { 25 | this.profiles = profiles; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/test/java/io/bootkit/multitenancy/core/exceptions/TenantNotFoundExceptionTests.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.exceptions; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import static org.assertj.core.api.Assertions.assertThat; 6 | 7 | /** 8 | * Unit tests for {@link TenantNotFoundException}. 9 | */ 10 | class TenantNotFoundExceptionTests { 11 | 12 | @Test 13 | void whenDefaultMessage() { 14 | var exception = new TenantNotFoundException(); 15 | assertThat(exception).hasMessageContaining("No tenant found in the current context"); 16 | } 17 | 18 | @Test 19 | void whenCustomMessage() { 20 | var message = "Custom tenant exception message"; 21 | var exception = new TenantNotFoundException(message); 22 | assertThat(exception).hasMessageContaining(message); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /bootkit-spring-boot/src/main/java/io/bootkit/boot/autoconfigure/bootstrap/dev/BootstrapDevProperties.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.boot.autoconfigure.bootstrap.dev; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.boot.context.properties.ConfigurationProperties; 6 | 7 | /** 8 | * Properties for bootstrapping the development mode. 9 | */ 10 | @ConfigurationProperties(prefix = BootstrapDevProperties.CONFIG_PREFIX) 11 | public class BootstrapDevProperties { 12 | 13 | public static final String CONFIG_PREFIX = "bootkit.dev"; 14 | 15 | /** 16 | * Name of the profiles to activate in development mode. 17 | */ 18 | private List profiles = List.of("dev"); 19 | 20 | public List getProfiles() { 21 | return profiles; 22 | } 23 | 24 | public void setProfiles(List profiles) { 25 | this.profiles = profiles; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/events/TenantEvent.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.events; 2 | 3 | import org.springframework.context.ApplicationEvent; 4 | import org.springframework.util.Assert; 5 | 6 | import io.bootkit.core.support.Incubating; 7 | 8 | /** 9 | * Abstract superclass for all tenant-related events. 10 | */ 11 | @Incubating(since = "0.1.0") 12 | public abstract class TenantEvent extends ApplicationEvent { 13 | 14 | private final String tenantIdentifier; 15 | 16 | public TenantEvent(String tenantIdentifier, Object source) { 17 | super(source); 18 | Assert.hasText(tenantIdentifier, "tenantIdentifier cannot be null or empty"); 19 | this.tenantIdentifier = tenantIdentifier; 20 | } 21 | 22 | public String getTenantIdentifier() { 23 | return tenantIdentifier; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/test/java/io/bootkit/opentelemetry/testcontainers/OtelCollectorTestcontainers.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.testcontainers; 2 | 3 | import java.time.Duration; 4 | 5 | import org.springframework.boot.testcontainers.service.connection.ServiceConnection; 6 | import org.testcontainers.containers.GenericContainer; 7 | import org.testcontainers.junit.jupiter.Container; 8 | import org.testcontainers.junit.jupiter.Testcontainers; 9 | 10 | @Testcontainers(disabledWithoutDocker = true, parallel = true) 11 | public class OtelCollectorTestcontainers { 12 | 13 | @Container 14 | @ServiceConnection("otel/opentelemetry-collector") 15 | public static GenericContainer otelCollectorContainer = new GenericContainer<>(Images.OTEL_COLLECTOR) 16 | .withExposedPorts(4317, 4318) 17 | .withStartupTimeout(Duration.ofMinutes(2)); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/test/java/io/bootkit/multitenancy/core/exceptions/TenantResolutionExceptionTests.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.exceptions; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import static org.assertj.core.api.Assertions.assertThat; 6 | 7 | /** 8 | * Unit tests for {@link TenantResolutionException}. 9 | */ 10 | class TenantResolutionExceptionTests { 11 | 12 | @Test 13 | void whenDefaultMessage() { 14 | var exception = new TenantResolutionException(); 15 | assertThat(exception).hasMessageContaining("Error when trying to resolve the current tenant"); 16 | } 17 | 18 | @Test 19 | void whenCustomMessage() { 20 | var message = "Custom tenant exception message"; 21 | var exception = new TenantResolutionException(message); 22 | assertThat(exception).hasMessageContaining(message); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /spring-boot-starters/bootkit-docling-spring-boot-starter/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | api project(":bootkit-spring-boot") 10 | api project(":bootkit-integrations:bootkit-docling") 11 | 12 | api "org.springframework:spring-web" 13 | api "org.springframework.boot:spring-boot-starter-json" 14 | 15 | implementation "org.springframework.boot:spring-boot-starter" 16 | 17 | testImplementation "org.springframework.boot:spring-boot-starter-test" 18 | } 19 | 20 | publishing { 21 | publications { 22 | mavenJava(MavenPublication) { 23 | pom { 24 | name = "BootKit Docling Spring Boot Starter" 25 | description = "BootKit Docling Spring Boot Starter." 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/logs/ConditionalOnOpenTelemetryLogging.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.logs; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | import org.springframework.context.annotation.Conditional; 10 | 11 | import io.bootkit.opentelemetry.autoconfigure.ConditionalOnOpenTelemetry; 12 | 13 | /** 14 | * Whether OpenTelemetry logging support is eligible for registration. 15 | */ 16 | @Retention(RetentionPolicy.RUNTIME) 17 | @Target({ ElementType.TYPE, ElementType.METHOD }) 18 | @Documented 19 | @ConditionalOnOpenTelemetry 20 | @Conditional(OnOpenTelemetryLoggingCondition.class) 21 | public @interface ConditionalOnOpenTelemetryLogging { 22 | 23 | } 24 | -------------------------------------------------------------------------------- /bootkit-integrations/bootkit-docling/src/test/java/io/bootkit/docling/testcontainers/DoclingTestcontainers.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.docling.testcontainers; 2 | 3 | import org.springframework.boot.testcontainers.service.connection.ServiceConnection; 4 | import org.testcontainers.junit.jupiter.Container; 5 | import org.testcontainers.junit.jupiter.Testcontainers; 6 | 7 | import ai.docling.testcontainers.serve.DoclingServeContainer; 8 | import ai.docling.testcontainers.serve.config.DoclingServeContainerConfig; 9 | 10 | import io.bootkit.docling.Images; 11 | 12 | @Testcontainers(disabledWithoutDocker = true, parallel = true) 13 | public class DoclingTestcontainers { 14 | 15 | @Container 16 | @ServiceConnection("docling") 17 | public static final DoclingServeContainer doclingContainer = new DoclingServeContainer(DoclingServeContainerConfig.builder() 18 | .image(Images.DOCLING) 19 | .build()); 20 | 21 | } 22 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-web/src/main/java/io/bootkit/multitenancy/web/autoconfigure/WebMvcConfiguration.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.web.autoconfigure; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.web.method.support.HandlerMethodArgumentResolver; 7 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 8 | 9 | import io.bootkit.multitenancy.web.context.annotations.TenantIdentifierArgumentResolver; 10 | 11 | /** 12 | * Register BootKit-specific Spring Web MVC configuration. 13 | */ 14 | @Configuration(proxyBeanMethods = false) 15 | public final class WebMvcConfiguration implements WebMvcConfigurer { 16 | 17 | @Override 18 | public void addArgumentResolvers(List resolvers) { 19 | resolvers.add(new TenantIdentifierArgumentResolver()); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/metrics/ConditionalOnOpenTelemetryMetrics.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.metrics; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | import org.springframework.context.annotation.Conditional; 10 | 11 | import io.bootkit.opentelemetry.autoconfigure.ConditionalOnOpenTelemetry; 12 | 13 | /** 14 | * Whether OpenTelemetry metrics support is eligible for registration. 15 | */ 16 | @Retention(RetentionPolicy.RUNTIME) 17 | @Target({ ElementType.TYPE, ElementType.METHOD }) 18 | @Documented 19 | @ConditionalOnOpenTelemetry 20 | @Conditional(OnOpenTelemetryMetricsCondition.class) 21 | public @interface ConditionalOnOpenTelemetryMetrics { 22 | 23 | } 24 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/traces/ConditionalOnOpenTelemetryTracing.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.traces; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | import org.springframework.context.annotation.Conditional; 10 | 11 | import io.bootkit.opentelemetry.autoconfigure.ConditionalOnOpenTelemetry; 12 | 13 | /** 14 | * Whether OpenTelemetry tracing support is eligible for registration. 15 | */ 16 | @Retention(RetentionPolicy.RUNTIME) 17 | @Target({ ElementType.TYPE, ElementType.METHOD }) 18 | @Documented 19 | @ConditionalOnOpenTelemetry 20 | @Conditional(OnOpenTelemetryTracingCondition.class) 21 | public @interface ConditionalOnOpenTelemetryTracing { 22 | 23 | } 24 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-core/src/main/java/io/bootkit/dev/services/core/config/JdbcDevServicesProperties.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.dev.services.core.config; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Base properties for dev services that use JDBC. 7 | */ 8 | public interface JdbcDevServicesProperties extends DevServicesProperties { 9 | 10 | /** 11 | * Username to be used for connecting to the database. 12 | */ 13 | String getUsername(); 14 | 15 | /** 16 | * Password to be used for connecting to the database. 17 | */ 18 | String getPassword(); 19 | 20 | /** 21 | * Name of the database to be created. 22 | */ 23 | String getDbName(); 24 | 25 | /** 26 | * List of paths to SQL scripts to be loaded from the classpath and 27 | * applied to the database for initialization. 28 | */ 29 | List getInitScriptPaths(); 30 | 31 | } 32 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/cache/DefaultTenantKeyGenerator.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.cache; 2 | 3 | import java.lang.reflect.Method; 4 | 5 | import org.springframework.cache.interceptor.SimpleKeyGenerator; 6 | 7 | import io.bootkit.core.support.Incubating; 8 | import io.bootkit.multitenancy.core.context.TenantContextHolder; 9 | 10 | /** 11 | * An implementation of {@link TenantKeyGenerator} that generates cache keys combining the 12 | * current tenant identifier with the given method and parameters. 13 | */ 14 | @Incubating(since = "0.1.0") 15 | public final class DefaultTenantKeyGenerator implements TenantKeyGenerator { 16 | 17 | @Override 18 | public Object generate(Object target, Method method, Object... params) { 19 | return SimpleKeyGenerator.generateKey(TenantContextHolder.getRequiredTenantIdentifier(), params); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | io.arconia.opentelemetry.autoconfigure.exporter.OpenTelemetryExporterAutoConfiguration 2 | 3 | io.arconia.opentelemetry.autoconfigure.logs.exporter.OpenTelemetryLoggingExporterAutoConfiguration 4 | io.arconia.opentelemetry.autoconfigure.logs.OpenTelemetryLoggingAutoConfiguration 5 | 6 | io.arconia.opentelemetry.autoconfigure.metrics.exporter.OpenTelemetryMetricsExporterAutoConfiguration 7 | io.arconia.opentelemetry.autoconfigure.metrics.OpenTelemetryMetricsAutoConfiguration 8 | 9 | io.arconia.opentelemetry.autoconfigure.resource.OpenTelemetryResourceAutoConfiguration 10 | 11 | io.arconia.opentelemetry.autoconfigure.traces.exporter.OpenTelemetryTracingExporterAutoConfiguration 12 | io.arconia.opentelemetry.autoconfigure.traces.OpenTelemetryTracingAutoConfiguration 13 | 14 | io.arconia.opentelemetry.autoconfigure.OpenTelemetryAutoConfiguration 15 | -------------------------------------------------------------------------------- /bootkit-spring-boot/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-core") 13 | 14 | implementation "org.springframework.boot:spring-boot-starter" 15 | 16 | testImplementation "org.springframework.boot:spring-boot-starter-test" 17 | testImplementation "org.springframework.boot:spring-boot-devtools" 18 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 19 | } 20 | 21 | publishing { 22 | publications { 23 | mavenJava(MavenPublication) { 24 | pom { 25 | name = "BootKit Spring Boot" 26 | description = "BootKit Spring Boot." 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /bootkit-spring-boot/src/main/java/io/bootkit/boot/autoconfigure/bootstrap/BootstrapProperties.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.boot.autoconfigure.bootstrap; 2 | 3 | import org.springframework.boot.context.properties.ConfigurationProperties; 4 | 5 | /** 6 | * Properties for configuring the bootstrap profiles. 7 | */ 8 | @ConfigurationProperties(prefix = BootstrapProperties.CONFIG_PREFIX) 9 | public class BootstrapProperties { 10 | 11 | public static final String CONFIG_PREFIX = "bootkit.bootstrap"; 12 | 13 | public final Profiles profiles = new Profiles(); 14 | 15 | public static class Profiles { 16 | 17 | /** 18 | * Whether the profiles are enabled based on the application mode. 19 | */ 20 | private boolean enabled = true; 21 | 22 | public boolean isEnabled() { 23 | return enabled; 24 | } 25 | 26 | public void setEnabled(boolean enabled) { 27 | this.enabled = enabled; 28 | } 29 | 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-core") 13 | 14 | implementation "org.springframework.boot:spring-boot-starter" 15 | implementation "org.springframework:spring-context" 16 | 17 | testImplementation "org.springframework.boot:spring-boot-starter-test" 18 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 19 | } 20 | 21 | publishing { 22 | publications { 23 | mavenJava(MavenPublication) { 24 | pom { 25 | name = "BootKit Multitenancy Core" 26 | description = "BootKit Multitenancy Core." 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-openinference-semantic-conventions/src/main/java/io/bootkit/openinference/observation/instrumentation/ai/OpenInferenceResourceContributor.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.openinference.observation.instrumentation.ai; 2 | 3 | import com.arize.semconv.trace.SemanticResourceAttributes; 4 | 5 | import io.opentelemetry.api.common.AttributeKey; 6 | import io.opentelemetry.sdk.resources.ResourceBuilder; 7 | 8 | import io.bootkit.opentelemetry.autoconfigure.resource.contributor.ResourceContributor; 9 | 10 | /** 11 | * A {@link ResourceContributor} that contribute resource attributes based on the OpenInference specification. 12 | */ 13 | public class OpenInferenceResourceContributor implements ResourceContributor { 14 | 15 | @Override 16 | public void contribute(ResourceBuilder builder) { 17 | String serviceName = builder.build().getAttribute(AttributeKey.stringKey("service.name")); 18 | builder.put(SemanticResourceAttributes.SEMRESATTRS_PROJECT_NAME, serviceName); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/metrics/exporter/HistogramAggregationStrategy.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.metrics.exporter; 2 | 3 | import io.opentelemetry.sdk.metrics.internal.view.Base2ExponentialHistogramAggregation; 4 | import io.opentelemetry.sdk.metrics.internal.view.ExplicitBucketHistogramAggregation; 5 | 6 | /** 7 | * The strategy for the aggregation of histograms. 8 | */ 9 | public enum HistogramAggregationStrategy { 10 | 11 | /** 12 | * Uses a base-2 exponential strategy to compress bucket boundaries 13 | * and an integer scale parameter to manage the histogram resolution. 14 | * @see Base2ExponentialHistogramAggregation#getDefault() 15 | */ 16 | BASE2_EXPONENTIAL_BUCKET_HISTOGRAM, 17 | 18 | /** 19 | * Uses a pre-defined, fixed bucketing strategy to establish histogram bucket boundaries. 20 | * @see ExplicitBucketHistogramAggregation#getDefault() 21 | */ 22 | EXPLICIT_BUCKET_HISTOGRAM 23 | 24 | } 25 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/metrics/exporter/AggregationTemporalityStrategy.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.metrics.exporter; 2 | 3 | import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector; 4 | 5 | /** 6 | * The temporality of the aggregation of metrics. 7 | */ 8 | public enum AggregationTemporalityStrategy { 9 | 10 | /** 11 | * All instruments will have cumulative temporality. 12 | * @see AggregationTemporalitySelector#alwaysCumulative() 13 | */ 14 | CUMULATIVE, 15 | 16 | /** 17 | * Counter (sync and async) and histograms will be delta, 18 | * up-down counters (sync and async) will be cumulative. 19 | * @see AggregationTemporalitySelector#deltaPreferred() 20 | */ 21 | DELTA, 22 | 23 | /** 24 | * Sync counter and histograms will be delta, 25 | * async counter and up-down counters (sync and async) will be cumulative. 26 | * @see AggregationTemporalitySelector#lowMemory() 27 | */ 28 | LOW_MEMORY 29 | 30 | } 31 | -------------------------------------------------------------------------------- /docs/modules/opentelemetry/pages/migration.adoc: -------------------------------------------------------------------------------- 1 | = Migration 2 | 3 | Arconia provides unified observability for Spring Boot applications, combining full support for https://opentelemetry.io/docs/what-is-opentelemetry/[OpenTelemetry] API, SDK, and Instrumentation with full support for https://micrometer.io[Micrometer] API and Instrumentation. The goal is to provide a single, unified observability solution for Spring Boot applications that can give you the best of both worlds: the standardization and ubiquity of OpenTelemetry and the robustness and stability of Micrometer. 4 | 5 | If you're currently using Spring Boot OpenTelemetry/OTLP or the OpenTelemetry Spring Boot Starter and want to migrate to Arconia OpenTelemetry, these guides will help you understand the differences between the two and how to migrate seamlessly your existing Spring Boot applications to Arconia OpenTelemetry. 6 | 7 | * xref:migration/migration-spring-boot.adoc[Migrating from Spring Boot OpenTelemetry/OTLP to Arconia OpenTelemetry] 8 | * xref:migration/migration-opentelemetry.adoc[Migrating from OpenTelemetry Spring Boot Starter to Arconia OpenTelemetry]. 9 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/logs/exporter/ConditionalOnOpenTelemetryLoggingExporter.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.logs.exporter; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | import org.springframework.context.annotation.Conditional; 10 | 11 | import io.bootkit.opentelemetry.autoconfigure.logs.ConditionalOnOpenTelemetryLogging; 12 | 13 | /** 14 | * Whether OpenTelemetry logs should be exported using the specified exporter type. 15 | */ 16 | @Retention(RetentionPolicy.RUNTIME) 17 | @Target({ ElementType.TYPE, ElementType.METHOD }) 18 | @Documented 19 | @ConditionalOnOpenTelemetryLogging 20 | @Conditional(OnOpenTelemetryLoggingExporterCondition.class) 21 | public @interface ConditionalOnOpenTelemetryLoggingExporter { 22 | 23 | /** 24 | * The type name of the OpenTelemetry logs exporter. 25 | */ 26 | String value(); 27 | 28 | } 29 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/context/events/HolderTenantContextEventListener.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.context.events; 2 | 3 | import io.bootkit.core.support.Incubating; 4 | import io.bootkit.multitenancy.core.context.TenantContextHolder; 5 | import io.bootkit.multitenancy.core.events.TenantEvent; 6 | import io.bootkit.multitenancy.core.events.TenantEventListener; 7 | 8 | /** 9 | * A {@link TenantEventListener} that sets/clears the tenant identifier from the current 10 | * context on the {@link TenantContextHolder}. 11 | */ 12 | @Incubating(since = "0.1.0") 13 | public final class HolderTenantContextEventListener implements TenantEventListener { 14 | 15 | @Override 16 | public void onApplicationEvent(TenantEvent tenantEvent) { 17 | if (tenantEvent instanceof TenantContextAttachedEvent event) { 18 | TenantContextHolder.setTenantIdentifier(event.getTenantIdentifier()); 19 | } else if (tenantEvent instanceof TenantContextClosedEvent) { 20 | TenantContextHolder.clear(); 21 | } 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/traces/exporter/ConditionalOnOpenTelemetryTracingExporter.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.traces.exporter; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | import org.springframework.context.annotation.Conditional; 10 | 11 | import io.bootkit.opentelemetry.autoconfigure.traces.ConditionalOnOpenTelemetryTracing; 12 | 13 | /** 14 | * Whether OpenTelemetry traces should be exported using the specified exporter type. 15 | */ 16 | @Retention(RetentionPolicy.RUNTIME) 17 | @Target({ ElementType.TYPE, ElementType.METHOD }) 18 | @Documented 19 | @ConditionalOnOpenTelemetryTracing 20 | @Conditional(OnOpenTelemetryTracingExporterCondition.class) 21 | public @interface ConditionalOnOpenTelemetryTracingExporter { 22 | 23 | /** 24 | * The type name of the OpenTelemetry traces exporter. 25 | */ 26 | String value(); 27 | 28 | } 29 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/metrics/exporter/ConditionalOnOpenTelemetryMetricsExporter.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.metrics.exporter; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | import org.springframework.context.annotation.Conditional; 10 | 11 | import io.bootkit.opentelemetry.autoconfigure.metrics.ConditionalOnOpenTelemetryMetrics; 12 | 13 | /** 14 | * Whether OpenTelemetry metrics should be exported using the specified exporter type. 15 | */ 16 | @Retention(RetentionPolicy.RUNTIME) 17 | @Target({ ElementType.TYPE, ElementType.METHOD }) 18 | @Documented 19 | @ConditionalOnOpenTelemetryMetrics 20 | @Conditional(OnOpenTelemetryMetricsExporterCondition.class) 21 | public @interface ConditionalOnOpenTelemetryMetricsExporter { 22 | 23 | /** 24 | * The type name of the OpenTelemetry metrics exporter. 25 | */ 26 | String value(); 27 | 28 | } 29 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/resource/ConditionalOnOpenTelemetryResourceContributor.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.resource; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | import org.springframework.context.annotation.Conditional; 10 | 11 | /** 12 | * Indicates when the given resource contributor is eligible for registration. 13 | */ 14 | @Retention(RetentionPolicy.RUNTIME) 15 | @Target({ ElementType.TYPE, ElementType.METHOD }) 16 | @Documented 17 | @Conditional(OnOpenTelemetryResourceContributorCondition.class) 18 | public @interface ConditionalOnOpenTelemetryResourceContributor { 19 | 20 | /** 21 | * The name of the resource contributor. 22 | */ 23 | String value(); 24 | 25 | /** 26 | * If the condition should match if no property is defined for the resource contributor. 27 | */ 28 | boolean matchIfMissing() default false; 29 | 30 | } 31 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-openinference-semantic-conventions/src/test/java/io/bootkit/openinference/observation/autoconfigure/ai/OpenInferencePropertiesTests.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.openinference.observation.autoconfigure.ai; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import static org.assertj.core.api.Assertions.assertThat; 6 | 7 | /** 8 | * Unit tests for {@link OpenInferenceProperties}. 9 | */ 10 | class OpenInferencePropertiesTests { 11 | 12 | @Test 13 | void shouldCreateInstanceWithDefaultValues() { 14 | OpenInferenceProperties properties = new OpenInferenceProperties(); 15 | 16 | assertThat(properties.isEnabled()).isTrue(); 17 | assertThat(properties.getTraces()).isNotNull(); 18 | } 19 | 20 | @Test 21 | void shouldUpdateValues() { 22 | OpenInferenceProperties properties = new OpenInferenceProperties(); 23 | 24 | properties.setEnabled(false); 25 | properties.getTraces().setHideInputMessages(true); 26 | 27 | assertThat(properties.isEnabled()).isFalse(); 28 | assertThat(properties.getTraces().isHideInputMessages()).isTrue(); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-openinference-semantic-conventions/src/test/java/io/bootkit/openinference/observation/instrumentation/ai/OpenInferenceGenerativeAiOnlyObservationPredicateTests.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.openinference.observation.instrumentation.ai; 2 | 3 | import io.micrometer.observation.Observation; 4 | 5 | import org.junit.jupiter.api.Test; 6 | import org.mockito.Mockito; 7 | 8 | import static org.assertj.core.api.Assertions.assertThat; 9 | 10 | /** 11 | * Unit tests for {@link OpenInferenceGenerativeAiOnlyObservationPredicate}. 12 | */ 13 | class OpenInferenceGenerativeAiOnlyObservationPredicateTests { 14 | 15 | OpenInferenceGenerativeAiOnlyObservationPredicate predicate = new OpenInferenceGenerativeAiOnlyObservationPredicate(); 16 | 17 | @Test 18 | void whenSpringAiObservationThenKeep() { 19 | assertThat(predicate.test("spring.ai.client", Mockito.mock(Observation.Context.class))).isTrue(); 20 | } 21 | 22 | @Test 23 | void whenNonSpringAiObservationThenRemove() { 24 | assertThat(predicate.test("http.requests.count", Mockito.mock(Observation.Context.class))).isFalse(); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | # Environment Post Processors 2 | org.springframework.boot.env.EnvironmentPostProcessor=\ 3 | io.arconia.opentelemetry.autoconfigure.config.OpenTelemetryEnvironmentPostProcessor,\ 4 | io.arconia.opentelemetry.autoconfigure.config.SpringBootEnvironmentPostProcessor 5 | 6 | # Connection Details Factories 7 | org.springframework.boot.autoconfigure.service.connection.ConnectionDetailsFactory=\ 8 | io.arconia.opentelemetry.testcontainers.LgtmOtlpLoggingContainerConnectionDetailsFactory,\ 9 | io.arconia.opentelemetry.testcontainers.LgtmOtlpMetricsContainerConnectionDetailsFactory,\ 10 | io.arconia.opentelemetry.testcontainers.LgtmOtlpTracingContainerConnectionDetailsFactory,\ 11 | io.arconia.opentelemetry.testcontainers.OtelCollectorOtlpLoggingContainerConnectionDetailsFactory,\ 12 | io.arconia.opentelemetry.testcontainers.OtelCollectorOtlpMetricsContainerConnectionDetailsFactory,\ 13 | io.arconia.opentelemetry.testcontainers.OtelCollectorOtlpTracingContainerConnectionDetailsFactory,\ 14 | io.arconia.opentelemetry.testcontainers.PhoenixOtlpTracingContainerConnectionDetailsFactory 15 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/traces/exporter/console/ConsoleTracingExporterConfiguration.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.traces.exporter.console; 2 | 3 | import io.opentelemetry.exporter.logging.LoggingSpanExporter; 4 | 5 | import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 6 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 7 | import org.springframework.context.annotation.Bean; 8 | import org.springframework.context.annotation.Configuration; 9 | 10 | import io.bootkit.opentelemetry.autoconfigure.traces.exporter.ConditionalOnOpenTelemetryTracingExporter; 11 | 12 | /** 13 | * Auto-configuration for exporting traces to the console. 14 | */ 15 | @Configuration(proxyBeanMethods = false) 16 | @ConditionalOnClass({ LoggingSpanExporter.class }) 17 | @ConditionalOnOpenTelemetryTracingExporter("console") 18 | public final class ConsoleTracingExporterConfiguration { 19 | 20 | @Bean 21 | @ConditionalOnMissingBean 22 | LoggingSpanExporter consoleSpanExporter() { 23 | return LoggingSpanExporter.create(); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/events/DefaultTenantEventPublisher.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.events; 2 | 3 | import org.springframework.context.ApplicationEventPublisher; 4 | import org.springframework.util.Assert; 5 | 6 | import io.bootkit.core.support.Incubating; 7 | 8 | /** 9 | * An implementation of {@link TenantEventPublisher} that uses Spring's event publishing 10 | * support. 11 | */ 12 | @Incubating(since = "0.1.0") 13 | public class DefaultTenantEventPublisher implements TenantEventPublisher { 14 | 15 | private final ApplicationEventPublisher applicationEventPublisher; 16 | 17 | public DefaultTenantEventPublisher(ApplicationEventPublisher applicationEventPublisher) { 18 | Assert.notNull(applicationEventPublisher, "applicationEventPublisher cannot be null"); 19 | this.applicationEventPublisher = applicationEventPublisher; 20 | } 21 | 22 | @Override 23 | public void publishTenantEvent(TenantEvent tenantEvent) { 24 | Assert.notNull(tenantEvent, "tenantEvent cannot be null"); 25 | applicationEventPublisher.publishEvent(tenantEvent); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/metrics/exporter/console/ConsoleMetricsExporterConfiguration.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.metrics.exporter.console; 2 | 3 | import io.opentelemetry.exporter.logging.LoggingMetricExporter; 4 | 5 | import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 6 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 7 | import org.springframework.context.annotation.Bean; 8 | import org.springframework.context.annotation.Configuration; 9 | 10 | import io.bootkit.opentelemetry.autoconfigure.metrics.exporter.ConditionalOnOpenTelemetryMetricsExporter; 11 | 12 | /** 13 | * Auto-configuration for exporting metrics to the console. 14 | */ 15 | @Configuration(proxyBeanMethods = false) 16 | @ConditionalOnClass({ LoggingMetricExporter.class }) 17 | @ConditionalOnOpenTelemetryMetricsExporter("console") 18 | public final class ConsoleMetricsExporterConfiguration { 19 | 20 | @Bean 21 | @ConditionalOnMissingBean 22 | LoggingMetricExporter consoleMetricExporter() { 23 | return LoggingMetricExporter.create(); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/logs/exporter/console/ConsoleLoggingExporterConfiguration.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.logs.exporter.console; 2 | 3 | import io.opentelemetry.exporter.logging.SystemOutLogRecordExporter; 4 | 5 | import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 6 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 7 | import org.springframework.context.annotation.Bean; 8 | import org.springframework.context.annotation.Configuration; 9 | 10 | import io.bootkit.opentelemetry.autoconfigure.logs.exporter.ConditionalOnOpenTelemetryLoggingExporter; 11 | 12 | /** 13 | * Configuration for exporting logs to the console. 14 | */ 15 | @Configuration(proxyBeanMethods = false) 16 | @ConditionalOnClass({ SystemOutLogRecordExporter.class }) 17 | @ConditionalOnOpenTelemetryLoggingExporter("console") 18 | public final class ConsoleLoggingExporterConfiguration { 19 | 20 | @Bean 21 | @ConditionalOnMissingBean 22 | SystemOutLogRecordExporter consoleLogRecordExporter() { 23 | return SystemOutLogRecordExporter.create(); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/context/resolvers/FixedTenantResolver.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.context.resolvers; 2 | 3 | import org.jspecify.annotations.NonNull; 4 | import org.springframework.util.Assert; 5 | 6 | import io.bootkit.core.support.Incubating; 7 | 8 | /** 9 | * Strategy to use a fixed value as the current tenant, regardless of the source context. 10 | */ 11 | @Incubating(since = "0.1.0") 12 | public final class FixedTenantResolver implements TenantResolver { 13 | 14 | public static final String DEFAULT_FIXED_TENANT_IDENTIFIER = "default"; 15 | 16 | private final String fixedTenantIdentifier; 17 | 18 | public FixedTenantResolver() { 19 | fixedTenantIdentifier = DEFAULT_FIXED_TENANT_IDENTIFIER; 20 | } 21 | 22 | public FixedTenantResolver(String tenantIdentifier) { 23 | Assert.hasText(tenantIdentifier, "tenantIdentifier cannot be null or empty"); 24 | this.fixedTenantIdentifier = tenantIdentifier; 25 | } 26 | 27 | @Override 28 | @NonNull 29 | public String resolveTenantIdentifier(Object source) { 30 | return fixedTenantIdentifier; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry-logback-bridge/src/test/java/io/bootkit/opentelemetry/logback/autoconfigure/LogbackOpenTelemetryBridgePropertiesTests.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.logback.autoconfigure; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import static org.assertj.core.api.Assertions.assertThat; 6 | 7 | /** 8 | * Unit tests for {@link LogbackOpenTelemetryBridgeProperties}. 9 | */ 10 | class LogbackOpenTelemetryBridgePropertiesTests { 11 | 12 | @Test 13 | void shouldHaveCorrectConfigPrefix() { 14 | assertThat(LogbackOpenTelemetryBridgeProperties.CONFIG_PREFIX) 15 | .isEqualTo("bootkit.otel.logs.logback-bridge"); 16 | } 17 | 18 | @Test 19 | void shouldCreateInstanceWithDefaultValues() { 20 | LogbackOpenTelemetryBridgeProperties properties = new LogbackOpenTelemetryBridgeProperties(); 21 | assertThat(properties.isEnabled()).isTrue(); 22 | } 23 | 24 | @Test 25 | void shouldUpdateEnabled() { 26 | LogbackOpenTelemetryBridgeProperties properties = new LogbackOpenTelemetryBridgeProperties(); 27 | properties.setEnabled(false); 28 | assertThat(properties.isEnabled()).isFalse(); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/logs/exporter/OpenTelemetryLoggingExporterAutoConfiguration.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.logs.exporter; 2 | 3 | import org.springframework.boot.autoconfigure.AutoConfiguration; 4 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 5 | import org.springframework.context.annotation.Import; 6 | 7 | import io.bootkit.opentelemetry.autoconfigure.logs.ConditionalOnOpenTelemetryLogging; 8 | import io.bootkit.opentelemetry.autoconfigure.logs.exporter.console.ConsoleLoggingExporterConfiguration; 9 | import io.bootkit.opentelemetry.autoconfigure.logs.exporter.otlp.OtlpLoggingExporterConfiguration; 10 | 11 | /** 12 | * Auto-configuration for exporting OpenTelemetry logs. 13 | */ 14 | @AutoConfiguration(before = org.springframework.boot.actuate.autoconfigure.logging.otlp.OtlpLoggingAutoConfiguration.class) 15 | @ConditionalOnOpenTelemetryLogging 16 | @Import({ ConsoleLoggingExporterConfiguration.class, OtlpLoggingExporterConfiguration.class }) 17 | @EnableConfigurationProperties(OpenTelemetryLoggingExporterProperties.class) 18 | public final class OpenTelemetryLoggingExporterAutoConfiguration {} 19 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-web/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-multitenancy:bootkit-multitenancy-core") 13 | 14 | implementation "com.fasterxml.jackson.core:jackson-databind" 15 | implementation "jakarta.servlet:jakarta.servlet-api" 16 | implementation "org.springframework.boot:spring-boot-starter" 17 | implementation "org.springframework:spring-context" 18 | implementation "org.springframework:spring-webmvc" 19 | 20 | testImplementation "org.springframework.boot:spring-boot-starter-test" 21 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 22 | } 23 | 24 | publishing { 25 | publications { 26 | mavenJava(MavenPublication) { 27 | pom { 28 | name = "BootKit Multitenancy Web" 29 | description = "BootKit Multitenancy Web" 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/traces/exporter/OpenTelemetryTracingExporterAutoConfiguration.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.traces.exporter; 2 | 3 | import org.springframework.boot.autoconfigure.AutoConfiguration; 4 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 5 | import org.springframework.context.annotation.Import; 6 | 7 | import io.bootkit.opentelemetry.autoconfigure.traces.ConditionalOnOpenTelemetryTracing; 8 | import io.bootkit.opentelemetry.autoconfigure.traces.exporter.console.ConsoleTracingExporterConfiguration; 9 | import io.bootkit.opentelemetry.autoconfigure.traces.exporter.otlp.OtlpTracingExporterConfiguration; 10 | 11 | /** 12 | * Auto-configuration for exporting OpenTelemetry traces. 13 | */ 14 | @AutoConfiguration(before = org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingAutoConfiguration.class) 15 | @ConditionalOnOpenTelemetryTracing 16 | @Import({ ConsoleTracingExporterConfiguration.class, OtlpTracingExporterConfiguration.class }) 17 | @EnableConfigurationProperties(OpenTelemetryTracingExporterProperties.class) 18 | public final class OpenTelemetryTracingExporterAutoConfiguration {} 19 | -------------------------------------------------------------------------------- /bootkit-spring-boot/src/test/java/io/bootkit/boot/bootstrap/BootstrapModeTests.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.boot.bootstrap; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import static org.assertj.core.api.Assertions.assertThat; 6 | 7 | /** 8 | * Unit tests for {@link BootstrapMode}. 9 | */ 10 | class BootstrapModeTests { 11 | 12 | @Test 13 | void whenValidEnumValue() { 14 | assertThat(BootstrapMode.isValid("DEV")).isTrue(); 15 | assertThat(BootstrapMode.isValid("TEST")).isTrue(); 16 | assertThat(BootstrapMode.isValid("PROD")).isTrue(); 17 | assertThat(BootstrapMode.isValid("dev")).isTrue(); 18 | assertThat(BootstrapMode.isValid("test")).isTrue(); 19 | assertThat(BootstrapMode.isValid("prod")).isTrue(); 20 | assertThat(BootstrapMode.isValid("\n dev")).isTrue(); 21 | assertThat(BootstrapMode.isValid(" test")).isTrue(); 22 | assertThat(BootstrapMode.isValid("prod \n")).isTrue(); 23 | } 24 | 25 | @Test 26 | void whenInvalidEnumValue() { 27 | assertThat(BootstrapMode.isValid("INVALID")).isFalse(); 28 | assertThat(BootstrapMode.isValid("")).isFalse(); 29 | assertThat(BootstrapMode.isValid(null)).isFalse(); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-kafka/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-dev:bootkit-dev-services:bootkit-dev-services-core") 13 | api "org.springframework.boot:spring-boot-testcontainers" 14 | api "org.testcontainers:kafka" 15 | 16 | implementation "org.springframework.boot:spring-boot-starter" 17 | 18 | optional "org.springframework.boot:spring-boot-devtools" 19 | 20 | testImplementation "org.springframework.boot:spring-boot-starter-test" 21 | testImplementation "org.testcontainers:junit-jupiter" 22 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 23 | } 24 | 25 | publishing { 26 | publications { 27 | mavenJava(MavenPublication) { 28 | pom { 29 | name = "BootKit Dev Services Kafka" 30 | description = "BootKit Dev Services Kafka." 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-lldap/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-dev:bootkit-dev-services:bootkit-dev-services-core") 13 | api "org.springframework.boot:spring-boot-testcontainers" 14 | api "org.testcontainers:ldap" 15 | 16 | implementation "org.springframework.boot:spring-boot-starter" 17 | 18 | optional "org.springframework.boot:spring-boot-devtools" 19 | 20 | testImplementation "org.springframework.boot:spring-boot-starter-test" 21 | testImplementation "org.testcontainers:junit-jupiter" 22 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 23 | } 24 | 25 | publishing { 26 | publications { 27 | mavenJava(MavenPublication) { 28 | pom { 29 | name = "BootKit Dev Services LLDAP" 30 | description = "BootKit Dev Services LLDAP." 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/context/events/TenantContextAttachedEvent.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.context.events; 2 | 3 | import io.micrometer.observation.Observation.Context; 4 | 5 | import org.jspecify.annotations.Nullable; 6 | import org.springframework.util.Assert; 7 | 8 | import io.bootkit.core.support.Incubating; 9 | import io.bootkit.multitenancy.core.events.TenantEvent; 10 | 11 | /** 12 | * A {@link TenantEvent} which indicates a tenant has been attached to the current 13 | * context. 14 | */ 15 | @Incubating(since = "0.1.0") 16 | public final class TenantContextAttachedEvent extends TenantEvent { 17 | 18 | @Nullable 19 | private Context observationContext; 20 | 21 | public TenantContextAttachedEvent(String tenantIdentifier, Object object) { 22 | super(tenantIdentifier, object); 23 | } 24 | 25 | @Nullable 26 | public Context getObservationContext() { 27 | return observationContext; 28 | } 29 | 30 | public void setObservationContext(Context observationContext) { 31 | Assert.notNull(observationContext, "observationContext cannot be null"); 32 | this.observationContext = observationContext; 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-mongodb/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-dev:bootkit-dev-services:bootkit-dev-services-core") 13 | api "org.springframework.boot:spring-boot-testcontainers" 14 | api "org.testcontainers:mongodb" 15 | 16 | implementation "org.springframework.boot:spring-boot-starter" 17 | 18 | optional "org.springframework.boot:spring-boot-devtools" 19 | 20 | testImplementation "org.springframework.boot:spring-boot-starter-test" 21 | testImplementation "org.testcontainers:junit-jupiter" 22 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 23 | } 24 | 25 | publishing { 26 | publications { 27 | mavenJava(MavenPublication) { 28 | pom { 29 | name = "BootKit Dev Services MongoDB" 30 | description = "BootKit Dev Services MongoDB." 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-pulsar/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-dev:bootkit-dev-services:bootkit-dev-services-core") 13 | api "org.springframework.boot:spring-boot-testcontainers" 14 | api "org.testcontainers:pulsar" 15 | 16 | implementation "org.springframework.boot:spring-boot-starter" 17 | 18 | optional "org.springframework.boot:spring-boot-devtools" 19 | 20 | testImplementation "org.springframework.boot:spring-boot-starter-test" 21 | testImplementation "org.testcontainers:junit-jupiter" 22 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 23 | } 24 | 25 | publishing { 26 | publications { 27 | mavenJava(MavenPublication) { 28 | pom { 29 | name = "BootKit Dev Services Pulsar" 30 | description = "BootKit Dev Services Pulsar." 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-redis/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-dev:bootkit-dev-services:bootkit-dev-services-core") 13 | api "org.springframework.boot:spring-boot-testcontainers" 14 | api "org.testcontainers:junit-jupiter" 15 | 16 | implementation "org.springframework.boot:spring-boot-starter" 17 | 18 | optional "org.springframework.boot:spring-boot-devtools" 19 | 20 | testImplementation "org.springframework.boot:spring-boot-starter-test" 21 | testImplementation "org.testcontainers:junit-jupiter" 22 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 23 | } 24 | 25 | publishing { 26 | publications { 27 | mavenJava(MavenPublication) { 28 | pom { 29 | name = "BootKit Dev Services Redis" 30 | description = "BootKit Dev Services Redis." 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/test/java/io/bootkit/multitenancy/core/tenantdetails/TenantTests.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.tenantdetails; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import static org.assertj.core.api.Assertions.assertThat; 6 | import static org.assertj.core.api.Assertions.assertThatThrownBy; 7 | 8 | /** 9 | * Unit tests for {@link Tenant}. 10 | */ 11 | class TenantTests { 12 | 13 | @Test 14 | void whenIdentifierIsNullThenThrow() { 15 | assertThatThrownBy(() -> Tenant.create().build()).isInstanceOf(IllegalArgumentException.class) 16 | .hasMessageContaining("identifier cannot be null or empty"); 17 | } 18 | 19 | @Test 20 | void whenIdentifierIsEmptyThenThrow() { 21 | assertThatThrownBy(() -> Tenant.create().identifier("").build()).isInstanceOf(IllegalArgumentException.class) 22 | .hasMessageContaining("identifier cannot be null or empty"); 23 | } 24 | 25 | @Test 26 | void whenAttributesIsNullThenUseEmptyMap() { 27 | var tenant = Tenant.create().identifier("acme").attributes(null).build(); 28 | assertThat(tenant.getAttributes()).isNotNull(); 29 | assertThat(tenant.getAttributes()).isEmpty(); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-rabbitmq/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-dev:bootkit-dev-services:bootkit-dev-services-core") 13 | api "org.springframework.boot:spring-boot-testcontainers" 14 | api "org.testcontainers:rabbitmq" 15 | 16 | implementation "org.springframework.boot:spring-boot-starter" 17 | 18 | optional "org.springframework.boot:spring-boot-devtools" 19 | 20 | testImplementation "org.springframework.boot:spring-boot-starter-test" 21 | testImplementation "org.testcontainers:junit-jupiter" 22 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 23 | } 24 | 25 | publishing { 26 | publications { 27 | mavenJava(MavenPublication) { 28 | pom { 29 | name = "BootKit Dev Services RabbitMQ" 30 | description = "BootKit Dev Services RabbitMQ." 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-artemis/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-dev:bootkit-dev-services:bootkit-dev-services-core") 13 | api "org.springframework.boot:spring-boot-testcontainers" 14 | api "org.testcontainers:activemq" 15 | 16 | implementation "org.springframework.boot:spring-boot-starter" 17 | 18 | optional "org.springframework.boot:spring-boot-devtools" 19 | 20 | testImplementation "org.springframework.boot:spring-boot-starter-test" 21 | testImplementation "org.testcontainers:junit-jupiter" 22 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 23 | } 24 | 25 | publishing { 26 | publications { 27 | mavenJava(MavenPublication) { 28 | pom { 29 | name = "BootKit Dev Services ActiveMQ Artemis" 30 | description = "BootKit Dev Services ActiveMQ Artemis." 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /bootkit-integrations/bootkit-docling/src/main/java/io/bootkit/docling/client/DoclingServeClient.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.docling.client; 2 | 3 | import org.springframework.web.bind.annotation.RequestBody; 4 | import org.springframework.web.service.annotation.GetExchange; 5 | import org.springframework.web.service.annotation.PostExchange; 6 | 7 | import ai.docling.api.serve.DoclingServeApi; 8 | import ai.docling.api.serve.convert.request.ConvertDocumentRequest; 9 | import ai.docling.api.serve.convert.response.ConvertDocumentResponse; 10 | import ai.docling.api.serve.health.HealthCheckResponse; 11 | 12 | /** 13 | * Client interface for interacting with the Docling Serve API. 14 | */ 15 | public interface DoclingServeClient extends DoclingServeApi { 16 | 17 | @GetExchange(url = "/health") 18 | @Override 19 | HealthCheckResponse health(); 20 | 21 | @PostExchange(url = "/v1/convert/source") 22 | @Override 23 | ConvertDocumentResponse convertSource(@RequestBody ConvertDocumentRequest request); 24 | 25 | @Override 26 | default > DoclingApiBuilder toBuilder() { 27 | throw new UnsupportedOperationException("The BootKit DoclingClient does not support this operation."); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/main/java/io/bootkit/multitenancy/core/autoconfigure/FixedTenantResolutionProperties.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.autoconfigure; 2 | 3 | import org.springframework.boot.context.properties.ConfigurationProperties; 4 | 5 | /** 6 | * Configuration properties for fixed tenant resolution. 7 | */ 8 | @ConfigurationProperties(prefix = FixedTenantResolutionProperties.CONFIG_PREFIX) 9 | public class FixedTenantResolutionProperties { 10 | 11 | public static final String CONFIG_PREFIX = "bootkit.multitenancy.resolution.fixed"; 12 | 13 | /** 14 | * Whether a fixed tenant resolution strategy should be used. 15 | */ 16 | private boolean enabled = false; 17 | 18 | /** 19 | * Identifier of the fixed tenant to use in each context. 20 | */ 21 | private String tenantIdentifier = "default"; 22 | 23 | public boolean isEnabled() { 24 | return enabled; 25 | } 26 | 27 | public void setEnabled(boolean enabled) { 28 | this.enabled = enabled; 29 | } 30 | 31 | public String getTenantIdentifier() { 32 | return tenantIdentifier; 33 | } 34 | 35 | public void setTenantIdentifier(String tenantIdentifier) { 36 | this.tenantIdentifier = tenantIdentifier; 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-openinference-semantic-conventions/src/main/java/io/bootkit/openinference/observation/autoconfigure/ai/OpenInferenceResourceConfiguration.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.openinference.observation.autoconfigure.ai; 2 | 3 | import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.core.annotation.Order; 7 | 8 | import io.bootkit.openinference.observation.instrumentation.ai.OpenInferenceResourceContributor; 9 | import io.bootkit.opentelemetry.autoconfigure.resource.OpenTelemetryResourceAutoConfiguration; 10 | import io.bootkit.opentelemetry.autoconfigure.resource.contributor.ResourceContributor; 11 | 12 | /** 13 | * Auto-configuration for OpenInference Resource instrumentation. 14 | */ 15 | @Configuration(proxyBeanMethods = false) 16 | @ConditionalOnClass({OpenTelemetryResourceAutoConfiguration.class, ResourceContributor.class}) 17 | class OpenInferenceResourceConfiguration { 18 | 19 | @Bean 20 | @Order(OpenTelemetryResourceAutoConfiguration.DEFAULT_ORDER) 21 | OpenInferenceResourceContributor openInferenceResourceContributor() { 22 | return new OpenInferenceResourceContributor(); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-mysql/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-dev:bootkit-dev-services:bootkit-dev-services-core") 13 | api "org.springframework.boot:spring-boot-testcontainers" 14 | api "org.testcontainers:mysql" 15 | 16 | implementation "org.springframework.boot:spring-boot-starter" 17 | 18 | optional "org.springframework.boot:spring-boot-devtools" 19 | 20 | testImplementation "org.springframework.boot:spring-boot-starter-test" 21 | testImplementation "org.testcontainers:junit-jupiter" 22 | testRuntimeOnly "com.mysql:mysql-connector-j" 23 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 24 | } 25 | 26 | publishing { 27 | publications { 28 | mavenJava(MavenPublication) { 29 | pom { 30 | name = "BootKit Dev Services MySQL" 31 | description = "BootKit Dev Services MySQL." 32 | } 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-mariadb/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-dev:bootkit-dev-services:bootkit-dev-services-core") 13 | api "org.springframework.boot:spring-boot-testcontainers" 14 | api "org.testcontainers:mariadb" 15 | 16 | implementation "org.springframework.boot:spring-boot-starter" 17 | 18 | optional "org.springframework.boot:spring-boot-devtools" 19 | 20 | testImplementation "org.springframework.boot:spring-boot-starter-test" 21 | testImplementation "org.testcontainers:junit-jupiter" 22 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 23 | testRuntimeOnly "org.mariadb.jdbc:mariadb-java-client" 24 | } 25 | 26 | publishing { 27 | publications { 28 | mavenJava(MavenPublication) { 29 | pom { 30 | name = "BootKit Dev Services MariaDB" 31 | description = "BootKit Dev Services MariaDB." 32 | } 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-oracle/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-dev:bootkit-dev-services:bootkit-dev-services-core") 13 | api "org.springframework.boot:spring-boot-testcontainers" 14 | api "org.testcontainers:oracle-free" 15 | 16 | implementation "org.springframework.boot:spring-boot-starter" 17 | 18 | optional "org.springframework.boot:spring-boot-devtools" 19 | 20 | testImplementation "org.springframework.boot:spring-boot-starter-test" 21 | testImplementation "org.testcontainers:junit-jupiter" 22 | testRuntimeOnly "com.oracle.database.jdbc:ojdbc11" 23 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 24 | } 25 | 26 | publishing { 27 | publications { 28 | mavenJava(MavenPublication) { 29 | pom { 30 | name = "BootKit Dev Services Oracle" 31 | description = "BootKit Dev Services Oracle." 32 | } 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-postgresql/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-dev:bootkit-dev-services:bootkit-dev-services-core") 13 | api "org.springframework.boot:spring-boot-testcontainers" 14 | api "org.testcontainers:postgresql" 15 | 16 | implementation "org.springframework.boot:spring-boot-starter" 17 | 18 | optional "org.springframework.boot:spring-boot-devtools" 19 | 20 | testImplementation "org.springframework.boot:spring-boot-starter-test" 21 | testImplementation "org.testcontainers:junit-jupiter" 22 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 23 | testRuntimeOnly "org.postgresql:postgresql" 24 | } 25 | 26 | publishing { 27 | publications { 28 | mavenJava(MavenPublication) { 29 | pom { 30 | name = "BootKit Dev Services PostgreSQL" 31 | description = "BootKit Dev Services PostgreSQL." 32 | } 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-web/src/main/java/io/bootkit/multitenancy/web/context/resolvers/HeaderTenantResolver.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.web.context.resolvers; 2 | 3 | import jakarta.servlet.http.HttpServletRequest; 4 | 5 | import org.jspecify.annotations.Nullable; 6 | import org.springframework.util.Assert; 7 | 8 | import io.bootkit.core.support.Incubating; 9 | 10 | /** 11 | * Strategy used to resolve the current tenant from a header in an HTTP request. 12 | */ 13 | @Incubating(since = "0.1.0") 14 | public final class HeaderTenantResolver implements HttpRequestTenantResolver { 15 | 16 | public static final String DEFAULT_HEADER_NAME = "X-TenantId"; 17 | 18 | private final String tenantHeaderName; 19 | 20 | public HeaderTenantResolver() { 21 | this.tenantHeaderName = DEFAULT_HEADER_NAME; 22 | } 23 | 24 | public HeaderTenantResolver(String tenantHeaderName) { 25 | Assert.hasText(tenantHeaderName, "tenantHeaderName cannot be null or empty"); 26 | this.tenantHeaderName = tenantHeaderName; 27 | } 28 | 29 | @Override 30 | @Nullable 31 | public String resolveTenantIdentifier(HttpServletRequest request) { 32 | Assert.notNull(request, "request cannot be null"); 33 | return request.getHeader(tenantHeaderName); 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-oracle-xe/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-dev:bootkit-dev-services:bootkit-dev-services-core") 13 | api "org.springframework.boot:spring-boot-testcontainers" 14 | api "org.testcontainers:oracle-xe" 15 | 16 | implementation "org.springframework.boot:spring-boot-starter" 17 | 18 | optional "org.springframework.boot:spring-boot-devtools" 19 | 20 | testImplementation "org.springframework.boot:spring-boot-starter-test" 21 | testImplementation "org.testcontainers:junit-jupiter" 22 | testRuntimeOnly "com.oracle.database.jdbc:ojdbc11" 23 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 24 | } 25 | 26 | publishing { 27 | publications { 28 | mavenJava(MavenPublication) { 29 | pom { 30 | name = "BootKit Dev Services Oracle XE" 31 | description = "BootKit Dev Services Oracle XE." 32 | } 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/test/java/io/bootkit/multitenancy/core/events/TenantEventTests.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.events; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import static org.assertj.core.api.Assertions.assertThatThrownBy; 6 | 7 | /** 8 | * Unit tests for {@link TenantEvent}. 9 | */ 10 | class TenantEventTests { 11 | 12 | @Test 13 | void whenNullTenantIdentifierThenThrow() { 14 | assertThatThrownBy(() -> new TestTenantEvent(null, this)).isInstanceOf(IllegalArgumentException.class) 15 | .hasMessageContaining("tenantIdentifier cannot be null or empty"); 16 | } 17 | 18 | @Test 19 | void whenEmptyTenantIdentifierThenThrow() { 20 | assertThatThrownBy(() -> new TestTenantEvent("", this)).isInstanceOf(IllegalArgumentException.class) 21 | .hasMessageContaining("tenantIdentifier cannot be null or empty"); 22 | } 23 | 24 | @Test 25 | void whenNullSourceThenThrow() { 26 | assertThatThrownBy(() -> new TestTenantEvent("tenant", null)).isInstanceOf(IllegalArgumentException.class); 27 | } 28 | 29 | static class TestTenantEvent extends TenantEvent { 30 | 31 | public TestTenantEvent(String tenantIdentifier, Object source) { 32 | super(tenantIdentifier, source); 33 | } 34 | 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /docs/modules/dev-services/pages/mongodb.adoc: -------------------------------------------------------------------------------- 1 | = MongoDB Dev Service 2 | :service-name: mongodb 3 | 4 | A service providing a https://www.mongodb.com[MongoDB] database for development and testing purposes. 5 | 6 | It works with Spring Boot libraries that support MongoDB including: 7 | 8 | * https://spring.io/projects/spring-data-mongodb[Spring Data MongoDB] 9 | * https://spring.io/projects/spring-session[Spring Session for MongoDB] 10 | 11 | == Dependencies 12 | 13 | include::partial$dependencies.adoc[] 14 | 15 | == Running the Application 16 | 17 | include::partial$running-application.adoc[] 18 | 19 | == Configuring the Dev Service 20 | 21 | You can configure the Dev Service via configuration properties. 22 | 23 | |=== 24 | |Property |Default |Description 25 | 26 | | `arconia.dev.services.mongodb.enabled` 27 | | `true` 28 | | Whether the dev service is enabled. 29 | 30 | | `arconia.dev.services.mongodb.image-name` 31 | | `mongo` 32 | | Full name of the container image used in the dev service. 33 | 34 | | `arconia.dev.services.mongodb.environment` 35 | | `{}` 36 | | Environment variables to set in the service. Example: `MONGO_INITDB_ROOT_USERNAME: "mongodb"`. 37 | 38 | | `arconia.dev.services.mongodb.shared` 39 | | `never` 40 | | When the dev service is shared across applications. 41 | |=== 42 | 43 | include::partial$disabling-dev-service.adoc[] 44 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-docling/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-dev:bootkit-dev-services:bootkit-dev-services-core") 13 | api "ai.docling:docling-testcontainers:${doclingVersion}" 14 | api "org.springframework.boot:spring-boot-testcontainers" 15 | 16 | implementation "org.springframework.boot:spring-boot-starter" 17 | 18 | optional project(":bootkit-integrations:bootkit-docling") 19 | optional "org.springframework.boot:spring-boot-devtools" 20 | 21 | testImplementation "org.springframework.boot:spring-boot-starter-test" 22 | testImplementation "org.testcontainers:junit-jupiter" 23 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 24 | } 25 | 26 | publishing { 27 | publications { 28 | mavenJava(MavenPublication) { 29 | pom { 30 | name = "BootKit Dev Services Docling" 31 | description = "BootKit Dev Services Docling." 32 | } 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-core/src/test/java/io/bootkit/multitenancy/core/context/events/HolderTenantContextEventListenerTests.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.core.context.events; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import io.bootkit.multitenancy.core.context.TenantContextHolder; 6 | 7 | import static org.assertj.core.api.Assertions.assertThat; 8 | 9 | /** 10 | * Unit tests for {@link HolderTenantContextEventListener}. 11 | */ 12 | class HolderTenantContextEventListenerTests { 13 | 14 | @Test 15 | void whenContextIsAttached() { 16 | var listener = new HolderTenantContextEventListener(); 17 | var tenantIdentifier = "acme"; 18 | 19 | listener.onApplicationEvent(new TenantContextAttachedEvent(tenantIdentifier, this)); 20 | 21 | assertThat(TenantContextHolder.getTenantIdentifier()).isEqualTo(tenantIdentifier); 22 | } 23 | 24 | @Test 25 | void whenContextIsClosed() { 26 | var listener = new HolderTenantContextEventListener(); 27 | var tenantIdentifier = "acme"; 28 | 29 | listener.onApplicationEvent(new TenantContextAttachedEvent(tenantIdentifier, this)); 30 | listener.onApplicationEvent(new TenantContextClosedEvent(tenantIdentifier, this)); 31 | 32 | assertThat(TenantContextHolder.getTenantIdentifier()).isNull(); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/index.adoc: -------------------------------------------------------------------------------- 1 | = Arconia Framework 2 | :description: Welcome to the documentation about the Arconia Framework for Java and Spring Boot applications. 3 | 4 | [.hero] 5 | Welcome to Arconia Framework! This documentation will help you get started with the framework and explore its features. 6 | 7 | == What is Arconia? 8 | 9 | Arconia is a framework that acts as an add-on for Spring Boot, designed to enhance modern enterprise applications built with Java. You can add Arconia to an existing Spring Boot application to boost developer experience, reduce boilerplate, and seamlessly adopt cloud native patterns. 10 | 11 | NOTE: The Arconia Framework is currently in active development. We're working hard to improve it and appreciate your patience as we continue to refine the tool. Feel free to try it out and share your feedback! 12 | 13 | == Key Features 14 | 15 | * *Developer Experience*. Support for transparent, zero-code integrations for services your application depends on, both at development and test time. 16 | * *Multitenancy*. Support for multiple tenants across the application, including web, data, security, and configuration. 17 | * *Observability*. Support for OpenTelemetry, bridging the gap between Spring Boot and the rest of the observability ecosystem. 18 | 19 | == Authors 20 | 21 | The Arconia Framework was created by https://thomasvitale.com[Thomas Vitale]. 22 | -------------------------------------------------------------------------------- /docs/modules/dev-services/pages/redis.adoc: -------------------------------------------------------------------------------- 1 | = Redis Dev Service 2 | :service-name: redis 3 | 4 | A service providing a https://redis.io[Redis] data store for development and testing purposes. 5 | 6 | It works with Spring Boot libraries that support REPL or Redis, including: 7 | 8 | * https://spring.io/projects/spring-ai[Spring AI] (Memory, Vector Store) 9 | * https://spring.io/projects/spring-data-redis[Spring Data Redis] 10 | * https://spring.io/projects/spring-session[Spring Session for Redis] 11 | 12 | == Dependencies 13 | 14 | include::partial$dependencies.adoc[] 15 | 16 | == Running the Application 17 | 18 | include::partial$running-application.adoc[] 19 | 20 | == Configuring the Dev Service 21 | 22 | You can configure the Dev Service via configuration properties. 23 | 24 | |=== 25 | |Property |Default |Description 26 | 27 | | `arconia.dev.services.redis.enabled` 28 | | `true` 29 | | Whether the dev service is enabled. 30 | 31 | | `arconia.dev.services.redis.image-name` 32 | | `redis` 33 | | Full name of the container image used in the dev service. 34 | 35 | | `arconia.dev.services.redis.environment` 36 | | `{}` 37 | | Environment variables to set in the service. Example: `REDIS_PASSWORD: "redis"`. 38 | 39 | | `arconia.dev.services.redis.shared` 40 | | `never` 41 | | When the dev service is shared across applications. 42 | |=== 43 | 44 | include::partial$disabling-dev-service.adoc[] 45 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry-micrometer-registry-otlp/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-core") 13 | api "io.micrometer:micrometer-registry-otlp" 14 | 15 | implementation "org.springframework.boot:spring-boot-starter" 16 | 17 | optional project(":bootkit-observability:bootkit-opentelemetry") 18 | optional "org.springframework.boot:spring-boot-starter-actuator" 19 | 20 | testImplementation "org.springframework.boot:spring-boot-starter-test" 21 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 22 | } 23 | 24 | dependencyManagement { 25 | imports { 26 | mavenBom "io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom:${openTelemetryInstrumentationVersion}" 27 | } 28 | } 29 | 30 | publishing { 31 | publications { 32 | mavenJava(MavenPublication) { 33 | pom { 34 | name = "BootKit OpenTelemetry Micrometer Registry OTLP" 35 | description = "BootKit OpenTelemetry Micrometer Registry OTLP." 36 | } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/resource/contributor/BuildResourceContributor.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.resource.contributor; 2 | 3 | import io.opentelemetry.sdk.resources.ResourceBuilder; 4 | import io.opentelemetry.semconv.ServiceAttributes; 5 | 6 | import org.springframework.boot.info.BuildProperties; 7 | import org.springframework.util.StringUtils; 8 | 9 | import io.bootkit.core.support.Incubating; 10 | 11 | /** 12 | * A {@link ResourceContributor} that contributes build information. 13 | *

14 | * The following attributes are populated: 15 | *

    16 | *
  • {@code service.version}
  • 17 | *
18 | * 19 | * @link Resource Service Semantic Conventions 20 | */ 21 | @Incubating 22 | public final class BuildResourceContributor implements ResourceContributor { 23 | 24 | private final BuildProperties buildProperties; 25 | 26 | public BuildResourceContributor(BuildProperties buildProperties) { 27 | this.buildProperties = buildProperties; 28 | } 29 | 30 | @Override 31 | public void contribute(ResourceBuilder builder) { 32 | if (StringUtils.hasText(buildProperties.getVersion())) { 33 | builder.put(ServiceAttributes.SERVICE_VERSION, buildProperties.getVersion()); 34 | } 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /docs/modules/dev-services/pages/lldap.adoc: -------------------------------------------------------------------------------- 1 | = Light LDAP (LLDAP) Dev Service 2 | :service-name: lldap 3 | 4 | A service providing an https://ldap.com[LDAP] instance for development and testing purposes. It's based on https://github.com/lldap/lldap[LLDAP], which is "a lightweight authentication server that provides an opinionated, simplified LDAP interface for authentication". 5 | 6 | It works with Spring Boot libraries that support LDAP, including: 7 | 8 | * https://spring.io/projects/spring-data-ldap[Spring Data LDAP] 9 | 10 | == Dependencies 11 | 12 | include::partial$dependencies.adoc[] 13 | 14 | == Running the Application 15 | 16 | include::partial$running-application.adoc[] 17 | 18 | == Configuring the Dev Service 19 | 20 | You can configure the Dev Service via configuration properties. 21 | 22 | |=== 23 | |Property |Default |Description 24 | 25 | | `arconia.dev.services.lldap.enabled` 26 | | `true` 27 | | Whether the dev service is enabled. 28 | 29 | | `arconia.dev.services.lldap.image-name` 30 | | `lldap/lldap` 31 | | Full name of the container image used in the dev service. 32 | 33 | | `arconia.dev.services.lldap.environment` 34 | | `{}` 35 | | Environment variables to set in the service. Example: `LLDAP_LDAP_BASE_DN: "dc=example,dc=com"`. 36 | 37 | | `arconia.dev.services.lldap.shared` 38 | | `never` 39 | | When the dev service is shared across applications. 40 | |=== 41 | 42 | include::partial$disabling-dev-service.adoc[] 43 | -------------------------------------------------------------------------------- /bootkit-spring-boot/src/main/java/io/bootkit/boot/bootstrap/BootstrapMode.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.boot.bootstrap; 2 | 3 | import org.jspecify.annotations.Nullable; 4 | import org.springframework.util.StringUtils; 5 | 6 | import io.bootkit.core.support.Incubating; 7 | import io.bootkit.core.support.Internal; 8 | 9 | /** 10 | * The mode used to bootstrap the application. 11 | */ 12 | @Incubating(since = "0.13.0") 13 | public enum BootstrapMode { 14 | 15 | DEV, 16 | TEST, 17 | PROD; 18 | 19 | public static final String PROPERTY_KEY = "bootkit.bootstrap.mode"; 20 | 21 | /** 22 | * Determines the application bootstrap mode with heuristics. 23 | */ 24 | public static BootstrapMode detect() { 25 | return BootstrapModeDetector.detect(); 26 | } 27 | 28 | /** 29 | * Clears the detected bootstrap mode cache. 30 | * Do NOT use this method in production code. 31 | */ 32 | @Internal 33 | public static void clear() { 34 | BootstrapModeDetector.clearCache(); 35 | } 36 | 37 | static boolean isValid(@Nullable String modeProperty) { 38 | if (!StringUtils.hasText(modeProperty)) { 39 | return false; 40 | } 41 | 42 | try { 43 | BootstrapMode.valueOf(modeProperty.strip().toUpperCase()); 44 | return true; 45 | } catch (IllegalArgumentException e) { 46 | return false; 47 | } 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /docs/modules/dev-services/pages/pulsar.adoc: -------------------------------------------------------------------------------- 1 | = Pulsar Dev Service 2 | :service-name: pulsar 3 | 4 | A service providing an https://pulsar.apache.org[Apache Pulsar] messaging and streaming platform for development and testing purposes. 5 | 6 | It works with Spring Boot libraries that support Apache Pulsar, including: 7 | 8 | * https://spring.io/projects/spring-pulsar[Spring for Apache Pulsar] 9 | * https://spring.io/projects/spring-cloud-stream[Spring Cloud Stream]. 10 | 11 | == Dependencies 12 | 13 | include::partial$dependencies.adoc[] 14 | 15 | == Running the Application 16 | 17 | include::partial$running-application.adoc[] 18 | 19 | By default, when running the application in development mode, the Dev Service will be shared across multiple applications. 20 | 21 | == Configuring the Dev Service 22 | 23 | You can configure the Dev Service via configuration properties. 24 | 25 | |=== 26 | |Property |Default |Description 27 | 28 | | `arconia.dev.services.pulsar.enabled` 29 | | `true` 30 | | Whether the dev service is enabled. 31 | 32 | | `arconia.dev.services.pulsar.image-name` 33 | | `apachepulsar/pulsar` 34 | | Full name of the container image used in the dev service. 35 | 36 | | `arconia.dev.services.pulsar.environment` 37 | | `{}` 38 | | Environment variables to set in the service. 39 | 40 | | `arconia.dev.services.pulsar.shared` 41 | | `dev-mode` 42 | | When the dev service is shared across applications. 43 | |=== 44 | 45 | include::partial$disabling-dev-service.adoc[] 46 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-ollama/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-dev:bootkit-dev-services:bootkit-dev-services-core") 13 | api "org.springframework.ai:spring-ai-spring-boot-testcontainers" 14 | api "org.springframework.boot:spring-boot-testcontainers" 15 | api "org.testcontainers:ollama" 16 | 17 | implementation "org.springframework.boot:spring-boot-starter" 18 | 19 | optional "org.springframework.boot:spring-boot-devtools" 20 | 21 | testImplementation "org.springframework.boot:spring-boot-starter-test" 22 | testImplementation "org.testcontainers:junit-jupiter" 23 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 24 | } 25 | 26 | dependencyManagement { 27 | imports { 28 | mavenBom "org.springframework.ai:spring-ai-bom:${springAiVersion}" 29 | } 30 | } 31 | 32 | publishing { 33 | publications { 34 | mavenJava(MavenPublication) { 35 | pom { 36 | name = "BootKit Dev Services Ollama" 37 | description = "BootKit Dev Services Ollama." 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /docs/modules/dev-services/pages/rabbitmq.adoc: -------------------------------------------------------------------------------- 1 | = RabbitMQ Dev Service 2 | :service-name: rabbitmq 3 | 4 | A service providing a https://www.rabbitmq.com[RabbitMQ] event broker for development and testing purposes. 5 | 6 | It works with Spring Boot libraries that support AMQP or RabbitMQ, including: 7 | 8 | * https://spring.io/projects/spring-amqp[Spring AMQP] 9 | * https://spring.io/projects/spring-cloud-stream[Spring Cloud Stream] 10 | 11 | == Dependencies 12 | 13 | include::partial$dependencies.adoc[] 14 | 15 | == Running the Application 16 | 17 | include::partial$running-application.adoc[] 18 | 19 | By default, when running the application in development mode, the Dev Service will be shared across multiple applications. 20 | 21 | == Configuring the Dev Service 22 | 23 | You can configure the Dev Service via configuration properties. 24 | 25 | |=== 26 | |Property |Default |Description 27 | 28 | | `arconia.dev.services.rabbitmq.enabled` 29 | | `true` 30 | | Whether the dev service is enabled. 31 | 32 | | `arconia.dev.services.rabbitmq.image-name` 33 | | `rabbitmq` 34 | | Full name of the container image used in the dev service. 35 | 36 | | `arconia.dev.services.rabbitmq.environment` 37 | | `{}` 38 | | Environment variables to set in the service. Example: `RABBITMQ_DEFAULT_USER: "user"`. 39 | 40 | | `arconia.dev.services.rabbitmq.shared` 41 | | `dev-mode` 42 | | When the dev service is shared across applications. 43 | |=== 44 | 45 | include::partial$disabling-dev-service.adoc[] 46 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/test/java/io/bootkit/opentelemetry/autoconfigure/logs/exporter/OpenTelemetryLoggingExporterPropertiesTests.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.logs.exporter; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import io.bootkit.opentelemetry.autoconfigure.exporter.ExporterType; 6 | import io.bootkit.opentelemetry.autoconfigure.exporter.otlp.OtlpExporterConfig; 7 | 8 | import static org.assertj.core.api.Assertions.assertThat; 9 | 10 | /** 11 | * Unit tests for {@link OpenTelemetryLoggingExporterProperties}. 12 | */ 13 | class OpenTelemetryLoggingExporterPropertiesTests { 14 | 15 | @Test 16 | void shouldHaveCorrectConfigPrefix() { 17 | assertThat(OpenTelemetryLoggingExporterProperties.CONFIG_PREFIX).isEqualTo("bootkit.otel.logs.exporter"); 18 | } 19 | 20 | @Test 21 | void shouldCreateInstanceWithDefaultValues() { 22 | OpenTelemetryLoggingExporterProperties properties = new OpenTelemetryLoggingExporterProperties(); 23 | 24 | assertThat(properties.getType()).isNull(); 25 | assertThat(properties.getOtlp()).isNotNull().isInstanceOf(OtlpExporterConfig.class); 26 | } 27 | 28 | @Test 29 | void shouldUpdateValues() { 30 | OpenTelemetryLoggingExporterProperties properties = new OpenTelemetryLoggingExporterProperties(); 31 | properties.setType(ExporterType.NONE); 32 | assertThat(properties.getType()).isEqualTo(ExporterType.NONE); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-mongodb-atlas/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-dev:bootkit-dev-services:bootkit-dev-services-core") 13 | api "org.springframework.ai:spring-ai-spring-boot-testcontainers" 14 | api "org.springframework.boot:spring-boot-testcontainers" 15 | api "org.testcontainers:mongodb" 16 | 17 | implementation "org.springframework.boot:spring-boot-starter" 18 | 19 | optional "org.springframework.boot:spring-boot-devtools" 20 | 21 | testImplementation "org.springframework.boot:spring-boot-starter-test" 22 | testImplementation "org.testcontainers:junit-jupiter" 23 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 24 | } 25 | 26 | dependencyManagement { 27 | imports { 28 | mavenBom "org.springframework.ai:spring-ai-bom:${springAiVersion}" 29 | } 30 | } 31 | 32 | publishing { 33 | publications { 34 | mavenJava(MavenPublication) { 35 | pom { 36 | name = "BootKit Dev Services MongoDB Atlas" 37 | description = "BootKit Dev Services MongoDB Atlas." 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/test/java/io/bootkit/opentelemetry/autoconfigure/traces/exporter/OpenTelemetryTracingExporterPropertiesTests.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.traces.exporter; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import io.bootkit.opentelemetry.autoconfigure.exporter.ExporterType; 6 | import io.bootkit.opentelemetry.autoconfigure.exporter.otlp.OtlpExporterConfig; 7 | 8 | import static org.assertj.core.api.Assertions.assertThat; 9 | 10 | /** 11 | * Unit tests for {@link OpenTelemetryTracingExporterProperties}. 12 | */ 13 | class OpenTelemetryTracingExporterPropertiesTests { 14 | 15 | @Test 16 | void shouldHaveCorrectConfigPrefix() { 17 | assertThat(OpenTelemetryTracingExporterProperties.CONFIG_PREFIX).isEqualTo("bootkit.otel.traces.exporter"); 18 | } 19 | 20 | @Test 21 | void shouldCreateInstanceWithDefaultValues() { 22 | OpenTelemetryTracingExporterProperties properties = new OpenTelemetryTracingExporterProperties(); 23 | 24 | assertThat(properties.getType()).isNull(); 25 | assertThat(properties.getOtlp()).isNotNull().isInstanceOf(OtlpExporterConfig.class); 26 | } 27 | 28 | @Test 29 | void shouldUpdateValues() { 30 | OpenTelemetryTracingExporterProperties properties = new OpenTelemetryTracingExporterProperties(); 31 | properties.setType(ExporterType.NONE); 32 | 33 | assertThat(properties.getType()).isEqualTo(ExporterType.NONE); 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /docs/modules/dev-services/pages/kafka.adoc: -------------------------------------------------------------------------------- 1 | = Kafka Dev Service 2 | :service-name: kafka 3 | 4 | A service providing an https://kafka.apache.org[Apache Kafka] event broker for development and testing purposes. 5 | 6 | It works with Spring Boot libraries that support Kafka, including: 7 | 8 | * https://spring.io/projects/spring-kafka[Spring for Apache Kafka] 9 | * https://spring.io/projects/spring-cloud-stream[Spring Cloud Stream] 10 | * https://spring.io/projects/spring-kafka[Spring Modulith] 11 | 12 | == Dependencies 13 | 14 | include::partial$dependencies.adoc[] 15 | 16 | == Running the Application 17 | 18 | include::partial$running-application.adoc[] 19 | 20 | By default, when running the application in development mode, the Dev Service will be shared across multiple applications. 21 | 22 | == Configuring the Dev Service 23 | 24 | You can configure the Dev Service via configuration properties. 25 | 26 | |=== 27 | |Property |Default |Description 28 | 29 | | `arconia.dev.services.kafka.enabled` 30 | | `true` 31 | | Whether the dev service is enabled. 32 | 33 | | `arconia.dev.services.kafka.image-name` 34 | | `apache/kafka-native` 35 | | Full name of the container image used in the dev service. 36 | 37 | | `arconia.dev.services.kafka.environment` 38 | | `{}` 39 | | Environment variables to set in the service. 40 | 41 | | `arconia.dev.services.kafka.shared` 42 | | `dev-mode` 43 | | When the dev service is shared across applications. 44 | |=== 45 | 46 | include::partial$disabling-dev-service.adoc[] 47 | -------------------------------------------------------------------------------- /bootkit-integrations/bootkit-docling/src/main/java/io/bootkit/docling/autoconfigure/DoclingProperties.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.docling.autoconfigure; 2 | 3 | import java.net.URI; 4 | import java.time.Duration; 5 | 6 | import org.springframework.boot.context.properties.ConfigurationProperties; 7 | 8 | /** 9 | * Configuration properties for the Docling client. 10 | */ 11 | @ConfigurationProperties(prefix = "bootkit.docling") 12 | public class DoclingProperties { 13 | 14 | /** 15 | * Base URL for the Docling Serve API. 16 | */ 17 | private URI url = URI.create("http://localhost:5001"); 18 | 19 | /** 20 | * Timeout to establish a connection to the Docling Serve API. 21 | */ 22 | private Duration connectTimeout = Duration.ofSeconds(5); 23 | 24 | /** 25 | * Timeout for receving a response from the Docling Serve API. 26 | */ 27 | private Duration readTimeout = Duration.ofSeconds(30); 28 | 29 | public URI getUrl() { 30 | return url; 31 | } 32 | 33 | public void setUrl(URI url) { 34 | this.url = url; 35 | } 36 | 37 | public Duration getConnectTimeout() { 38 | return connectTimeout; 39 | } 40 | 41 | public void setConnectTimeout(Duration connectTimeout) { 42 | this.connectTimeout = connectTimeout; 43 | } 44 | 45 | public Duration getReadTimeout() { 46 | return readTimeout; 47 | } 48 | 49 | public void setReadTimeout(Duration readTimeout) { 50 | this.readTimeout = readTimeout; 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-lgtm/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-dev:bootkit-dev-services:bootkit-dev-services-core") 13 | api "org.springframework.boot:spring-boot-testcontainers" 14 | api "org.testcontainers:grafana" 15 | 16 | implementation "org.springframework.boot:spring-boot-starter" 17 | 18 | optional project(":bootkit-observability:bootkit-opentelemetry") 19 | optional "org.springframework.boot:spring-boot-devtools" 20 | 21 | testImplementation "org.springframework.boot:spring-boot-starter-test" 22 | testImplementation "org.testcontainers:junit-jupiter" 23 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 24 | } 25 | 26 | dependencyManagement { 27 | imports { 28 | mavenBom "io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom:${openTelemetryInstrumentationVersion}" 29 | } 30 | } 31 | 32 | publishing { 33 | publications { 34 | mavenJava(MavenPublication) { 35 | pom { 36 | name = "BootKit Dev Services Grafana LGTM" 37 | description = "BootKit Dev Services Grafana LGTM." 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/traces/exporter/OpenTelemetryTracingExporterProperties.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.traces.exporter; 2 | 3 | import org.jspecify.annotations.Nullable; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.boot.context.properties.NestedConfigurationProperty; 6 | 7 | import io.bootkit.opentelemetry.autoconfigure.exporter.ExporterType; 8 | import io.bootkit.opentelemetry.autoconfigure.exporter.otlp.OtlpExporterConfig; 9 | 10 | /** 11 | * Configuration properties for OpenTelemetry tracing exporters. 12 | */ 13 | @ConfigurationProperties(prefix = OpenTelemetryTracingExporterProperties.CONFIG_PREFIX) 14 | public class OpenTelemetryTracingExporterProperties { 15 | 16 | public static final String CONFIG_PREFIX = "bootkit.otel.traces.exporter"; 17 | 18 | /** 19 | * The type of OpenTelemetry exporter to use. 20 | */ 21 | @Nullable 22 | private ExporterType type; 23 | 24 | /** 25 | * Options for the OTLP exporter. 26 | */ 27 | @NestedConfigurationProperty 28 | private final OtlpExporterConfig otlp = new OtlpExporterConfig(); 29 | 30 | @Nullable 31 | public ExporterType getType() { 32 | return type; 33 | } 34 | 35 | public void setType(@Nullable ExporterType type) { 36 | this.type = type; 37 | } 38 | 39 | public OtlpExporterConfig getOtlp() { 40 | return otlp; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /docs/modules/dev-services/pages/mongodb-atlas.adoc: -------------------------------------------------------------------------------- 1 | = MongoDB Atlas Dev Service 2 | :service-name: mongodb-atlas 3 | 4 | A service providing a https://www.mongodb.com/products/platform[MongoDB Atlas] database for development and testing purposes. 5 | 6 | It works with Spring Boot libraries that support MongoDB Atlas including: 7 | 8 | * https://docs.spring.io/spring-ai/reference/api/vectordbs/mongodb.html[Spring AI] (Vector Store) 9 | * https://spring.io/projects/spring-data-mongodb[Spring Data MongoDB] 10 | * https://spring.io/projects/spring-session[Spring Session for MongoDB] 11 | 12 | == Dependencies 13 | 14 | include::partial$dependencies.adoc[] 15 | 16 | == Running the Application 17 | 18 | include::partial$running-application.adoc[] 19 | 20 | == Configuring the Dev Service 21 | 22 | You can configure the Dev Service via configuration properties. 23 | 24 | |=== 25 | |Property |Default |Description 26 | 27 | | `arconia.dev.services.mongodb-atlas.enabled` 28 | | `true` 29 | | Whether the dev service is enabled. 30 | 31 | | `arconia.dev.services.mongodb-atlas.image-name` 32 | | `mongodb/mongodb-atlas-local` 33 | | Full name of the container image used in the dev service. 34 | 35 | | `arconia.dev.services.mongodb-atlas.environment` 36 | | `{}` 37 | | Environment variables to set in the service. Example: `MONGODB_INITDB_ROOT_USERNAME: "mongodb"`. 38 | 39 | | `arconia.dev.services.mongodb-atlas.shared` 40 | | `never` 41 | | When the dev service is shared across applications. 42 | |=== 43 | 44 | include::partial$disabling-dev-service.adoc[] 45 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/logs/exporter/OpenTelemetryLoggingExporterProperties.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.logs.exporter; 2 | 3 | import org.jspecify.annotations.Nullable; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.boot.context.properties.NestedConfigurationProperty; 6 | 7 | import io.bootkit.opentelemetry.autoconfigure.exporter.ExporterType; 8 | import io.bootkit.opentelemetry.autoconfigure.exporter.otlp.OtlpExporterConfig; 9 | 10 | /** 11 | * Configuration properties for exporting OpenTelemetry logs. 12 | */ 13 | @ConfigurationProperties(prefix = OpenTelemetryLoggingExporterProperties.CONFIG_PREFIX) 14 | public class OpenTelemetryLoggingExporterProperties { 15 | 16 | public static final String CONFIG_PREFIX = "bootkit.otel.logs.exporter"; 17 | 18 | /** 19 | * The type of OpenTelemetry exporter to use for logs. 20 | */ 21 | @Nullable 22 | private ExporterType type; 23 | 24 | /** 25 | * Options for the OTLP log exporter. 26 | */ 27 | @NestedConfigurationProperty 28 | private final OtlpExporterConfig otlp = new OtlpExporterConfig(); 29 | 30 | @Nullable 31 | public ExporterType getType() { 32 | return type; 33 | } 34 | 35 | public void setType(@Nullable ExporterType type) { 36 | this.type = type; 37 | } 38 | 39 | public OtlpExporterConfig getOtlp() { 40 | return otlp; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry-logback-bridge/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-core") 13 | api("io.opentelemetry.instrumentation:opentelemetry-logback-appender-1.0") { 14 | exclude group: "io.opentelemetry.instrumentation", module: "opentelemetry-instrumentation-api-incubator" 15 | } 16 | 17 | implementation "org.springframework.boot:spring-boot-starter" 18 | 19 | optional project(":bootkit-observability:bootkit-opentelemetry") 20 | optional "org.springframework.boot:spring-boot-starter-actuator" 21 | 22 | testImplementation "org.springframework.boot:spring-boot-starter-test" 23 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 24 | } 25 | 26 | dependencyManagement { 27 | imports { 28 | mavenBom "io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha:${openTelemetryInstrumentationVersion}-alpha" 29 | } 30 | } 31 | 32 | publishing { 33 | publications { 34 | mavenJava(MavenPublication) { 35 | pom { 36 | name = "BootKit OpenTelemetry Logback Bridge" 37 | description = "BootKit OpenTelemetry Logback Bridge." 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /docs/modules/dev-services/pages/ollama.adoc: -------------------------------------------------------------------------------- 1 | = Ollama Dev Service 2 | :service-name: ollama 3 | 4 | A service providing an https://ollama.com[Ollama] model inference service for development and testing purposes. 5 | 6 | It works with Spring Boot libraries that support Ollama, including: 7 | 8 | * https://spring.io/projects/spring-ai[Spring AI] 9 | 10 | NOTE: By default, the Ollama Dev Service is disabled since it might be resource-intensive, and running native Ollama might be more suitable for development. You can enable it globally or selectively for specific tests. 11 | 12 | == Dependencies 13 | 14 | include::partial$dependencies.adoc[] 15 | 16 | == Running the Application 17 | 18 | include::partial$running-application.adoc[] 19 | 20 | By default, the Dev Service will be shared across multiple applications. 21 | 22 | == Configuring the Dev Service 23 | 24 | You can configure the Dev Service via configuration properties. 25 | 26 | |=== 27 | |Property |Default |Description 28 | 29 | | `arconia.dev.services.ollama.enabled` 30 | | `false` 31 | | Whether the dev service is enabled. 32 | 33 | | `arconia.dev.services.ollama.image-name` 34 | | `ollama/ollama` 35 | | Full name of the container image used in the dev service. 36 | 37 | | `arconia.dev.services.ollama.environment` 38 | | `{}` 39 | | Environment variables to set in the service. Example: `OLLAMA_NUM_PARALLEL: "4"`. 40 | 41 | | `arconia.dev.services.ollama.shared` 42 | | `always` 43 | | When the dev service is shared across applications. 44 | |=== 45 | 46 | include::partial$disabling-dev-service.adoc[] 47 | -------------------------------------------------------------------------------- /bootkit-multitenancy/bootkit-multitenancy-web/src/main/java/io/bootkit/multitenancy/web/context/resolvers/CookieTenantResolver.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.multitenancy.web.context.resolvers; 2 | 3 | import java.util.Arrays; 4 | 5 | import jakarta.servlet.http.Cookie; 6 | import jakarta.servlet.http.HttpServletRequest; 7 | 8 | import org.jspecify.annotations.Nullable; 9 | import org.springframework.util.Assert; 10 | 11 | import io.bootkit.core.support.Incubating; 12 | 13 | /** 14 | * Strategy used to resolve the current tenant from a cookie in an HTTP request. 15 | */ 16 | @Incubating(since = "0.1.0") 17 | public final class CookieTenantResolver implements HttpRequestTenantResolver { 18 | 19 | public static final String DEFAULT_COOKIE_NAME = "TENANT-ID"; 20 | 21 | private final String tenantCookieName; 22 | 23 | public CookieTenantResolver() { 24 | this.tenantCookieName = DEFAULT_COOKIE_NAME; 25 | } 26 | 27 | public CookieTenantResolver(String tenantCookieName) { 28 | Assert.hasText(tenantCookieName, "tenantCookieName cannot be null or empty"); 29 | this.tenantCookieName = tenantCookieName; 30 | } 31 | 32 | @Override 33 | @Nullable 34 | public String resolveTenantIdentifier(HttpServletRequest request) { 35 | Assert.notNull(request, "request cannot be null"); 36 | return Arrays.stream(request.getCookies()) 37 | .filter(cookie -> cookie.getName().equals(tenantCookieName)) 38 | .map(Cookie::getValue) 39 | .findFirst() 40 | .orElse(null); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-otel-collector/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-dev:bootkit-dev-services:bootkit-dev-services-core") 13 | api "org.springframework.boot:spring-boot-testcontainers" 14 | api "org.testcontainers:testcontainers" 15 | 16 | implementation "org.springframework.boot:spring-boot-starter" 17 | 18 | optional project(":bootkit-observability:bootkit-opentelemetry") 19 | optional "org.springframework.boot:spring-boot-devtools" 20 | 21 | testImplementation "org.springframework.boot:spring-boot-starter-test" 22 | testImplementation "org.testcontainers:junit-jupiter" 23 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 24 | } 25 | 26 | dependencyManagement { 27 | imports { 28 | mavenBom "io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom:${openTelemetryInstrumentationVersion}" 29 | } 30 | } 31 | 32 | publishing { 33 | publications { 34 | mavenJava(MavenPublication) { 35 | pom { 36 | name = "BootKit Dev Services OpenTelemetry Collector" 37 | description = "BootKit Dev Services OpenTelemetry Collector." 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/logs/OnOpenTelemetryLoggingCondition.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.logs; 2 | 3 | import org.springframework.boot.autoconfigure.condition.ConditionMessage; 4 | import org.springframework.boot.autoconfigure.condition.ConditionOutcome; 5 | import org.springframework.boot.autoconfigure.condition.SpringBootCondition; 6 | import org.springframework.context.annotation.ConditionContext; 7 | import org.springframework.core.type.AnnotatedTypeMetadata; 8 | 9 | /** 10 | * Determines if OpenTelemetry logging support should be enabled. 11 | */ 12 | class OnOpenTelemetryLoggingCondition extends SpringBootCondition { 13 | 14 | @Override 15 | public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { 16 | Boolean openTelemetryLogsEnabled = context.getEnvironment().getProperty(OpenTelemetryLoggingProperties.CONFIG_PREFIX + ".enabled", Boolean.class); 17 | 18 | if (openTelemetryLogsEnabled != null) { 19 | return new ConditionOutcome(openTelemetryLogsEnabled, 20 | ConditionMessage.forCondition(ConditionalOnOpenTelemetryLogging.class) 21 | .because(OpenTelemetryLoggingProperties.CONFIG_PREFIX + ".enabled is " + openTelemetryLogsEnabled)); 22 | } 23 | 24 | return ConditionOutcome.match(ConditionMessage.forCondition(ConditionalOnOpenTelemetryLogging.class) 25 | .because("OpenTelemetry logging is enabled by default")); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/core-features/index.adoc: -------------------------------------------------------------------------------- 1 | = Core Features 2 | 3 | This section provides information on using the core features and capabilities of Arconia. 4 | 5 | == Dependencies 6 | 7 | To get started with Arconia, add the Arconia Spring Boot Starter dependency to your project. 8 | 9 | [tabs] 10 | ====== 11 | Gradle:: 12 | + 13 | [source,groovy] 14 | ---- 15 | dependencies { 16 | implementation 'io.arconia:arconia-spring-boot-starter' 17 | } 18 | ---- 19 | 20 | Maven:: 21 | + 22 | [source,xml] 23 | ---- 24 | 25 | io.arconia 26 | arconia-spring-boot-starter 27 | 28 | ---- 29 | ====== 30 | 31 | Arconia publishes a BOM (Bill of Materials) that you can use to manage the version of the Arconia libraries. It is highly recommended to use the BOM to ensure that all dependencies are compatible. 32 | 33 | [tabs] 34 | ====== 35 | Gradle:: 36 | + 37 | [source,groovy,subs="attributes"] 38 | ---- 39 | dependencyManagement { 40 | imports { 41 | mavenBom "io.arconia:arconia-bom:{page-component-version}" 42 | } 43 | } 44 | ---- 45 | 46 | Maven:: 47 | + 48 | [source,xml,subs="attributes,verbatim"] 49 | ---- 50 | 51 | 52 | 53 | io.arconia 54 | arconia-bom 55 | {page-component-version} 56 | pom 57 | import 58 | 59 | 60 | 61 | ---- 62 | ====== 63 | -------------------------------------------------------------------------------- /bootkit-integrations/bootkit-docling/src/test/java/io/bootkit/docling/autoconfigure/DoclingPropertiesTests.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.docling.autoconfigure; 2 | 3 | import java.net.URI; 4 | import java.time.Duration; 5 | 6 | import org.junit.jupiter.api.Test; 7 | 8 | import static org.assertj.core.api.Assertions.assertThat; 9 | 10 | /** 11 | * Unit tests for {@link DoclingProperties}. 12 | */ 13 | class DoclingPropertiesTests { 14 | 15 | @Test 16 | void shouldCreateInstanceWithDefaultValues() { 17 | DoclingProperties properties = new DoclingProperties(); 18 | 19 | assertThat(properties.getUrl()).isEqualTo(URI.create("http://localhost:5001")); 20 | assertThat(properties.getConnectTimeout()).isEqualTo(Duration.ofSeconds(5)); 21 | assertThat(properties.getReadTimeout()).isEqualTo(Duration.ofSeconds(30)); 22 | } 23 | 24 | @Test 25 | void shouldUpdateAllValues() { 26 | DoclingProperties properties = new DoclingProperties(); 27 | URI newUrl = URI.create("https://custom.docling.com:8080"); 28 | Duration newConnectTimeout = Duration.ofSeconds(15); 29 | Duration newReadTimeout = Duration.ofSeconds(120); 30 | 31 | properties.setUrl(newUrl); 32 | properties.setConnectTimeout(newConnectTimeout); 33 | properties.setReadTimeout(newReadTimeout); 34 | 35 | assertThat(properties.getUrl()).isEqualTo(newUrl); 36 | assertThat(properties.getConnectTimeout()).isEqualTo(newConnectTimeout); 37 | assertThat(properties.getReadTimeout()).isEqualTo(newReadTimeout); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /bootkit-integrations/bootkit-docling/src/test/java/io/bootkit/docling/testcontainers/DoclingServeContainerConnectionDetailsFactoryTests.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.docling.testcontainers; 2 | 3 | import java.net.URI; 4 | 5 | import org.junit.jupiter.api.Test; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.boot.autoconfigure.ImportAutoConfiguration; 8 | import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration; 9 | import org.springframework.context.annotation.Configuration; 10 | import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; 11 | 12 | import io.bootkit.docling.autoconfigure.DoclingAutoConfiguration; 13 | import io.bootkit.docling.autoconfigure.DoclingServeConnectionDetails; 14 | 15 | import static org.assertj.core.api.Assertions.assertThat; 16 | 17 | /** 18 | * Integration tests for {@link DoclingServeContainerConnectionDetailsFactory}. 19 | */ 20 | @SpringJUnitConfig 21 | class DoclingServeContainerConnectionDetailsFactoryTests extends DoclingTestcontainers { 22 | 23 | @Autowired 24 | DoclingServeConnectionDetails connectionDetails; 25 | 26 | @Test 27 | void shouldProvideConnectionDetailsForHttpProtobuf() { 28 | URI url = connectionDetails.getUrl(); 29 | assertThat(url.toString()).isEqualTo("http://localhost:" + doclingContainer.getPort()); 30 | } 31 | 32 | @Configuration(proxyBeanMethods = false) 33 | @ImportAutoConfiguration({DoclingAutoConfiguration.class, RestClientAutoConfiguration.class}) 34 | static class TestConfiguration {} 35 | 36 | } 37 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/traces/OnOpenTelemetryTracingCondition.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.traces; 2 | 3 | import org.springframework.boot.autoconfigure.condition.ConditionMessage; 4 | import org.springframework.boot.autoconfigure.condition.ConditionOutcome; 5 | import org.springframework.boot.autoconfigure.condition.SpringBootCondition; 6 | import org.springframework.context.annotation.ConditionContext; 7 | import org.springframework.core.type.AnnotatedTypeMetadata; 8 | 9 | /** 10 | * Determines if OpenTelemetry tracing support should be enabled. 11 | */ 12 | class OnOpenTelemetryTracingCondition extends SpringBootCondition { 13 | 14 | @Override 15 | public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { 16 | Boolean openTelemetryTracesEnabled = context.getEnvironment().getProperty(OpenTelemetryTracingProperties.CONFIG_PREFIX + ".enabled", Boolean.class); 17 | 18 | if (openTelemetryTracesEnabled != null) { 19 | return new ConditionOutcome(openTelemetryTracesEnabled, 20 | ConditionMessage.forCondition(ConditionalOnOpenTelemetryTracing.class) 21 | .because(OpenTelemetryTracingProperties.CONFIG_PREFIX + ".enabled is " + openTelemetryTracesEnabled)); 22 | } 23 | 24 | return ConditionOutcome.match(ConditionMessage.forCondition(ConditionalOnOpenTelemetryTracing.class) 25 | .because("OpenTelemetry tracing is enabled by default")); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry/src/main/java/io/bootkit/opentelemetry/autoconfigure/metrics/OnOpenTelemetryMetricsCondition.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.opentelemetry.autoconfigure.metrics; 2 | 3 | import org.springframework.boot.autoconfigure.condition.ConditionMessage; 4 | import org.springframework.boot.autoconfigure.condition.ConditionOutcome; 5 | import org.springframework.boot.autoconfigure.condition.SpringBootCondition; 6 | import org.springframework.context.annotation.ConditionContext; 7 | import org.springframework.core.type.AnnotatedTypeMetadata; 8 | 9 | /** 10 | * Determines if OpenTelemetry metrics support should be enabled. 11 | */ 12 | class OnOpenTelemetryMetricsCondition extends SpringBootCondition { 13 | 14 | @Override 15 | public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { 16 | Boolean openTelemetryMetricsEnabled = context.getEnvironment().getProperty(OpenTelemetryMetricsProperties.CONFIG_PREFIX + ".enabled", Boolean.class); 17 | 18 | if (openTelemetryMetricsEnabled != null) { 19 | return new ConditionOutcome(openTelemetryMetricsEnabled, 20 | ConditionMessage.forCondition(ConditionalOnOpenTelemetryMetrics.class) 21 | .because(OpenTelemetryMetricsProperties.CONFIG_PREFIX + ".enabled is " + openTelemetryMetricsEnabled)); 22 | } 23 | 24 | return ConditionOutcome.match(ConditionMessage.forCondition(ConditionalOnOpenTelemetryMetrics.class) 25 | .because("OpenTelemetry metrics are enabled by default")); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /bootkit-integrations/bootkit-docling/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-core") 13 | api "ai.docling:docling-serve-api:${doclingVersion}" 14 | 15 | implementation "com.fasterxml.jackson.core:jackson-annotations" 16 | implementation "com.fasterxml.jackson.core:jackson-databind" 17 | implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" 18 | implementation "org.springframework.boot:spring-boot-starter" 19 | implementation "org.springframework:spring-web" 20 | 21 | optional "org.springframework.boot:spring-boot-actuator" 22 | optional "org.springframework.boot:spring-boot-actuator-autoconfigure" 23 | 24 | optional "ai.docling:docling-testcontainers:${doclingVersion}" 25 | optional "org.springframework.boot:spring-boot-testcontainers" 26 | 27 | testImplementation "org.springframework.boot:spring-boot-starter-test" 28 | testImplementation "org.testcontainers:junit-jupiter" 29 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 30 | } 31 | 32 | publishing { 33 | publications { 34 | mavenJava(MavenPublication) { 35 | pom { 36 | name = "BootKit Docling" 37 | description = "BootKit Docling." 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /bootkit-dev/bootkit-dev-services/bootkit-dev-services-phoenix/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-dev:bootkit-dev-services:bootkit-dev-services-core") 13 | api "org.springframework.boot:spring-boot-testcontainers" 14 | api "org.testcontainers:testcontainers" 15 | 16 | implementation "org.springframework.boot:spring-boot-starter" 17 | 18 | optional project(":bootkit-observability:bootkit-opentelemetry") 19 | optional "org.springframework.boot:spring-boot-devtools" 20 | 21 | testImplementation "org.springframework.boot:spring-boot-starter-test" 22 | testImplementation "org.testcontainers:junit-jupiter" 23 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 24 | } 25 | 26 | dependencyManagement { 27 | imports { 28 | mavenBom "io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom:${openTelemetryInstrumentationVersion}" 29 | mavenBom "org.springframework.ai:spring-ai-bom:${springAiVersion}" 30 | } 31 | } 32 | 33 | publishing { 34 | publications { 35 | mavenJava(MavenPublication) { 36 | pom { 37 | name = "BootKit Dev Services Arize Phoenix" 38 | description = "BootKit Dev Services Arize Phoenix." 39 | } 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /bootkit-integrations/bootkit-docling/src/main/java/io/bootkit/docling/actuate/DoclingServeHealthIndicator.java: -------------------------------------------------------------------------------- 1 | package io.bootkit.docling.actuate; 2 | 3 | import org.springframework.boot.actuate.health.AbstractHealthIndicator; 4 | import org.springframework.boot.actuate.health.Health; 5 | import org.springframework.util.Assert; 6 | 7 | import ai.docling.api.serve.DoclingServeApi; 8 | import ai.docling.api.serve.health.HealthCheckResponse; 9 | 10 | /** 11 | * Health indicator for Docling Serve. 12 | * 13 | * @see DoclingServeApi 14 | */ 15 | public final class DoclingServeHealthIndicator extends AbstractHealthIndicator { 16 | 17 | private final DoclingServeApi doclingServeApi; 18 | 19 | public DoclingServeHealthIndicator(DoclingServeApi doclingServeApi) { 20 | Assert.notNull(doclingServeApi, "doclingServeApi cannot be null"); 21 | this.doclingServeApi = doclingServeApi; 22 | } 23 | 24 | @Override 25 | protected void doHealthCheck(Health.Builder builder) { 26 | Assert.notNull(builder, "builder cannot be null"); 27 | 28 | try { 29 | HealthCheckResponse healthCheckResponse = doclingServeApi.health(); 30 | 31 | if ("ok".equals(healthCheckResponse.getStatus())) { 32 | builder.up(); 33 | } else if (healthCheckResponse.getStatus() == null) { 34 | builder.down().withDetail("status", "unknown"); 35 | } else { 36 | builder.down().withDetail("status", healthCheckResponse.getStatus()); 37 | } 38 | } catch (Exception e) { 39 | builder.down(e); 40 | } 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /docs/modules/dev-services/partials/initializing-a-jdbc-database.adoc: -------------------------------------------------------------------------------- 1 | You can initialize the database by providing one or more SQL scripts to be executed when the database is started. This can be useful for creating test data or applying other customizations that are only needed during development and testing. 2 | 3 | [NOTE] 4 | ==== 5 | If you need to create the database schema or apply other changes that are required also in production, you should use a database migration tool such as https://docs.spring.io/spring-boot/how-to/data-initialization.html#howto.data-initialization.migration-tool.flyway[Flyway] or https://docs.spring.io/spring-boot/how-to/data-initialization.html#howto.data-initialization.migration-tool.liquibase[Liquibase] instead. They will also work automatically with Arconia Dev Services. 6 | ==== 7 | 8 | The scripts must be available in the application classpath, and you can specify their location using the `arconia.dev.services.{service-name}.init-script-paths` property, which accepts a list of classpath locations. 9 | 10 | For example, if you have a script named `init.sql` located in the `src/main/resources/data` directory of your project, you can configure the Dev Service to execute it when the database is started by adding the following property to your `application.yml` or `application.properties` file: 11 | 12 | [source,properties,subs="attributes"] 13 | ---- 14 | arconia.dev.services.{service-name}.init-script-paths=classpath:data/init.sql 15 | ---- 16 | 17 | [TIP] 18 | ==== 19 | If you need to execute SQL scripts only when running tests, you can place them in the `src/test/resources` directory instead of `src/main/resources`. 20 | ==== 21 | -------------------------------------------------------------------------------- /spring-boot-starters/bootkit-opentelemetry-spring-boot-starter/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | api project(":bootkit-spring-boot") 10 | api project(":bootkit-observability:bootkit-opentelemetry") 11 | api project(":bootkit-observability:bootkit-opentelemetry-logback-bridge") 12 | api project(":bootkit-observability:bootkit-opentelemetry-micrometer-registry-otlp") 13 | 14 | api "io.opentelemetry.instrumentation:opentelemetry-instrumentation-api" 15 | api "org.springframework.boot:spring-boot-starter-actuator" 16 | 17 | runtimeOnly "io.micrometer:micrometer-java21" 18 | runtimeOnly("io.opentelemetry:opentelemetry-exporter-otlp") { 19 | exclude group: "io.opentelemetry", module: "opentelemetry-exporter-sender-okhttp" 20 | } 21 | runtimeOnly "io.opentelemetry:opentelemetry-exporter-sender-jdk" 22 | 23 | implementation "org.springframework.boot:spring-boot-starter" 24 | 25 | testImplementation "org.springframework.boot:spring-boot-starter-test" 26 | } 27 | 28 | dependencyManagement { 29 | imports { 30 | mavenBom "io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha:${openTelemetryInstrumentationVersion}-alpha" 31 | } 32 | } 33 | 34 | publishing { 35 | publications { 36 | mavenJava(MavenPublication) { 37 | pom { 38 | name = "BootKit OpenTelemetry Spring Boot Starter" 39 | description = "BootKit OpenTelemetry Spring Boot Starter." 40 | } 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /bootkit-observability/bootkit-opentelemetry-micrometer-metrics-bridge/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "code-quality-conventions" 3 | id "java-conventions" 4 | id "sbom-conventions" 5 | id "release-conventions" 6 | } 7 | 8 | dependencies { 9 | annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor" 10 | annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" 11 | 12 | api project(":bootkit-core") 13 | api("io.opentelemetry.instrumentation:opentelemetry-micrometer-1.5") { 14 | exclude group: "io.opentelemetry", module: "opentelemetry-api-incubator" 15 | exclude group: "io.opentelemetry.instrumentation", module: "opentelemetry-instrumentation-api-incubator" 16 | } 17 | 18 | implementation "org.springframework.boot:spring-boot-starter" 19 | 20 | optional project(":bootkit-observability:bootkit-opentelemetry") 21 | optional "org.springframework.boot:spring-boot-starter-actuator" 22 | 23 | testImplementation "org.springframework.boot:spring-boot-starter-test" 24 | testRuntimeOnly "org.junit.platform:junit-platform-launcher" 25 | } 26 | 27 | dependencyManagement { 28 | imports { 29 | mavenBom "io.opentelemetry.instrumentation:opentelemetry-instrumentation-bom-alpha:${openTelemetryInstrumentationVersion}-alpha" 30 | } 31 | } 32 | 33 | publishing { 34 | publications { 35 | mavenJava(MavenPublication) { 36 | pom { 37 | name = "BootKit OpenTelemetry Micrometer Metrics Bridge" 38 | description = "BootKit OpenTelemetry Micrometer Metrics Bridge." 39 | } 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Package Files # 14 | *.jar 15 | *.war 16 | *.nar 17 | *.ear 18 | *.zip 19 | *.tar.gz 20 | *.rar 21 | 22 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 23 | hs_err_pid* 24 | 25 | HELP.md 26 | build/ 27 | !gradle/wrapper/gradle-wrapper.jar 28 | !**/src/main/**/build/ 29 | !**/src/test/**/build/ 30 | 31 | ### STS ### 32 | .apt_generated 33 | .classpath 34 | .factorypath 35 | .project 36 | .settings 37 | .springBeans 38 | .sts4-cache 39 | bin/ 40 | !**/src/main/**/bin/ 41 | !**/src/test/**/bin/ 42 | 43 | ### IntelliJ IDEA ### 44 | .idea 45 | *.iws 46 | *.iml 47 | *.ipr 48 | out/ 49 | !**/src/main/**/out/ 50 | !**/src/test/**/out/ 51 | 52 | ### NetBeans ### 53 | /nbproject/private/ 54 | /nbbuild/ 55 | /dist/ 56 | /nbdist/ 57 | /.nb-gradle/ 58 | 59 | ### VS Code ### 60 | .vscode/ 61 | 62 | .devbox 63 | 64 | ################################ 65 | ############ MAC ############### 66 | ################################ 67 | 68 | # General 69 | .DS_Store 70 | *.DS_Store 71 | **/.DS_Store 72 | .AppleDouble 73 | .LSOverride 74 | 75 | # Icon must end with two \r 76 | Icon 77 | 78 | # Thumbnails 79 | ._* 80 | 81 | # Files that might appear in the root of a volume 82 | .DocumentRevisions-V100 83 | .fseventsd 84 | .Spotlight-V100 85 | .TemporaryItems 86 | .Trashes 87 | .VolumeIcon.icns 88 | .com.apple.timemachine.donotpresent 89 | 90 | # Directories potentially created on remote AFP share 91 | .AppleDB 92 | .AppleDesktop 93 | Network Trash Folder 94 | Temporary Items 95 | .apdisk 96 | --------------------------------------------------------------------------------