Support configuring a default timezone in JSON parser (#5472)
This commit is contained in:
committed by
Daniel Nelson
parent
eb794ec30f
commit
1886676e14
@@ -1362,6 +1362,14 @@ func getParserConfig(name string, tbl *ast.Table) (*parsers.Config, error) {
|
||||
}
|
||||
}
|
||||
|
||||
if node, ok := tbl.Fields["json_timezone"]; ok {
|
||||
if kv, ok := node.(*ast.KeyValue); ok {
|
||||
if str, ok := kv.Value.(*ast.String); ok {
|
||||
c.JSONTimezone = str.Value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if node, ok := tbl.Fields["data_type"]; ok {
|
||||
if kv, ok := node.(*ast.KeyValue); ok {
|
||||
if str, ok := kv.Value.(*ast.String); ok {
|
||||
@@ -1637,6 +1645,7 @@ func getParserConfig(name string, tbl *ast.Table) (*parsers.Config, error) {
|
||||
delete(tbl.Fields, "json_string_fields")
|
||||
delete(tbl.Fields, "json_time_format")
|
||||
delete(tbl.Fields, "json_time_key")
|
||||
delete(tbl.Fields, "json_timezone")
|
||||
delete(tbl.Fields, "data_type")
|
||||
delete(tbl.Fields, "collectd_auth_file")
|
||||
delete(tbl.Fields, "collectd_security_level")
|
||||
|
||||
@@ -333,13 +333,18 @@ func CompressWithGzip(data io.Reader) (io.Reader, error) {
|
||||
return pipeReader, err
|
||||
}
|
||||
|
||||
// ParseTimestamp with no location provided parses a timestamp value as UTC
|
||||
func ParseTimestamp(timestamp interface{}, format string) (time.Time, error) {
|
||||
return ParseTimestampWithLocation(timestamp, format, "UTC")
|
||||
}
|
||||
|
||||
// ParseTimestamp parses a timestamp value as a unix epoch of various precision.
|
||||
//
|
||||
// format = "unix": epoch is assumed to be in seconds and can come as number or string. Can have a decimal part.
|
||||
// format = "unix_ms": epoch is assumed to be in milliseconds and can come as number or string. Cannot have a decimal part.
|
||||
// format = "unix_us": epoch is assumed to be in microseconds and can come as number or string. Cannot have a decimal part.
|
||||
// format = "unix_ns": epoch is assumed to be in nanoseconds and can come as number or string. Cannot have a decimal part.
|
||||
func ParseTimestamp(timestamp interface{}, format string) (time.Time, error) {
|
||||
func ParseTimestampWithLocation(timestamp interface{}, format string, location string) (time.Time, error) {
|
||||
timeInt, timeFractional := int64(0), int64(0)
|
||||
timeEpochStr, ok := timestamp.(string)
|
||||
var err error
|
||||
@@ -355,7 +360,11 @@ func ParseTimestamp(timestamp interface{}, format string) (time.Time, error) {
|
||||
splitted := regexp.MustCompile("[.,]").Split(timeEpochStr, 2)
|
||||
timeInt, err = strconv.ParseInt(splitted[0], 10, 64)
|
||||
if err != nil {
|
||||
return time.Parse(format, timeEpochStr)
|
||||
loc, err := time.LoadLocation(location)
|
||||
if err != nil {
|
||||
return time.Time{}, fmt.Errorf("location: %s could not be loaded as a location", location)
|
||||
}
|
||||
return time.ParseInLocation(format, timeEpochStr, loc)
|
||||
}
|
||||
|
||||
if len(splitted) == 2 {
|
||||
|
||||
@@ -270,3 +270,34 @@ func TestAlignDuration(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseTimestamp(t *testing.T) {
|
||||
time, err := ParseTimestamp("2019-02-20 21:50:34.029665", "2006-01-02 15:04:05.000000")
|
||||
assert.Nil(t, err)
|
||||
assert.EqualValues(t, int64(1550699434029665000), time.UnixNano())
|
||||
|
||||
time, err = ParseTimestamp("2019-02-20 21:50:34.029665-04:00", "2006-01-02 15:04:05.000000-07:00")
|
||||
assert.Nil(t, err)
|
||||
assert.EqualValues(t, int64(1550713834029665000), time.UnixNano())
|
||||
|
||||
time, err = ParseTimestamp("2019-02-20 21:50:34.029665", "2006-01-02 15:04:05.000000-06:00")
|
||||
assert.NotNil(t, err)
|
||||
}
|
||||
|
||||
func TestParseTimestampWithLocation(t *testing.T) {
|
||||
time, err := ParseTimestampWithLocation("2019-02-20 21:50:34.029665", "2006-01-02 15:04:05.000000", "UTC")
|
||||
assert.Nil(t, err)
|
||||
assert.EqualValues(t, int64(1550699434029665000), time.UnixNano())
|
||||
|
||||
time, err = ParseTimestampWithLocation("2019-02-20 21:50:34.029665", "2006-01-02 15:04:05.000000", "America/New_York")
|
||||
assert.Nil(t, err)
|
||||
assert.EqualValues(t, int64(1550717434029665000), time.UnixNano())
|
||||
|
||||
//Provided location is ignored if an offset is successfully parsed
|
||||
time, err = ParseTimestampWithLocation("2019-02-20 21:50:34.029665-07:00", "2006-01-02 15:04:05.000000-07:00", "America/New_York")
|
||||
assert.Nil(t, err)
|
||||
assert.EqualValues(t, int64(1550724634029665000), time.UnixNano())
|
||||
|
||||
time, err = ParseTimestampWithLocation("2019-02-20 21:50:34.029665", "2006-01-02 15:04:05.000000", "InvalidTimeZone")
|
||||
assert.NotNil(t, err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user