Skip to content

Commit bcfda2c

Browse files
authored
Merge pull request #46 from hengyoush/fix/redis-parse
[Fix] fix redis message parse issue
2 parents 8aaa481 + a3b3ba2 commit bcfda2c

File tree

2 files changed

+25
-8
lines changed

2 files changed

+25
-8
lines changed

agent/conn/conntrack.go

+10-3
Original file line numberDiff line numberDiff line change
@@ -311,9 +311,16 @@ func (c *Connection4) OnSyscallEvent(data []byte, event *bpf.SyscallEventData, r
311311
} else {
312312
c.respStreamBuffer.Add(event.SyscallEvent.Ke.Seq, data, event.SyscallEvent.Ke.Ts)
313313
}
314-
315-
c.parseStreamBuffer(c.reqStreamBuffer, protocol.Request, &c.ReqQueue, event.SyscallEvent.Ke.Step)
316-
c.parseStreamBuffer(c.respStreamBuffer, protocol.Response, &c.RespQueue, event.SyscallEvent.Ke.Step)
314+
reqSteamMessageType := protocol.Request
315+
if c.Role == bpf.AgentEndpointRoleTKRoleUnknown {
316+
reqSteamMessageType = protocol.Unknown
317+
}
318+
respSteamMessageType := protocol.Response
319+
if c.Role == bpf.AgentEndpointRoleTKRoleUnknown {
320+
respSteamMessageType = protocol.Unknown
321+
}
322+
c.parseStreamBuffer(c.reqStreamBuffer, reqSteamMessageType, &c.ReqQueue, event.SyscallEvent.Ke.Step)
323+
c.parseStreamBuffer(c.respStreamBuffer, respSteamMessageType, &c.RespQueue, event.SyscallEvent.Ke.Step)
317324
c.StreamEvents.AddSyscallEvent(event)
318325

319326
parser := c.GetProtocolParser(c.Protocol)

agent/protocol/redis..go

+15-5
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ func (r *RedisStreamParser) ParseStream(streamBuffer *buffer.StreamBuffer, messa
557557
seq := streamBuffer.Head().LeftBoundary()
558558
ts, ok := streamBuffer.FindTimestampBySeq(seq)
559559
decoder := NewBinaryDecoder(head)
560-
redisMessage, err := ParseMessage(decoder, ts, seq)
560+
parsedMessage, err := ParseMessage(decoder, ts, seq)
561561
result := ParseResult{}
562562
if err != nil {
563563
if errors.Is(err, NotFound) || errors.Is(err, ResourceNotAvailble) {
@@ -572,10 +572,20 @@ func (r *RedisStreamParser) ParseStream(streamBuffer *buffer.StreamBuffer, messa
572572
result.ParseState = Success
573573
}
574574

575-
// redisMessage.(*RedisMessage).isReq = messageType == Request
576-
redisMessage.(*RedisMessage).seq = seq
577-
result.ReadBytes = redisMessage.ByteSize()
578-
result.ParsedMessages = []ParsedMessage{redisMessage}
575+
redisMessage := parsedMessage.(*RedisMessage)
576+
if messageType != Unknown {
577+
redisMessage.isReq = messageType == Request
578+
} else if redisMessage.isReq {
579+
// first byte is `kArrayMarker`, but not sure is a request, guess it only
580+
if redisMessage.command == "" {
581+
redisMessage.isReq = false
582+
} else {
583+
redisMessage.isReq = true
584+
}
585+
}
586+
redisMessage.seq = seq
587+
result.ReadBytes = parsedMessage.ByteSize()
588+
result.ParsedMessages = []ParsedMessage{parsedMessage}
579589
}
580590

581591
return result

0 commit comments

Comments
 (0)