Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add string renderer #277

Merged
merged 2 commits into from
Jan 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions producer/proto/messages.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package protoproducer

import (
"bytes"
"encoding/hex"
"fmt"
"hash"
"hash/fnv"
Expand Down Expand Up @@ -121,7 +120,8 @@ func (m *ProtoProducerMessage) mapUnknown() map[string]interface{} {
value = v
} else if dataType == protowire.BytesType {
v, _ := protowire.ConsumeString(data)
value = hex.EncodeToString([]byte(v))
//value = hex.EncodeToString([]byte(v)) // removed, this conversion is left to the renderer
value = []byte(v)
} else {
continue
}
Expand Down
67 changes: 67 additions & 0 deletions producer/proto/messages_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package protoproducer

import (
"testing"

"google.golang.org/protobuf/encoding/protowire"

"github.com/stretchr/testify/assert"
)

func TestMarshalJSON(t *testing.T) {
var m ProtoProducerMessage

m.formatter = &FormatterConfigMapper{
fields: []string{"Etype", "test1", "test2", "test3"},
rename: map[string]string{
"Etype": "etype",
},
numToPb: map[int32]ProtobufFormatterConfig{
100: ProtobufFormatterConfig{
Name: "test1",
Index: 100,
Type: "varint",
Array: false,
},
101: ProtobufFormatterConfig{
Name: "test2",
Index: 101,
Type: "string",
Array: false,
},
102: ProtobufFormatterConfig{
Name: "test3",
Index: 102,
Type: "bytes",
Array: false,
},
},
render: map[string]RenderFunc{
"Etype": EtypeRenderer,
"test1": EtypeRenderer,
"test2": NilRenderer,
"test3": StringRenderer,
},
}

m.FlowMessage.Etype = 0x86dd

fmr := m.FlowMessage.ProtoReflect()
unk := fmr.GetUnknown()

unk = protowire.AppendTag(unk, protowire.Number(100), protowire.VarintType)
unk = protowire.AppendVarint(unk, 0x86dd)

unk = protowire.AppendTag(unk, protowire.Number(101), protowire.BytesType)
unk = protowire.AppendString(unk, string("testing"))

unk = protowire.AppendTag(unk, protowire.Number(102), protowire.BytesType)
unk = protowire.AppendString(unk, string([]byte{0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67}))

fmr.SetUnknown(unk)

out, err := m.MarshalJSON()
assert.Nil(t, err)
t.Log(string(out))
assert.Equal(t, "{\"etype\":\"IPv6\",\"test1\":\"IPv6\",\"test2\":\"74657374696e67\",\"test3\":\"testing\"}", string(out))
}
15 changes: 15 additions & 0 deletions producer/proto/render.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ const (
RendererNetwork RendererID = "network"
RendererDateTime RendererID = "datetime"
RendererDateTimeNano RendererID = "datetimenano"
RendererString RendererID = "string"
)

var (
Expand All @@ -33,6 +34,7 @@ var (
RendererProto: ProtoRenderer,
RendererDateTime: DateTimeRenderer,
RendererDateTimeNano: DateTimeNanoRenderer,
RendererString: StringRenderer,
}

defaultRenderers = map[string]RenderFunc{
Expand Down Expand Up @@ -95,6 +97,15 @@ func NilRenderer(msg *ProtoProducerMessage, fieldName string, data interface{})
return data
}

func StringRenderer(msg *ProtoProducerMessage, fieldName string, data interface{}) interface{} {
if dataC, ok := data.([]byte); ok {
return string(dataC)
} else if dataC, ok := data.(string); ok {
return string(dataC)
} // maybe should support uint64?
return NilRenderer(msg, fieldName, data)
}

func DateTimeRenderer(msg *ProtoProducerMessage, fieldName string, data interface{}) interface{} {
if dataC, ok := data.(uint64); ok {
ts := time.Unix(int64(dataC), 0).UTC()
Expand Down Expand Up @@ -151,13 +162,17 @@ func IPRenderer(msg *ProtoProducerMessage, fieldName string, data interface{}) i
func EtypeRenderer(msg *ProtoProducerMessage, fieldName string, data interface{}) interface{} {
if dataC, ok := data.(uint32); ok {
return etypeName[dataC]
} else if dataC, ok := data.(uint64); ok { // supports protobuf mapped fields
return etypeName[uint32(dataC)]
}
return "unknown"
}

func ProtoRenderer(msg *ProtoProducerMessage, fieldName string, data interface{}) interface{} {
if dataC, ok := data.(uint32); ok {
return protoName[dataC]
} else if dataC, ok := data.(uint64); ok {
return protoName[uint32(dataC)]
}
return "unknown"
}
Expand Down
Loading