Skip to content
This repository has been archived by the owner on Oct 17, 2018. It is now read-only.

Commit

Permalink
Consolidate rule models and related APIs (#185)
Browse files Browse the repository at this point in the history
  • Loading branch information
xichen2020 committed Jun 13, 2018
1 parent e11f973 commit 7f58369
Show file tree
Hide file tree
Showing 33 changed files with 900 additions and 1,895 deletions.
26 changes: 13 additions & 13 deletions matcher/ruleset_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import (
"github.com/m3db/m3metrics/matcher/cache"
"github.com/m3db/m3metrics/metric"
"github.com/m3db/m3metrics/rules"
"github.com/m3db/m3metrics/rules/models"
"github.com/m3db/m3metrics/rules/view"

"github.com/stretchr/testify/require"
)
Expand Down Expand Up @@ -257,18 +257,18 @@ type mockRuleSet struct {
matcher *mockMatcher
}

func (r *mockRuleSet) Namespace() []byte { return []byte(r.namespace) }
func (r *mockRuleSet) Version() int { return r.version }
func (r *mockRuleSet) CutoverNanos() int64 { return r.cutoverNanos }
func (r *mockRuleSet) LastUpdatedAtNanos() int64 { return 0 }
func (r *mockRuleSet) CreatedAtNanos() int64 { return 0 }
func (r *mockRuleSet) Tombstoned() bool { return r.tombstoned }
func (r *mockRuleSet) Proto() (*rulepb.RuleSet, error) { return nil, nil }
func (r *mockRuleSet) ActiveSet(timeNanos int64) rules.Matcher { return r.matcher }
func (r *mockRuleSet) ToMutableRuleSet() rules.MutableRuleSet { return nil }
func (r *mockRuleSet) MappingRules() (models.MappingRuleViews, error) { return nil, nil }
func (r *mockRuleSet) RollupRules() (models.RollupRuleViews, error) { return nil, nil }
func (r *mockRuleSet) Latest() (*models.RuleSetSnapshotView, error) { return nil, nil }
func (r *mockRuleSet) Namespace() []byte { return []byte(r.namespace) }
func (r *mockRuleSet) Version() int { return r.version }
func (r *mockRuleSet) CutoverNanos() int64 { return r.cutoverNanos }
func (r *mockRuleSet) LastUpdatedAtNanos() int64 { return 0 }
func (r *mockRuleSet) CreatedAtNanos() int64 { return 0 }
func (r *mockRuleSet) Tombstoned() bool { return r.tombstoned }
func (r *mockRuleSet) Proto() (*rulepb.RuleSet, error) { return nil, nil }
func (r *mockRuleSet) ActiveSet(timeNanos int64) rules.Matcher { return r.matcher }
func (r *mockRuleSet) ToMutableRuleSet() rules.MutableRuleSet { return nil }
func (r *mockRuleSet) MappingRules() (view.MappingRules, error) { return nil, nil }
func (r *mockRuleSet) RollupRules() (view.RollupRules, error) { return nil, nil }
func (r *mockRuleSet) Latest() (view.RuleSet, error) { return view.RuleSet{}, nil }

func testRuleSet() (kv.Store, cache.Cache, *ruleSet) {
store := mem.NewStore()
Expand Down
35 changes: 20 additions & 15 deletions rules/mapping.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,22 @@ package rules
import (
"errors"
"fmt"
"time"

"github.com/m3db/m3metrics/aggregation"
merrors "github.com/m3db/m3metrics/errors"
"github.com/m3db/m3metrics/filters"
"github.com/m3db/m3metrics/generated/proto/rulepb"
"github.com/m3db/m3metrics/policy"
"github.com/m3db/m3metrics/rules/models"
"github.com/m3db/m3metrics/rules/view"

"github.com/pborman/uuid"
)

const (
nanosPerMilli = int64(time.Millisecond / time.Nanosecond)
)

var (
errNoStoragePoliciesInMappingRuleSnapshot = errors.New("no storage policies in mapping rule snapshot")
errMappingRuleSnapshotIndexOutOfRange = errors.New("mapping rule snapshot index out of range")
Expand Down Expand Up @@ -378,9 +383,9 @@ func (mc *mappingRule) activeIndex(timeNanos int64) int {
return idx
}

func (mc *mappingRule) history() ([]*models.MappingRuleView, error) {
func (mc *mappingRule) history() ([]view.MappingRule, error) {
lastIdx := len(mc.snapshots) - 1
views := make([]*models.MappingRuleView, len(mc.snapshots))
views := make([]view.MappingRule, len(mc.snapshots))
// Snapshots are stored oldest -> newest. History should start with newest.
for i := 0; i < len(mc.snapshots); i++ {
mrs, err := mc.mappingRuleView(lastIdx - i)
Expand All @@ -392,21 +397,21 @@ func (mc *mappingRule) history() ([]*models.MappingRuleView, error) {
return views, nil
}

func (mc *mappingRule) mappingRuleView(snapshotIdx int) (*models.MappingRuleView, error) {
func (mc *mappingRule) mappingRuleView(snapshotIdx int) (view.MappingRule, error) {
if snapshotIdx < 0 || snapshotIdx >= len(mc.snapshots) {
return nil, errMappingRuleSnapshotIndexOutOfRange
return view.MappingRule{}, errMappingRuleSnapshotIndexOutOfRange
}

mrs := mc.snapshots[snapshotIdx].clone()
return &models.MappingRuleView{
ID: mc.uuid,
Name: mrs.name,
Tombstoned: mrs.tombstoned,
CutoverNanos: mrs.cutoverNanos,
Filter: mrs.rawFilter,
AggregationID: mrs.aggregationID,
StoragePolicies: mrs.storagePolicies,
LastUpdatedAtNanos: mrs.lastUpdatedAtNanos,
LastUpdatedBy: mrs.lastUpdatedBy,
return view.MappingRule{
ID: mc.uuid,
Name: mrs.name,
Tombstoned: mrs.tombstoned,
CutoverMillis: mrs.cutoverNanos / nanosPerMilli,
Filter: mrs.rawFilter,
AggregationID: mrs.aggregationID,
StoragePolicies: mrs.storagePolicies,
LastUpdatedBy: mrs.lastUpdatedBy,
LastUpdatedAtMillis: mrs.lastUpdatedAtNanos / nanosPerMilli,
}, nil
}
81 changes: 40 additions & 41 deletions rules/mapping_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import (
"github.com/m3db/m3metrics/generated/proto/policypb"
"github.com/m3db/m3metrics/generated/proto/rulepb"
"github.com/m3db/m3metrics/policy"
"github.com/m3db/m3metrics/rules/models"
"github.com/m3db/m3metrics/rules/view"
xtime "github.com/m3db/m3x/time"

"github.com/google/go-cmp/cmp"
Expand All @@ -44,7 +44,7 @@ var (
testMappingRuleSnapshot1V1Proto = &rulepb.MappingRuleSnapshot{
Name: "foo",
Tombstoned: false,
CutoverNanos: 12345,
CutoverNanos: 12345000000,
Filter: "tag1:value1 tag2:value2",
Policies: []*policypb.Policy{
&policypb.Policy{
Expand All @@ -59,13 +59,13 @@ var (
},
},
},
LastUpdatedAtNanos: 12345,
LastUpdatedAtNanos: 12345000000,
LastUpdatedBy: "someone",
}
testMappingRuleSnapshot2V1Proto = &rulepb.MappingRuleSnapshot{
Name: "bar",
Tombstoned: true,
CutoverNanos: 67890,
CutoverNanos: 67890000000,
Filter: "tag3:value3 tag4:value4",
Policies: []*policypb.Policy{
&policypb.Policy{
Expand Down Expand Up @@ -97,15 +97,15 @@ var (
},
},
},
LastUpdatedAtNanos: 67890,
LastUpdatedAtNanos: 67890000000,
LastUpdatedBy: "someone-else",
}
testMappingRuleSnapshot3V2Proto = &rulepb.MappingRuleSnapshot{
Name: "foo",
Tombstoned: false,
CutoverNanos: 12345,
CutoverNanos: 12345000000,
Filter: "tag1:value1 tag2:value2",
LastUpdatedAtNanos: 12345,
LastUpdatedAtNanos: 12345000000,
LastUpdatedBy: "someone",
StoragePolicies: []*policypb.StoragePolicy{
&policypb.StoragePolicy{
Expand Down Expand Up @@ -140,9 +140,9 @@ var (
testMappingRuleSnapshot4V2Proto = &rulepb.MappingRuleSnapshot{
Name: "bar",
Tombstoned: true,
CutoverNanos: 67890,
CutoverNanos: 67890000000,
Filter: "tag3:value3 tag4:value4",
LastUpdatedAtNanos: 67890,
LastUpdatedAtNanos: 67890000000,
LastUpdatedBy: "someone-else",
AggregationTypes: []aggregationpb.AggregationType{
aggregationpb.AggregationType_MIN,
Expand Down Expand Up @@ -177,52 +177,52 @@ var (
testMappingRuleSnapshot1 = &mappingRuleSnapshot{
name: "foo",
tombstoned: false,
cutoverNanos: 12345,
cutoverNanos: 12345000000,
rawFilter: "tag1:value1 tag2:value2",
aggregationID: aggregation.DefaultID,
storagePolicies: policy.StoragePolicies{
policy.NewStoragePolicy(10*time.Second, xtime.Second, 24*time.Hour),
},
lastUpdatedAtNanos: 12345,
lastUpdatedAtNanos: 12345000000,
lastUpdatedBy: "someone",
}
testMappingRuleSnapshot2 = &mappingRuleSnapshot{
name: "bar",
tombstoned: true,
cutoverNanos: 67890,
cutoverNanos: 67890000000,
rawFilter: "tag3:value3 tag4:value4",
aggregationID: aggregation.MustCompressTypes(aggregation.Mean),
storagePolicies: policy.StoragePolicies{
policy.NewStoragePolicy(time.Minute, xtime.Minute, 24*time.Hour),
policy.NewStoragePolicy(5*time.Minute, xtime.Minute, 48*time.Hour),
},
lastUpdatedAtNanos: 67890,
lastUpdatedAtNanos: 67890000000,
lastUpdatedBy: "someone-else",
}
testMappingRuleSnapshot3 = &mappingRuleSnapshot{
name: "foo",
tombstoned: false,
cutoverNanos: 12345,
cutoverNanos: 12345000000,
rawFilter: "tag1:value1 tag2:value2",
aggregationID: aggregation.DefaultID,
storagePolicies: policy.StoragePolicies{
policy.NewStoragePolicy(10*time.Second, xtime.Second, 24*time.Hour),
policy.NewStoragePolicy(time.Minute, xtime.Minute, 720*time.Hour),
policy.NewStoragePolicy(time.Hour, xtime.Hour, 365*24*time.Hour),
},
lastUpdatedAtNanos: 12345,
lastUpdatedAtNanos: 12345000000,
lastUpdatedBy: "someone",
}
testMappingRuleSnapshot4 = &mappingRuleSnapshot{
name: "bar",
tombstoned: true,
cutoverNanos: 67890,
cutoverNanos: 67890000000,
rawFilter: "tag3:value3 tag4:value4",
aggregationID: aggregation.MustCompressTypes(aggregation.Min, aggregation.Max),
storagePolicies: policy.StoragePolicies{
policy.NewStoragePolicy(10*time.Minute, xtime.Minute, 1800*time.Hour),
},
lastUpdatedAtNanos: 67890,
lastUpdatedAtNanos: 67890000000,
lastUpdatedBy: "someone-else",
}
testMappingRule1 = &mappingRule{
Expand Down Expand Up @@ -317,9 +317,9 @@ func TestNewMappingRuleSnapshotFromProtoTombstoned(t *testing.T) {
input := &rulepb.MappingRuleSnapshot{
Name: "foo",
Tombstoned: true,
CutoverNanos: 12345,
CutoverNanos: 12345000000,
Filter: "tag1:value1 tag2:value2",
LastUpdatedAtNanos: 12345,
LastUpdatedAtNanos: 12345000000,
LastUpdatedBy: "someone",
}
res, err := newMappingRuleSnapshotFromProto(input, filterOpts)
Expand All @@ -328,10 +328,10 @@ func TestNewMappingRuleSnapshotFromProtoTombstoned(t *testing.T) {
expected := &mappingRuleSnapshot{
name: "foo",
tombstoned: true,
cutoverNanos: 12345,
cutoverNanos: 12345000000,
rawFilter: "tag1:value1 tag2:value2",
aggregationID: aggregation.DefaultID,
lastUpdatedAtNanos: 12345,
lastUpdatedAtNanos: 12345000000,
lastUpdatedBy: "someone",
}
require.True(t, cmp.Equal(expected, res, testMappingRuleSnapshotCmpOpts...))
Expand Down Expand Up @@ -369,7 +369,7 @@ func TestNewMappingRuleSnapshotFromFieldsValidationError(t *testing.T) {
for _, f := range badFilters {
_, err := newMappingRuleSnapshotFromFields(
"bar",
12345,
12345000000,
nil,
f,
aggregation.DefaultID,
Expand Down Expand Up @@ -458,7 +458,7 @@ func TestMappingRuleActiveSnapshotNotFound(t *testing.T) {
}

func TestMappingRuleActiveSnapshotFound(t *testing.T) {
require.Equal(t, testMappingRule2.snapshots[1], testMappingRule2.activeSnapshot(100000))
require.Equal(t, testMappingRule2.snapshots[1], testMappingRule2.activeSnapshot(100000000000))
}

func TestMappingRuleActiveRuleNotFound(t *testing.T) {
Expand All @@ -470,7 +470,7 @@ func TestMappingRuleActiveRuleFound(t *testing.T) {
uuid: testMappingRule2.uuid,
snapshots: testMappingRule2.snapshots[1:],
}
require.Equal(t, expected, testMappingRule2.activeRule(100000))
require.Equal(t, expected, testMappingRule2.activeRule(100000000000))
}

func TestMappingNameNoSnapshot(t *testing.T) {
Expand Down Expand Up @@ -505,7 +505,7 @@ func TestMappingRuleMarkTombstoned(t *testing.T) {
require.NoError(t, err)

meta := UpdateMetadata{
cutoverNanos: 67890,
cutoverNanos: 67890000000,
updatedAtNanos: 10000,
updatedBy: "john",
}
Expand All @@ -516,7 +516,7 @@ func TestMappingRuleMarkTombstoned(t *testing.T) {
expected := &mappingRuleSnapshot{
name: "foo",
tombstoned: true,
cutoverNanos: 67890,
cutoverNanos: 67890000000,
rawFilter: "tag1:value1 tag2:value2",
lastUpdatedAtNanos: 10000,
lastUpdatedBy: "john",
Expand All @@ -539,63 +539,62 @@ func TestMappingRuleMappingRuleView(t *testing.T) {
res, err := testMappingRule2.mappingRuleView(1)
require.NoError(t, err)

expected := &models.MappingRuleView{
expected := view.MappingRule{
ID: "12669817-13ae-40e6-ba2f-33087b262c68",
Name: "bar",
Tombstoned: true,
CutoverNanos: 67890,
CutoverMillis: 67890,
Filter: "tag3:value3 tag4:value4",
AggregationID: aggregation.MustCompressTypes(aggregation.Min, aggregation.Max),
StoragePolicies: policy.StoragePolicies{
policy.NewStoragePolicy(10*time.Minute, xtime.Minute, 1800*time.Hour),
},
LastUpdatedAtNanos: 67890,
LastUpdatedBy: "someone-else",
LastUpdatedAtMillis: 67890,
LastUpdatedBy: "someone-else",
}
require.Equal(t, expected, res)
}

func TestNewMappingRuleViewError(t *testing.T) {
badIndices := []int{-2, 2, 30}
for _, i := range badIndices {
res, err := testMappingRule2.mappingRuleView(i)
_, err := testMappingRule2.mappingRuleView(i)
require.Equal(t, errMappingRuleSnapshotIndexOutOfRange, err)
require.Nil(t, res)
}
}

func TestNewMappingRuleHistory(t *testing.T) {
history, err := testMappingRule2.history()
require.NoError(t, err)

expected := []*models.MappingRuleView{
&models.MappingRuleView{
expected := []view.MappingRule{
{
ID: "12669817-13ae-40e6-ba2f-33087b262c68",
Name: "bar",
Tombstoned: true,
CutoverNanos: 67890,
CutoverMillis: 67890,
Filter: "tag3:value3 tag4:value4",
AggregationID: aggregation.MustCompressTypes(aggregation.Min, aggregation.Max),
StoragePolicies: policy.StoragePolicies{
policy.NewStoragePolicy(10*time.Minute, xtime.Minute, 1800*time.Hour),
},
LastUpdatedAtNanos: 67890,
LastUpdatedBy: "someone-else",
LastUpdatedAtMillis: 67890,
LastUpdatedBy: "someone-else",
},
&models.MappingRuleView{
{
ID: "12669817-13ae-40e6-ba2f-33087b262c68",
Name: "foo",
Tombstoned: false,
CutoverNanos: 12345,
CutoverMillis: 12345,
Filter: "tag1:value1 tag2:value2",
AggregationID: aggregation.DefaultID,
StoragePolicies: policy.StoragePolicies{
policy.NewStoragePolicy(10*time.Second, xtime.Second, 24*time.Hour),
policy.NewStoragePolicy(time.Minute, xtime.Minute, 720*time.Hour),
policy.NewStoragePolicy(time.Hour, xtime.Hour, 365*24*time.Hour),
},
LastUpdatedAtNanos: 12345,
LastUpdatedBy: "someone",
LastUpdatedAtMillis: 12345,
LastUpdatedBy: "someone",
},
}
require.Equal(t, expected, history)
Expand Down
Loading

0 comments on commit 7f58369

Please sign in to comment.