forked from elastic/apm-server
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.go
108 lines (94 loc) · 2.99 KB
/
server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. licenses this file to you 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 beater
import (
"context"
"net"
"net/http"
"golang.org/x/net/netutil"
"crypto/tls"
"github.com/elastic/apm-agent-go"
"github.com/elastic/apm-agent-go/module/apmhttp"
"github.com/elastic/beats/libbeat/logp"
"github.com/elastic/beats/libbeat/outputs"
"github.com/elastic/beats/libbeat/version"
)
type reporter func(context.Context, pendingReq) error
func newServer(config *Config, tracer *elasticapm.Tracer, report reporter) *http.Server {
mux := newMuxer(config, report)
return &http.Server{
Addr: config.Host,
Handler: apmhttp.Wrap(mux,
apmhttp.WithServerRequestIgnorer(doNotTrace),
apmhttp.WithTracer(tracer),
),
ReadTimeout: config.ReadTimeout,
WriteTimeout: config.WriteTimeout,
MaxHeaderBytes: config.MaxHeaderSize,
}
}
func doNotTrace(req *http.Request) bool {
if req.RemoteAddr == "pipe" {
// Don't trace requests coming from self,
// or we will go into a continuous cycle.
return true
}
if req.URL.Path == HealthCheckURL {
// Don't trace healthcheck requests.
return true
}
return false
}
func run(server *http.Server, lis net.Listener, config *Config) error {
logger := logp.NewLogger("server")
logger.Infof("Starting apm-server [%s built %s]. Hit CTRL-C to stop it.", version.Commit(), version.BuildTime())
logger.Infof("Listening on: %s", server.Addr)
switch config.RumConfig.isEnabled() {
case true:
logger.Info("RUM endpoints enabled!")
case false:
logger.Info("RUM endpoints disabled")
}
if config.MaxConnections > 0 {
lis = netutil.LimitListener(lis, config.MaxConnections)
logger.Infof("connections limit set to: %d", config.MaxConnections)
}
ssl := config.SSL
if ssl.isEnabled() {
cert, err := outputs.LoadCertificate(&config.SSL.Certificate)
if err != nil {
return err
}
server.TLSConfig = &tls.Config{Certificates: []tls.Certificate{*cert}}
return server.ServeTLS(lis, "", "")
}
if config.SecretToken != "" {
logger.Warn("Secret token is set, but SSL is not enabled.")
}
return server.Serve(lis)
}
func stop(server *http.Server) {
logger := logp.NewLogger("server")
err := server.Shutdown(context.Background())
if err != nil {
logger.Error(err.Error())
err = server.Close()
if err != nil {
logger.Error(err.Error())
}
}
}