Skip to content

Commit 6ec274c

Browse files
#187 Registrere hendelser i ebms-provider (#131)
* Lagt til registrering av hendelser: MESSAGE_RECEIVED_VIA_HTTP, MESSAGE_SENT_VIA_HTTP og ERROR_WHILE_SENDING_MESSAGE_VIA_HTTP * Tatt i bruk utvidelsesfunsjoner fra emottak-utils
1 parent 3ea354e commit 6ec274c

File tree

8 files changed

+86
-14
lines changed

8 files changed

+86
-14
lines changed

.nais/ebms-provider-dev.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ spec:
5353
- "https://ebms-provider-fss.intern.dev.nav.no"
5454
vault:
5555
enabled: true
56+
kafka:
57+
pool: nav-dev
5658
accessPolicy:
5759
outbound:
5860
rules:

ebms-provider/src/main/kotlin/no/nav/emottak/ebms/App.kt

+11-3
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,12 @@ import io.ktor.utils.io.CancellationException
1414
import io.micrometer.prometheusmetrics.PrometheusConfig
1515
import io.micrometer.prometheusmetrics.PrometheusMeterRegistry
1616
import kotlinx.coroutines.awaitCancellation
17+
import no.nav.emottak.ebms.configuration.config
1718
import no.nav.emottak.ebms.processing.ProcessingService
1819
import no.nav.emottak.ebms.sendin.SendInService
1920
import no.nav.emottak.ebms.validation.DokumentValidator
21+
import no.nav.emottak.utils.kafka.client.EventPublisherClient
22+
import no.nav.emottak.utils.kafka.service.EventLoggingService
2023
import org.slf4j.LoggerFactory
2124

2225
val log = LoggerFactory.getLogger("no.nav.emottak.ebms.App")
@@ -34,6 +37,9 @@ fun main() = SuspendApp {
3437
val sendInClient = SendInClient(scopedAuthHttpClient(EBMS_SEND_IN_SCOPE))
3538
val sendInService = SendInService(sendInClient)
3639

40+
val kafkaPublisherClient = EventPublisherClient(config().kafka)
41+
val eventLoggingService = EventLoggingService(kafkaPublisherClient)
42+
3743
result {
3844
resourceScope {
3945
server(
@@ -43,7 +49,8 @@ fun main() = SuspendApp {
4349
ebmsProviderModule(
4450
dokumentValidator,
4551
processingService,
46-
sendInService
52+
sendInService,
53+
eventLoggingService
4754
)
4855
}
4956
).also { it.engineConfig.maxChunkSize = 100000 }
@@ -62,7 +69,8 @@ fun main() = SuspendApp {
6269
fun Application.ebmsProviderModule(
6370
validator: DokumentValidator,
6471
processing: ProcessingService,
65-
sendInService: SendInService
72+
sendInService: SendInService,
73+
eventLoggingService: EventLoggingService
6674
) {
6775
val appMicrometerRegistry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT)
6876

@@ -76,6 +84,6 @@ fun Application.ebmsProviderModule(
7684
registerPrometheusEndpoint(appMicrometerRegistry)
7785
registerNavCheckStatus()
7886

79-
postEbmsSync(validator, processing, sendInService)
87+
postEbmsSync(validator, processing, sendInService, eventLoggingService)
8088
}
8189
}

ebms-provider/src/main/kotlin/no/nav/emottak/ebms/Routes.kt

+60-5
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,20 @@ import no.nav.emottak.message.model.PayloadProcessing
2424
import no.nav.emottak.message.model.SignatureDetails
2525
import no.nav.emottak.util.marker
2626
import no.nav.emottak.util.retrieveLoggableHeaderPairs
27+
import no.nav.emottak.utils.common.parseOrGenerateUuid
28+
import no.nav.emottak.utils.kafka.model.Event
29+
import no.nav.emottak.utils.kafka.model.EventType
30+
import no.nav.emottak.utils.kafka.service.EventLoggingService
31+
import no.nav.emottak.utils.serialization.toEventDataJson
2732
import kotlin.uuid.ExperimentalUuidApi
2833
import kotlin.uuid.Uuid
2934

3035
@OptIn(ExperimentalUuidApi::class)
3136
fun Route.postEbmsSync(
3237
validator: DokumentValidator,
3338
processingService: ProcessingService,
34-
sendInService: SendInService
39+
sendInService: SendInService,
40+
eventLoggingService: EventLoggingService
3541
): Route = post("/ebms/sync") {
3642
log.info("Receiving synchronous request")
3743

@@ -41,6 +47,10 @@ fun Route.postEbmsSync(
4147
call.request.validateMime()
4248
ebMSDocument = call.receiveEbmsDokument()
4349
log.info(ebMSDocument.messageHeader().marker(loggableHeaders), "Melding mottatt")
50+
eventLoggingService.registerEvent(
51+
EventType.MESSAGE_RECEIVED_VIA_HTTP,
52+
ebMSDocument
53+
)
4454
} catch (ex: MimeValidationException) {
4555
logger().error(
4656
call.request.headers.marker(),
@@ -102,13 +112,17 @@ fun Route.postEbmsSync(
102112
processingService.proccessSyncOut(messageProcessing.first, messageProcessing.second)
103113
Pair<PayloadMessage, PayloadProcessing?>(processedMessage, messageProcessing.second)
104114
}.let {
115+
val ebMSDocument = it.first.toEbmsDokument()
105116
call.respondEbmsDokument(
106-
it.first.toEbmsDokument().also { ebmsDocument ->
117+
ebMSDocument.also { ebmsDocument ->
107118
ebmsDocument.signer(it.second!!.signingCertificate)
108119
}
109120
)
110121
log.info(it.first.marker(), "Melding ferdig behandlet og svar returnert")
111-
// TODO: Event-logging OK
122+
eventLoggingService.registerEvent(
123+
EventType.MESSAGE_SENT_VIA_HTTP,
124+
it.first.toEbmsDokument()
125+
)
112126
return@post
113127
}
114128
} catch (ebmsException: EbmsException) {
@@ -118,16 +132,57 @@ fun Route.postEbmsSync(
118132
it.signer(signatureDetails)
119133
}
120134
log.info(ebmsMessage.marker(), "Created MessageError response")
121-
// TODO: Event-logging Feil
135+
136+
eventLoggingService.registerEvent(
137+
EventType.ERROR_WHILE_SENDING_MESSAGE_VIA_HTTP,
138+
ebMSDocument,
139+
ebmsException.toEventDataJson()
140+
)
141+
122142
call.respondEbmsDokument(it)
123143
return@post
124144
}
125145
} catch (ex: Exception) {
126146
log.error(ebmsMessage.marker(), "Unknown error during message processing: ${ex.message}", ex)
127-
// TODO: Event-logging Feil
147+
148+
eventLoggingService.registerEvent(
149+
EventType.ERROR_WHILE_SENDING_MESSAGE_VIA_HTTP,
150+
ebMSDocument,
151+
ex.toEventDataJson()
152+
)
153+
128154
call.respond(
129155
HttpStatusCode.InternalServerError,
130156
ex.parseAsSoapFault()
131157
)
132158
}
133159
}
160+
161+
@OptIn(ExperimentalUuidApi::class)
162+
suspend fun EventLoggingService.registerEvent(
163+
eventType: EventType,
164+
ebMSDocument: EbMSDocument,
165+
eventData: String = ""
166+
) {
167+
log.debug("Event reg. test: Registering event for requestId: ${ebMSDocument.requestId}")
168+
169+
try {
170+
val requestId = ebMSDocument.requestId.parseOrGenerateUuid()
171+
172+
log.debug("Event reg. test: RequestId: $requestId")
173+
174+
val event = Event(
175+
eventType = eventType,
176+
requestId = requestId,
177+
contentId = "",
178+
messageId = ebMSDocument.transform().messageId,
179+
eventData = eventData
180+
)
181+
182+
log.debug("Event reg. test: Publishing event: $event")
183+
this.logEvent(event)
184+
log.debug("Event reg. test: Event published successfully")
185+
} catch (e: Exception) {
186+
log.error("Event reg. test: Error while registering event: ${e.message}", e)
187+
}
188+
}

ebms-provider/src/test/kotlin/no/nav/emottak/ebms/EbmsRoutFellesIT.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import no.nav.emottak.message.model.ValidationResult
2727
import no.nav.emottak.message.xml.xmlMarshaller
2828
import no.nav.emottak.util.decodeBase64
2929
import no.nav.emottak.utils.environment.getEnvVar
30+
import no.nav.emottak.utils.kafka.service.EventLoggingService
3031
import org.apache.xml.security.algorithms.MessageDigestAlgorithm
3132
import org.apache.xml.security.signature.XMLSignature
3233
import org.junit.jupiter.api.Assertions
@@ -38,6 +39,7 @@ abstract class EbmsRoutFellesIT(val endpoint: String) {
3839

3940
val validMultipartRequest = validMultipartRequest()
4041
val processingService = mockk<ProcessingService>()
42+
val eventLoggingService = mockk<EventLoggingService>()
4143
val mockProcessConfig = ProcessConfig(
4244
true,
4345
true,
@@ -67,7 +69,7 @@ abstract class EbmsRoutFellesIT(val endpoint: String) {
6769
}
6870

6971
routing {
70-
postEbmsSync(dokumentValidator, processingService, SendInService(sendInClient))
72+
postEbmsSync(dokumentValidator, processingService, SendInService(sendInClient), eventLoggingService)
7173
}
7274
}
7375
externalServices {

ebms-provider/src/test/kotlin/no/nav/emottak/ebms/EbmsRouteSyncIT.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class EbmsRouteSyncIT : EbmsRoutFellesIT(SYNC_PATH) {
6969
incomingMessage
7070
}
7171
routing {
72-
postEbmsSync(dokumentValidator, processingService, SendInService(sendInClient))
72+
postEbmsSync(dokumentValidator, processingService, SendInService(sendInClient), eventLoggingService)
7373
}
7474
}
7575
externalServices {

ebms-provider/src/test/kotlin/no/nav/emottak/ebms/test/IntegrasjonsTest.kt

+5-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import io.ktor.server.engine.embeddedServer
1212
import io.ktor.server.netty.Netty
1313
import io.ktor.server.testing.testApplication
1414
import io.mockk.clearAllMocks
15+
import io.mockk.mockk
1516
import kotlinx.coroutines.runBlocking
1617
import no.nav.emottak.constants.SMTPHeaders
1718
import no.nav.emottak.cpa.cpaApplicationModule
@@ -29,6 +30,7 @@ import no.nav.emottak.ebms.sendin.SendInService
2930
import no.nav.emottak.ebms.testConfiguration
3031
import no.nav.emottak.ebms.validation.DokumentValidator
3132
import no.nav.emottak.ebms.validation.MimeHeaders
33+
import no.nav.emottak.utils.kafka.service.EventLoggingService
3234
import no.nav.security.mock.oauth2.MockOAuth2Server
3335
import org.junit.jupiter.api.AfterAll
3436
import org.junit.jupiter.api.Assertions
@@ -45,6 +47,7 @@ open class EndToEndTest {
4547
val mockOAuth2Server = MockOAuth2Server().also { it.start(port = 3344) }
4648
val ebmsProviderUrl = "http://localhost:$portnoEbmsProvider"
4749
val cpaRepoUrl = "http://localhost:$portnoCpaRepo"
50+
val eventLoggingService = mockk<EventLoggingService>()
4851

4952
// TODO Start mailserver og payload processor
5053
val cpaRepoDbContainer: PostgreSQLContainer<Nothing>
@@ -83,7 +86,7 @@ open class EndToEndTest {
8386
ebmsProviderServer = embeddedServer(
8487
Netty,
8588
port = portnoEbmsProvider,
86-
module = { ebmsProviderModule(dokumentValidator, processingService, sendInService) }
89+
module = { ebmsProviderModule(dokumentValidator, processingService, sendInService, eventLoggingService) }
8790
).also {
8891
it.start()
8992
}.engine
@@ -102,7 +105,7 @@ class IntegrasjonsTest : EndToEndTest() {
102105

103106
@Test
104107
fun basicEndpointTest() = testApplication {
105-
application { ebmsProviderModule(dokumentValidator, processingService, sendInService) }
108+
application { ebmsProviderModule(dokumentValidator, processingService, sendInService, eventLoggingService) }
106109
val response = client.get("/")
107110
Assertions.assertEquals(HttpStatusCode.OK, response.status)
108111
Assertions.assertEquals("{\"status\":\"Hello\"}", response.bodyAsText())

ebms-provider/src/test/kotlin/no/nav/emottak/ebms/validation/MimeValidationIT.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import no.nav.emottak.message.model.ErrorCode
2222
import no.nav.emottak.message.model.Feil
2323
import no.nav.emottak.message.model.ValidationResult
2424
import no.nav.emottak.message.xml.xmlMarshaller
25+
import no.nav.emottak.utils.kafka.service.EventLoggingService
2526
import org.junit.jupiter.api.Assertions.assertEquals
2627
import org.junit.jupiter.api.Assertions.assertNotNull
2728
import org.junit.jupiter.api.Assertions.assertTrue
@@ -35,14 +36,15 @@ class MimeValidationIT {
3536

3637
val validMultipartRequest = validMultipartRequest()
3738
val cpaRepoClient = mockk<CpaRepoClient>()
39+
val eventLoggingService = mockk<EventLoggingService>()
3840

3941
fun <T> mimeTestApp(testBlock: suspend ApplicationTestBuilder.() -> T) = testApplication {
4042
application {
4143
val dokumentValidator = DokumentValidator(cpaRepoClient)
4244
val processingService = mockk<ProcessingService>()
4345
val sendInService = mockk<SendInService>()
4446
routing {
45-
postEbmsSync(dokumentValidator, processingService, sendInService)
47+
postEbmsSync(dokumentValidator, processingService, sendInService, eventLoggingService)
4648
}
4749
}
4850
externalServices {

settings.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ dependencyResolutionManagement {
2121
version("hoplite", "2.8.2")
2222
version("logback", "1.5.17")
2323
version("logstash", "8.0")
24-
version("emottak-utils", "0.2.1")
24+
version("emottak-utils", "0.2.2")
2525

2626
library("bcpkix-jdk18on", "org.bouncycastle", "bcpkix-jdk18on").versionRef("bouncycastle")
2727
library("bcprov-jdk18on", "org.bouncycastle", "bcprov-jdk18on").versionRef("bouncycastle")

0 commit comments

Comments
 (0)