OpenTelemetry
アプリケーションから送られたトレースやメトリクスをバックエンドに送るデーモン
receiver
collectorにデータを送る口
processor
送られたデータを処理する部分
exporter
処理されたデータを送る先
confmap
config URIはネストできる
code:main_test.go
package main_test
import (
"context"
"strconv"
"testing"
"time"
"go.opentelemetry.io/collector/confmap"
"go.opentelemetry.io/collector/confmap/provider/envprovider"
"go.opentelemetry.io/collector/confmap/provider/fileprovider"
"go.uber.org/zap"
"go.uber.org/zap/zaptest"
)
func TestConfmap(t *testing.T) {
resolver, err := confmap.NewResolver(confmap.ResolverSettings{
URIs: []string{"file:testdata/config.yml"},
Providers: mapstringconfmap.Provider{ "env": envprovider.NewWithSettings(settings(t, "env")),
"file": fileprovider.NewWithSettings(settings(t, "file")),
},
})
if err != nil {
t.Fatal(err)
}
ctx, cancel := context.WithCancel(context.Background())
if deadline, ok := t.Deadline(); ok {
ctx, cancel = context.WithDeadline(ctx, deadline)
}
defer cancel()
now := time.Now().Unix()
t.Logf("timestamp: %d", now)
key := "_TS"
t.Setenv(key, strconv.FormatInt(now, 10))
t.Setenv("CONFIG_NAME", key)
conf, err := resolver.Resolve(ctx)
if err != nil {
t.Fatal(err)
}
m := conf.ToStringMap()
t.Logf("resolved config: %#v", m)
}
func settings(t *testing.T, kind string) confmap.ProviderSettings {
return confmap.ProviderSettings{
Logger: zaptest.NewLogger(t).With(zap.String("kind", kind)),
}
}
span
処理をあらわす単位
propagator
上流の呼び出しから情報 (context) を取り出す仕組み
NewCompositeTextMapPropagator
metrics
Lambda extension (refs) として動かす 普通のランタイムならLambda Layers、コンテナイメージならイメージ内の /opt/extensions 以下にextension APIを喋るバイナリを置く opentelemetry-lambdaはextension APIを喋るバイナリの中でcollector (opentelemetry-collector-contrib) を動かすスクリプト
./collector/ が本体
./collector/lambdacomponents/ にopentelemetry-lambdaに含めるexporterやらの実装が入っている
メンテはopen-telemetry org.
opentelemetry-lambdaにパッチを当ててライブラリのバージョンを変えたりしている
aws-otel-lambdaのexporterには datadogexporter は含まれていない
だったらopentelemetry-lambdaに自分でパッチを当ててビルドすればいい
aws-otel-lambdaはopentelemetry-lambdaにパッチを当てているだけで、実装自体はopentelemetry-lambdaにある
opentelemetry-lambdaのビルドは make -C collector package
collector/build/{collector-config,extensions} をLambdaで動かすコンテナイメージの /opt 以下に置く
/opt/collector-config/config.yaml, /opt/extensions/collector ができあがればOK
opentelemetry-lambdaの collector/lambdacomponents で github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter を追加すればOK
code:collector/lambdacomponents/defaults.go
exporters, err := exporter.MakeFactoryMap(
loggingexporter.NewFactory(),
otlpexporter.NewFactory(),
otlphttpexporter.NewFactory(),
prometheusremotewriteexporter.NewFactory(),
datadogexporter.NewFactory(),
awsxrayexporter.NewFactory(),
)
デフォルトの設定だとDatadog exporterの起動までにめちゃくちゃ時間がかかる (だいたい30sくらい) ので関数本体からトレースを送るまでのあいだにOpenTelemetry collectorがreceiverのlistenを開始できず、OpenTelemetry SDKからの送信が失敗する
issueにあるように exporters.datadog.hostname に適当な値を入れると時間がかかるsource providerの処理をスキップできる ForceFlush() に時間がかかって失敗するので、リトライしまくって成功させようとすると関数の実行に時間がかかってしまう