mirror of
https://github.com/prometheus/prometheus.git
synced 2024-12-23 12:44:05 -08:00
Tracing: Migrate to OpenTelemetry library (#9724)
Signed-off-by: Matej Gera <matejgera@gmail.com>
This commit is contained in:
parent
71a0f42331
commit
2c61d29b2a
|
@ -17,7 +17,6 @@ package main
|
|||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
"math/bits"
|
||||
"net"
|
||||
|
@ -39,7 +38,6 @@ import (
|
|||
"github.com/go-kit/log/level"
|
||||
conntrack "github.com/mwitkow/go-conntrack"
|
||||
"github.com/oklog/run"
|
||||
"github.com/opentracing/opentracing-go"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/common/model"
|
||||
|
@ -48,8 +46,6 @@ import (
|
|||
"github.com/prometheus/common/version"
|
||||
toolkit_web "github.com/prometheus/exporter-toolkit/web"
|
||||
toolkit_webflag "github.com/prometheus/exporter-toolkit/web/kingpinflag"
|
||||
jcfg "github.com/uber/jaeger-client-go/config"
|
||||
jprom "github.com/uber/jaeger-lib/metrics/prometheus"
|
||||
"go.uber.org/atomic"
|
||||
kingpin "gopkg.in/alecthomas/kingpin.v2"
|
||||
klog "k8s.io/klog"
|
||||
|
@ -69,6 +65,7 @@ import (
|
|||
"github.com/prometheus/prometheus/scrape"
|
||||
"github.com/prometheus/prometheus/storage"
|
||||
"github.com/prometheus/prometheus/storage/remote"
|
||||
"github.com/prometheus/prometheus/tracing"
|
||||
"github.com/prometheus/prometheus/tsdb"
|
||||
"github.com/prometheus/prometheus/tsdb/agent"
|
||||
"github.com/prometheus/prometheus/util/logging"
|
||||
|
@ -549,7 +546,8 @@ func main() {
|
|||
}
|
||||
|
||||
var (
|
||||
scrapeManager = scrape.NewManager(&cfg.scrape, log.With(logger, "component", "scrape manager"), fanoutStorage)
|
||||
scrapeManager = scrape.NewManager(&cfg.scrape, log.With(logger, "component", "scrape manager"), fanoutStorage)
|
||||
tracingManager = tracing.NewManager(logger)
|
||||
|
||||
queryEngine *promql.Engine
|
||||
ruleManager *rules.Manager
|
||||
|
@ -716,6 +714,9 @@ func main() {
|
|||
externalURL,
|
||||
)
|
||||
},
|
||||
}, {
|
||||
name: "tracing",
|
||||
reloader: tracingManager.ApplyConfig,
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -742,13 +743,6 @@ func main() {
|
|||
})
|
||||
}
|
||||
|
||||
closer, err := initTracing(logger)
|
||||
if err != nil {
|
||||
level.Error(logger).Log("msg", "Unable to init tracing", "err", err)
|
||||
os.Exit(2)
|
||||
}
|
||||
defer closer.Close()
|
||||
|
||||
listener, err := webHandler.Listener()
|
||||
if err != nil {
|
||||
level.Error(logger).Log("msg", "Unable to start web listener", "err", err)
|
||||
|
@ -836,6 +830,19 @@ func main() {
|
|||
},
|
||||
)
|
||||
}
|
||||
{
|
||||
// Tracing manager.
|
||||
g.Add(
|
||||
func() error {
|
||||
<-reloadReady.C
|
||||
tracingManager.Run()
|
||||
return nil
|
||||
},
|
||||
func(err error) {
|
||||
tracingManager.Stop()
|
||||
},
|
||||
)
|
||||
}
|
||||
{
|
||||
// Reload handler.
|
||||
|
||||
|
@ -1522,47 +1529,6 @@ func (opts agentOptions) ToAgentOptions() agent.Options {
|
|||
}
|
||||
}
|
||||
|
||||
func initTracing(logger log.Logger) (io.Closer, error) {
|
||||
// Set tracing configuration defaults.
|
||||
cfg := &jcfg.Configuration{
|
||||
ServiceName: "prometheus",
|
||||
Disabled: true,
|
||||
}
|
||||
|
||||
// Available options can be seen here:
|
||||
// https://github.com/jaegertracing/jaeger-client-go#environment-variables
|
||||
cfg, err := cfg.FromEnv()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "unable to get tracing config from environment")
|
||||
}
|
||||
|
||||
jLogger := jaegerLogger{logger: log.With(logger, "component", "tracing")}
|
||||
|
||||
tracer, closer, err := cfg.NewTracer(
|
||||
jcfg.Logger(jLogger),
|
||||
jcfg.Metrics(jprom.New()),
|
||||
)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "unable to init tracing")
|
||||
}
|
||||
|
||||
opentracing.SetGlobalTracer(tracer)
|
||||
return closer, nil
|
||||
}
|
||||
|
||||
type jaegerLogger struct {
|
||||
logger log.Logger
|
||||
}
|
||||
|
||||
func (l jaegerLogger) Error(msg string) {
|
||||
level.Error(l.logger).Log("msg", msg)
|
||||
}
|
||||
|
||||
func (l jaegerLogger) Infof(msg string, args ...interface{}) {
|
||||
keyvals := []interface{}{"msg", fmt.Sprintf(msg, args...)}
|
||||
level.Info(l.logger).Log(keyvals...)
|
||||
}
|
||||
|
||||
// discoveryManager interfaces the discovery manager. This is used to keep using
|
||||
// the manager that restarts SD's on reload for a few releases until we feel
|
||||
// the new manager can be enabled for all users.
|
||||
|
|
|
@ -224,6 +224,7 @@ type Config struct {
|
|||
RuleFiles []string `yaml:"rule_files,omitempty"`
|
||||
ScrapeConfigs []*ScrapeConfig `yaml:"scrape_configs,omitempty"`
|
||||
StorageConfig StorageConfig `yaml:"storage,omitempty"`
|
||||
TracingConfig TracingConfig `yaml:"tracing,omitempty"`
|
||||
|
||||
RemoteWriteConfigs []*RemoteWriteConfig `yaml:"remote_write,omitempty"`
|
||||
RemoteReadConfigs []*RemoteReadConfig `yaml:"remote_read,omitempty"`
|
||||
|
@ -502,6 +503,59 @@ type StorageConfig struct {
|
|||
ExemplarsConfig *ExemplarsConfig `yaml:"exemplars,omitempty"`
|
||||
}
|
||||
|
||||
type TracingClientType string
|
||||
|
||||
const (
|
||||
TracingClientHTTP TracingClientType = "http"
|
||||
TracingClientGRPC TracingClientType = "grpc"
|
||||
)
|
||||
|
||||
// UnmarshalYAML implements the yaml.Unmarshaler interface.
|
||||
func (t *TracingClientType) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
||||
*t = TracingClientType("")
|
||||
type plain TracingClientType
|
||||
if err := unmarshal((*plain)(t)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if *t != TracingClientHTTP && *t != TracingClientGRPC {
|
||||
return fmt.Errorf("expected tracing client type to be to be %s or %s, but got %s",
|
||||
TracingClientHTTP, TracingClientGRPC, *t,
|
||||
)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// TracingConfig configures the tracing options.
|
||||
type TracingConfig struct {
|
||||
ClientType TracingClientType `yaml:"client_type,omitempty"`
|
||||
Endpoint string `yaml:"endpoint,omitempty"`
|
||||
SamplingFraction float64 `yaml:"sampling_fraction,omitempty"`
|
||||
WithSecure bool `yaml:"with_secure,omitempty"`
|
||||
TLSConfig config.TLSConfig `yaml:"tls_config,omitempty"`
|
||||
}
|
||||
|
||||
// UnmarshalYAML implements the yaml.Unmarshaler interface.
|
||||
func (t *TracingConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
||||
*t = TracingConfig{}
|
||||
type plain TracingConfig
|
||||
if err := unmarshal((*plain)(t)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if t.Endpoint == "" {
|
||||
return errors.New("tracing endpoint must be set")
|
||||
}
|
||||
|
||||
// Fill in gRPC client as default if none is set.
|
||||
if t.ClientType == "" {
|
||||
t.ClientType = TracingClientGRPC
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// ExemplarsConfig configures runtime reloadable configuration options.
|
||||
type ExemplarsConfig struct {
|
||||
// MaxExemplars sets the size, in # of exemplars stored, of the single circular buffer used to store exemplars in memory.
|
||||
|
|
|
@ -985,6 +985,10 @@ var expectedConf = &Config{
|
|||
},
|
||||
},
|
||||
},
|
||||
TracingConfig: TracingConfig{
|
||||
Endpoint: "localhost:4317",
|
||||
ClientType: TracingClientGRPC,
|
||||
},
|
||||
}
|
||||
|
||||
func TestYAMLRoundtrip(t *testing.T) {
|
||||
|
@ -1433,6 +1437,10 @@ var expectedErrors = []struct {
|
|||
filename: "empty_scrape_config_action.bad.yml",
|
||||
errMsg: "relabel action cannot be empty",
|
||||
},
|
||||
{
|
||||
filename: "tracing.bad.yml",
|
||||
errMsg: "tracing endpoint must be set",
|
||||
},
|
||||
{
|
||||
filename: "uyuni_no_server.bad.yml",
|
||||
errMsg: "Uyuni SD configuration requires server host",
|
||||
|
|
4
config/testdata/conf.good.yml
vendored
4
config/testdata/conf.good.yml
vendored
|
@ -366,3 +366,7 @@ alerting:
|
|||
- "1.2.3.4:9093"
|
||||
- "1.2.3.5:9093"
|
||||
- "1.2.3.6:9093"
|
||||
|
||||
tracing:
|
||||
endpoint: "localhost:4317"
|
||||
client_type: "grpc"
|
||||
|
|
2
config/testdata/tracing.bad.yml
vendored
Normal file
2
config/testdata/tracing.bad.yml
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
tracing:
|
||||
sampling_fraction: 1
|
|
@ -98,7 +98,11 @@ remote_read:
|
|||
|
||||
# Storage related settings that are runtime reloadable.
|
||||
storage:
|
||||
[ - <exemplars> ... ]
|
||||
[ - <exemplars> ... ]
|
||||
|
||||
# Configures exporting traces.
|
||||
tracing:
|
||||
[ <tracing_config> ]
|
||||
```
|
||||
|
||||
### `<scrape_config>`
|
||||
|
@ -2654,6 +2658,22 @@ static_configs:
|
|||
relabel_configs:
|
||||
[ - <relabel_config> ... ]
|
||||
```
|
||||
### `<tracing_config>`
|
||||
`tracing_config` configures exporting traces from Prometheus to a tracing backend via the OTLP protocol. Tracing is currently an **experimental** feature and could change in the future.
|
||||
|
||||
```yaml
|
||||
# Client used to export the traces. Options are 'http' or 'grpc'.
|
||||
[ client_type: <string> | default = grpc ]
|
||||
# Endpoint to send the traces to.
|
||||
[ endpoint: <string> ]
|
||||
# Sets the probability a given trace will be sampled. Must be a float from 0 through 1.
|
||||
[ sampling_fraction: <float> | default = 0 ]
|
||||
# If enabled, the client will use a secure connection.
|
||||
[ with_secure: <bool> | default = false ]
|
||||
# TLS configuration.
|
||||
tls_config:
|
||||
[ <tls_config> ]
|
||||
```
|
||||
|
||||
### `<remote_write>`
|
||||
|
||||
|
|
12
go.mod
12
go.mod
|
@ -42,8 +42,6 @@ require (
|
|||
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f
|
||||
github.com/oklog/run v1.1.0
|
||||
github.com/oklog/ulid v1.3.1
|
||||
github.com/opentracing-contrib/go-stdlib v1.0.0
|
||||
github.com/opentracing/opentracing-go v1.2.0
|
||||
github.com/pkg/errors v0.9.1
|
||||
github.com/prometheus/alertmanager v0.23.0
|
||||
github.com/prometheus/client_golang v1.12.0
|
||||
|
@ -55,8 +53,13 @@ require (
|
|||
github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749
|
||||
github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546
|
||||
github.com/stretchr/testify v1.7.0
|
||||
github.com/uber/jaeger-client-go v2.30.0+incompatible
|
||||
github.com/uber/jaeger-lib v2.4.1+incompatible
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.26.1
|
||||
go.opentelemetry.io/otel v1.2.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.2.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.2.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.2.0
|
||||
go.opentelemetry.io/otel/sdk v1.2.0
|
||||
go.opentelemetry.io/otel/trace v1.2.0
|
||||
go.uber.org/atomic v1.9.0
|
||||
go.uber.org/goleak v1.1.12
|
||||
golang.org/x/net v0.0.0-20220105145211-5b0dc2dfae98
|
||||
|
@ -67,6 +70,7 @@ require (
|
|||
golang.org/x/tools v0.1.9-0.20211209172050-90a85b2969be
|
||||
google.golang.org/api v0.64.0
|
||||
google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb
|
||||
google.golang.org/grpc v1.42.0
|
||||
google.golang.org/protobuf v1.27.1
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6
|
||||
gopkg.in/yaml.v2 v2.4.0
|
||||
|
|
47
go.sum
47
go.sum
|
@ -106,7 +106,6 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym
|
|||
github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
|
||||
github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
|
||||
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
||||
github.com/HdrHistogram/hdrhistogram-go v1.1.0 h1:6dpdDPTRoo78HxAJ6T1HfMiKSnqhgRRqzCuPshRkQ7I=
|
||||
github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
|
||||
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
|
||||
github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
|
||||
|
@ -216,7 +215,9 @@ github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOC
|
|||
github.com/cactus/go-statsd-client/statsd v0.0.0-20191106001114-12b4e2b38748/go.mod h1:l/bIBLeOl9eX+wxJAzxS4TveKRtAqlyDpHjhkfO0MEI=
|
||||
github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
|
||||
github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
|
||||
github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
|
||||
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
|
||||
github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ=
|
||||
github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
|
||||
|
@ -242,9 +243,13 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
|
|||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
|
||||
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe h1:QJDJubh0OEcpeGjC7/8uF9tt4e39U/Ya1uyK+itnNPQ=
|
||||
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1 h1:zH8ljVhhq7yC0MIeUL/IviMtY8hx2mK8cN9wEYb8ggw=
|
||||
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
|
||||
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
|
||||
github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE=
|
||||
|
@ -416,6 +421,7 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y
|
|||
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
|
||||
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
|
||||
github.com/envoyproxy/go-control-plane v0.10.1 h1:cgDRLG7bs59Zd+apAWuzLQL95obVYAymNJek76W3mgw=
|
||||
github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
|
@ -428,6 +434,8 @@ github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQL
|
|||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||
github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
|
||||
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
|
||||
github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o=
|
||||
github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
|
||||
github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
|
||||
github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
|
||||
|
@ -1088,13 +1096,10 @@ github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3
|
|||
github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8=
|
||||
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
|
||||
github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w=
|
||||
github.com/opentracing-contrib/go-stdlib v1.0.0 h1:TBS7YuVotp8myLon4Pv7BtCBzOTo1DeZCld0Z63mW2w=
|
||||
github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU=
|
||||
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
|
||||
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||
github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
|
||||
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
|
||||
github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
|
||||
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
|
||||
|
@ -1293,10 +1298,7 @@ github.com/uber-go/tally v3.3.15+incompatible/go.mod h1:YDTIBxdXyOU/sCWilKB4bgyu
|
|||
github.com/uber/athenadriver v1.1.4/go.mod h1:tQjho4NzXw55LGfSZEcETuYydpY1vtmixUabHkC1K/E=
|
||||
github.com/uber/jaeger-client-go v2.23.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
|
||||
github.com/uber/jaeger-client-go v2.28.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
|
||||
github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o=
|
||||
github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
|
||||
github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
|
||||
github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg=
|
||||
github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
|
||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
|
||||
|
@ -1369,7 +1371,31 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
|||
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
|
||||
go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
|
||||
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.26.1 h1:/PDcqsmxpbI/3ERJ6s6cwF13ZSH5m9NNCOPsoeazEhA=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.26.1/go.mod h1:4vatbW3QwS11DK0H0SB7FR31/VbthXcYorswdkVXdyg=
|
||||
go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU=
|
||||
go.opentelemetry.io/otel v1.1.0/go.mod h1:7cww0OW51jQ8IaZChIEdqLwgh+44+7uiTdWsAL0wQpA=
|
||||
go.opentelemetry.io/otel v1.2.0 h1:YOQDvxO1FayUcT9MIhJhgMyNO1WqoduiyvQHzGN0kUQ=
|
||||
go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.2.0 h1:xzbcGykysUh776gzD1LUPsNNHKWN0kQWDnJhn1ddUuk=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.2.0/go.mod h1:14T5gr+Y6s2AgHPqBMgnGwp04csUjQmYXFWPeiBoq5s=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.2.0 h1:VsgsSCDwOSuO8eMVh63Cd4nACMqgjpmAeJSIvVNneD0=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.2.0/go.mod h1:9mLBBnPRf3sf+ASVH2p9xREXVBvwib02FxcKnavtExg=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.2.0 h1:j/jXNzS6Dy0DFgO/oyCvin4H7vTQBg2Vdi6idIzWhCI=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.2.0/go.mod h1:k5GnE4m4Jyy2DNh6UAzG6Nml51nuqQyszV7O1ksQAnE=
|
||||
go.opentelemetry.io/otel/internal/metric v0.24.0 h1:O5lFy6kAl0LMWBjzy3k//M8VjEaTDWL9DPJuqZmWIAA=
|
||||
go.opentelemetry.io/otel/internal/metric v0.24.0/go.mod h1:PSkQG+KuApZjBpC6ea6082ZrWUUy/w132tJ/LOU3TXk=
|
||||
go.opentelemetry.io/otel/metric v0.24.0 h1:Rg4UYHS6JKR1Sw1TxnI13z7q/0p/XAbgIqUTagvLJuU=
|
||||
go.opentelemetry.io/otel/metric v0.24.0/go.mod h1:tpMFnCD9t+BEGiWY2bWF5+AwjuAdM0lSowQ4SBA3/K4=
|
||||
go.opentelemetry.io/otel/sdk v1.2.0 h1:wKN260u4DesJYhyjxDa7LRFkuhH7ncEVKU37LWcyNIo=
|
||||
go.opentelemetry.io/otel/sdk v1.2.0/go.mod h1:jNN8QtpvbsKhgaC6V5lHiejMoKD+V8uadoSafgHPx1U=
|
||||
go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk=
|
||||
go.opentelemetry.io/otel/trace v1.1.0/go.mod h1:i47XtdcBQiktu5IsrPqOHe8w+sBmnLwwHt8wiUsWGTI=
|
||||
go.opentelemetry.io/otel/trace v1.2.0 h1:Ys3iqbqZhcf28hHzrm5WAquMkDHNZTUkw7KHbuNjej0=
|
||||
go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0=
|
||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||
go.opentelemetry.io/proto/otlp v0.10.0 h1:n7brgtEbDvXEgGyKKo8SobKT1e9FewlDtXzkVP5djoE=
|
||||
go.opentelemetry.io/proto/otlp v0.10.0/go.mod h1:zG20xCK0szZ1xdokeSOwEcmlXu+x9kkdRe6N1DhKcfU=
|
||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||
|
@ -1666,6 +1692,7 @@ golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
|
@ -1944,8 +1971,10 @@ google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ
|
|||
google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
|
||||
google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
|
||||
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
||||
google.golang.org/grpc v1.40.1 h1:pnP7OclFFFgFi4VHQDQDaoXUVauOFyktqTsqqgzFKbc=
|
||||
google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
||||
google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k=
|
||||
google.golang.org/grpc v1.42.0 h1:XT2/MFpuPFsEX2fWh3YQtHkZ+WYZFQRfaUgLZYj/p6A=
|
||||
google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
||||
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
|
|
|
@ -29,11 +29,12 @@ import (
|
|||
|
||||
"github.com/go-kit/log"
|
||||
"github.com/go-kit/log/level"
|
||||
"github.com/opentracing/opentracing-go"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/common/model"
|
||||
"github.com/uber/jaeger-client-go"
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
|
||||
"github.com/prometheus/prometheus/model/labels"
|
||||
"github.com/prometheus/prometheus/model/timestamp"
|
||||
|
@ -178,8 +179,8 @@ func (q *query) Close() {
|
|||
|
||||
// Exec implements the Query interface.
|
||||
func (q *query) Exec(ctx context.Context) *Result {
|
||||
if span := opentracing.SpanFromContext(ctx); span != nil {
|
||||
span.SetTag(queryTag, q.stmt.String())
|
||||
if span := trace.SpanFromContext(ctx); span != nil {
|
||||
span.SetAttributes(attribute.String(queryTag, q.stmt.String()))
|
||||
}
|
||||
|
||||
// Exec query.
|
||||
|
@ -505,10 +506,8 @@ func (ng *Engine) exec(ctx context.Context, q *query) (v parser.Value, ws storag
|
|||
f = append(f, "error", err)
|
||||
}
|
||||
f = append(f, "stats", stats.NewQueryStats(q.Stats()))
|
||||
if span := opentracing.SpanFromContext(ctx); span != nil {
|
||||
if spanCtx, ok := span.Context().(jaeger.SpanContext); ok {
|
||||
f = append(f, "spanID", spanCtx.SpanID())
|
||||
}
|
||||
if span := trace.SpanFromContext(ctx); span != nil {
|
||||
f = append(f, "spanID", span.SpanContext().SpanID())
|
||||
}
|
||||
if origin := ctx.Value(QueryOrigin{}); origin != nil {
|
||||
for k, v := range origin.(map[string]interface{}) {
|
||||
|
@ -1171,8 +1170,9 @@ func (ev *evaluator) eval(expr parser.Expr) (parser.Value, storage.Warnings) {
|
|||
numSteps := int((ev.endTimestamp-ev.startTimestamp)/ev.interval) + 1
|
||||
|
||||
// Create a new span to help investigate inner evaluation performances.
|
||||
span, _ := opentracing.StartSpanFromContext(ev.ctx, stats.InnerEvalTime.SpanOperation()+" eval "+reflect.TypeOf(expr).String())
|
||||
defer span.Finish()
|
||||
ctxWithSpan, span := otel.Tracer("").Start(ev.ctx, stats.InnerEvalTime.SpanOperation()+" eval "+reflect.TypeOf(expr).String())
|
||||
ev.ctx = ctxWithSpan
|
||||
defer span.End()
|
||||
|
||||
switch e := expr.(type) {
|
||||
case *parser.AggregateExpr:
|
||||
|
|
|
@ -24,10 +24,11 @@ import (
|
|||
|
||||
"github.com/go-kit/log"
|
||||
"github.com/go-kit/log/level"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/common/model"
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/prometheus/prometheus/model/labels"
|
||||
"github.com/prometheus/prometheus/model/rulefmt"
|
||||
|
@ -584,10 +585,10 @@ func (g *Group) Eval(ctx context.Context, ts time.Time) {
|
|||
}
|
||||
|
||||
func(i int, rule Rule) {
|
||||
sp, ctx := opentracing.StartSpanFromContext(ctx, "rule")
|
||||
sp.SetTag("name", rule.Name())
|
||||
ctx, sp := otel.Tracer("").Start(ctx, "rule")
|
||||
sp.SetAttributes(attribute.String("name", rule.Name()))
|
||||
defer func(t time.Time) {
|
||||
sp.Finish()
|
||||
sp.End()
|
||||
|
||||
since := time.Since(t)
|
||||
g.metrics.EvalDuration.Observe(since.Seconds())
|
||||
|
|
|
@ -27,14 +27,15 @@ import (
|
|||
|
||||
"github.com/gogo/protobuf/proto"
|
||||
"github.com/golang/snappy"
|
||||
"github.com/opentracing-contrib/go-stdlib/nethttp"
|
||||
"github.com/opentracing/opentracing-go"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
config_util "github.com/prometheus/common/config"
|
||||
"github.com/prometheus/common/model"
|
||||
"github.com/prometheus/common/sigv4"
|
||||
"github.com/prometheus/common/version"
|
||||
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
|
||||
"github.com/prometheus/prometheus/prompb"
|
||||
)
|
||||
|
@ -119,9 +120,7 @@ func NewReadClient(name string, conf *ClientConfig) (ReadClient, error) {
|
|||
if len(conf.Headers) > 0 {
|
||||
t = newInjectHeadersRoundTripper(conf.Headers, t)
|
||||
}
|
||||
httpClient.Transport = &nethttp.Transport{
|
||||
RoundTripper: t,
|
||||
}
|
||||
httpClient.Transport = otelhttp.NewTransport(t)
|
||||
|
||||
return &Client{
|
||||
remoteName: name,
|
||||
|
@ -153,9 +152,7 @@ func NewWriteClient(name string, conf *ClientConfig) (WriteClient, error) {
|
|||
t = newInjectHeadersRoundTripper(conf.Headers, t)
|
||||
}
|
||||
|
||||
httpClient.Transport = &nethttp.Transport{
|
||||
RoundTripper: t,
|
||||
}
|
||||
httpClient.Transport = otelhttp.NewTransport(t)
|
||||
|
||||
return &Client{
|
||||
remoteName: name,
|
||||
|
@ -206,20 +203,10 @@ func (c *Client) Store(ctx context.Context, req []byte) error {
|
|||
ctx, cancel := context.WithTimeout(ctx, c.timeout)
|
||||
defer cancel()
|
||||
|
||||
httpReq = httpReq.WithContext(ctx)
|
||||
ctx, span := otel.Tracer("").Start(ctx, "Remote Store", trace.WithSpanKind(trace.SpanKindClient))
|
||||
defer span.End()
|
||||
|
||||
if parentSpan := opentracing.SpanFromContext(ctx); parentSpan != nil {
|
||||
var ht *nethttp.Tracer
|
||||
httpReq, ht = nethttp.TraceRequest(
|
||||
parentSpan.Tracer(),
|
||||
httpReq,
|
||||
nethttp.OperationName("Remote Store"),
|
||||
nethttp.ClientTrace(false),
|
||||
)
|
||||
defer ht.Finish()
|
||||
}
|
||||
|
||||
httpResp, err := c.Client.Do(httpReq)
|
||||
httpResp, err := c.Client.Do(httpReq.WithContext(ctx))
|
||||
if err != nil {
|
||||
// Errors from Client.Do are from (for example) network errors, so are
|
||||
// recoverable.
|
||||
|
@ -304,21 +291,11 @@ func (c *Client) Read(ctx context.Context, query *prompb.Query) (*prompb.QueryRe
|
|||
ctx, cancel := context.WithTimeout(ctx, c.timeout)
|
||||
defer cancel()
|
||||
|
||||
httpReq = httpReq.WithContext(ctx)
|
||||
|
||||
if parentSpan := opentracing.SpanFromContext(ctx); parentSpan != nil {
|
||||
var ht *nethttp.Tracer
|
||||
httpReq, ht = nethttp.TraceRequest(
|
||||
parentSpan.Tracer(),
|
||||
httpReq,
|
||||
nethttp.OperationName("Remote Read"),
|
||||
nethttp.ClientTrace(false),
|
||||
)
|
||||
defer ht.Finish()
|
||||
}
|
||||
ctx, span := otel.Tracer("").Start(ctx, "Remote Read", trace.WithSpanKind(trace.SpanKindClient))
|
||||
defer span.End()
|
||||
|
||||
start := time.Now()
|
||||
httpResp, err := c.Client.Do(httpReq)
|
||||
httpResp, err := c.Client.Do(httpReq.WithContext(ctx))
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "error sending request")
|
||||
}
|
||||
|
|
|
@ -25,10 +25,10 @@ import (
|
|||
"github.com/go-kit/log/level"
|
||||
"github.com/gogo/protobuf/proto"
|
||||
"github.com/golang/snappy"
|
||||
"github.com/opentracing/opentracing-go"
|
||||
"github.com/opentracing/opentracing-go/ext"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/common/model"
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"go.uber.org/atomic"
|
||||
|
||||
"github.com/prometheus/prometheus/config"
|
||||
|
@ -472,21 +472,22 @@ func (t *QueueManager) sendMetadataWithBackoff(ctx context.Context, metadata []p
|
|||
metadataCount := len(metadata)
|
||||
|
||||
attemptStore := func(try int) error {
|
||||
span, ctx := opentracing.StartSpanFromContext(ctx, "Remote Metadata Send Batch")
|
||||
defer span.Finish()
|
||||
ctx, span := otel.Tracer("").Start(ctx, "Remote Metadata Send Batch")
|
||||
defer span.End()
|
||||
|
||||
span.SetTag("metadata", metadataCount)
|
||||
span.SetTag("try", try)
|
||||
span.SetTag("remote_name", t.storeClient.Name())
|
||||
span.SetTag("remote_url", t.storeClient.Endpoint())
|
||||
span.SetAttributes(
|
||||
attribute.Int("metadata", metadataCount),
|
||||
attribute.Int("try", try),
|
||||
attribute.String("remote_name", t.storeClient.Name()),
|
||||
attribute.String("remote_url", t.storeClient.Endpoint()),
|
||||
)
|
||||
|
||||
begin := time.Now()
|
||||
err := t.storeClient.Store(ctx, req)
|
||||
t.metrics.sentBatchDuration.Observe(time.Since(begin).Seconds())
|
||||
|
||||
if err != nil {
|
||||
span.LogKV("error", err)
|
||||
ext.Error.Set(span, true)
|
||||
span.RecordError(err)
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -1279,17 +1280,20 @@ func (s *shards) sendSamplesWithBackoff(ctx context.Context, samples []prompb.Ti
|
|||
// without causing a memory leak, and it has the nice effect of not propagating any
|
||||
// parameters for sendSamplesWithBackoff/3.
|
||||
attemptStore := func(try int) error {
|
||||
span, ctx := opentracing.StartSpanFromContext(ctx, "Remote Send Batch")
|
||||
defer span.Finish()
|
||||
ctx, span := otel.Tracer("").Start(ctx, "Remote Send Batch")
|
||||
defer span.End()
|
||||
|
||||
span.SetAttributes(
|
||||
attribute.Int("request_size", reqSize),
|
||||
attribute.Int("samples", sampleCount),
|
||||
attribute.Int("try", try),
|
||||
attribute.String("remote_name", s.qm.storeClient.Name()),
|
||||
attribute.String("remote_url", s.qm.storeClient.Endpoint()),
|
||||
)
|
||||
|
||||
span.SetTag("samples", sampleCount)
|
||||
if exemplarCount > 0 {
|
||||
span.SetTag("exemplars", exemplarCount)
|
||||
span.SetAttributes(attribute.Int("exemplars", exemplarCount))
|
||||
}
|
||||
span.SetTag("request_size", reqSize)
|
||||
span.SetTag("try", try)
|
||||
span.SetTag("remote_name", s.qm.storeClient.Name())
|
||||
span.SetTag("remote_url", s.qm.storeClient.Endpoint())
|
||||
|
||||
begin := time.Now()
|
||||
s.qm.metrics.samplesTotal.Add(float64(sampleCount))
|
||||
|
@ -1298,8 +1302,7 @@ func (s *shards) sendSamplesWithBackoff(ctx context.Context, samples []prompb.Ti
|
|||
s.qm.metrics.sentBatchDuration.Observe(time.Since(begin).Seconds())
|
||||
|
||||
if err != nil {
|
||||
span.LogKV("error", err)
|
||||
ext.Error.Set(span, true)
|
||||
span.RecordError(err)
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
205
tracing/tracing.go
Normal file
205
tracing/tracing.go
Normal file
|
@ -0,0 +1,205 @@
|
|||
// Copyright 2021 The Prometheus 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 tracing
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/go-kit/log"
|
||||
"github.com/go-kit/log/level"
|
||||
"github.com/pkg/errors"
|
||||
config_util "github.com/prometheus/common/config"
|
||||
"github.com/prometheus/common/version"
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
|
||||
"go.opentelemetry.io/otel/propagation"
|
||||
"go.opentelemetry.io/otel/sdk/resource"
|
||||
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
||||
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
"google.golang.org/grpc/credentials"
|
||||
|
||||
"github.com/prometheus/prometheus/config"
|
||||
)
|
||||
|
||||
const serviceName = "prometheus"
|
||||
|
||||
// Manager is capable of building, (re)installing and shutting down
|
||||
// the tracer provider.
|
||||
type Manager struct {
|
||||
logger log.Logger
|
||||
done chan struct{}
|
||||
config config.TracingConfig
|
||||
shutdownFunc func() error
|
||||
}
|
||||
|
||||
// NewManager creates a new tracing manager.
|
||||
func NewManager(logger log.Logger) *Manager {
|
||||
return &Manager{
|
||||
logger: logger,
|
||||
done: make(chan struct{}),
|
||||
}
|
||||
}
|
||||
|
||||
// Run starts the tracing manager. It registers the global text map propagator and error handler.
|
||||
// It is blocking.
|
||||
func (m *Manager) Run() {
|
||||
otel.SetTextMapPropagator(propagation.TraceContext{})
|
||||
otel.SetErrorHandler(otelErrHandler(func(err error) {
|
||||
level.Error(m.logger).Log("msg", "OpenTelemetry handler returned an error", "err", err)
|
||||
}))
|
||||
<-m.done
|
||||
}
|
||||
|
||||
// ApplyConfig takes care of refreshing the tracing configuration by shutting down
|
||||
// the current tracer provider (if any is registered) and installing a new one.
|
||||
func (m *Manager) ApplyConfig(cfg *config.Config) error {
|
||||
// Update only if a config change is detected.
|
||||
if m.config == cfg.TracingConfig {
|
||||
return nil
|
||||
}
|
||||
|
||||
if m.shutdownFunc != nil {
|
||||
if err := m.shutdownFunc(); err != nil {
|
||||
return errors.Wrap(err, "failed to shut down the tracer provider")
|
||||
}
|
||||
}
|
||||
|
||||
// If no endpoint is set, assume tracing should be disabled.
|
||||
if cfg.TracingConfig.Endpoint == "" {
|
||||
m.config = cfg.TracingConfig
|
||||
m.shutdownFunc = nil
|
||||
otel.SetTracerProvider(trace.NewNoopTracerProvider())
|
||||
level.Info(m.logger).Log("msg", "Tracing provider uninstalled.")
|
||||
return nil
|
||||
}
|
||||
|
||||
tp, shutdownFunc, err := buildTracerProvider(context.Background(), cfg.TracingConfig)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to install a new tracer provider")
|
||||
}
|
||||
|
||||
m.shutdownFunc = shutdownFunc
|
||||
m.config = cfg.TracingConfig
|
||||
otel.SetTracerProvider(tp)
|
||||
|
||||
level.Info(m.logger).Log("msg", "Successfully installed a new tracer provider.")
|
||||
return nil
|
||||
}
|
||||
|
||||
// Stop gracefully shuts down the tracer provider and stops the tracing manager.
|
||||
func (m *Manager) Stop() {
|
||||
defer close(m.done)
|
||||
|
||||
if m.shutdownFunc == nil {
|
||||
return
|
||||
}
|
||||
|
||||
if err := m.shutdownFunc(); err != nil {
|
||||
level.Error(m.logger).Log("msg", "failed to shut down the tracer provider", "err", err)
|
||||
}
|
||||
|
||||
level.Info(m.logger).Log("msg", "Tracing manager stopped")
|
||||
}
|
||||
|
||||
type otelErrHandler func(err error)
|
||||
|
||||
func (o otelErrHandler) Handle(err error) {
|
||||
o(err)
|
||||
}
|
||||
|
||||
// buildTracerProvider return a new tracer provider ready for installation, together
|
||||
// with a shutdown function.
|
||||
func buildTracerProvider(ctx context.Context, tracingCfg config.TracingConfig) (trace.TracerProvider, func() error, error) {
|
||||
client, err := getClient(tracingCfg)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
exp, err := otlptrace.New(ctx, client)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
// Create a resource describing the service and the runtime.
|
||||
res, err := resource.New(
|
||||
ctx,
|
||||
resource.WithSchemaURL(semconv.SchemaURL),
|
||||
resource.WithAttributes(
|
||||
semconv.ServiceNameKey.String(serviceName),
|
||||
semconv.ServiceVersionKey.String(version.Version),
|
||||
),
|
||||
resource.WithProcessRuntimeDescription(),
|
||||
resource.WithTelemetrySDK(),
|
||||
)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
tp := tracesdk.NewTracerProvider(
|
||||
tracesdk.WithBatcher(exp),
|
||||
tracesdk.WithSampler(tracesdk.ParentBased(
|
||||
tracesdk.TraceIDRatioBased(tracingCfg.SamplingFraction),
|
||||
)),
|
||||
tracesdk.WithResource(res),
|
||||
)
|
||||
|
||||
return tp, func() error {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
defer cancel()
|
||||
err := tp.Shutdown(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}, nil
|
||||
}
|
||||
|
||||
// getClient returns an appropriate OTLP client (either gRPC or HTTP), based
|
||||
// on the provided tracing configuration.
|
||||
func getClient(tracingCfg config.TracingConfig) (otlptrace.Client, error) {
|
||||
var client otlptrace.Client
|
||||
switch tracingCfg.ClientType {
|
||||
case config.TracingClientGRPC:
|
||||
opts := []otlptracegrpc.Option{otlptracegrpc.WithEndpoint(tracingCfg.Endpoint)}
|
||||
if !tracingCfg.WithSecure {
|
||||
opts = append(opts, otlptracegrpc.WithInsecure())
|
||||
} else {
|
||||
tlsConf, err := config_util.NewTLSConfig(&tracingCfg.TLSConfig)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
opts = append(opts, otlptracegrpc.WithTLSCredentials(credentials.NewTLS(tlsConf)))
|
||||
}
|
||||
client = otlptracegrpc.NewClient(opts...)
|
||||
case config.TracingClientHTTP:
|
||||
opts := []otlptracehttp.Option{otlptracehttp.WithEndpoint(tracingCfg.Endpoint)}
|
||||
if !tracingCfg.WithSecure {
|
||||
opts = append(opts, otlptracehttp.WithInsecure())
|
||||
} else {
|
||||
tlsConf, err := config_util.NewTLSConfig(&tracingCfg.TLSConfig)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
opts = append(opts, otlptracehttp.WithTLSClientConfig(tlsConf))
|
||||
}
|
||||
client = otlptracehttp.NewClient(opts...)
|
||||
}
|
||||
|
||||
return client, nil
|
||||
}
|
117
tracing/tracing_test.go
Normal file
117
tracing/tracing_test.go
Normal file
|
@ -0,0 +1,117 @@
|
|||
// Copyright 2021 The Prometheus 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 tracing
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/go-kit/log"
|
||||
config_util "github.com/prometheus/common/config"
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
|
||||
"github.com/prometheus/prometheus/config"
|
||||
)
|
||||
|
||||
func TestInstallingNewTracerProvider(t *testing.T) {
|
||||
tpBefore := otel.GetTracerProvider()
|
||||
|
||||
m := NewManager(log.NewNopLogger())
|
||||
cfg := config.Config{
|
||||
TracingConfig: config.TracingConfig{
|
||||
Endpoint: "localhost:1234",
|
||||
ClientType: config.TracingClientGRPC,
|
||||
},
|
||||
}
|
||||
|
||||
require.NoError(t, m.ApplyConfig(&cfg))
|
||||
require.NotEqual(t, tpBefore, otel.GetTracerProvider())
|
||||
}
|
||||
|
||||
func TestReinstallingTracerProvider(t *testing.T) {
|
||||
m := NewManager(log.NewNopLogger())
|
||||
cfg := config.Config{
|
||||
TracingConfig: config.TracingConfig{
|
||||
Endpoint: "localhost:1234",
|
||||
ClientType: config.TracingClientGRPC,
|
||||
TLSConfig: config_util.TLSConfig{
|
||||
CAFile: "ca-file.pem",
|
||||
CertFile: "cert.pem",
|
||||
ServerName: "test-server",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
require.NoError(t, m.ApplyConfig(&cfg))
|
||||
tpFirstConfig := otel.GetTracerProvider()
|
||||
|
||||
// Trying to apply the same config should not reinstall provider.
|
||||
require.NoError(t, m.ApplyConfig(&cfg))
|
||||
require.Equal(t, tpFirstConfig, otel.GetTracerProvider())
|
||||
|
||||
cfg2 := config.Config{
|
||||
TracingConfig: config.TracingConfig{
|
||||
Endpoint: "localhost:1234",
|
||||
ClientType: config.TracingClientHTTP,
|
||||
TLSConfig: config_util.TLSConfig{
|
||||
CAFile: "ca-file.pem",
|
||||
CertFile: "cert.pem",
|
||||
ServerName: "test-server",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
require.NoError(t, m.ApplyConfig(&cfg2))
|
||||
require.NotEqual(t, tpFirstConfig, otel.GetTracerProvider())
|
||||
}
|
||||
|
||||
func TestUninstallingTracerProvider(t *testing.T) {
|
||||
m := NewManager(log.NewNopLogger())
|
||||
cfg := config.Config{
|
||||
TracingConfig: config.TracingConfig{
|
||||
Endpoint: "localhost:1234",
|
||||
ClientType: config.TracingClientGRPC,
|
||||
},
|
||||
}
|
||||
|
||||
require.NoError(t, m.ApplyConfig(&cfg))
|
||||
require.NotEqual(t, trace.NewNoopTracerProvider(), otel.GetTracerProvider())
|
||||
|
||||
// Uninstall by passing empty config.
|
||||
cfg2 := config.Config{
|
||||
TracingConfig: config.TracingConfig{},
|
||||
}
|
||||
|
||||
require.NoError(t, m.ApplyConfig(&cfg2))
|
||||
// Make sure we get a no-op tracer provider after uninstallation.
|
||||
require.Equal(t, trace.NewNoopTracerProvider(), otel.GetTracerProvider())
|
||||
}
|
||||
|
||||
func TestTracerProviderShutdown(t *testing.T) {
|
||||
m := NewManager(log.NewNopLogger())
|
||||
cfg := config.Config{
|
||||
TracingConfig: config.TracingConfig{
|
||||
Endpoint: "localhost:1234",
|
||||
ClientType: config.TracingClientGRPC,
|
||||
},
|
||||
}
|
||||
|
||||
require.NoError(t, m.ApplyConfig(&cfg))
|
||||
m.Stop()
|
||||
|
||||
// Check if we closed the done channel.
|
||||
_, ok := <-m.done
|
||||
require.Equal(t, ok, false)
|
||||
}
|
|
@ -16,8 +16,9 @@ package stats
|
|||
import (
|
||||
"context"
|
||||
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
)
|
||||
|
||||
// QueryTiming identifies the code area or functionality in which time is spent
|
||||
|
@ -120,11 +121,11 @@ type SpanTimer struct {
|
|||
timer *Timer
|
||||
observers []prometheus.Observer
|
||||
|
||||
span opentracing.Span
|
||||
span trace.Span
|
||||
}
|
||||
|
||||
func NewSpanTimer(ctx context.Context, operation string, timer *Timer, observers ...prometheus.Observer) (*SpanTimer, context.Context) {
|
||||
span, ctx := opentracing.StartSpanFromContext(ctx, operation)
|
||||
ctx, span := otel.Tracer("").Start(ctx, operation)
|
||||
timer.Start()
|
||||
|
||||
return &SpanTimer{
|
||||
|
@ -137,7 +138,7 @@ func NewSpanTimer(ctx context.Context, operation string, timer *Timer, observers
|
|||
|
||||
func (s *SpanTimer) Finish() {
|
||||
s.timer.Stop()
|
||||
s.span.Finish()
|
||||
s.span.End()
|
||||
|
||||
for _, obs := range s.observers {
|
||||
obs.Observe(s.timer.ElapsedTime().Seconds())
|
||||
|
|
13
web/web.go
13
web/web.go
|
@ -42,8 +42,6 @@ import (
|
|||
"github.com/go-kit/log"
|
||||
"github.com/go-kit/log/level"
|
||||
conntrack "github.com/mwitkow/go-conntrack"
|
||||
"github.com/opentracing-contrib/go-stdlib/nethttp"
|
||||
opentracing "github.com/opentracing/opentracing-go"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||
|
@ -52,6 +50,7 @@ import (
|
|||
"github.com/prometheus/common/route"
|
||||
"github.com/prometheus/common/server"
|
||||
toolkit_web "github.com/prometheus/exporter-toolkit/web"
|
||||
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||
"go.uber.org/atomic"
|
||||
"golang.org/x/net/netutil"
|
||||
|
||||
|
@ -592,9 +591,7 @@ func (h *Handler) Run(ctx context.Context, listener net.Listener, webConfig stri
|
|||
return err
|
||||
}
|
||||
}
|
||||
operationName := nethttp.OperationNameFunc(func(r *http.Request) string {
|
||||
return fmt.Sprintf("%s %s", r.Method, r.URL.Path)
|
||||
})
|
||||
|
||||
mux := http.NewServeMux()
|
||||
mux.Handle("/", h.router)
|
||||
|
||||
|
@ -612,8 +609,12 @@ func (h *Handler) Run(ctx context.Context, listener net.Listener, webConfig stri
|
|||
|
||||
errlog := stdlog.New(log.NewStdlibAdapter(level.Error(h.logger)), "", 0)
|
||||
|
||||
spanNameFormatter := otelhttp.WithSpanNameFormatter(func(_ string, r *http.Request) string {
|
||||
return fmt.Sprintf("%s %s", r.Method, r.URL.Path)
|
||||
})
|
||||
|
||||
httpSrv := &http.Server{
|
||||
Handler: withStackTracer(nethttp.Middleware(opentracing.GlobalTracer(), mux, operationName), h.logger),
|
||||
Handler: withStackTracer(otelhttp.NewHandler(mux, "", spanNameFormatter), h.logger),
|
||||
ErrorLog: errlog,
|
||||
ReadTimeout: h.options.ReadTimeout,
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue