get.pme.sh/pnats@v0.0.0-20240304004023-26bb5a137ed0/server/monitor_sort_opts.go (about)

     1  // Copyright 2013-2018 The NATS Authors
     2  // Licensed under the Apache License, Version 2.0 (the "License");
     3  // you may not use this file except in compliance with the License.
     4  // You may obtain a copy of the License at
     5  //
     6  // http://www.apache.org/licenses/LICENSE-2.0
     7  //
     8  // Unless required by applicable law or agreed to in writing, software
     9  // distributed under the License is distributed on an "AS IS" BASIS,
    10  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  package server
    15  
    16  import (
    17  	"time"
    18  )
    19  
    20  // ConnInfos represents a connection info list. We use pointers since it will be sorted.
    21  type ConnInfos []*ConnInfo
    22  
    23  // For sorting
    24  // Len returns length for sorting.
    25  func (cl ConnInfos) Len() int { return len(cl) }
    26  
    27  // Swap will sawap the elements.
    28  func (cl ConnInfos) Swap(i, j int) { cl[i], cl[j] = cl[j], cl[i] }
    29  
    30  // SortOpt is a helper type to sort clients
    31  type SortOpt string
    32  
    33  // Possible sort options
    34  const (
    35  	ByCid      SortOpt = "cid"        // By connection ID
    36  	ByStart    SortOpt = "start"      // By connection start time, same as CID
    37  	BySubs     SortOpt = "subs"       // By number of subscriptions
    38  	ByPending  SortOpt = "pending"    // By amount of data in bytes waiting to be sent to client
    39  	ByOutMsgs  SortOpt = "msgs_to"    // By number of messages sent
    40  	ByInMsgs   SortOpt = "msgs_from"  // By number of messages received
    41  	ByOutBytes SortOpt = "bytes_to"   // By amount of bytes sent
    42  	ByInBytes  SortOpt = "bytes_from" // By amount of bytes received
    43  	ByLast     SortOpt = "last"       // By the last activity
    44  	ByIdle     SortOpt = "idle"       // By the amount of inactivity
    45  	ByUptime   SortOpt = "uptime"     // By the amount of time connections exist
    46  	ByStop     SortOpt = "stop"       // By the stop time for a closed connection
    47  	ByReason   SortOpt = "reason"     // By the reason for a closed connection
    48  	ByRTT      SortOpt = "rtt"        // By the round trip time
    49  )
    50  
    51  // Individual sort options provide the Less for sort.Interface. Len and Swap are on cList.
    52  // CID
    53  type byCid struct{ ConnInfos }
    54  
    55  func (l byCid) Less(i, j int) bool { return l.ConnInfos[i].Cid < l.ConnInfos[j].Cid }
    56  
    57  // Number of Subscriptions
    58  type bySubs struct{ ConnInfos }
    59  
    60  func (l bySubs) Less(i, j int) bool { return l.ConnInfos[i].NumSubs < l.ConnInfos[j].NumSubs }
    61  
    62  // Pending Bytes
    63  type byPending struct{ ConnInfos }
    64  
    65  func (l byPending) Less(i, j int) bool { return l.ConnInfos[i].Pending < l.ConnInfos[j].Pending }
    66  
    67  // Outbound Msgs
    68  type byOutMsgs struct{ ConnInfos }
    69  
    70  func (l byOutMsgs) Less(i, j int) bool { return l.ConnInfos[i].OutMsgs < l.ConnInfos[j].OutMsgs }
    71  
    72  // Inbound Msgs
    73  type byInMsgs struct{ ConnInfos }
    74  
    75  func (l byInMsgs) Less(i, j int) bool { return l.ConnInfos[i].InMsgs < l.ConnInfos[j].InMsgs }
    76  
    77  // Outbound Bytes
    78  type byOutBytes struct{ ConnInfos }
    79  
    80  func (l byOutBytes) Less(i, j int) bool { return l.ConnInfos[i].OutBytes < l.ConnInfos[j].OutBytes }
    81  
    82  // Inbound Bytes
    83  type byInBytes struct{ ConnInfos }
    84  
    85  func (l byInBytes) Less(i, j int) bool { return l.ConnInfos[i].InBytes < l.ConnInfos[j].InBytes }
    86  
    87  // Last Activity
    88  type byLast struct{ ConnInfos }
    89  
    90  func (l byLast) Less(i, j int) bool {
    91  	return l.ConnInfos[i].LastActivity.UnixNano() < l.ConnInfos[j].LastActivity.UnixNano()
    92  }
    93  
    94  // Idle time
    95  type byIdle struct {
    96  	ConnInfos
    97  	now time.Time
    98  }
    99  
   100  func (l byIdle) Less(i, j int) bool {
   101  	return l.now.Sub(l.ConnInfos[i].LastActivity) < l.now.Sub(l.ConnInfos[j].LastActivity)
   102  }
   103  
   104  // Uptime
   105  type byUptime struct {
   106  	ConnInfos
   107  	now time.Time
   108  }
   109  
   110  func (l byUptime) Less(i, j int) bool {
   111  	ci := l.ConnInfos[i]
   112  	cj := l.ConnInfos[j]
   113  	var upi, upj time.Duration
   114  	if ci.Stop == nil || ci.Stop.IsZero() {
   115  		upi = l.now.Sub(ci.Start)
   116  	} else {
   117  		upi = ci.Stop.Sub(ci.Start)
   118  	}
   119  	if cj.Stop == nil || cj.Stop.IsZero() {
   120  		upj = l.now.Sub(cj.Start)
   121  	} else {
   122  		upj = cj.Stop.Sub(cj.Start)
   123  	}
   124  	return upi < upj
   125  }
   126  
   127  // Stop
   128  type byStop struct{ ConnInfos }
   129  
   130  func (l byStop) Less(i, j int) bool {
   131  	ciStop := l.ConnInfos[i].Stop
   132  	cjStop := l.ConnInfos[j].Stop
   133  	return ciStop.Before(*cjStop)
   134  }
   135  
   136  // Reason
   137  type byReason struct{ ConnInfos }
   138  
   139  func (l byReason) Less(i, j int) bool {
   140  	return l.ConnInfos[i].Reason < l.ConnInfos[j].Reason
   141  }
   142  
   143  // RTT - Default is descending
   144  type byRTT struct{ ConnInfos }
   145  
   146  func (l byRTT) Less(i, j int) bool { return l.ConnInfos[i].rtt < l.ConnInfos[j].rtt }
   147  
   148  // IsValid determines if a sort option is valid
   149  func (s SortOpt) IsValid() bool {
   150  	switch s {
   151  	case _EMPTY_, ByCid, ByStart, BySubs, ByPending, ByOutMsgs, ByInMsgs, ByOutBytes, ByInBytes, ByLast, ByIdle, ByUptime, ByStop, ByReason, ByRTT:
   152  		return true
   153  	default:
   154  		return false
   155  	}
   156  }