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

Commit

Permalink
skip creating metric descriptor for stackdriver built-in metrics. (#77)
Browse files Browse the repository at this point in the history
* skip creating metric descriptor for stackdriver built-in metrics.

* fix review comment.
  • Loading branch information
rghetia committed Jan 31, 2019
1 parent 0e2df90 commit 0f284fd
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 21 deletions.
2 changes: 1 addition & 1 deletion equivalence_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ func TestStatsAndMetricsEquivalence(t *testing.T) {
}

ctx := context.Background()
sMD, err := se.viewToMetricDescriptor(ctx, vd.View)
sMD, err := se.viewToCreateMetricDescriptorRequest(ctx, vd.View)
if err != nil {
t.Errorf("#%d: Stats.viewToMetricDescriptor: %v", i, err)
}
Expand Down
19 changes: 14 additions & 5 deletions metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import (
"go.opencensus.io/stats"
"go.opencensus.io/trace"

monitoring "cloud.google.com/go/monitoring/apiv3"
"cloud.google.com/go/monitoring/apiv3"
distributionpb "google.golang.org/genproto/googleapis/api/distribution"
labelpb "google.golang.org/genproto/googleapis/api/label"
googlemetricpb "google.golang.org/genproto/googleapis/api/metric"
Expand Down Expand Up @@ -273,11 +273,20 @@ func (se *statsExporter) createMetricDescriptor(ctx context.Context, metric *met
return err
}

cmrdesc := &monitoringpb.CreateMetricDescriptorRequest{
Name: fmt.Sprintf("projects/%s", se.o.ProjectID),
MetricDescriptor: inMD,
var md *googlemetricpb.MetricDescriptor
if builtinMetric(inMD.Type) {
gmrdesc := &monitoringpb.GetMetricDescriptorRequest{
Name: inMD.Name,
}
md, err = getMetricDescriptor(ctx, se.c, gmrdesc)
} else {

cmrdesc := &monitoringpb.CreateMetricDescriptorRequest{
Name: fmt.Sprintf("projects/%s", se.o.ProjectID),
MetricDescriptor: inMD,
}
md, err = createMetricDescriptor(ctx, se.c, cmrdesc)
}
md, err := createMetricDescriptor(ctx, se.c, cmrdesc)

if err == nil {
// Now record the metric as having been created.
Expand Down
68 changes: 53 additions & 15 deletions stats.go
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ func (se *statsExporter) makeReq(vds []*view.Data, limit int) []*monitoringpb.Cr
return reqs
}

func (e *statsExporter) viewToMetricDescriptor(ctx context.Context, v *view.View) (*monitoringpb.CreateMetricDescriptorRequest, error) {
func (e *statsExporter) viewToMetricDescriptor(ctx context.Context, v *view.View) (*metricpb.MetricDescriptor, error) {
m := v.Measure
agg := v.Aggregation
viewName := v.Name
Expand Down Expand Up @@ -289,22 +289,32 @@ func (e *statsExporter) viewToMetricDescriptor(ctx context.Context, v *view.View
displayName = e.o.GetMetricDisplayName(v)
}

res := &monitoringpb.CreateMetricDescriptorRequest{
Name: fmt.Sprintf("projects/%s", e.o.ProjectID),
MetricDescriptor: &metricpb.MetricDescriptor{
Name: fmt.Sprintf("projects/%s/metricDescriptors/%s", e.o.ProjectID, metricType),
DisplayName: displayName,
Description: v.Description,
Unit: unit,
Type: metricType,
MetricKind: metricKind,
ValueType: valueType,
Labels: newLabelDescriptors(e.defaultLabels, v.TagKeys),
},
res := &metricpb.MetricDescriptor{
Name: fmt.Sprintf("projects/%s/metricDescriptors/%s", e.o.ProjectID, metricType),
DisplayName: displayName,
Description: v.Description,
Unit: unit,
Type: metricType,
MetricKind: metricKind,
ValueType: valueType,
Labels: newLabelDescriptors(e.defaultLabels, v.TagKeys),
}
return res, nil
}

func (e *statsExporter) viewToCreateMetricDescriptorRequest(ctx context.Context, v *view.View) (*monitoringpb.CreateMetricDescriptorRequest, error) {
inMD, err := e.viewToMetricDescriptor(ctx, v)
if err != nil {
return nil, err
}

cmrdesc := &monitoringpb.CreateMetricDescriptorRequest{
Name: fmt.Sprintf("projects/%s", e.o.ProjectID),
MetricDescriptor: inMD,
}
return cmrdesc, nil
}

// createMeasure creates a MetricDescriptor for the given view data in Stackdriver Monitoring.
// An error will be returned if there is already a metric descriptor created with the same name
// but it has a different aggregation or keys.
Expand All @@ -318,12 +328,24 @@ func (e *statsExporter) createMeasure(ctx context.Context, v *view.View) error {
return e.equalMeasureAggTagKeys(md, v.Measure, v.Aggregation, v.TagKeys)
}

pmd, err := e.viewToMetricDescriptor(ctx, v)
inMD, err := e.viewToMetricDescriptor(ctx, v)
if err != nil {
return err
}

dmd, err := createMetricDescriptor(ctx, e.c, pmd)
var dmd *metric.MetricDescriptor
if builtinMetric(inMD.Type) {
gmrdesc := &monitoringpb.GetMetricDescriptorRequest{
Name: inMD.Name,
}
dmd, err = getMetricDescriptor(ctx, e.c, gmrdesc)
} else {
cmrdesc := &monitoringpb.CreateMetricDescriptorRequest{
Name: fmt.Sprintf("projects/%s", e.o.ProjectID),
MetricDescriptor: inMD,
}
dmd, err = createMetricDescriptor(ctx, e.c, cmrdesc)
}
if err != nil {
return err
}
Expand Down Expand Up @@ -527,3 +549,19 @@ var getMetricDescriptor = func(ctx context.Context, c *monitoring.MetricClient,
var createTimeSeries = func(ctx context.Context, c *monitoring.MetricClient, ts *monitoringpb.CreateTimeSeriesRequest) error {
return c.CreateTimeSeries(ctx, ts)
}

var knownExternalMetricPrefixes = []string{
"custom.googleapis.com/",
"external.googleapis.com/",
}

// builtinMetric returns true if a MetricType is a heuristically known
// built-in Stackdriver metric
func builtinMetric(metricType string) bool {
for _, knownExternalMetric := range knownExternalMetricPrefixes {
if strings.HasPrefix(metricType, knownExternalMetric) {
return false
}
}
return true
}

0 comments on commit 0f284fd

Please sign in to comment.