youtubebeat/vendor/github.com/elastic/beats/metricbeat/mb/event_test.go

247 lines
5.6 KiB
Go

// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. licenses this file to you under
// the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
// +build !integration
package mb
import (
"errors"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/elastic/beats/libbeat/common"
)
func TestEventConversionToBeatEvent(t *testing.T) {
var (
timestamp = time.Now()
module = "docker"
metricSet = "uptime"
)
t.Run("all levels", func(t *testing.T) {
e := (&Event{
Timestamp: timestamp,
RootFields: common.MapStr{
"type": "docker",
},
ModuleFields: common.MapStr{
"container": common.MapStr{
"name": "wordpress",
},
},
MetricSetFields: common.MapStr{
"ms": 1000,
},
}).BeatEvent(module, metricSet)
assert.Equal(t, timestamp, e.Timestamp)
assert.Equal(t, common.MapStr{
"type": "docker",
"docker": common.MapStr{
"container": common.MapStr{
"name": "wordpress",
},
"uptime": common.MapStr{
"ms": 1000,
},
},
}, e.Fields)
})
t.Run("idempotent", func(t *testing.T) {
mbEvent := &Event{
Timestamp: timestamp,
RootFields: common.MapStr{
"type": "docker",
},
ModuleFields: common.MapStr{
"container": common.MapStr{
"name": "wordpress",
},
},
MetricSetFields: common.MapStr{
"ms": 1000,
},
}
e := mbEvent.BeatEvent(module, metricSet)
e = mbEvent.BeatEvent(module, metricSet)
assert.Equal(t, timestamp, e.Timestamp)
assert.Equal(t, common.MapStr{
"type": "docker",
"docker": common.MapStr{
"container": common.MapStr{
"name": "wordpress",
},
"uptime": common.MapStr{
"ms": 1000,
},
},
}, e.Fields)
})
t.Run("with event modifiers", func(t *testing.T) {
modifier := func(m, ms string, e *Event) {
e.RootFields.Put("module", m)
e.RootFields.Put("metricset", ms)
}
e := (&Event{}).BeatEvent(module, metricSet, modifier)
assert.Equal(t, common.MapStr{
"module": module,
"metricset": metricSet,
}, e.Fields)
})
t.Run("with ID", func(t *testing.T) {
mbEvent := &Event{
ID: "foobar",
Timestamp: timestamp,
RootFields: common.MapStr{
"type": "docker",
},
ModuleFields: common.MapStr{
"container": common.MapStr{
"name": "wordpress",
},
},
MetricSetFields: common.MapStr{
"ms": 1000,
},
}
e := mbEvent.BeatEvent(module, metricSet)
e = mbEvent.BeatEvent(module, metricSet)
assert.Equal(t, "foobar", e.Meta["id"])
assert.Equal(t, timestamp, e.Timestamp)
assert.Equal(t, common.MapStr{
"type": "docker",
"docker": common.MapStr{
"container": common.MapStr{
"name": "wordpress",
},
"uptime": common.MapStr{
"ms": 1000,
},
},
}, e.Fields)
})
t.Run("error message", func(t *testing.T) {
msg := "something failed"
e := (&Event{
Error: errors.New(msg),
}).BeatEvent(module, metricSet)
errorMessage, err := e.Fields.GetValue("error.message")
if err != nil {
t.Fatal(err)
}
assert.Equal(t, msg, errorMessage)
})
}
func TestAddMetricSetInfo(t *testing.T) {
const (
host = "localhost"
elapsed = time.Duration(500 * time.Millisecond)
)
t.Run("all fields", func(t *testing.T) {
e := Event{
Host: host,
Took: elapsed,
}
AddMetricSetInfo(moduleName, metricSetName, &e)
assert.Equal(t, common.MapStr{
"metricset": common.MapStr{
"host": host,
"module": moduleName,
"name": metricSetName,
"rtt": time.Duration(500000),
},
}, e.RootFields)
})
t.Run("no optional fields", func(t *testing.T) {
e := Event{}
AddMetricSetInfo(moduleName, metricSetName, &e)
assert.Equal(t, common.MapStr{
"metricset": common.MapStr{
"module": moduleName,
"name": metricSetName,
},
}, e.RootFields)
})
}
func TestTransformMapStrToEvent(t *testing.T) {
var (
timestamp = time.Now()
took = time.Duration(1)
moduleData = common.MapStr{
"container_id": "busybox",
}
metricSetData = common.MapStr{
"uptime": "1 day",
}
failure = errors.New("failed")
)
m := common.MapStr{
TimestampKey: timestamp,
RTTKey: took,
ModuleDataKey: moduleData,
}
m.DeepUpdate(metricSetData)
t.Run("normal", func(t *testing.T) {
m := m.Clone()
e := TransformMapStrToEvent("module", m, failure)
assert.Equal(t, timestamp, e.Timestamp)
assert.Equal(t, took, e.Took)
assert.Empty(t, e.RootFields)
assert.Equal(t, moduleData, e.ModuleFields)
assert.Equal(t, metricSetData, e.MetricSetFields)
assert.Equal(t, failure, e.Error)
})
t.Run("namespace", func(t *testing.T) {
const namespace = "foo.bar"
mapWithNamespace := m.Clone()
mapWithNamespace.Put(NamespaceKey, namespace)
e := TransformMapStrToEvent("module", mapWithNamespace, nil)
assert.Equal(t, timestamp, e.Timestamp)
assert.Equal(t, took, e.Took)
assert.Empty(t, e.RootFields)
assert.Equal(t, moduleData, e.ModuleFields)
assert.Equal(t, "module."+namespace, e.Namespace)
assert.Equal(t, metricSetData, e.MetricSetFields)
})
}