Skip to content

Commit 8a8ae87

Browse files
respencer-nclclaude
andcommitted
Add Akka Insights and Kubernetes Management module support
- Add insightsModules() for Cinnamon/Akka Insights dependencies - Uses direct Maven coordinates (no sbt-cinnamon plugin needed) - Includes Prometheus and OpenTelemetry support - Scala modules use CrossVersion.for3Use2_13 - Java modules use plain coordinates - Add managementKubernetesModules() for K8s-specific deps - Cluster bootstrap, K8s discovery, K8s lease, rolling updates - Add javaModule() helper for Java-only dependencies - Update forRelease() with withInsights and withManagementKubernetes params - Remove unused sbt-cinnamon plugin reference from plugins.sbt Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent a686a38 commit 8a8ae87

3 files changed

Lines changed: 135 additions & 10 deletions

File tree

NOTEBOOK.md

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
## Current Status
44

5-
**Version 1.2.0 ready for release.** Significant maintenance work completed Jan 17, 2026
6-
addressing all 15 UX issues identified in the maintenance analysis.
7-
All 16 scripted tests passing (100%). Key changes since 1.1.0:
5+
**Version 1.2.4 in development.** Added Akka Insights (withInsights) and Kubernetes
6+
management (withManagementKubernetes) support to the Akka helper. All 16 scripted
7+
tests passing. Key changes since 1.2.3:
88
- CrossModule dependencies now opt-in (breaking change)
99
- New helpers: `With.Publishing`, `With.ScalaJavaTime()`, `With.ClassPathJar`, `With.UnmanagedJars`, `With.ShellPrompt`
1010
- Improved error messages when Root() not configured
@@ -15,6 +15,32 @@ All 16 scripted tests passing (100%). Key changes since 1.1.0:
1515

1616
## Work Completed (Recent)
1717

18+
### Session Jan 24, 2026 - Akka Insights Support
19+
20+
Added `withInsights` and `withManagementKubernetes` parameters to `With.Akka.forRelease()`:
21+
22+
**New Features:**
23+
- `withInsights` - Adds Cinnamon telemetry modules (actor, HTTP, cluster metrics)
24+
- `withInsightsPrometheus` - Prometheus metrics export (default: true)
25+
- `withInsightsOpenTelemetry` - OpenTelemetry tracing (default: true)
26+
- `withManagementKubernetes` - K8s discovery, lease, rolling updates
27+
28+
**Implementation:**
29+
- Added `javaModule()` helper for Java-only dependencies (no Scala suffix)
30+
- Added `insightsModules()` function with all Cinnamon dependencies
31+
- Added `managementKubernetesModules()` function
32+
- Uses direct Maven coordinates instead of sbt-cinnamon plugin
33+
34+
**Technical Notes:**
35+
- Cinnamon Scala modules: cinnamon-akka, cinnamon-akka-typed, cinnamon-akka-stream,
36+
cinnamon-akka-cluster, cinnamon-akka-http
37+
- Cinnamon Java modules: cinnamon-prometheus, cinnamon-prometheus-httpserver,
38+
cinnamon-opentelemetry, cinnamon-agent
39+
- K8s modules: akka-discovery-kubernetes-api, akka-lease-kubernetes,
40+
akka-rolling-update-kubernetes
41+
42+
**Release:** Tag as 1.2.4 after testing
43+
1844
### Session Jan 17, 2026
1945
- [x] Refactored AutoPluginHelper to extend `(Project => Project)` for better UX
2046
- [x] Made CrossModule dependencies optional (breaking change)

project/plugins.sbt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
* limitations under the License.
1515
*/
1616

17-
// resolvers += "Akka library Repository".at("https://repo.akka.io/maven")
18-
1917
// Generic plugins from github.sbt project
2018
addSbtPlugin("com.github.sbt" % "sbt-dynver" % "5.0.1")
2119

src/main/scala/com/ossuminc/sbt/helpers/Akka.scala

Lines changed: 106 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ object Akka extends AutoPluginHelper {
5757
private def akkaTestModule(org: String, name: String, version: String): ModuleID =
5858
(org %% name % version % Test).cross(CrossVersion.for3Use2_13)
5959

60+
/** Helper to create a Java-only dependency (no Scala suffix) */
61+
private def javaModule(org: String, name: String, version: String): ModuleID =
62+
org % name % version
63+
6064
sealed trait ReleaseVersions {
6165
def akka_core: String
6266
def akka_http: String
@@ -65,6 +69,7 @@ object Akka extends AutoPluginHelper {
6569
def akka_management: String
6670
def akka_projections: String
6771
def akka_kafka: String
72+
def akka_insights: String
6873
}
6974

7075
/** Version numbers for Akka 2024.10 release */
@@ -76,6 +81,7 @@ object Akka extends AutoPluginHelper {
7681
val akka_management = "1.6.0"
7782
val akka_projections = "1.6.0"
7883
val akka_kafka = "7.0.0"
84+
val akka_insights = "2.21.0"
7985
}
8086

8187
/** Version numbers for Akka 25.10 release (latest as of Jan 2026) Version numbers from:
@@ -89,6 +95,7 @@ object Akka extends AutoPluginHelper {
8995
val akka_management = "1.6.4"
9096
val akka_projections = "1.6.18"
9197
val akka_kafka = "8.0.0"
98+
val akka_insights = "2.22.0"
9299
}
93100

94101
/** Core Akka modules (actor, cluster, persistence, stream) - available in all releases */
@@ -150,13 +157,73 @@ object Akka extends AutoPluginHelper {
150157
akkaModule("com.lightbend.akka", "akka-projection-r2dbc", version)
151158
)
152159

153-
/** Akka Management modules */
160+
/** Akka Management modules (core) */
154161
def managementModules(version: String): Seq[ModuleID] = Seq(
155162
akkaModule("com.lightbend.akka.management", "akka-management", version),
156163
akkaModule("com.lightbend.akka.management", "akka-management-cluster-http", version),
157164
akkaModule("com.lightbend.akka.management", "akka-management-cluster-bootstrap", version)
158165
)
159166

167+
/** Akka Management Kubernetes-specific modules */
168+
def managementKubernetesModules(version: String): Seq[ModuleID] = Seq(
169+
akkaModule("com.lightbend.akka.discovery", "akka-discovery-kubernetes-api", version),
170+
akkaModule("com.lightbend.akka.management", "akka-lease-kubernetes", version),
171+
akkaModule("com.lightbend.akka.management", "akka-rolling-update-kubernetes", version)
172+
)
173+
174+
/** Akka Insights / Cinnamon modules for telemetry and observability.
175+
*
176+
* Provides:
177+
* - Actor metrics (mailbox size, processing time, failures)
178+
* - HTTP metrics (request latency, status codes)
179+
* - Cluster metrics (phi accrual, member events)
180+
* - Prometheus endpoint for metrics export
181+
* - OpenTelemetry for distributed tracing
182+
*
183+
* NOTE: For full instrumentation at runtime, you may need to configure the Cinnamon
184+
* Java agent. See: https://doc.akka.io/libraries/akka-insights/current/setup/
185+
*
186+
* @param version
187+
* The Akka Insights version (e.g., "2.22.0" for Akka 25.10)
188+
* @param withHTTP
189+
* Include HTTP instrumentation (requires withHTTP in forRelease)
190+
* @param withPrometheus
191+
* Include Prometheus metrics export (default: true)
192+
* @param withOpenTelemetry
193+
* Include OpenTelemetry tracing (default: true)
194+
*/
195+
def insightsModules(
196+
version: String,
197+
withHTTP: Boolean = false,
198+
withPrometheus: Boolean = true,
199+
withOpenTelemetry: Boolean = true
200+
): Seq[ModuleID] = {
201+
// Core Cinnamon modules (Scala 2.13 cross-compiled)
202+
val base = Seq(
203+
akkaModule("com.lightbend.cinnamon", "cinnamon-akka", version),
204+
akkaModule("com.lightbend.cinnamon", "cinnamon-akka-typed", version),
205+
akkaModule("com.lightbend.cinnamon", "cinnamon-akka-stream", version),
206+
akkaModule("com.lightbend.cinnamon", "cinnamon-akka-cluster", version)
207+
)
208+
val http = if (withHTTP) Seq(
209+
akkaModule("com.lightbend.cinnamon", "cinnamon-akka-http", version)
210+
) else Seq.empty
211+
// Prometheus modules (Java-only, no Scala suffix)
212+
val prometheus = if (withPrometheus) Seq(
213+
javaModule("com.lightbend.cinnamon", "cinnamon-prometheus", version),
214+
javaModule("com.lightbend.cinnamon", "cinnamon-prometheus-httpserver", version)
215+
) else Seq.empty
216+
// OpenTelemetry module
217+
val otel = if (withOpenTelemetry) Seq(
218+
javaModule("com.lightbend.cinnamon", "cinnamon-opentelemetry", version)
219+
) else Seq.empty
220+
// Cinnamon agent (needed for runtime instrumentation)
221+
val agent = Seq(
222+
javaModule("com.lightbend.cinnamon", "cinnamon-agent", version)
223+
)
224+
base ++ http ++ prometheus ++ otel ++ agent
225+
}
226+
160227
/** Alpakka Kafka (akka-stream-kafka) modules */
161228
def kafkaModules(version: String): Seq[ModuleID] = Seq(
162229
akkaModule("com.typesafe.akka", "akka-stream-kafka", version)
@@ -165,15 +232,35 @@ object Akka extends AutoPluginHelper {
165232
/** Configure Akka dependencies for a specific release.
166233
*
167234
* Automatically adds:
168-
* - Akka repository resolvers (Maven and Ivy style) with tokenized URL from AKKA_LICENSE_KEY
235+
* - Akka repository resolvers (Maven and Ivy style) with tokenized URL from AKKA_REPO_TOKEN
169236
* - Core Akka modules for the specified release
170237
*
171238
* @param release
172239
* The Akka release version ("25.10" or "24.10"). Default is latest (25.10).
240+
* @param withHTTP
241+
* Include Akka HTTP modules
242+
* @param withGrpc
243+
* Include Akka gRPC runtime
244+
* @param withPersistence
245+
* Include Akka Persistence R2DBC
246+
* @param withProjections
247+
* Include Akka Projections
248+
* @param withManagement
249+
* Include Akka Management (core: health checks, cluster HTTP)
250+
* @param withManagementKubernetes
251+
* Include Akka Management Kubernetes modules (discovery, lease, rolling updates)
252+
* @param withKafka
253+
* Include Alpakka Kafka connector
254+
* @param withInsights
255+
* Include Akka Insights (Cinnamon) for telemetry and observability
256+
* @param withInsightsPrometheus
257+
* Include Prometheus metrics export with Insights (default: true when withInsights)
258+
* @param withInsightsOpenTelemetry
259+
* Include OpenTelemetry tracing with Insights (default: true when withInsights)
173260
* @param project
174261
* The project to configure
175262
* @return
176-
* The configured project with Akka resolvers and core modules
263+
* The configured project with Akka resolvers and selected modules
177264
*/
178265
def forRelease(
179266
release: String = "",
@@ -182,7 +269,11 @@ object Akka extends AutoPluginHelper {
182269
withPersistence: Boolean = false,
183270
withProjections: Boolean = false,
184271
withManagement: Boolean = false,
185-
withKafka: Boolean = false
272+
withManagementKubernetes: Boolean = false,
273+
withKafka: Boolean = false,
274+
withInsights: Boolean = false,
275+
withInsightsPrometheus: Boolean = true,
276+
withInsightsOpenTelemetry: Boolean = true
186277
)(project: Project): Project = {
187278
val versions: ReleaseVersions = release match {
188279
case "2025.10" | "25.10" | "latest" | "" => V_25_10
@@ -211,13 +302,23 @@ object Akka extends AutoPluginHelper {
211302
else Seq.empty[ModuleID]
212303
} ++ {
213304
if (withManagement) managementModules(versions.akka_management) else Seq.empty[ModuleID]
305+
} ++ {
306+
if (withManagementKubernetes) managementKubernetesModules(versions.akka_management)
307+
else Seq.empty[ModuleID]
214308
} ++ {
215309
if (withKafka) kafkaModules(versions.akka_kafka) else Seq.empty[ModuleID]
310+
} ++ {
311+
if (withInsights) insightsModules(
312+
versions.akka_insights,
313+
withHTTP = withHTTP,
314+
withPrometheus = withInsightsPrometheus,
315+
withOpenTelemetry = withInsightsOpenTelemetry
316+
) else Seq.empty[ModuleID]
216317
}
217318
}
218319
)
219320
}
220321

221322
/** Configure Akka with the latest release */
222323
def apply(project: Project): Project = forRelease("")(project)
223-
}
324+
}

0 commit comments

Comments
 (0)