in example/metric/sdk/example.go [59:150]
func main() {
ctx := context.Background()
// Initialization. In order to pass the credentials to the exporter,
// prepare credential file following the instruction described in this doc.
// https://pkg.go.dev/golang.org/x/oauth2/google?tab=doc#FindDefaultCredentials
exporter, err := mexporter.New(mexporter.WithProjectID(os.Getenv("GOOGLE_PROJECT_ID")))
if err != nil {
log.Fatalf("Failed to create exporter: %v", err)
}
res, err := resource.New(
ctx,
// Use the GCP resource detector to detect information about the GCP platform
resource.WithDetectors(gcp.NewDetector()),
// Keep the default detectors
resource.WithTelemetrySDK(),
// Add attributes from environment variables
resource.WithFromEnv(),
// Add your own custom attributes to identify your application
resource.WithAttributes(
semconv.ServiceNameKey.String("example-application"),
),
)
if errors.Is(err, resource.ErrPartialResource) || errors.Is(err, resource.ErrSchemaURLConflict) {
log.Println(err)
} else if err != nil {
log.Fatalf("resource.New: %v", err)
}
// initialize a MeterProvider with that periodically exports to the GCP exporter.
provider := sdkmetric.NewMeterProvider(
sdkmetric.WithReader(sdkmetric.NewPeriodicReader(exporter)),
sdkmetric.WithResource(res),
)
defer func() {
if err = provider.Shutdown(ctx); err != nil {
log.Fatalf("failed to shutdown meter provider: %v", err)
}
}()
// Create a meter with which we will record metrics for our package.
meter := provider.Meter("github.com/GoogleCloudPlatform/opentelemetry-operations-go/example/metric")
// Register counter value
counter, err := meter.Int64Counter("counter-a")
if err != nil {
log.Fatalf("Failed to create counter: %v", err)
}
clabels := []attribute.KeyValue{attribute.Key("key").String("value")}
counter.Add(ctx, 100, metric.WithAttributes(clabels...))
histogram, err := meter.Float64Histogram("histogram-b")
if err != nil {
log.Fatalf("Failed to create histogram: %v", err)
}
// Register observer value
olabels := []attribute.KeyValue{
attribute.String("foo", "Tokyo"),
attribute.String("bar", "Sushi"),
}
of := newObservedFloat(12.34)
gaugeObserver, err := meter.Float64ObservableGauge("observer-a")
if err != nil {
log.Fatalf("failed to initialize instrument: %v", err)
}
_, err = meter.RegisterCallback(func(ctx context.Context, o metric.Observer) error {
v := of.get()
o.ObserveFloat64(gaugeObserver, v, metric.WithAttributes(olabels...))
return nil
}, gaugeObserver)
if err != nil {
log.Fatalf("failed to register callback: %v", err)
}
// Add measurement once an every 10 second.
timer := time.NewTicker(10 * time.Second)
rng := rand.New(rand.NewSource(time.Now().UnixNano()))
for range timer.C {
r := rng.Int63n(100)
cv := 100 + r
counter.Add(ctx, cv, metric.WithAttributes(clabels...))
r2 := rng.Int63n(100)
hv := float64(r2) / 20.0
histogram.Record(ctx, hv, metric.WithAttributes(clabels...))
ov := 12.34 + hv
of.set(ov)
log.Printf("Most recent data: counter %v, observer %v; histogram %v", cv, ov, hv)
}
}