@@ -4,6 +4,10 @@ import (
44 "context"
55 "time"
66
7+ "github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Topic"
8+ "google.golang.org/protobuf/encoding/protojson"
9+ "google.golang.org/protobuf/proto"
10+
711 "github.com/ydb-platform/ydb-go-sdk/v3/internal/kv"
812 "github.com/ydb-platform/ydb-go-sdk/v3/trace"
913)
@@ -885,6 +889,39 @@ func internalTopic(l Logger, d trace.Detailer) (t trace.Topic) {
885889 kv .Version (),
886890 )
887891 }
892+
893+ t .OnWriterSentGRPCMessage = func (info trace.TopicWriterSentGRPCMessageInfo ) {
894+ if d .Details ()& trace .TopicWriterStreamGrpcMessageEvents == 0 {
895+ return
896+ }
897+
898+ ctx := with (context .Background (), TRACE , "ydb" , "topic" , "writer" , "grpc" )
899+ l .Log (
900+ ctx , "topic writer sent grpc message (message body and metadata are removed)" ,
901+ kv .String ("topic_stream_internal_id" , info .TopicStreamInternalID ),
902+ kv .String ("session_id" , info .SessionID ),
903+ kv .Int ("message_number" , info .MessageNumber ),
904+ kv .Stringer ("message" , lazyProtoStringifer {info .Message }),
905+ kv .Error (info .Error ),
906+ kv .Version (),
907+ )
908+ }
909+ t .OnWriterReceiveGRPCMessage = func (info trace.TopicWriterReceiveGRPCMessageInfo ) {
910+ if d .Details ()& trace .TopicWriterStreamGrpcMessageEvents == 0 {
911+ return
912+ }
913+
914+ ctx := with (context .Background (), TRACE , "ydb" , "topic" , "writer" , "grpc" )
915+ l .Log (
916+ ctx , "topic writer received grpc message (message body and metadata are removed)" ,
917+ kv .String ("topic_stream_internal_id" , info .TopicStreamInternalID ),
918+ kv .String ("session_id" , info .SessionID ),
919+ kv .Int ("message_number" , info .MessageNumber ),
920+ kv .Stringer ("message" , lazyProtoStringifer {info .Message }),
921+ kv .Error (info .Error ),
922+ kv .Version (),
923+ )
924+ }
888925 t .OnWriterReadUnknownGrpcMessage = func (info trace.TopicOnWriterReadUnknownGrpcMessageInfo ) {
889926 if d .Details ()& trace .TopicWriterStreamEvents == 0 {
890927 return
@@ -899,3 +936,38 @@ func internalTopic(l Logger, d trace.Detailer) (t trace.Topic) {
899936
900937 return t
901938}
939+
940+ type lazyProtoStringifer struct {
941+ message proto.Message
942+ }
943+
944+ func (s lazyProtoStringifer ) String () string {
945+ // cut message data
946+ if writeRequest , ok := s .message .(* Ydb_Topic.StreamWriteMessage_FromClient ); ok {
947+ if data := writeRequest .GetWriteRequest (); data != nil {
948+ type messDataType struct {
949+ Data []byte
950+ Metadata []* Ydb_Topic.MetadataItem
951+ }
952+ storage := make ([]messDataType , len (data .GetMessages ()))
953+ for i := range data .GetMessages () {
954+ storage [i ].Data = data .GetMessages ()[i ].GetData ()
955+ data .Messages [i ] = nil
956+
957+ storage [i ].Metadata = data .GetMessages ()[i ].GetMetadataItems ()
958+ data .Messages [i ].MetadataItems = nil
959+ }
960+
961+ defer func () {
962+ for i := range data .GetMessages () {
963+ data .Messages [i ].Data = storage [i ].Data
964+ data .Messages [i ].MetadataItems = storage [i ].Metadata
965+ }
966+ }()
967+ }
968+ }
969+
970+ res := protojson.MarshalOptions {AllowPartial : true }.Format (s .message )
971+
972+ return res
973+ }
0 commit comments