Skip to content

Commit

Permalink
allow limit to traced message
Browse files Browse the repository at this point in the history
  • Loading branch information
andyxning committed Jul 14, 2019
1 parent 94071d3 commit 1f52ac4
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 3 deletions.
9 changes: 7 additions & 2 deletions server/client.go
Expand Up @@ -1010,8 +1010,13 @@ func (c *client) traceMsg(msg []byte) {
if !c.trace {
return
}
// FIXME(dlc), allow limits to printable payload.
c.Tracef("<<- MSG_PAYLOAD: [%q]", msg[:len(msg)-LEN_CR_LF])

opts := c.srv.getOpts()
if (len(msg) - LEN_CR_LF) > opts.MaxTracedMsgLen {
c.Tracef("<<- MSG_PAYLOAD: [\"%s...\"]", msg[:opts.MaxTracedMsgLen])
} else {
c.Tracef("<<- MSG_PAYLOAD: [%q]", msg[:len(msg)-LEN_CR_LF])
}
}

func (c *client) traceInOp(op string, arg []byte) {
Expand Down
3 changes: 3 additions & 0 deletions server/const.go
Expand Up @@ -163,4 +163,7 @@ const (
// DEFAULT_RTT_MEASUREMENT_INTERVAL is how often we want to measure RTT from
// this server to clients, routes, gateways or leafnode connections.
DEFAULT_RTT_MEASUREMENT_INTERVAL = time.Hour

// MAX_TRACED_MSG_LEN is the maximum printable length for traced messages.
MAX_TRACED_MSG_LEN = 1024
)
8 changes: 8 additions & 0 deletions server/opts.go
Expand Up @@ -190,6 +190,8 @@ type Options struct {
WriteDeadline time.Duration `json:"-"`
MaxClosedClients int `json:"-"`
LameDuckDuration time.Duration `json:"-"`
// MaxTracedMsgLen is the maximum printable length for traced messages.
MaxTracedMsgLen int `json:"-"`

// Operating a trusted NATS server
TrustedKeys []string `json:"-"`
Expand Down Expand Up @@ -539,6 +541,8 @@ func (o *Options) ProcessConfigFile(configFile string) error {
o.MaxPending = v.(int64)
case "max_connections", "max_conn":
o.MaxConn = int(v.(int64))
case "max_traced_msg_len":
o.MaxTracedMsgLen = int(v.(int64))
case "max_subscriptions", "max_subs":
o.MaxSubs = int(v.(int64))
case "ping_interval":
Expand Down Expand Up @@ -2482,6 +2486,9 @@ func setBaselineOptions(opts *Options) {
if opts.ReconnectErrorReports == 0 {
opts.ReconnectErrorReports = DEFAULT_RECONNECT_ERROR_REPORTS
}
if opts.MaxTracedMsgLen == -1 {
opts.MaxTracedMsgLen = MAX_TRACED_MSG_LEN
}
}

// ConfigureOptions accepts a flag set and augment it with NATS Server
Expand Down Expand Up @@ -2551,6 +2558,7 @@ func ConfigureOptions(fs *flag.FlagSet, args []string, printVersion, printHelp,
fs.StringVar(&opts.TLSCert, "tlscert", "", "Server certificate file.")
fs.StringVar(&opts.TLSKey, "tlskey", "", "Private key for server certificate.")
fs.StringVar(&opts.TLSCaCert, "tlscacert", "", "Client certificate CA for verification.")
fs.IntVar(&opts.MaxTracedMsgLen, "max_traced_msg_len", -1, "Maximum printable length for traced messages")

// The flags definition above set "default" values to some of the options.
// Calling Parse() here will override the default options with any value
Expand Down
1 change: 1 addition & 0 deletions server/opts_test.go
Expand Up @@ -61,6 +61,7 @@ func TestDefaultOptions(t *testing.T) {
},
ConnectErrorReports: DEFAULT_CONNECT_ERROR_REPORTS,
ReconnectErrorReports: DEFAULT_RECONNECT_ERROR_REPORTS,
MaxTracedMsgLen: 0,
}

opts := &Options{}
Expand Down
17 changes: 16 additions & 1 deletion server/reload.go
Expand Up @@ -523,6 +523,20 @@ func (r *reconnectErrorReports) Apply(s *Server) {
s.Noticef("Reloaded: reconnect_error_reports = %v", r.newValue)
}

// maxTracedMsgLenOption implements the option interface for the `max_traced_msg_len` setting.
type maxTracedMsgLenOption struct {
noopOption
newValue int
}

// Apply the setting by updating the maximum traced message length.
func (m *maxTracedMsgLenOption) Apply(server *Server) {
server.mu.Lock()
defer server.mu.Unlock()
server.opts.MaxTracedMsgLen = m.newValue
server.Noticef("Reloaded: max_traced_msg_len = %d", m.newValue)
}

// Reload reads the current configuration file and applies any supported
// changes. This returns an error if the server was not started with a config
// file or an option which doesn't support hot-swapping was changed.
Expand Down Expand Up @@ -771,14 +785,15 @@ func (s *Server) diffOptions(newOpts *Options) ([]option, error) {
// Ignore NoLog and NoSigs options since they are not parsed and only used in
// testing.
continue
case "maxtracedmsglen":
diffOpts = append(diffOpts, &maxTracedMsgLenOption{newValue: newValue.(int)})
case "port":
// check to see if newValue == 0 and continue if so.
if newValue == 0 {
// ignore RANDOM_PORT
continue
}
fallthrough

default:
// TODO(ik): Implement String() on those options to have a nice print.
// %v is difficult to figure what's what, %+v print private fields and
Expand Down

0 comments on commit 1f52ac4

Please sign in to comment.