solution: access logging for SubscribeStatus method
This commit is contained in:
@@ -43,8 +43,9 @@ class AccessHandler(
|
|||||||
"GetBalance" -> processSubscribeBalance(call, headers, next, false)
|
"GetBalance" -> processSubscribeBalance(call, headers, next, false)
|
||||||
"NativeCall" -> processNativeCall(call, headers, next)
|
"NativeCall" -> processNativeCall(call, headers, next)
|
||||||
"Describe" -> processDescribe(call, headers, next)
|
"Describe" -> processDescribe(call, headers, next)
|
||||||
|
"SubscribeStatus" -> processStatus(call, headers, next)
|
||||||
else -> {
|
else -> {
|
||||||
log.trace("unsupported method `{}`", method)
|
log.warn("unsupported method `{}`", method)
|
||||||
next.startCall(call, headers)
|
next.startCall(call, headers)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -137,6 +138,25 @@ class AccessHandler(
|
|||||||
builder) as ServerCall.Listener<ReqT>
|
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(
|
class OnSubscribeHead(
|
||||||
val next: ServerCall.Listener<Common.Chain>,
|
val next: ServerCall.Listener<Common.Chain>,
|
||||||
val builder: EventsBuilder.SubscribeHead
|
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>(
|
abstract class BaseCallResponse<ReqT : Any, RespT : Any>(
|
||||||
val next: ServerCall<ReqT, RespT>
|
val next: ServerCall<ReqT, RespT>
|
||||||
) : ForwardingServerCall<ReqT, RespT>() {
|
) : ForwardingServerCall<ReqT, RespT>() {
|
||||||
@@ -305,4 +339,17 @@ class AccessHandler(
|
|||||||
super.sendMessage(message)
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -102,6 +102,12 @@ class Events {
|
|||||||
val request: StreamRequestDetails
|
val request: StreamRequestDetails
|
||||||
) : Base(id, "Describe")
|
) : Base(id, "Describe")
|
||||||
|
|
||||||
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||||
|
class Status(
|
||||||
|
blockchain: Chain, id: UUID,
|
||||||
|
val request: StreamRequestDetails
|
||||||
|
) : ChainBase(blockchain, "Status", id)
|
||||||
|
|
||||||
data class StreamRequestDetails(
|
data class StreamRequestDetails(
|
||||||
val id: UUID,
|
val id: UUID,
|
||||||
val start: Instant,
|
val start: Instant,
|
||||||
|
|||||||
@@ -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()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user