diff --git a/ebpftracer/l7/l7_test.go b/ebpftracer/l7/l7_test.go index 13890ae..6183e6c 100644 --- a/ebpftracer/l7/l7_test.go +++ b/ebpftracer/l7/l7_test.go @@ -27,6 +27,14 @@ func Test_parseMemcached(t *testing.T) { cmd, items = ParseMemcached(append([]byte(`gets 1111 2222 3333`), '\r', '\n')) assert.Equal(t, "gets", cmd) assert.Equal(t, []string{"1111", "2222", "3333"}, items) + + cmd, items = ParseMemcached(append([]byte(`delete 1111`), '\r', '\n')) + assert.Equal(t, "delete", cmd) + assert.Equal(t, []string{"1111"}, items) + + cmd, items = ParseMemcached(append([]byte(`delete 1111 noreply`), '\r', '\n')) + assert.Equal(t, "delete", cmd) + assert.Equal(t, []string{"1111"}, items) } func TestParseRedis(t *testing.T) { diff --git a/ebpftracer/l7/memcached.go b/ebpftracer/l7/memcached.go index 4e346a3..24bcb1d 100644 --- a/ebpftracer/l7/memcached.go +++ b/ebpftracer/l7/memcached.go @@ -18,7 +18,11 @@ func ParseMemcached(payload []byte) (string, []string) { command := string(cmd) switch command { case "set", "add", "cas", "append", "prepend", "replace", "delete", "incr", "decr", "touch": - if key, _, ok := bytes.Cut(rest, space); ok { + key, _, ok := bytes.Cut(rest, space) + if !ok { + key, _, ok = bytes.Cut(rest, crlf) // e.g., "delete \r\n" + } + if ok { return command, []string{string(key)} } case "gat", "gats":