This repository has been archived by the owner on Jul 31, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 327
clear min and max on every ExportView #1182
Open
marwan-at-work
wants to merge
7
commits into
census-instrumentation:master
Choose a base branch
from
marwan-at-work:cr
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
1380fae
clearRows on every ExportView
marwan-at-work 15a8df5
do not reset everything
marwan-at-work 2be56c0
reset on config
marwan-at-work 80c9ce6
Revert "reset on config"
marwan-at-work 878d62c
reset only min/max
marwan-at-work 7fae139
sort imports
marwan-at-work 92ea5dc
pr comments + add tests
marwan-at-work File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -18,6 +18,8 @@ package view | |
import ( | ||
"context" | ||
"errors" | ||
"math" | ||
"runtime/debug" | ||
"sync" | ||
"testing" | ||
"time" | ||
|
@@ -261,36 +263,107 @@ func TestReportUsage(t *testing.T) { | |
} | ||
|
||
for _, tt := range tests { | ||
restart() | ||
SetReportingPeriod(25 * time.Millisecond) | ||
t.Run(tt.name, func(t *testing.T) { | ||
restart() | ||
SetReportingPeriod(25 * time.Millisecond) | ||
|
||
if err := Register(tt.view); err != nil { | ||
t.Fatalf("%v: cannot register: %v", tt.name, err) | ||
} | ||
if err := Register(tt.view); err != nil { | ||
t.Fatalf("%v: cannot register: %v", tt.name, err) | ||
} | ||
|
||
e := &countExporter{} | ||
RegisterExporter(e) | ||
e := &countExporter{} | ||
RegisterExporter(e) | ||
defer UnregisterExporter(e) | ||
|
||
stats.Record(ctx, m.M(1)) | ||
stats.Record(ctx, m.M(1)) | ||
stats.Record(ctx, m.M(1)) | ||
stats.Record(ctx, m.M(1)) | ||
stats.Record(ctx, m.M(1)) | ||
stats.Record(ctx, m.M(1)) | ||
stats.Record(ctx, m.M(1)) | ||
stats.Record(ctx, m.M(1)) | ||
|
||
time.Sleep(50 * time.Millisecond) | ||
time.Sleep(50 * time.Millisecond) | ||
|
||
stats.Record(ctx, m.M(1)) | ||
stats.Record(ctx, m.M(1)) | ||
stats.Record(ctx, m.M(1)) | ||
stats.Record(ctx, m.M(1)) | ||
stats.Record(ctx, m.M(1)) | ||
stats.Record(ctx, m.M(1)) | ||
stats.Record(ctx, m.M(1)) | ||
stats.Record(ctx, m.M(1)) | ||
|
||
time.Sleep(50 * time.Millisecond) | ||
time.Sleep(50 * time.Millisecond) | ||
|
||
e.Lock() | ||
count := e.count | ||
e.Unlock() | ||
if got, want := count, tt.wantMaxCount; got > want { | ||
t.Errorf("%v: got count data = %v; want at most %v", tt.name, got, want) | ||
} | ||
e.Lock() | ||
count := e.count | ||
e.Unlock() | ||
if got, want := count, tt.wantMaxCount; got > want { | ||
t.Errorf("%v: got count data = %v; want at most %v", tt.name, got, want) | ||
} | ||
}) | ||
} | ||
} | ||
|
||
func TestReportUsageMinMax(t *testing.T) { | ||
ctx := context.Background() | ||
|
||
m := stats.Float64("measure", "desc", "unit") | ||
|
||
tests := []struct { | ||
name string | ||
view *View | ||
data [][]float64 | ||
wantMin float64 | ||
wantMax float64 | ||
}{ | ||
{ | ||
name: "reset_data", | ||
view: &View{Name: "const", Measure: m, Aggregation: Distribution(1, 4, 10, 12)}, | ||
data: [][]float64{{2, 2, 2, 2}, {4, 4, 4, 1}}, | ||
wantMin: 1, | ||
wantMax: 4, | ||
}, | ||
{ | ||
name: "no_data", | ||
view: &View{Name: "const", Measure: m, Aggregation: Distribution(1, 4, 10, 12)}, | ||
wantMin: 0, | ||
wantMax: 0, | ||
}, | ||
{ | ||
name: "constant_data", | ||
view: &View{Name: "const", Measure: m, Aggregation: Distribution(1, 4, 10, 12)}, | ||
data: [][]float64{{1, 1, 1, 1}, {1, 1, 1, 1}}, | ||
wantMin: 1, | ||
wantMax: 1, | ||
}, | ||
} | ||
|
||
for _, tt := range tests { | ||
t.Run(tt.name, func(t *testing.T) { | ||
restart() | ||
SetReportingPeriod(25 * time.Millisecond) | ||
|
||
if err := Register(tt.view); err != nil { | ||
t.Fatalf("%v: cannot register: %v", tt.name, err) | ||
} | ||
|
||
e := &distributionExporter{} | ||
RegisterExporter(e) | ||
defer UnregisterExporter(e) | ||
|
||
for _, batch := range tt.data { | ||
for _, val := range batch { | ||
stats.Record(ctx, m.M(val)) | ||
} | ||
time.Sleep(50 * time.Millisecond) | ||
} | ||
|
||
e.Lock() | ||
min := e.min | ||
max := e.max | ||
e.Unlock() | ||
if got, want := min, tt.wantMin; got != want { | ||
t.Errorf("%v: got min = %v; want %v", tt.name, got, want) | ||
} | ||
if got, want := max, tt.wantMax; got != want { | ||
t.Errorf("%v: got max = %v; want %v", tt.name, got, want) | ||
} | ||
}) | ||
} | ||
|
||
} | ||
|
@@ -494,7 +567,11 @@ func (e *countExporter) ExportView(vd *Data) { | |
if len(vd.Rows) == 0 { | ||
return | ||
} | ||
d := vd.Rows[0].Data.(*CountData) | ||
d, ok := vd.Rows[0].Data.(*CountData) | ||
if !ok { | ||
debug.PrintStack() | ||
panic("BYE") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is this necessary? |
||
} | ||
|
||
e.Lock() | ||
defer e.Unlock() | ||
|
@@ -514,6 +591,28 @@ func (e *vdExporter) ExportView(vd *Data) { | |
e.vds = append(e.vds, vd) | ||
} | ||
|
||
type distributionExporter struct { | ||
sync.Mutex | ||
min float64 | ||
max float64 | ||
} | ||
|
||
func (e *distributionExporter) ExportView(vd *Data) { | ||
if len(vd.Rows) == 0 { | ||
return | ||
} | ||
d := vd.Rows[0].Data.(*DistributionData) | ||
|
||
e.Lock() | ||
defer e.Unlock() | ||
if d.Min != math.MaxFloat64 { | ||
e.min = d.Min | ||
} | ||
if d.Max != math.SmallestNonzeroFloat64 { | ||
e.max = d.Max | ||
} | ||
} | ||
|
||
// restart stops the current processors and creates a new one. | ||
func restart() { | ||
defaultWorker.stop() | ||
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If user configures both ways or multiple exporter using new mechanism then values of min/max is unpredictable.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@rghetia done, let me know if the last commit is what you were looking for 👍
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
test is good.
Item 2 above is not taken care of.
There should be new option in ReadAndExport method. If the option to reset min/max is specified then only do the reset.
Similarly, for old approach (export viewdata) there should be a new method view.ResetMinMaxOnExport() - It is rather a long name but I don't have a good suggestion. Alternatively, provide reset functionality only using new approach with ReadAndExport().