Skip to content

Commit c68ffe5

Browse files
[adding] kind and client_type to account connect/disconnect events (#2351)
* [adding] kind and client_type to client info. specifically account connect/disconnect events Kind is Client/Leafnode but can take the value of Router/Gateway/JetStream/Account/System in the future. When kind is Client, then client_type is set to mqtt/websocket/nats This fixes #2291 Signed-off-by: Matthias Hanel <[email protected]>
1 parent 54e16e8 commit c68ffe5

File tree

6 files changed

+102
-79
lines changed

6 files changed

+102
-79
lines changed

server/auth.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -671,7 +671,7 @@ func (s *Server) processClientOrLeafAuthentication(c *client, opts *Options) boo
671671
acc.mu.RLock()
672672
c.Debugf("Authenticated JWT: %s %q (claim-name: %q, claim-tags: %q) "+
673673
"signed with %q by Account %q (claim-name: %q, claim-tags: %q) signed with %q",
674-
c.typeString(), juc.Subject, juc.Name, juc.Tags, juc.Issuer, issuer, acc.nameTag, acc.tags, acc.Issuer)
674+
c.kindString(), juc.Subject, juc.Name, juc.Tags, juc.Issuer, issuer, acc.nameTag, acc.tags, acc.Issuer)
675675
acc.mu.RUnlock()
676676
return true
677677
}

server/client.go

+24-9
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,20 @@ func (c *client) clientType() int {
474474
}
475475
}
476476

477+
var clientTypeStringMap = map[int]string{
478+
NON_CLIENT: _EMPTY_,
479+
NATS: "nats",
480+
WS: "websocket",
481+
MQTT: "mqtt",
482+
}
483+
484+
func (c *client) clientTypeString() string {
485+
if typeStringVal, ok := clientTypeStringMap[c.clientType()]; ok {
486+
return typeStringVal
487+
}
488+
return _EMPTY_
489+
}
490+
477491
// This is the main subscription struct that indicates
478492
// interest in published messages.
479493
// FIXME(dlc) - This is getting bloated for normal subs, need
@@ -1493,11 +1507,11 @@ func (c *client) markConnAsClosed(reason ClosedState) {
14931507
// we use Noticef on create, so use that too for delete.
14941508
if c.srv != nil {
14951509
if c.kind == LEAF {
1496-
c.Noticef("%s connection closed: %s account: %s", c.typeString(), reason, c.acc.traceLabel())
1510+
c.Noticef("%s connection closed: %s account: %s", c.kindString(), reason, c.acc.traceLabel())
14971511
} else if c.kind == ROUTER || c.kind == GATEWAY {
1498-
c.Noticef("%s connection closed: %s", c.typeString(), reason)
1512+
c.Noticef("%s connection closed: %s", c.kindString(), reason)
14991513
} else { // Client, System, Jetstream, and Account connections.
1500-
c.Debugf("%s connection closed: %s", c.typeString(), reason)
1514+
c.Debugf("%s connection closed: %s", c.kindString(), reason)
15011515
}
15021516
}
15031517

@@ -4331,7 +4345,7 @@ func (c *client) processPingTimer() {
43314345
return
43324346
}
43334347

4334-
c.Debugf("%s Ping Timer", c.typeString())
4348+
c.Debugf("%s Ping Timer", c.kindString())
43354349

43364350
var sendPing bool
43374351

@@ -4467,7 +4481,7 @@ func (c *client) flushAndClose(minimalFlush bool) {
44674481
}
44684482
}
44694483

4470-
var typeStringMap = map[int]string{
4484+
var kindStringMap = map[int]string{
44714485
CLIENT: "Client",
44724486
ROUTER: "Router",
44734487
GATEWAY: "Gateway",
@@ -4477,11 +4491,10 @@ var typeStringMap = map[int]string{
44774491
SYSTEM: "System",
44784492
}
44794493

4480-
func (c *client) typeString() string {
4481-
if typeStringVal, ok := typeStringMap[c.kind]; ok {
4482-
return typeStringVal
4494+
func (c *client) kindString() string {
4495+
if kindStringVal, ok := kindStringMap[c.kind]; ok {
4496+
return kindStringVal
44834497
}
4484-
44854498
return "Unknown Type"
44864499
}
44874500

@@ -4943,6 +4956,8 @@ func (c *client) getClientInfo(detailed bool) *ClientInfo {
49434956
ci.IssuerKey = issuerForClient(c)
49444957
ci.NameTag = c.nameTag
49454958
ci.Tags = c.tags
4959+
ci.Kind = c.kindString()
4960+
ci.ClientType = c.clientTypeString()
49464961
}
49474962
c.mu.Unlock()
49484963
return &ci

server/client_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -893,7 +893,7 @@ func TestTypeString(t *testing.T) {
893893
}
894894
for _, cs := range cases {
895895
c := &client{kind: cs.intType}
896-
typeStringVal := c.typeString()
896+
typeStringVal := c.kindString()
897897

898898
if typeStringVal != cs.stringType {
899899
t.Fatalf("Expected typeString value %q, but instead received %q", cs.stringType, typeStringVal)

server/events.go

+67-59
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ const (
5353
serverStatsSubj = "$SYS.SERVER.%s.STATSZ"
5454
serverDirectReqSubj = "$SYS.REQ.SERVER.%s.%s"
5555
serverPingReqSubj = "$SYS.REQ.SERVER.PING.%s"
56-
serverStatsPingReqSubj = "$SYS.REQ.SERVER.PING" // use $SYS.REQ.SERVER.PING.STATSZ instead
57-
leafNodeConnectEventSubj = "$SYS.ACCOUNT.%s.LEAFNODE.CONNECT"
56+
serverStatsPingReqSubj = "$SYS.REQ.SERVER.PING" // use $SYS.REQ.SERVER.PING.STATSZ instead
57+
leafNodeConnectEventSubj = "$SYS.ACCOUNT.%s.LEAFNODE.CONNECT" // for internal use only
5858
remoteLatencyEventSubj = "$SYS.LATENCY.M2.%s"
5959
inboxRespSubj = "$SYS._INBOX.%s.%s"
6060

@@ -165,23 +165,25 @@ type ServerInfo struct {
165165

166166
// ClientInfo is detailed information about the client forming a connection.
167167
type ClientInfo struct {
168-
Start *time.Time `json:"start,omitempty"`
169-
Host string `json:"host,omitempty"`
170-
ID uint64 `json:"id,omitempty"`
171-
Account string `json:"acc"`
172-
Service string `json:"svc,omitempty"`
173-
User string `json:"user,omitempty"`
174-
Name string `json:"name,omitempty"`
175-
Lang string `json:"lang,omitempty"`
176-
Version string `json:"ver,omitempty"`
177-
RTT time.Duration `json:"rtt,omitempty"`
178-
Server string `json:"server,omitempty"`
179-
Cluster string `json:"cluster,omitempty"`
180-
Stop *time.Time `json:"stop,omitempty"`
181-
Jwt string `json:"jwt,omitempty"`
182-
IssuerKey string `json:"issuer_key,omitempty"`
183-
NameTag string `json:"name_tag,omitempty"`
184-
Tags jwt.TagList `json:"tags,omitempty"`
168+
Start *time.Time `json:"start,omitempty"`
169+
Host string `json:"host,omitempty"`
170+
ID uint64 `json:"id,omitempty"`
171+
Account string `json:"acc"`
172+
Service string `json:"svc,omitempty"`
173+
User string `json:"user,omitempty"`
174+
Name string `json:"name,omitempty"`
175+
Lang string `json:"lang,omitempty"`
176+
Version string `json:"ver,omitempty"`
177+
RTT time.Duration `json:"rtt,omitempty"`
178+
Server string `json:"server,omitempty"`
179+
Cluster string `json:"cluster,omitempty"`
180+
Stop *time.Time `json:"stop,omitempty"`
181+
Jwt string `json:"jwt,omitempty"`
182+
IssuerKey string `json:"issuer_key,omitempty"`
183+
NameTag string `json:"name_tag,omitempty"`
184+
Tags jwt.TagList `json:"tags,omitempty"`
185+
Kind string `json:"kind,omitempty"`
186+
ClientType string `json:"client_type,omitempty"`
185187
}
186188

187189
// ServerStats hold various statistics that we will periodically send out.
@@ -1440,18 +1442,20 @@ func (s *Server) accountConnectEvent(c *client) {
14401442
Time: time.Now().UTC(),
14411443
},
14421444
Client: ClientInfo{
1443-
Start: &c.start,
1444-
Host: c.host,
1445-
ID: c.cid,
1446-
Account: accForClient(c),
1447-
User: c.getRawAuthUser(),
1448-
Name: c.opts.Name,
1449-
Lang: c.opts.Lang,
1450-
Version: c.opts.Version,
1451-
Jwt: c.opts.JWT,
1452-
IssuerKey: issuerForClient(c),
1453-
Tags: c.tags,
1454-
NameTag: c.nameTag,
1445+
Start: &c.start,
1446+
Host: c.host,
1447+
ID: c.cid,
1448+
Account: accForClient(c),
1449+
User: c.getRawAuthUser(),
1450+
Name: c.opts.Name,
1451+
Lang: c.opts.Lang,
1452+
Version: c.opts.Version,
1453+
Jwt: c.opts.JWT,
1454+
IssuerKey: issuerForClient(c),
1455+
Tags: c.tags,
1456+
NameTag: c.nameTag,
1457+
Kind: c.kindString(),
1458+
ClientType: c.clientTypeString(),
14551459
},
14561460
}
14571461
c.mu.Unlock()
@@ -1487,20 +1491,22 @@ func (s *Server) accountDisconnectEvent(c *client, now time.Time, reason string)
14871491
Time: now,
14881492
},
14891493
Client: ClientInfo{
1490-
Start: &c.start,
1491-
Stop: &now,
1492-
Host: c.host,
1493-
ID: c.cid,
1494-
Account: accForClient(c),
1495-
User: c.getRawAuthUser(),
1496-
Name: c.opts.Name,
1497-
Lang: c.opts.Lang,
1498-
Version: c.opts.Version,
1499-
RTT: c.getRTT(),
1500-
Jwt: c.opts.JWT,
1501-
IssuerKey: issuerForClient(c),
1502-
Tags: c.tags,
1503-
NameTag: c.nameTag,
1494+
Start: &c.start,
1495+
Stop: &now,
1496+
Host: c.host,
1497+
ID: c.cid,
1498+
Account: accForClient(c),
1499+
User: c.getRawAuthUser(),
1500+
Name: c.opts.Name,
1501+
Lang: c.opts.Lang,
1502+
Version: c.opts.Version,
1503+
RTT: c.getRTT(),
1504+
Jwt: c.opts.JWT,
1505+
IssuerKey: issuerForClient(c),
1506+
Tags: c.tags,
1507+
NameTag: c.nameTag,
1508+
Kind: c.kindString(),
1509+
ClientType: c.clientTypeString(),
15041510
},
15051511
Sent: DataStats{
15061512
Msgs: atomic.LoadInt64(&c.inMsgs),
@@ -1536,20 +1542,22 @@ func (s *Server) sendAuthErrorEvent(c *client) {
15361542
Time: now,
15371543
},
15381544
Client: ClientInfo{
1539-
Start: &c.start,
1540-
Stop: &now,
1541-
Host: c.host,
1542-
ID: c.cid,
1543-
Account: accForClient(c),
1544-
User: c.getRawAuthUser(),
1545-
Name: c.opts.Name,
1546-
Lang: c.opts.Lang,
1547-
Version: c.opts.Version,
1548-
RTT: c.getRTT(),
1549-
Jwt: c.opts.JWT,
1550-
IssuerKey: issuerForClient(c),
1551-
Tags: c.tags,
1552-
NameTag: c.nameTag,
1545+
Start: &c.start,
1546+
Stop: &now,
1547+
Host: c.host,
1548+
ID: c.cid,
1549+
Account: accForClient(c),
1550+
User: c.getRawAuthUser(),
1551+
Name: c.opts.Name,
1552+
Lang: c.opts.Lang,
1553+
Version: c.opts.Version,
1554+
RTT: c.getRTT(),
1555+
Jwt: c.opts.JWT,
1556+
IssuerKey: issuerForClient(c),
1557+
Tags: c.tags,
1558+
NameTag: c.nameTag,
1559+
Kind: c.kindString(),
1560+
ClientType: c.clientTypeString(),
15531561
},
15541562
Sent: DataStats{
15551563
Msgs: c.inMsgs,

server/ocsp.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ func (srv *Server) NewOCSPMonitor(config *tlsConfigKind) (*tls.Config, *OCSPMoni
317317
certFile string
318318
caFile string
319319
)
320-
if kind == typeStringMap[CLIENT] {
320+
if kind == kindStringMap[CLIENT] {
321321
tcOpts = opts.tlsConfigOpts
322322
if opts.TLSCert != _EMPTY_ {
323323
certFile = opts.TLSCert
@@ -412,7 +412,7 @@ func (srv *Server) NewOCSPMonitor(config *tlsConfigKind) (*tls.Config, *OCSPMoni
412412

413413
// Check whether need to verify staples from a client connection depending on the type.
414414
switch kind {
415-
case typeStringMap[ROUTER], typeStringMap[GATEWAY], typeStringMap[LEAF]:
415+
case kindStringMap[ROUTER], kindStringMap[GATEWAY], kindStringMap[LEAF]:
416416
tc.VerifyConnection = func(s tls.ConnectionState) error {
417417
oresp := s.OCSPResponse
418418
if oresp == nil {
@@ -491,7 +491,7 @@ func (s *Server) configureOCSP() []*tlsConfigKind {
491491
if config := sopts.TLSConfig; config != nil {
492492
opts := sopts.tlsConfigOpts
493493
o := &tlsConfigKind{
494-
kind: typeStringMap[CLIENT],
494+
kind: kindStringMap[CLIENT],
495495
tlsConfig: config,
496496
tlsOpts: opts,
497497
apply: func(tc *tls.Config) { sopts.TLSConfig = tc },
@@ -501,7 +501,7 @@ func (s *Server) configureOCSP() []*tlsConfigKind {
501501
if config := sopts.Cluster.TLSConfig; config != nil {
502502
opts := sopts.Cluster.tlsConfigOpts
503503
o := &tlsConfigKind{
504-
kind: typeStringMap[ROUTER],
504+
kind: kindStringMap[ROUTER],
505505
tlsConfig: config,
506506
tlsOpts: opts,
507507
apply: func(tc *tls.Config) { sopts.Cluster.TLSConfig = tc },
@@ -511,7 +511,7 @@ func (s *Server) configureOCSP() []*tlsConfigKind {
511511
if config := sopts.LeafNode.TLSConfig; config != nil {
512512
opts := sopts.LeafNode.tlsConfigOpts
513513
o := &tlsConfigKind{
514-
kind: typeStringMap[LEAF],
514+
kind: kindStringMap[LEAF],
515515
tlsConfig: config,
516516
tlsOpts: opts,
517517
apply: func(tc *tls.Config) {
@@ -531,7 +531,7 @@ func (s *Server) configureOCSP() []*tlsConfigKind {
531531
opts := remote.tlsConfigOpts
532532
if config := remote.TLSConfig; config != nil {
533533
o := &tlsConfigKind{
534-
kind: typeStringMap[LEAF],
534+
kind: kindStringMap[LEAF],
535535
tlsConfig: config,
536536
tlsOpts: opts,
537537
apply: func(tc *tls.Config) {
@@ -548,7 +548,7 @@ func (s *Server) configureOCSP() []*tlsConfigKind {
548548
if config := sopts.Gateway.TLSConfig; config != nil {
549549
opts := sopts.Gateway.tlsConfigOpts
550550
o := &tlsConfigKind{
551-
kind: typeStringMap[GATEWAY],
551+
kind: kindStringMap[GATEWAY],
552552
tlsConfig: config,
553553
tlsOpts: opts,
554554
apply: func(tc *tls.Config) { sopts.Gateway.TLSConfig = tc },
@@ -559,7 +559,7 @@ func (s *Server) configureOCSP() []*tlsConfigKind {
559559
opts := remote.tlsConfigOpts
560560
if config := remote.TLSConfig; config != nil {
561561
o := &tlsConfigKind{
562-
kind: typeStringMap[GATEWAY],
562+
kind: kindStringMap[GATEWAY],
563563
tlsConfig: config,
564564
tlsOpts: opts,
565565
apply: func(tc *tls.Config) {

server/parser.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1190,7 +1190,7 @@ authErr:
11901190
parseErr:
11911191
c.sendErr("Unknown Protocol Operation")
11921192
snip := protoSnippet(i, PROTO_SNIPPET_SIZE, buf)
1193-
err := fmt.Errorf("%s parser ERROR, state=%d, i=%d: proto='%s...'", c.typeString(), c.state, i, snip)
1193+
err := fmt.Errorf("%s parser ERROR, state=%d, i=%d: proto='%s...'", c.kindString(), c.state, i, snip)
11941194
return err
11951195
}
11961196

0 commit comments

Comments
 (0)