Closed youngbupark closed 4 years ago
I tried to use opentelemetry-go otlp exporter
+ opentelemetry collector
. The result is same.
package main
import (
"context"
"log"
"time"
"go.opentelemetry.io/otel/api/core"
"go.opentelemetry.io/otel/api/correlation"
"go.opentelemetry.io/otel/api/global"
"go.opentelemetry.io/otel/api/key"
"go.opentelemetry.io/otel/api/metric"
"go.opentelemetry.io/otel/api/trace"
metricstdout "go.opentelemetry.io/otel/exporters/metric/stdout"
"go.opentelemetry.io/otel/exporters/otlp"
"go.opentelemetry.io/otel/sdk/metric/controller/push"
"go.opentelemetry.io/otel/sdk/resource/resourcekeys"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
)
var (
fooKey = key.New("ex.com/foo")
barKey = key.New("ex.com/bar")
lemonsKey = key.New("ex.com/lemons")
anotherKey = key.New("ex.com/another")
)
// initTracer creates and registers trace provider instance.
func initTracer() {
var err error
exp, err := otlp.NewExporter(otlp.WithInsecure(), otlp.WithAddress("localhost:9090"))
if err != nil {
log.Panicf("failed to initialize trace stdout exporter %v", err)
return
}
tp, err := sdktrace.NewProvider(
sdktrace.WithSyncer(exp),
sdktrace.WithConfig(sdktrace.Config{DefaultSampler: sdktrace.AlwaysSample()}),
sdktrace.WithResourceAttributes(key.String(resourcekeys.ServiceKeyName, "trace-demo"), key.String(resourcekeys.ServiceKeyInstanceID, "trace-demo")))
if err != nil {
log.Panicf("failed to initialize trace provider %v", err)
}
global.SetTraceProvider(tp)
}
func initMeter() *push.Controller {
pusher, err := metricstdout.InstallNewPipeline(metricstdout.Config{
Quantiles: []float64{0.5, 0.9, 0.99},
PrettyPrint: false,
})
if err != nil {
log.Panicf("failed to initialize metric stdout exporter %v", err)
}
return pusher
}
func main() {
defer initMeter().Stop()
initTracer()
tracer := global.Tracer("ex.com/basic")
meter := global.Meter("ex.com/basic")
commonLabels := []core.KeyValue{lemonsKey.Int(10), key.String("A", "1"), key.String("B", "2"), key.String("C", "3")}
oneMetricCB := func(result metric.Float64ObserverResult) {
result.Observe(1, commonLabels...)
}
_ = metric.Must(meter).RegisterFloat64Observer("ex.com.one", oneMetricCB,
metric.WithDescription("An observer set to 1.0"),
)
measureTwo := metric.Must(meter).NewFloat64Measure("ex.com.two")
ctx := context.Background()
ctx = correlation.NewContext(ctx,
fooKey.String("foo1"),
barKey.String("bar1"),
)
measure := measureTwo.Bind(commonLabels...)
defer measure.Unbind()
err := tracer.WithSpan(ctx, "operation", func(ctx context.Context) error {
trace.SpanFromContext(ctx).AddEvent(ctx, "Nice operation!", key.New("bogons").Int(100))
trace.SpanFromContext(ctx).SetAttributes(anotherKey.String("yes"))
meter.RecordBatch(
// Note: call-site variables added as context Entries:
correlation.NewContext(ctx, anotherKey.String("xyz")),
commonLabels,
measureTwo.Measurement(2.0),
)
return tracer.WithSpan(
ctx,
"Sub operation...",
func(ctx context.Context) error {
trace.SpanFromContext(ctx).SetAttributes(lemonsKey.String("five"))
trace.SpanFromContext(ctx).AddEvent(ctx, "Sub span event")
measure.Record(ctx, 1.3)
return nil
},
)
})
if err != nil {
panic(err)
}
time.Sleep(time.Minute * 3)
}
This issue seems to be completed.
Collector and SDK version
Problem
azuremonitorexporter does not populate servicename to cloudRole and cloudRoleInstance properties into the envelope, so that application map shows incorrect service name.
The exporter code is supposed to populate the service name, but app insights telemetry doesn't include cloudRole field.
Application map
Test code(See below) uses Jaeger exporter and configure "trace-demo" service name. The expected service name on the bottom of the circle is "trace-demo", but it shows "dapr-dev-insights".
Dependency Telemetry
Configurations
Opentelemetry configuration
Test Code