@@ -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