google.golang.org/grpc@v1.72.2/internal/channelz/server.go (about)

     1  /*
     2   *
     3   * Copyright 2024 gRPC authors.
     4   *
     5   * Licensed under the Apache License, Version 2.0 (the "License");
     6   * you may not use this file except in compliance with the License.
     7   * You may obtain a copy of the License at
     8   *
     9   *     http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   *
    17   */
    18  
    19  package channelz
    20  
    21  import (
    22  	"fmt"
    23  	"sync/atomic"
    24  )
    25  
    26  // Server is the channelz representation of a server.
    27  type Server struct {
    28  	Entity
    29  	ID      int64
    30  	RefName string
    31  
    32  	ServerMetrics ServerMetrics
    33  
    34  	closeCalled   bool
    35  	sockets       map[int64]string
    36  	listenSockets map[int64]string
    37  	cm            *channelMap
    38  }
    39  
    40  // ServerMetrics defines a struct containing metrics for servers.
    41  type ServerMetrics struct {
    42  	// The number of incoming calls started on the server.
    43  	CallsStarted atomic.Int64
    44  	// The number of incoming calls that have completed with an OK status.
    45  	CallsSucceeded atomic.Int64
    46  	// The number of incoming calls that have a completed with a non-OK status.
    47  	CallsFailed atomic.Int64
    48  	// The last time a call was started on the server.
    49  	LastCallStartedTimestamp atomic.Int64
    50  }
    51  
    52  // NewServerMetricsForTesting returns an initialized ServerMetrics.
    53  func NewServerMetricsForTesting(started, succeeded, failed, timestamp int64) *ServerMetrics {
    54  	sm := &ServerMetrics{}
    55  	sm.CallsStarted.Store(started)
    56  	sm.CallsSucceeded.Store(succeeded)
    57  	sm.CallsFailed.Store(failed)
    58  	sm.LastCallStartedTimestamp.Store(timestamp)
    59  	return sm
    60  }
    61  
    62  // CopyFrom copies the metrics data from the provided ServerMetrics
    63  // instance into the current instance.
    64  func (sm *ServerMetrics) CopyFrom(o *ServerMetrics) {
    65  	sm.CallsStarted.Store(o.CallsStarted.Load())
    66  	sm.CallsSucceeded.Store(o.CallsSucceeded.Load())
    67  	sm.CallsFailed.Store(o.CallsFailed.Load())
    68  	sm.LastCallStartedTimestamp.Store(o.LastCallStartedTimestamp.Load())
    69  }
    70  
    71  // ListenSockets returns the listening sockets for s.
    72  func (s *Server) ListenSockets() map[int64]string {
    73  	db.mu.RLock()
    74  	defer db.mu.RUnlock()
    75  	return copyMap(s.listenSockets)
    76  }
    77  
    78  // String returns a printable description of s.
    79  func (s *Server) String() string {
    80  	return fmt.Sprintf("Server #%d", s.ID)
    81  }
    82  
    83  func (s *Server) id() int64 {
    84  	return s.ID
    85  }
    86  
    87  func (s *Server) addChild(id int64, e entry) {
    88  	switch v := e.(type) {
    89  	case *Socket:
    90  		switch v.SocketType {
    91  		case SocketTypeNormal:
    92  			s.sockets[id] = v.RefName
    93  		case SocketTypeListen:
    94  			s.listenSockets[id] = v.RefName
    95  		}
    96  	default:
    97  		logger.Errorf("cannot add a child (id = %d) of type %T to a server", id, e)
    98  	}
    99  }
   100  
   101  func (s *Server) deleteChild(id int64) {
   102  	delete(s.sockets, id)
   103  	delete(s.listenSockets, id)
   104  	s.deleteSelfIfReady()
   105  }
   106  
   107  func (s *Server) triggerDelete() {
   108  	s.closeCalled = true
   109  	s.deleteSelfIfReady()
   110  }
   111  
   112  func (s *Server) deleteSelfIfReady() {
   113  	if !s.closeCalled || len(s.sockets)+len(s.listenSockets) != 0 {
   114  		return
   115  	}
   116  	s.cm.deleteEntry(s.ID)
   117  }
   118  
   119  func (s *Server) getParentID() int64 {
   120  	return 0
   121  }