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:
@ -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:
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user