Skip to content

Commit 5e5317b

Browse files
authored
chore: Integrate prometheus for metrics - WPB-21844 (#31)
Integrate Prometheus. Enable default JVM metrics. Add custom metrics.
1 parent efd0068 commit 5e5317b

File tree

9 files changed

+310
-9
lines changed

9 files changed

+310
-9
lines changed

build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ dependencies {
5252
implementation("io.quarkus:quarkus-kotlin")
5353
implementation("io.quarkus:quarkus-hibernate-orm-panache-kotlin")
5454

55+
// Metrics
56+
implementation("io.quarkus:quarkus-micrometer")
57+
implementation("io.quarkus:quarkus-micrometer-registry-prometheus")
58+
5559
// Other project dependencies
5660
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
5761
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0")
@@ -62,6 +66,7 @@ dependencies {
6266
// Test dependencies
6367
testImplementation("io.quarkus:quarkus-junit5")
6468
testImplementation("io.rest-assured:rest-assured")
69+
testImplementation("io.mockk:mockk:1.13.7")
6570
}
6671

6772
group = "com.wire"

docker-compose.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ services:
1313
- reminders_app-storage:/deployments/storage
1414
depends_on:
1515
- db
16+
ports:
17+
- "8080:8080"
1618

1719
db:
1820
image: postgres:13
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
apiVersion: monitoring.coreos.com/v1
2+
kind: ServiceMonitor
3+
metadata:
4+
name: {{ include "remindapp.fullname" . }}
5+
labels:
6+
{{- include "remindapp.labels" . | nindent 4 }}
7+
spec:
8+
endpoints:
9+
- port: http
10+
path: /q/metrics # 'q' is the default context root for Quarkus applications
11+
selector:
12+
matchLabels:
13+
{{- include "remindapp.selectorLabels" . | nindent 6 }}

src/main/kotlin/com/wire/bots/application/MlsSdkClient.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package com.wire.bots.application
1717

1818
import com.wire.bots.domain.event.EventProcessor
19+
import com.wire.bots.infrastructure.utils.UsageMetrics
1920
import com.wire.sdk.WireAppSdk
2021
import com.wire.sdk.service.WireApplicationManager
2122
import io.quarkus.runtime.Startup
@@ -31,7 +32,8 @@ import java.util.UUID
3132
@ApplicationScoped
3233
@Startup
3334
class MlsSdkClient(
34-
private val eventProcessor: EventProcessor
35+
private val eventProcessor: EventProcessor,
36+
private val usageMetrics: UsageMetrics
3537
) {
3638
private val logger = LoggerFactory.getLogger(this::class.java)
3739
private lateinit var manager: WireApplicationManager
@@ -55,7 +57,7 @@ class MlsSdkClient(
5557
apiToken = apiToken,
5658
apiHost = apiHost,
5759
cryptographyStoragePassword = cryptographyStoragePassword,
58-
wireEventsHandler = ReminderEventHandler(eventProcessor)
60+
wireEventsHandler = ReminderEventHandler(eventProcessor, usageMetrics)
5961
)
6062

6163
logger.info("Starting Wire Apps SDK...")

src/main/kotlin/com/wire/bots/application/ReminderEventHandler.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,16 @@ import arrow.core.Either
44
import com.wire.bots.domain.event.BotError
55
import com.wire.bots.domain.event.Command
66
import com.wire.bots.domain.event.EventProcessor
7+
import com.wire.bots.infrastructure.utils.UsageMetrics
78
import com.wire.sdk.WireEventsHandlerSuspending
9+
import com.wire.sdk.model.ConversationData
10+
import com.wire.sdk.model.ConversationMember
811
import com.wire.sdk.model.WireMessage
912
import org.slf4j.LoggerFactory
1013

1114
class ReminderEventHandler(
12-
private val eventProcessor: EventProcessor
15+
private val eventProcessor: EventProcessor,
16+
private val usageMetrics: UsageMetrics
1317
) : WireEventsHandlerSuspending() {
1418
private val logger = LoggerFactory.getLogger(this::class.java)
1519

@@ -61,6 +65,13 @@ class ReminderEventHandler(
6165
manager.sendMessageSuspending(message = message)
6266
}
6367

68+
override suspend fun onAppAddedToConversation(
69+
conversation: ConversationData,
70+
members: List<ConversationMember>
71+
) {
72+
usageMetrics.onAppAddedToConversation()
73+
}
74+
6475
/**
6576
* Process an event using the reminder bot logic
6677
*/

src/main/kotlin/com/wire/bots/domain/event/handlers/CommandHandler.kt

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.wire.bots.domain.usecase.ListRemindersInConversation
1313
import com.wire.bots.domain.usecase.SaveReminderSchedule
1414
import com.wire.bots.domain.usecase.SaveReminderSchedule.Companion.MAX_REMINDER_JOBS
1515
import com.wire.bots.infrastructure.utils.CronInterpreter
16+
import com.wire.bots.infrastructure.utils.UsageMetrics
1617
import com.wire.sdk.model.WireMessage
1718
import org.slf4j.LoggerFactory
1819
import java.util.UUID
@@ -22,7 +23,8 @@ class CommandHandler(
2223
private val outgoingMessageRepository: OutgoingMessageRepository,
2324
private val saveReminderSchedule: SaveReminderSchedule,
2425
private val listRemindersInConversation: ListRemindersInConversation,
25-
private val deleteReminder: DeleteReminderUseCase
26+
private val deleteReminder: DeleteReminderUseCase,
27+
private val usageMetrics: UsageMetrics
2628
) : EventHandler<Command> {
2729
private val logger = LoggerFactory.getLogger(this::class.java)
2830

@@ -33,21 +35,36 @@ class CommandHandler(
3335
)
3436

3537
val result = when (event) {
36-
is Command.LegacyHelp ->
38+
is Command.LegacyHelp -> {
39+
usageMetrics.onLegacyHelpCommand()
3740
outgoingMessageRepository.sendMessage(
3841
conversationId = event.conversationId,
3942
messageContent = BuildMsg.createLegacyHelpMessage()
4043
)
44+
}
4145

42-
is Command.Help ->
46+
is Command.Help -> {
47+
usageMetrics.onHelpCommand()
4348
outgoingMessageRepository.sendMessage(
4449
conversationId = event.conversationId,
4550
messageContent = BuildMsg.createHelpMessage()
4651
)
52+
}
53+
54+
is Command.NewReminder -> {
55+
usageMetrics.onCreateCommand()
56+
handleNewReminder(event)
57+
}
4758

48-
is Command.NewReminder -> handleNewReminder(event)
49-
is Command.ListReminders -> getReminderListMessages(event)
50-
is Command.DeleteReminder -> deleteReminder(event)
59+
is Command.ListReminders -> {
60+
usageMetrics.onListCommand()
61+
getReminderListMessages(event)
62+
}
63+
64+
is Command.DeleteReminder -> {
65+
usageMetrics.onDeleteCommand()
66+
deleteReminder(event)
67+
}
5168
}
5269

5370
logger.info(
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.wire.bots.infrastructure.utils
2+
3+
import com.wire.bots.domain.DomainComponent
4+
import io.micrometer.core.instrument.Counter
5+
import io.micrometer.core.instrument.MeterRegistry
6+
7+
@DomainComponent
8+
class UsageMetrics(
9+
registry: MeterRegistry
10+
) {
11+
private val legacyHelpCommandCounter: Counter = Counter
12+
.builder("remindapp_legacy_help_commands_total")
13+
.description("Number of Legacy Help command received")
14+
.register(registry)
15+
16+
private val helpCommandCounter: Counter = Counter
17+
.builder("remindapp_help_commands_total")
18+
.description("Number of Help command received")
19+
.register(registry)
20+
21+
private val createCommandCounter: Counter = Counter
22+
.builder("remindapp_create_commands_total")
23+
.description("Number of Create command received")
24+
.register(registry)
25+
26+
private val listCommandCounter: Counter = Counter
27+
.builder("remindapp_list_commands_total")
28+
.description("Number of List command received")
29+
.register(registry)
30+
31+
private val deleteCommandCounter: Counter = Counter
32+
.builder("remindapp_delete_commands_total")
33+
.description("Number of Delete command received")
34+
.register(registry)
35+
36+
private val appAddedToConversationCounter: Counter = Counter
37+
.builder("remindapp_added_to_conversation_total")
38+
.description("Number of times the app is added to a conversation")
39+
.register(registry)
40+
41+
fun onLegacyHelpCommand() {
42+
legacyHelpCommandCounter.increment()
43+
}
44+
45+
fun onHelpCommand() {
46+
helpCommandCounter.increment()
47+
}
48+
49+
fun onCreateCommand() {
50+
createCommandCounter.increment()
51+
}
52+
53+
fun onListCommand() {
54+
listCommandCounter.increment()
55+
}
56+
57+
fun onDeleteCommand() {
58+
deleteCommandCounter.increment()
59+
}
60+
61+
fun onAppAddedToConversation() {
62+
appAddedToConversationCounter.increment()
63+
}
64+
}

src/main/resources/application.properties

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,10 @@ quarkus.quartz.store-type=jdbc-cmt
1414

1515
# LOGGING
1616
quarkus.log.console.json.enabled=true
17+
18+
#METRICS
19+
quarkus.micrometer.binder.jvm=true
20+
quarkus.micrometer.binder.system=true
21+
quarkus.micrometer.binder.uptime=true
22+
quarkus.micrometer.binder.http-server.enabled=true
23+
quarkus.micrometer.export.prometheus.enabled=true

0 commit comments

Comments
 (0)