Use add time for prometheus expiration calculation (#7056)
This commit is contained in:
@@ -12,27 +12,35 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
type Input struct {
|
||||
metric telegraf.Metric
|
||||
addtime time.Time
|
||||
}
|
||||
|
||||
func TestCollectionExpire(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
now time.Time
|
||||
age time.Duration
|
||||
metrics []telegraf.Metric
|
||||
input []Input
|
||||
expected []*dto.MetricFamily
|
||||
}{
|
||||
{
|
||||
name: "not expired",
|
||||
now: time.Unix(1, 0),
|
||||
age: 10 * time.Second,
|
||||
metrics: []telegraf.Metric{
|
||||
testutil.MustMetric(
|
||||
"cpu",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"time_idle": 42.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
),
|
||||
input: []Input{
|
||||
{
|
||||
metric: testutil.MustMetric(
|
||||
"cpu",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"time_idle": 42.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
),
|
||||
addtime: time.Unix(0, 0),
|
||||
},
|
||||
},
|
||||
expected: []*dto.MetricFamily{
|
||||
{
|
||||
@@ -52,23 +60,29 @@ func TestCollectionExpire(t *testing.T) {
|
||||
name: "update metric expiration",
|
||||
now: time.Unix(20, 0),
|
||||
age: 10 * time.Second,
|
||||
metrics: []telegraf.Metric{
|
||||
testutil.MustMetric(
|
||||
"cpu",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"time_idle": 42.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
),
|
||||
testutil.MustMetric(
|
||||
"cpu",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"time_idle": 43.0,
|
||||
},
|
||||
time.Unix(12, 0),
|
||||
),
|
||||
input: []Input{
|
||||
{
|
||||
metric: testutil.MustMetric(
|
||||
"cpu",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"time_idle": 42.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
),
|
||||
addtime: time.Unix(0, 0),
|
||||
},
|
||||
{
|
||||
metric: testutil.MustMetric(
|
||||
"cpu",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"time_idle": 43.0,
|
||||
},
|
||||
time.Unix(12, 0),
|
||||
),
|
||||
addtime: time.Unix(12, 0),
|
||||
},
|
||||
},
|
||||
expected: []*dto.MetricFamily{
|
||||
{
|
||||
@@ -88,23 +102,28 @@ func TestCollectionExpire(t *testing.T) {
|
||||
name: "update metric expiration descending order",
|
||||
now: time.Unix(20, 0),
|
||||
age: 10 * time.Second,
|
||||
metrics: []telegraf.Metric{
|
||||
testutil.MustMetric(
|
||||
"cpu",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"time_idle": 42.0,
|
||||
},
|
||||
time.Unix(12, 0),
|
||||
),
|
||||
testutil.MustMetric(
|
||||
"cpu",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"time_idle": 43.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
),
|
||||
input: []Input{
|
||||
{
|
||||
metric: testutil.MustMetric(
|
||||
"cpu",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"time_idle": 42.0,
|
||||
},
|
||||
time.Unix(12, 0),
|
||||
),
|
||||
addtime: time.Unix(12, 0),
|
||||
}, {
|
||||
metric: testutil.MustMetric(
|
||||
"cpu",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"time_idle": 43.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
),
|
||||
addtime: time.Unix(0, 0),
|
||||
},
|
||||
},
|
||||
expected: []*dto.MetricFamily{
|
||||
{
|
||||
@@ -124,15 +143,18 @@ func TestCollectionExpire(t *testing.T) {
|
||||
name: "expired single metric in metric family",
|
||||
now: time.Unix(20, 0),
|
||||
age: 10 * time.Second,
|
||||
metrics: []telegraf.Metric{
|
||||
testutil.MustMetric(
|
||||
"cpu",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"time_idle": 42.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
),
|
||||
input: []Input{
|
||||
{
|
||||
metric: testutil.MustMetric(
|
||||
"cpu",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"time_idle": 42.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
),
|
||||
addtime: time.Unix(0, 0),
|
||||
},
|
||||
},
|
||||
expected: []*dto.MetricFamily{},
|
||||
},
|
||||
@@ -140,23 +162,28 @@ func TestCollectionExpire(t *testing.T) {
|
||||
name: "expired one metric in metric family",
|
||||
now: time.Unix(20, 0),
|
||||
age: 10 * time.Second,
|
||||
metrics: []telegraf.Metric{
|
||||
testutil.MustMetric(
|
||||
"cpu",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"time_idle": 42.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
),
|
||||
testutil.MustMetric(
|
||||
"cpu",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"time_guest": 42.0,
|
||||
},
|
||||
time.Unix(15, 0),
|
||||
),
|
||||
input: []Input{
|
||||
{
|
||||
metric: testutil.MustMetric(
|
||||
"cpu",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"time_idle": 42.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
),
|
||||
addtime: time.Unix(0, 0),
|
||||
}, {
|
||||
metric: testutil.MustMetric(
|
||||
"cpu",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"time_guest": 42.0,
|
||||
},
|
||||
time.Unix(15, 0),
|
||||
),
|
||||
addtime: time.Unix(15, 0),
|
||||
},
|
||||
},
|
||||
expected: []*dto.MetricFamily{
|
||||
{
|
||||
@@ -176,64 +203,77 @@ func TestCollectionExpire(t *testing.T) {
|
||||
name: "histogram bucket updates",
|
||||
now: time.Unix(0, 0),
|
||||
age: 10 * time.Second,
|
||||
metrics: []telegraf.Metric{
|
||||
testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"http_request_duration_seconds_sum": 10.0,
|
||||
"http_request_duration_seconds_count": 2,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Histogram,
|
||||
),
|
||||
testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{"le": "0.05"},
|
||||
map[string]interface{}{
|
||||
"http_request_duration_seconds_bucket": 1.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Histogram,
|
||||
),
|
||||
testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{"le": "+Inf"},
|
||||
map[string]interface{}{
|
||||
"http_request_duration_seconds_bucket": 1.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Histogram,
|
||||
),
|
||||
// Next interval
|
||||
testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"http_request_duration_seconds_sum": 20.0,
|
||||
"http_request_duration_seconds_count": 4,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Histogram,
|
||||
),
|
||||
testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{"le": "0.05"},
|
||||
map[string]interface{}{
|
||||
"http_request_duration_seconds_bucket": 2.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Histogram,
|
||||
),
|
||||
testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{"le": "+Inf"},
|
||||
map[string]interface{}{
|
||||
"http_request_duration_seconds_bucket": 2.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Histogram,
|
||||
),
|
||||
input: []Input{
|
||||
{
|
||||
metric: testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"http_request_duration_seconds_sum": 10.0,
|
||||
"http_request_duration_seconds_count": 2,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Histogram,
|
||||
),
|
||||
addtime: time.Unix(0, 0),
|
||||
}, {
|
||||
metric: testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{"le": "0.05"},
|
||||
map[string]interface{}{
|
||||
"http_request_duration_seconds_bucket": 1.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Histogram,
|
||||
),
|
||||
addtime: time.Unix(0, 0),
|
||||
}, {
|
||||
metric: testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{"le": "+Inf"},
|
||||
map[string]interface{}{
|
||||
"http_request_duration_seconds_bucket": 1.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Histogram,
|
||||
),
|
||||
addtime: time.Unix(0, 0),
|
||||
}, {
|
||||
// Next interval
|
||||
metric: testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"http_request_duration_seconds_sum": 20.0,
|
||||
"http_request_duration_seconds_count": 4,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Histogram,
|
||||
),
|
||||
addtime: time.Unix(0, 0),
|
||||
}, {
|
||||
metric: testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{"le": "0.05"},
|
||||
map[string]interface{}{
|
||||
"http_request_duration_seconds_bucket": 2.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Histogram,
|
||||
),
|
||||
addtime: time.Unix(0, 0),
|
||||
}, {
|
||||
metric: testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{"le": "+Inf"},
|
||||
map[string]interface{}{
|
||||
"http_request_duration_seconds_bucket": 2.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Histogram,
|
||||
),
|
||||
addtime: time.Unix(0, 0),
|
||||
},
|
||||
},
|
||||
expected: []*dto.MetricFamily{
|
||||
{
|
||||
@@ -266,46 +306,55 @@ func TestCollectionExpire(t *testing.T) {
|
||||
name: "summary quantile updates",
|
||||
now: time.Unix(0, 0),
|
||||
age: 10 * time.Second,
|
||||
metrics: []telegraf.Metric{
|
||||
testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"rpc_duration_seconds_sum": 1.0,
|
||||
"rpc_duration_seconds_count": 1,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Summary,
|
||||
),
|
||||
testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{"quantile": "0.01"},
|
||||
map[string]interface{}{
|
||||
"rpc_duration_seconds": 1.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Summary,
|
||||
),
|
||||
// Updated Summary
|
||||
testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"rpc_duration_seconds_sum": 2.0,
|
||||
"rpc_duration_seconds_count": 2,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Summary,
|
||||
),
|
||||
testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{"quantile": "0.01"},
|
||||
map[string]interface{}{
|
||||
"rpc_duration_seconds": 2.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Summary,
|
||||
),
|
||||
input: []Input{
|
||||
{
|
||||
metric: testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"rpc_duration_seconds_sum": 1.0,
|
||||
"rpc_duration_seconds_count": 1,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Summary,
|
||||
),
|
||||
addtime: time.Unix(0, 0),
|
||||
}, {
|
||||
metric: testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{"quantile": "0.01"},
|
||||
map[string]interface{}{
|
||||
"rpc_duration_seconds": 1.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Summary,
|
||||
),
|
||||
addtime: time.Unix(0, 0),
|
||||
}, {
|
||||
// Updated Summary
|
||||
metric: testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"rpc_duration_seconds_sum": 2.0,
|
||||
"rpc_duration_seconds_count": 2,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Summary,
|
||||
),
|
||||
addtime: time.Unix(0, 0),
|
||||
}, {
|
||||
metric: testutil.MustMetric(
|
||||
"prometheus",
|
||||
map[string]string{"quantile": "0.01"},
|
||||
map[string]interface{}{
|
||||
"rpc_duration_seconds": 2.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Summary,
|
||||
),
|
||||
addtime: time.Unix(0, 0),
|
||||
},
|
||||
},
|
||||
expected: []*dto.MetricFamily{
|
||||
{
|
||||
@@ -330,12 +379,43 @@ func TestCollectionExpire(t *testing.T) {
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "expire based on add time",
|
||||
now: time.Unix(20, 0),
|
||||
age: 10 * time.Second,
|
||||
input: []Input{
|
||||
{
|
||||
metric: testutil.MustMetric(
|
||||
"cpu",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"time_idle": 42.0,
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
),
|
||||
addtime: time.Unix(15, 0),
|
||||
},
|
||||
},
|
||||
expected: []*dto.MetricFamily{
|
||||
{
|
||||
Name: proto.String("cpu_time_idle"),
|
||||
Help: proto.String(helpString),
|
||||
Type: dto.MetricType_UNTYPED.Enum(),
|
||||
Metric: []*dto.Metric{
|
||||
{
|
||||
Label: []*dto.LabelPair{},
|
||||
Untyped: &dto.Untyped{Value: proto.Float64(42.0)},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
c := NewCollection(FormatConfig{})
|
||||
for _, metric := range tt.metrics {
|
||||
c.Add(metric)
|
||||
for _, item := range tt.input {
|
||||
c.Add(item.metric, item.addtime)
|
||||
}
|
||||
c.Expire(tt.now, tt.age)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user