Skip to content
This repository has been archived by the owner on Jan 22, 2022. It is now read-only.

Commit

Permalink
Merge pull request #44 from RichVanderwal/examples
Browse files Browse the repository at this point in the history
OpenTelemetry simple sample application
  • Loading branch information
RichVanderwal committed Jan 26, 2021
2 parents 7c24e33 + f6f2eb0 commit 79eaa09
Show file tree
Hide file tree
Showing 2 changed files with 148 additions and 0 deletions.
10 changes: 10 additions & 0 deletions examples/simple/go.mod
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
)
138 changes: 138 additions & 0 deletions examples/simple/main.go
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)

}

0 comments on commit 79eaa09

Please sign in to comment.