solution: access logging for Describe method

This commit is contained in:
Igor Artamonov
2021-07-04 17:33:38 -04:00
parent 50a7177e6a
commit ba1e93a965
3 changed files with 72 additions and 3 deletions

View File

@@ -42,6 +42,7 @@ class AccessHandler(
"SubscribeTxStatus" -> processSubscribeTxStatus(call, headers, next)
"GetBalance" -> processSubscribeBalance(call, headers, next, false)
"NativeCall" -> processNativeCall(call, headers, next)
"Describe" -> processDescribe(call, headers, next)
else -> {
log.trace("unsupported method `{}`", method)
next.startCall(call, headers)
@@ -117,6 +118,25 @@ class AccessHandler(
} as ServerCall.Listener<ReqT>
}
@Suppress("UNCHECKED_CAST")
private fun <ReqT : Any, RespT : Any> processDescribe(
call: ServerCall<ReqT, RespT>,
headers: Metadata,
next: ServerCallHandler<ReqT, RespT>
): ServerCall.Listener<ReqT> {
val builder = EventsBuilder.Describe()
.start(headers, call.attributes)
val callWrapper: ServerCall<ReqT, RespT> = OnDescribeResponse(
call as ServerCall<BlockchainOuterClass.DescribeRequest, BlockchainOuterClass.DescribeResponse>,
builder,
accessLogWriter
) as ServerCall<ReqT, RespT>
return OnDescribeRequest(
next.startCall(callWrapper, headers) as ServerCall.Listener<BlockchainOuterClass.DescribeRequest>,
builder) as ServerCall.Listener<ReqT>
}
class OnSubscribeHead(
val next: ServerCall.Listener<Common.Chain>,
val builder: EventsBuilder.SubscribeHead
@@ -193,6 +213,20 @@ class AccessHandler(
}
}
class OnDescribeRequest(
val next: ServerCall.Listener<BlockchainOuterClass.DescribeRequest>,
val builder: EventsBuilder.Describe
) : ForwardingServerCallListener<BlockchainOuterClass.DescribeRequest>() {
override fun onMessage(message: BlockchainOuterClass.DescribeRequest) {
super.onMessage(message)
}
override fun delegate(): ServerCall.Listener<BlockchainOuterClass.DescribeRequest> {
return next
}
}
abstract class BaseCallResponse<ReqT : Any, RespT : Any>(
val next: ServerCall<ReqT, RespT>
) : ForwardingServerCall<ReqT, RespT>() {
@@ -258,4 +292,17 @@ class AccessHandler(
super.sendMessage(message)
}
}
class OnDescribeResponse(
next: ServerCall<BlockchainOuterClass.DescribeRequest, BlockchainOuterClass.DescribeResponse>,
val builder: EventsBuilder.Describe,
val accessLogWriter: AccessLogWriter
) : BaseCallResponse<BlockchainOuterClass.DescribeRequest, BlockchainOuterClass.DescribeResponse>(next) {
override fun sendMessage(message: BlockchainOuterClass.DescribeResponse) {
val event = builder.onReply()
accessLogWriter.submit(event)
super.sendMessage(message)
}
}
}

View File

@@ -28,14 +28,15 @@ class Events {
}
abstract class Base(
val id: UUID
val id: UUID,
val method: String
) {
val ts = Instant.now()
}
abstract class ChainBase(
val blockchain: Chain, val method: String, id: UUID
) : Base(id)
val blockchain: Chain, method: String, id: UUID
) : Base(id, method)
@JsonInclude(JsonInclude.Include.NON_NULL)
class SubscribeHead(
@@ -95,6 +96,12 @@ class Events {
val nativeCall: NativeCallItemDetails
) : ChainBase(blockchain, "NativeCall", id)
@JsonInclude(JsonInclude.Include.NON_NULL)
class Describe(
id: UUID,
val request: StreamRequestDetails
) : Base(id, "Describe")
data class StreamRequestDetails(
val id: UUID,
val start: Instant,

View File

@@ -227,4 +227,19 @@ class EventsBuilder {
}
}
}
class Describe : Base<Describe>() {
override fun getT(): Describe {
return this
}
fun onReply(): Events.Describe {
return Events.Describe(
id = UUID.randomUUID(),
request = requestDetails
)
}
}
}