Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,10 @@ dependencies {
implementation("io.quarkus:quarkus-kotlin")
implementation("io.quarkus:quarkus-hibernate-orm-panache-kotlin")

// Metrics
implementation("io.quarkus:quarkus-micrometer")
implementation("io.quarkus:quarkus-micrometer-registry-prometheus")

// Other project dependencies
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0")
Expand All @@ -62,6 +66,7 @@ dependencies {
// Test dependencies
testImplementation("io.quarkus:quarkus-junit5")
testImplementation("io.rest-assured:rest-assured")
testImplementation("io.mockk:mockk:1.13.7")
}

group = "com.wire"
Expand Down
2 changes: 2 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ services:
- reminders_app-storage:/deployments/storage
depends_on:
- db
ports:
- "8080:8080"

db:
image: postgres:13
Expand Down
13 changes: 13 additions & 0 deletions helm/remindapp/templates/servicemonitor.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: {{ include "remindapp.fullname" . }}
labels:
{{- include "remindapp.labels" . | nindent 4 }}
spec:
endpoints:
- port: http
path: /q/metrics # 'q' is the default context root for Quarkus applications
selector:
matchLabels:
{{- include "remindapp.selectorLabels" . | nindent 6 }}
6 changes: 4 additions & 2 deletions src/main/kotlin/com/wire/bots/application/MlsSdkClient.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package com.wire.bots.application

import com.wire.bots.domain.event.EventProcessor
import com.wire.bots.infrastructure.utils.UsageMetrics
import com.wire.sdk.WireAppSdk
import com.wire.sdk.service.WireApplicationManager
import io.quarkus.runtime.Startup
Expand All @@ -31,7 +32,8 @@ import java.util.UUID
@ApplicationScoped
@Startup
class MlsSdkClient(
private val eventProcessor: EventProcessor
private val eventProcessor: EventProcessor,
private val usageMetrics: UsageMetrics
) {
private val logger = LoggerFactory.getLogger(this::class.java)
private lateinit var manager: WireApplicationManager
Expand All @@ -55,7 +57,7 @@ class MlsSdkClient(
apiToken = apiToken,
apiHost = apiHost,
cryptographyStoragePassword = cryptographyStoragePassword,
wireEventsHandler = ReminderEventHandler(eventProcessor)
wireEventsHandler = ReminderEventHandler(eventProcessor, usageMetrics)
)

logger.info("Starting Wire Apps SDK...")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,16 @@ import arrow.core.Either
import com.wire.bots.domain.event.BotError
import com.wire.bots.domain.event.Command
import com.wire.bots.domain.event.EventProcessor
import com.wire.bots.infrastructure.utils.UsageMetrics
import com.wire.sdk.WireEventsHandlerSuspending
import com.wire.sdk.model.ConversationData
import com.wire.sdk.model.ConversationMember
import com.wire.sdk.model.WireMessage
import org.slf4j.LoggerFactory

class ReminderEventHandler(
private val eventProcessor: EventProcessor
private val eventProcessor: EventProcessor,
private val usageMetrics: UsageMetrics
) : WireEventsHandlerSuspending() {
private val logger = LoggerFactory.getLogger(this::class.java)

Expand Down Expand Up @@ -61,6 +65,13 @@ class ReminderEventHandler(
manager.sendMessageSuspending(message = message)
}

override suspend fun onAppAddedToConversation(
conversation: ConversationData,
members: List<ConversationMember>
) {
usageMetrics.onAppAddedToConversation()
}

/**
* Process an event using the reminder bot logic
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import com.wire.bots.domain.usecase.ListRemindersInConversation
import com.wire.bots.domain.usecase.SaveReminderSchedule
import com.wire.bots.domain.usecase.SaveReminderSchedule.Companion.MAX_REMINDER_JOBS
import com.wire.bots.infrastructure.utils.CronInterpreter
import com.wire.bots.infrastructure.utils.UsageMetrics
import com.wire.sdk.model.WireMessage
import org.slf4j.LoggerFactory
import java.util.UUID
Expand All @@ -22,7 +23,8 @@ class CommandHandler(
private val outgoingMessageRepository: OutgoingMessageRepository,
private val saveReminderSchedule: SaveReminderSchedule,
private val listRemindersInConversation: ListRemindersInConversation,
private val deleteReminder: DeleteReminderUseCase
private val deleteReminder: DeleteReminderUseCase,
private val usageMetrics: UsageMetrics
) : EventHandler<Command> {
private val logger = LoggerFactory.getLogger(this::class.java)

Expand All @@ -33,21 +35,36 @@ class CommandHandler(
)

val result = when (event) {
is Command.LegacyHelp ->
is Command.LegacyHelp -> {
usageMetrics.onLegacyHelpCommand()
outgoingMessageRepository.sendMessage(
conversationId = event.conversationId,
messageContent = BuildMsg.createLegacyHelpMessage()
)
}

is Command.Help ->
is Command.Help -> {
usageMetrics.onHelpCommand()
outgoingMessageRepository.sendMessage(
conversationId = event.conversationId,
messageContent = BuildMsg.createHelpMessage()
)
}

is Command.NewReminder -> {
usageMetrics.onCreateCommand()
handleNewReminder(event)
}

is Command.NewReminder -> handleNewReminder(event)
is Command.ListReminders -> getReminderListMessages(event)
is Command.DeleteReminder -> deleteReminder(event)
is Command.ListReminders -> {
usageMetrics.onListCommand()
getReminderListMessages(event)
}

is Command.DeleteReminder -> {
usageMetrics.onDeleteCommand()
deleteReminder(event)
}
}

logger.info(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.wire.bots.infrastructure.utils

import com.wire.bots.domain.DomainComponent
import io.micrometer.core.instrument.Counter
import io.micrometer.core.instrument.MeterRegistry

@DomainComponent
class UsageMetrics(
registry: MeterRegistry
) {
private val legacyHelpCommandCounter: Counter = Counter
.builder("remindapp_legacy_help_commands_total")
.description("Number of Legacy Help command received")
.register(registry)

private val helpCommandCounter: Counter = Counter
.builder("remindapp_help_commands_total")
.description("Number of Help command received")
.register(registry)

private val createCommandCounter: Counter = Counter
.builder("remindapp_create_commands_total")
.description("Number of Create command received")
.register(registry)

private val listCommandCounter: Counter = Counter
.builder("remindapp_list_commands_total")
.description("Number of List command received")
.register(registry)

private val deleteCommandCounter: Counter = Counter
.builder("remindapp_delete_commands_total")
.description("Number of Delete command received")
.register(registry)

private val appAddedToConversationCounter: Counter = Counter
.builder("remindapp_added_to_conversation_total")
.description("Number of times the app is added to a conversation")
.register(registry)

fun onLegacyHelpCommand() {
legacyHelpCommandCounter.increment()
}

fun onHelpCommand() {
helpCommandCounter.increment()
}

fun onCreateCommand() {
createCommandCounter.increment()
}

fun onListCommand() {
listCommandCounter.increment()
}

fun onDeleteCommand() {
deleteCommandCounter.increment()
}

fun onAppAddedToConversation() {
appAddedToConversationCounter.increment()
}
}
7 changes: 7 additions & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,10 @@ quarkus.quartz.store-type=jdbc-cmt

# LOGGING
quarkus.log.console.json.enabled=true

#METRICS
quarkus.micrometer.binder.jvm=true
quarkus.micrometer.binder.system=true
quarkus.micrometer.binder.uptime=true
quarkus.micrometer.binder.http-server.enabled=true
quarkus.micrometer.export.prometheus.enabled=true
Loading