This repository was archived by the owner on Jan 22, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 28
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #44 from RichVanderwal/examples
OpenTelemetry simple sample application
- Loading branch information
Showing
2 changed files
with
148 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
module github.com/newrelic/opentelemetry-exporter-go/examples/simple | ||
|
||
go 1.15 | ||
|
||
require ( | ||
github.com/newrelic/newrelic-telemetry-sdk-go v0.5.1 | ||
github.com/newrelic/opentelemetry-exporter-go v0.16.0 | ||
go.opentelemetry.io/otel v0.16.0 | ||
go.opentelemetry.io/otel/sdk v0.16.0 | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,138 @@ | ||
// Copyright 2019 New Relic Corporation. All rights reserved. | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
// This example script is the sample from the OpenTelemetry Go "Getting Started" | ||
// guide, with the text-based exporter replaced with the New Relic OpenTelemetry | ||
// Exporter. | ||
|
||
package main | ||
|
||
import ( | ||
"context" | ||
"fmt" | ||
"log" | ||
"os" | ||
|
||
"github.com/newrelic/newrelic-telemetry-sdk-go/telemetry" | ||
"github.com/newrelic/opentelemetry-exporter-go/newrelic" | ||
"go.opentelemetry.io/otel" | ||
"go.opentelemetry.io/otel/baggage" | ||
"go.opentelemetry.io/otel/label" | ||
"go.opentelemetry.io/otel/metric" | ||
"go.opentelemetry.io/otel/propagation" | ||
controller "go.opentelemetry.io/otel/sdk/metric/controller/basic" | ||
processor "go.opentelemetry.io/otel/sdk/metric/processor/basic" | ||
"go.opentelemetry.io/otel/sdk/metric/selector/simple" | ||
sdktrace "go.opentelemetry.io/otel/sdk/trace" | ||
"go.opentelemetry.io/otel/trace" | ||
) | ||
|
||
func main() { | ||
|
||
// Create a New Relic OpenTelemetry Exporter | ||
apiKey, ok := os.LookupEnv("NEW_RELIC_API_KEY") | ||
if !ok { | ||
fmt.Println("Missing NEW_RELIC_API_KEY required for New Relic OpenTelemetry Exporter") | ||
os.Exit(1) | ||
} | ||
|
||
exporter, err := newrelic.NewExporter( | ||
"Simple OpenTelemetry Service", | ||
apiKey, | ||
telemetry.ConfigBasicErrorLogger(os.Stderr), | ||
telemetry.ConfigBasicDebugLogger(os.Stderr), | ||
telemetry.ConfigBasicAuditLogger(os.Stderr), | ||
) | ||
if err != nil { | ||
fmt.Printf("Failed to instantiate New Relic OpenTelemetry exporter: %v\n", err) | ||
os.Exit(1) | ||
} | ||
|
||
ctx := context.Background() | ||
defer exporter.Shutdown(ctx) | ||
|
||
// Create a tracer provider | ||
bsp := sdktrace.NewBatchSpanProcessor(exporter) | ||
tp := sdktrace.NewTracerProvider(sdktrace.WithSpanProcessor(bsp)) | ||
defer func() { _ = tp.Shutdown(ctx) }() | ||
|
||
// Create a meter provider | ||
pusher := controller.New( | ||
processor.New( | ||
simple.NewWithExactDistribution(), | ||
exporter, | ||
), | ||
) | ||
|
||
err = pusher.Start(ctx) | ||
if err != nil { | ||
log.Fatalf("failed to initialize metric controller: %v", err) | ||
} | ||
pusher.Start(ctx) | ||
|
||
// Handle this error in a sensible manner where possible | ||
defer func() { _ = pusher.Stop(ctx) }() | ||
|
||
// Set global options | ||
otel.SetTracerProvider(tp) | ||
otel.SetMeterProvider(pusher.MeterProvider()) | ||
propagator := propagation.NewCompositeTextMapPropagator(propagation.Baggage{}, propagation.TraceContext{}) | ||
otel.SetTextMapPropagator(propagator) | ||
|
||
// Sample metric instruments | ||
fooKey := label.Key("ex.com/foo") | ||
barKey := label.Key("ex.com/bar") | ||
lemonsKey := label.Key("ex.com/lemons") | ||
anotherKey := label.Key("ex.com/another") | ||
|
||
commonLabels := []label.KeyValue{lemonsKey.Int(10), label.String("A", "1"), label.String("B", "2"), label.String("C", "3")} | ||
|
||
meter := otel.Meter("ex.com/basic") | ||
|
||
observerCallback := func(_ context.Context, result metric.Float64ObserverResult) { | ||
result.Observe(1, commonLabels...) | ||
} | ||
_ = metric.Must(meter).NewFloat64ValueObserver("ex.com.one", observerCallback, | ||
metric.WithDescription("A ValueObserver set to 1.0"), | ||
) | ||
|
||
valueRecorder := metric.Must(meter).NewFloat64ValueRecorder("ex.com.two") | ||
|
||
boundRecorder := valueRecorder.Bind(commonLabels...) | ||
defer boundRecorder.Unbind() | ||
|
||
// Create a trace and some measurements | ||
tracer := otel.Tracer("ex.com/basic") | ||
ctx = baggage.ContextWithValues(ctx, | ||
fooKey.String("foo1"), | ||
barKey.String("bar1"), | ||
) | ||
|
||
func(ctx context.Context) { | ||
var span trace.Span | ||
ctx, span = tracer.Start(ctx, "operation") | ||
defer span.End() | ||
|
||
span.AddEvent("Nice operation!", trace.WithAttributes(label.Int("bogons", 100))) | ||
span.SetAttributes(anotherKey.String("yes")) | ||
|
||
meter.RecordBatch( | ||
// Note: call-site variables added as context Entries: | ||
baggage.ContextWithValues(ctx, anotherKey.String("xyz")), | ||
commonLabels, | ||
|
||
valueRecorder.Measurement(2.0), | ||
) | ||
|
||
func(ctx context.Context) { | ||
var span trace.Span | ||
ctx, span = tracer.Start(ctx, "Sub operation...") | ||
defer span.End() | ||
|
||
span.SetAttributes(lemonsKey.String("five")) | ||
span.AddEvent("Sub span event") | ||
boundRecorder.Record(ctx, 1.3) | ||
}(ctx) | ||
}(ctx) | ||
|
||
} |