Skip to content
This repository was archived by the owner on Nov 7, 2022. It is now read-only.

Commit 55f0a76

Browse files
committed
cmd/ocagent: added Stackdriver Metrics exporter
Added Stackdriver Metrics exporter at version v0.9.1.
1 parent d3300a2 commit 55f0a76

4 files changed

Lines changed: 94 additions & 9 deletions

File tree

example/main.go

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ import (
2222
"time"
2323

2424
"contrib.go.opencensus.io/exporter/ocagent"
25+
"go.opencensus.io/stats"
26+
"go.opencensus.io/stats/view"
27+
"go.opencensus.io/tag"
2528
"go.opencensus.io/trace"
2629
)
2730

@@ -31,14 +34,46 @@ func main() {
3134
log.Fatalf("Failed to create ocagent-exporter: %v", err)
3235
}
3336
trace.RegisterExporter(oce)
37+
view.RegisterExporter(oce)
38+
3439
trace.ApplyConfig(trace.Config{
3540
DefaultSampler: trace.AlwaysSample(),
3641
})
3742

43+
// Some stats
44+
keyClient, _ := tag.NewKey("client")
45+
keyMethod, _ := tag.NewKey("method")
46+
47+
mLatencyMs := stats.Float64("latency", "The latency in milliseconds", "ms")
48+
views := []*view.View{
49+
{
50+
Name: "opdemo/latency",
51+
Description: "The various counts",
52+
Measure: mLatencyMs,
53+
Aggregation: view.Distribution(0, 10, 50, 100, 200, 400, 800, 1000, 1400, 2000, 5000, 10000),
54+
TagKeys: []tag.Key{keyClient, keyMethod},
55+
},
56+
{
57+
Name: "opdemo/process_counts",
58+
Description: "The various counts",
59+
Measure: mLatencyMs,
60+
Aggregation: view.Count(),
61+
TagKeys: []tag.Key{keyClient, keyMethod},
62+
},
63+
}
64+
65+
if err := view.Register(views...); err != nil {
66+
log.Fatalf("Failed to register views for metrics: %v", err)
67+
}
68+
69+
ctx, _ := tag.New(context.Background(), tag.Insert(keyMethod, "repl"), tag.Insert(keyClient, "cli"))
3870
rng := rand.New(rand.NewSource(time.Now().UnixNano()))
3971
for {
40-
_, span := trace.StartSpan(context.Background(), "foo")
41-
time.Sleep(time.Duration(rng.Int63n(1000)) * time.Millisecond)
72+
startTime := time.Now()
73+
_, span := trace.StartSpan(context.Background(), "Foo")
74+
time.Sleep(time.Duration(rng.Int63n(13000)) * time.Millisecond)
4275
span.End()
76+
latencyMs := float64(time.Since(startTime)) / 1e6
77+
stats.Record(ctx, mLatencyMs.M(latencyMs))
4378
}
4479
}

exporter/exporterparser/stackdriver.go

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@ package exporterparser
1717
import (
1818
"context"
1919
"fmt"
20+
"sync"
21+
"time"
2022

2123
"contrib.go.opencensus.io/exporter/stackdriver"
24+
"go.opencensus.io/trace"
2225

2326
"github.com/census-instrumentation/opencensus-service/data"
2427
"github.com/census-instrumentation/opencensus-service/exporter"
@@ -28,6 +31,7 @@ type stackdriverConfig struct {
2831
ProjectID string `yaml:"project,omitempty"`
2932
EnableTracing bool `yaml:"enable_tracing,omitempty"`
3033
EnableMetrics bool `yaml:"enable_metrics,omitempty"`
34+
MetricPrefix string `yaml:"metric_prefix,omitempty"`
3135
}
3236

3337
type stackdriverExporter struct {
@@ -65,20 +69,35 @@ func StackdriverTraceExportersFromYAML(config []byte) (tes []exporter.TraceExpor
6569
}
6670

6771
sde, serr := stackdriver.NewExporter(stackdriver.Options{
68-
ProjectID: sc.ProjectID,
72+
ProjectID: sc.ProjectID,
73+
MetricPrefix: sc.MetricPrefix,
74+
75+
// Stackdriver Metrics mandates a minimum of 60 seconds for
76+
// reporting metrics. We have to enforce this as per the advisory
77+
// at https://cloud.google.com/monitoring/custom-metrics/creating-metrics#writing-ts
78+
// which says:
79+
//
80+
// "If you want to write more than one point to the same time series, then use a separate call
81+
// to the timeSeries.create method for each point. Don't make the calls faster than one time per
82+
// minute. If you are adding data points to different time series, then there is no rate limitation."
83+
BundleDelayThreshold: 61 * time.Second,
6984
})
7085
if serr != nil {
7186
return nil, nil, nil, fmt.Errorf("Cannot configure Stackdriver Trace exporter: %v", serr)
7287
}
7388

74-
stexp := &stackdriverExporter{exporter: sde}
89+
exp := &stackdriverExporter{
90+
exporter: sde,
91+
}
92+
7593
if sc.EnableTracing {
76-
tes = append(tes, stexp)
94+
tes = append(tes, exp)
7795
}
96+
7897
if sc.EnableMetrics {
79-
// TODO: (@odeke-em, @songya23) implement ExportMetrics for Stackdriver.
80-
// mes = append(mes, oexp)
98+
mes = append(mes, exp)
8199
}
100+
82101
doneFns = append(doneFns, func() error {
83102
sde.Flush()
84103
return nil
@@ -92,3 +111,29 @@ func (sde *stackdriverExporter) ExportSpans(ctx context.Context, td data.TraceDa
92111
// upload can use the context and information from the Node.
93112
return exportSpans(ctx, "stackdriver", sde.exporter, td)
94113
}
114+
115+
var _ exporter.MetricsExporter = (*stackdriverExporter)(nil)
116+
117+
func (sde *stackdriverExporter) ExportMetricsData(ctx context.Context, md data.MetricsData) error {
118+
ctx, span := trace.StartSpan(ctx,
119+
"opencensus.service.exporter.stackdriver.ExportMetricsData",
120+
trace.WithSampler(trace.NeverSample()))
121+
defer span.End()
122+
123+
var setErrorOnce sync.Once
124+
125+
for _, metric := range md.Metrics {
126+
err := sde.exporter.ExportMetric(ctx, md.Node, md.Resource, metric)
127+
if err != nil {
128+
setErrorOnce.Do(func() {
129+
span.SetStatus(trace.Status{Code: trace.StatusCodeInternal, Message: err.Error()})
130+
})
131+
132+
span.Annotate([]trace.Attribute{
133+
trace.StringAttribute("error", err.Error()),
134+
}, "Error encountered")
135+
}
136+
}
137+
138+
return nil
139+
}

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module github.com/census-instrumentation/opencensus-service
33
require (
44
cloud.google.com/go v0.32.0 // indirect
55
contrib.go.opencensus.io/exporter/ocagent v0.4.2
6-
contrib.go.opencensus.io/exporter/stackdriver v0.7.0
6+
contrib.go.opencensus.io/exporter/stackdriver v0.9.1
77
git.apache.org/thrift.git v0.0.0-20181101003639-92be4f312b88 // indirect
88
github.com/BurntSushi/toml v0.3.1 // indirect
99
github.com/DataDog/datadog-go v0.0.0-20180822151419-281ae9f2d895 // indirect
@@ -49,7 +49,7 @@ require (
4949
github.com/uber/jaeger-lib v1.5.0
5050
github.com/uber/tchannel-go v1.10.0
5151
github.com/yancl/opencensus-go-exporter-kafka v0.0.0-20181029030031-9c471c1bfbeb
52-
go.opencensus.io v0.18.0
52+
go.opencensus.io v0.18.1-0.20181204023538-aab39bd6a98b
5353
go.uber.org/atomic v1.3.2 // indirect
5454
go.uber.org/multierr v1.1.0 // indirect
5555
go.uber.org/zap v1.9.1

go.sum

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@ cloud.google.com/go v0.32.0 h1:DSt59WoyNcfAInilEpfvm2ugq8zvNyaHAm9MkzOwRQ4=
66
cloud.google.com/go v0.32.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
77
contrib.go.opencensus.io/exporter/ocagent v0.3.0 h1:fyqPXp7d+BBV3tXa7EE1CYrObJr7R9jTAOO/AsdcQBg=
88
contrib.go.opencensus.io/exporter/ocagent v0.3.0/go.mod h1:0fnkYHF+ORKj7HWzOExKkUHeFX79gXSKUQbpnAM+wzo=
9+
contrib.go.opencensus.io/exporter/ocagent v0.4.2/go.mod h1:YuG83h+XWwqWjvCqn7vK4KSyLKhThY3+gNGQ37iS2V0=
910
contrib.go.opencensus.io/exporter/stackdriver v0.7.0 h1:pmo1ol3uPcrLmvOET8bEbu5sialRZDDSHqJso0vo28o=
1011
contrib.go.opencensus.io/exporter/stackdriver v0.7.0/go.mod h1:hNe5qQofPbg6bLQY5wHCvQ7o+2E5P8PkegEuQ+MyRw0=
12+
contrib.go.opencensus.io/exporter/stackdriver v0.9.1 h1:W6APgQ9we4BH8U8bnq/FvwLKo2WSMHuiMkkS/Slkg30=
13+
contrib.go.opencensus.io/exporter/stackdriver v0.9.1/go.mod h1:hNe5qQofPbg6bLQY5wHCvQ7o+2E5P8PkegEuQ+MyRw0=
1114
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999 h1:sihTnRgTOUSCQz0iS0pjZuFQy/z7GXCJgSBg3+rZKHw=
1215
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
1316
git.apache.org/thrift.git v0.0.0-20181101003639-92be4f312b88/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
@@ -173,6 +176,8 @@ go.opencensus.io v0.17.0 h1:2Cu88MYg+1LU+WVD+NWwYhyP0kKgRlN9QjWGaX0jKTE=
173176
go.opencensus.io v0.17.0/go.mod h1:mp1VrMQxhlqqDpKvH4UcQUa4YwlzNmymAjPrDdfxNpI=
174177
go.opencensus.io v0.18.0 h1:Mk5rgZcggtbvtAun5aJzAtjKKN/t0R3jJPlWILlv938=
175178
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
179+
go.opencensus.io v0.18.1-0.20181204023538-aab39bd6a98b h1:6ayHMBPtdP3jNuk+Sfhso+PTB7ZJQ5E1FBo403m2H8w=
180+
go.opencensus.io v0.18.1-0.20181204023538-aab39bd6a98b/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
176181
go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4=
177182
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
178183
go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=

0 commit comments

Comments
 (0)