Skip to content

Commit 3bd1686

Browse files
authored
Support configurable metrics backend in the agent (#275)
Defaults to expvar. Prometheus metrics currently don't work because it does not allow dots in the names (jaegertracing/jaeger-lib#20) and requires pre-declaring all tag keys, which is not supported by the Jaeger's metrics API.
1 parent 7570efc commit 3bd1686

File tree

11 files changed

+290
-26
lines changed

11 files changed

+290
-26
lines changed

cmd/agent/app/agent_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,12 @@ import (
2929

3030
"github.com/stretchr/testify/assert"
3131
"github.com/stretchr/testify/require"
32-
"github.com/uber/jaeger-lib/metrics"
3332
"go.uber.org/zap"
3433
)
3534

3635
func TestAgentStartError(t *testing.T) {
3736
cfg := &Builder{}
38-
agent, err := cfg.CreateAgent(metrics.NullFactory, zap.NewNop())
37+
agent, err := cfg.CreateAgent(zap.NewNop())
3938
require.NoError(t, err)
4039
agent.httpServer.Addr = "bad-address"
4140
assert.Error(t, agent.Run())
@@ -53,7 +52,7 @@ func TestAgentStartStop(t *testing.T) {
5352
},
5453
},
5554
}
56-
agent, err := cfg.CreateAgent(metrics.NullFactory, zap.NewNop())
55+
agent, err := cfg.CreateAgent(zap.NewNop())
5756
require.NoError(t, err)
5857
ch := make(chan error, 2)
5958
go func() {

cmd/agent/app/builder.go

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
tchreporter "github.com/uber/jaeger/cmd/agent/app/reporter/tchannel"
3737
"github.com/uber/jaeger/cmd/agent/app/servers"
3838
"github.com/uber/jaeger/cmd/agent/app/servers/thriftudp"
39+
jmetrics "github.com/uber/jaeger/pkg/metrics"
3940
zipkinThrift "github.com/uber/jaeger/thrift-gen/agent"
4041
jaegerThrift "github.com/uber/jaeger/thrift-gen/jaeger"
4142
)
@@ -74,15 +75,17 @@ var (
7475
type Builder struct {
7576
Processors []ProcessorConfiguration `yaml:"processors"`
7677
HTTPServer HTTPServerConfiguration `yaml:"httpServer"`
78+
Metrics jmetrics.Builder `yaml:"metrics"`
7779

78-
// These 3 fields are copied from reporter.Builder because yaml does not parse embedded structs
80+
// These 3 fields are copied from tchreporter.Builder because yaml does not parse embedded structs
7981
CollectorHostPorts []string `yaml:"collectorHostPorts"`
8082
DiscoveryMinPeers int `yaml:"minPeers"`
8183
CollectorServiceName string `yaml:"collectorServiceName"`
8284

8385
tchreporter.Builder
8486

8587
otherReporters []reporter.Reporter
88+
metricsFactory metrics.Factory
8689
}
8790

8891
// NewBuilder creates a default builder with three processors.
@@ -152,6 +155,12 @@ func (b *Builder) WithReporter(r reporter.Reporter) *Builder {
152155
return b
153156
}
154157

158+
// WithMetricsFactory sets an externally initialized metrics factory.
159+
func (b *Builder) WithMetricsFactory(mf metrics.Factory) *Builder {
160+
b.metricsFactory = mf
161+
return b
162+
}
163+
155164
func (b *Builder) createMainReporter(mFactory metrics.Factory, logger *zap.Logger) (*tchreporter.Reporter, error) {
156165
if len(b.Builder.CollectorHostPorts) == 0 {
157166
b.Builder.CollectorHostPorts = b.CollectorHostPorts
@@ -165,8 +174,19 @@ func (b *Builder) createMainReporter(mFactory metrics.Factory, logger *zap.Logge
165174
return b.Builder.CreateReporter(mFactory, logger)
166175
}
167176

177+
func (b *Builder) getMetricsFactory() (metrics.Factory, error) {
178+
if b.metricsFactory != nil {
179+
return b.metricsFactory, nil
180+
}
181+
return b.Metrics.CreateMetricsFactory("jaeger_agent")
182+
}
183+
168184
// CreateAgent creates the Agent
169-
func (b *Builder) CreateAgent(mFactory metrics.Factory, logger *zap.Logger) (*Agent, error) {
185+
func (b *Builder) CreateAgent(logger *zap.Logger) (*Agent, error) {
186+
mFactory, err := b.getMetricsFactory()
187+
if err != nil {
188+
return nil, errors.Wrap(err, "cannot create metrics factory")
189+
}
170190
mainReporter, err := b.createMainReporter(mFactory, logger)
171191
if err != nil {
172192
return nil, errors.Wrap(err, "cannot create main Reporter")
@@ -181,6 +201,9 @@ func (b *Builder) CreateAgent(mFactory metrics.Factory, logger *zap.Logger) (*Ag
181201
return nil, err
182202
}
183203
httpServer := b.HTTPServer.GetHTTPServer(b.CollectorServiceName, mainReporter.Channel(), mFactory)
204+
if b.metricsFactory == nil {
205+
b.Metrics.RegisterHandler(httpServer.Handler.(*http.ServeMux))
206+
}
184207
return NewAgent(processors, httpServer, logger), nil
185208
}
186209

cmd/agent/app/builder_test.go

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,16 +119,31 @@ func TestBuilderFromConfig(t *testing.T) {
119119
func TestBuilderWithExtraReporter(t *testing.T) {
120120
cfg := &Builder{}
121121
cfg.WithReporter(fakeReporter{})
122-
agent, err := cfg.CreateAgent(metrics.NullFactory, zap.NewNop())
122+
agent, err := cfg.CreateAgent(zap.NewNop())
123123
assert.NoError(t, err)
124124
assert.NotNil(t, agent)
125125
}
126126

127-
func TestBuilderWithError(t *testing.T) {
127+
func TestBuilderMetrics(t *testing.T) {
128+
mf := metrics.NullFactory
129+
b := new(Builder).WithMetricsFactory(mf)
130+
mf2, err := b.getMetricsFactory()
131+
assert.NoError(t, err)
132+
assert.Equal(t, mf, mf2)
133+
}
134+
135+
func TestBuilderMetricsError(t *testing.T) {
136+
b := &Builder{}
137+
b.Metrics.Backend = "invalid"
138+
_, err := b.CreateAgent(zap.NewNop())
139+
assert.EqualError(t, err, "cannot create metrics factory: unknown metrics backend specified")
140+
}
141+
142+
func TestBuilderWithDiscoveryError(t *testing.T) {
128143
cfg := &Builder{}
129144
cfg.WithDiscoverer(fakeDiscoverer{})
130-
agent, err := cfg.CreateAgent(metrics.NullFactory, zap.NewNop())
131-
assert.Error(t, err)
145+
agent, err := cfg.CreateAgent(zap.NewNop())
146+
assert.EqualError(t, err, "cannot create main Reporter: cannot enable service discovery: both discovery.Discoverer and discovery.Notifier must be specified")
132147
assert.Nil(t, agent)
133148
}
134149

@@ -158,7 +173,7 @@ func TestBuilderWithProcessorErrors(t *testing.T) {
158173
},
159174
},
160175
}
161-
_, err := cfg.CreateAgent(metrics.NullFactory, zap.NewNop())
176+
_, err := cfg.CreateAgent(zap.NewNop())
162177
assert.Error(t, err)
163178
if testCase.err != "" {
164179
assert.EqualError(t, err, testCase.err)

cmd/agent/app/flags.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828

2929
// Bind binds the agent builder to command line options
3030
func (b *Builder) Bind(flags *flag.FlagSet) {
31+
b.Metrics.Bind(flags)
3132
for i := range b.Processors {
3233
p := &b.Processors[i]
3334
name := "processor." + string(p.Model) + "-" + string(p.Protocol) + "."

cmd/agent/main.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ import (
2424
"flag"
2525
"runtime"
2626

27-
"github.com/uber/jaeger-lib/metrics/go-kit"
28-
"github.com/uber/jaeger-lib/metrics/go-kit/expvar"
2927
"go.uber.org/zap"
3028

3129
"github.com/uber/jaeger/cmd/agent/app"
@@ -39,12 +37,11 @@ func main() {
3937
runtime.GOMAXPROCS(runtime.NumCPU())
4038

4139
logger, _ := zap.NewProduction()
42-
metricsFactory := xkit.Wrap("jaeger-agent", expvar.NewFactory(10))
4340

4441
// TODO illustrate discovery service wiring
4542
// TODO illustrate additional reporter
4643

47-
agent, err := builder.CreateAgent(metricsFactory, logger)
44+
agent, err := builder.CreateAgent(logger)
4845
if err != nil {
4946
logger.Fatal("Unable to initialize Jaeger Agent", zap.Error(err))
5047
}

cmd/standalone/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func startAgent(logger *zap.Logger, baseFactory metrics.Factory, builder *agentA
7474
if len(builder.CollectorHostPorts) == 0 {
7575
builder.CollectorHostPorts = append(builder.CollectorHostPorts, fmt.Sprintf("127.0.0.1:%d", *collector.CollectorPort))
7676
}
77-
agent, err := builder.CreateAgent(metricsFactory, logger)
77+
agent, err := builder.WithMetricsFactory(metricsFactory).CreateAgent(logger)
7878
if err != nil {
7979
logger.Fatal("Unable to initialize Jaeger Agent", zap.Error(err))
8080
}

glide.lock

Lines changed: 42 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

glide.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import:
1818
subpackages:
1919
- transport
2020
- package: github.com/uber/jaeger-lib
21-
version: ffca3143c929e9b97325e6bebcc380e8c6e5fa0d
21+
version: 13219516eeab40f3b23e4d50e3f91a0d68064afc
2222
- package: github.com/uber/tchannel-go
2323
version: v1.1.0
2424
subpackages:
@@ -36,7 +36,7 @@ import:
3636
subpackages:
3737
- nethttp
3838
- package: github.com/go-kit/kit
39-
version: v0.4.0
39+
version: v0.5.0
4040
subpackages:
4141
- metrics
4242
- package: github.com/olivere/elastic

0 commit comments

Comments
 (0)