Skip to content

Commit 8696541

Browse files
[admin] Use OTEL helper instead of tlscfg (#6319)
## Which problem is this PR solving? - Part of #4316 ## Description of the changes - ## How was this change tested? - ## Checklist - [ ] I have read https://github.com/jaegertracing/jaeger/blob/master/CONTRIBUTING_GUIDELINES.md - [ ] I have signed all commits - [ ] I have added unit tests for the new functionality - [ ] I have run lint and test steps successfully - for `jaeger`: `make lint test` - for `jaeger-ui`: `yarn lint` and `yarn test` --------- Signed-off-by: chahatsagarmain <[email protected]> Signed-off-by: Yuri Shkuro <[email protected]> Signed-off-by: Yuri Shkuro <[email protected]> Co-authored-by: Yuri Shkuro <[email protected]> Co-authored-by: Yuri Shkuro <[email protected]>
1 parent 4162f57 commit 8696541

File tree

3 files changed

+53
-58
lines changed

3 files changed

+53
-58
lines changed

cmd/internal/flags/admin.go

Lines changed: 49 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,23 @@ package flags
55

66
import (
77
"context"
8-
"crypto/tls"
98
"errors"
109
"flag"
1110
"fmt"
12-
"io"
1311
"net"
1412
"net/http"
1513
"net/http/pprof"
16-
"time"
14+
"sync"
1715

1816
"github.com/spf13/viper"
17+
"go.opentelemetry.io/collector/config/confighttp"
1918
"go.uber.org/zap"
2019
"go.uber.org/zap/zapcore"
2120

2221
"github.com/jaegertracing/jaeger/pkg/config/tlscfg"
2322
"github.com/jaegertracing/jaeger/pkg/healthcheck"
2423
"github.com/jaegertracing/jaeger/pkg/recoveryhandler"
24+
"github.com/jaegertracing/jaeger/pkg/telemetry"
2525
"github.com/jaegertracing/jaeger/pkg/version"
2626
)
2727

@@ -35,22 +35,23 @@ var tlsAdminHTTPFlagsConfig = tlscfg.ServerFlagsConfig{
3535

3636
// AdminServer runs an HTTP server with admin endpoints, such as healthcheck at /, /metrics, etc.
3737
type AdminServer struct {
38-
logger *zap.Logger
39-
adminHostPort string
40-
hc *healthcheck.HealthCheck
41-
mux *http.ServeMux
42-
server *http.Server
43-
tlsCfg *tls.Config
44-
tlsCertWatcherCloser io.Closer
38+
logger *zap.Logger
39+
hc *healthcheck.HealthCheck
40+
mux *http.ServeMux
41+
server *http.Server
42+
serverCfg confighttp.ServerConfig
43+
stopped sync.WaitGroup
4544
}
4645

4746
// NewAdminServer creates a new admin server.
4847
func NewAdminServer(hostPort string) *AdminServer {
4948
return &AdminServer{
50-
adminHostPort: hostPort,
51-
logger: zap.NewNop(),
52-
hc: healthcheck.New(),
53-
mux: http.NewServeMux(),
49+
logger: zap.NewNop(),
50+
hc: healthcheck.New(),
51+
mux: http.NewServeMux(),
52+
serverCfg: confighttp.ServerConfig{
53+
Endpoint: hostPort,
54+
},
5455
}
5556
}
5657

@@ -67,30 +68,21 @@ func (s *AdminServer) setLogger(logger *zap.Logger) {
6768

6869
// AddFlags registers CLI flags.
6970
func (s *AdminServer) AddFlags(flagSet *flag.FlagSet) {
70-
flagSet.String(adminHTTPHostPort, s.adminHostPort, fmt.Sprintf("The host:port (e.g. 127.0.0.1%s or %s) for the admin server, including health check, /metrics, etc.", s.adminHostPort, s.adminHostPort))
71+
flagSet.String(adminHTTPHostPort, s.serverCfg.Endpoint, fmt.Sprintf("The host:port (e.g. 127.0.0.1%s or %s) for the admin server, including health check, /metrics, etc.", s.serverCfg.Endpoint, s.serverCfg.Endpoint))
7172
tlsAdminHTTPFlagsConfig.AddFlags(flagSet)
7273
}
7374

7475
// InitFromViper initializes the server with properties retrieved from Viper.
7576
func (s *AdminServer) initFromViper(v *viper.Viper, logger *zap.Logger) error {
7677
s.setLogger(logger)
7778

78-
s.adminHostPort = v.GetString(adminHTTPHostPort)
79-
var tlsAdminHTTP tlscfg.Options
8079
tlsAdminHTTP, err := tlsAdminHTTPFlagsConfig.InitFromViper(v)
8180
if err != nil {
8281
return fmt.Errorf("failed to parse admin server TLS options: %w", err)
8382
}
84-
if tlsAdminHTTP.Enabled {
85-
tlsCfg, err := tlsAdminHTTP.Config(s.logger) // This checks if the certificates are correctly provided
86-
if err != nil {
87-
return err
88-
}
89-
s.tlsCfg = tlsCfg
90-
s.tlsCertWatcherCloser = &tlsAdminHTTP
91-
} else {
92-
s.tlsCertWatcherCloser = io.NopCloser(nil)
93-
}
83+
84+
s.serverCfg.Endpoint = v.GetString(adminHTTPHostPort)
85+
s.serverCfg.TLSSetting = tlsAdminHTTP.ToOtelServerConfig()
9486
return nil
9587
}
9688

@@ -101,48 +93,52 @@ func (s *AdminServer) Handle(path string, handler http.Handler) {
10193

10294
// Serve starts HTTP server.
10395
func (s *AdminServer) Serve() error {
104-
l, err := net.Listen("tcp", s.adminHostPort)
96+
l, err := s.serverCfg.ToListener(context.Background())
10597
if err != nil {
10698
s.logger.Error("Admin server failed to listen", zap.Error(err))
10799
return err
108100
}
109-
s.serveWithListener(l)
110101

111-
s.logger.Info(
112-
"Admin server started",
113-
zap.String("http.host-port", l.Addr().String()),
114-
zap.Stringer("health-status", s.hc.Get()))
115-
return nil
102+
return s.serveWithListener(l)
116103
}
117104

118-
func (s *AdminServer) serveWithListener(l net.Listener) {
105+
func (s *AdminServer) serveWithListener(l net.Listener) (err error) {
119106
s.logger.Info("Mounting health check on admin server", zap.String("route", "/"))
120107
s.mux.Handle("/", s.hc.Handler())
121108
version.RegisterHandler(s.mux, s.logger)
122109
s.registerPprofHandlers()
123110
recoveryHandler := recoveryhandler.NewRecoveryHandler(s.logger, true)
124-
errorLog, _ := zap.NewStdLogAt(s.logger, zapcore.ErrorLevel)
125-
s.server = &http.Server{
126-
Handler: recoveryHandler(s.mux),
127-
ErrorLog: errorLog,
128-
ReadHeaderTimeout: 2 * time.Second,
129-
}
130-
if s.tlsCfg != nil {
131-
s.server.TLSConfig = s.tlsCfg
111+
s.server, err = s.serverCfg.ToServer(
112+
context.Background(),
113+
nil, // host
114+
telemetry.NoopSettings().ToOtelComponent(),
115+
recoveryHandler(s.mux),
116+
)
117+
if err != nil {
118+
return fmt.Errorf("failed to create admin server: %w", err)
132119
}
133-
s.logger.Info("Starting admin HTTP server", zap.String("http-addr", s.adminHostPort))
120+
errorLog, _ := zap.NewStdLogAt(s.logger, zapcore.ErrorLevel)
121+
s.server.ErrorLog = errorLog
122+
123+
s.logger.Info("Starting admin HTTP server")
124+
var wg sync.WaitGroup
125+
wg.Add(1)
126+
s.stopped.Add(1)
134127
go func() {
135-
var err error
136-
if s.tlsCfg != nil {
137-
err = s.server.ServeTLS(l, "", "")
138-
} else {
139-
err = s.server.Serve(l)
140-
}
128+
wg.Done()
129+
defer s.stopped.Done()
130+
err := s.server.Serve(l)
141131
if err != nil && !errors.Is(err, http.ErrServerClosed) {
142132
s.logger.Error("failed to serve", zap.Error(err))
143133
s.hc.Set(healthcheck.Broken)
144134
}
145135
}()
136+
wg.Wait() // wait for the server to start listening
137+
s.logger.Info(
138+
"Admin server started",
139+
zap.String("http.host-port", l.Addr().String()),
140+
zap.Stringer("health-status", s.hc.Get()))
141+
return nil
146142
}
147143

148144
func (s *AdminServer) registerPprofHandlers() {
@@ -159,8 +155,7 @@ func (s *AdminServer) registerPprofHandlers() {
159155

160156
// Close stops the HTTP server
161157
func (s *AdminServer) Close() error {
162-
return errors.Join(
163-
s.tlsCertWatcherCloser.Close(),
164-
s.server.Shutdown(context.Background()),
165-
)
158+
err := s.server.Shutdown(context.Background())
159+
s.stopped.Wait()
160+
return err
166161
}

cmd/internal/flags/admin_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package flags
55

66
import (
7+
"context"
78
"crypto/tls"
89
"fmt"
910
"net"
@@ -69,7 +70,7 @@ func TestAdminFailToServe(t *testing.T) {
6970
require.NoError(t, adminServer.initFromViper(v, logger))
7071

7172
adminServer.serveWithListener(l)
72-
defer adminServer.Close()
73+
t.Cleanup(func() { assert.NoError(t, adminServer.Close()) })
7374

7475
waitForEqual(t, healthcheck.Broken, func() any { return adminServer.HC().Get() })
7576

@@ -133,9 +134,8 @@ func TestAdminServerTLS(t *testing.T) {
133134
adminServer.Serve()
134135
defer adminServer.Close()
135136

136-
clientTLSCfg, err0 := test.clientTLS.Config(zap.NewNop())
137+
clientTLSCfg, err0 := test.clientTLS.ToOtelClientConfig().LoadTLSConfig(context.Background())
137138
require.NoError(t, err0)
138-
defer test.clientTLS.Close()
139139
dialer := &net.Dialer{Timeout: 2 * time.Second}
140140
conn, clientError := tls.DialWithDialer(dialer, "tcp", fmt.Sprintf("localhost:%d", ports.CollectorAdminHTTP), clientTLSCfg)
141141
require.NoError(t, clientError)

cmd/internal/flags/service_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func TestStartErrors(t *testing.T) {
5050
{
5151
name: "bad admin TLS",
5252
flags: []string{"--admin.http.tls.enabled=true", "--admin.http.tls.cert=invalid-cert"},
53-
expErr: "cannot initialize admin server",
53+
expErr: "cannot start the admin server: failed to load TLS config",
5454
},
5555
{
5656
name: "bad host:port",

0 commit comments

Comments
 (0)