mirror of
https://github.com/openobserve/goflow2.git
synced 2025-10-23 07:11:57 +00:00
feat: add string renderer (#277)
This commit is contained in:
@@ -2,7 +2,6 @@ package protoproducer
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/hex"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"hash"
|
"hash"
|
||||||
"hash/fnv"
|
"hash/fnv"
|
||||||
@@ -121,7 +120,8 @@ func (m *ProtoProducerMessage) mapUnknown() map[string]interface{} {
|
|||||||
value = v
|
value = v
|
||||||
} else if dataType == protowire.BytesType {
|
} else if dataType == protowire.BytesType {
|
||||||
v, _ := protowire.ConsumeString(data)
|
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 {
|
} else {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
67
producer/proto/messages_test.go
Normal file
67
producer/proto/messages_test.go
Normal file
@@ -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))
|
||||||
|
}
|
@@ -22,6 +22,7 @@ const (
|
|||||||
RendererNetwork RendererID = "network"
|
RendererNetwork RendererID = "network"
|
||||||
RendererDateTime RendererID = "datetime"
|
RendererDateTime RendererID = "datetime"
|
||||||
RendererDateTimeNano RendererID = "datetimenano"
|
RendererDateTimeNano RendererID = "datetimenano"
|
||||||
|
RendererString RendererID = "string"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -33,6 +34,7 @@ var (
|
|||||||
RendererProto: ProtoRenderer,
|
RendererProto: ProtoRenderer,
|
||||||
RendererDateTime: DateTimeRenderer,
|
RendererDateTime: DateTimeRenderer,
|
||||||
RendererDateTimeNano: DateTimeNanoRenderer,
|
RendererDateTimeNano: DateTimeNanoRenderer,
|
||||||
|
RendererString: StringRenderer,
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultRenderers = map[string]RenderFunc{
|
defaultRenderers = map[string]RenderFunc{
|
||||||
@@ -95,6 +97,15 @@ func NilRenderer(msg *ProtoProducerMessage, fieldName string, data interface{})
|
|||||||
return data
|
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{} {
|
func DateTimeRenderer(msg *ProtoProducerMessage, fieldName string, data interface{}) interface{} {
|
||||||
if dataC, ok := data.(uint64); ok {
|
if dataC, ok := data.(uint64); ok {
|
||||||
ts := time.Unix(int64(dataC), 0).UTC()
|
ts := time.Unix(int64(dataC), 0).UTC()
|
||||||
@@ -151,6 +162,8 @@ func IPRenderer(msg *ProtoProducerMessage, fieldName string, data interface{}) i
|
|||||||
func EtypeRenderer(msg *ProtoProducerMessage, fieldName string, data interface{}) interface{} {
|
func EtypeRenderer(msg *ProtoProducerMessage, fieldName string, data interface{}) interface{} {
|
||||||
if dataC, ok := data.(uint32); ok {
|
if dataC, ok := data.(uint32); ok {
|
||||||
return etypeName[dataC]
|
return etypeName[dataC]
|
||||||
|
} else if dataC, ok := data.(uint64); ok { // supports protobuf mapped fields
|
||||||
|
return etypeName[uint32(dataC)]
|
||||||
}
|
}
|
||||||
return "unknown"
|
return "unknown"
|
||||||
}
|
}
|
||||||
@@ -158,6 +171,8 @@ func EtypeRenderer(msg *ProtoProducerMessage, fieldName string, data interface{}
|
|||||||
func ProtoRenderer(msg *ProtoProducerMessage, fieldName string, data interface{}) interface{} {
|
func ProtoRenderer(msg *ProtoProducerMessage, fieldName string, data interface{}) interface{} {
|
||||||
if dataC, ok := data.(uint32); ok {
|
if dataC, ok := data.(uint32); ok {
|
||||||
return protoName[dataC]
|
return protoName[dataC]
|
||||||
|
} else if dataC, ok := data.(uint64); ok {
|
||||||
|
return protoName[uint32(dataC)]
|
||||||
}
|
}
|
||||||
return "unknown"
|
return "unknown"
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user