Skip to content

Commit 4b01eb4

Browse files
authored
Metrics: Add direct listen (#4409)
1 parent c5de08b commit 4b01eb4

File tree

4 files changed

+49
-13
lines changed

4 files changed

+49
-13
lines changed

app/metrics/config.pb.go

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

app/metrics/config.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ option java_multiple_files = true;
1010
message Config {
1111
// Tag of the outbound handler that handles metrics http connections.
1212
string tag = 1;
13+
string listen = 2;
1314
}

app/metrics/metrics.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,15 @@ type MetricsHandler struct {
2424
statsManager feature_stats.Manager
2525
observatory extension.Observatory
2626
tag string
27+
listen string
28+
tcpListener net.Listener
2729
}
2830

2931
// NewMetricsHandler creates a new MetricsHandler based on the given config.
3032
func NewMetricsHandler(ctx context.Context, config *Config) (*MetricsHandler, error) {
3133
c := &MetricsHandler{
32-
tag: config.Tag,
34+
tag: config.Tag,
35+
listen: config.Listen,
3336
}
3437
common.Must(core.RequireFeatures(ctx, func(om outbound.Manager, sm feature_stats.Manager) {
3538
c.statsManager = sm
@@ -87,6 +90,23 @@ func (p *MetricsHandler) Type() interface{} {
8790
}
8891

8992
func (p *MetricsHandler) Start() error {
93+
94+
// direct listen a port if listen is set
95+
if p.listen != "" {
96+
TCPlistener, err := net.Listen("tcp", p.listen)
97+
if err != nil {
98+
return err
99+
}
100+
p.tcpListener = TCPlistener
101+
errors.LogInfo(context.Background(), "Metrics server listening on ", p.listen)
102+
103+
go func() {
104+
if err := http.Serve(TCPlistener, http.DefaultServeMux); err != nil {
105+
errors.LogErrorInner(context.Background(), err, "failed to start metrics server")
106+
}
107+
}()
108+
}
109+
90110
listener := &OutboundListener{
91111
buffer: make(chan net.Conn, 4),
92112
done: done.New(),

infra/conf/metrics.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,21 @@ import (
66
)
77

88
type MetricsConfig struct {
9-
Tag string `json:"tag"`
9+
Tag string `json:"tag"`
10+
Listen string `json:"listen"`
1011
}
1112

1213
func (c *MetricsConfig) Build() (*metrics.Config, error) {
14+
if c.Listen == "" && c.Tag == "" {
15+
return nil, errors.New("Metrics must have a tag or listen address.")
16+
}
17+
// If the tag is empty but have "listen" set a default "Metrics" for compatibility.
1318
if c.Tag == "" {
14-
return nil, errors.New("metrics tag can't be empty.")
19+
c.Tag = "Metrics"
1520
}
1621

1722
return &metrics.Config{
18-
Tag: c.Tag,
23+
Tag: c.Tag,
24+
Listen: c.Listen,
1925
}, nil
2026
}

0 commit comments

Comments
 (0)