solution: access logging for SubscribeStatus method

This commit is contained in:
Igor Artamonov
2021-07-04 18:38:00 -04:00
parent 3ef5a4455c
commit 6cb703ec4e
3 changed files with 69 additions and 1 deletions

View File

@@ -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<ReqT>
}
@Suppress("UNCHECKED_CAST")
private fun <ReqT : Any, RespT : Any> processStatus(
call: ServerCall<ReqT, RespT>,
headers: Metadata,
next: ServerCallHandler<ReqT, RespT>
): ServerCall.Listener<ReqT> {
val builder = EventsBuilder.Status()
.start(headers, call.attributes)
val callWrapper: ServerCall<ReqT, RespT> = OnStatusResponse(
call as ServerCall<BlockchainOuterClass.StatusRequest, BlockchainOuterClass.ChainStatus>,
builder,
accessLogWriter
) as ServerCall<ReqT, RespT>
return OnStatusRequest(
next.startCall(callWrapper, headers) as ServerCall.Listener<BlockchainOuterClass.StatusRequest>,
builder) as ServerCall.Listener<ReqT>
}
class OnSubscribeHead(
val next: ServerCall.Listener<Common.Chain>,
val builder: EventsBuilder.SubscribeHead
@@ -227,6 +247,20 @@ class AccessHandler(
}
}
class OnStatusRequest(
val next: ServerCall.Listener<BlockchainOuterClass.StatusRequest>,
val builder: EventsBuilder.Status
) : ForwardingServerCallListener<BlockchainOuterClass.StatusRequest>() {
override fun onMessage(message: BlockchainOuterClass.StatusRequest) {
super.onMessage(message)
}
override fun delegate(): ServerCall.Listener<BlockchainOuterClass.StatusRequest> {
return next
}
}
abstract class BaseCallResponse<ReqT : Any, RespT : Any>(
val next: ServerCall<ReqT, RespT>
) : ForwardingServerCall<ReqT, RespT>() {
@@ -305,4 +339,17 @@ class AccessHandler(
super.sendMessage(message)
}
}
class OnStatusResponse(
next: ServerCall<BlockchainOuterClass.StatusRequest, BlockchainOuterClass.ChainStatus>,
val builder: EventsBuilder.Status,
val accessLogWriter: AccessLogWriter
) : BaseCallResponse<BlockchainOuterClass.StatusRequest, BlockchainOuterClass.ChainStatus>(next) {
override fun sendMessage(message: BlockchainOuterClass.ChainStatus) {
val event = builder.onReply(message)
accessLogWriter.submit(event)
super.sendMessage(message)
}
}
}

View File

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

View File

@@ -242,4 +242,19 @@ class EventsBuilder {
}
}
class Status : Base<Status>() {
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()
)
}
}
}