Skip to content

Commit

Permalink
Add support for CreateServiceTimeSeries (#837)
Browse files Browse the repository at this point in the history
* Add support for createServiceTimeSeries

* Update tests to accomodate CreateServiceTimeSeries

* Update comment

* Remove redundant check
  • Loading branch information
psx95 committed Apr 22, 2024
1 parent 4fe07d3 commit 88c799a
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 6 deletions.
10 changes: 8 additions & 2 deletions exporter/metric/metric.go
Expand Up @@ -122,6 +122,8 @@ func newMetricExporter(o *options) (*metricExporter, error) {
gax.WithGRPCOptions(grpc.UseCompressor(gzip.Name)))
client.CallOptions.CreateTimeSeries = append(client.CallOptions.CreateTimeSeries,
gax.WithGRPCOptions(grpc.UseCompressor(gzip.Name)))
client.CallOptions.CreateServiceTimeSeries = append(client.CallOptions.CreateServiceTimeSeries,
gax.WithGRPCOptions(grpc.UseCompressor(gzip.Name)))
}

cache := map[key]*googlemetricpb.MetricDescriptor{}
Expand Down Expand Up @@ -166,6 +168,7 @@ func (me *metricExporter) Aggregation(ik metric.InstrumentKind) metric.Aggregati
// exportMetricDescriptor create MetricDescriptor from the record
// if the descriptor is not registered in Cloud Monitoring yet.
func (me *metricExporter) exportMetricDescriptor(ctx context.Context, rm *metricdata.ResourceMetrics) error {
// We only send metric descriptors if we're configured *and* we're not sending service timeseries.
if me.o.disableCreateMetricDescriptors {
return nil
}
Expand Down Expand Up @@ -248,8 +251,11 @@ func (me *metricExporter) exportTimeSeries(ctx context.Context, rm *metricdata.R
Name: name,
TimeSeries: tss[i:j],
}

errs = append(errs, me.client.CreateTimeSeries(ctx, req))
if me.o.createServiceTimeSeries {
errs = append(errs, me.client.CreateServiceTimeSeries(ctx, req))
} else {
errs = append(errs, me.client.CreateTimeSeries(ctx, req))
}
}

return errors.Join(errs...)
Expand Down
43 changes: 39 additions & 4 deletions exporter/metric/metric_test.go
Expand Up @@ -867,44 +867,74 @@ func TestTimeIntervalPassthru(t *testing.T) {

type mock struct {
monitoringpb.UnimplementedMetricServiceServer
createTimeSeries func(ctx context.Context, req *monitoringpb.CreateTimeSeriesRequest) (*emptypb.Empty, error)
createMetricDescriptor func(ctx context.Context, req *monitoringpb.CreateMetricDescriptorRequest) (*googlemetricpb.MetricDescriptor, error)
createTimeSeries func(ctx context.Context, req *monitoringpb.CreateTimeSeriesRequest) (*emptypb.Empty, error)
createServiceTimeSeries func(ctx context.Context, req *monitoringpb.CreateTimeSeriesRequest) (*emptypb.Empty, error)
createMetricDescriptor func(ctx context.Context, req *monitoringpb.CreateMetricDescriptorRequest) (*googlemetricpb.MetricDescriptor, error)
}

func (m *mock) CreateTimeSeries(ctx context.Context, req *monitoringpb.CreateTimeSeriesRequest) (*emptypb.Empty, error) {
return m.createTimeSeries(ctx, req)
}

func (m *mock) CreateServiceTimeSeries(ctx context.Context, req *monitoringpb.CreateTimeSeriesRequest) (*emptypb.Empty, error) {
return m.createServiceTimeSeries(ctx, req)
}

func (m *mock) CreateMetricDescriptor(ctx context.Context, req *monitoringpb.CreateMetricDescriptorRequest) (*googlemetricpb.MetricDescriptor, error) {
return m.createMetricDescriptor(ctx, req)
}

func TestExportWithDisableCreateMetricDescriptors(t *testing.T) {
func TestExportWithDisableCreateMetricDescriptorsAndEnableServiceTimeSeries(t *testing.T) {
for _, tc := range []struct {
desc string
disableCreateMetricsDescriptor bool
expectExportMetricDescriptor bool
enableServiceTimeSeries bool
expectServiceTimeSeries bool
}{
{
desc: "default",
disableCreateMetricsDescriptor: false,
expectExportMetricDescriptor: true,
enableServiceTimeSeries: false,
expectServiceTimeSeries: false,
},
{
desc: "Disable CreateMetricsDescriptor and CreateServiceTimeSeries",
disableCreateMetricsDescriptor: true,
expectExportMetricDescriptor: false,
enableServiceTimeSeries: false,
expectServiceTimeSeries: false,
},
{
desc: "Enable CreateServiceTimeSeries and Enable CreateMetricsDescriptor",
disableCreateMetricsDescriptor: false,
expectExportMetricDescriptor: false,
enableServiceTimeSeries: true,
expectServiceTimeSeries: true,
},
{
desc: "Disable CreateMetricsDescriptor",
desc: "Enable CreateServiceTimeSeries and Disable CreateMetricsDescriptor",
disableCreateMetricsDescriptor: true,
expectExportMetricDescriptor: false,
enableServiceTimeSeries: true,
expectServiceTimeSeries: true,
},
} {
t.Run(tc.desc, func(t *testing.T) {
server := grpc.NewServer()

metricDescriptorCreated := false
createServicTimeSeriesUsed := false

m := mock{
createTimeSeries: func(ctx context.Context, r *monitoringpb.CreateTimeSeriesRequest) (*emptypb.Empty, error) {
return &emptypb.Empty{}, nil
},
createServiceTimeSeries: func(ctx context.Context, r *monitoringpb.CreateTimeSeriesRequest) (*emptypb.Empty, error) {
createServicTimeSeriesUsed = true
return &emptypb.Empty{}, nil
},
createMetricDescriptor: func(ctx context.Context, req *monitoringpb.CreateMetricDescriptorRequest) (*googlemetricpb.MetricDescriptor, error) {
metricDescriptorCreated = true
return req.MetricDescriptor, nil
Expand Down Expand Up @@ -932,6 +962,10 @@ func TestExportWithDisableCreateMetricDescriptors(t *testing.T) {
WithMetricDescriptorTypeFormatter(formatter),
}

if tc.enableServiceTimeSeries {
opts = append(opts, WithCreateServiceTimeSeries())
}

if tc.disableCreateMetricsDescriptor {
opts = append(opts, WithDisableCreateMetricDescriptors())
}
Expand All @@ -954,6 +988,7 @@ func TestExportWithDisableCreateMetricDescriptors(t *testing.T) {
require.NoError(t, provider.ForceFlush(ctx))
server.Stop()
require.Equal(t, tc.expectExportMetricDescriptor, metricDescriptorCreated)
require.Equal(t, tc.expectServiceTimeSeries, createServicTimeSeriesUsed)
})
}
}
Expand Down
13 changes: 13 additions & 0 deletions exporter/metric/option.go
Expand Up @@ -72,6 +72,10 @@ type options struct {
// enableSumOfSquaredDeviation enables calculation of an estimated sum of squared
// deviation. It isn't correct, so we don't send it by default.
enableSumOfSquaredDeviation bool

// createServiceTimeSeries sets whether to create timeseries using `CreateServiceTimeSeries`.
// Implicitly, this sets `disableCreateMetricDescriptors` to true.
createServiceTimeSeries bool
}

// WithProjectID sets Google Cloud Platform project as projectID.
Expand Down Expand Up @@ -159,3 +163,12 @@ func WithSumOfSquaredDeviation() func(o *options) {
o.enableSumOfSquaredDeviation = true
}
}

// WithCreateServiceTimeSeries configures the exporter to use `CreateServiceTimeSeries` for creating timeseries.
// If this is used, metric descriptors are not exported.
func WithCreateServiceTimeSeries() func(o *options) {
return func(o *options) {
o.createServiceTimeSeries = true
o.disableCreateMetricDescriptors = true
}
}

0 comments on commit 88c799a

Please sign in to comment.