1
0
mirror of https://github.com/netsampler/goflow2.git synced 2024-05-06 15:54:52 +00:00

producer: add datetime render (#225)

This commit is contained in:
Louis
2023-12-06 14:03:45 +01:00
committed by GitHub
parent 5ba02103eb
commit da044ac77a
2 changed files with 47 additions and 12 deletions

View File

@ -43,6 +43,8 @@ formatter:
- name: csum - name: csum
index: 999 index: 999
type: varint type: varint
render:
time_received_ns: datetimenano
# Decoder mappings # Decoder mappings
ipfix: ipfix:
mapping: mapping:

View File

@ -5,6 +5,7 @@ import (
"encoding/hex" "encoding/hex"
"net" "net"
"net/netip" "net/netip"
"time"
) )
type RenderFunc func(msg *ProtoProducerMessage, fieldName string, data interface{}) interface{} type RenderFunc func(msg *ProtoProducerMessage, fieldName string, data interface{}) interface{}
@ -12,22 +13,26 @@ type RenderFunc func(msg *ProtoProducerMessage, fieldName string, data interface
type RendererID string type RendererID string
const ( const (
RendererNone RendererID = "none" RendererNone RendererID = "none"
RendererIP RendererID = "ip" RendererIP RendererID = "ip"
RendererMac RendererID = "mac" RendererMac RendererID = "mac"
RendererEtype RendererID = "etype" RendererEtype RendererID = "etype"
RendererProto RendererID = "proto" RendererProto RendererID = "proto"
RendererType RendererID = "type" RendererType RendererID = "type"
RendererNetwork RendererID = "network" RendererNetwork RendererID = "network"
RendererDateTime RendererID = "datetime"
RendererDateTimeNano RendererID = "datetimenano"
) )
var ( var (
renderers = map[RendererID]RenderFunc{ renderers = map[RendererID]RenderFunc{
RendererNone: NilRenderer, RendererNone: NilRenderer,
RendererIP: IPRenderer, RendererIP: IPRenderer,
RendererMac: MacRenderer, RendererMac: MacRenderer,
RendererEtype: EtypeRenderer, RendererEtype: EtypeRenderer,
RendererProto: ProtoRenderer, RendererProto: ProtoRenderer,
RendererDateTime: DateTimeRenderer,
RendererDateTimeNano: DateTimeNanoRenderer,
} }
defaultRenderers = map[string]RenderFunc{ defaultRenderers = map[string]RenderFunc{
@ -90,6 +95,34 @@ func NilRenderer(msg *ProtoProducerMessage, fieldName string, data interface{})
return data return data
} }
func DateTimeRenderer(msg *ProtoProducerMessage, fieldName string, data interface{}) interface{} {
if dataC, ok := data.(uint64); ok {
ts := time.Unix(int64(dataC), 0).UTC()
return ts.Format(time.RFC3339Nano)
} else if dataC, ok := data.(int64); ok {
ts := time.Unix(dataC, 0).UTC()
return ts.Format(time.RFC3339Nano)
} else if dataC, ok := data.(uint32); ok {
ts := time.Unix(int64(dataC), 0).UTC()
return ts.Format(time.RFC3339Nano)
} else if dataC, ok := data.(int32); ok {
ts := time.Unix(int64(dataC), 0).UTC()
return ts.Format(time.RFC3339Nano)
}
return NilRenderer(msg, fieldName, data)
}
func DateTimeNanoRenderer(msg *ProtoProducerMessage, fieldName string, data interface{}) interface{} {
if dataC, ok := data.(uint64); ok {
ts := time.Unix(int64(dataC)/1e9, int64(dataC)%1e9).UTC()
return ts.Format(time.RFC3339Nano)
} else if dataC, ok := data.(int64); ok {
ts := time.Unix(dataC/1e9, dataC%1e9).UTC()
return ts.Format(time.RFC3339Nano)
}
return NilRenderer(msg, fieldName, data)
}
func MacRenderer(msg *ProtoProducerMessage, fieldName string, data interface{}) interface{} { func MacRenderer(msg *ProtoProducerMessage, fieldName string, data interface{}) interface{} {
if dataC, ok := data.(uint64); ok { if dataC, ok := data.(uint64); ok {
var mac [8]byte var mac [8]byte