fix(outputs.stackdriver): Drop metrics on InvalidArgument gRPC error (#13931)
This commit is contained in:
parent
b6d946da6e
commit
080f5a2ecb
|
|
@ -15,6 +15,7 @@ import (
|
||||||
"google.golang.org/api/option"
|
"google.golang.org/api/option"
|
||||||
metricpb "google.golang.org/genproto/googleapis/api/metric"
|
metricpb "google.golang.org/genproto/googleapis/api/metric"
|
||||||
monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres"
|
monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
"google.golang.org/protobuf/types/known/timestamppb"
|
"google.golang.org/protobuf/types/known/timestamppb"
|
||||||
|
|
||||||
"github.com/influxdata/telegraf"
|
"github.com/influxdata/telegraf"
|
||||||
|
|
@ -54,10 +55,6 @@ const (
|
||||||
|
|
||||||
// MaxInt is the max int64 value.
|
// MaxInt is the max int64 value.
|
||||||
MaxInt = int(^uint(0) >> 1)
|
MaxInt = int(^uint(0) >> 1)
|
||||||
|
|
||||||
errStringPointsOutOfOrder = "one or more of the points specified had an older end time than the most recent point"
|
|
||||||
errStringPointsTooOld = "data points cannot be written more than 24h in the past"
|
|
||||||
errStringPointsTooFrequent = "one or more points were written more frequently than the maximum sampling period configured for the metric"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s *Stackdriver) Init() error {
|
func (s *Stackdriver) Init() error {
|
||||||
|
|
@ -322,12 +319,13 @@ func (s *Stackdriver) sendBatch(batch []telegraf.Metric) error {
|
||||||
// Create the time series in Stackdriver.
|
// Create the time series in Stackdriver.
|
||||||
err := s.client.CreateTimeSeries(ctx, timeSeriesRequest)
|
err := s.client.CreateTimeSeries(ctx, timeSeriesRequest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if strings.Contains(err.Error(), errStringPointsOutOfOrder) ||
|
if errStatus, ok := status.FromError(err); ok {
|
||||||
strings.Contains(err.Error(), errStringPointsTooOld) ||
|
if errStatus.Code().String() == "InvalidArgument" {
|
||||||
strings.Contains(err.Error(), errStringPointsTooFrequent) {
|
s.Log.Warnf("Unable to write to Stackdriver - dropping metrics: %s", err)
|
||||||
s.Log.Debugf("Unable to write to Stackdriver: %s", err)
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
s.Log.Errorf("Unable to write to Stackdriver: %s", err)
|
s.Log.Errorf("Unable to write to Stackdriver: %s", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,10 @@ import (
|
||||||
"google.golang.org/api/option"
|
"google.golang.org/api/option"
|
||||||
metricpb "google.golang.org/genproto/googleapis/api/metric"
|
metricpb "google.golang.org/genproto/googleapis/api/metric"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/credentials/insecure"
|
"google.golang.org/grpc/credentials/insecure"
|
||||||
"google.golang.org/grpc/metadata"
|
"google.golang.org/grpc/metadata"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
"google.golang.org/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
"google.golang.org/protobuf/types/known/emptypb"
|
"google.golang.org/protobuf/types/known/emptypb"
|
||||||
"google.golang.org/protobuf/types/known/timestamppb"
|
"google.golang.org/protobuf/types/known/timestamppb"
|
||||||
|
|
@ -55,9 +57,18 @@ func (s *mockMetricServer) CreateTimeSeries(ctx context.Context, req *monitoring
|
||||||
if xg := md["x-goog-api-client"]; len(xg) == 0 || !strings.Contains(xg[0], "gl-go/") {
|
if xg := md["x-goog-api-client"]; len(xg) == 0 || !strings.Contains(xg[0], "gl-go/") {
|
||||||
return nil, fmt.Errorf("x-goog-api-client = %v, expected gl-go key", xg)
|
return nil, fmt.Errorf("x-goog-api-client = %v, expected gl-go key", xg)
|
||||||
}
|
}
|
||||||
|
|
||||||
s.reqs = append(s.reqs, req)
|
s.reqs = append(s.reqs, req)
|
||||||
if s.err != nil {
|
if s.err != nil {
|
||||||
return nil, s.err
|
var statusResp *status.Status
|
||||||
|
switch s.err.Error() {
|
||||||
|
case "InvalidArgument":
|
||||||
|
statusResp = status.New(codes.InvalidArgument, s.err.Error())
|
||||||
|
default:
|
||||||
|
statusResp = status.New(codes.Unknown, s.err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, statusResp.Err()
|
||||||
}
|
}
|
||||||
return s.resps[0].(*emptypb.Empty), nil
|
return s.resps[0].(*emptypb.Empty), nil
|
||||||
}
|
}
|
||||||
|
|
@ -396,23 +407,16 @@ func TestWriteIgnoredErrors(t *testing.T) {
|
||||||
err error
|
err error
|
||||||
expectedErr bool
|
expectedErr bool
|
||||||
}{
|
}{
|
||||||
{
|
|
||||||
name: "points too old",
|
|
||||||
err: errors.New(errStringPointsTooOld),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "points out of order",
|
|
||||||
err: errors.New(errStringPointsOutOfOrder),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "points too frequent",
|
|
||||||
err: errors.New(errStringPointsTooFrequent),
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name: "other errors reported",
|
name: "other errors reported",
|
||||||
err: errors.New("test"),
|
err: errors.New("Unknown"),
|
||||||
expectedErr: true,
|
expectedErr: true,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "invalid argument",
|
||||||
|
err: errors.New("InvalidArgument"),
|
||||||
|
expectedErr: false,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
|
@ -431,13 +435,11 @@ func TestWriteIgnoredErrors(t *testing.T) {
|
||||||
client: c,
|
client: c,
|
||||||
}
|
}
|
||||||
|
|
||||||
err = s.Connect()
|
require.NoError(t, s.Connect())
|
||||||
require.NoError(t, err)
|
|
||||||
err = s.Write(testutil.MockMetrics())
|
|
||||||
if tt.expectedErr {
|
if tt.expectedErr {
|
||||||
require.Error(t, err)
|
require.Error(t, s.Write(testutil.MockMetrics()))
|
||||||
} else {
|
} else {
|
||||||
require.NoError(t, err)
|
require.NoError(t, s.Write(testutil.MockMetrics()))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue