mirror of https://github.com/docker/cli.git
vendor: upgrade OpenTelemetry to v1.19.0 / v0.45.0
Upgrade to the latest OpenTelemetry libraries; this will unblock a lot of downstream projects in the ecosystem to upgrade, as some of the parts here were pre-1.0/unstable. Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
parent
d49970590c
commit
54c103aff4
10
vendor.mod
10
vendor.mod
|
@ -75,10 +75,12 @@ require (
|
||||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
||||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
||||||
go.etcd.io/etcd/raft/v3 v3.5.6 // indirect
|
go.etcd.io/etcd/raft/v3 v3.5.6 // indirect
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.40.0 // indirect
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 // indirect
|
||||||
go.opentelemetry.io/otel v1.14.0 // indirect
|
go.opentelemetry.io/otel v1.19.0 // indirect
|
||||||
go.opentelemetry.io/otel/metric v0.37.0 // indirect
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 // indirect
|
||||||
go.opentelemetry.io/otel/trace v1.14.0 // indirect
|
go.opentelemetry.io/otel/metric v1.19.0 // indirect
|
||||||
|
go.opentelemetry.io/otel/sdk v1.19.0 // indirect
|
||||||
|
go.opentelemetry.io/otel/trace v1.19.0 // indirect
|
||||||
golang.org/x/crypto v0.14.0 // indirect
|
golang.org/x/crypto v0.14.0 // indirect
|
||||||
golang.org/x/mod v0.11.0 // indirect
|
golang.org/x/mod v0.11.0 // indirect
|
||||||
golang.org/x/net v0.17.0 // indirect
|
golang.org/x/net v0.17.0 // indirect
|
||||||
|
|
31
vendor.sum
31
vendor.sum
|
@ -26,7 +26,7 @@ github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembj
|
||||||
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50=
|
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50=
|
||||||
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o=
|
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o=
|
||||||
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
|
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
|
||||||
github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4=
|
github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
|
||||||
github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
||||||
github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
||||||
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
|
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
|
||||||
|
@ -119,7 +119,7 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3
|
||||||
github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||||
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
|
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
|
||||||
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
|
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0=
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=
|
||||||
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8=
|
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8=
|
||||||
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
|
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
|
@ -273,19 +273,20 @@ github.com/zmap/zlint/v3 v3.1.0 h1:WjVytZo79m/L1+/Mlphl09WBob6YTGljN5IGWZFpAv0=
|
||||||
go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ=
|
go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ=
|
||||||
go.etcd.io/etcd/raft/v3 v3.5.6 h1:tOmx6Ym6rn2GpZOrvTGJZciJHek6RnC3U/zNInzIN50=
|
go.etcd.io/etcd/raft/v3 v3.5.6 h1:tOmx6Ym6rn2GpZOrvTGJZciJHek6RnC3U/zNInzIN50=
|
||||||
go.etcd.io/etcd/raft/v3 v3.5.6/go.mod h1:wL8kkRGx1Hp8FmZUuHfL3K2/OaGIDaXGr1N7i2G07J0=
|
go.etcd.io/etcd/raft/v3 v3.5.6/go.mod h1:wL8kkRGx1Hp8FmZUuHfL3K2/OaGIDaXGr1N7i2G07J0=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.40.0 h1:lE9EJyw3/JhrjWH/hEy9FptnalDQgj7vpbgC2KCCCxE=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 h1:pginetY7+onl4qN1vl0xW/V/v6OBZ0vVdH+esuJgvmM=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.40.0/go.mod h1:pcQ3MM3SWvrA71U4GDqv9UFDJ3HQsW7y5ZO3tDTlUdI=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0/go.mod h1:XiYsayHc36K3EByOO6nbAXnAWbrUxdjUROCEeeROOH8=
|
||||||
go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM=
|
go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=
|
||||||
go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU=
|
go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.14.0 h1:/fXHZHGvro6MVqV34fJzDhi7sHGpX3Ej/Qjmfn003ho=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.14.0 h1:TKf2uAs2ueguzLaxOCBXNpHxfO/aC7PAdDsSH0IbeRQ=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.14.0 h1:3jAYbRHQAqzLjd9I4tzxwJ8Pk/N6AqBcF6m1ZHrxG94=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU=
|
||||||
go.opentelemetry.io/otel/metric v0.37.0 h1:pHDQuLQOZwYD+Km0eb657A25NaRzy0a+eLyKfDXedEs=
|
go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=
|
||||||
go.opentelemetry.io/otel/metric v0.37.0/go.mod h1:DmdaHfGt54iV6UKxsV9slj2bBRJcKC1B1uvDLIioc1s=
|
go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=
|
||||||
go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvxGzY=
|
go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=
|
||||||
go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M=
|
go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=
|
||||||
go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8=
|
go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=
|
||||||
go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw=
|
go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=
|
||||||
|
go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=
|
||||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||||
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
||||||
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
|
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
|
||||||
|
|
|
@ -42,5 +42,5 @@ const (
|
||||||
type Filter func(*http.Request) bool
|
type Filter func(*http.Request) bool
|
||||||
|
|
||||||
func newTracer(tp trace.TracerProvider) trace.Tracer {
|
func newTracer(tp trace.TracerProvider) trace.Tracer {
|
||||||
return tp.Tracer(instrumentationName, trace.WithInstrumentationVersion(SemVersion()))
|
return tp.Tracer(instrumentationName, trace.WithInstrumentationVersion(Version()))
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,6 @@ import (
|
||||||
|
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
"go.opentelemetry.io/otel/metric"
|
"go.opentelemetry.io/otel/metric"
|
||||||
"go.opentelemetry.io/otel/metric/global"
|
|
||||||
"go.opentelemetry.io/otel/propagation"
|
"go.opentelemetry.io/otel/propagation"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
|
@ -65,7 +64,7 @@ func (o optionFunc) apply(c *config) {
|
||||||
func newConfig(opts ...Option) *config {
|
func newConfig(opts ...Option) *config {
|
||||||
c := &config{
|
c := &config{
|
||||||
Propagators: otel.GetTextMapPropagator(),
|
Propagators: otel.GetTextMapPropagator(),
|
||||||
MeterProvider: global.MeterProvider(),
|
MeterProvider: otel.GetMeterProvider(),
|
||||||
}
|
}
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
opt.apply(c)
|
opt.apply(c)
|
||||||
|
@ -78,7 +77,7 @@ func newConfig(opts ...Option) *config {
|
||||||
|
|
||||||
c.Meter = c.MeterProvider.Meter(
|
c.Meter = c.MeterProvider.Meter(
|
||||||
instrumentationName,
|
instrumentationName,
|
||||||
metric.WithInstrumentationVersion(SemVersion()),
|
metric.WithInstrumentationVersion(Version()),
|
||||||
)
|
)
|
||||||
|
|
||||||
return c
|
return c
|
||||||
|
|
16
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/handler.go
generated
vendored
16
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/handler.go
generated
vendored
|
@ -24,7 +24,6 @@ import (
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/metric"
|
"go.opentelemetry.io/otel/metric"
|
||||||
"go.opentelemetry.io/otel/metric/instrument"
|
|
||||||
"go.opentelemetry.io/otel/propagation"
|
"go.opentelemetry.io/otel/propagation"
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
|
||||||
"go.opentelemetry.io/otel/semconv/v1.17.0/httpconv"
|
"go.opentelemetry.io/otel/semconv/v1.17.0/httpconv"
|
||||||
|
@ -50,8 +49,8 @@ type Handler struct {
|
||||||
writeEvent bool
|
writeEvent bool
|
||||||
filters []Filter
|
filters []Filter
|
||||||
spanNameFormatter func(string, *http.Request) string
|
spanNameFormatter func(string, *http.Request) string
|
||||||
counters map[string]instrument.Int64Counter
|
counters map[string]metric.Int64Counter
|
||||||
valueRecorders map[string]instrument.Float64Histogram
|
valueRecorders map[string]metric.Float64Histogram
|
||||||
publicEndpoint bool
|
publicEndpoint bool
|
||||||
publicEndpointFn func(*http.Request) bool
|
publicEndpointFn func(*http.Request) bool
|
||||||
}
|
}
|
||||||
|
@ -101,8 +100,8 @@ func handleErr(err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handler) createMeasures() {
|
func (h *Handler) createMeasures() {
|
||||||
h.counters = make(map[string]instrument.Int64Counter)
|
h.counters = make(map[string]metric.Int64Counter)
|
||||||
h.valueRecorders = make(map[string]instrument.Float64Histogram)
|
h.valueRecorders = make(map[string]metric.Float64Histogram)
|
||||||
|
|
||||||
requestBytesCounter, err := h.meter.Int64Counter(RequestContentLength)
|
requestBytesCounter, err := h.meter.Int64Counter(RequestContentLength)
|
||||||
handleErr(err)
|
handleErr(err)
|
||||||
|
@ -219,13 +218,14 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
if rww.statusCode > 0 {
|
if rww.statusCode > 0 {
|
||||||
attributes = append(attributes, semconv.HTTPStatusCode(rww.statusCode))
|
attributes = append(attributes, semconv.HTTPStatusCode(rww.statusCode))
|
||||||
}
|
}
|
||||||
h.counters[RequestContentLength].Add(ctx, bw.read, attributes...)
|
o := metric.WithAttributes(attributes...)
|
||||||
h.counters[ResponseContentLength].Add(ctx, rww.written, attributes...)
|
h.counters[RequestContentLength].Add(ctx, bw.read, o)
|
||||||
|
h.counters[ResponseContentLength].Add(ctx, rww.written, o)
|
||||||
|
|
||||||
// Use floating point division here for higher precision (instead of Millisecond method).
|
// Use floating point division here for higher precision (instead of Millisecond method).
|
||||||
elapsedTime := float64(time.Since(requestStartTime)) / float64(time.Millisecond)
|
elapsedTime := float64(time.Since(requestStartTime)) / float64(time.Millisecond)
|
||||||
|
|
||||||
h.valueRecorders[ServerLatency].Record(ctx, elapsedTime, attributes...)
|
h.valueRecorders[ServerLatency].Record(ctx, elapsedTime, o)
|
||||||
}
|
}
|
||||||
|
|
||||||
func setAfterServeAttributes(span trace.Span, read, wrote int64, statusCode int, rerr, werr error) {
|
func setAfterServeAttributes(span trace.Span, read, wrote int64, statusCode int, rerr, werr error) {
|
||||||
|
|
6
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/version.go
generated
vendored
6
vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/version.go
generated
vendored
|
@ -16,11 +16,13 @@ package otelhttp // import "go.opentelemetry.io/contrib/instrumentation/net/http
|
||||||
|
|
||||||
// Version is the current release version of the otelhttp instrumentation.
|
// Version is the current release version of the otelhttp instrumentation.
|
||||||
func Version() string {
|
func Version() string {
|
||||||
return "0.40.0"
|
return "0.42.0"
|
||||||
// This string is updated by the pre_release.sh script during release
|
// This string is updated by the pre_release.sh script during release
|
||||||
}
|
}
|
||||||
|
|
||||||
// SemVersion is the semantic version to be supplied to tracer/meter creation.
|
// SemVersion is the semantic version to be supplied to tracer/meter creation.
|
||||||
|
//
|
||||||
|
// Deprecated: Use [Version] instead.
|
||||||
func SemVersion() string {
|
func SemVersion() string {
|
||||||
return "semver:" + Version()
|
return Version()
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,7 @@ func (w *bodyWrapper) Close() error {
|
||||||
var _ http.ResponseWriter = &respWriterWrapper{}
|
var _ http.ResponseWriter = &respWriterWrapper{}
|
||||||
|
|
||||||
// respWriterWrapper wraps a http.ResponseWriter in order to track the number of
|
// respWriterWrapper wraps a http.ResponseWriter in order to track the number of
|
||||||
// bytes written, the last error, and to catch the returned statusCode
|
// bytes written, the last error, and to catch the first written statusCode.
|
||||||
// TODO: The wrapped http.ResponseWriter doesn't implement any of the optional
|
// TODO: The wrapped http.ResponseWriter doesn't implement any of the optional
|
||||||
// types (http.Hijacker, http.Pusher, http.CloseNotifier, http.Flusher, etc)
|
// types (http.Hijacker, http.Pusher, http.CloseNotifier, http.Flusher, etc)
|
||||||
// that may be useful when using it in real life situations.
|
// that may be useful when using it in real life situations.
|
||||||
|
@ -85,11 +85,15 @@ func (w *respWriterWrapper) Write(p []byte) (int, error) {
|
||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WriteHeader persists initial statusCode for span attribution.
|
||||||
|
// All calls to WriteHeader will be propagated to the underlying ResponseWriter
|
||||||
|
// and will persist the statusCode from the first call.
|
||||||
|
// Blocking consecutive calls to WriteHeader alters expected behavior and will
|
||||||
|
// remove warning logs from net/http where developers will notice incorrect handler implementations.
|
||||||
func (w *respWriterWrapper) WriteHeader(statusCode int) {
|
func (w *respWriterWrapper) WriteHeader(statusCode int) {
|
||||||
if w.wroteHeader {
|
if !w.wroteHeader {
|
||||||
return
|
w.wroteHeader = true
|
||||||
|
w.statusCode = statusCode
|
||||||
}
|
}
|
||||||
w.wroteHeader = true
|
|
||||||
w.statusCode = statusCode
|
|
||||||
w.ResponseWriter.WriteHeader(statusCode)
|
w.ResponseWriter.WriteHeader(statusCode)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
ot
|
||||||
|
fo
|
||||||
|
te
|
||||||
|
collison
|
||||||
|
consequentially
|
|
@ -0,0 +1,10 @@
|
||||||
|
# https://github.com/codespell-project/codespell
|
||||||
|
[codespell]
|
||||||
|
builtin = clear,rare,informal
|
||||||
|
check-filenames =
|
||||||
|
check-hidden =
|
||||||
|
ignore-words = .codespellignore
|
||||||
|
interactive = 1
|
||||||
|
skip = .git,go.mod,go.sum,semconv,venv,.tools
|
||||||
|
uri-ignore-words-list = *
|
||||||
|
write =
|
|
@ -2,14 +2,18 @@
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
|
||||||
.tools/
|
.tools/
|
||||||
|
venv/
|
||||||
.idea/
|
.idea/
|
||||||
.vscode/
|
.vscode/
|
||||||
*.iml
|
*.iml
|
||||||
*.so
|
*.so
|
||||||
coverage.*
|
coverage.*
|
||||||
|
go.work
|
||||||
|
go.work.sum
|
||||||
|
|
||||||
gen/
|
gen/
|
||||||
|
|
||||||
|
/example/dice/dice
|
||||||
/example/fib/fib
|
/example/fib/fib
|
||||||
/example/fib/traces.txt
|
/example/fib/traces.txt
|
||||||
/example/jaeger/jaeger
|
/example/jaeger/jaeger
|
||||||
|
|
|
@ -61,30 +61,67 @@ issues:
|
||||||
|
|
||||||
linters-settings:
|
linters-settings:
|
||||||
depguard:
|
depguard:
|
||||||
# Check the list against standard lib.
|
rules:
|
||||||
# Default: false
|
non-tests:
|
||||||
include-go-root: true
|
files:
|
||||||
# A list of packages for the list type specified.
|
- "!$test"
|
||||||
# Default: []
|
- "!**/*test/*.go"
|
||||||
packages:
|
- "!**/internal/matchers/*.go"
|
||||||
- "crypto/md5"
|
deny:
|
||||||
- "crypto/sha1"
|
- pkg: "testing"
|
||||||
- "crypto/**/pkix"
|
- pkg: "github.com/stretchr/testify"
|
||||||
ignore-file-rules:
|
- pkg: "crypto/md5"
|
||||||
- "**/*_test.go"
|
- pkg: "crypto/sha1"
|
||||||
additional-guards:
|
- pkg: "crypto/**/pkix"
|
||||||
# Do not allow testing packages in non-test files.
|
otlp-internal:
|
||||||
- list-type: denylist
|
files:
|
||||||
include-go-root: true
|
- "!**/exporters/otlp/internal/**/*.go"
|
||||||
packages:
|
deny:
|
||||||
- testing
|
- pkg: "go.opentelemetry.io/otel/exporters/otlp/internal"
|
||||||
- github.com/stretchr/testify
|
desc: Do not use cross-module internal packages.
|
||||||
ignore-file-rules:
|
otlptrace-internal:
|
||||||
- "**/*_test.go"
|
files:
|
||||||
- "**/*test/*.go"
|
- "!**/exporters/otlp/otlptrace/*.go"
|
||||||
- "**/internal/matchers/*.go"
|
- "!**/exporters/otlp/otlptrace/internal/**.go"
|
||||||
|
deny:
|
||||||
|
- pkg: "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal"
|
||||||
|
desc: Do not use cross-module internal packages.
|
||||||
|
otlpmetric-internal:
|
||||||
|
files:
|
||||||
|
- "!**/exporters/otlp/otlpmetric/internal/*.go"
|
||||||
|
- "!**/exporters/otlp/otlpmetric/internal/**/*.go"
|
||||||
|
deny:
|
||||||
|
- pkg: "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal"
|
||||||
|
desc: Do not use cross-module internal packages.
|
||||||
|
otel-internal:
|
||||||
|
files:
|
||||||
|
- "**/sdk/*.go"
|
||||||
|
- "**/sdk/**/*.go"
|
||||||
|
- "**/exporters/*.go"
|
||||||
|
- "**/exporters/**/*.go"
|
||||||
|
- "**/schema/*.go"
|
||||||
|
- "**/schema/**/*.go"
|
||||||
|
- "**/metric/*.go"
|
||||||
|
- "**/metric/**/*.go"
|
||||||
|
- "**/bridge/*.go"
|
||||||
|
- "**/bridge/**/*.go"
|
||||||
|
- "**/example/*.go"
|
||||||
|
- "**/example/**/*.go"
|
||||||
|
- "**/trace/*.go"
|
||||||
|
- "**/trace/**/*.go"
|
||||||
|
deny:
|
||||||
|
- pkg: "go.opentelemetry.io/otel/internal$"
|
||||||
|
desc: Do not use cross-module internal packages.
|
||||||
|
- pkg: "go.opentelemetry.io/otel/internal/attribute"
|
||||||
|
desc: Do not use cross-module internal packages.
|
||||||
|
- pkg: "go.opentelemetry.io/otel/internal/internaltest"
|
||||||
|
desc: Do not use cross-module internal packages.
|
||||||
|
- pkg: "go.opentelemetry.io/otel/internal/matchers"
|
||||||
|
desc: Do not use cross-module internal packages.
|
||||||
godot:
|
godot:
|
||||||
exclude:
|
exclude:
|
||||||
|
# Exclude links.
|
||||||
|
- '^ *\[[^]]+\]:'
|
||||||
# Exclude sentence fragments for lists.
|
# Exclude sentence fragments for lists.
|
||||||
- '^[ ]*[-•]'
|
- '^[ ]*[-•]'
|
||||||
# Exclude sentences prefixing a list.
|
# Exclude sentences prefixing a list.
|
||||||
|
@ -111,7 +148,7 @@ linters-settings:
|
||||||
- name: constant-logical-expr
|
- name: constant-logical-expr
|
||||||
disabled: false
|
disabled: false
|
||||||
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#context-as-argument
|
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#context-as-argument
|
||||||
# TODO (#3372) reenable linter when it is compatible. https://github.com/golangci/golangci-lint/issues/3280
|
# TODO (#3372) re-enable linter when it is compatible. https://github.com/golangci/golangci-lint/issues/3280
|
||||||
- name: context-as-argument
|
- name: context-as-argument
|
||||||
disabled: true
|
disabled: true
|
||||||
arguments:
|
arguments:
|
||||||
|
|
|
@ -8,6 +8,360 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [1.19.0/0.42.0/0.0.7] 2023-09-28
|
||||||
|
|
||||||
|
This release contains the first stable release of the OpenTelemetry Go [metric SDK].
|
||||||
|
Our project stability guarantees now apply to the `go.opentelemetry.io/otel/sdk/metric` package.
|
||||||
|
See our [versioning policy](VERSIONING.md) for more information about these stability guarantees.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add the "Roll the dice" getting started application example in `go.opentelemetry.io/otel/example/dice`. (#4539)
|
||||||
|
- The `WithWriter` and `WithPrettyPrint` options to `go.opentelemetry.io/otel/exporters/stdout/stdoutmetric` to set a custom `io.Writer`, and allow displaying the output in human-readable JSON. (#4507)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Allow '/' characters in metric instrument names. (#4501)
|
||||||
|
- The exporter in `go.opentelemetry.io/otel/exporters/stdout/stdoutmetric` does not prettify its output by default anymore. (#4507)
|
||||||
|
- Upgrade `gopkg.io/yaml` from `v2` to `v3` in `go.opentelemetry.io/otel/schema`. (#4535)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- In `go.opentelemetry.op/otel/exporters/prometheus`, don't try to create the Prometheus metric on every `Collect` if we know the scope is invalid. (#4499)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Remove `"go.opentelemetry.io/otel/bridge/opencensus".NewMetricExporter`, which is replaced by `NewMetricProducer`. (#4566)
|
||||||
|
|
||||||
|
## [1.19.0-rc.1/0.42.0-rc.1] 2023-09-14
|
||||||
|
|
||||||
|
This is a release candidate for the v1.19.0/v0.42.0 release.
|
||||||
|
That release is expected to include the `v1` release of the OpenTelemetry Go metric SDK and will provide stability guarantees of that SDK.
|
||||||
|
See our [versioning policy](VERSIONING.md) for more information about these stability guarantees.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Allow '/' characters in metric instrument names. (#4501)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- In `go.opentelemetry.op/otel/exporters/prometheus`, don't try to create the prometheus metric on every `Collect` if we know the scope is invalid. (#4499)
|
||||||
|
|
||||||
|
## [1.18.0/0.41.0/0.0.6] 2023-09-12
|
||||||
|
|
||||||
|
This release drops the compatibility guarantee of [Go 1.19].
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add `WithProducer` option in `go.opentelemetry.op/otel/exporters/prometheus` to restore the ability to register producers on the prometheus exporter's manual reader. (#4473)
|
||||||
|
- Add `IgnoreValue` option in `go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest` to allow ignoring values when comparing metrics. (#4447)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Use a `TestingT` interface instead of `*testing.T` struct in `go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest`. (#4483)
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
- The `NewMetricExporter` in `go.opentelemetry.io/otel/bridge/opencensus` was deprecated in `v0.35.0` (#3541).
|
||||||
|
The deprecation notice format for the function has been corrected to trigger Go documentation and build tooling. (#4470)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Removed the deprecated `go.opentelemetry.io/otel/exporters/jaeger` package. (#4467)
|
||||||
|
- Removed the deprecated `go.opentelemetry.io/otel/example/jaeger` package. (#4467)
|
||||||
|
- Removed the deprecated `go.opentelemetry.io/otel/sdk/metric/aggregation` package. (#4468)
|
||||||
|
- Removed the deprecated internal packages in `go.opentelemetry.io/otel/exporters/otlp` and its sub-packages. (#4469)
|
||||||
|
- Dropped guaranteed support for versions of Go less than 1.20. (#4481)
|
||||||
|
|
||||||
|
## [1.17.0/0.40.0/0.0.5] 2023-08-28
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Export the `ManualReader` struct in `go.opentelemetry.io/otel/sdk/metric`. (#4244)
|
||||||
|
- Export the `PeriodicReader` struct in `go.opentelemetry.io/otel/sdk/metric`. (#4244)
|
||||||
|
- Add support for exponential histogram aggregations.
|
||||||
|
A histogram can be configured as an exponential histogram using a view with `"go.opentelemetry.io/otel/sdk/metric".ExponentialHistogram` as the aggregation. (#4245)
|
||||||
|
- Export the `Exporter` struct in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc`. (#4272)
|
||||||
|
- Export the `Exporter` struct in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#4272)
|
||||||
|
- The exporters in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric` now support the `OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE` environment variable. (#4287)
|
||||||
|
- Add `WithoutCounterSuffixes` option in `go.opentelemetry.io/otel/exporters/prometheus` to disable addition of `_total` suffixes. (#4306)
|
||||||
|
- Add info and debug logging to the metric SDK in `go.opentelemetry.io/otel/sdk/metric`. (#4315)
|
||||||
|
- The `go.opentelemetry.io/otel/semconv/v1.21.0` package.
|
||||||
|
The package contains semantic conventions from the `v1.21.0` version of the OpenTelemetry Semantic Conventions. (#4362)
|
||||||
|
- Accept 201 to 299 HTTP status as success in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp` and `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. (#4365)
|
||||||
|
- Document the `Temporality` and `Aggregation` methods of the `"go.opentelemetry.io/otel/sdk/metric".Exporter"` need to be concurrent safe. (#4381)
|
||||||
|
- Expand the set of units supported by the Prometheus exporter, and don't add unit suffixes if they are already present in `go.opentelemetry.op/otel/exporters/prometheus` (#4374)
|
||||||
|
- Move the `Aggregation` interface and its implementations from `go.opentelemetry.io/otel/sdk/metric/aggregation` to `go.opentelemetry.io/otel/sdk/metric`. (#4435)
|
||||||
|
- The exporters in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric` now support the `OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION` environment variable. (#4437)
|
||||||
|
- Add the `NewAllowKeysFilter` and `NewDenyKeysFilter` functions to `go.opentelemetry.io/otel/attribute` to allow convenient creation of allow-keys and deny-keys filters. (#4444)
|
||||||
|
- Support Go 1.21. (#4463)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Starting from `v1.21.0` of semantic conventions, `go.opentelemetry.io/otel/semconv/{version}/httpconv` and `go.opentelemetry.io/otel/semconv/{version}/netconv` packages will no longer be published. (#4145)
|
||||||
|
- Log duplicate instrument conflict at a warning level instead of info in `go.opentelemetry.io/otel/sdk/metric`. (#4202)
|
||||||
|
- Return an error on the creation of new instruments in `go.opentelemetry.io/otel/sdk/metric` if their name doesn't pass regexp validation. (#4210)
|
||||||
|
- `NewManualReader` in `go.opentelemetry.io/otel/sdk/metric` returns `*ManualReader` instead of `Reader`. (#4244)
|
||||||
|
- `NewPeriodicReader` in `go.opentelemetry.io/otel/sdk/metric` returns `*PeriodicReader` instead of `Reader`. (#4244)
|
||||||
|
- Count the Collect time in the `PeriodicReader` timeout in `go.opentelemetry.io/otel/sdk/metric`. (#4221)
|
||||||
|
- The function `New` in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc` returns `*Exporter` instead of `"go.opentelemetry.io/otel/sdk/metric".Exporter`. (#4272)
|
||||||
|
- The function `New` in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp` returns `*Exporter` instead of `"go.opentelemetry.io/otel/sdk/metric".Exporter`. (#4272)
|
||||||
|
- If an attribute set is omitted from an async callback, the previous value will no longer be exported in `go.opentelemetry.io/otel/sdk/metric`. (#4290)
|
||||||
|
- If an attribute set is observed multiple times in an async callback in `go.opentelemetry.io/otel/sdk/metric`, the values will be summed instead of the last observation winning. (#4289)
|
||||||
|
- Allow the explicit bucket histogram aggregation to be used for the up-down counter, observable counter, observable up-down counter, and observable gauge in the `go.opentelemetry.io/otel/sdk/metric` package. (#4332)
|
||||||
|
- Restrict `Meter`s in `go.opentelemetry.io/otel/sdk/metric` to only register and collect instruments it created. (#4333)
|
||||||
|
- `PeriodicReader.Shutdown` and `PeriodicReader.ForceFlush` in `go.opentelemetry.io/otel/sdk/metric` now apply the periodic reader's timeout to the operation if the user provided context does not contain a deadline. (#4356, #4377)
|
||||||
|
- Upgrade all use of `go.opentelemetry.io/otel/semconv` to use `v1.21.0`. (#4408)
|
||||||
|
- Increase instrument name maximum length from 63 to 255 characters in `go.opentelemetry.io/otel/sdk/metric`. (#4434)
|
||||||
|
- Add `go.opentelemetry.op/otel/sdk/metric.WithProducer` as an `Option` for `"go.opentelemetry.io/otel/sdk/metric".NewManualReader` and `"go.opentelemetry.io/otel/sdk/metric".NewPeriodicReader`. (#4346)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Remove `Reader.RegisterProducer` in `go.opentelemetry.io/otel/metric`.
|
||||||
|
Use the added `WithProducer` option instead. (#4346)
|
||||||
|
- Remove `Reader.ForceFlush` in `go.opentelemetry.io/otel/metric`.
|
||||||
|
Notice that `PeriodicReader.ForceFlush` is still available. (#4375)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Correctly format log messages from the `go.opentelemetry.io/otel/exporters/zipkin` exporter. (#4143)
|
||||||
|
- Log an error for calls to `NewView` in `go.opentelemetry.io/otel/sdk/metric` that have empty criteria. (#4307)
|
||||||
|
- Fix `"go.opentelemetry.io/otel/sdk/resource".WithHostID()` to not set an empty `host.id`. (#4317)
|
||||||
|
- Use the instrument identifying fields to cache aggregators and determine duplicate instrument registrations in `go.opentelemetry.io/otel/sdk/metric`. (#4337)
|
||||||
|
- Detect duplicate instruments for case-insensitive names in `go.opentelemetry.io/otel/sdk/metric`. (#4338)
|
||||||
|
- The `ManualReader` will not panic if `AggregationSelector` returns `nil` in `go.opentelemetry.io/otel/sdk/metric`. (#4350)
|
||||||
|
- If a `Reader`'s `AggregationSelector` returns `nil` or `DefaultAggregation` the pipeline will use the default aggregation. (#4350)
|
||||||
|
- Log a suggested view that fixes instrument conflicts in `go.opentelemetry.io/otel/sdk/metric`. (#4349)
|
||||||
|
- Fix possible panic, deadlock and race condition in batch span processor in `go.opentelemetry.io/otel/sdk/trace`. (#4353)
|
||||||
|
- Improve context cancellation handling in batch span processor's `ForceFlush` in `go.opentelemetry.io/otel/sdk/trace`. (#4369)
|
||||||
|
- Decouple `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal` from `go.opentelemetry.io/otel/exporters/otlp/internal` using gotmpl. (#4397, #3846)
|
||||||
|
- Decouple `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/internal` from `go.opentelemetry.io/otel/exporters/otlp/internal` and `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal` using gotmpl. (#4404, #3846)
|
||||||
|
- Decouple `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp/internal` from `go.opentelemetry.io/otel/exporters/otlp/internal` and `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal` using gotmpl. (#4407, #3846)
|
||||||
|
- Decouple `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal` from `go.opentelemetry.io/otel/exporters/otlp/internal` and `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal` using gotmpl. (#4400, #3846)
|
||||||
|
- Decouple `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal` from `go.opentelemetry.io/otel/exporters/otlp/internal` and `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal` using gotmpl. (#4401, #3846)
|
||||||
|
- Do not block the metric SDK when OTLP metric exports are blocked in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc` and `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#3925, #4395)
|
||||||
|
- Do not append `_total` if the counter already has that suffix for the Prometheus exproter in `go.opentelemetry.io/otel/exporter/prometheus`. (#4373)
|
||||||
|
- Fix resource detection data race in `go.opentelemetry.io/otel/sdk/resource`. (#4409)
|
||||||
|
- Use the first-seen instrument name during instrument name conflicts in `go.opentelemetry.io/otel/sdk/metric`. (#4428)
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/jaeger` package is deprecated.
|
||||||
|
OpenTelemetry dropped support for Jaeger exporter in July 2023.
|
||||||
|
Use `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`
|
||||||
|
or `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc` instead. (#4423)
|
||||||
|
- The `go.opentelemetry.io/otel/example/jaeger` package is deprecated. (#4423)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal` package is deprecated. (#4420)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal/oconf` package is deprecated. (#4420)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal/otest` package is deprecated. (#4420)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/internal/transform` package is deprecated. (#4420)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/internal` package is deprecated. (#4421)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/internal/envconfig` package is deprecated. (#4421)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/internal/retry` package is deprecated. (#4421)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal` package is deprecated. (#4425)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/envconfig` package is deprecated. (#4425)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig` package is deprecated. (#4425)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlptracetest` package is deprecated. (#4425)
|
||||||
|
- The `go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/retry` package is deprecated. (#4425)
|
||||||
|
- The `go.opentelemetry.io/otel/sdk/metric/aggregation` package is deprecated.
|
||||||
|
Use the aggregation types added to `go.opentelemetry.io/otel/sdk/metric` instead. (#4435)
|
||||||
|
|
||||||
|
## [1.16.0/0.39.0] 2023-05-18
|
||||||
|
|
||||||
|
This release contains the first stable release of the OpenTelemetry Go [metric API].
|
||||||
|
Our project stability guarantees now apply to the `go.opentelemetry.io/otel/metric` package.
|
||||||
|
See our [versioning policy](VERSIONING.md) for more information about these stability guarantees.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- The `go.opentelemetry.io/otel/semconv/v1.19.0` package.
|
||||||
|
The package contains semantic conventions from the `v1.19.0` version of the OpenTelemetry specification. (#3848)
|
||||||
|
- The `go.opentelemetry.io/otel/semconv/v1.20.0` package.
|
||||||
|
The package contains semantic conventions from the `v1.20.0` version of the OpenTelemetry specification. (#4078)
|
||||||
|
- The Exponential Histogram data types in `go.opentelemetry.io/otel/sdk/metric/metricdata`. (#4165)
|
||||||
|
- OTLP metrics exporter now supports the Exponential Histogram Data Type. (#4222)
|
||||||
|
- Fix serialization of `time.Time` zero values in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc` and `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp` packages. (#4271)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Use `strings.Cut()` instead of `string.SplitN()` for better readability and memory use. (#4049)
|
||||||
|
- `MeterProvider` returns noop meters once it has been shutdown. (#4154)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- The deprecated `go.opentelemetry.io/otel/metric/instrument` package is removed.
|
||||||
|
Use `go.opentelemetry.io/otel/metric` instead. (#4055)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix build for BSD based systems in `go.opentelemetry.io/otel/sdk/resource`. (#4077)
|
||||||
|
|
||||||
|
## [1.16.0-rc.1/0.39.0-rc.1] 2023-05-03
|
||||||
|
|
||||||
|
This is a release candidate for the v1.16.0/v0.39.0 release.
|
||||||
|
That release is expected to include the `v1` release of the OpenTelemetry Go metric API and will provide stability guarantees of that API.
|
||||||
|
See our [versioning policy](VERSIONING.md) for more information about these stability guarantees.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Support global `MeterProvider` in `go.opentelemetry.io/otel`. (#4039)
|
||||||
|
- Use `Meter` for a `metric.Meter` from the global `metric.MeterProvider`.
|
||||||
|
- Use `GetMeterProivder` for a global `metric.MeterProvider`.
|
||||||
|
- Use `SetMeterProivder` to set the global `metric.MeterProvider`.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Move the `go.opentelemetry.io/otel/metric` module to the `stable-v1` module set.
|
||||||
|
This stages the metric API to be released as a stable module. (#4038)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- The `go.opentelemetry.io/otel/metric/global` package is removed.
|
||||||
|
Use `go.opentelemetry.io/otel` instead. (#4039)
|
||||||
|
|
||||||
|
## [1.15.1/0.38.1] 2023-05-02
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Remove unused imports from `sdk/resource/host_id_bsd.go` which caused build failures. (#4040, #4041)
|
||||||
|
|
||||||
|
## [1.15.0/0.38.0] 2023-04-27
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- The `go.opentelemetry.io/otel/metric/embedded` package. (#3916)
|
||||||
|
- The `Version` function to `go.opentelemetry.io/otel/sdk` to return the SDK version. (#3949)
|
||||||
|
- Add a `WithNamespace` option to `go.opentelemetry.io/otel/exporters/prometheus` to allow users to prefix metrics with a namespace. (#3970)
|
||||||
|
- The following configuration types were added to `go.opentelemetry.io/otel/metric/instrument` to be used in the configuration of measurement methods. (#3971)
|
||||||
|
- The `AddConfig` used to hold configuration for addition measurements
|
||||||
|
- `NewAddConfig` used to create a new `AddConfig`
|
||||||
|
- `AddOption` used to configure an `AddConfig`
|
||||||
|
- The `RecordConfig` used to hold configuration for recorded measurements
|
||||||
|
- `NewRecordConfig` used to create a new `RecordConfig`
|
||||||
|
- `RecordOption` used to configure a `RecordConfig`
|
||||||
|
- The `ObserveConfig` used to hold configuration for observed measurements
|
||||||
|
- `NewObserveConfig` used to create a new `ObserveConfig`
|
||||||
|
- `ObserveOption` used to configure an `ObserveConfig`
|
||||||
|
- `WithAttributeSet` and `WithAttributes` are added to `go.opentelemetry.io/otel/metric/instrument`.
|
||||||
|
They return an option used during a measurement that defines the attribute Set associated with the measurement. (#3971)
|
||||||
|
- The `Version` function to `go.opentelemetry.io/otel/exporters/otlp/otlpmetric` to return the OTLP metrics client version. (#3956)
|
||||||
|
- The `Version` function to `go.opentelemetry.io/otel/exporters/otlp/otlptrace` to return the OTLP trace client version. (#3956)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- The `Extrema` in `go.opentelemetry.io/otel/sdk/metric/metricdata` is redefined with a generic argument of `[N int64 | float64]`. (#3870)
|
||||||
|
- Update all exported interfaces from `go.opentelemetry.io/otel/metric` to embed their corresponding interface from `go.opentelemetry.io/otel/metric/embedded`.
|
||||||
|
This adds an implementation requirement to set the interface default behavior for unimplemented methods. (#3916)
|
||||||
|
- Move No-Op implementation from `go.opentelemetry.io/otel/metric` into its own package `go.opentelemetry.io/otel/metric/noop`. (#3941)
|
||||||
|
- `metric.NewNoopMeterProvider` is replaced with `noop.NewMeterProvider`
|
||||||
|
- Add all the methods from `"go.opentelemetry.io/otel/trace".SpanContext` to `bridgeSpanContext` by embedding `otel.SpanContext` in `bridgeSpanContext`. (#3966)
|
||||||
|
- Wrap `UploadMetrics` error in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/` to improve error message when encountering generic grpc errors. (#3974)
|
||||||
|
- The measurement methods for all instruments in `go.opentelemetry.io/otel/metric/instrument` accept an option instead of the variadic `"go.opentelemetry.io/otel/attribute".KeyValue`. (#3971)
|
||||||
|
- The `Int64Counter.Add` method now accepts `...AddOption`
|
||||||
|
- The `Float64Counter.Add` method now accepts `...AddOption`
|
||||||
|
- The `Int64UpDownCounter.Add` method now accepts `...AddOption`
|
||||||
|
- The `Float64UpDownCounter.Add` method now accepts `...AddOption`
|
||||||
|
- The `Int64Histogram.Record` method now accepts `...RecordOption`
|
||||||
|
- The `Float64Histogram.Record` method now accepts `...RecordOption`
|
||||||
|
- The `Int64Observer.Observe` method now accepts `...ObserveOption`
|
||||||
|
- The `Float64Observer.Observe` method now accepts `...ObserveOption`
|
||||||
|
- The `Observer` methods in `go.opentelemetry.io/otel/metric` accept an option instead of the variadic `"go.opentelemetry.io/otel/attribute".KeyValue`. (#3971)
|
||||||
|
- The `Observer.ObserveInt64` method now accepts `...ObserveOption`
|
||||||
|
- The `Observer.ObserveFloat64` method now accepts `...ObserveOption`
|
||||||
|
- Move global metric back to `go.opentelemetry.io/otel/metric/global` from `go.opentelemetry.io/otel`. (#3986)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- `TracerProvider` allows calling `Tracer()` while it's shutting down.
|
||||||
|
It used to deadlock. (#3924)
|
||||||
|
- Use the SDK version for the Telemetry SDK resource detector in `go.opentelemetry.io/otel/sdk/resource`. (#3949)
|
||||||
|
- Fix a data race in `SpanProcessor` returned by `NewSimpleSpanProcessor` in `go.opentelemetry.io/otel/sdk/trace`. (#3951)
|
||||||
|
- Automatically figure out the default aggregation with `aggregation.Default`. (#3967)
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
- The `go.opentelemetry.io/otel/metric/instrument` package is deprecated.
|
||||||
|
Use the equivalent types added to `go.opentelemetry.io/otel/metric` instead. (#4018)
|
||||||
|
|
||||||
|
## [1.15.0-rc.2/0.38.0-rc.2] 2023-03-23
|
||||||
|
|
||||||
|
This is a release candidate for the v1.15.0/v0.38.0 release.
|
||||||
|
That release will include the `v1` release of the OpenTelemetry Go metric API and will provide stability guarantees of that API.
|
||||||
|
See our [versioning policy](VERSIONING.md) for more information about these stability guarantees.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- The `WithHostID` option to `go.opentelemetry.io/otel/sdk/resource`. (#3812)
|
||||||
|
- The `WithoutTimestamps` option to `go.opentelemetry.io/otel/exporters/stdout/stdoutmetric` to sets all timestamps to zero. (#3828)
|
||||||
|
- The new `Exemplar` type is added to `go.opentelemetry.io/otel/sdk/metric/metricdata`.
|
||||||
|
Both the `DataPoint` and `HistogramDataPoint` types from that package have a new field of `Exemplars` containing the sampled exemplars for their timeseries. (#3849)
|
||||||
|
- Configuration for each metric instrument in `go.opentelemetry.io/otel/sdk/metric/instrument`. (#3895)
|
||||||
|
- The internal logging introduces a warning level verbosity equal to `V(1)`. (#3900)
|
||||||
|
- Added a log message warning about usage of `SimpleSpanProcessor` in production environments. (#3854)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Optimize memory allocation when creation a new `Set` using `NewSet` or `NewSetWithFiltered` in `go.opentelemetry.io/otel/attribute`. (#3832)
|
||||||
|
- Optimize memory allocation when creation new metric instruments in `go.opentelemetry.io/otel/sdk/metric`. (#3832)
|
||||||
|
- Avoid creating new objects on all calls to `WithDeferredSetup` and `SkipContextSetup` in OpenTracing bridge. (#3833)
|
||||||
|
- The `New` and `Detect` functions from `go.opentelemetry.io/otel/sdk/resource` return errors that wrap underlying errors instead of just containing the underlying error strings. (#3844)
|
||||||
|
- Both the `Histogram` and `HistogramDataPoint` are redefined with a generic argument of `[N int64 | float64]` in `go.opentelemetry.io/otel/sdk/metric/metricdata`. (#3849)
|
||||||
|
- The metric `Export` interface from `go.opentelemetry.io/otel/sdk/metric` accepts a `*ResourceMetrics` instead of `ResourceMetrics`. (#3853)
|
||||||
|
- Rename `Asynchronous` to `Observable` in `go.opentelemetry.io/otel/metric/instrument`. (#3892)
|
||||||
|
- Rename `Int64ObserverOption` to `Int64ObservableOption` in `go.opentelemetry.io/otel/metric/instrument`. (#3895)
|
||||||
|
- Rename `Float64ObserverOption` to `Float64ObservableOption` in `go.opentelemetry.io/otel/metric/instrument`. (#3895)
|
||||||
|
- The internal logging changes the verbosity level of info to `V(4)`, the verbosity level of debug to `V(8)`. (#3900)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- `TracerProvider` consistently doesn't allow to register a `SpanProcessor` after shutdown. (#3845)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- The deprecated `go.opentelemetry.io/otel/metric/global` package is removed. (#3829)
|
||||||
|
- The unneeded `Synchronous` interface in `go.opentelemetry.io/otel/metric/instrument` was removed. (#3892)
|
||||||
|
- The `Float64ObserverConfig` and `NewFloat64ObserverConfig` in `go.opentelemetry.io/otel/sdk/metric/instrument`.
|
||||||
|
Use the added `float64` instrument configuration instead. (#3895)
|
||||||
|
- The `Int64ObserverConfig` and `NewInt64ObserverConfig` in `go.opentelemetry.io/otel/sdk/metric/instrument`.
|
||||||
|
Use the added `int64` instrument configuration instead. (#3895)
|
||||||
|
- The `NewNoopMeter` function in `go.opentelemetry.io/otel/metric`, use `NewMeterProvider().Meter("")` instead. (#3893)
|
||||||
|
|
||||||
|
## [1.15.0-rc.1/0.38.0-rc.1] 2023-03-01
|
||||||
|
|
||||||
|
This is a release candidate for the v1.15.0/v0.38.0 release.
|
||||||
|
That release will include the `v1` release of the OpenTelemetry Go metric API and will provide stability guarantees of that API.
|
||||||
|
See our [versioning policy](VERSIONING.md) for more information about these stability guarantees.
|
||||||
|
|
||||||
|
This release drops the compatibility guarantee of [Go 1.18].
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Support global `MeterProvider` in `go.opentelemetry.io/otel`. (#3818)
|
||||||
|
- Use `Meter` for a `metric.Meter` from the global `metric.MeterProvider`.
|
||||||
|
- Use `GetMeterProivder` for a global `metric.MeterProvider`.
|
||||||
|
- Use `SetMeterProivder` to set the global `metric.MeterProvider`.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Dropped compatibility testing for [Go 1.18].
|
||||||
|
The project no longer guarantees support for this version of Go. (#3813)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Handle empty environment variable as it they were not set. (#3764)
|
||||||
|
- Clarify the `httpconv` and `netconv` packages in `go.opentelemetry.io/otel/semconv/*` provide tracing semantic conventions. (#3823)
|
||||||
|
- Fix race conditions in `go.opentelemetry.io/otel/exporters/metric/prometheus` that could cause a panic. (#3899)
|
||||||
|
- Fix sending nil `scopeInfo` to metrics channel in `go.opentelemetry.io/otel/exporters/metric/prometheus` that could cause a panic in `github.com/prometheus/client_golang/prometheus`. (#3899)
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
- The `go.opentelemetry.io/otel/metric/global` package is deprecated.
|
||||||
|
Use `go.opentelemetry.io/otel` instead. (#3818)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- The deprecated `go.opentelemetry.io/otel/metric/unit` package is removed. (#3814)
|
||||||
|
|
||||||
## [1.14.0/0.37.0/0.0.4] 2023-02-27
|
## [1.14.0/0.37.0/0.0.4] 2023-02-27
|
||||||
|
|
||||||
This release is the last to support [Go 1.18].
|
This release is the last to support [Go 1.18].
|
||||||
|
@ -121,7 +475,7 @@ The next release will require at least [Go 1.19].
|
||||||
- The `go.opentelemetry.io/otel/semconv/v1.16.0` package.
|
- The `go.opentelemetry.io/otel/semconv/v1.16.0` package.
|
||||||
The package contains semantic conventions from the `v1.16.0` version of the OpenTelemetry specification. (#3579)
|
The package contains semantic conventions from the `v1.16.0` version of the OpenTelemetry specification. (#3579)
|
||||||
- Metric instruments to `go.opentelemetry.io/otel/metric/instrument`.
|
- Metric instruments to `go.opentelemetry.io/otel/metric/instrument`.
|
||||||
These instruments are use as replacements of the depreacted `go.opentelemetry.io/otel/metric/instrument/{asyncfloat64,asyncint64,syncfloat64,syncint64}` packages.(#3575, #3586)
|
These instruments are use as replacements of the deprecated `go.opentelemetry.io/otel/metric/instrument/{asyncfloat64,asyncint64,syncfloat64,syncint64}` packages.(#3575, #3586)
|
||||||
- `Float64ObservableCounter` replaces the `asyncfloat64.Counter`
|
- `Float64ObservableCounter` replaces the `asyncfloat64.Counter`
|
||||||
- `Float64ObservableUpDownCounter` replaces the `asyncfloat64.UpDownCounter`
|
- `Float64ObservableUpDownCounter` replaces the `asyncfloat64.UpDownCounter`
|
||||||
- `Float64ObservableGauge` replaces the `asyncfloat64.Gauge`
|
- `Float64ObservableGauge` replaces the `asyncfloat64.Gauge`
|
||||||
|
@ -144,7 +498,7 @@ The next release will require at least [Go 1.19].
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- Jaeger and Zipkin exporter use `github.com/go-logr/logr` as the logging interface, and add the `WithLogr` option. (#3497, #3500)
|
- Jaeger and Zipkin exporter use `github.com/go-logr/logr` as the logging interface, and add the `WithLogr` option. (#3497, #3500)
|
||||||
- Instrument configuration in `go.opentelemetry.io/otel/metric/instrument` is split into specific options and confguration based on the instrument type. (#3507)
|
- Instrument configuration in `go.opentelemetry.io/otel/metric/instrument` is split into specific options and configuration based on the instrument type. (#3507)
|
||||||
- Use the added `Int64Option` type to configure instruments from `go.opentelemetry.io/otel/metric/instrument/syncint64`.
|
- Use the added `Int64Option` type to configure instruments from `go.opentelemetry.io/otel/metric/instrument/syncint64`.
|
||||||
- Use the added `Float64Option` type to configure instruments from `go.opentelemetry.io/otel/metric/instrument/syncfloat64`.
|
- Use the added `Float64Option` type to configure instruments from `go.opentelemetry.io/otel/metric/instrument/syncfloat64`.
|
||||||
- Use the added `Int64ObserverOption` type to configure instruments from `go.opentelemetry.io/otel/metric/instrument/asyncint64`.
|
- Use the added `Int64ObserverOption` type to configure instruments from `go.opentelemetry.io/otel/metric/instrument/asyncint64`.
|
||||||
|
@ -157,7 +511,7 @@ The next release will require at least [Go 1.19].
|
||||||
- The `Shutdown` method of the `"go.opentelemetry.io/otel/sdk/trace".TracerProvider` releases all computational resources when called the first time. (#3551)
|
- The `Shutdown` method of the `"go.opentelemetry.io/otel/sdk/trace".TracerProvider` releases all computational resources when called the first time. (#3551)
|
||||||
- The `Sampler` returned from `TraceIDRatioBased` `go.opentelemetry.io/otel/sdk/trace` now uses the rightmost bits for sampling decisions.
|
- The `Sampler` returned from `TraceIDRatioBased` `go.opentelemetry.io/otel/sdk/trace` now uses the rightmost bits for sampling decisions.
|
||||||
This fixes random sampling when using ID generators like `xray.IDGenerator` and increasing parity with other language implementations. (#3557)
|
This fixes random sampling when using ID generators like `xray.IDGenerator` and increasing parity with other language implementations. (#3557)
|
||||||
- Errors from `go.opentelemetry.io/otel/exporters/otlp/otlptrace` exporters are wrapped in erros identifying their signal name.
|
- Errors from `go.opentelemetry.io/otel/exporters/otlp/otlptrace` exporters are wrapped in errors identifying their signal name.
|
||||||
Existing users of the exporters attempting to identify specific errors will need to use `errors.Unwrap()` to get the underlying error. (#3516)
|
Existing users of the exporters attempting to identify specific errors will need to use `errors.Unwrap()` to get the underlying error. (#3516)
|
||||||
- Exporters from `go.opentelemetry.io/otel/exporters/otlp` will print the final retryable error message when attempts to retry time out. (#3514)
|
- Exporters from `go.opentelemetry.io/otel/exporters/otlp` will print the final retryable error message when attempts to retry time out. (#3514)
|
||||||
- The instrument kind names in `go.opentelemetry.io/otel/sdk/metric` are updated to match the API. (#3562)
|
- The instrument kind names in `go.opentelemetry.io/otel/sdk/metric` are updated to match the API. (#3562)
|
||||||
|
@ -266,7 +620,7 @@ The next release will require at least [Go 1.19].
|
||||||
- Asynchronous counters (`Counter` and `UpDownCounter`) from the metric SDK now produce delta sums when configured with delta temporality. (#3398)
|
- Asynchronous counters (`Counter` and `UpDownCounter`) from the metric SDK now produce delta sums when configured with delta temporality. (#3398)
|
||||||
- Exported `Status` codes in the `go.opentelemetry.io/otel/exporters/zipkin` exporter are now exported as all upper case values. (#3340)
|
- Exported `Status` codes in the `go.opentelemetry.io/otel/exporters/zipkin` exporter are now exported as all upper case values. (#3340)
|
||||||
- `Aggregation`s from `go.opentelemetry.io/otel/sdk/metric` with no data are not exported. (#3394, #3436)
|
- `Aggregation`s from `go.opentelemetry.io/otel/sdk/metric` with no data are not exported. (#3394, #3436)
|
||||||
- Reenabled Attribute Filters in the Metric SDK. (#3396)
|
- Re-enabled Attribute Filters in the Metric SDK. (#3396)
|
||||||
- Asynchronous callbacks are only called if they are registered with at least one instrument that does not use drop aggragation. (#3408)
|
- Asynchronous callbacks are only called if they are registered with at least one instrument that does not use drop aggragation. (#3408)
|
||||||
- Do not report empty partial-success responses in the `go.opentelemetry.io/otel/exporters/otlp` exporters. (#3438, #3432)
|
- Do not report empty partial-success responses in the `go.opentelemetry.io/otel/exporters/otlp` exporters. (#3438, #3432)
|
||||||
- Handle partial success responses in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric` exporters. (#3162, #3440)
|
- Handle partial success responses in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric` exporters. (#3162, #3440)
|
||||||
|
@ -847,7 +1201,7 @@ This release includes an API and SDK for the tracing signal that will comply wit
|
||||||
- Setting the global `ErrorHandler` with `"go.opentelemetry.io/otel".SetErrorHandler` multiple times is now supported. (#2160, #2140)
|
- Setting the global `ErrorHandler` with `"go.opentelemetry.io/otel".SetErrorHandler` multiple times is now supported. (#2160, #2140)
|
||||||
- The `"go.opentelemetry.io/otel/attribute".Any` function now supports `int32` values. (#2169)
|
- The `"go.opentelemetry.io/otel/attribute".Any` function now supports `int32` values. (#2169)
|
||||||
- Multiple calls to `"go.opentelemetry.io/otel/sdk/metric/controller/basic".WithResource()` are handled correctly, and when no resources are provided `"go.opentelemetry.io/otel/sdk/resource".Default()` is used. (#2120)
|
- Multiple calls to `"go.opentelemetry.io/otel/sdk/metric/controller/basic".WithResource()` are handled correctly, and when no resources are provided `"go.opentelemetry.io/otel/sdk/resource".Default()` is used. (#2120)
|
||||||
- The `WithoutTimestamps` option for the `go.opentelemetry.io/otel/exporters/stdout/stdouttrace` exporter causes the exporter to correctly ommit timestamps. (#2195)
|
- The `WithoutTimestamps` option for the `go.opentelemetry.io/otel/exporters/stdout/stdouttrace` exporter causes the exporter to correctly omit timestamps. (#2195)
|
||||||
- Fixed typos in resources.go. (#2201)
|
- Fixed typos in resources.go. (#2201)
|
||||||
|
|
||||||
## [1.0.0-RC2] - 2021-07-26
|
## [1.0.0-RC2] - 2021-07-26
|
||||||
|
@ -1293,7 +1647,7 @@ with major version 0.
|
||||||
- `NewGRPCDriver` function returns a `ProtocolDriver` that maintains a single gRPC connection to the collector. (#1369)
|
- `NewGRPCDriver` function returns a `ProtocolDriver` that maintains a single gRPC connection to the collector. (#1369)
|
||||||
- Added documentation about the project's versioning policy. (#1388)
|
- Added documentation about the project's versioning policy. (#1388)
|
||||||
- Added `NewSplitDriver` for OTLP exporter that allows sending traces and metrics to different endpoints. (#1418)
|
- Added `NewSplitDriver` for OTLP exporter that allows sending traces and metrics to different endpoints. (#1418)
|
||||||
- Added codeql worfklow to GitHub Actions (#1428)
|
- Added codeql workflow to GitHub Actions (#1428)
|
||||||
- Added Gosec workflow to GitHub Actions (#1429)
|
- Added Gosec workflow to GitHub Actions (#1429)
|
||||||
- Add new HTTP driver for OTLP exporter in `exporters/otlp/otlphttp`. Currently it only supports the binary protobuf payloads. (#1420)
|
- Add new HTTP driver for OTLP exporter in `exporters/otlp/otlphttp`. Currently it only supports the binary protobuf payloads. (#1420)
|
||||||
- Add an OpenCensus exporter bridge. (#1444)
|
- Add an OpenCensus exporter bridge. (#1444)
|
||||||
|
@ -2136,7 +2490,7 @@ There is still a possibility of breaking changes.
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- Use stateful batcher on Prometheus exporter fixing regresion introduced in #395. (#428)
|
- Use stateful batcher on Prometheus exporter fixing regression introduced in #395. (#428)
|
||||||
|
|
||||||
## [0.2.1] - 2020-01-08
|
## [0.2.1] - 2020-01-08
|
||||||
|
|
||||||
|
@ -2302,7 +2656,17 @@ It contains api and sdk for trace and meter.
|
||||||
- CircleCI build CI manifest files.
|
- CircleCI build CI manifest files.
|
||||||
- CODEOWNERS file to track owners of this project.
|
- CODEOWNERS file to track owners of this project.
|
||||||
|
|
||||||
[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.14.0...HEAD
|
[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.19.0...HEAD
|
||||||
|
[1.19.0/0.42.0/0.0.7]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.19.0
|
||||||
|
[1.19.0-rc.1/0.42.0-rc.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.19.0-rc.1
|
||||||
|
[1.18.0/0.41.0/0.0.6]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.18.0
|
||||||
|
[1.17.0/0.40.0/0.0.5]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.17.0
|
||||||
|
[1.16.0/0.39.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.16.0
|
||||||
|
[1.16.0-rc.1/0.39.0-rc.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.16.0-rc.1
|
||||||
|
[1.15.1/0.38.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.15.1
|
||||||
|
[1.15.0/0.38.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.15.0
|
||||||
|
[1.15.0-rc.2/0.38.0-rc.2]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.15.0-rc.2
|
||||||
|
[1.15.0-rc.1/0.38.0-rc.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.15.0-rc.1
|
||||||
[1.14.0/0.37.0/0.0.4]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.14.0
|
[1.14.0/0.37.0/0.0.4]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.14.0
|
||||||
[1.13.0/0.36.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.13.0
|
[1.13.0/0.36.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.13.0
|
||||||
[1.12.0/0.35.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.12.0
|
[1.12.0/0.35.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.12.0
|
||||||
|
@ -2367,3 +2731,7 @@ It contains api and sdk for trace and meter.
|
||||||
[Go 1.20]: https://go.dev/doc/go1.20
|
[Go 1.20]: https://go.dev/doc/go1.20
|
||||||
[Go 1.19]: https://go.dev/doc/go1.19
|
[Go 1.19]: https://go.dev/doc/go1.19
|
||||||
[Go 1.18]: https://go.dev/doc/go1.18
|
[Go 1.18]: https://go.dev/doc/go1.18
|
||||||
|
[Go 1.19]: https://go.dev/doc/go1.19
|
||||||
|
|
||||||
|
[metric API]:https://pkg.go.dev/go.opentelemetry.io/otel/metric
|
||||||
|
[metric SDK]:https://pkg.go.dev/go.opentelemetry.io/otel/sdk/metric
|
||||||
|
|
|
@ -12,6 +12,6 @@
|
||||||
# https://help.github.com/en/articles/about-code-owners
|
# https://help.github.com/en/articles/about-code-owners
|
||||||
#
|
#
|
||||||
|
|
||||||
* @jmacd @MrAlias @Aneurysm9 @evantorrie @XSAM @dashpole @MadVikingGod @pellared @hanyuancheung @dmathieu
|
* @MrAlias @Aneurysm9 @evantorrie @XSAM @dashpole @MadVikingGod @pellared @hanyuancheung @dmathieu
|
||||||
|
|
||||||
CODEOWNERS @MrAlias @Aneurysm9 @MadVikingGod
|
CODEOWNERS @MrAlias @MadVikingGod @pellared
|
|
@ -6,7 +6,7 @@ OpenTelemetry
|
||||||
repo for information on this and other language SIGs.
|
repo for information on this and other language SIGs.
|
||||||
|
|
||||||
See the [public meeting
|
See the [public meeting
|
||||||
notes](https://docs.google.com/document/d/1A63zSWX0x2CyCK_LoNhmQC4rqhLpYXJzXbEPDUQ2n6w/edit#heading=h.9tngw7jdwd6b)
|
notes](https://docs.google.com/document/d/1E5e7Ld0NuU1iVvf-42tOBpu2VBBLYnh73GJuITGJTTU/edit)
|
||||||
for a summary description of past meetings. To request edit access,
|
for a summary description of past meetings. To request edit access,
|
||||||
join the meeting or get in touch on
|
join the meeting or get in touch on
|
||||||
[Slack](https://cloud-native.slack.com/archives/C01NPAXACKT).
|
[Slack](https://cloud-native.slack.com/archives/C01NPAXACKT).
|
||||||
|
@ -28,6 +28,11 @@ precommit` - the `precommit` target is the default).
|
||||||
The `precommit` target also fixes the formatting of the code and
|
The `precommit` target also fixes the formatting of the code and
|
||||||
checks the status of the go module files.
|
checks the status of the go module files.
|
||||||
|
|
||||||
|
Additionally, there is a `codespell` target that checks for common
|
||||||
|
typos in the code. It is not run by default, but you can run it
|
||||||
|
manually with `make codespell`. It will set up a virtual environment
|
||||||
|
in `venv` and install `codespell` there.
|
||||||
|
|
||||||
If after running `make precommit` the output of `git status` contains
|
If after running `make precommit` the output of `git status` contains
|
||||||
`nothing to commit, working tree clean` then it means that everything
|
`nothing to commit, working tree clean` then it means that everything
|
||||||
is up-to-date and properly formatted.
|
is up-to-date and properly formatted.
|
||||||
|
@ -94,38 +99,66 @@ request ID to the entry you added to `CHANGELOG.md`.
|
||||||
|
|
||||||
### How to Get PRs Merged
|
### How to Get PRs Merged
|
||||||
|
|
||||||
A PR is considered to be **ready to merge** when:
|
A PR is considered **ready to merge** when:
|
||||||
|
|
||||||
* It has received two approvals from Collaborators/Maintainers (at
|
* It has received two qualified approvals[^1].
|
||||||
different companies). This is not enforced through technical means
|
|
||||||
and a PR may be **ready to merge** with a single approval if the change
|
|
||||||
and its approach have been discussed and consensus reached.
|
|
||||||
* Feedback has been addressed.
|
|
||||||
* Any substantive changes to your PR will require that you clear any prior
|
|
||||||
Approval reviews, this includes changes resulting from other feedback. Unless
|
|
||||||
the approver explicitly stated that their approval will persist across
|
|
||||||
changes it should be assumed that the PR needs their review again. Other
|
|
||||||
project members (e.g. approvers, maintainers) can help with this if there are
|
|
||||||
any questions or if you forget to clear reviews.
|
|
||||||
* It has been open for review for at least one working day. This gives
|
|
||||||
people reasonable time to review.
|
|
||||||
* Trivial changes (typo, cosmetic, doc, etc.) do not have to wait for
|
|
||||||
one day and may be merged with a single Maintainer's approval.
|
|
||||||
* `CHANGELOG.md` has been updated to reflect what has been
|
|
||||||
added, changed, removed, or fixed.
|
|
||||||
* `README.md` has been updated if necessary.
|
|
||||||
* Urgent fix can take exception as long as it has been actively
|
|
||||||
communicated.
|
|
||||||
|
|
||||||
Any Maintainer can merge the PR once it is **ready to merge**.
|
This is not enforced through automation, but needs to be validated by the
|
||||||
|
maintainer merging.
|
||||||
|
* The qualified approvals need to be from [Approver]s/[Maintainer]s
|
||||||
|
affiliated with different companies. Two qualified approvals from
|
||||||
|
[Approver]s or [Maintainer]s affiliated with the same company counts as a
|
||||||
|
single qualified approval.
|
||||||
|
* PRs introducing changes that have already been discussed and consensus
|
||||||
|
reached only need one qualified approval. The discussion and resolution
|
||||||
|
needs to be linked to the PR.
|
||||||
|
* Trivial changes[^2] only need one qualified approval.
|
||||||
|
|
||||||
|
* All feedback has been addressed.
|
||||||
|
* All PR comments and suggestions are resolved.
|
||||||
|
* All GitHub Pull Request reviews with a status of "Request changes" have
|
||||||
|
been addressed. Another review by the objecting reviewer with a different
|
||||||
|
status can be submitted to clear the original review, or the review can be
|
||||||
|
dismissed by a [Maintainer] when the issues from the original review have
|
||||||
|
been addressed.
|
||||||
|
* Any comments or reviews that cannot be resolved between the PR author and
|
||||||
|
reviewers can be submitted to the community [Approver]s and [Maintainer]s
|
||||||
|
during the weekly SIG meeting. If consensus is reached among the
|
||||||
|
[Approver]s and [Maintainer]s during the SIG meeting the objections to the
|
||||||
|
PR may be dismissed or resolved or the PR closed by a [Maintainer].
|
||||||
|
* Any substantive changes to the PR require existing Approval reviews be
|
||||||
|
cleared unless the approver explicitly states that their approval persists
|
||||||
|
across changes. This includes changes resulting from other feedback.
|
||||||
|
[Approver]s and [Maintainer]s can help in clearing reviews and they should
|
||||||
|
be consulted if there are any questions.
|
||||||
|
|
||||||
|
* The PR branch is up to date with the base branch it is merging into.
|
||||||
|
* To ensure this does not block the PR, it should be configured to allow
|
||||||
|
maintainers to update it.
|
||||||
|
|
||||||
|
* It has been open for review for at least one working day. This gives people
|
||||||
|
reasonable time to review.
|
||||||
|
* Trivial changes[^2] do not have to wait for one day and may be merged with
|
||||||
|
a single [Maintainer]'s approval.
|
||||||
|
|
||||||
|
* All required GitHub workflows have succeeded.
|
||||||
|
* Urgent fix can take exception as long as it has been actively communicated
|
||||||
|
among [Maintainer]s.
|
||||||
|
|
||||||
|
Any [Maintainer] can merge the PR once the above criteria have been met.
|
||||||
|
|
||||||
|
[^1]: A qualified approval is a GitHub Pull Request review with "Approve"
|
||||||
|
status from an OpenTelemetry Go [Approver] or [Maintainer].
|
||||||
|
[^2]: Trivial changes include: typo corrections, cosmetic non-substantive
|
||||||
|
changes, documentation corrections or updates, dependency updates, etc.
|
||||||
|
|
||||||
## Design Choices
|
## Design Choices
|
||||||
|
|
||||||
As with other OpenTelemetry clients, opentelemetry-go follows the
|
As with other OpenTelemetry clients, opentelemetry-go follows the
|
||||||
[opentelemetry-specification](https://github.com/open-telemetry/opentelemetry-specification).
|
[OpenTelemetry Specification](https://opentelemetry.io/docs/specs/otel).
|
||||||
|
|
||||||
It's especially valuable to read through the [library
|
It's especially valuable to read through the [library
|
||||||
guidelines](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/library-guidelines.md).
|
guidelines](https://opentelemetry.io/docs/specs/otel/library-guidelines).
|
||||||
|
|
||||||
### Focus on Capabilities, Not Structure Compliance
|
### Focus on Capabilities, Not Structure Compliance
|
||||||
|
|
||||||
|
@ -146,23 +179,23 @@ For a deeper discussion, see
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
Each non-example Go Module should have its own `README.md` containing:
|
Each (non-internal, non-test) package must be documented using
|
||||||
|
[Go Doc Comments](https://go.dev/doc/comment),
|
||||||
|
preferably in a `doc.go` file.
|
||||||
|
|
||||||
- A pkg.go.dev badge which can be generated [here](https://pkg.go.dev/badge/).
|
Prefer using [Examples](https://pkg.go.dev/testing#hdr-Examples)
|
||||||
- Brief description.
|
instead of putting code snippets in Go doc comments.
|
||||||
- Installation instructions (and requirements if applicable).
|
In some cases, you can even create [Testable Examples](https://go.dev/blog/examples).
|
||||||
- Hyperlink to an example. Depending on the component the example can be:
|
|
||||||
- An `example_test.go` like [here](exporters/stdout/stdouttrace/example_test.go).
|
|
||||||
- A sample Go application with its own `README.md`, like [here](example/zipkin).
|
|
||||||
- Additional documentation sections such us:
|
|
||||||
- Configuration,
|
|
||||||
- Contributing,
|
|
||||||
- References.
|
|
||||||
|
|
||||||
[Here](exporters/jaeger/README.md) is an example of a concise `README.md`.
|
You can install and run a "local Go Doc site" in the following way:
|
||||||
|
|
||||||
Moreover, it should be possible to navigate to any `README.md` from the
|
```sh
|
||||||
root `README.md`.
|
go install golang.org/x/pkgsite/cmd/pkgsite@latest
|
||||||
|
pkgsite
|
||||||
|
```
|
||||||
|
|
||||||
|
[`go.opentelemetry.io/otel/metric`](https://pkg.go.dev/go.opentelemetry.io/otel/metric)
|
||||||
|
is an example of a very well-documented package.
|
||||||
|
|
||||||
## Style Guide
|
## Style Guide
|
||||||
|
|
||||||
|
@ -216,7 +249,7 @@ Meaning a `config` from one package should not be directly used by another. The
|
||||||
one exception is the API packages. The configs from the base API, eg.
|
one exception is the API packages. The configs from the base API, eg.
|
||||||
`go.opentelemetry.io/otel/trace.TracerConfig` and
|
`go.opentelemetry.io/otel/trace.TracerConfig` and
|
||||||
`go.opentelemetry.io/otel/metric.InstrumentConfig`, are intended to be consumed
|
`go.opentelemetry.io/otel/metric.InstrumentConfig`, are intended to be consumed
|
||||||
by the SDK therefor it is expected that these are exported.
|
by the SDK therefore it is expected that these are exported.
|
||||||
|
|
||||||
When a config is exported we want to maintain forward and backward
|
When a config is exported we want to maintain forward and backward
|
||||||
compatibility, to achieve this no fields should be exported but should
|
compatibility, to achieve this no fields should be exported but should
|
||||||
|
@ -234,12 +267,12 @@ func newConfig(options ...Option) config {
|
||||||
for _, option := range options {
|
for _, option := range options {
|
||||||
config = option.apply(config)
|
config = option.apply(config)
|
||||||
}
|
}
|
||||||
// Preform any validation here.
|
// Perform any validation here.
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
If validation of the `config` options is also preformed this can return an
|
If validation of the `config` options is also performed this can return an
|
||||||
error as well that is expected to be handled by the instantiation function
|
error as well that is expected to be handled by the instantiation function
|
||||||
or propagated to the user.
|
or propagated to the user.
|
||||||
|
|
||||||
|
@ -438,12 +471,37 @@ their parameters appropriately named.
|
||||||
#### Interface Stability
|
#### Interface Stability
|
||||||
|
|
||||||
All exported stable interfaces that include the following warning in their
|
All exported stable interfaces that include the following warning in their
|
||||||
doumentation are allowed to be extended with additional methods.
|
documentation are allowed to be extended with additional methods.
|
||||||
|
|
||||||
> Warning: methods may be added to this interface in minor releases.
|
> Warning: methods may be added to this interface in minor releases.
|
||||||
|
|
||||||
|
These interfaces are defined by the OpenTelemetry specification and will be
|
||||||
|
updated as the specification evolves.
|
||||||
|
|
||||||
Otherwise, stable interfaces MUST NOT be modified.
|
Otherwise, stable interfaces MUST NOT be modified.
|
||||||
|
|
||||||
|
#### How to Change Specification Interfaces
|
||||||
|
|
||||||
|
When an API change must be made, we will update the SDK with the new method one
|
||||||
|
release before the API change. This will allow the SDK one version before the
|
||||||
|
API change to work seamlessly with the new API.
|
||||||
|
|
||||||
|
If an incompatible version of the SDK is used with the new API the application
|
||||||
|
will fail to compile.
|
||||||
|
|
||||||
|
#### How Not to Change Specification Interfaces
|
||||||
|
|
||||||
|
We have explored using a v2 of the API to change interfaces and found that there
|
||||||
|
was no way to introduce a v2 and have it work seamlessly with the v1 of the API.
|
||||||
|
Problems happened with libraries that upgraded to v2 when an application did not,
|
||||||
|
and would not produce any telemetry.
|
||||||
|
|
||||||
|
More detail of the approaches considered and their limitations can be found in
|
||||||
|
the [Use a V2 API to evolve interfaces](https://github.com/open-telemetry/opentelemetry-go/issues/3920)
|
||||||
|
issue.
|
||||||
|
|
||||||
|
#### How to Change Other Interfaces
|
||||||
|
|
||||||
If new functionality is needed for an interface that cannot be changed it MUST
|
If new functionality is needed for an interface that cannot be changed it MUST
|
||||||
be added by including an additional interface. That added interface can be a
|
be added by including an additional interface. That added interface can be a
|
||||||
simple interface for the specific functionality that you want to add or it can
|
simple interface for the specific functionality that you want to add or it can
|
||||||
|
@ -498,29 +556,65 @@ functionality should be added, each one will need their own super-set
|
||||||
interfaces and will duplicate the pattern. For this reason, the simple targeted
|
interfaces and will duplicate the pattern. For this reason, the simple targeted
|
||||||
interface that defines the specific functionality should be preferred.
|
interface that defines the specific functionality should be preferred.
|
||||||
|
|
||||||
|
### Testing
|
||||||
|
|
||||||
|
The tests should never leak goroutines.
|
||||||
|
|
||||||
|
Use the term `ConcurrentSafe` in the test name when it aims to verify the
|
||||||
|
absence of race conditions.
|
||||||
|
|
||||||
|
### Internal packages
|
||||||
|
|
||||||
|
The use of internal packages should be scoped to a single module. A sub-module
|
||||||
|
should never import from a parent internal package. This creates a coupling
|
||||||
|
between the two modules where a user can upgrade the parent without the child
|
||||||
|
and if the internal package API has changed it will fail to upgrade[^3].
|
||||||
|
|
||||||
|
There are two known exceptions to this rule:
|
||||||
|
|
||||||
|
- `go.opentelemetry.io/otel/internal/global`
|
||||||
|
- This package manages global state for all of opentelemetry-go. It needs to
|
||||||
|
be a single package in order to ensure the uniqueness of the global state.
|
||||||
|
- `go.opentelemetry.io/otel/internal/baggage`
|
||||||
|
- This package provides values in a `context.Context` that need to be
|
||||||
|
recognized by `go.opentelemetry.io/otel/baggage` and
|
||||||
|
`go.opentelemetry.io/otel/bridge/opentracing` but remain private.
|
||||||
|
|
||||||
|
If you have duplicate code in multiple modules, make that code into a Go
|
||||||
|
template stored in `go.opentelemetry.io/otel/internal/shared` and use [gotmpl]
|
||||||
|
to render the templates in the desired locations. See [#4404] for an example of
|
||||||
|
this.
|
||||||
|
|
||||||
|
[^3]: https://github.com/open-telemetry/opentelemetry-go/issues/3548
|
||||||
|
|
||||||
## Approvers and Maintainers
|
## Approvers and Maintainers
|
||||||
|
|
||||||
Approvers:
|
### Approvers
|
||||||
|
|
||||||
- [Evan Torrie](https://github.com/evantorrie), Verizon Media
|
- [Evan Torrie](https://github.com/evantorrie), Verizon Media
|
||||||
- [Josh MacDonald](https://github.com/jmacd), LightStep
|
|
||||||
- [Sam Xie](https://github.com/XSAM), Cisco/AppDynamics
|
- [Sam Xie](https://github.com/XSAM), Cisco/AppDynamics
|
||||||
- [David Ashpole](https://github.com/dashpole), Google
|
- [David Ashpole](https://github.com/dashpole), Google
|
||||||
- [Robert Pająk](https://github.com/pellared), Splunk
|
|
||||||
- [Chester Cheung](https://github.com/hanyuancheung), Tencent
|
- [Chester Cheung](https://github.com/hanyuancheung), Tencent
|
||||||
- [Damien Mathieu](https://github.com/dmathieu), Elastic
|
- [Damien Mathieu](https://github.com/dmathieu), Elastic
|
||||||
|
- [Anthony Mirabella](https://github.com/Aneurysm9), AWS
|
||||||
|
|
||||||
Maintainers:
|
### Maintainers
|
||||||
|
|
||||||
- [Aaron Clawson](https://github.com/MadVikingGod), LightStep
|
- [Aaron Clawson](https://github.com/MadVikingGod), LightStep
|
||||||
- [Anthony Mirabella](https://github.com/Aneurysm9), AWS
|
- [Robert Pająk](https://github.com/pellared), Splunk
|
||||||
- [Tyler Yahn](https://github.com/MrAlias), Splunk
|
- [Tyler Yahn](https://github.com/MrAlias), Splunk
|
||||||
|
|
||||||
Emeritus:
|
### Emeritus
|
||||||
|
|
||||||
- [Gustavo Silva Paiva](https://github.com/paivagustavo), LightStep
|
- [Gustavo Silva Paiva](https://github.com/paivagustavo), LightStep
|
||||||
|
- [Josh MacDonald](https://github.com/jmacd), LightStep
|
||||||
|
|
||||||
### Become an Approver or a Maintainer
|
### Become an Approver or a Maintainer
|
||||||
|
|
||||||
See the [community membership document in OpenTelemetry community
|
See the [community membership document in OpenTelemetry community
|
||||||
repo](https://github.com/open-telemetry/community/blob/main/community-membership.md).
|
repo](https://github.com/open-telemetry/community/blob/main/community-membership.md).
|
||||||
|
|
||||||
|
[Approver]: #approvers
|
||||||
|
[Maintainer]: #maintainers
|
||||||
|
[gotmpl]: https://pkg.go.dev/go.opentelemetry.io/build-tools/gotmpl
|
||||||
|
[#4404]: https://github.com/open-telemetry/opentelemetry-go/pull/4404
|
||||||
|
|
|
@ -25,8 +25,8 @@ TIMEOUT = 60
|
||||||
.DEFAULT_GOAL := precommit
|
.DEFAULT_GOAL := precommit
|
||||||
|
|
||||||
.PHONY: precommit ci
|
.PHONY: precommit ci
|
||||||
precommit: dependabot-generate license-check vanity-import-fix misspell go-mod-tidy golangci-lint-fix test-default
|
precommit: generate dependabot-generate license-check misspell go-mod-tidy golangci-lint-fix test-default
|
||||||
ci: dependabot-check license-check lint vanity-import-check build test-default check-clean-work-tree test-coverage
|
ci: generate dependabot-check license-check lint vanity-import-check build test-default check-clean-work-tree test-coverage
|
||||||
|
|
||||||
# Tools
|
# Tools
|
||||||
|
|
||||||
|
@ -71,21 +71,75 @@ $(TOOLS)/porto: PACKAGE=github.com/jcchavezs/porto/cmd/porto
|
||||||
GOJQ = $(TOOLS)/gojq
|
GOJQ = $(TOOLS)/gojq
|
||||||
$(TOOLS)/gojq: PACKAGE=github.com/itchyny/gojq/cmd/gojq
|
$(TOOLS)/gojq: PACKAGE=github.com/itchyny/gojq/cmd/gojq
|
||||||
|
|
||||||
|
GOTMPL = $(TOOLS)/gotmpl
|
||||||
|
$(GOTMPL): PACKAGE=go.opentelemetry.io/build-tools/gotmpl
|
||||||
|
|
||||||
|
GORELEASE = $(TOOLS)/gorelease
|
||||||
|
$(GORELEASE): PACKAGE=golang.org/x/exp/cmd/gorelease
|
||||||
|
|
||||||
.PHONY: tools
|
.PHONY: tools
|
||||||
tools: $(CROSSLINK) $(DBOTCONF) $(GOLANGCI_LINT) $(MISSPELL) $(GOCOVMERGE) $(STRINGER) $(PORTO) $(GOJQ) $(SEMCONVGEN) $(MULTIMOD) $(SEMCONVKIT)
|
tools: $(CROSSLINK) $(DBOTCONF) $(GOLANGCI_LINT) $(MISSPELL) $(GOCOVMERGE) $(STRINGER) $(PORTO) $(GOJQ) $(SEMCONVGEN) $(MULTIMOD) $(SEMCONVKIT) $(GOTMPL) $(GORELEASE)
|
||||||
|
|
||||||
|
# Virtualized python tools via docker
|
||||||
|
|
||||||
|
# The directory where the virtual environment is created.
|
||||||
|
VENVDIR := venv
|
||||||
|
|
||||||
|
# The directory where the python tools are installed.
|
||||||
|
PYTOOLS := $(VENVDIR)/bin
|
||||||
|
|
||||||
|
# The pip executable in the virtual environment.
|
||||||
|
PIP := $(PYTOOLS)/pip
|
||||||
|
|
||||||
|
# The directory in the docker image where the current directory is mounted.
|
||||||
|
WORKDIR := /workdir
|
||||||
|
|
||||||
|
# The python image to use for the virtual environment.
|
||||||
|
PYTHONIMAGE := python:3.11.3-slim-bullseye
|
||||||
|
|
||||||
|
# Run the python image with the current directory mounted.
|
||||||
|
DOCKERPY := docker run --rm -v "$(CURDIR):$(WORKDIR)" -w $(WORKDIR) $(PYTHONIMAGE)
|
||||||
|
|
||||||
|
# Create a virtual environment for Python tools.
|
||||||
|
$(PYTOOLS):
|
||||||
|
# The `--upgrade` flag is needed to ensure that the virtual environment is
|
||||||
|
# created with the latest pip version.
|
||||||
|
@$(DOCKERPY) bash -c "python3 -m venv $(VENVDIR) && $(PIP) install --upgrade pip"
|
||||||
|
|
||||||
|
# Install python packages into the virtual environment.
|
||||||
|
$(PYTOOLS)/%: | $(PYTOOLS)
|
||||||
|
@$(DOCKERPY) $(PIP) install -r requirements.txt
|
||||||
|
|
||||||
|
CODESPELL = $(PYTOOLS)/codespell
|
||||||
|
$(CODESPELL): PACKAGE=codespell
|
||||||
|
|
||||||
|
# Generate
|
||||||
|
|
||||||
|
.PHONY: generate
|
||||||
|
generate: go-generate vanity-import-fix
|
||||||
|
|
||||||
|
.PHONY: go-generate
|
||||||
|
go-generate: $(OTEL_GO_MOD_DIRS:%=go-generate/%)
|
||||||
|
go-generate/%: DIR=$*
|
||||||
|
go-generate/%: | $(STRINGER) $(GOTMPL)
|
||||||
|
@echo "$(GO) generate $(DIR)/..." \
|
||||||
|
&& cd $(DIR) \
|
||||||
|
&& PATH="$(TOOLS):$${PATH}" $(GO) generate ./...
|
||||||
|
|
||||||
|
.PHONY: vanity-import-fix
|
||||||
|
vanity-import-fix: | $(PORTO)
|
||||||
|
@$(PORTO) --include-internal -w .
|
||||||
|
|
||||||
|
# Generate go.work file for local development.
|
||||||
|
.PHONY: go-work
|
||||||
|
go-work: | $(CROSSLINK)
|
||||||
|
$(CROSSLINK) work --root=$(shell pwd)
|
||||||
|
|
||||||
# Build
|
# Build
|
||||||
|
|
||||||
.PHONY: generate build
|
.PHONY: build
|
||||||
|
|
||||||
generate: $(OTEL_GO_MOD_DIRS:%=generate/%)
|
build: $(OTEL_GO_MOD_DIRS:%=build/%) $(OTEL_GO_MOD_DIRS:%=build-tests/%)
|
||||||
generate/%: DIR=$*
|
|
||||||
generate/%: | $(STRINGER) $(PORTO)
|
|
||||||
@echo "$(GO) generate $(DIR)/..." \
|
|
||||||
&& cd $(DIR) \
|
|
||||||
&& PATH="$(TOOLS):$${PATH}" $(GO) generate ./... && $(PORTO) -w .
|
|
||||||
|
|
||||||
build: generate $(OTEL_GO_MOD_DIRS:%=build/%) $(OTEL_GO_MOD_DIRS:%=build-tests/%)
|
|
||||||
build/%: DIR=$*
|
build/%: DIR=$*
|
||||||
build/%:
|
build/%:
|
||||||
@echo "$(GO) build $(DIR)/..." \
|
@echo "$(GO) build $(DIR)/..." \
|
||||||
|
@ -156,7 +210,7 @@ go-mod-tidy/%: DIR=$*
|
||||||
go-mod-tidy/%: | crosslink
|
go-mod-tidy/%: | crosslink
|
||||||
@echo "$(GO) mod tidy in $(DIR)" \
|
@echo "$(GO) mod tidy in $(DIR)" \
|
||||||
&& cd $(DIR) \
|
&& cd $(DIR) \
|
||||||
&& $(GO) mod tidy -compat=1.18
|
&& $(GO) mod tidy -compat=1.20
|
||||||
|
|
||||||
.PHONY: lint-modules
|
.PHONY: lint-modules
|
||||||
lint-modules: go-mod-tidy
|
lint-modules: go-mod-tidy
|
||||||
|
@ -166,20 +220,20 @@ lint: misspell lint-modules golangci-lint
|
||||||
|
|
||||||
.PHONY: vanity-import-check
|
.PHONY: vanity-import-check
|
||||||
vanity-import-check: | $(PORTO)
|
vanity-import-check: | $(PORTO)
|
||||||
@$(PORTO) --include-internal -l . || echo "(run: make vanity-import-fix)"
|
@$(PORTO) --include-internal -l . || ( echo "(run: make vanity-import-fix)"; exit 1 )
|
||||||
|
|
||||||
.PHONY: vanity-import-fix
|
|
||||||
vanity-import-fix: | $(PORTO)
|
|
||||||
@$(PORTO) --include-internal -w .
|
|
||||||
|
|
||||||
.PHONY: misspell
|
.PHONY: misspell
|
||||||
misspell: | $(MISSPELL)
|
misspell: | $(MISSPELL)
|
||||||
@$(MISSPELL) -w $(ALL_DOCS)
|
@$(MISSPELL) -w $(ALL_DOCS)
|
||||||
|
|
||||||
|
.PHONY: codespell
|
||||||
|
codespell: | $(CODESPELL)
|
||||||
|
@$(DOCKERPY) $(CODESPELL)
|
||||||
|
|
||||||
.PHONY: license-check
|
.PHONY: license-check
|
||||||
license-check:
|
license-check:
|
||||||
@licRes=$$(for f in $$(find . -type f \( -iname '*.go' -o -iname '*.sh' \) ! -path '**/third_party/*' ! -path './.git/*' ) ; do \
|
@licRes=$$(for f in $$(find . -type f \( -iname '*.go' -o -iname '*.sh' \) ! -path '**/third_party/*' ! -path './.git/*' ) ; do \
|
||||||
awk '/Copyright The OpenTelemetry Authors|generated|GENERATED/ && NR<=3 { found=1; next } END { if (!found) print FILENAME }' $$f; \
|
awk '/Copyright The OpenTelemetry Authors|generated|GENERATED/ && NR<=4 { found=1; next } END { if (!found) print FILENAME }' $$f; \
|
||||||
done); \
|
done); \
|
||||||
if [ -n "$${licRes}" ]; then \
|
if [ -n "$${licRes}" ]; then \
|
||||||
echo "license header checking failed:"; echo "$${licRes}"; \
|
echo "license header checking failed:"; echo "$${licRes}"; \
|
||||||
|
@ -189,7 +243,7 @@ license-check:
|
||||||
DEPENDABOT_CONFIG = .github/dependabot.yml
|
DEPENDABOT_CONFIG = .github/dependabot.yml
|
||||||
.PHONY: dependabot-check
|
.PHONY: dependabot-check
|
||||||
dependabot-check: | $(DBOTCONF)
|
dependabot-check: | $(DBOTCONF)
|
||||||
@$(DBOTCONF) verify $(DEPENDABOT_CONFIG) || echo "(run: make dependabot-generate)"
|
@$(DBOTCONF) verify $(DEPENDABOT_CONFIG) || ( echo "(run: make dependabot-generate)"; exit 1 )
|
||||||
|
|
||||||
.PHONY: dependabot-generate
|
.PHONY: dependabot-generate
|
||||||
dependabot-generate: | $(DBOTCONF)
|
dependabot-generate: | $(DBOTCONF)
|
||||||
|
@ -208,13 +262,23 @@ check-clean-work-tree:
|
||||||
SEMCONVPKG ?= "semconv/"
|
SEMCONVPKG ?= "semconv/"
|
||||||
.PHONY: semconv-generate
|
.PHONY: semconv-generate
|
||||||
semconv-generate: | $(SEMCONVGEN) $(SEMCONVKIT)
|
semconv-generate: | $(SEMCONVGEN) $(SEMCONVKIT)
|
||||||
[ "$(TAG)" ] || ( echo "TAG unset: missing opentelemetry specification tag"; exit 1 )
|
[ "$(TAG)" ] || ( echo "TAG unset: missing opentelemetry semantic-conventions tag"; exit 1 )
|
||||||
[ "$(OTEL_SPEC_REPO)" ] || ( echo "OTEL_SPEC_REPO unset: missing path to opentelemetry specification repo"; exit 1 )
|
[ "$(OTEL_SEMCONV_REPO)" ] || ( echo "OTEL_SEMCONV_REPO unset: missing path to opentelemetry semantic-conventions repo"; exit 1 )
|
||||||
$(SEMCONVGEN) -i "$(OTEL_SPEC_REPO)/semantic_conventions/." --only=span -p conventionType=trace -f trace.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
$(SEMCONVGEN) -i "$(OTEL_SEMCONV_REPO)/model/." --only=span -p conventionType=trace -f trace.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
||||||
$(SEMCONVGEN) -i "$(OTEL_SPEC_REPO)/semantic_conventions/." --only=event -p conventionType=event -f event.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
$(SEMCONVGEN) -i "$(OTEL_SEMCONV_REPO)/model/." --only=attribute_group -p conventionType=trace -f attribute_group.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
||||||
$(SEMCONVGEN) -i "$(OTEL_SPEC_REPO)/semantic_conventions/." --only=resource -p conventionType=resource -f resource.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
$(SEMCONVGEN) -i "$(OTEL_SEMCONV_REPO)/model/." --only=event -p conventionType=event -f event.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
||||||
|
$(SEMCONVGEN) -i "$(OTEL_SEMCONV_REPO)/model/." --only=resource -p conventionType=resource -f resource.go -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
||||||
$(SEMCONVKIT) -output "$(SEMCONVPKG)/$(TAG)" -tag "$(TAG)"
|
$(SEMCONVKIT) -output "$(SEMCONVPKG)/$(TAG)" -tag "$(TAG)"
|
||||||
|
|
||||||
|
.PHONY: gorelease
|
||||||
|
gorelease: $(OTEL_GO_MOD_DIRS:%=gorelease/%)
|
||||||
|
gorelease/%: DIR=$*
|
||||||
|
gorelease/%:| $(GORELEASE)
|
||||||
|
@echo "gorelease in $(DIR):" \
|
||||||
|
&& cd $(DIR) \
|
||||||
|
&& $(GORELEASE) \
|
||||||
|
|| echo ""
|
||||||
|
|
||||||
.PHONY: prerelease
|
.PHONY: prerelease
|
||||||
prerelease: | $(MULTIMOD)
|
prerelease: | $(MULTIMOD)
|
||||||
@[ "${MODSET}" ] || ( echo ">> env var MODSET is not set"; exit 1 )
|
@[ "${MODSET}" ] || ( echo ">> env var MODSET is not set"; exit 1 )
|
||||||
|
|
|
@ -11,22 +11,25 @@ It provides a set of APIs to directly measure performance and behavior of your s
|
||||||
|
|
||||||
## Project Status
|
## Project Status
|
||||||
|
|
||||||
| Signal | Status | Project |
|
| Signal | Status | Project |
|
||||||
| ------- | ---------- | ------- |
|
|---------|------------|-----------------------|
|
||||||
| Traces | Stable | N/A |
|
| Traces | Stable | N/A |
|
||||||
| Metrics | Alpha | N/A |
|
| Metrics | Mixed [1] | [Go: Metric SDK (GA)] |
|
||||||
| Logs | Frozen [1] | N/A |
|
| Logs | Frozen [2] | N/A |
|
||||||
|
|
||||||
- [1]: The Logs signal development is halted for this project while we develop both Traces and Metrics.
|
[Go: Metric SDK (GA)]: https://github.com/orgs/open-telemetry/projects/34
|
||||||
|
|
||||||
|
- [1]: [Metrics API](https://pkg.go.dev/go.opentelemetry.io/otel/metric) is Stable. [Metrics SDK](https://pkg.go.dev/go.opentelemetry.io/otel/sdk/metric) is Beta.
|
||||||
|
- [2]: The Logs signal development is halted for this project while we stabilize the Metrics SDK.
|
||||||
No Logs Pull Requests are currently being accepted.
|
No Logs Pull Requests are currently being accepted.
|
||||||
|
|
||||||
Progress and status specific to this repository is tracked in our local
|
Progress and status specific to this repository is tracked in our
|
||||||
[project boards](https://github.com/open-telemetry/opentelemetry-go/projects)
|
[project boards](https://github.com/open-telemetry/opentelemetry-go/projects)
|
||||||
and
|
and
|
||||||
[milestones](https://github.com/open-telemetry/opentelemetry-go/milestones).
|
[milestones](https://github.com/open-telemetry/opentelemetry-go/milestones).
|
||||||
|
|
||||||
Project versioning information and stability guarantees can be found in the
|
Project versioning information and stability guarantees can be found in the
|
||||||
[versioning documentation](./VERSIONING.md).
|
[versioning documentation](VERSIONING.md).
|
||||||
|
|
||||||
### Compatibility
|
### Compatibility
|
||||||
|
|
||||||
|
@ -49,22 +52,17 @@ stop ensuring compatibility with these versions in the following manner:
|
||||||
Currently, this project supports the following environments.
|
Currently, this project supports the following environments.
|
||||||
|
|
||||||
| OS | Go Version | Architecture |
|
| OS | Go Version | Architecture |
|
||||||
| ------- | ---------- | ------------ |
|
|---------|------------|--------------|
|
||||||
|
| Ubuntu | 1.21 | amd64 |
|
||||||
| Ubuntu | 1.20 | amd64 |
|
| Ubuntu | 1.20 | amd64 |
|
||||||
| Ubuntu | 1.19 | amd64 |
|
| Ubuntu | 1.21 | 386 |
|
||||||
| Ubuntu | 1.18 | amd64 |
|
|
||||||
| Ubuntu | 1.20 | 386 |
|
| Ubuntu | 1.20 | 386 |
|
||||||
| Ubuntu | 1.19 | 386 |
|
| MacOS | 1.21 | amd64 |
|
||||||
| Ubuntu | 1.18 | 386 |
|
|
||||||
| MacOS | 1.20 | amd64 |
|
| MacOS | 1.20 | amd64 |
|
||||||
| MacOS | 1.19 | amd64 |
|
| Windows | 1.21 | amd64 |
|
||||||
| MacOS | 1.18 | amd64 |
|
|
||||||
| Windows | 1.20 | amd64 |
|
| Windows | 1.20 | amd64 |
|
||||||
| Windows | 1.19 | amd64 |
|
| Windows | 1.21 | 386 |
|
||||||
| Windows | 1.18 | amd64 |
|
|
||||||
| Windows | 1.20 | 386 |
|
| Windows | 1.20 | 386 |
|
||||||
| Windows | 1.19 | 386 |
|
|
||||||
| Windows | 1.18 | 386 |
|
|
||||||
|
|
||||||
While this project should work for other systems, no compatibility guarantees
|
While this project should work for other systems, no compatibility guarantees
|
||||||
are made for those systems currently.
|
are made for those systems currently.
|
||||||
|
@ -102,12 +100,11 @@ export pipeline to send that telemetry to an observability platform.
|
||||||
All officially supported exporters for the OpenTelemetry project are contained in the [exporters directory](./exporters).
|
All officially supported exporters for the OpenTelemetry project are contained in the [exporters directory](./exporters).
|
||||||
|
|
||||||
| Exporter | Metrics | Traces |
|
| Exporter | Metrics | Traces |
|
||||||
| :-----------------------------------: | :-----: | :----: |
|
|---------------------------------------|:-------:|:------:|
|
||||||
| [Jaeger](./exporters/jaeger/) | | ✓ |
|
| [OTLP](./exporters/otlp/) | ✓ | ✓ |
|
||||||
| [OTLP](./exporters/otlp/) | ✓ | ✓ |
|
| [Prometheus](./exporters/prometheus/) | ✓ | |
|
||||||
| [Prometheus](./exporters/prometheus/) | ✓ | |
|
| [stdout](./exporters/stdout/) | ✓ | ✓ |
|
||||||
| [stdout](./exporters/stdout/) | ✓ | ✓ |
|
| [Zipkin](./exporters/zipkin/) | | ✓ |
|
||||||
| [Zipkin](./exporters/zipkin/) | | ✓ |
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
|
|
|
@ -2,28 +2,30 @@
|
||||||
|
|
||||||
## Semantic Convention Generation
|
## Semantic Convention Generation
|
||||||
|
|
||||||
New versions of the [OpenTelemetry specification] mean new versions of the `semconv` package need to be generated.
|
New versions of the [OpenTelemetry Semantic Conventions] mean new versions of the `semconv` package need to be generated.
|
||||||
The `semconv-generate` make target is used for this.
|
The `semconv-generate` make target is used for this.
|
||||||
|
|
||||||
1. Checkout a local copy of the [OpenTelemetry specification] to the desired release tag.
|
1. Checkout a local copy of the [OpenTelemetry Semantic Conventions] to the desired release tag.
|
||||||
2. Pull the latest `otel/semconvgen` image: `docker pull otel/semconvgen:latest`
|
2. Pull the latest `otel/semconvgen` image: `docker pull otel/semconvgen:latest`
|
||||||
3. Run the `make semconv-generate ...` target from this repository.
|
3. Run the `make semconv-generate ...` target from this repository.
|
||||||
|
|
||||||
For example,
|
For example,
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
export TAG="v1.13.0" # Change to the release version you are generating.
|
export TAG="v1.21.0" # Change to the release version you are generating.
|
||||||
export OTEL_SPEC_REPO="/absolute/path/to/opentelemetry-specification"
|
export OTEL_SEMCONV_REPO="/absolute/path/to/opentelemetry/semantic-conventions"
|
||||||
git -C "$OTEL_SPEC_REPO" checkout "tags/$TAG" -b "$TAG"
|
|
||||||
docker pull otel/semconvgen:latest
|
docker pull otel/semconvgen:latest
|
||||||
make semconv-generate # Uses the exported TAG and OTEL_SPEC_REPO.
|
make semconv-generate # Uses the exported TAG and OTEL_SEMCONV_REPO.
|
||||||
```
|
```
|
||||||
|
|
||||||
This should create a new sub-package of [`semconv`](./semconv).
|
This should create a new sub-package of [`semconv`](./semconv).
|
||||||
Ensure things look correct before submitting a pull request to include the addition.
|
Ensure things look correct before submitting a pull request to include the addition.
|
||||||
|
|
||||||
**Note**, the generation code was changed to generate versions >= 1.13.
|
## Breaking changes validation
|
||||||
To generate versions prior to this, checkout the old release of this repository (i.e. [2fe8861](https://github.com/open-telemetry/opentelemetry-go/commit/2fe8861a24e20088c065b116089862caf9e3cd8b)).
|
|
||||||
|
You can run `make gorelease` that runs [gorelease](https://pkg.go.dev/golang.org/x/exp/cmd/gorelease) to ensure that there are no unwanted changes done in the public API.
|
||||||
|
|
||||||
|
You can check/report problems with `gorelease` [here](https://golang.org/issues/26420).
|
||||||
|
|
||||||
## Pre-Release
|
## Pre-Release
|
||||||
|
|
||||||
|
@ -121,7 +123,17 @@ Once verified be sure to [make a release for the `contrib` repository](https://g
|
||||||
|
|
||||||
### Website Documentation
|
### Website Documentation
|
||||||
|
|
||||||
Update [the documentation](./website_docs) for [the OpenTelemetry website](https://opentelemetry.io/docs/go/).
|
Update the [Go instrumentation documentation] in the OpenTelemetry website under [content/en/docs/instrumentation/go].
|
||||||
Importantly, bump any package versions referenced to be the latest one you just released and ensure all code examples still compile and are accurate.
|
Importantly, bump any package versions referenced to be the latest one you just released and ensure all code examples still compile and are accurate.
|
||||||
|
|
||||||
[OpenTelemetry specification]: https://github.com/open-telemetry/opentelemetry-specification
|
[OpenTelemetry Semantic Conventions]: https://github.com/open-telemetry/semantic-conventions
|
||||||
|
[Go instrumentation documentation]: https://opentelemetry.io/docs/instrumentation/go/
|
||||||
|
[content/en/docs/instrumentation/go]: https://github.com/open-telemetry/opentelemetry.io/tree/main/content/en/docs/instrumentation/go
|
||||||
|
|
||||||
|
### Demo Repository
|
||||||
|
|
||||||
|
Bump the dependencies in the following Go services:
|
||||||
|
|
||||||
|
- [`accountingservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/accountingservice)
|
||||||
|
- [`checkoutservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/checkoutservice)
|
||||||
|
- [`productcatalogservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/productcatalogservice)
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package attribute // import "go.opentelemetry.io/otel/attribute"
|
||||||
|
|
||||||
|
// Filter supports removing certain attributes from attribute sets. When
|
||||||
|
// the filter returns true, the attribute will be kept in the filtered
|
||||||
|
// attribute set. When the filter returns false, the attribute is excluded
|
||||||
|
// from the filtered attribute set, and the attribute instead appears in
|
||||||
|
// the removed list of excluded attributes.
|
||||||
|
type Filter func(KeyValue) bool
|
||||||
|
|
||||||
|
// NewAllowKeysFilter returns a Filter that only allows attributes with one of
|
||||||
|
// the provided keys.
|
||||||
|
//
|
||||||
|
// If keys is empty a deny-all filter is returned.
|
||||||
|
func NewAllowKeysFilter(keys ...Key) Filter {
|
||||||
|
if len(keys) <= 0 {
|
||||||
|
return func(kv KeyValue) bool { return false }
|
||||||
|
}
|
||||||
|
|
||||||
|
allowed := make(map[Key]struct{})
|
||||||
|
for _, k := range keys {
|
||||||
|
allowed[k] = struct{}{}
|
||||||
|
}
|
||||||
|
return func(kv KeyValue) bool {
|
||||||
|
_, ok := allowed[kv.Key]
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDenyKeysFilter returns a Filter that only allows attributes
|
||||||
|
// that do not have one of the provided keys.
|
||||||
|
//
|
||||||
|
// If keys is empty an allow-all filter is returned.
|
||||||
|
func NewDenyKeysFilter(keys ...Key) Filter {
|
||||||
|
if len(keys) <= 0 {
|
||||||
|
return func(kv KeyValue) bool { return true }
|
||||||
|
}
|
||||||
|
|
||||||
|
forbid := make(map[Key]struct{})
|
||||||
|
for _, k := range keys {
|
||||||
|
forbid[k] = struct{}{}
|
||||||
|
}
|
||||||
|
return func(kv KeyValue) bool {
|
||||||
|
_, ok := forbid[kv.Key]
|
||||||
|
return !ok
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,6 +18,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"reflect"
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
|
@ -38,13 +39,6 @@ type (
|
||||||
iface interface{}
|
iface interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Filter supports removing certain attributes from attribute sets. When
|
|
||||||
// the filter returns true, the attribute will be kept in the filtered
|
|
||||||
// attribute set. When the filter returns false, the attribute is excluded
|
|
||||||
// from the filtered attribute set, and the attribute instead appears in
|
|
||||||
// the removed list of excluded attributes.
|
|
||||||
Filter func(KeyValue) bool
|
|
||||||
|
|
||||||
// Sortable implements sort.Interface, used for sorting KeyValue. This is
|
// Sortable implements sort.Interface, used for sorting KeyValue. This is
|
||||||
// an exported type to support a memory optimization. A pointer to one of
|
// an exported type to support a memory optimization. A pointer to one of
|
||||||
// these is needed for the call to sort.Stable(), which the caller may
|
// these is needed for the call to sort.Stable(), which the caller may
|
||||||
|
@ -62,6 +56,12 @@ var (
|
||||||
iface: [0]KeyValue{},
|
iface: [0]KeyValue{},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sortables is a pool of Sortables used to create Sets with a user does
|
||||||
|
// not provide one.
|
||||||
|
sortables = sync.Pool{
|
||||||
|
New: func() interface{} { return new(Sortable) },
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// EmptySet returns a reference to a Set with no elements.
|
// EmptySet returns a reference to a Set with no elements.
|
||||||
|
@ -91,7 +91,7 @@ func (l *Set) Len() int {
|
||||||
|
|
||||||
// Get returns the KeyValue at ordered position idx in this set.
|
// Get returns the KeyValue at ordered position idx in this set.
|
||||||
func (l *Set) Get(idx int) (KeyValue, bool) {
|
func (l *Set) Get(idx int) (KeyValue, bool) {
|
||||||
if l == nil {
|
if l == nil || !l.equivalent.Valid() {
|
||||||
return KeyValue{}, false
|
return KeyValue{}, false
|
||||||
}
|
}
|
||||||
value := l.equivalent.reflectValue()
|
value := l.equivalent.reflectValue()
|
||||||
|
@ -107,7 +107,7 @@ func (l *Set) Get(idx int) (KeyValue, bool) {
|
||||||
|
|
||||||
// Value returns the value of a specified key in this set.
|
// Value returns the value of a specified key in this set.
|
||||||
func (l *Set) Value(k Key) (Value, bool) {
|
func (l *Set) Value(k Key) (Value, bool) {
|
||||||
if l == nil {
|
if l == nil || !l.equivalent.Valid() {
|
||||||
return Value{}, false
|
return Value{}, false
|
||||||
}
|
}
|
||||||
rValue := l.equivalent.reflectValue()
|
rValue := l.equivalent.reflectValue()
|
||||||
|
@ -191,7 +191,9 @@ func NewSet(kvs ...KeyValue) Set {
|
||||||
if len(kvs) == 0 {
|
if len(kvs) == 0 {
|
||||||
return empty()
|
return empty()
|
||||||
}
|
}
|
||||||
s, _ := NewSetWithSortableFiltered(kvs, new(Sortable), nil)
|
srt := sortables.Get().(*Sortable)
|
||||||
|
s, _ := NewSetWithSortableFiltered(kvs, srt, nil)
|
||||||
|
sortables.Put(srt)
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -218,7 +220,10 @@ func NewSetWithFiltered(kvs []KeyValue, filter Filter) (Set, []KeyValue) {
|
||||||
if len(kvs) == 0 {
|
if len(kvs) == 0 {
|
||||||
return empty(), nil
|
return empty(), nil
|
||||||
}
|
}
|
||||||
return NewSetWithSortableFiltered(kvs, new(Sortable), filter)
|
srt := sortables.Get().(*Sortable)
|
||||||
|
s, filtered := NewSetWithSortableFiltered(kvs, srt, filter)
|
||||||
|
sortables.Put(srt)
|
||||||
|
return s, filtered
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSetWithSortableFiltered returns a new Set.
|
// NewSetWithSortableFiltered returns a new Set.
|
||||||
|
|
|
@ -61,11 +61,6 @@ type Property struct {
|
||||||
// hasValue indicates if a zero-value value means the property does not
|
// hasValue indicates if a zero-value value means the property does not
|
||||||
// have a value or if it was the zero-value.
|
// have a value or if it was the zero-value.
|
||||||
hasValue bool
|
hasValue bool
|
||||||
|
|
||||||
// hasData indicates whether the created property contains data or not.
|
|
||||||
// Properties that do not contain data are invalid with no other check
|
|
||||||
// required.
|
|
||||||
hasData bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewKeyProperty returns a new Property for key.
|
// NewKeyProperty returns a new Property for key.
|
||||||
|
@ -76,7 +71,7 @@ func NewKeyProperty(key string) (Property, error) {
|
||||||
return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidKey, key)
|
return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidKey, key)
|
||||||
}
|
}
|
||||||
|
|
||||||
p := Property{key: key, hasData: true}
|
p := Property{key: key}
|
||||||
return p, nil
|
return p, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,7 +90,6 @@ func NewKeyValueProperty(key, value string) (Property, error) {
|
||||||
key: key,
|
key: key,
|
||||||
value: value,
|
value: value,
|
||||||
hasValue: true,
|
hasValue: true,
|
||||||
hasData: true,
|
|
||||||
}
|
}
|
||||||
return p, nil
|
return p, nil
|
||||||
}
|
}
|
||||||
|
@ -117,7 +111,7 @@ func parseProperty(property string) (Property, error) {
|
||||||
return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidProperty, property)
|
return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidProperty, property)
|
||||||
}
|
}
|
||||||
|
|
||||||
p := Property{hasData: true}
|
var p Property
|
||||||
if match[1] != "" {
|
if match[1] != "" {
|
||||||
p.key = match[1]
|
p.key = match[1]
|
||||||
} else {
|
} else {
|
||||||
|
@ -136,10 +130,6 @@ func (p Property) validate() error {
|
||||||
return fmt.Errorf("invalid property: %w", err)
|
return fmt.Errorf("invalid property: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !p.hasData {
|
|
||||||
return errFunc(fmt.Errorf("%w: %q", errInvalidProperty, p))
|
|
||||||
}
|
|
||||||
|
|
||||||
if !keyRe.MatchString(p.key) {
|
if !keyRe.MatchString(p.key) {
|
||||||
return errFunc(fmt.Errorf("%w: %q", errInvalidKey, p.key))
|
return errFunc(fmt.Errorf("%w: %q", errInvalidKey, p.key))
|
||||||
}
|
}
|
||||||
|
@ -289,45 +279,37 @@ func parseMember(member string) (Member, error) {
|
||||||
props properties
|
props properties
|
||||||
)
|
)
|
||||||
|
|
||||||
parts := strings.SplitN(member, propertyDelimiter, 2)
|
keyValue, properties, found := strings.Cut(member, propertyDelimiter)
|
||||||
switch len(parts) {
|
if found {
|
||||||
case 2:
|
|
||||||
// Parse the member properties.
|
// Parse the member properties.
|
||||||
for _, pStr := range strings.Split(parts[1], propertyDelimiter) {
|
for _, pStr := range strings.Split(properties, propertyDelimiter) {
|
||||||
p, err := parseProperty(pStr)
|
p, err := parseProperty(pStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return newInvalidMember(), err
|
return newInvalidMember(), err
|
||||||
}
|
}
|
||||||
props = append(props, p)
|
props = append(props, p)
|
||||||
}
|
}
|
||||||
fallthrough
|
}
|
||||||
case 1:
|
// Parse the member key/value pair.
|
||||||
// Parse the member key/value pair.
|
|
||||||
|
|
||||||
// Take into account a value can contain equal signs (=).
|
// Take into account a value can contain equal signs (=).
|
||||||
kv := strings.SplitN(parts[0], keyValueDelimiter, 2)
|
k, v, found := strings.Cut(keyValue, keyValueDelimiter)
|
||||||
if len(kv) != 2 {
|
if !found {
|
||||||
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidMember, member)
|
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidMember, member)
|
||||||
}
|
}
|
||||||
// "Leading and trailing whitespaces are allowed but MUST be trimmed
|
// "Leading and trailing whitespaces are allowed but MUST be trimmed
|
||||||
// when converting the header into a data structure."
|
// when converting the header into a data structure."
|
||||||
key = strings.TrimSpace(kv[0])
|
key = strings.TrimSpace(k)
|
||||||
var err error
|
var err error
|
||||||
value, err = url.QueryUnescape(strings.TrimSpace(kv[1]))
|
value, err = url.QueryUnescape(strings.TrimSpace(v))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return newInvalidMember(), fmt.Errorf("%w: %q", err, value)
|
return newInvalidMember(), fmt.Errorf("%w: %q", err, value)
|
||||||
}
|
}
|
||||||
if !keyRe.MatchString(key) {
|
if !keyRe.MatchString(key) {
|
||||||
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidKey, key)
|
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidKey, key)
|
||||||
}
|
}
|
||||||
if !valueRe.MatchString(value) {
|
if !valueRe.MatchString(value) {
|
||||||
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidValue, value)
|
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidValue, value)
|
||||||
}
|
|
||||||
default:
|
|
||||||
// This should never happen unless a developer has changed the string
|
|
||||||
// splitting somehow. Panic instead of failing silently and allowing
|
|
||||||
// the bug to slip past the CI checks.
|
|
||||||
panic("failed to parse baggage member")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Member{key: key, value: value, properties: props, hasData: true}, nil
|
return Member{key: key, value: value, properties: props, hasData: true}, nil
|
||||||
|
|
|
@ -16,6 +16,6 @@
|
||||||
Package codes defines the canonical error codes used by OpenTelemetry.
|
Package codes defines the canonical error codes used by OpenTelemetry.
|
||||||
|
|
||||||
It conforms to [the OpenTelemetry
|
It conforms to [the OpenTelemetry
|
||||||
specification](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#statuscanonicalcode).
|
specification](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.20.0/specification/trace/api.md#set-status).
|
||||||
*/
|
*/
|
||||||
package codes // import "go.opentelemetry.io/otel/codes"
|
package codes // import "go.opentelemetry.io/otel/codes"
|
||||||
|
|
|
@ -15,58 +15,16 @@
|
||||||
package otel // import "go.opentelemetry.io/otel"
|
package otel // import "go.opentelemetry.io/otel"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"go.opentelemetry.io/otel/internal/global"
|
||||||
"os"
|
|
||||||
"sync/atomic"
|
|
||||||
"unsafe"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// globalErrorHandler provides an ErrorHandler that can be used
|
// Compile-time check global.ErrDelegator implements ErrorHandler.
|
||||||
// throughout an OpenTelemetry instrumented project. When a user
|
_ ErrorHandler = (*global.ErrDelegator)(nil)
|
||||||
// specified ErrorHandler is registered (`SetErrorHandler`) all calls to
|
// Compile-time check global.ErrLogger implements ErrorHandler.
|
||||||
// `Handle` and will be delegated to the registered ErrorHandler.
|
_ ErrorHandler = (*global.ErrLogger)(nil)
|
||||||
globalErrorHandler = defaultErrorHandler()
|
|
||||||
|
|
||||||
// Compile-time check that delegator implements ErrorHandler.
|
|
||||||
_ ErrorHandler = (*delegator)(nil)
|
|
||||||
// Compile-time check that errLogger implements ErrorHandler.
|
|
||||||
_ ErrorHandler = (*errLogger)(nil)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type delegator struct {
|
|
||||||
delegate unsafe.Pointer
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *delegator) Handle(err error) {
|
|
||||||
d.getDelegate().Handle(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *delegator) getDelegate() ErrorHandler {
|
|
||||||
return *(*ErrorHandler)(atomic.LoadPointer(&d.delegate))
|
|
||||||
}
|
|
||||||
|
|
||||||
// setDelegate sets the ErrorHandler delegate.
|
|
||||||
func (d *delegator) setDelegate(eh ErrorHandler) {
|
|
||||||
atomic.StorePointer(&d.delegate, unsafe.Pointer(&eh))
|
|
||||||
}
|
|
||||||
|
|
||||||
func defaultErrorHandler() *delegator {
|
|
||||||
d := &delegator{}
|
|
||||||
d.setDelegate(&errLogger{l: log.New(os.Stderr, "", log.LstdFlags)})
|
|
||||||
return d
|
|
||||||
}
|
|
||||||
|
|
||||||
// errLogger logs errors if no delegate is set, otherwise they are delegated.
|
|
||||||
type errLogger struct {
|
|
||||||
l *log.Logger
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle logs err if no delegate is set, otherwise it is delegated.
|
|
||||||
func (h *errLogger) Handle(err error) {
|
|
||||||
h.l.Print(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetErrorHandler returns the global ErrorHandler instance.
|
// GetErrorHandler returns the global ErrorHandler instance.
|
||||||
//
|
//
|
||||||
// The default ErrorHandler instance returned will log all errors to STDERR
|
// The default ErrorHandler instance returned will log all errors to STDERR
|
||||||
|
@ -76,9 +34,7 @@ func (h *errLogger) Handle(err error) {
|
||||||
//
|
//
|
||||||
// Subsequent calls to SetErrorHandler after the first will not forward errors
|
// Subsequent calls to SetErrorHandler after the first will not forward errors
|
||||||
// to the new ErrorHandler for prior returned instances.
|
// to the new ErrorHandler for prior returned instances.
|
||||||
func GetErrorHandler() ErrorHandler {
|
func GetErrorHandler() ErrorHandler { return global.GetErrorHandler() }
|
||||||
return globalErrorHandler
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetErrorHandler sets the global ErrorHandler to h.
|
// SetErrorHandler sets the global ErrorHandler to h.
|
||||||
//
|
//
|
||||||
|
@ -86,11 +42,7 @@ func GetErrorHandler() ErrorHandler {
|
||||||
// GetErrorHandler will send errors to h instead of the default logging
|
// GetErrorHandler will send errors to h instead of the default logging
|
||||||
// ErrorHandler. Subsequent calls will set the global ErrorHandler, but not
|
// ErrorHandler. Subsequent calls will set the global ErrorHandler, but not
|
||||||
// delegate errors to h.
|
// delegate errors to h.
|
||||||
func SetErrorHandler(h ErrorHandler) {
|
func SetErrorHandler(h ErrorHandler) { global.SetErrorHandler(h) }
|
||||||
globalErrorHandler.setDelegate(h)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle is a convenience function for ErrorHandler().Handle(err).
|
// Handle is a convenience function for ErrorHandler().Handle(err).
|
||||||
func Handle(err error) {
|
func Handle(err error) { global.Handle(err) }
|
||||||
GetErrorHandler().Handle(err)
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package internal // import "go.opentelemetry.io/otel/internal"
|
||||||
|
|
||||||
|
//go:generate gotmpl --body=./shared/matchers/expectation.go.tmpl "--data={}" --out=matchers/expectation.go
|
||||||
|
//go:generate gotmpl --body=./shared/matchers/expecter.go.tmpl "--data={}" --out=matchers/expecter.go
|
||||||
|
//go:generate gotmpl --body=./shared/matchers/temporal_matcher.go.tmpl "--data={}" --out=matchers/temporal_matcher.go
|
||||||
|
|
||||||
|
//go:generate gotmpl --body=./shared/internaltest/alignment.go.tmpl "--data={}" --out=internaltest/alignment.go
|
||||||
|
//go:generate gotmpl --body=./shared/internaltest/env.go.tmpl "--data={}" --out=internaltest/env.go
|
||||||
|
//go:generate gotmpl --body=./shared/internaltest/env_test.go.tmpl "--data={}" --out=internaltest/env_test.go
|
||||||
|
//go:generate gotmpl --body=./shared/internaltest/errors.go.tmpl "--data={}" --out=internaltest/errors.go
|
||||||
|
//go:generate gotmpl --body=./shared/internaltest/harness.go.tmpl "--data={\"matchersImportPath\": \"go.opentelemetry.io/otel/internal/matchers\"}" --out=internaltest/harness.go
|
||||||
|
//go:generate gotmpl --body=./shared/internaltest/text_map_carrier.go.tmpl "--data={}" --out=internaltest/text_map_carrier.go
|
||||||
|
//go:generate gotmpl --body=./shared/internaltest/text_map_carrier_test.go.tmpl "--data={}" --out=internaltest/text_map_carrier_test.go
|
||||||
|
//go:generate gotmpl --body=./shared/internaltest/text_map_propagator.go.tmpl "--data={}" --out=internaltest/text_map_propagator.go
|
||||||
|
//go:generate gotmpl --body=./shared/internaltest/text_map_propagator_test.go.tmpl "--data={}" --out=internaltest/text_map_propagator_test.go
|
|
@ -0,0 +1,102 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package global // import "go.opentelemetry.io/otel/internal/global"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"sync/atomic"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// GlobalErrorHandler provides an ErrorHandler that can be used
|
||||||
|
// throughout an OpenTelemetry instrumented project. When a user
|
||||||
|
// specified ErrorHandler is registered (`SetErrorHandler`) all calls to
|
||||||
|
// `Handle` and will be delegated to the registered ErrorHandler.
|
||||||
|
GlobalErrorHandler = defaultErrorHandler()
|
||||||
|
|
||||||
|
// Compile-time check that delegator implements ErrorHandler.
|
||||||
|
_ ErrorHandler = (*ErrDelegator)(nil)
|
||||||
|
// Compile-time check that errLogger implements ErrorHandler.
|
||||||
|
_ ErrorHandler = (*ErrLogger)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
|
// ErrorHandler handles irremediable events.
|
||||||
|
type ErrorHandler interface {
|
||||||
|
// Handle handles any error deemed irremediable by an OpenTelemetry
|
||||||
|
// component.
|
||||||
|
Handle(error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type ErrDelegator struct {
|
||||||
|
delegate atomic.Pointer[ErrorHandler]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *ErrDelegator) Handle(err error) {
|
||||||
|
d.getDelegate().Handle(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *ErrDelegator) getDelegate() ErrorHandler {
|
||||||
|
return *d.delegate.Load()
|
||||||
|
}
|
||||||
|
|
||||||
|
// setDelegate sets the ErrorHandler delegate.
|
||||||
|
func (d *ErrDelegator) setDelegate(eh ErrorHandler) {
|
||||||
|
d.delegate.Store(&eh)
|
||||||
|
}
|
||||||
|
|
||||||
|
func defaultErrorHandler() *ErrDelegator {
|
||||||
|
d := &ErrDelegator{}
|
||||||
|
d.setDelegate(&ErrLogger{l: log.New(os.Stderr, "", log.LstdFlags)})
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
|
||||||
|
// ErrLogger logs errors if no delegate is set, otherwise they are delegated.
|
||||||
|
type ErrLogger struct {
|
||||||
|
l *log.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle logs err if no delegate is set, otherwise it is delegated.
|
||||||
|
func (h *ErrLogger) Handle(err error) {
|
||||||
|
h.l.Print(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetErrorHandler returns the global ErrorHandler instance.
|
||||||
|
//
|
||||||
|
// The default ErrorHandler instance returned will log all errors to STDERR
|
||||||
|
// until an override ErrorHandler is set with SetErrorHandler. All
|
||||||
|
// ErrorHandler returned prior to this will automatically forward errors to
|
||||||
|
// the set instance instead of logging.
|
||||||
|
//
|
||||||
|
// Subsequent calls to SetErrorHandler after the first will not forward errors
|
||||||
|
// to the new ErrorHandler for prior returned instances.
|
||||||
|
func GetErrorHandler() ErrorHandler {
|
||||||
|
return GlobalErrorHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetErrorHandler sets the global ErrorHandler to h.
|
||||||
|
//
|
||||||
|
// The first time this is called all ErrorHandler previously returned from
|
||||||
|
// GetErrorHandler will send errors to h instead of the default logging
|
||||||
|
// ErrorHandler. Subsequent calls will set the global ErrorHandler, but not
|
||||||
|
// delegate errors to h.
|
||||||
|
func SetErrorHandler(h ErrorHandler) {
|
||||||
|
GlobalErrorHandler.setDelegate(h)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle is a convenience function for ErrorHandler().Handle(err).
|
||||||
|
func Handle(err error) {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
}
|
|
@ -0,0 +1,359 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package global // import "go.opentelemetry.io/otel/internal/global"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"sync/atomic"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/metric"
|
||||||
|
"go.opentelemetry.io/otel/metric/embedded"
|
||||||
|
)
|
||||||
|
|
||||||
|
// unwrapper unwraps to return the underlying instrument implementation.
|
||||||
|
type unwrapper interface {
|
||||||
|
Unwrap() metric.Observable
|
||||||
|
}
|
||||||
|
|
||||||
|
type afCounter struct {
|
||||||
|
embedded.Float64ObservableCounter
|
||||||
|
metric.Float64Observable
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Float64ObservableCounterOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Float64ObservableCounter
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ unwrapper = (*afCounter)(nil)
|
||||||
|
var _ metric.Float64ObservableCounter = (*afCounter)(nil)
|
||||||
|
|
||||||
|
func (i *afCounter) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Float64ObservableCounter(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *afCounter) Unwrap() metric.Observable {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
return ctr.(metric.Float64ObservableCounter)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type afUpDownCounter struct {
|
||||||
|
embedded.Float64ObservableUpDownCounter
|
||||||
|
metric.Float64Observable
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Float64ObservableUpDownCounterOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Float64ObservableUpDownCounter
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ unwrapper = (*afUpDownCounter)(nil)
|
||||||
|
var _ metric.Float64ObservableUpDownCounter = (*afUpDownCounter)(nil)
|
||||||
|
|
||||||
|
func (i *afUpDownCounter) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Float64ObservableUpDownCounter(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *afUpDownCounter) Unwrap() metric.Observable {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
return ctr.(metric.Float64ObservableUpDownCounter)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type afGauge struct {
|
||||||
|
embedded.Float64ObservableGauge
|
||||||
|
metric.Float64Observable
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Float64ObservableGaugeOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Float64ObservableGauge
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ unwrapper = (*afGauge)(nil)
|
||||||
|
var _ metric.Float64ObservableGauge = (*afGauge)(nil)
|
||||||
|
|
||||||
|
func (i *afGauge) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Float64ObservableGauge(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *afGauge) Unwrap() metric.Observable {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
return ctr.(metric.Float64ObservableGauge)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type aiCounter struct {
|
||||||
|
embedded.Int64ObservableCounter
|
||||||
|
metric.Int64Observable
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Int64ObservableCounterOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Int64ObservableCounter
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ unwrapper = (*aiCounter)(nil)
|
||||||
|
var _ metric.Int64ObservableCounter = (*aiCounter)(nil)
|
||||||
|
|
||||||
|
func (i *aiCounter) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Int64ObservableCounter(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *aiCounter) Unwrap() metric.Observable {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
return ctr.(metric.Int64ObservableCounter)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type aiUpDownCounter struct {
|
||||||
|
embedded.Int64ObservableUpDownCounter
|
||||||
|
metric.Int64Observable
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Int64ObservableUpDownCounterOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Int64ObservableUpDownCounter
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ unwrapper = (*aiUpDownCounter)(nil)
|
||||||
|
var _ metric.Int64ObservableUpDownCounter = (*aiUpDownCounter)(nil)
|
||||||
|
|
||||||
|
func (i *aiUpDownCounter) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Int64ObservableUpDownCounter(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *aiUpDownCounter) Unwrap() metric.Observable {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
return ctr.(metric.Int64ObservableUpDownCounter)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type aiGauge struct {
|
||||||
|
embedded.Int64ObservableGauge
|
||||||
|
metric.Int64Observable
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Int64ObservableGaugeOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Int64ObservableGauge
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ unwrapper = (*aiGauge)(nil)
|
||||||
|
var _ metric.Int64ObservableGauge = (*aiGauge)(nil)
|
||||||
|
|
||||||
|
func (i *aiGauge) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Int64ObservableGauge(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *aiGauge) Unwrap() metric.Observable {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
return ctr.(metric.Int64ObservableGauge)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sync Instruments.
|
||||||
|
type sfCounter struct {
|
||||||
|
embedded.Float64Counter
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Float64CounterOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Float64Counter
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ metric.Float64Counter = (*sfCounter)(nil)
|
||||||
|
|
||||||
|
func (i *sfCounter) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Float64Counter(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *sfCounter) Add(ctx context.Context, incr float64, opts ...metric.AddOption) {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
ctr.(metric.Float64Counter).Add(ctx, incr, opts...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type sfUpDownCounter struct {
|
||||||
|
embedded.Float64UpDownCounter
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Float64UpDownCounterOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Float64UpDownCounter
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ metric.Float64UpDownCounter = (*sfUpDownCounter)(nil)
|
||||||
|
|
||||||
|
func (i *sfUpDownCounter) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Float64UpDownCounter(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *sfUpDownCounter) Add(ctx context.Context, incr float64, opts ...metric.AddOption) {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
ctr.(metric.Float64UpDownCounter).Add(ctx, incr, opts...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type sfHistogram struct {
|
||||||
|
embedded.Float64Histogram
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Float64HistogramOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Float64Histogram
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ metric.Float64Histogram = (*sfHistogram)(nil)
|
||||||
|
|
||||||
|
func (i *sfHistogram) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Float64Histogram(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *sfHistogram) Record(ctx context.Context, x float64, opts ...metric.RecordOption) {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
ctr.(metric.Float64Histogram).Record(ctx, x, opts...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type siCounter struct {
|
||||||
|
embedded.Int64Counter
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Int64CounterOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Int64Counter
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ metric.Int64Counter = (*siCounter)(nil)
|
||||||
|
|
||||||
|
func (i *siCounter) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Int64Counter(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *siCounter) Add(ctx context.Context, x int64, opts ...metric.AddOption) {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
ctr.(metric.Int64Counter).Add(ctx, x, opts...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type siUpDownCounter struct {
|
||||||
|
embedded.Int64UpDownCounter
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Int64UpDownCounterOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Int64UpDownCounter
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ metric.Int64UpDownCounter = (*siUpDownCounter)(nil)
|
||||||
|
|
||||||
|
func (i *siUpDownCounter) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Int64UpDownCounter(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *siUpDownCounter) Add(ctx context.Context, x int64, opts ...metric.AddOption) {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
ctr.(metric.Int64UpDownCounter).Add(ctx, x, opts...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type siHistogram struct {
|
||||||
|
embedded.Int64Histogram
|
||||||
|
|
||||||
|
name string
|
||||||
|
opts []metric.Int64HistogramOption
|
||||||
|
|
||||||
|
delegate atomic.Value //metric.Int64Histogram
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ metric.Int64Histogram = (*siHistogram)(nil)
|
||||||
|
|
||||||
|
func (i *siHistogram) setDelegate(m metric.Meter) {
|
||||||
|
ctr, err := m.Int64Histogram(i.name, i.opts...)
|
||||||
|
if err != nil {
|
||||||
|
GetErrorHandler().Handle(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i.delegate.Store(ctr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *siHistogram) Record(ctx context.Context, x int64, opts ...metric.RecordOption) {
|
||||||
|
if ctr := i.delegate.Load(); ctr != nil {
|
||||||
|
ctr.(metric.Int64Histogram).Record(ctx, x, opts...)
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,17 +18,16 @@ import (
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"unsafe"
|
|
||||||
|
|
||||||
"github.com/go-logr/logr"
|
"github.com/go-logr/logr"
|
||||||
"github.com/go-logr/stdr"
|
"github.com/go-logr/stdr"
|
||||||
)
|
)
|
||||||
|
|
||||||
// globalLogger is the logging interface used within the otel api and sdk provide deatails of the internals.
|
// globalLogger is the logging interface used within the otel api and sdk provide details of the internals.
|
||||||
//
|
//
|
||||||
// The default logger uses stdr which is backed by the standard `log.Logger`
|
// The default logger uses stdr which is backed by the standard `log.Logger`
|
||||||
// interface. This logger will only show messages at the Error Level.
|
// interface. This logger will only show messages at the Error Level.
|
||||||
var globalLogger unsafe.Pointer
|
var globalLogger atomic.Pointer[logr.Logger]
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
SetLogger(stdr.New(log.New(os.Stderr, "", log.LstdFlags|log.Lshortfile)))
|
SetLogger(stdr.New(log.New(os.Stderr, "", log.LstdFlags|log.Lshortfile)))
|
||||||
|
@ -36,20 +35,21 @@ func init() {
|
||||||
|
|
||||||
// SetLogger overrides the globalLogger with l.
|
// SetLogger overrides the globalLogger with l.
|
||||||
//
|
//
|
||||||
// To see Info messages use a logger with `l.V(1).Enabled() == true`
|
// To see Warn messages use a logger with `l.V(1).Enabled() == true`
|
||||||
// To see Debug messages use a logger with `l.V(5).Enabled() == true`.
|
// To see Info messages use a logger with `l.V(4).Enabled() == true`
|
||||||
|
// To see Debug messages use a logger with `l.V(8).Enabled() == true`.
|
||||||
func SetLogger(l logr.Logger) {
|
func SetLogger(l logr.Logger) {
|
||||||
atomic.StorePointer(&globalLogger, unsafe.Pointer(&l))
|
globalLogger.Store(&l)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getLogger() logr.Logger {
|
func getLogger() logr.Logger {
|
||||||
return *(*logr.Logger)(atomic.LoadPointer(&globalLogger))
|
return *globalLogger.Load()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Info prints messages about the general state of the API or SDK.
|
// Info prints messages about the general state of the API or SDK.
|
||||||
// This should usually be less then 5 messages a minute.
|
// This should usually be less than 5 messages a minute.
|
||||||
func Info(msg string, keysAndValues ...interface{}) {
|
func Info(msg string, keysAndValues ...interface{}) {
|
||||||
getLogger().V(1).Info(msg, keysAndValues...)
|
getLogger().V(4).Info(msg, keysAndValues...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error prints messages about exceptional states of the API or SDK.
|
// Error prints messages about exceptional states of the API or SDK.
|
||||||
|
@ -59,5 +59,11 @@ func Error(err error, msg string, keysAndValues ...interface{}) {
|
||||||
|
|
||||||
// Debug prints messages about all internal changes in the API or SDK.
|
// Debug prints messages about all internal changes in the API or SDK.
|
||||||
func Debug(msg string, keysAndValues ...interface{}) {
|
func Debug(msg string, keysAndValues ...interface{}) {
|
||||||
getLogger().V(5).Info(msg, keysAndValues...)
|
getLogger().V(8).Info(msg, keysAndValues...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Warn prints messages about warnings in the API or SDK.
|
||||||
|
// Not an error but is likely more important than an informational event.
|
||||||
|
func Warn(msg string, keysAndValues ...interface{}) {
|
||||||
|
getLogger().V(1).Info(msg, keysAndValues...)
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,16 +12,15 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
package global // import "go.opentelemetry.io/otel/metric/internal/global"
|
package global // import "go.opentelemetry.io/otel/internal/global"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"container/list"
|
"container/list"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel"
|
|
||||||
"go.opentelemetry.io/otel/metric"
|
"go.opentelemetry.io/otel/metric"
|
||||||
"go.opentelemetry.io/otel/metric/instrument"
|
"go.opentelemetry.io/otel/metric/embedded"
|
||||||
)
|
)
|
||||||
|
|
||||||
// meterProvider is a placeholder for a configured SDK MeterProvider.
|
// meterProvider is a placeholder for a configured SDK MeterProvider.
|
||||||
|
@ -29,17 +28,14 @@ import (
|
||||||
// All MeterProvider functionality is forwarded to a delegate once
|
// All MeterProvider functionality is forwarded to a delegate once
|
||||||
// configured.
|
// configured.
|
||||||
type meterProvider struct {
|
type meterProvider struct {
|
||||||
|
embedded.MeterProvider
|
||||||
|
|
||||||
mtx sync.Mutex
|
mtx sync.Mutex
|
||||||
meters map[il]*meter
|
meters map[il]*meter
|
||||||
|
|
||||||
delegate metric.MeterProvider
|
delegate metric.MeterProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
type il struct {
|
|
||||||
name string
|
|
||||||
version string
|
|
||||||
}
|
|
||||||
|
|
||||||
// setDelegate configures p to delegate all MeterProvider functionality to
|
// setDelegate configures p to delegate all MeterProvider functionality to
|
||||||
// provider.
|
// provider.
|
||||||
//
|
//
|
||||||
|
@ -100,6 +96,8 @@ func (p *meterProvider) Meter(name string, opts ...metric.MeterOption) metric.Me
|
||||||
// All Meter functionality is forwarded to a delegate once configured.
|
// All Meter functionality is forwarded to a delegate once configured.
|
||||||
// Otherwise, all functionality is forwarded to a NoopMeter.
|
// Otherwise, all functionality is forwarded to a NoopMeter.
|
||||||
type meter struct {
|
type meter struct {
|
||||||
|
embedded.Meter
|
||||||
|
|
||||||
name string
|
name string
|
||||||
opts []metric.MeterOption
|
opts []metric.MeterOption
|
||||||
|
|
||||||
|
@ -142,7 +140,7 @@ func (m *meter) setDelegate(provider metric.MeterProvider) {
|
||||||
m.registry.Init()
|
m.registry.Init()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Int64Counter(name string, options ...instrument.Int64Option) (instrument.Int64Counter, error) {
|
func (m *meter) Int64Counter(name string, options ...metric.Int64CounterOption) (metric.Int64Counter, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
return del.Int64Counter(name, options...)
|
return del.Int64Counter(name, options...)
|
||||||
}
|
}
|
||||||
|
@ -153,7 +151,7 @@ func (m *meter) Int64Counter(name string, options ...instrument.Int64Option) (in
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Int64UpDownCounter(name string, options ...instrument.Int64Option) (instrument.Int64UpDownCounter, error) {
|
func (m *meter) Int64UpDownCounter(name string, options ...metric.Int64UpDownCounterOption) (metric.Int64UpDownCounter, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
return del.Int64UpDownCounter(name, options...)
|
return del.Int64UpDownCounter(name, options...)
|
||||||
}
|
}
|
||||||
|
@ -164,7 +162,7 @@ func (m *meter) Int64UpDownCounter(name string, options ...instrument.Int64Optio
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Int64Histogram(name string, options ...instrument.Int64Option) (instrument.Int64Histogram, error) {
|
func (m *meter) Int64Histogram(name string, options ...metric.Int64HistogramOption) (metric.Int64Histogram, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
return del.Int64Histogram(name, options...)
|
return del.Int64Histogram(name, options...)
|
||||||
}
|
}
|
||||||
|
@ -175,7 +173,7 @@ func (m *meter) Int64Histogram(name string, options ...instrument.Int64Option) (
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Int64ObservableCounter(name string, options ...instrument.Int64ObserverOption) (instrument.Int64ObservableCounter, error) {
|
func (m *meter) Int64ObservableCounter(name string, options ...metric.Int64ObservableCounterOption) (metric.Int64ObservableCounter, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
return del.Int64ObservableCounter(name, options...)
|
return del.Int64ObservableCounter(name, options...)
|
||||||
}
|
}
|
||||||
|
@ -186,7 +184,7 @@ func (m *meter) Int64ObservableCounter(name string, options ...instrument.Int64O
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Int64ObservableUpDownCounter(name string, options ...instrument.Int64ObserverOption) (instrument.Int64ObservableUpDownCounter, error) {
|
func (m *meter) Int64ObservableUpDownCounter(name string, options ...metric.Int64ObservableUpDownCounterOption) (metric.Int64ObservableUpDownCounter, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
return del.Int64ObservableUpDownCounter(name, options...)
|
return del.Int64ObservableUpDownCounter(name, options...)
|
||||||
}
|
}
|
||||||
|
@ -197,7 +195,7 @@ func (m *meter) Int64ObservableUpDownCounter(name string, options ...instrument.
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Int64ObservableGauge(name string, options ...instrument.Int64ObserverOption) (instrument.Int64ObservableGauge, error) {
|
func (m *meter) Int64ObservableGauge(name string, options ...metric.Int64ObservableGaugeOption) (metric.Int64ObservableGauge, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
return del.Int64ObservableGauge(name, options...)
|
return del.Int64ObservableGauge(name, options...)
|
||||||
}
|
}
|
||||||
|
@ -208,7 +206,7 @@ func (m *meter) Int64ObservableGauge(name string, options ...instrument.Int64Obs
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Float64Counter(name string, options ...instrument.Float64Option) (instrument.Float64Counter, error) {
|
func (m *meter) Float64Counter(name string, options ...metric.Float64CounterOption) (metric.Float64Counter, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
return del.Float64Counter(name, options...)
|
return del.Float64Counter(name, options...)
|
||||||
}
|
}
|
||||||
|
@ -219,7 +217,7 @@ func (m *meter) Float64Counter(name string, options ...instrument.Float64Option)
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Float64UpDownCounter(name string, options ...instrument.Float64Option) (instrument.Float64UpDownCounter, error) {
|
func (m *meter) Float64UpDownCounter(name string, options ...metric.Float64UpDownCounterOption) (metric.Float64UpDownCounter, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
return del.Float64UpDownCounter(name, options...)
|
return del.Float64UpDownCounter(name, options...)
|
||||||
}
|
}
|
||||||
|
@ -230,7 +228,7 @@ func (m *meter) Float64UpDownCounter(name string, options ...instrument.Float64O
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Float64Histogram(name string, options ...instrument.Float64Option) (instrument.Float64Histogram, error) {
|
func (m *meter) Float64Histogram(name string, options ...metric.Float64HistogramOption) (metric.Float64Histogram, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
return del.Float64Histogram(name, options...)
|
return del.Float64Histogram(name, options...)
|
||||||
}
|
}
|
||||||
|
@ -241,7 +239,7 @@ func (m *meter) Float64Histogram(name string, options ...instrument.Float64Optio
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Float64ObservableCounter(name string, options ...instrument.Float64ObserverOption) (instrument.Float64ObservableCounter, error) {
|
func (m *meter) Float64ObservableCounter(name string, options ...metric.Float64ObservableCounterOption) (metric.Float64ObservableCounter, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
return del.Float64ObservableCounter(name, options...)
|
return del.Float64ObservableCounter(name, options...)
|
||||||
}
|
}
|
||||||
|
@ -252,7 +250,7 @@ func (m *meter) Float64ObservableCounter(name string, options ...instrument.Floa
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Float64ObservableUpDownCounter(name string, options ...instrument.Float64ObserverOption) (instrument.Float64ObservableUpDownCounter, error) {
|
func (m *meter) Float64ObservableUpDownCounter(name string, options ...metric.Float64ObservableUpDownCounterOption) (metric.Float64ObservableUpDownCounter, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
return del.Float64ObservableUpDownCounter(name, options...)
|
return del.Float64ObservableUpDownCounter(name, options...)
|
||||||
}
|
}
|
||||||
|
@ -263,7 +261,7 @@ func (m *meter) Float64ObservableUpDownCounter(name string, options ...instrumen
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *meter) Float64ObservableGauge(name string, options ...instrument.Float64ObserverOption) (instrument.Float64ObservableGauge, error) {
|
func (m *meter) Float64ObservableGauge(name string, options ...metric.Float64ObservableGaugeOption) (metric.Float64ObservableGauge, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
return del.Float64ObservableGauge(name, options...)
|
return del.Float64ObservableGauge(name, options...)
|
||||||
}
|
}
|
||||||
|
@ -275,7 +273,7 @@ func (m *meter) Float64ObservableGauge(name string, options ...instrument.Float6
|
||||||
}
|
}
|
||||||
|
|
||||||
// RegisterCallback captures the function that will be called during Collect.
|
// RegisterCallback captures the function that will be called during Collect.
|
||||||
func (m *meter) RegisterCallback(f metric.Callback, insts ...instrument.Asynchronous) (metric.Registration, error) {
|
func (m *meter) RegisterCallback(f metric.Callback, insts ...metric.Observable) (metric.Registration, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
insts = unwrapInstruments(insts)
|
insts = unwrapInstruments(insts)
|
||||||
return del.RegisterCallback(f, insts...)
|
return del.RegisterCallback(f, insts...)
|
||||||
|
@ -296,11 +294,11 @@ func (m *meter) RegisterCallback(f metric.Callback, insts ...instrument.Asynchro
|
||||||
}
|
}
|
||||||
|
|
||||||
type wrapped interface {
|
type wrapped interface {
|
||||||
unwrap() instrument.Asynchronous
|
unwrap() metric.Observable
|
||||||
}
|
}
|
||||||
|
|
||||||
func unwrapInstruments(instruments []instrument.Asynchronous) []instrument.Asynchronous {
|
func unwrapInstruments(instruments []metric.Observable) []metric.Observable {
|
||||||
out := make([]instrument.Asynchronous, 0, len(instruments))
|
out := make([]metric.Observable, 0, len(instruments))
|
||||||
|
|
||||||
for _, inst := range instruments {
|
for _, inst := range instruments {
|
||||||
if in, ok := inst.(wrapped); ok {
|
if in, ok := inst.(wrapped); ok {
|
||||||
|
@ -314,7 +312,9 @@ func unwrapInstruments(instruments []instrument.Asynchronous) []instrument.Async
|
||||||
}
|
}
|
||||||
|
|
||||||
type registration struct {
|
type registration struct {
|
||||||
instruments []instrument.Asynchronous
|
embedded.Registration
|
||||||
|
|
||||||
|
instruments []metric.Observable
|
||||||
function metric.Callback
|
function metric.Callback
|
||||||
|
|
||||||
unreg func() error
|
unreg func() error
|
||||||
|
@ -334,7 +334,7 @@ func (c *registration) setDelegate(m metric.Meter) {
|
||||||
|
|
||||||
reg, err := m.RegisterCallback(c.function, insts...)
|
reg, err := m.RegisterCallback(c.function, insts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
otel.Handle(err)
|
GetErrorHandler().Handle(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.unreg = reg.Unregister
|
c.unreg = reg.Unregister
|
|
@ -19,6 +19,7 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/metric"
|
||||||
"go.opentelemetry.io/otel/propagation"
|
"go.opentelemetry.io/otel/propagation"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
|
@ -31,14 +32,20 @@ type (
|
||||||
propagatorsHolder struct {
|
propagatorsHolder struct {
|
||||||
tm propagation.TextMapPropagator
|
tm propagation.TextMapPropagator
|
||||||
}
|
}
|
||||||
|
|
||||||
|
meterProviderHolder struct {
|
||||||
|
mp metric.MeterProvider
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
globalTracer = defaultTracerValue()
|
globalTracer = defaultTracerValue()
|
||||||
globalPropagators = defaultPropagatorsValue()
|
globalPropagators = defaultPropagatorsValue()
|
||||||
|
globalMeterProvider = defaultMeterProvider()
|
||||||
|
|
||||||
delegateTraceOnce sync.Once
|
delegateTraceOnce sync.Once
|
||||||
delegateTextMapPropagatorOnce sync.Once
|
delegateTextMapPropagatorOnce sync.Once
|
||||||
|
delegateMeterOnce sync.Once
|
||||||
)
|
)
|
||||||
|
|
||||||
// TracerProvider is the internal implementation for global.TracerProvider.
|
// TracerProvider is the internal implementation for global.TracerProvider.
|
||||||
|
@ -102,6 +109,34 @@ func SetTextMapPropagator(p propagation.TextMapPropagator) {
|
||||||
globalPropagators.Store(propagatorsHolder{tm: p})
|
globalPropagators.Store(propagatorsHolder{tm: p})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MeterProvider is the internal implementation for global.MeterProvider.
|
||||||
|
func MeterProvider() metric.MeterProvider {
|
||||||
|
return globalMeterProvider.Load().(meterProviderHolder).mp
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetMeterProvider is the internal implementation for global.SetMeterProvider.
|
||||||
|
func SetMeterProvider(mp metric.MeterProvider) {
|
||||||
|
current := MeterProvider()
|
||||||
|
if _, cOk := current.(*meterProvider); cOk {
|
||||||
|
if _, mpOk := mp.(*meterProvider); mpOk && current == mp {
|
||||||
|
// Do not assign the default delegating MeterProvider to delegate
|
||||||
|
// to itself.
|
||||||
|
Error(
|
||||||
|
errors.New("no delegate configured in meter provider"),
|
||||||
|
"Setting meter provider to it's current value. No delegate will be configured",
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delegateMeterOnce.Do(func() {
|
||||||
|
if def, ok := current.(*meterProvider); ok {
|
||||||
|
def.setDelegate(mp)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
globalMeterProvider.Store(meterProviderHolder{mp: mp})
|
||||||
|
}
|
||||||
|
|
||||||
func defaultTracerValue() *atomic.Value {
|
func defaultTracerValue() *atomic.Value {
|
||||||
v := &atomic.Value{}
|
v := &atomic.Value{}
|
||||||
v.Store(tracerProviderHolder{tp: &tracerProvider{}})
|
v.Store(tracerProviderHolder{tp: &tracerProvider{}})
|
||||||
|
@ -113,3 +148,9 @@ func defaultPropagatorsValue() *atomic.Value {
|
||||||
v.Store(propagatorsHolder{tm: newTextMapPropagator()})
|
v.Store(propagatorsHolder{tm: newTextMapPropagator()})
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func defaultMeterProvider() *atomic.Value {
|
||||||
|
v := &atomic.Value{}
|
||||||
|
v.Store(meterProviderHolder{mp: &meterProvider{}})
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package otel // import "go.opentelemetry.io/otel"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.opentelemetry.io/otel/internal/global"
|
||||||
|
"go.opentelemetry.io/otel/metric"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Meter returns a Meter from the global MeterProvider. The name must be the
|
||||||
|
// name of the library providing instrumentation. This name may be the same as
|
||||||
|
// the instrumented code only if that code provides built-in instrumentation.
|
||||||
|
// If the name is empty, then a implementation defined default name will be
|
||||||
|
// used instead.
|
||||||
|
//
|
||||||
|
// If this is called before a global MeterProvider is registered the returned
|
||||||
|
// Meter will be a No-op implementation of a Meter. When a global MeterProvider
|
||||||
|
// is registered for the first time, the returned Meter, and all the
|
||||||
|
// instruments it has created or will create, are recreated automatically from
|
||||||
|
// the new MeterProvider.
|
||||||
|
//
|
||||||
|
// This is short for GetMeterProvider().Meter(name).
|
||||||
|
func Meter(name string, opts ...metric.MeterOption) metric.Meter {
|
||||||
|
return GetMeterProvider().Meter(name, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetMeterProvider returns the registered global meter provider.
|
||||||
|
//
|
||||||
|
// If no global GetMeterProvider has been registered, a No-op GetMeterProvider
|
||||||
|
// implementation is returned. When a global GetMeterProvider is registered for
|
||||||
|
// the first time, the returned GetMeterProvider, and all the Meters it has
|
||||||
|
// created or will create, are recreated automatically from the new
|
||||||
|
// GetMeterProvider.
|
||||||
|
func GetMeterProvider() metric.MeterProvider {
|
||||||
|
return global.MeterProvider()
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetMeterProvider registers mp as the global MeterProvider.
|
||||||
|
func SetMeterProvider(mp metric.MeterProvider) {
|
||||||
|
global.SetMeterProvider(mp)
|
||||||
|
}
|
|
@ -0,0 +1,271 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package metric // import "go.opentelemetry.io/otel/metric"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/metric/embedded"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Float64Observable describes a set of instruments used asynchronously to
|
||||||
|
// record float64 measurements once per collection cycle. Observations of
|
||||||
|
// these instruments are only made within a callback.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases.
|
||||||
|
type Float64Observable interface {
|
||||||
|
Observable
|
||||||
|
|
||||||
|
float64Observable()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableCounter is an instrument used to asynchronously record
|
||||||
|
// increasing float64 measurements once per collection cycle. Observations are
|
||||||
|
// only made within a callback for this instrument. The value observed is
|
||||||
|
// assumed the to be the cumulative sum of the count.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for
|
||||||
|
// unimplemented methods.
|
||||||
|
type Float64ObservableCounter interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Float64ObservableCounter
|
||||||
|
|
||||||
|
Float64Observable
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableCounterConfig contains options for asynchronous counter
|
||||||
|
// instruments that record int64 values.
|
||||||
|
type Float64ObservableCounterConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
callbacks []Float64Callback
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFloat64ObservableCounterConfig returns a new
|
||||||
|
// [Float64ObservableCounterConfig] with all opts applied.
|
||||||
|
func NewFloat64ObservableCounterConfig(opts ...Float64ObservableCounterOption) Float64ObservableCounterConfig {
|
||||||
|
var config Float64ObservableCounterConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyFloat64ObservableCounter(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Float64ObservableCounterConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Float64ObservableCounterConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callbacks returns the configured callbacks.
|
||||||
|
func (c Float64ObservableCounterConfig) Callbacks() []Float64Callback {
|
||||||
|
return c.callbacks
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableCounterOption applies options to a
|
||||||
|
// [Float64ObservableCounterConfig]. See [Float64ObservableOption] and
|
||||||
|
// [InstrumentOption] for other options that can be used as a
|
||||||
|
// Float64ObservableCounterOption.
|
||||||
|
type Float64ObservableCounterOption interface {
|
||||||
|
applyFloat64ObservableCounter(Float64ObservableCounterConfig) Float64ObservableCounterConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableUpDownCounter is an instrument used to asynchronously
|
||||||
|
// record float64 measurements once per collection cycle. Observations are only
|
||||||
|
// made within a callback for this instrument. The value observed is assumed
|
||||||
|
// the to be the cumulative sum of the count.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Float64ObservableUpDownCounter interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Float64ObservableUpDownCounter
|
||||||
|
|
||||||
|
Float64Observable
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableUpDownCounterConfig contains options for asynchronous
|
||||||
|
// counter instruments that record int64 values.
|
||||||
|
type Float64ObservableUpDownCounterConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
callbacks []Float64Callback
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFloat64ObservableUpDownCounterConfig returns a new
|
||||||
|
// [Float64ObservableUpDownCounterConfig] with all opts applied.
|
||||||
|
func NewFloat64ObservableUpDownCounterConfig(opts ...Float64ObservableUpDownCounterOption) Float64ObservableUpDownCounterConfig {
|
||||||
|
var config Float64ObservableUpDownCounterConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyFloat64ObservableUpDownCounter(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Float64ObservableUpDownCounterConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Float64ObservableUpDownCounterConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callbacks returns the configured callbacks.
|
||||||
|
func (c Float64ObservableUpDownCounterConfig) Callbacks() []Float64Callback {
|
||||||
|
return c.callbacks
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableUpDownCounterOption applies options to a
|
||||||
|
// [Float64ObservableUpDownCounterConfig]. See [Float64ObservableOption] and
|
||||||
|
// [InstrumentOption] for other options that can be used as a
|
||||||
|
// Float64ObservableUpDownCounterOption.
|
||||||
|
type Float64ObservableUpDownCounterOption interface {
|
||||||
|
applyFloat64ObservableUpDownCounter(Float64ObservableUpDownCounterConfig) Float64ObservableUpDownCounterConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableGauge is an instrument used to asynchronously record
|
||||||
|
// instantaneous float64 measurements once per collection cycle. Observations
|
||||||
|
// are only made within a callback for this instrument.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Float64ObservableGauge interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Float64ObservableGauge
|
||||||
|
|
||||||
|
Float64Observable
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableGaugeConfig contains options for asynchronous counter
|
||||||
|
// instruments that record int64 values.
|
||||||
|
type Float64ObservableGaugeConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
callbacks []Float64Callback
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFloat64ObservableGaugeConfig returns a new [Float64ObservableGaugeConfig]
|
||||||
|
// with all opts applied.
|
||||||
|
func NewFloat64ObservableGaugeConfig(opts ...Float64ObservableGaugeOption) Float64ObservableGaugeConfig {
|
||||||
|
var config Float64ObservableGaugeConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyFloat64ObservableGauge(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Float64ObservableGaugeConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Float64ObservableGaugeConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callbacks returns the configured callbacks.
|
||||||
|
func (c Float64ObservableGaugeConfig) Callbacks() []Float64Callback {
|
||||||
|
return c.callbacks
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64ObservableGaugeOption applies options to a
|
||||||
|
// [Float64ObservableGaugeConfig]. See [Float64ObservableOption] and
|
||||||
|
// [InstrumentOption] for other options that can be used as a
|
||||||
|
// Float64ObservableGaugeOption.
|
||||||
|
type Float64ObservableGaugeOption interface {
|
||||||
|
applyFloat64ObservableGauge(Float64ObservableGaugeConfig) Float64ObservableGaugeConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64Observer is a recorder of float64 measurements.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Float64Observer interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Float64Observer
|
||||||
|
|
||||||
|
// Observe records the float64 value.
|
||||||
|
//
|
||||||
|
// Use the WithAttributeSet (or, if performance is not a concern,
|
||||||
|
// the WithAttributes) option to include measurement attributes.
|
||||||
|
Observe(value float64, options ...ObserveOption)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64Callback is a function registered with a Meter that makes
|
||||||
|
// observations for a Float64Observerable instrument it is registered with.
|
||||||
|
// Calls to the Float64Observer record measurement values for the
|
||||||
|
// Float64Observable.
|
||||||
|
//
|
||||||
|
// The function needs to complete in a finite amount of time and the deadline
|
||||||
|
// of the passed context is expected to be honored.
|
||||||
|
//
|
||||||
|
// The function needs to make unique observations across all registered
|
||||||
|
// Float64Callbacks. Meaning, it should not report measurements with the same
|
||||||
|
// attributes as another Float64Callbacks also registered for the same
|
||||||
|
// instrument.
|
||||||
|
//
|
||||||
|
// The function needs to be concurrent safe.
|
||||||
|
type Float64Callback func(context.Context, Float64Observer) error
|
||||||
|
|
||||||
|
// Float64ObservableOption applies options to float64 Observer instruments.
|
||||||
|
type Float64ObservableOption interface {
|
||||||
|
Float64ObservableCounterOption
|
||||||
|
Float64ObservableUpDownCounterOption
|
||||||
|
Float64ObservableGaugeOption
|
||||||
|
}
|
||||||
|
|
||||||
|
type float64CallbackOpt struct {
|
||||||
|
cback Float64Callback
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o float64CallbackOpt) applyFloat64ObservableCounter(cfg Float64ObservableCounterConfig) Float64ObservableCounterConfig {
|
||||||
|
cfg.callbacks = append(cfg.callbacks, o.cback)
|
||||||
|
return cfg
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o float64CallbackOpt) applyFloat64ObservableUpDownCounter(cfg Float64ObservableUpDownCounterConfig) Float64ObservableUpDownCounterConfig {
|
||||||
|
cfg.callbacks = append(cfg.callbacks, o.cback)
|
||||||
|
return cfg
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o float64CallbackOpt) applyFloat64ObservableGauge(cfg Float64ObservableGaugeConfig) Float64ObservableGaugeConfig {
|
||||||
|
cfg.callbacks = append(cfg.callbacks, o.cback)
|
||||||
|
return cfg
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithFloat64Callback adds callback to be called for an instrument.
|
||||||
|
func WithFloat64Callback(callback Float64Callback) Float64ObservableOption {
|
||||||
|
return float64CallbackOpt{callback}
|
||||||
|
}
|
|
@ -0,0 +1,269 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package metric // import "go.opentelemetry.io/otel/metric"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/metric/embedded"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Int64Observable describes a set of instruments used asynchronously to record
|
||||||
|
// int64 measurements once per collection cycle. Observations of these
|
||||||
|
// instruments are only made within a callback.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases.
|
||||||
|
type Int64Observable interface {
|
||||||
|
Observable
|
||||||
|
|
||||||
|
int64Observable()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableCounter is an instrument used to asynchronously record
|
||||||
|
// increasing int64 measurements once per collection cycle. Observations are
|
||||||
|
// only made within a callback for this instrument. The value observed is
|
||||||
|
// assumed the to be the cumulative sum of the count.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Int64ObservableCounter interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Int64ObservableCounter
|
||||||
|
|
||||||
|
Int64Observable
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableCounterConfig contains options for asynchronous counter
|
||||||
|
// instruments that record int64 values.
|
||||||
|
type Int64ObservableCounterConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
callbacks []Int64Callback
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInt64ObservableCounterConfig returns a new [Int64ObservableCounterConfig]
|
||||||
|
// with all opts applied.
|
||||||
|
func NewInt64ObservableCounterConfig(opts ...Int64ObservableCounterOption) Int64ObservableCounterConfig {
|
||||||
|
var config Int64ObservableCounterConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyInt64ObservableCounter(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Int64ObservableCounterConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Int64ObservableCounterConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callbacks returns the configured callbacks.
|
||||||
|
func (c Int64ObservableCounterConfig) Callbacks() []Int64Callback {
|
||||||
|
return c.callbacks
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableCounterOption applies options to a
|
||||||
|
// [Int64ObservableCounterConfig]. See [Int64ObservableOption] and
|
||||||
|
// [InstrumentOption] for other options that can be used as an
|
||||||
|
// Int64ObservableCounterOption.
|
||||||
|
type Int64ObservableCounterOption interface {
|
||||||
|
applyInt64ObservableCounter(Int64ObservableCounterConfig) Int64ObservableCounterConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableUpDownCounter is an instrument used to asynchronously record
|
||||||
|
// int64 measurements once per collection cycle. Observations are only made
|
||||||
|
// within a callback for this instrument. The value observed is assumed the to
|
||||||
|
// be the cumulative sum of the count.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Int64ObservableUpDownCounter interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Int64ObservableUpDownCounter
|
||||||
|
|
||||||
|
Int64Observable
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableUpDownCounterConfig contains options for asynchronous counter
|
||||||
|
// instruments that record int64 values.
|
||||||
|
type Int64ObservableUpDownCounterConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
callbacks []Int64Callback
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInt64ObservableUpDownCounterConfig returns a new
|
||||||
|
// [Int64ObservableUpDownCounterConfig] with all opts applied.
|
||||||
|
func NewInt64ObservableUpDownCounterConfig(opts ...Int64ObservableUpDownCounterOption) Int64ObservableUpDownCounterConfig {
|
||||||
|
var config Int64ObservableUpDownCounterConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyInt64ObservableUpDownCounter(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Int64ObservableUpDownCounterConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Int64ObservableUpDownCounterConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callbacks returns the configured callbacks.
|
||||||
|
func (c Int64ObservableUpDownCounterConfig) Callbacks() []Int64Callback {
|
||||||
|
return c.callbacks
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableUpDownCounterOption applies options to a
|
||||||
|
// [Int64ObservableUpDownCounterConfig]. See [Int64ObservableOption] and
|
||||||
|
// [InstrumentOption] for other options that can be used as an
|
||||||
|
// Int64ObservableUpDownCounterOption.
|
||||||
|
type Int64ObservableUpDownCounterOption interface {
|
||||||
|
applyInt64ObservableUpDownCounter(Int64ObservableUpDownCounterConfig) Int64ObservableUpDownCounterConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableGauge is an instrument used to asynchronously record
|
||||||
|
// instantaneous int64 measurements once per collection cycle. Observations are
|
||||||
|
// only made within a callback for this instrument.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Int64ObservableGauge interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Int64ObservableGauge
|
||||||
|
|
||||||
|
Int64Observable
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableGaugeConfig contains options for asynchronous counter
|
||||||
|
// instruments that record int64 values.
|
||||||
|
type Int64ObservableGaugeConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
callbacks []Int64Callback
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInt64ObservableGaugeConfig returns a new [Int64ObservableGaugeConfig]
|
||||||
|
// with all opts applied.
|
||||||
|
func NewInt64ObservableGaugeConfig(opts ...Int64ObservableGaugeOption) Int64ObservableGaugeConfig {
|
||||||
|
var config Int64ObservableGaugeConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyInt64ObservableGauge(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Int64ObservableGaugeConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Int64ObservableGaugeConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callbacks returns the configured callbacks.
|
||||||
|
func (c Int64ObservableGaugeConfig) Callbacks() []Int64Callback {
|
||||||
|
return c.callbacks
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64ObservableGaugeOption applies options to a
|
||||||
|
// [Int64ObservableGaugeConfig]. See [Int64ObservableOption] and
|
||||||
|
// [InstrumentOption] for other options that can be used as an
|
||||||
|
// Int64ObservableGaugeOption.
|
||||||
|
type Int64ObservableGaugeOption interface {
|
||||||
|
applyInt64ObservableGauge(Int64ObservableGaugeConfig) Int64ObservableGaugeConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64Observer is a recorder of int64 measurements.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Int64Observer interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Int64Observer
|
||||||
|
|
||||||
|
// Observe records the int64 value.
|
||||||
|
//
|
||||||
|
// Use the WithAttributeSet (or, if performance is not a concern,
|
||||||
|
// the WithAttributes) option to include measurement attributes.
|
||||||
|
Observe(value int64, options ...ObserveOption)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64Callback is a function registered with a Meter that makes observations
|
||||||
|
// for an Int64Observerable instrument it is registered with. Calls to the
|
||||||
|
// Int64Observer record measurement values for the Int64Observable.
|
||||||
|
//
|
||||||
|
// The function needs to complete in a finite amount of time and the deadline
|
||||||
|
// of the passed context is expected to be honored.
|
||||||
|
//
|
||||||
|
// The function needs to make unique observations across all registered
|
||||||
|
// Int64Callbacks. Meaning, it should not report measurements with the same
|
||||||
|
// attributes as another Int64Callbacks also registered for the same
|
||||||
|
// instrument.
|
||||||
|
//
|
||||||
|
// The function needs to be concurrent safe.
|
||||||
|
type Int64Callback func(context.Context, Int64Observer) error
|
||||||
|
|
||||||
|
// Int64ObservableOption applies options to int64 Observer instruments.
|
||||||
|
type Int64ObservableOption interface {
|
||||||
|
Int64ObservableCounterOption
|
||||||
|
Int64ObservableUpDownCounterOption
|
||||||
|
Int64ObservableGaugeOption
|
||||||
|
}
|
||||||
|
|
||||||
|
type int64CallbackOpt struct {
|
||||||
|
cback Int64Callback
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o int64CallbackOpt) applyInt64ObservableCounter(cfg Int64ObservableCounterConfig) Int64ObservableCounterConfig {
|
||||||
|
cfg.callbacks = append(cfg.callbacks, o.cback)
|
||||||
|
return cfg
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o int64CallbackOpt) applyInt64ObservableUpDownCounter(cfg Int64ObservableUpDownCounterConfig) Int64ObservableUpDownCounterConfig {
|
||||||
|
cfg.callbacks = append(cfg.callbacks, o.cback)
|
||||||
|
return cfg
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o int64CallbackOpt) applyInt64ObservableGauge(cfg Int64ObservableGaugeConfig) Int64ObservableGaugeConfig {
|
||||||
|
cfg.callbacks = append(cfg.callbacks, o.cback)
|
||||||
|
return cfg
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithInt64Callback adds callback to be called for an instrument.
|
||||||
|
func WithInt64Callback(callback Int64Callback) Int64ObservableOption {
|
||||||
|
return int64CallbackOpt{callback}
|
||||||
|
}
|
|
@ -13,11 +13,158 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Package metric provides an implementation of the metrics part of the
|
Package metric provides the OpenTelemetry API used to measure metrics about
|
||||||
OpenTelemetry API.
|
source code operation.
|
||||||
|
|
||||||
This package is currently in a pre-GA phase. Backwards incompatible changes
|
This API is separate from its implementation so the instrumentation built from
|
||||||
may be introduced in subsequent minor version releases as we work to track the
|
it is reusable. See [go.opentelemetry.io/otel/sdk/metric] for the official
|
||||||
evolving OpenTelemetry specification and user feedback.
|
OpenTelemetry implementation of this API.
|
||||||
|
|
||||||
|
All measurements made with this package are made via instruments. These
|
||||||
|
instruments are created by a [Meter] which itself is created by a
|
||||||
|
[MeterProvider]. Applications need to accept a [MeterProvider] implementation
|
||||||
|
as a starting point when instrumenting. This can be done directly, or by using
|
||||||
|
the OpenTelemetry global MeterProvider via [GetMeterProvider]. Using an
|
||||||
|
appropriately named [Meter] from the accepted [MeterProvider], instrumentation
|
||||||
|
can then be built from the [Meter]'s instruments.
|
||||||
|
|
||||||
|
# Instruments
|
||||||
|
|
||||||
|
Each instrument is designed to make measurements of a particular type. Broadly,
|
||||||
|
all instruments fall into two overlapping logical categories: asynchronous or
|
||||||
|
synchronous, and int64 or float64.
|
||||||
|
|
||||||
|
All synchronous instruments ([Int64Counter], [Int64UpDownCounter],
|
||||||
|
[Int64Histogram], [Float64Counter], [Float64UpDownCounter], and
|
||||||
|
[Float64Histogram]) are used to measure the operation and performance of source
|
||||||
|
code during the source code execution. These instruments only make measurements
|
||||||
|
when the source code they instrument is run.
|
||||||
|
|
||||||
|
All asynchronous instruments ([Int64ObservableCounter],
|
||||||
|
[Int64ObservableUpDownCounter], [Int64ObservableGauge],
|
||||||
|
[Float64ObservableCounter], [Float64ObservableUpDownCounter], and
|
||||||
|
[Float64ObservableGauge]) are used to measure metrics outside of the execution
|
||||||
|
of source code. They are said to make "observations" via a callback function
|
||||||
|
called once every measurement collection cycle.
|
||||||
|
|
||||||
|
Each instrument is also grouped by the value type it measures. Either int64 or
|
||||||
|
float64. The value being measured will dictate which instrument in these
|
||||||
|
categories to use.
|
||||||
|
|
||||||
|
Outside of these two broad categories, instruments are described by the
|
||||||
|
function they are designed to serve. All Counters ([Int64Counter],
|
||||||
|
[Float64Counter], [Int64ObservableCounter], and [Float64ObservableCounter]) are
|
||||||
|
designed to measure values that never decrease in value, but instead only
|
||||||
|
incrementally increase in value. UpDownCounters ([Int64UpDownCounter],
|
||||||
|
[Float64UpDownCounter], [Int64ObservableUpDownCounter], and
|
||||||
|
[Float64ObservableUpDownCounter]) on the other hand, are designed to measure
|
||||||
|
values that can increase and decrease. When more information needs to be
|
||||||
|
conveyed about all the synchronous measurements made during a collection cycle,
|
||||||
|
a Histogram ([Int64Histogram] and [Float64Histogram]) should be used. Finally,
|
||||||
|
when just the most recent measurement needs to be conveyed about an
|
||||||
|
asynchronous measurement, a Gauge ([Int64ObservableGauge] and
|
||||||
|
[Float64ObservableGauge]) should be used.
|
||||||
|
|
||||||
|
See the [OpenTelemetry documentation] for more information about instruments
|
||||||
|
and their intended use.
|
||||||
|
|
||||||
|
# Measurements
|
||||||
|
|
||||||
|
Measurements are made by recording values and information about the values with
|
||||||
|
an instrument. How these measurements are recorded depends on the instrument.
|
||||||
|
|
||||||
|
Measurements for synchronous instruments ([Int64Counter], [Int64UpDownCounter],
|
||||||
|
[Int64Histogram], [Float64Counter], [Float64UpDownCounter], and
|
||||||
|
[Float64Histogram]) are recorded using the instrument methods directly. All
|
||||||
|
counter instruments have an Add method that is used to measure an increment
|
||||||
|
value, and all histogram instruments have a Record method to measure a data
|
||||||
|
point.
|
||||||
|
|
||||||
|
Asynchronous instruments ([Int64ObservableCounter],
|
||||||
|
[Int64ObservableUpDownCounter], [Int64ObservableGauge],
|
||||||
|
[Float64ObservableCounter], [Float64ObservableUpDownCounter], and
|
||||||
|
[Float64ObservableGauge]) record measurements within a callback function. The
|
||||||
|
callback is registered with the Meter which ensures the callback is called once
|
||||||
|
per collection cycle. A callback can be registered two ways: during the
|
||||||
|
instrument's creation using an option, or later using the RegisterCallback
|
||||||
|
method of the [Meter] that created the instrument.
|
||||||
|
|
||||||
|
If the following criteria are met, an option ([WithInt64Callback] or
|
||||||
|
[WithFloat64Callback]) can be used during the asynchronous instrument's
|
||||||
|
creation to register a callback ([Int64Callback] or [Float64Callback],
|
||||||
|
respectively):
|
||||||
|
|
||||||
|
- The measurement process is known when the instrument is created
|
||||||
|
- Only that instrument will make a measurement within the callback
|
||||||
|
- The callback never needs to be unregistered
|
||||||
|
|
||||||
|
If the criteria are not met, use the RegisterCallback method of the [Meter] that
|
||||||
|
created the instrument to register a [Callback].
|
||||||
|
|
||||||
|
# API Implementations
|
||||||
|
|
||||||
|
This package does not conform to the standard Go versioning policy, all of its
|
||||||
|
interfaces may have methods added to them without a package major version bump.
|
||||||
|
This non-standard API evolution could surprise an uninformed implementation
|
||||||
|
author. They could unknowingly build their implementation in a way that would
|
||||||
|
result in a runtime panic for their users that update to the new API.
|
||||||
|
|
||||||
|
The API is designed to help inform an instrumentation author about this
|
||||||
|
non-standard API evolution. It requires them to choose a default behavior for
|
||||||
|
unimplemented interface methods. There are three behavior choices they can
|
||||||
|
make:
|
||||||
|
|
||||||
|
- Compilation failure
|
||||||
|
- Panic
|
||||||
|
- Default to another implementation
|
||||||
|
|
||||||
|
All interfaces in this API embed a corresponding interface from
|
||||||
|
[go.opentelemetry.io/otel/metric/embedded]. If an author wants the default
|
||||||
|
behavior of their implementations to be a compilation failure, signaling to
|
||||||
|
their users they need to update to the latest version of that implementation,
|
||||||
|
they need to embed the corresponding interface from
|
||||||
|
[go.opentelemetry.io/otel/metric/embedded] in their implementation. For
|
||||||
|
example,
|
||||||
|
|
||||||
|
import "go.opentelemetry.io/otel/metric/embedded"
|
||||||
|
|
||||||
|
type MeterProvider struct {
|
||||||
|
embedded.MeterProvider
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
If an author wants the default behavior of their implementations to a panic,
|
||||||
|
they need to embed the API interface directly.
|
||||||
|
|
||||||
|
import "go.opentelemetry.io/otel/metric"
|
||||||
|
|
||||||
|
type MeterProvider struct {
|
||||||
|
metric.MeterProvider
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
This is not a recommended behavior as it could lead to publishing packages that
|
||||||
|
contain runtime panics when users update other package that use newer versions
|
||||||
|
of [go.opentelemetry.io/otel/metric].
|
||||||
|
|
||||||
|
Finally, an author can embed another implementation in theirs. The embedded
|
||||||
|
implementation will be used for methods not defined by the author. For example,
|
||||||
|
an author who want to default to silently dropping the call can use
|
||||||
|
[go.opentelemetry.io/otel/metric/noop]:
|
||||||
|
|
||||||
|
import "go.opentelemetry.io/otel/metric/noop"
|
||||||
|
|
||||||
|
type MeterProvider struct {
|
||||||
|
noop.MeterProvider
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
It is strongly recommended that authors only embed
|
||||||
|
[go.opentelemetry.io/otel/metric/noop] if they choose this default behavior.
|
||||||
|
That implementation is the only one OpenTelemetry authors can guarantee will
|
||||||
|
fully implement all the API interfaces when a user updates their API.
|
||||||
|
|
||||||
|
[OpenTelemetry documentation]: https://opentelemetry.io/docs/concepts/signals/metrics/
|
||||||
|
[GetMeterProvider]: https://pkg.go.dev/go.opentelemetry.io/otel#GetMeterProvider
|
||||||
*/
|
*/
|
||||||
package metric // import "go.opentelemetry.io/otel/metric"
|
package metric // import "go.opentelemetry.io/otel/metric"
|
||||||
|
|
|
@ -0,0 +1,234 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
// Package embedded provides interfaces embedded within the [OpenTelemetry
|
||||||
|
// metric API].
|
||||||
|
//
|
||||||
|
// Implementers of the [OpenTelemetry metric API] can embed the relevant type
|
||||||
|
// from this package into their implementation directly. Doing so will result
|
||||||
|
// in a compilation error for users when the [OpenTelemetry metric API] is
|
||||||
|
// extended (which is something that can happen without a major version bump of
|
||||||
|
// the API package).
|
||||||
|
//
|
||||||
|
// [OpenTelemetry metric API]: https://pkg.go.dev/go.opentelemetry.io/otel/metric
|
||||||
|
package embedded // import "go.opentelemetry.io/otel/metric/embedded"
|
||||||
|
|
||||||
|
// MeterProvider is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.MeterProvider].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.MeterProvider] if you want users to
|
||||||
|
// experience a compilation error, signaling they need to update to your latest
|
||||||
|
// implementation, when the [go.opentelemetry.io/otel/metric.MeterProvider]
|
||||||
|
// interface is extended (which is something that can happen without a major
|
||||||
|
// version bump of the API package).
|
||||||
|
type MeterProvider interface{ meterProvider() }
|
||||||
|
|
||||||
|
// Meter is embedded in [go.opentelemetry.io/otel/metric.Meter].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Meter] if you want users to experience a
|
||||||
|
// compilation error, signaling they need to update to your latest
|
||||||
|
// implementation, when the [go.opentelemetry.io/otel/metric.Meter] interface
|
||||||
|
// is extended (which is something that can happen without a major version bump
|
||||||
|
// of the API package).
|
||||||
|
type Meter interface{ meter() }
|
||||||
|
|
||||||
|
// Float64Observer is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64Observer].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64Observer] if you want
|
||||||
|
// users to experience a compilation error, signaling they need to update to
|
||||||
|
// your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64Observer] interface is
|
||||||
|
// extended (which is something that can happen without a major version bump of
|
||||||
|
// the API package).
|
||||||
|
type Float64Observer interface{ float64Observer() }
|
||||||
|
|
||||||
|
// Int64Observer is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64Observer].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64Observer] if you want users
|
||||||
|
// to experience a compilation error, signaling they need to update to your
|
||||||
|
// latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64Observer] interface is
|
||||||
|
// extended (which is something that can happen without a major version bump of
|
||||||
|
// the API package).
|
||||||
|
type Int64Observer interface{ int64Observer() }
|
||||||
|
|
||||||
|
// Observer is embedded in [go.opentelemetry.io/otel/metric.Observer].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Observer] if you want users to experience a
|
||||||
|
// compilation error, signaling they need to update to your latest
|
||||||
|
// implementation, when the [go.opentelemetry.io/otel/metric.Observer]
|
||||||
|
// interface is extended (which is something that can happen without a major
|
||||||
|
// version bump of the API package).
|
||||||
|
type Observer interface{ observer() }
|
||||||
|
|
||||||
|
// Registration is embedded in [go.opentelemetry.io/otel/metric.Registration].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Registration] if you want users to
|
||||||
|
// experience a compilation error, signaling they need to update to your latest
|
||||||
|
// implementation, when the [go.opentelemetry.io/otel/metric.Registration]
|
||||||
|
// interface is extended (which is something that can happen without a major
|
||||||
|
// version bump of the API package).
|
||||||
|
type Registration interface{ registration() }
|
||||||
|
|
||||||
|
// Float64Counter is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64Counter].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64Counter] if you want
|
||||||
|
// users to experience a compilation error, signaling they need to update to
|
||||||
|
// your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64Counter] interface is
|
||||||
|
// extended (which is something that can happen without a major version bump of
|
||||||
|
// the API package).
|
||||||
|
type Float64Counter interface{ float64Counter() }
|
||||||
|
|
||||||
|
// Float64Histogram is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64Histogram].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64Histogram] if you want
|
||||||
|
// users to experience a compilation error, signaling they need to update to
|
||||||
|
// your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64Histogram] interface is
|
||||||
|
// extended (which is something that can happen without a major version bump of
|
||||||
|
// the API package).
|
||||||
|
type Float64Histogram interface{ float64Histogram() }
|
||||||
|
|
||||||
|
// Float64ObservableCounter is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64ObservableCounter].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64ObservableCounter] if you
|
||||||
|
// want users to experience a compilation error, signaling they need to update
|
||||||
|
// to your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64ObservableCounter]
|
||||||
|
// interface is extended (which is something that can happen without a major
|
||||||
|
// version bump of the API package).
|
||||||
|
type Float64ObservableCounter interface{ float64ObservableCounter() }
|
||||||
|
|
||||||
|
// Float64ObservableGauge is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64ObservableGauge].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64ObservableGauge] if you
|
||||||
|
// want users to experience a compilation error, signaling they need to update
|
||||||
|
// to your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64ObservableGauge]
|
||||||
|
// interface is extended (which is something that can happen without a major
|
||||||
|
// version bump of the API package).
|
||||||
|
type Float64ObservableGauge interface{ float64ObservableGauge() }
|
||||||
|
|
||||||
|
// Float64ObservableUpDownCounter is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64ObservableUpDownCounter].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64ObservableUpDownCounter]
|
||||||
|
// if you want users to experience a compilation error, signaling they need to
|
||||||
|
// update to your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64ObservableUpDownCounter]
|
||||||
|
// interface is extended (which is something that can happen without a major
|
||||||
|
// version bump of the API package).
|
||||||
|
type Float64ObservableUpDownCounter interface{ float64ObservableUpDownCounter() }
|
||||||
|
|
||||||
|
// Float64UpDownCounter is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64UpDownCounter].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64UpDownCounter] if you
|
||||||
|
// want users to experience a compilation error, signaling they need to update
|
||||||
|
// to your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Float64UpDownCounter] interface
|
||||||
|
// is extended (which is something that can happen without a major version bump
|
||||||
|
// of the API package).
|
||||||
|
type Float64UpDownCounter interface{ float64UpDownCounter() }
|
||||||
|
|
||||||
|
// Int64Counter is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64Counter].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64Counter] if you want users
|
||||||
|
// to experience a compilation error, signaling they need to update to your
|
||||||
|
// latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64Counter] interface is
|
||||||
|
// extended (which is something that can happen without a major version bump of
|
||||||
|
// the API package).
|
||||||
|
type Int64Counter interface{ int64Counter() }
|
||||||
|
|
||||||
|
// Int64Histogram is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64Histogram].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64Histogram] if you want
|
||||||
|
// users to experience a compilation error, signaling they need to update to
|
||||||
|
// your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64Histogram] interface is
|
||||||
|
// extended (which is something that can happen without a major version bump of
|
||||||
|
// the API package).
|
||||||
|
type Int64Histogram interface{ int64Histogram() }
|
||||||
|
|
||||||
|
// Int64ObservableCounter is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64ObservableCounter].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64ObservableCounter] if you
|
||||||
|
// want users to experience a compilation error, signaling they need to update
|
||||||
|
// to your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64ObservableCounter]
|
||||||
|
// interface is extended (which is something that can happen without a major
|
||||||
|
// version bump of the API package).
|
||||||
|
type Int64ObservableCounter interface{ int64ObservableCounter() }
|
||||||
|
|
||||||
|
// Int64ObservableGauge is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64ObservableGauge].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64ObservableGauge] if you
|
||||||
|
// want users to experience a compilation error, signaling they need to update
|
||||||
|
// to your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64ObservableGauge] interface
|
||||||
|
// is extended (which is something that can happen without a major version bump
|
||||||
|
// of the API package).
|
||||||
|
type Int64ObservableGauge interface{ int64ObservableGauge() }
|
||||||
|
|
||||||
|
// Int64ObservableUpDownCounter is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64ObservableUpDownCounter].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64ObservableUpDownCounter] if
|
||||||
|
// you want users to experience a compilation error, signaling they need to
|
||||||
|
// update to your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64ObservableUpDownCounter]
|
||||||
|
// interface is extended (which is something that can happen without a major
|
||||||
|
// version bump of the API package).
|
||||||
|
type Int64ObservableUpDownCounter interface{ int64ObservableUpDownCounter() }
|
||||||
|
|
||||||
|
// Int64UpDownCounter is embedded in
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64UpDownCounter].
|
||||||
|
//
|
||||||
|
// Embed this interface in your implementation of the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64UpDownCounter] if you want
|
||||||
|
// users to experience a compilation error, signaling they need to update to
|
||||||
|
// your latest implementation, when the
|
||||||
|
// [go.opentelemetry.io/otel/metric.Int64UpDownCounter] interface is
|
||||||
|
// extended (which is something that can happen without a major version bump of
|
||||||
|
// the API package).
|
||||||
|
type Int64UpDownCounter interface{ int64UpDownCounter() }
|
|
@ -1,42 +0,0 @@
|
||||||
// Copyright The OpenTelemetry Authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package global // import "go.opentelemetry.io/otel/metric/global"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"go.opentelemetry.io/otel/metric"
|
|
||||||
"go.opentelemetry.io/otel/metric/internal/global"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Meter returns a Meter from the global MeterProvider. The
|
|
||||||
// instrumentationName must be the name of the library providing
|
|
||||||
// instrumentation. This name may be the same as the instrumented code only if
|
|
||||||
// that code provides built-in instrumentation. If the instrumentationName is
|
|
||||||
// empty, then a implementation defined default name will be used instead.
|
|
||||||
//
|
|
||||||
// This is short for MeterProvider().Meter(name).
|
|
||||||
func Meter(instrumentationName string, opts ...metric.MeterOption) metric.Meter {
|
|
||||||
return MeterProvider().Meter(instrumentationName, opts...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MeterProvider returns the registered global meter provider.
|
|
||||||
// If none is registered then a No-op MeterProvider is returned.
|
|
||||||
func MeterProvider() metric.MeterProvider {
|
|
||||||
return global.MeterProvider()
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMeterProvider registers `mp` as the global meter provider.
|
|
||||||
func SetMeterProvider(mp metric.MeterProvider) {
|
|
||||||
global.SetMeterProvider(mp)
|
|
||||||
}
|
|
|
@ -0,0 +1,334 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package metric // import "go.opentelemetry.io/otel/metric"
|
||||||
|
|
||||||
|
import "go.opentelemetry.io/otel/attribute"
|
||||||
|
|
||||||
|
// Observable is used as a grouping mechanism for all instruments that are
|
||||||
|
// updated within a Callback.
|
||||||
|
type Observable interface {
|
||||||
|
observable()
|
||||||
|
}
|
||||||
|
|
||||||
|
// InstrumentOption applies options to all instruments.
|
||||||
|
type InstrumentOption interface {
|
||||||
|
Int64CounterOption
|
||||||
|
Int64UpDownCounterOption
|
||||||
|
Int64HistogramOption
|
||||||
|
Int64ObservableCounterOption
|
||||||
|
Int64ObservableUpDownCounterOption
|
||||||
|
Int64ObservableGaugeOption
|
||||||
|
|
||||||
|
Float64CounterOption
|
||||||
|
Float64UpDownCounterOption
|
||||||
|
Float64HistogramOption
|
||||||
|
Float64ObservableCounterOption
|
||||||
|
Float64ObservableUpDownCounterOption
|
||||||
|
Float64ObservableGaugeOption
|
||||||
|
}
|
||||||
|
|
||||||
|
type descOpt string
|
||||||
|
|
||||||
|
func (o descOpt) applyFloat64Counter(c Float64CounterConfig) Float64CounterConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyFloat64UpDownCounter(c Float64UpDownCounterConfig) Float64UpDownCounterConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyFloat64Histogram(c Float64HistogramConfig) Float64HistogramConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyFloat64ObservableCounter(c Float64ObservableCounterConfig) Float64ObservableCounterConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyFloat64ObservableUpDownCounter(c Float64ObservableUpDownCounterConfig) Float64ObservableUpDownCounterConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyFloat64ObservableGauge(c Float64ObservableGaugeConfig) Float64ObservableGaugeConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyInt64Counter(c Int64CounterConfig) Int64CounterConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyInt64UpDownCounter(c Int64UpDownCounterConfig) Int64UpDownCounterConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyInt64Histogram(c Int64HistogramConfig) Int64HistogramConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyInt64ObservableCounter(c Int64ObservableCounterConfig) Int64ObservableCounterConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyInt64ObservableUpDownCounter(c Int64ObservableUpDownCounterConfig) Int64ObservableUpDownCounterConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o descOpt) applyInt64ObservableGauge(c Int64ObservableGaugeConfig) Int64ObservableGaugeConfig {
|
||||||
|
c.description = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithDescription sets the instrument description.
|
||||||
|
func WithDescription(desc string) InstrumentOption { return descOpt(desc) }
|
||||||
|
|
||||||
|
type unitOpt string
|
||||||
|
|
||||||
|
func (o unitOpt) applyFloat64Counter(c Float64CounterConfig) Float64CounterConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyFloat64UpDownCounter(c Float64UpDownCounterConfig) Float64UpDownCounterConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyFloat64Histogram(c Float64HistogramConfig) Float64HistogramConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyFloat64ObservableCounter(c Float64ObservableCounterConfig) Float64ObservableCounterConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyFloat64ObservableUpDownCounter(c Float64ObservableUpDownCounterConfig) Float64ObservableUpDownCounterConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyFloat64ObservableGauge(c Float64ObservableGaugeConfig) Float64ObservableGaugeConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyInt64Counter(c Int64CounterConfig) Int64CounterConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyInt64UpDownCounter(c Int64UpDownCounterConfig) Int64UpDownCounterConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyInt64Histogram(c Int64HistogramConfig) Int64HistogramConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyInt64ObservableCounter(c Int64ObservableCounterConfig) Int64ObservableCounterConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyInt64ObservableUpDownCounter(c Int64ObservableUpDownCounterConfig) Int64ObservableUpDownCounterConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o unitOpt) applyInt64ObservableGauge(c Int64ObservableGaugeConfig) Int64ObservableGaugeConfig {
|
||||||
|
c.unit = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithUnit sets the instrument unit.
|
||||||
|
//
|
||||||
|
// The unit u should be defined using the appropriate [UCUM](https://ucum.org) case-sensitive code.
|
||||||
|
func WithUnit(u string) InstrumentOption { return unitOpt(u) }
|
||||||
|
|
||||||
|
// AddOption applies options to an addition measurement. See
|
||||||
|
// [MeasurementOption] for other options that can be used as an AddOption.
|
||||||
|
type AddOption interface {
|
||||||
|
applyAdd(AddConfig) AddConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddConfig contains options for an addition measurement.
|
||||||
|
type AddConfig struct {
|
||||||
|
attrs attribute.Set
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewAddConfig returns a new [AddConfig] with all opts applied.
|
||||||
|
func NewAddConfig(opts []AddOption) AddConfig {
|
||||||
|
config := AddConfig{attrs: *attribute.EmptySet()}
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyAdd(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attributes returns the configured attribute set.
|
||||||
|
func (c AddConfig) Attributes() attribute.Set {
|
||||||
|
return c.attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// RecordOption applies options to an addition measurement. See
|
||||||
|
// [MeasurementOption] for other options that can be used as a RecordOption.
|
||||||
|
type RecordOption interface {
|
||||||
|
applyRecord(RecordConfig) RecordConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// RecordConfig contains options for a recorded measurement.
|
||||||
|
type RecordConfig struct {
|
||||||
|
attrs attribute.Set
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewRecordConfig returns a new [RecordConfig] with all opts applied.
|
||||||
|
func NewRecordConfig(opts []RecordOption) RecordConfig {
|
||||||
|
config := RecordConfig{attrs: *attribute.EmptySet()}
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyRecord(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attributes returns the configured attribute set.
|
||||||
|
func (c RecordConfig) Attributes() attribute.Set {
|
||||||
|
return c.attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// ObserveOption applies options to an addition measurement. See
|
||||||
|
// [MeasurementOption] for other options that can be used as a ObserveOption.
|
||||||
|
type ObserveOption interface {
|
||||||
|
applyObserve(ObserveConfig) ObserveConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// ObserveConfig contains options for an observed measurement.
|
||||||
|
type ObserveConfig struct {
|
||||||
|
attrs attribute.Set
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewObserveConfig returns a new [ObserveConfig] with all opts applied.
|
||||||
|
func NewObserveConfig(opts []ObserveOption) ObserveConfig {
|
||||||
|
config := ObserveConfig{attrs: *attribute.EmptySet()}
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyObserve(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attributes returns the configured attribute set.
|
||||||
|
func (c ObserveConfig) Attributes() attribute.Set {
|
||||||
|
return c.attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// MeasurementOption applies options to all instrument measurement.
|
||||||
|
type MeasurementOption interface {
|
||||||
|
AddOption
|
||||||
|
RecordOption
|
||||||
|
ObserveOption
|
||||||
|
}
|
||||||
|
|
||||||
|
type attrOpt struct {
|
||||||
|
set attribute.Set
|
||||||
|
}
|
||||||
|
|
||||||
|
// mergeSets returns the union of keys between a and b. Any duplicate keys will
|
||||||
|
// use the value associated with b.
|
||||||
|
func mergeSets(a, b attribute.Set) attribute.Set {
|
||||||
|
// NewMergeIterator uses the first value for any duplicates.
|
||||||
|
iter := attribute.NewMergeIterator(&b, &a)
|
||||||
|
merged := make([]attribute.KeyValue, 0, a.Len()+b.Len())
|
||||||
|
for iter.Next() {
|
||||||
|
merged = append(merged, iter.Attribute())
|
||||||
|
}
|
||||||
|
return attribute.NewSet(merged...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o attrOpt) applyAdd(c AddConfig) AddConfig {
|
||||||
|
switch {
|
||||||
|
case o.set.Len() == 0:
|
||||||
|
case c.attrs.Len() == 0:
|
||||||
|
c.attrs = o.set
|
||||||
|
default:
|
||||||
|
c.attrs = mergeSets(c.attrs, o.set)
|
||||||
|
}
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o attrOpt) applyRecord(c RecordConfig) RecordConfig {
|
||||||
|
switch {
|
||||||
|
case o.set.Len() == 0:
|
||||||
|
case c.attrs.Len() == 0:
|
||||||
|
c.attrs = o.set
|
||||||
|
default:
|
||||||
|
c.attrs = mergeSets(c.attrs, o.set)
|
||||||
|
}
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o attrOpt) applyObserve(c ObserveConfig) ObserveConfig {
|
||||||
|
switch {
|
||||||
|
case o.set.Len() == 0:
|
||||||
|
case c.attrs.Len() == 0:
|
||||||
|
c.attrs = o.set
|
||||||
|
default:
|
||||||
|
c.attrs = mergeSets(c.attrs, o.set)
|
||||||
|
}
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithAttributeSet sets the attribute Set associated with a measurement is
|
||||||
|
// made with.
|
||||||
|
//
|
||||||
|
// If multiple WithAttributeSet or WithAttributes options are passed the
|
||||||
|
// attributes will be merged together in the order they are passed. Attributes
|
||||||
|
// with duplicate keys will use the last value passed.
|
||||||
|
func WithAttributeSet(attributes attribute.Set) MeasurementOption {
|
||||||
|
return attrOpt{set: attributes}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithAttributes converts attributes into an attribute Set and sets the Set to
|
||||||
|
// be associated with a measurement. This is shorthand for:
|
||||||
|
//
|
||||||
|
// cp := make([]attribute.KeyValue, len(attributes))
|
||||||
|
// copy(cp, attributes)
|
||||||
|
// WithAttributes(attribute.NewSet(cp...))
|
||||||
|
//
|
||||||
|
// [attribute.NewSet] may modify the passed attributes so this will make a copy
|
||||||
|
// of attributes before creating a set in order to ensure this function is
|
||||||
|
// concurrent safe. This makes this option function less optimized in
|
||||||
|
// comparison to [WithAttributeSet]. Therefore, [WithAttributeSet] should be
|
||||||
|
// preferred for performance sensitive code.
|
||||||
|
//
|
||||||
|
// See [WithAttributeSet] for information about how multiple WithAttributes are
|
||||||
|
// merged.
|
||||||
|
func WithAttributes(attributes ...attribute.KeyValue) MeasurementOption {
|
||||||
|
cp := make([]attribute.KeyValue, len(attributes))
|
||||||
|
copy(cp, attributes)
|
||||||
|
return attrOpt{set: attribute.NewSet(cp...)}
|
||||||
|
}
|
|
@ -1,130 +0,0 @@
|
||||||
// Copyright The OpenTelemetry Authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package instrument // import "go.opentelemetry.io/otel/metric/instrument"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Float64Observable describes a set of instruments used asynchronously to
|
|
||||||
// record float64 measurements once per collection cycle. Observations of
|
|
||||||
// these instruments are only made within a callback.
|
|
||||||
//
|
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
|
||||||
type Float64Observable interface {
|
|
||||||
Asynchronous
|
|
||||||
|
|
||||||
float64Observable()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64ObservableCounter is an instrument used to asynchronously record
|
|
||||||
// increasing float64 measurements once per collection cycle. Observations are
|
|
||||||
// only made within a callback for this instrument. The value observed is
|
|
||||||
// assumed the to be the cumulative sum of the count.
|
|
||||||
//
|
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
|
||||||
type Float64ObservableCounter interface{ Float64Observable }
|
|
||||||
|
|
||||||
// Float64ObservableUpDownCounter is an instrument used to asynchronously
|
|
||||||
// record float64 measurements once per collection cycle. Observations are only
|
|
||||||
// made within a callback for this instrument. The value observed is assumed
|
|
||||||
// the to be the cumulative sum of the count.
|
|
||||||
//
|
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
|
||||||
type Float64ObservableUpDownCounter interface{ Float64Observable }
|
|
||||||
|
|
||||||
// Float64ObservableGauge is an instrument used to asynchronously record
|
|
||||||
// instantaneous float64 measurements once per collection cycle. Observations
|
|
||||||
// are only made within a callback for this instrument.
|
|
||||||
//
|
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
|
||||||
type Float64ObservableGauge interface{ Float64Observable }
|
|
||||||
|
|
||||||
// Float64Observer is a recorder of float64 measurements.
|
|
||||||
//
|
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
|
||||||
type Float64Observer interface {
|
|
||||||
Observe(value float64, attributes ...attribute.KeyValue)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64Callback is a function registered with a Meter that makes
|
|
||||||
// observations for a Float64Observerable instrument it is registered with.
|
|
||||||
// Calls to the Float64Observer record measurement values for the
|
|
||||||
// Float64Observable.
|
|
||||||
//
|
|
||||||
// The function needs to complete in a finite amount of time and the deadline
|
|
||||||
// of the passed context is expected to be honored.
|
|
||||||
//
|
|
||||||
// The function needs to make unique observations across all registered
|
|
||||||
// Float64Callbacks. Meaning, it should not report measurements with the same
|
|
||||||
// attributes as another Float64Callbacks also registered for the same
|
|
||||||
// instrument.
|
|
||||||
//
|
|
||||||
// The function needs to be concurrent safe.
|
|
||||||
type Float64Callback func(context.Context, Float64Observer) error
|
|
||||||
|
|
||||||
// Float64ObserverConfig contains options for Asynchronous instruments that
|
|
||||||
// observe float64 values.
|
|
||||||
type Float64ObserverConfig struct {
|
|
||||||
description string
|
|
||||||
unit string
|
|
||||||
callbacks []Float64Callback
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFloat64ObserverConfig returns a new Float64ObserverConfig with all opts
|
|
||||||
// applied.
|
|
||||||
func NewFloat64ObserverConfig(opts ...Float64ObserverOption) Float64ObserverConfig {
|
|
||||||
var config Float64ObserverConfig
|
|
||||||
for _, o := range opts {
|
|
||||||
config = o.applyFloat64Observer(config)
|
|
||||||
}
|
|
||||||
return config
|
|
||||||
}
|
|
||||||
|
|
||||||
// Description returns the Config description.
|
|
||||||
func (c Float64ObserverConfig) Description() string {
|
|
||||||
return c.description
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unit returns the Config unit.
|
|
||||||
func (c Float64ObserverConfig) Unit() string {
|
|
||||||
return c.unit
|
|
||||||
}
|
|
||||||
|
|
||||||
// Callbacks returns the Config callbacks.
|
|
||||||
func (c Float64ObserverConfig) Callbacks() []Float64Callback {
|
|
||||||
return c.callbacks
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64ObserverOption applies options to float64 Observer instruments.
|
|
||||||
type Float64ObserverOption interface {
|
|
||||||
applyFloat64Observer(Float64ObserverConfig) Float64ObserverConfig
|
|
||||||
}
|
|
||||||
|
|
||||||
type float64ObserverOptionFunc func(Float64ObserverConfig) Float64ObserverConfig
|
|
||||||
|
|
||||||
func (fn float64ObserverOptionFunc) applyFloat64Observer(cfg Float64ObserverConfig) Float64ObserverConfig {
|
|
||||||
return fn(cfg)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithFloat64Callback adds callback to be called for an instrument.
|
|
||||||
func WithFloat64Callback(callback Float64Callback) Float64ObserverOption {
|
|
||||||
return float64ObserverOptionFunc(func(cfg Float64ObserverConfig) Float64ObserverConfig {
|
|
||||||
cfg.callbacks = append(cfg.callbacks, callback)
|
|
||||||
return cfg
|
|
||||||
})
|
|
||||||
}
|
|
|
@ -1,130 +0,0 @@
|
||||||
// Copyright The OpenTelemetry Authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package instrument // import "go.opentelemetry.io/otel/metric/instrument"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Int64Observable describes a set of instruments used asynchronously to record
|
|
||||||
// int64 measurements once per collection cycle. Observations of these
|
|
||||||
// instruments are only made within a callback.
|
|
||||||
//
|
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
|
||||||
type Int64Observable interface {
|
|
||||||
Asynchronous
|
|
||||||
|
|
||||||
int64Observable()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64ObservableCounter is an instrument used to asynchronously record
|
|
||||||
// increasing int64 measurements once per collection cycle. Observations are
|
|
||||||
// only made within a callback for this instrument. The value observed is
|
|
||||||
// assumed the to be the cumulative sum of the count.
|
|
||||||
//
|
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
|
||||||
type Int64ObservableCounter interface{ Int64Observable }
|
|
||||||
|
|
||||||
// Int64ObservableUpDownCounter is an instrument used to asynchronously record
|
|
||||||
// int64 measurements once per collection cycle. Observations are only made
|
|
||||||
// within a callback for this instrument. The value observed is assumed the to
|
|
||||||
// be the cumulative sum of the count.
|
|
||||||
//
|
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
|
||||||
type Int64ObservableUpDownCounter interface{ Int64Observable }
|
|
||||||
|
|
||||||
// Int64ObservableGauge is an instrument used to asynchronously record
|
|
||||||
// instantaneous int64 measurements once per collection cycle. Observations are
|
|
||||||
// only made within a callback for this instrument.
|
|
||||||
//
|
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
|
||||||
type Int64ObservableGauge interface{ Int64Observable }
|
|
||||||
|
|
||||||
// Int64Observer is a recorder of int64 measurements.
|
|
||||||
//
|
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
|
||||||
type Int64Observer interface {
|
|
||||||
Observe(value int64, attributes ...attribute.KeyValue)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64Callback is a function registered with a Meter that makes
|
|
||||||
// observations for a Int64Observerable instrument it is registered with.
|
|
||||||
// Calls to the Int64Observer record measurement values for the
|
|
||||||
// Int64Observable.
|
|
||||||
//
|
|
||||||
// The function needs to complete in a finite amount of time and the deadline
|
|
||||||
// of the passed context is expected to be honored.
|
|
||||||
//
|
|
||||||
// The function needs to make unique observations across all registered
|
|
||||||
// Int64Callback. Meaning, it should not report measurements with the same
|
|
||||||
// attributes as another Int64Callbacks also registered for the same
|
|
||||||
// instrument.
|
|
||||||
//
|
|
||||||
// The function needs to be concurrent safe.
|
|
||||||
type Int64Callback func(context.Context, Int64Observer) error
|
|
||||||
|
|
||||||
// Int64ObserverConfig contains options for Asynchronous instruments that
|
|
||||||
// observe int64 values.
|
|
||||||
type Int64ObserverConfig struct {
|
|
||||||
description string
|
|
||||||
unit string
|
|
||||||
callbacks []Int64Callback
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64ObserverConfig returns a new Int64ObserverConfig with all opts
|
|
||||||
// applied.
|
|
||||||
func NewInt64ObserverConfig(opts ...Int64ObserverOption) Int64ObserverConfig {
|
|
||||||
var config Int64ObserverConfig
|
|
||||||
for _, o := range opts {
|
|
||||||
config = o.applyInt64Observer(config)
|
|
||||||
}
|
|
||||||
return config
|
|
||||||
}
|
|
||||||
|
|
||||||
// Description returns the Config description.
|
|
||||||
func (c Int64ObserverConfig) Description() string {
|
|
||||||
return c.description
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unit returns the Config unit.
|
|
||||||
func (c Int64ObserverConfig) Unit() string {
|
|
||||||
return c.unit
|
|
||||||
}
|
|
||||||
|
|
||||||
// Callbacks returns the Config callbacks.
|
|
||||||
func (c Int64ObserverConfig) Callbacks() []Int64Callback {
|
|
||||||
return c.callbacks
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64ObserverOption applies options to int64 Observer instruments.
|
|
||||||
type Int64ObserverOption interface {
|
|
||||||
applyInt64Observer(Int64ObserverConfig) Int64ObserverConfig
|
|
||||||
}
|
|
||||||
|
|
||||||
type int64ObserverOptionFunc func(Int64ObserverConfig) Int64ObserverConfig
|
|
||||||
|
|
||||||
func (fn int64ObserverOptionFunc) applyInt64Observer(cfg Int64ObserverConfig) Int64ObserverConfig {
|
|
||||||
return fn(cfg)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithInt64Callback adds callback to be called for an instrument.
|
|
||||||
func WithInt64Callback(callback Int64Callback) Int64ObserverOption {
|
|
||||||
return int64ObserverOptionFunc(func(cfg Int64ObserverConfig) Int64ObserverConfig {
|
|
||||||
cfg.callbacks = append(cfg.callbacks, callback)
|
|
||||||
return cfg
|
|
||||||
})
|
|
||||||
}
|
|
|
@ -1,88 +0,0 @@
|
||||||
// Copyright The OpenTelemetry Authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package instrument // import "go.opentelemetry.io/otel/metric/instrument"
|
|
||||||
|
|
||||||
// Asynchronous instruments are instruments that are updated within a Callback.
|
|
||||||
// If an instrument is observed outside of it's callback it should be an error.
|
|
||||||
//
|
|
||||||
// This interface is used as a grouping mechanism.
|
|
||||||
type Asynchronous interface {
|
|
||||||
asynchronous()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Synchronous instruments are updated in line with application code.
|
|
||||||
//
|
|
||||||
// This interface is used as a grouping mechanism.
|
|
||||||
type Synchronous interface {
|
|
||||||
synchronous()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Option applies options to all instruments.
|
|
||||||
type Option interface {
|
|
||||||
Float64ObserverOption
|
|
||||||
Int64ObserverOption
|
|
||||||
Float64Option
|
|
||||||
Int64Option
|
|
||||||
}
|
|
||||||
|
|
||||||
type descOpt string
|
|
||||||
|
|
||||||
func (o descOpt) applyFloat64(c Float64Config) Float64Config {
|
|
||||||
c.description = string(o)
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o descOpt) applyInt64(c Int64Config) Int64Config {
|
|
||||||
c.description = string(o)
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o descOpt) applyFloat64Observer(c Float64ObserverConfig) Float64ObserverConfig {
|
|
||||||
c.description = string(o)
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o descOpt) applyInt64Observer(c Int64ObserverConfig) Int64ObserverConfig {
|
|
||||||
c.description = string(o)
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithDescription sets the instrument description.
|
|
||||||
func WithDescription(desc string) Option { return descOpt(desc) }
|
|
||||||
|
|
||||||
type unitOpt string
|
|
||||||
|
|
||||||
func (o unitOpt) applyFloat64(c Float64Config) Float64Config {
|
|
||||||
c.unit = string(o)
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o unitOpt) applyInt64(c Int64Config) Int64Config {
|
|
||||||
c.unit = string(o)
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o unitOpt) applyFloat64Observer(c Float64ObserverConfig) Float64ObserverConfig {
|
|
||||||
c.unit = string(o)
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o unitOpt) applyInt64Observer(c Int64ObserverConfig) Int64ObserverConfig {
|
|
||||||
c.unit = string(o)
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithUnit sets the instrument unit.
|
|
||||||
func WithUnit(u string) Option { return unitOpt(u) }
|
|
|
@ -1,85 +0,0 @@
|
||||||
// Copyright The OpenTelemetry Authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package instrument // import "go.opentelemetry.io/otel/metric/instrument"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Float64Counter is an instrument that records increasing float64 values.
|
|
||||||
//
|
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
|
||||||
type Float64Counter interface {
|
|
||||||
// Add records a change to the counter.
|
|
||||||
Add(ctx context.Context, incr float64, attrs ...attribute.KeyValue)
|
|
||||||
|
|
||||||
Synchronous
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64UpDownCounter is an instrument that records increasing or decreasing
|
|
||||||
// float64 values.
|
|
||||||
//
|
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
|
||||||
type Float64UpDownCounter interface {
|
|
||||||
// Add records a change to the counter.
|
|
||||||
Add(ctx context.Context, incr float64, attrs ...attribute.KeyValue)
|
|
||||||
|
|
||||||
Synchronous
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64Histogram is an instrument that records a distribution of float64
|
|
||||||
// values.
|
|
||||||
//
|
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
|
||||||
type Float64Histogram interface {
|
|
||||||
// Record adds an additional value to the distribution.
|
|
||||||
Record(ctx context.Context, incr float64, attrs ...attribute.KeyValue)
|
|
||||||
|
|
||||||
Synchronous
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64Config contains options for Asynchronous instruments that
|
|
||||||
// observe float64 values.
|
|
||||||
type Float64Config struct {
|
|
||||||
description string
|
|
||||||
unit string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64Config contains options for Synchronous instruments that record
|
|
||||||
// float64 values.
|
|
||||||
func NewFloat64Config(opts ...Float64Option) Float64Config {
|
|
||||||
var config Float64Config
|
|
||||||
for _, o := range opts {
|
|
||||||
config = o.applyFloat64(config)
|
|
||||||
}
|
|
||||||
return config
|
|
||||||
}
|
|
||||||
|
|
||||||
// Description returns the Config description.
|
|
||||||
func (c Float64Config) Description() string {
|
|
||||||
return c.description
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unit returns the Config unit.
|
|
||||||
func (c Float64Config) Unit() string {
|
|
||||||
return c.unit
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64Option applies options to synchronous float64 instruments.
|
|
||||||
type Float64Option interface {
|
|
||||||
applyFloat64(Float64Config) Float64Config
|
|
||||||
}
|
|
|
@ -1,85 +0,0 @@
|
||||||
// Copyright The OpenTelemetry Authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package instrument // import "go.opentelemetry.io/otel/metric/instrument"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Int64Counter is an instrument that records increasing int64 values.
|
|
||||||
//
|
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
|
||||||
type Int64Counter interface {
|
|
||||||
// Add records a change to the counter.
|
|
||||||
Add(ctx context.Context, incr int64, attrs ...attribute.KeyValue)
|
|
||||||
|
|
||||||
Synchronous
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64UpDownCounter is an instrument that records increasing or decreasing
|
|
||||||
// int64 values.
|
|
||||||
//
|
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
|
||||||
type Int64UpDownCounter interface {
|
|
||||||
// Add records a change to the counter.
|
|
||||||
Add(ctx context.Context, incr int64, attrs ...attribute.KeyValue)
|
|
||||||
|
|
||||||
Synchronous
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64Histogram is an instrument that records a distribution of int64
|
|
||||||
// values.
|
|
||||||
//
|
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
|
||||||
type Int64Histogram interface {
|
|
||||||
// Record adds an additional value to the distribution.
|
|
||||||
Record(ctx context.Context, incr int64, attrs ...attribute.KeyValue)
|
|
||||||
|
|
||||||
Synchronous
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64Config contains options for Synchronous instruments that record int64
|
|
||||||
// values.
|
|
||||||
type Int64Config struct {
|
|
||||||
description string
|
|
||||||
unit string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64Config returns a new Int64Config with all opts
|
|
||||||
// applied.
|
|
||||||
func NewInt64Config(opts ...Int64Option) Int64Config {
|
|
||||||
var config Int64Config
|
|
||||||
for _, o := range opts {
|
|
||||||
config = o.applyInt64(config)
|
|
||||||
}
|
|
||||||
return config
|
|
||||||
}
|
|
||||||
|
|
||||||
// Description returns the Config description.
|
|
||||||
func (c Int64Config) Description() string {
|
|
||||||
return c.description
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unit returns the Config unit.
|
|
||||||
func (c Int64Config) Unit() string {
|
|
||||||
return c.unit
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64Option applies options to synchronous int64 instruments.
|
|
||||||
type Int64Option interface {
|
|
||||||
applyInt64(Int64Config) Int64Config
|
|
||||||
}
|
|
|
@ -1,355 +0,0 @@
|
||||||
// Copyright The OpenTelemetry Authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package global // import "go.opentelemetry.io/otel/metric/internal/global"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"sync/atomic"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel"
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
|
||||||
"go.opentelemetry.io/otel/metric"
|
|
||||||
"go.opentelemetry.io/otel/metric/instrument"
|
|
||||||
)
|
|
||||||
|
|
||||||
// unwrapper unwraps to return the underlying instrument implementation.
|
|
||||||
type unwrapper interface {
|
|
||||||
Unwrap() instrument.Asynchronous
|
|
||||||
}
|
|
||||||
|
|
||||||
type afCounter struct {
|
|
||||||
instrument.Float64Observable
|
|
||||||
|
|
||||||
name string
|
|
||||||
opts []instrument.Float64ObserverOption
|
|
||||||
|
|
||||||
delegate atomic.Value //instrument.Float64ObservableCounter
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ unwrapper = (*afCounter)(nil)
|
|
||||||
var _ instrument.Float64ObservableCounter = (*afCounter)(nil)
|
|
||||||
|
|
||||||
func (i *afCounter) setDelegate(m metric.Meter) {
|
|
||||||
ctr, err := m.Float64ObservableCounter(i.name, i.opts...)
|
|
||||||
if err != nil {
|
|
||||||
otel.Handle(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
i.delegate.Store(ctr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *afCounter) Unwrap() instrument.Asynchronous {
|
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
|
||||||
return ctr.(instrument.Float64ObservableCounter)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type afUpDownCounter struct {
|
|
||||||
instrument.Float64Observable
|
|
||||||
|
|
||||||
name string
|
|
||||||
opts []instrument.Float64ObserverOption
|
|
||||||
|
|
||||||
delegate atomic.Value //instrument.Float64ObservableUpDownCounter
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ unwrapper = (*afUpDownCounter)(nil)
|
|
||||||
var _ instrument.Float64ObservableUpDownCounter = (*afUpDownCounter)(nil)
|
|
||||||
|
|
||||||
func (i *afUpDownCounter) setDelegate(m metric.Meter) {
|
|
||||||
ctr, err := m.Float64ObservableUpDownCounter(i.name, i.opts...)
|
|
||||||
if err != nil {
|
|
||||||
otel.Handle(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
i.delegate.Store(ctr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *afUpDownCounter) Unwrap() instrument.Asynchronous {
|
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
|
||||||
return ctr.(instrument.Float64ObservableUpDownCounter)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type afGauge struct {
|
|
||||||
instrument.Float64Observable
|
|
||||||
|
|
||||||
name string
|
|
||||||
opts []instrument.Float64ObserverOption
|
|
||||||
|
|
||||||
delegate atomic.Value //instrument.Float64ObservableGauge
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ unwrapper = (*afGauge)(nil)
|
|
||||||
var _ instrument.Float64ObservableGauge = (*afGauge)(nil)
|
|
||||||
|
|
||||||
func (i *afGauge) setDelegate(m metric.Meter) {
|
|
||||||
ctr, err := m.Float64ObservableGauge(i.name, i.opts...)
|
|
||||||
if err != nil {
|
|
||||||
otel.Handle(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
i.delegate.Store(ctr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *afGauge) Unwrap() instrument.Asynchronous {
|
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
|
||||||
return ctr.(instrument.Float64ObservableGauge)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type aiCounter struct {
|
|
||||||
instrument.Int64Observable
|
|
||||||
|
|
||||||
name string
|
|
||||||
opts []instrument.Int64ObserverOption
|
|
||||||
|
|
||||||
delegate atomic.Value //instrument.Int64ObservableCounter
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ unwrapper = (*aiCounter)(nil)
|
|
||||||
var _ instrument.Int64ObservableCounter = (*aiCounter)(nil)
|
|
||||||
|
|
||||||
func (i *aiCounter) setDelegate(m metric.Meter) {
|
|
||||||
ctr, err := m.Int64ObservableCounter(i.name, i.opts...)
|
|
||||||
if err != nil {
|
|
||||||
otel.Handle(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
i.delegate.Store(ctr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *aiCounter) Unwrap() instrument.Asynchronous {
|
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
|
||||||
return ctr.(instrument.Int64ObservableCounter)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type aiUpDownCounter struct {
|
|
||||||
instrument.Int64Observable
|
|
||||||
|
|
||||||
name string
|
|
||||||
opts []instrument.Int64ObserverOption
|
|
||||||
|
|
||||||
delegate atomic.Value //instrument.Int64ObservableUpDownCounter
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ unwrapper = (*aiUpDownCounter)(nil)
|
|
||||||
var _ instrument.Int64ObservableUpDownCounter = (*aiUpDownCounter)(nil)
|
|
||||||
|
|
||||||
func (i *aiUpDownCounter) setDelegate(m metric.Meter) {
|
|
||||||
ctr, err := m.Int64ObservableUpDownCounter(i.name, i.opts...)
|
|
||||||
if err != nil {
|
|
||||||
otel.Handle(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
i.delegate.Store(ctr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *aiUpDownCounter) Unwrap() instrument.Asynchronous {
|
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
|
||||||
return ctr.(instrument.Int64ObservableUpDownCounter)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type aiGauge struct {
|
|
||||||
instrument.Int64Observable
|
|
||||||
|
|
||||||
name string
|
|
||||||
opts []instrument.Int64ObserverOption
|
|
||||||
|
|
||||||
delegate atomic.Value //instrument.Int64ObservableGauge
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ unwrapper = (*aiGauge)(nil)
|
|
||||||
var _ instrument.Int64ObservableGauge = (*aiGauge)(nil)
|
|
||||||
|
|
||||||
func (i *aiGauge) setDelegate(m metric.Meter) {
|
|
||||||
ctr, err := m.Int64ObservableGauge(i.name, i.opts...)
|
|
||||||
if err != nil {
|
|
||||||
otel.Handle(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
i.delegate.Store(ctr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *aiGauge) Unwrap() instrument.Asynchronous {
|
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
|
||||||
return ctr.(instrument.Int64ObservableGauge)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sync Instruments.
|
|
||||||
type sfCounter struct {
|
|
||||||
name string
|
|
||||||
opts []instrument.Float64Option
|
|
||||||
|
|
||||||
delegate atomic.Value //instrument.Float64Counter
|
|
||||||
|
|
||||||
instrument.Synchronous
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ instrument.Float64Counter = (*sfCounter)(nil)
|
|
||||||
|
|
||||||
func (i *sfCounter) setDelegate(m metric.Meter) {
|
|
||||||
ctr, err := m.Float64Counter(i.name, i.opts...)
|
|
||||||
if err != nil {
|
|
||||||
otel.Handle(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
i.delegate.Store(ctr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *sfCounter) Add(ctx context.Context, incr float64, attrs ...attribute.KeyValue) {
|
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
|
||||||
ctr.(instrument.Float64Counter).Add(ctx, incr, attrs...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type sfUpDownCounter struct {
|
|
||||||
name string
|
|
||||||
opts []instrument.Float64Option
|
|
||||||
|
|
||||||
delegate atomic.Value //instrument.Float64UpDownCounter
|
|
||||||
|
|
||||||
instrument.Synchronous
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ instrument.Float64UpDownCounter = (*sfUpDownCounter)(nil)
|
|
||||||
|
|
||||||
func (i *sfUpDownCounter) setDelegate(m metric.Meter) {
|
|
||||||
ctr, err := m.Float64UpDownCounter(i.name, i.opts...)
|
|
||||||
if err != nil {
|
|
||||||
otel.Handle(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
i.delegate.Store(ctr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *sfUpDownCounter) Add(ctx context.Context, incr float64, attrs ...attribute.KeyValue) {
|
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
|
||||||
ctr.(instrument.Float64UpDownCounter).Add(ctx, incr, attrs...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type sfHistogram struct {
|
|
||||||
name string
|
|
||||||
opts []instrument.Float64Option
|
|
||||||
|
|
||||||
delegate atomic.Value //instrument.Float64Histogram
|
|
||||||
|
|
||||||
instrument.Synchronous
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ instrument.Float64Histogram = (*sfHistogram)(nil)
|
|
||||||
|
|
||||||
func (i *sfHistogram) setDelegate(m metric.Meter) {
|
|
||||||
ctr, err := m.Float64Histogram(i.name, i.opts...)
|
|
||||||
if err != nil {
|
|
||||||
otel.Handle(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
i.delegate.Store(ctr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *sfHistogram) Record(ctx context.Context, x float64, attrs ...attribute.KeyValue) {
|
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
|
||||||
ctr.(instrument.Float64Histogram).Record(ctx, x, attrs...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type siCounter struct {
|
|
||||||
name string
|
|
||||||
opts []instrument.Int64Option
|
|
||||||
|
|
||||||
delegate atomic.Value //instrument.Int64Counter
|
|
||||||
|
|
||||||
instrument.Synchronous
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ instrument.Int64Counter = (*siCounter)(nil)
|
|
||||||
|
|
||||||
func (i *siCounter) setDelegate(m metric.Meter) {
|
|
||||||
ctr, err := m.Int64Counter(i.name, i.opts...)
|
|
||||||
if err != nil {
|
|
||||||
otel.Handle(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
i.delegate.Store(ctr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *siCounter) Add(ctx context.Context, x int64, attrs ...attribute.KeyValue) {
|
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
|
||||||
ctr.(instrument.Int64Counter).Add(ctx, x, attrs...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type siUpDownCounter struct {
|
|
||||||
name string
|
|
||||||
opts []instrument.Int64Option
|
|
||||||
|
|
||||||
delegate atomic.Value //instrument.Int64UpDownCounter
|
|
||||||
|
|
||||||
instrument.Synchronous
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ instrument.Int64UpDownCounter = (*siUpDownCounter)(nil)
|
|
||||||
|
|
||||||
func (i *siUpDownCounter) setDelegate(m metric.Meter) {
|
|
||||||
ctr, err := m.Int64UpDownCounter(i.name, i.opts...)
|
|
||||||
if err != nil {
|
|
||||||
otel.Handle(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
i.delegate.Store(ctr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *siUpDownCounter) Add(ctx context.Context, x int64, attrs ...attribute.KeyValue) {
|
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
|
||||||
ctr.(instrument.Int64UpDownCounter).Add(ctx, x, attrs...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type siHistogram struct {
|
|
||||||
name string
|
|
||||||
opts []instrument.Int64Option
|
|
||||||
|
|
||||||
delegate atomic.Value //instrument.Int64Histogram
|
|
||||||
|
|
||||||
instrument.Synchronous
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ instrument.Int64Histogram = (*siHistogram)(nil)
|
|
||||||
|
|
||||||
func (i *siHistogram) setDelegate(m metric.Meter) {
|
|
||||||
ctr, err := m.Int64Histogram(i.name, i.opts...)
|
|
||||||
if err != nil {
|
|
||||||
otel.Handle(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
i.delegate.Store(ctr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *siHistogram) Record(ctx context.Context, x int64, attrs ...attribute.KeyValue) {
|
|
||||||
if ctr := i.delegate.Load(); ctr != nil {
|
|
||||||
ctr.(instrument.Int64Histogram).Record(ctx, x, attrs...)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,68 +0,0 @@
|
||||||
// Copyright The OpenTelemetry Authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// htmp://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package global // import "go.opentelemetry.io/otel/metric/internal/global"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"sync"
|
|
||||||
"sync/atomic"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/internal/global"
|
|
||||||
"go.opentelemetry.io/otel/metric"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
globalMeterProvider = defaultMeterProvider()
|
|
||||||
|
|
||||||
delegateMeterOnce sync.Once
|
|
||||||
)
|
|
||||||
|
|
||||||
type meterProviderHolder struct {
|
|
||||||
mp metric.MeterProvider
|
|
||||||
}
|
|
||||||
|
|
||||||
// MeterProvider is the internal implementation for global.MeterProvider.
|
|
||||||
func MeterProvider() metric.MeterProvider {
|
|
||||||
return globalMeterProvider.Load().(meterProviderHolder).mp
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMeterProvider is the internal implementation for global.SetMeterProvider.
|
|
||||||
func SetMeterProvider(mp metric.MeterProvider) {
|
|
||||||
current := MeterProvider()
|
|
||||||
if _, cOk := current.(*meterProvider); cOk {
|
|
||||||
if _, mpOk := mp.(*meterProvider); mpOk && current == mp {
|
|
||||||
// Do not assign the default delegating MeterProvider to delegate
|
|
||||||
// to itself.
|
|
||||||
global.Error(
|
|
||||||
errors.New("no delegate configured in meter provider"),
|
|
||||||
"Setting meter provider to it's current value. No delegate will be configured",
|
|
||||||
)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delegateMeterOnce.Do(func() {
|
|
||||||
if def, ok := current.(*meterProvider); ok {
|
|
||||||
def.setDelegate(mp)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
globalMeterProvider.Store(meterProviderHolder{mp: mp})
|
|
||||||
}
|
|
||||||
|
|
||||||
func defaultMeterProvider() *atomic.Value {
|
|
||||||
v := &atomic.Value{}
|
|
||||||
v.Store(meterProviderHolder{mp: &meterProvider{}})
|
|
||||||
return v
|
|
||||||
}
|
|
|
@ -17,80 +17,134 @@ package metric // import "go.opentelemetry.io/otel/metric"
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/metric/embedded"
|
||||||
"go.opentelemetry.io/otel/metric/instrument"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// MeterProvider provides access to named Meter instances, for instrumenting
|
// MeterProvider provides access to named Meter instances, for instrumenting
|
||||||
// an application or library.
|
// an application or package.
|
||||||
//
|
//
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
type MeterProvider interface {
|
type MeterProvider interface {
|
||||||
// Meter creates an instance of a `Meter` interface. The name must be the
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
// name of the library providing instrumentation. This name may be the same
|
// by implementations of this interface. See the "API Implementations"
|
||||||
// as the instrumented code only if that code provides built-in
|
// section of the package documentation for more information.
|
||||||
// instrumentation. If the name is empty, then a implementation defined
|
embedded.MeterProvider
|
||||||
// default name will be used instead.
|
|
||||||
|
// Meter returns a new Meter with the provided name and configuration.
|
||||||
|
//
|
||||||
|
// A Meter should be scoped at most to a single package. The name needs to
|
||||||
|
// be unique so it does not collide with other names used by
|
||||||
|
// an application, nor other applications. To achieve this, the import path
|
||||||
|
// of the instrumentation package is recommended to be used as name.
|
||||||
|
//
|
||||||
|
// If the name is empty, then an implementation defined default name will
|
||||||
|
// be used instead.
|
||||||
Meter(name string, opts ...MeterOption) Meter
|
Meter(name string, opts ...MeterOption) Meter
|
||||||
}
|
}
|
||||||
|
|
||||||
// Meter provides access to instrument instances for recording metrics.
|
// Meter provides access to instrument instances for recording metrics.
|
||||||
//
|
//
|
||||||
// Warning: methods may be added to this interface in minor releases.
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
type Meter interface {
|
type Meter interface {
|
||||||
// Int64Counter returns a new instrument identified by name and configured
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
// with options. The instrument is used to synchronously record increasing
|
// by implementations of this interface. See the "API Implementations"
|
||||||
// int64 measurements during a computational operation.
|
// section of the package documentation for more information.
|
||||||
Int64Counter(name string, options ...instrument.Int64Option) (instrument.Int64Counter, error)
|
embedded.Meter
|
||||||
// Int64UpDownCounter returns a new instrument identified by name and
|
|
||||||
// configured with options. The instrument is used to synchronously record
|
|
||||||
// int64 measurements during a computational operation.
|
|
||||||
Int64UpDownCounter(name string, options ...instrument.Int64Option) (instrument.Int64UpDownCounter, error)
|
|
||||||
// Int64Histogram returns a new instrument identified by name and
|
|
||||||
// configured with options. The instrument is used to synchronously record
|
|
||||||
// the distribution of int64 measurements during a computational operation.
|
|
||||||
Int64Histogram(name string, options ...instrument.Int64Option) (instrument.Int64Histogram, error)
|
|
||||||
// Int64ObservableCounter returns a new instrument identified by name and
|
|
||||||
// configured with options. The instrument is used to asynchronously record
|
|
||||||
// increasing int64 measurements once per a measurement collection cycle.
|
|
||||||
Int64ObservableCounter(name string, options ...instrument.Int64ObserverOption) (instrument.Int64ObservableCounter, error)
|
|
||||||
// Int64ObservableUpDownCounter returns a new instrument identified by name
|
|
||||||
// and configured with options. The instrument is used to asynchronously
|
|
||||||
// record int64 measurements once per a measurement collection cycle.
|
|
||||||
Int64ObservableUpDownCounter(name string, options ...instrument.Int64ObserverOption) (instrument.Int64ObservableUpDownCounter, error)
|
|
||||||
// Int64ObservableGauge returns a new instrument identified by name and
|
|
||||||
// configured with options. The instrument is used to asynchronously record
|
|
||||||
// instantaneous int64 measurements once per a measurement collection
|
|
||||||
// cycle.
|
|
||||||
Int64ObservableGauge(name string, options ...instrument.Int64ObserverOption) (instrument.Int64ObservableGauge, error)
|
|
||||||
|
|
||||||
// Float64Counter returns a new instrument identified by name and
|
// Int64Counter returns a new Int64Counter instrument identified by name
|
||||||
// configured with options. The instrument is used to synchronously record
|
// and configured with options. The instrument is used to synchronously
|
||||||
// increasing float64 measurements during a computational operation.
|
// record increasing int64 measurements during a computational operation.
|
||||||
Float64Counter(name string, options ...instrument.Float64Option) (instrument.Float64Counter, error)
|
Int64Counter(name string, options ...Int64CounterOption) (Int64Counter, error)
|
||||||
// Float64UpDownCounter returns a new instrument identified by name and
|
// Int64UpDownCounter returns a new Int64UpDownCounter instrument
|
||||||
// configured with options. The instrument is used to synchronously record
|
// identified by name and configured with options. The instrument is used
|
||||||
// float64 measurements during a computational operation.
|
// to synchronously record int64 measurements during a computational
|
||||||
Float64UpDownCounter(name string, options ...instrument.Float64Option) (instrument.Float64UpDownCounter, error)
|
|
||||||
// Float64Histogram returns a new instrument identified by name and
|
|
||||||
// configured with options. The instrument is used to synchronously record
|
|
||||||
// the distribution of float64 measurements during a computational
|
|
||||||
// operation.
|
// operation.
|
||||||
Float64Histogram(name string, options ...instrument.Float64Option) (instrument.Float64Histogram, error)
|
Int64UpDownCounter(name string, options ...Int64UpDownCounterOption) (Int64UpDownCounter, error)
|
||||||
// Float64ObservableCounter returns a new instrument identified by name and
|
// Int64Histogram returns a new Int64Histogram instrument identified by
|
||||||
// configured with options. The instrument is used to asynchronously record
|
|
||||||
// increasing float64 measurements once per a measurement collection cycle.
|
|
||||||
Float64ObservableCounter(name string, options ...instrument.Float64ObserverOption) (instrument.Float64ObservableCounter, error)
|
|
||||||
// Float64ObservableUpDownCounter returns a new instrument identified by
|
|
||||||
// name and configured with options. The instrument is used to
|
// name and configured with options. The instrument is used to
|
||||||
// asynchronously record float64 measurements once per a measurement
|
// synchronously record the distribution of int64 measurements during a
|
||||||
// collection cycle.
|
// computational operation.
|
||||||
Float64ObservableUpDownCounter(name string, options ...instrument.Float64ObserverOption) (instrument.Float64ObservableUpDownCounter, error)
|
Int64Histogram(name string, options ...Int64HistogramOption) (Int64Histogram, error)
|
||||||
// Float64ObservableGauge returns a new instrument identified by name and
|
// Int64ObservableCounter returns a new Int64ObservableCounter identified
|
||||||
|
// by name and configured with options. The instrument is used to
|
||||||
|
// asynchronously record increasing int64 measurements once per a
|
||||||
|
// measurement collection cycle.
|
||||||
|
//
|
||||||
|
// Measurements for the returned instrument are made via a callback. Use
|
||||||
|
// the WithInt64Callback option to register the callback here, or use the
|
||||||
|
// RegisterCallback method of this Meter to register one later. See the
|
||||||
|
// Measurements section of the package documentation for more information.
|
||||||
|
Int64ObservableCounter(name string, options ...Int64ObservableCounterOption) (Int64ObservableCounter, error)
|
||||||
|
// Int64ObservableUpDownCounter returns a new Int64ObservableUpDownCounter
|
||||||
|
// instrument identified by name and configured with options. The
|
||||||
|
// instrument is used to asynchronously record int64 measurements once per
|
||||||
|
// a measurement collection cycle.
|
||||||
|
//
|
||||||
|
// Measurements for the returned instrument are made via a callback. Use
|
||||||
|
// the WithInt64Callback option to register the callback here, or use the
|
||||||
|
// RegisterCallback method of this Meter to register one later. See the
|
||||||
|
// Measurements section of the package documentation for more information.
|
||||||
|
Int64ObservableUpDownCounter(name string, options ...Int64ObservableUpDownCounterOption) (Int64ObservableUpDownCounter, error)
|
||||||
|
// Int64ObservableGauge returns a new Int64ObservableGauge instrument
|
||||||
|
// identified by name and configured with options. The instrument is used
|
||||||
|
// to asynchronously record instantaneous int64 measurements once per a
|
||||||
|
// measurement collection cycle.
|
||||||
|
//
|
||||||
|
// Measurements for the returned instrument are made via a callback. Use
|
||||||
|
// the WithInt64Callback option to register the callback here, or use the
|
||||||
|
// RegisterCallback method of this Meter to register one later. See the
|
||||||
|
// Measurements section of the package documentation for more information.
|
||||||
|
Int64ObservableGauge(name string, options ...Int64ObservableGaugeOption) (Int64ObservableGauge, error)
|
||||||
|
|
||||||
|
// Float64Counter returns a new Float64Counter instrument identified by
|
||||||
|
// name and configured with options. The instrument is used to
|
||||||
|
// synchronously record increasing float64 measurements during a
|
||||||
|
// computational operation.
|
||||||
|
Float64Counter(name string, options ...Float64CounterOption) (Float64Counter, error)
|
||||||
|
// Float64UpDownCounter returns a new Float64UpDownCounter instrument
|
||||||
|
// identified by name and configured with options. The instrument is used
|
||||||
|
// to synchronously record float64 measurements during a computational
|
||||||
|
// operation.
|
||||||
|
Float64UpDownCounter(name string, options ...Float64UpDownCounterOption) (Float64UpDownCounter, error)
|
||||||
|
// Float64Histogram returns a new Float64Histogram instrument identified by
|
||||||
|
// name and configured with options. The instrument is used to
|
||||||
|
// synchronously record the distribution of float64 measurements during a
|
||||||
|
// computational operation.
|
||||||
|
Float64Histogram(name string, options ...Float64HistogramOption) (Float64Histogram, error)
|
||||||
|
// Float64ObservableCounter returns a new Float64ObservableCounter
|
||||||
|
// instrument identified by name and configured with options. The
|
||||||
|
// instrument is used to asynchronously record increasing float64
|
||||||
|
// measurements once per a measurement collection cycle.
|
||||||
|
//
|
||||||
|
// Measurements for the returned instrument are made via a callback. Use
|
||||||
|
// the WithFloat64Callback option to register the callback here, or use the
|
||||||
|
// RegisterCallback method of this Meter to register one later. See the
|
||||||
|
// Measurements section of the package documentation for more information.
|
||||||
|
Float64ObservableCounter(name string, options ...Float64ObservableCounterOption) (Float64ObservableCounter, error)
|
||||||
|
// Float64ObservableUpDownCounter returns a new
|
||||||
|
// Float64ObservableUpDownCounter instrument identified by name and
|
||||||
// configured with options. The instrument is used to asynchronously record
|
// configured with options. The instrument is used to asynchronously record
|
||||||
// instantaneous float64 measurements once per a measurement collection
|
// float64 measurements once per a measurement collection cycle.
|
||||||
// cycle.
|
//
|
||||||
Float64ObservableGauge(name string, options ...instrument.Float64ObserverOption) (instrument.Float64ObservableGauge, error)
|
// Measurements for the returned instrument are made via a callback. Use
|
||||||
|
// the WithFloat64Callback option to register the callback here, or use the
|
||||||
|
// RegisterCallback method of this Meter to register one later. See the
|
||||||
|
// Measurements section of the package documentation for more information.
|
||||||
|
Float64ObservableUpDownCounter(name string, options ...Float64ObservableUpDownCounterOption) (Float64ObservableUpDownCounter, error)
|
||||||
|
// Float64ObservableGauge returns a new Float64ObservableGauge instrument
|
||||||
|
// identified by name and configured with options. The instrument is used
|
||||||
|
// to asynchronously record instantaneous float64 measurements once per a
|
||||||
|
// measurement collection cycle.
|
||||||
|
//
|
||||||
|
// Measurements for the returned instrument are made via a callback. Use
|
||||||
|
// the WithFloat64Callback option to register the callback here, or use the
|
||||||
|
// RegisterCallback method of this Meter to register one later. See the
|
||||||
|
// Measurements section of the package documentation for more information.
|
||||||
|
Float64ObservableGauge(name string, options ...Float64ObservableGaugeOption) (Float64ObservableGauge, error)
|
||||||
|
|
||||||
// RegisterCallback registers f to be called during the collection of a
|
// RegisterCallback registers f to be called during the collection of a
|
||||||
// measurement cycle.
|
// measurement cycle.
|
||||||
|
@ -103,12 +157,14 @@ type Meter interface {
|
||||||
//
|
//
|
||||||
// If no instruments are passed, f should not be registered nor called
|
// If no instruments are passed, f should not be registered nor called
|
||||||
// during collection.
|
// during collection.
|
||||||
RegisterCallback(f Callback, instruments ...instrument.Asynchronous) (Registration, error)
|
//
|
||||||
|
// The function f needs to be concurrent safe.
|
||||||
|
RegisterCallback(f Callback, instruments ...Observable) (Registration, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Callback is a function registered with a Meter that makes observations for
|
// Callback is a function registered with a Meter that makes observations for
|
||||||
// the set of instruments it is registered with. The Observer parameter is used
|
// the set of instruments it is registered with. The Observer parameter is used
|
||||||
// to record measurment observations for these instruments.
|
// to record measurement observations for these instruments.
|
||||||
//
|
//
|
||||||
// The function needs to complete in a finite amount of time and the deadline
|
// The function needs to complete in a finite amount of time and the deadline
|
||||||
// of the passed context is expected to be honored.
|
// of the passed context is expected to be honored.
|
||||||
|
@ -121,16 +177,34 @@ type Meter interface {
|
||||||
type Callback func(context.Context, Observer) error
|
type Callback func(context.Context, Observer) error
|
||||||
|
|
||||||
// Observer records measurements for multiple instruments in a Callback.
|
// Observer records measurements for multiple instruments in a Callback.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
type Observer interface {
|
type Observer interface {
|
||||||
// ObserveFloat64 records the float64 value with attributes for obsrv.
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
ObserveFloat64(obsrv instrument.Float64Observable, value float64, attributes ...attribute.KeyValue)
|
// by implementations of this interface. See the "API Implementations"
|
||||||
// ObserveInt64 records the int64 value with attributes for obsrv.
|
// section of the package documentation for more information.
|
||||||
ObserveInt64(obsrv instrument.Int64Observable, value int64, attributes ...attribute.KeyValue)
|
embedded.Observer
|
||||||
|
|
||||||
|
// ObserveFloat64 records the float64 value for obsrv.
|
||||||
|
ObserveFloat64(obsrv Float64Observable, value float64, opts ...ObserveOption)
|
||||||
|
// ObserveInt64 records the int64 value for obsrv.
|
||||||
|
ObserveInt64(obsrv Int64Observable, value int64, opts ...ObserveOption)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Registration is an token representing the unique registration of a callback
|
// Registration is an token representing the unique registration of a callback
|
||||||
// for a set of instruments with a Meter.
|
// for a set of instruments with a Meter.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
type Registration interface {
|
type Registration interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Registration
|
||||||
|
|
||||||
// Unregister removes the callback registration from a Meter.
|
// Unregister removes the callback registration from a Meter.
|
||||||
//
|
//
|
||||||
// This method needs to be idempotent and concurrent safe.
|
// This method needs to be idempotent and concurrent safe.
|
||||||
|
|
|
@ -1,143 +0,0 @@
|
||||||
// Copyright The OpenTelemetry Authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package metric // import "go.opentelemetry.io/otel/metric"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
|
||||||
"go.opentelemetry.io/otel/metric/instrument"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NewNoopMeterProvider creates a MeterProvider that does not record any metrics.
|
|
||||||
func NewNoopMeterProvider() MeterProvider {
|
|
||||||
return noopMeterProvider{}
|
|
||||||
}
|
|
||||||
|
|
||||||
type noopMeterProvider struct{}
|
|
||||||
|
|
||||||
func (noopMeterProvider) Meter(string, ...MeterOption) Meter {
|
|
||||||
return noopMeter{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewNoopMeter creates a Meter that does not record any metrics.
|
|
||||||
func NewNoopMeter() Meter {
|
|
||||||
return noopMeter{}
|
|
||||||
}
|
|
||||||
|
|
||||||
type noopMeter struct{}
|
|
||||||
|
|
||||||
func (noopMeter) Int64Counter(string, ...instrument.Int64Option) (instrument.Int64Counter, error) {
|
|
||||||
return nonrecordingSyncInt64Instrument{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (noopMeter) Int64UpDownCounter(string, ...instrument.Int64Option) (instrument.Int64UpDownCounter, error) {
|
|
||||||
return nonrecordingSyncInt64Instrument{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (noopMeter) Int64Histogram(string, ...instrument.Int64Option) (instrument.Int64Histogram, error) {
|
|
||||||
return nonrecordingSyncInt64Instrument{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (noopMeter) Int64ObservableCounter(string, ...instrument.Int64ObserverOption) (instrument.Int64ObservableCounter, error) {
|
|
||||||
return nonrecordingAsyncInt64Instrument{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (noopMeter) Int64ObservableUpDownCounter(string, ...instrument.Int64ObserverOption) (instrument.Int64ObservableUpDownCounter, error) {
|
|
||||||
return nonrecordingAsyncInt64Instrument{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (noopMeter) Int64ObservableGauge(string, ...instrument.Int64ObserverOption) (instrument.Int64ObservableGauge, error) {
|
|
||||||
return nonrecordingAsyncInt64Instrument{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (noopMeter) Float64Counter(string, ...instrument.Float64Option) (instrument.Float64Counter, error) {
|
|
||||||
return nonrecordingSyncFloat64Instrument{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (noopMeter) Float64UpDownCounter(string, ...instrument.Float64Option) (instrument.Float64UpDownCounter, error) {
|
|
||||||
return nonrecordingSyncFloat64Instrument{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (noopMeter) Float64Histogram(string, ...instrument.Float64Option) (instrument.Float64Histogram, error) {
|
|
||||||
return nonrecordingSyncFloat64Instrument{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (noopMeter) Float64ObservableCounter(string, ...instrument.Float64ObserverOption) (instrument.Float64ObservableCounter, error) {
|
|
||||||
return nonrecordingAsyncFloat64Instrument{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (noopMeter) Float64ObservableUpDownCounter(string, ...instrument.Float64ObserverOption) (instrument.Float64ObservableUpDownCounter, error) {
|
|
||||||
return nonrecordingAsyncFloat64Instrument{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (noopMeter) Float64ObservableGauge(string, ...instrument.Float64ObserverOption) (instrument.Float64ObservableGauge, error) {
|
|
||||||
return nonrecordingAsyncFloat64Instrument{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// RegisterCallback creates a register callback that does not record any metrics.
|
|
||||||
func (noopMeter) RegisterCallback(Callback, ...instrument.Asynchronous) (Registration, error) {
|
|
||||||
return noopReg{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type noopReg struct{}
|
|
||||||
|
|
||||||
func (noopReg) Unregister() error { return nil }
|
|
||||||
|
|
||||||
type nonrecordingAsyncFloat64Instrument struct {
|
|
||||||
instrument.Float64Observable
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
_ instrument.Float64ObservableCounter = nonrecordingAsyncFloat64Instrument{}
|
|
||||||
_ instrument.Float64ObservableUpDownCounter = nonrecordingAsyncFloat64Instrument{}
|
|
||||||
_ instrument.Float64ObservableGauge = nonrecordingAsyncFloat64Instrument{}
|
|
||||||
)
|
|
||||||
|
|
||||||
type nonrecordingAsyncInt64Instrument struct {
|
|
||||||
instrument.Int64Observable
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
_ instrument.Int64ObservableCounter = nonrecordingAsyncInt64Instrument{}
|
|
||||||
_ instrument.Int64ObservableUpDownCounter = nonrecordingAsyncInt64Instrument{}
|
|
||||||
_ instrument.Int64ObservableGauge = nonrecordingAsyncInt64Instrument{}
|
|
||||||
)
|
|
||||||
|
|
||||||
type nonrecordingSyncFloat64Instrument struct {
|
|
||||||
instrument.Synchronous
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
_ instrument.Float64Counter = nonrecordingSyncFloat64Instrument{}
|
|
||||||
_ instrument.Float64UpDownCounter = nonrecordingSyncFloat64Instrument{}
|
|
||||||
_ instrument.Float64Histogram = nonrecordingSyncFloat64Instrument{}
|
|
||||||
)
|
|
||||||
|
|
||||||
func (nonrecordingSyncFloat64Instrument) Add(context.Context, float64, ...attribute.KeyValue) {}
|
|
||||||
func (nonrecordingSyncFloat64Instrument) Record(context.Context, float64, ...attribute.KeyValue) {}
|
|
||||||
|
|
||||||
type nonrecordingSyncInt64Instrument struct {
|
|
||||||
instrument.Synchronous
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
_ instrument.Int64Counter = nonrecordingSyncInt64Instrument{}
|
|
||||||
_ instrument.Int64UpDownCounter = nonrecordingSyncInt64Instrument{}
|
|
||||||
_ instrument.Int64Histogram = nonrecordingSyncInt64Instrument{}
|
|
||||||
)
|
|
||||||
|
|
||||||
func (nonrecordingSyncInt64Instrument) Add(context.Context, int64, ...attribute.KeyValue) {}
|
|
||||||
func (nonrecordingSyncInt64Instrument) Record(context.Context, int64, ...attribute.KeyValue) {}
|
|
|
@ -0,0 +1,179 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package metric // import "go.opentelemetry.io/otel/metric"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/metric/embedded"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Float64Counter is an instrument that records increasing float64 values.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Float64Counter interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Float64Counter
|
||||||
|
|
||||||
|
// Add records a change to the counter.
|
||||||
|
//
|
||||||
|
// Use the WithAttributeSet (or, if performance is not a concern,
|
||||||
|
// the WithAttributes) option to include measurement attributes.
|
||||||
|
Add(ctx context.Context, incr float64, options ...AddOption)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64CounterConfig contains options for synchronous counter instruments that
|
||||||
|
// record int64 values.
|
||||||
|
type Float64CounterConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFloat64CounterConfig returns a new [Float64CounterConfig] with all opts
|
||||||
|
// applied.
|
||||||
|
func NewFloat64CounterConfig(opts ...Float64CounterOption) Float64CounterConfig {
|
||||||
|
var config Float64CounterConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyFloat64Counter(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Float64CounterConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Float64CounterConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64CounterOption applies options to a [Float64CounterConfig]. See
|
||||||
|
// [InstrumentOption] for other options that can be used as a
|
||||||
|
// Float64CounterOption.
|
||||||
|
type Float64CounterOption interface {
|
||||||
|
applyFloat64Counter(Float64CounterConfig) Float64CounterConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64UpDownCounter is an instrument that records increasing or decreasing
|
||||||
|
// float64 values.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Float64UpDownCounter interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Float64UpDownCounter
|
||||||
|
|
||||||
|
// Add records a change to the counter.
|
||||||
|
//
|
||||||
|
// Use the WithAttributeSet (or, if performance is not a concern,
|
||||||
|
// the WithAttributes) option to include measurement attributes.
|
||||||
|
Add(ctx context.Context, incr float64, options ...AddOption)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64UpDownCounterConfig contains options for synchronous counter
|
||||||
|
// instruments that record int64 values.
|
||||||
|
type Float64UpDownCounterConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFloat64UpDownCounterConfig returns a new [Float64UpDownCounterConfig]
|
||||||
|
// with all opts applied.
|
||||||
|
func NewFloat64UpDownCounterConfig(opts ...Float64UpDownCounterOption) Float64UpDownCounterConfig {
|
||||||
|
var config Float64UpDownCounterConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyFloat64UpDownCounter(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Float64UpDownCounterConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Float64UpDownCounterConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64UpDownCounterOption applies options to a
|
||||||
|
// [Float64UpDownCounterConfig]. See [InstrumentOption] for other options that
|
||||||
|
// can be used as a Float64UpDownCounterOption.
|
||||||
|
type Float64UpDownCounterOption interface {
|
||||||
|
applyFloat64UpDownCounter(Float64UpDownCounterConfig) Float64UpDownCounterConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64Histogram is an instrument that records a distribution of float64
|
||||||
|
// values.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Float64Histogram interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Float64Histogram
|
||||||
|
|
||||||
|
// Record adds an additional value to the distribution.
|
||||||
|
//
|
||||||
|
// Use the WithAttributeSet (or, if performance is not a concern,
|
||||||
|
// the WithAttributes) option to include measurement attributes.
|
||||||
|
Record(ctx context.Context, incr float64, options ...RecordOption)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64HistogramConfig contains options for synchronous counter instruments
|
||||||
|
// that record int64 values.
|
||||||
|
type Float64HistogramConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFloat64HistogramConfig returns a new [Float64HistogramConfig] with all
|
||||||
|
// opts applied.
|
||||||
|
func NewFloat64HistogramConfig(opts ...Float64HistogramOption) Float64HistogramConfig {
|
||||||
|
var config Float64HistogramConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyFloat64Histogram(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Float64HistogramConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Float64HistogramConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Float64HistogramOption applies options to a [Float64HistogramConfig]. See
|
||||||
|
// [InstrumentOption] for other options that can be used as a
|
||||||
|
// Float64HistogramOption.
|
||||||
|
type Float64HistogramOption interface {
|
||||||
|
applyFloat64Histogram(Float64HistogramConfig) Float64HistogramConfig
|
||||||
|
}
|
|
@ -0,0 +1,179 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package metric // import "go.opentelemetry.io/otel/metric"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/metric/embedded"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Int64Counter is an instrument that records increasing int64 values.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Int64Counter interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Int64Counter
|
||||||
|
|
||||||
|
// Add records a change to the counter.
|
||||||
|
//
|
||||||
|
// Use the WithAttributeSet (or, if performance is not a concern,
|
||||||
|
// the WithAttributes) option to include measurement attributes.
|
||||||
|
Add(ctx context.Context, incr int64, options ...AddOption)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64CounterConfig contains options for synchronous counter instruments that
|
||||||
|
// record int64 values.
|
||||||
|
type Int64CounterConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInt64CounterConfig returns a new [Int64CounterConfig] with all opts
|
||||||
|
// applied.
|
||||||
|
func NewInt64CounterConfig(opts ...Int64CounterOption) Int64CounterConfig {
|
||||||
|
var config Int64CounterConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyInt64Counter(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Int64CounterConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Int64CounterConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64CounterOption applies options to a [Int64CounterConfig]. See
|
||||||
|
// [InstrumentOption] for other options that can be used as an
|
||||||
|
// Int64CounterOption.
|
||||||
|
type Int64CounterOption interface {
|
||||||
|
applyInt64Counter(Int64CounterConfig) Int64CounterConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64UpDownCounter is an instrument that records increasing or decreasing
|
||||||
|
// int64 values.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Int64UpDownCounter interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Int64UpDownCounter
|
||||||
|
|
||||||
|
// Add records a change to the counter.
|
||||||
|
//
|
||||||
|
// Use the WithAttributeSet (or, if performance is not a concern,
|
||||||
|
// the WithAttributes) option to include measurement attributes.
|
||||||
|
Add(ctx context.Context, incr int64, options ...AddOption)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64UpDownCounterConfig contains options for synchronous counter
|
||||||
|
// instruments that record int64 values.
|
||||||
|
type Int64UpDownCounterConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInt64UpDownCounterConfig returns a new [Int64UpDownCounterConfig] with
|
||||||
|
// all opts applied.
|
||||||
|
func NewInt64UpDownCounterConfig(opts ...Int64UpDownCounterOption) Int64UpDownCounterConfig {
|
||||||
|
var config Int64UpDownCounterConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyInt64UpDownCounter(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Int64UpDownCounterConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Int64UpDownCounterConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64UpDownCounterOption applies options to a [Int64UpDownCounterConfig].
|
||||||
|
// See [InstrumentOption] for other options that can be used as an
|
||||||
|
// Int64UpDownCounterOption.
|
||||||
|
type Int64UpDownCounterOption interface {
|
||||||
|
applyInt64UpDownCounter(Int64UpDownCounterConfig) Int64UpDownCounterConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64Histogram is an instrument that records a distribution of int64
|
||||||
|
// values.
|
||||||
|
//
|
||||||
|
// Warning: Methods may be added to this interface in minor releases. See
|
||||||
|
// package documentation on API implementation for information on how to set
|
||||||
|
// default behavior for unimplemented methods.
|
||||||
|
type Int64Histogram interface {
|
||||||
|
// Users of the interface can ignore this. This embedded type is only used
|
||||||
|
// by implementations of this interface. See the "API Implementations"
|
||||||
|
// section of the package documentation for more information.
|
||||||
|
embedded.Int64Histogram
|
||||||
|
|
||||||
|
// Record adds an additional value to the distribution.
|
||||||
|
//
|
||||||
|
// Use the WithAttributeSet (or, if performance is not a concern,
|
||||||
|
// the WithAttributes) option to include measurement attributes.
|
||||||
|
Record(ctx context.Context, incr int64, options ...RecordOption)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64HistogramConfig contains options for synchronous counter instruments
|
||||||
|
// that record int64 values.
|
||||||
|
type Int64HistogramConfig struct {
|
||||||
|
description string
|
||||||
|
unit string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInt64HistogramConfig returns a new [Int64HistogramConfig] with all opts
|
||||||
|
// applied.
|
||||||
|
func NewInt64HistogramConfig(opts ...Int64HistogramOption) Int64HistogramConfig {
|
||||||
|
var config Int64HistogramConfig
|
||||||
|
for _, o := range opts {
|
||||||
|
config = o.applyInt64Histogram(config)
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Description returns the configured description.
|
||||||
|
func (c Int64HistogramConfig) Description() string {
|
||||||
|
return c.description
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unit returns the configured unit.
|
||||||
|
func (c Int64HistogramConfig) Unit() string {
|
||||||
|
return c.unit
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64HistogramOption applies options to a [Int64HistogramConfig]. See
|
||||||
|
// [InstrumentOption] for other options that can be used as an
|
||||||
|
// Int64HistogramOption.
|
||||||
|
type Int64HistogramOption interface {
|
||||||
|
applyInt64Histogram(Int64HistogramConfig) Int64HistogramConfig
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
codespell==2.2.5
|
|
@ -12,8 +12,8 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
// Package httpconv provides OpenTelemetry semantic convetions for the net/http
|
// Package httpconv provides OpenTelemetry HTTP semantic conventions for
|
||||||
// package from the standard library.
|
// tracing telemetry.
|
||||||
package httpconv // import "go.opentelemetry.io/otel/semconv/v1.17.0/httpconv"
|
package httpconv // import "go.opentelemetry.io/otel/semconv/v1.17.0/httpconv"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -58,9 +58,10 @@ var (
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// ClientResponse returns attributes for an HTTP response received by a client
|
// ClientResponse returns trace attributes for an HTTP response received by a
|
||||||
// from a server. It will return the following attributes if the related values
|
// client from a server. It will return the following attributes if the related
|
||||||
// are defined in resp: "http.status.code", "http.response_content_length".
|
// values are defined in resp: "http.status.code",
|
||||||
|
// "http.response_content_length".
|
||||||
//
|
//
|
||||||
// This does not add all OpenTelemetry required attributes for an HTTP event,
|
// This does not add all OpenTelemetry required attributes for an HTTP event,
|
||||||
// it assumes ClientRequest was used to create the span with a complete set of
|
// it assumes ClientRequest was used to create the span with a complete set of
|
||||||
|
@ -72,8 +73,8 @@ func ClientResponse(resp *http.Response) []attribute.KeyValue {
|
||||||
return hc.ClientResponse(resp)
|
return hc.ClientResponse(resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ClientRequest returns attributes for an HTTP request made by a client. The
|
// ClientRequest returns trace attributes for an HTTP request made by a client.
|
||||||
// following attributes are always returned: "http.url", "http.flavor",
|
// The following attributes are always returned: "http.url", "http.flavor",
|
||||||
// "http.method", "net.peer.name". The following attributes are returned if the
|
// "http.method", "net.peer.name". The following attributes are returned if the
|
||||||
// related values are defined in req: "net.peer.port", "http.user_agent",
|
// related values are defined in req: "net.peer.port", "http.user_agent",
|
||||||
// "http.request_content_length", "enduser.id".
|
// "http.request_content_length", "enduser.id".
|
||||||
|
@ -87,7 +88,8 @@ func ClientStatus(code int) (codes.Code, string) {
|
||||||
return hc.ClientStatus(code)
|
return hc.ClientStatus(code)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServerRequest returns attributes for an HTTP request received by a server.
|
// ServerRequest returns trace attributes for an HTTP request received by a
|
||||||
|
// server.
|
||||||
//
|
//
|
||||||
// The server must be the primary server name if it is known. For example this
|
// The server must be the primary server name if it is known. For example this
|
||||||
// would be the ServerName directive
|
// would be the ServerName directive
|
||||||
|
|
|
@ -37,7 +37,7 @@ func (p noopTracerProvider) Tracer(string, ...TracerOption) Tracer {
|
||||||
return noopTracer{}
|
return noopTracer{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// noopTracer is an implementation of Tracer that preforms no operations.
|
// noopTracer is an implementation of Tracer that performs no operations.
|
||||||
type noopTracer struct{}
|
type noopTracer struct{}
|
||||||
|
|
||||||
var _ Tracer = noopTracer{}
|
var _ Tracer = noopTracer{}
|
||||||
|
@ -53,7 +53,7 @@ func (t noopTracer) Start(ctx context.Context, name string, _ ...SpanStartOption
|
||||||
return ContextWithSpan(ctx, span), span
|
return ContextWithSpan(ctx, span), span
|
||||||
}
|
}
|
||||||
|
|
||||||
// noopSpan is an implementation of Span that preforms no operations.
|
// noopSpan is an implementation of Span that performs no operations.
|
||||||
type noopSpan struct{}
|
type noopSpan struct{}
|
||||||
|
|
||||||
var _ Span = noopSpan{}
|
var _ Span = noopSpan{}
|
||||||
|
|
|
@ -16,5 +16,5 @@ package otel // import "go.opentelemetry.io/otel"
|
||||||
|
|
||||||
// Version is the current release version of OpenTelemetry in use.
|
// Version is the current release version of OpenTelemetry in use.
|
||||||
func Version() string {
|
func Version() string {
|
||||||
return "1.14.0"
|
return "1.19.0"
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,43 +14,41 @@
|
||||||
|
|
||||||
module-sets:
|
module-sets:
|
||||||
stable-v1:
|
stable-v1:
|
||||||
version: v1.14.0
|
version: v1.19.0
|
||||||
modules:
|
modules:
|
||||||
- go.opentelemetry.io/otel
|
- go.opentelemetry.io/otel
|
||||||
- go.opentelemetry.io/otel/bridge/opentracing
|
- go.opentelemetry.io/otel/bridge/opentracing
|
||||||
- go.opentelemetry.io/otel/bridge/opentracing/test
|
- go.opentelemetry.io/otel/bridge/opentracing/test
|
||||||
|
- go.opentelemetry.io/otel/example/dice
|
||||||
- go.opentelemetry.io/otel/example/fib
|
- go.opentelemetry.io/otel/example/fib
|
||||||
- go.opentelemetry.io/otel/example/jaeger
|
|
||||||
- go.opentelemetry.io/otel/example/namedtracer
|
- go.opentelemetry.io/otel/example/namedtracer
|
||||||
- go.opentelemetry.io/otel/example/otel-collector
|
- go.opentelemetry.io/otel/example/otel-collector
|
||||||
- go.opentelemetry.io/otel/example/passthrough
|
- go.opentelemetry.io/otel/example/passthrough
|
||||||
- go.opentelemetry.io/otel/example/zipkin
|
- go.opentelemetry.io/otel/example/zipkin
|
||||||
- go.opentelemetry.io/otel/exporters/jaeger
|
|
||||||
- go.opentelemetry.io/otel/exporters/zipkin
|
|
||||||
- go.opentelemetry.io/otel/exporters/otlp/otlptrace
|
- go.opentelemetry.io/otel/exporters/otlp/otlptrace
|
||||||
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
||||||
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp
|
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp
|
||||||
- go.opentelemetry.io/otel/exporters/otlp/internal/retry
|
|
||||||
- go.opentelemetry.io/otel/exporters/stdout/stdouttrace
|
- go.opentelemetry.io/otel/exporters/stdout/stdouttrace
|
||||||
- go.opentelemetry.io/otel/trace
|
- go.opentelemetry.io/otel/exporters/zipkin
|
||||||
|
- go.opentelemetry.io/otel/metric
|
||||||
- go.opentelemetry.io/otel/sdk
|
- go.opentelemetry.io/otel/sdk
|
||||||
|
- go.opentelemetry.io/otel/sdk/metric
|
||||||
|
- go.opentelemetry.io/otel/trace
|
||||||
experimental-metrics:
|
experimental-metrics:
|
||||||
version: v0.37.0
|
version: v0.42.0
|
||||||
modules:
|
modules:
|
||||||
|
- go.opentelemetry.io/otel/bridge/opencensus
|
||||||
|
- go.opentelemetry.io/otel/bridge/opencensus/test
|
||||||
- go.opentelemetry.io/otel/example/opencensus
|
- go.opentelemetry.io/otel/example/opencensus
|
||||||
- go.opentelemetry.io/otel/example/prometheus
|
- go.opentelemetry.io/otel/example/prometheus
|
||||||
|
- go.opentelemetry.io/otel/example/view
|
||||||
- go.opentelemetry.io/otel/exporters/otlp/otlpmetric
|
- go.opentelemetry.io/otel/exporters/otlp/otlpmetric
|
||||||
- go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc
|
- go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc
|
||||||
- go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp
|
- go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp
|
||||||
- go.opentelemetry.io/otel/exporters/prometheus
|
- go.opentelemetry.io/otel/exporters/prometheus
|
||||||
- go.opentelemetry.io/otel/exporters/stdout/stdoutmetric
|
- go.opentelemetry.io/otel/exporters/stdout/stdoutmetric
|
||||||
- go.opentelemetry.io/otel/metric
|
|
||||||
- go.opentelemetry.io/otel/sdk/metric
|
|
||||||
- go.opentelemetry.io/otel/bridge/opencensus
|
|
||||||
- go.opentelemetry.io/otel/bridge/opencensus/test
|
|
||||||
- go.opentelemetry.io/otel/example/view
|
|
||||||
experimental-schema:
|
experimental-schema:
|
||||||
version: v0.0.4
|
version: v0.0.7
|
||||||
modules:
|
modules:
|
||||||
- go.opentelemetry.io/otel/schema
|
- go.opentelemetry.io/otel/schema
|
||||||
excluded-modules:
|
excluded-modules:
|
||||||
|
|
|
@ -282,11 +282,11 @@ github.com/xeipuuv/gojsonschema
|
||||||
# go.etcd.io/etcd/raft/v3 v3.5.6
|
# go.etcd.io/etcd/raft/v3 v3.5.6
|
||||||
## explicit; go 1.16
|
## explicit; go 1.16
|
||||||
go.etcd.io/etcd/raft/v3/raftpb
|
go.etcd.io/etcd/raft/v3/raftpb
|
||||||
# go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.40.0
|
# go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0
|
||||||
## explicit; go 1.18
|
## explicit; go 1.19
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp
|
||||||
# go.opentelemetry.io/otel v1.14.0
|
# go.opentelemetry.io/otel v1.19.0
|
||||||
## explicit; go 1.18
|
## explicit; go 1.20
|
||||||
go.opentelemetry.io/otel
|
go.opentelemetry.io/otel
|
||||||
go.opentelemetry.io/otel/attribute
|
go.opentelemetry.io/otel/attribute
|
||||||
go.opentelemetry.io/otel/baggage
|
go.opentelemetry.io/otel/baggage
|
||||||
|
@ -299,14 +299,16 @@ go.opentelemetry.io/otel/propagation
|
||||||
go.opentelemetry.io/otel/semconv/internal/v2
|
go.opentelemetry.io/otel/semconv/internal/v2
|
||||||
go.opentelemetry.io/otel/semconv/v1.17.0
|
go.opentelemetry.io/otel/semconv/v1.17.0
|
||||||
go.opentelemetry.io/otel/semconv/v1.17.0/httpconv
|
go.opentelemetry.io/otel/semconv/v1.17.0/httpconv
|
||||||
# go.opentelemetry.io/otel/metric v0.37.0
|
# go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0
|
||||||
## explicit; go 1.18
|
## explicit; go 1.20
|
||||||
|
# go.opentelemetry.io/otel/metric v1.19.0
|
||||||
|
## explicit; go 1.20
|
||||||
go.opentelemetry.io/otel/metric
|
go.opentelemetry.io/otel/metric
|
||||||
go.opentelemetry.io/otel/metric/global
|
go.opentelemetry.io/otel/metric/embedded
|
||||||
go.opentelemetry.io/otel/metric/instrument
|
# go.opentelemetry.io/otel/sdk v1.19.0
|
||||||
go.opentelemetry.io/otel/metric/internal/global
|
## explicit; go 1.20
|
||||||
# go.opentelemetry.io/otel/trace v1.14.0
|
# go.opentelemetry.io/otel/trace v1.19.0
|
||||||
## explicit; go 1.18
|
## explicit; go 1.20
|
||||||
go.opentelemetry.io/otel/trace
|
go.opentelemetry.io/otel/trace
|
||||||
# golang.org/x/crypto v0.14.0
|
# golang.org/x/crypto v0.14.0
|
||||||
## explicit; go 1.17
|
## explicit; go 1.17
|
||||||
|
|
Loading…
Reference in New Issue