-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add ScrapeErrors struct to simplify errors usage (#2414)
* Add ScrapeErrors struct to simplify errors usage Add ScrapeErrors that contains a slice with errors and that has methods to simplify adding new PartialScrapeErrors and regular generic errors. Use new methods to refactor errors appends in receiver/hostmetricsreceiver. Use ScrapeErrors.Combine() in component/componenterror to not create cycling dependencies in consumererrors package. * Component error: do not change CombineErrors yet Leave componenterror.CombineErrors unchanged to not introduce too many changes in a single PR. Add a note about the necessity of componenterror.CombineErrors deprecation. * ScrapeErrors: do not iterate over all errors Rename scrapeErrsCount field to failedScrapeCount. Add failed count in every Add, Addf call of ScrapeErrors and use this info to call CombineErrors directly instead of iterating over all errors in ScrapeErrors. Fix filesystemscraper Scrape function to not cast error into PartialScrapeError since it will cause panics after combining ScrapeErrors. Use NewPartialScrapeError instead. * ScrapeErrors: fix hostmetricsreceiver Scrape err Cast getProcessMetadata() error into consumererror.PartialScrapeError to get the valid scrape errors count. * ScrapeErrors: fix multiMetricScraper.Scrape method Cast Scrape() error into consumererror.PartialScrapeError to get the valid scrape errors count and to not skip combined errors. * ScrapeErrors: check if slice contains partial err Fix `Combine()` method to check if errs slice contains `PartialScrapeError` since we can have scrape errors with 0 failed metrics so checking only `failedScrapeCount` field is not enough. * Fix changing comments in combineerrors_test.go Do not change comments in consumer/consumererror/combineerrors_test.go. * Component error: apply 5cc0707 changes Apply 5cc0707 to component/componenterror. * ScrapeErrors: rename and simplify methods Use only Add and AddPartial methods.
- Loading branch information
1 parent
ba720d8
commit 8fda120
Showing
10 changed files
with
211 additions
and
194 deletions.
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
// Copyright The OpenTelemetry Authors | ||
// | ||
// Licensed 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. | ||
|
||
package consumererror | ||
|
||
// ScrapeErrors contains multiple PartialScrapeErrors and can also contain generic errors. | ||
type ScrapeErrors struct { | ||
errs []error | ||
failedScrapeCount int | ||
} | ||
|
||
// Add adds a PartialScrapeError with the provided failed count and error. | ||
func (s *ScrapeErrors) AddPartial(failed int, err error) { | ||
s.errs = append(s.errs, NewPartialScrapeError(err, failed)) | ||
s.failedScrapeCount += failed | ||
} | ||
|
||
// Add adds a regular error. | ||
func (s *ScrapeErrors) Add(err error) { | ||
s.errs = append(s.errs, err) | ||
} | ||
|
||
// Combine converts a slice of errors into one error. | ||
// It will return a PartialScrapeError if at least one error in the slice is a PartialScrapeError. | ||
func (s *ScrapeErrors) Combine() error { | ||
partialScrapeErr := false | ||
for _, err := range s.errs { | ||
if IsPartialScrapeError(err) { | ||
partialScrapeErr = true | ||
} | ||
} | ||
|
||
if !partialScrapeErr { | ||
return CombineErrors(s.errs) | ||
} | ||
|
||
return NewPartialScrapeError(CombineErrors(s.errs), s.failedScrapeCount) | ||
} |
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 |
---|---|---|
@@ -0,0 +1,117 @@ | ||
// Copyright The OpenTelemetry Authors | ||
// | ||
// Licensed 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. | ||
|
||
package consumererror | ||
|
||
import ( | ||
"errors" | ||
"fmt" | ||
"testing" | ||
|
||
"github.com/stretchr/testify/assert" | ||
) | ||
|
||
func TestScrapeErrorsAddPartial(t *testing.T) { | ||
err1 := errors.New("err 1") | ||
err2 := errors.New("err 2") | ||
expected := []error{ | ||
PartialScrapeError{error: err1, Failed: 1}, | ||
PartialScrapeError{error: err2, Failed: 10}, | ||
} | ||
|
||
var errs ScrapeErrors | ||
errs.AddPartial(1, err1) | ||
errs.AddPartial(10, err2) | ||
assert.Equal(t, expected, errs.errs) | ||
} | ||
|
||
func TestScrapeErrorsAdd(t *testing.T) { | ||
err1 := errors.New("err a") | ||
err2 := errors.New("err b") | ||
expected := []error{err1, err2} | ||
|
||
var errs ScrapeErrors | ||
errs.Add(err1) | ||
errs.Add(err2) | ||
assert.Equal(t, expected, errs.errs) | ||
} | ||
|
||
func TestScrapeErrorsCombine(t *testing.T) { | ||
testCases := []struct { | ||
errs func() ScrapeErrors | ||
expectedErr string | ||
expectedFailedCount int | ||
expectNil bool | ||
expectedScrape bool | ||
}{ | ||
{ | ||
errs: func() ScrapeErrors { | ||
var errs ScrapeErrors | ||
return errs | ||
}, | ||
expectNil: true, | ||
}, | ||
{ | ||
errs: func() ScrapeErrors { | ||
var errs ScrapeErrors | ||
errs.AddPartial(10, errors.New("bad scrapes")) | ||
errs.AddPartial(1, fmt.Errorf("err: %s", errors.New("bad scrape"))) | ||
return errs | ||
}, | ||
expectedErr: "[bad scrapes; err: bad scrape]", | ||
expectedFailedCount: 11, | ||
expectedScrape: true, | ||
}, | ||
{ | ||
errs: func() ScrapeErrors { | ||
var errs ScrapeErrors | ||
errs.Add(errors.New("bad regular")) | ||
errs.Add(fmt.Errorf("err: %s", errors.New("bad reg"))) | ||
return errs | ||
}, | ||
expectedErr: "[bad regular; err: bad reg]", | ||
}, | ||
{ | ||
errs: func() ScrapeErrors { | ||
var errs ScrapeErrors | ||
errs.AddPartial(2, errors.New("bad two scrapes")) | ||
errs.AddPartial(10, fmt.Errorf("%d scrapes failed: %s", 10, errors.New("bad things happened"))) | ||
errs.Add(errors.New("bad event")) | ||
errs.Add(fmt.Errorf("event: %s", errors.New("something happened"))) | ||
return errs | ||
}, | ||
expectedErr: "[bad two scrapes; 10 scrapes failed: bad things happened; bad event; event: something happened]", | ||
expectedFailedCount: 12, | ||
expectedScrape: true, | ||
}, | ||
} | ||
|
||
for _, tc := range testCases { | ||
scrapeErrs := tc.errs() | ||
if (scrapeErrs.Combine() == nil) != tc.expectNil { | ||
t.Errorf("%+v.Combine() == nil? Got: %t. Want: %t", scrapeErrs, scrapeErrs.Combine() == nil, tc.expectNil) | ||
} | ||
if scrapeErrs.Combine() != nil && tc.expectedErr != scrapeErrs.Combine().Error() { | ||
t.Errorf("%+v.Combine() = %q. Want: %q", scrapeErrs, scrapeErrs.Combine(), tc.expectedErr) | ||
} | ||
if tc.expectedScrape { | ||
partialScrapeErr, ok := scrapeErrs.Combine().(PartialScrapeError) | ||
if !ok { | ||
t.Errorf("%+v.Combine() = %q. Want: PartialScrapeError", scrapeErrs, scrapeErrs.Combine()) | ||
} else if tc.expectedFailedCount != partialScrapeErr.Failed { | ||
t.Errorf("%+v.Combine().Failed. Got %d Failed count. Want: %d", scrapeErrs, partialScrapeErr.Failed, tc.expectedFailedCount) | ||
} | ||
} | ||
} | ||
} |
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
Oops, something went wrong.