From 6cb703ec4e84b63c3e45492d7d4893a0904f5c4c Mon Sep 17 00:00:00 2001 From: Igor Artamonov Date: Sun, 4 Jul 2021 18:38:00 -0400 Subject: [PATCH] solution: access logging for SubscribeStatus method --- .../monitoring/accesslog/AccessHandler.kt | 49 ++++++++++++++++++- .../dshackle/monitoring/accesslog/Events.kt | 6 +++ .../monitoring/accesslog/EventsBuilder.kt | 15 ++++++ 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/AccessHandler.kt b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/AccessHandler.kt index 0bbde482..210623b7 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/AccessHandler.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/AccessHandler.kt @@ -43,8 +43,9 @@ class AccessHandler( "GetBalance" -> processSubscribeBalance(call, headers, next, false) "NativeCall" -> processNativeCall(call, headers, next) "Describe" -> processDescribe(call, headers, next) + "SubscribeStatus" -> processStatus(call, headers, next) else -> { - log.trace("unsupported method `{}`", method) + log.warn("unsupported method `{}`", method) next.startCall(call, headers) } } @@ -137,6 +138,25 @@ class AccessHandler( builder) as ServerCall.Listener } + @Suppress("UNCHECKED_CAST") + private fun processStatus( + call: ServerCall, + headers: Metadata, + next: ServerCallHandler + ): ServerCall.Listener { + val builder = EventsBuilder.Status() + .start(headers, call.attributes) + + val callWrapper: ServerCall = OnStatusResponse( + call as ServerCall, + builder, + accessLogWriter + ) as ServerCall + return OnStatusRequest( + next.startCall(callWrapper, headers) as ServerCall.Listener, + builder) as ServerCall.Listener + } + class OnSubscribeHead( val next: ServerCall.Listener, val builder: EventsBuilder.SubscribeHead @@ -227,6 +247,20 @@ class AccessHandler( } } + class OnStatusRequest( + val next: ServerCall.Listener, + val builder: EventsBuilder.Status + ) : ForwardingServerCallListener() { + + override fun onMessage(message: BlockchainOuterClass.StatusRequest) { + super.onMessage(message) + } + + override fun delegate(): ServerCall.Listener { + return next + } + } + abstract class BaseCallResponse( val next: ServerCall ) : ForwardingServerCall() { @@ -305,4 +339,17 @@ class AccessHandler( super.sendMessage(message) } } + + class OnStatusResponse( + next: ServerCall, + val builder: EventsBuilder.Status, + val accessLogWriter: AccessLogWriter + ) : BaseCallResponse(next) { + + override fun sendMessage(message: BlockchainOuterClass.ChainStatus) { + val event = builder.onReply(message) + accessLogWriter.submit(event) + super.sendMessage(message) + } + } } \ No newline at end of file diff --git a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/Events.kt b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/Events.kt index 5a38ae05..a0f11ab6 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/Events.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/Events.kt @@ -102,6 +102,12 @@ class Events { val request: StreamRequestDetails ) : Base(id, "Describe") + @JsonInclude(JsonInclude.Include.NON_NULL) + class Status( + blockchain: Chain, id: UUID, + val request: StreamRequestDetails + ) : ChainBase(blockchain, "Status", id) + data class StreamRequestDetails( val id: UUID, val start: Instant, diff --git a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/EventsBuilder.kt b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/EventsBuilder.kt index d29218ee..520fe06f 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/EventsBuilder.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/accesslog/EventsBuilder.kt @@ -242,4 +242,19 @@ class EventsBuilder { } } + class Status : Base() { + override fun getT(): Status { + return this + } + + fun onReply(message: BlockchainOuterClass.ChainStatus): Events.Status { + val chain = Chain.byId(message.chainValue) + return Events.Status( + blockchain = chain, + request = requestDetails, + id = UUID.randomUUID() + ) + } + } + } \ No newline at end of file