Skip to content

Commit 48706d6

Browse files
committed
Grafana LGTM in docker compose
1 parent 6e5d6a7 commit 48706d6

File tree

6 files changed

+28
-24
lines changed

6 files changed

+28
-24
lines changed

.scalafix.conf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
OrganizeImports.groupedImports = AggressiveMerge
2+
OrganizeImports.targetDialect = Scala3

README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,15 @@
66

77
## Quick start
88

9+
### Using Docker compose
10+
11+
The fastest way to experiment with Bootzooka is using the provided Docker compose setup. It starts three images:
12+
Bootzooka itself (either locally built or downloaded), PostgreSQL server and Graphana LGTM for observability.
13+
914
### Backend: PostgreSQL & API
1015

11-
In order to run Bootzooka, you'll need a running instance of PostgreSQL with a `bootzooka` database. You can spin
12-
up one easily using docker:
16+
To run Bootzooka's backend locally, you'll still need a running instance of PostgreSQL with a `bootzooka` database.
17+
You can spin up one easily using docker:
1318

1419
```sh
1520
# use "bootzooka" as a password

backend/src/main/scala/com/softwaremill/bootzooka/Dependencies.scala

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,18 @@ package com.softwaremill.bootzooka
22

33
import com.softwaremill.bootzooka.admin.VersionApi
44
import com.softwaremill.bootzooka.config.Config
5-
import com.softwaremill.bootzooka.email.sender.EmailSender
65
import com.softwaremill.bootzooka.email.EmailService
6+
import com.softwaremill.bootzooka.email.sender.EmailSender
77
import com.softwaremill.bootzooka.http.{HttpApi, HttpConfig}
88
import com.softwaremill.bootzooka.infrastructure.{DB, SetCorrelationIdBackend}
99
import com.softwaremill.bootzooka.metrics.Metrics
10-
import com.softwaremill.bootzooka.passwordreset.{PasswordResetAuthToken, PasswordResetApi}
10+
import com.softwaremill.bootzooka.passwordreset.{PasswordResetApi, PasswordResetAuthToken}
1111
import com.softwaremill.bootzooka.security.{ApiKeyAuthToken, ApiKeyService, Auth}
1212
import com.softwaremill.bootzooka.user.UserApi
1313
import com.softwaremill.bootzooka.util.{Clock, DefaultClock, DefaultIdGenerator, IdGenerator}
1414
import com.softwaremill.macwire.{autowire, autowireMembersOf}
1515
import io.opentelemetry.api.OpenTelemetry
16-
import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter
17-
import io.opentelemetry.sdk.OpenTelemetrySdk
18-
import io.opentelemetry.sdk.metrics.SdkMeterProvider
19-
import io.opentelemetry.sdk.metrics.`export`.PeriodicMetricReader
16+
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk
2017
import ox.{IO, Ox, tap, useCloseableInScope, useInScope}
2118
import sttp.client3.logging.slf4j.Slf4jLoggingBackend
2219
import sttp.client3.opentelemetry.OpenTelemetryMetricsBackend
@@ -34,7 +31,7 @@ object Dependencies:
3431

3532
def create(using Ox, IO): Dependencies =
3633
val config = Config.read.tap(Config.log)
37-
val otel = createOtel()
34+
val otel = AutoConfiguredOpenTelemetrySdk.initialize().getOpenTelemetrySdk()
3835
val sttpBackend = useInScope(
3936
Slf4jLoggingBackend(OpenTelemetryMetricsBackend(new SetCorrelationIdBackend(HttpClientSyncBackend()), otel), includeTiming = true)
4037
)(_.close())
@@ -58,13 +55,3 @@ object Dependencies:
5855
new Auth(_: ApiKeyAuthToken, _: DB, _: Clock),
5956
new Auth(_: PasswordResetAuthToken, _: DB, _: Clock)
6057
)
61-
62-
private def createOtel(): OpenTelemetry =
63-
// An exporter that sends metrics to a collector over gRPC
64-
val grpcExporter = OtlpGrpcMetricExporter.builder().build()
65-
// A metric reader that exports using the gRPC exporter
66-
val metricReader: PeriodicMetricReader = PeriodicMetricReader.builder(grpcExporter).build()
67-
// A meter registry whose meters are read by the above reader
68-
val meterProvider: SdkMeterProvider = SdkMeterProvider.builder().registerMetricReader(metricReader).build()
69-
// An instance of OpenTelemetry using the above meter registry
70-
OpenTelemetrySdk.builder().setMeterProvider(meterProvider).build()

build.sbt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ val password4jVersion = "1.8.2"
1313
val sttpVersion = "3.9.8"
1414
val tapirVersion = "1.11.4"
1515
val oxVersion = "0.3.8"
16+
val otelVersion = "1.42.1"
1617

1718
val dbDependencies = Seq(
1819
"com.augustnagro" %% "magnum" % "1.2.1",
@@ -29,10 +30,11 @@ val httpDependencies = Seq(
2930
"com.softwaremill.sttp.tapir" %% "tapir-files" % tapirVersion
3031
)
3132

32-
val monitoringDependencies = Seq(
33+
val observabilityDependencies = Seq(
3334
"com.softwaremill.sttp.client3" %% "opentelemetry-metrics-backend" % sttpVersion,
3435
"com.softwaremill.sttp.tapir" %% "tapir-opentelemetry-metrics" % tapirVersion,
35-
"io.opentelemetry" % "opentelemetry-exporter-otlp" % "1.42.1"
36+
"io.opentelemetry" % "opentelemetry-exporter-otlp" % otelVersion,
37+
"io.opentelemetry" % "opentelemetry-sdk-extension-autoconfigure" % otelVersion
3638
)
3739

3840
val jsonDependencies = Seq(
@@ -174,7 +176,7 @@ lazy val backend: Project = (project in file("backend"))
174176
.settings(
175177
libraryDependencies ++= baseDependencies ++ testingDependencies ++ loggingDependencies ++
176178
configDependencies ++ dbDependencies ++ httpDependencies ++ jsonDependencies ++
177-
apiDocsDependencies ++ monitoringDependencies ++ securityDependencies ++ emailDependencies,
179+
apiDocsDependencies ++ observabilityDependencies ++ securityDependencies ++ emailDependencies,
178180
Compile / mainClass := Some("com.softwaremill.bootzooka.Main"),
179181
copyWebapp := {
180182
val source = uiDirectory.value / "build"

docker-compose.yml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
version: '3'
21
services:
32
bootzooka:
43
image: 'softwaremill/bootzooka:latest'
@@ -13,6 +12,9 @@ services:
1312
SQL_HOST: 'bootzooka-db'
1413
SQL_PORT: '5432'
1514
API_HOST: '0.0.0.0'
15+
OTEL_EXPORTER_OTLP_ENDPOINT: 'http://observability:4317'
16+
OTEL_SERVICE_NAME: 'bootzooka'
17+
1618
bootzooka-db:
1719
image: 'postgres'
1820
ports:
@@ -21,3 +23,9 @@ services:
2123
POSTGRES_USER: 'postgres'
2224
POSTGRES_PASSWORD: 'b00t200k4'
2325
POSTGRES_DB: 'bootzooka'
26+
27+
# OpenTelemetry Collector, Prometheus, Loki, Tempo, Grafana
28+
observability:
29+
image: 'grafana/otel-lgtm'
30+
ports:
31+
- '3000:3000' # Grafana's UI

docs/production.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ java -jar backend/target/scala-VERSION/bootzooka.jar
1313

1414
## Docker
1515

16-
To build a docker image, run `backend/docker:publishLocal`. This will create the `docker:latest` image.
16+
To build a docker image, run `backend/Docker/publishLocal`. This will create the `docker:latest` image.
1717

1818
You can test the image by using the provided `docker-compose.yml` file.
1919

0 commit comments

Comments
 (0)