mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-04 03:42:25 -06:00 
			
		
		
		
	
		
			
	
	
		
			120 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			120 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Copyright 2024 gRPC authors.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Licensed 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 channelz
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"fmt"
							 | 
						||
| 
								 | 
							
									"sync/atomic"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Server is the channelz representation of a server.
							 | 
						||
| 
								 | 
							
								type Server struct {
							 | 
						||
| 
								 | 
							
									Entity
							 | 
						||
| 
								 | 
							
									ID      int64
							 | 
						||
| 
								 | 
							
									RefName string
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									ServerMetrics ServerMetrics
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									closeCalled   bool
							 | 
						||
| 
								 | 
							
									sockets       map[int64]string
							 | 
						||
| 
								 | 
							
									listenSockets map[int64]string
							 | 
						||
| 
								 | 
							
									cm            *channelMap
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ServerMetrics defines a struct containing metrics for servers.
							 | 
						||
| 
								 | 
							
								type ServerMetrics struct {
							 | 
						||
| 
								 | 
							
									// The number of incoming calls started on the server.
							 | 
						||
| 
								 | 
							
									CallsStarted atomic.Int64
							 | 
						||
| 
								 | 
							
									// The number of incoming calls that have completed with an OK status.
							 | 
						||
| 
								 | 
							
									CallsSucceeded atomic.Int64
							 | 
						||
| 
								 | 
							
									// The number of incoming calls that have a completed with a non-OK status.
							 | 
						||
| 
								 | 
							
									CallsFailed atomic.Int64
							 | 
						||
| 
								 | 
							
									// The last time a call was started on the server.
							 | 
						||
| 
								 | 
							
									LastCallStartedTimestamp atomic.Int64
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// NewServerMetricsForTesting returns an initialized ServerMetrics.
							 | 
						||
| 
								 | 
							
								func NewServerMetricsForTesting(started, succeeded, failed, timestamp int64) *ServerMetrics {
							 | 
						||
| 
								 | 
							
									sm := &ServerMetrics{}
							 | 
						||
| 
								 | 
							
									sm.CallsStarted.Store(started)
							 | 
						||
| 
								 | 
							
									sm.CallsSucceeded.Store(succeeded)
							 | 
						||
| 
								 | 
							
									sm.CallsFailed.Store(failed)
							 | 
						||
| 
								 | 
							
									sm.LastCallStartedTimestamp.Store(timestamp)
							 | 
						||
| 
								 | 
							
									return sm
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (sm *ServerMetrics) CopyFrom(o *ServerMetrics) {
							 | 
						||
| 
								 | 
							
									sm.CallsStarted.Store(o.CallsStarted.Load())
							 | 
						||
| 
								 | 
							
									sm.CallsSucceeded.Store(o.CallsSucceeded.Load())
							 | 
						||
| 
								 | 
							
									sm.CallsFailed.Store(o.CallsFailed.Load())
							 | 
						||
| 
								 | 
							
									sm.LastCallStartedTimestamp.Store(o.LastCallStartedTimestamp.Load())
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ListenSockets returns the listening sockets for s.
							 | 
						||
| 
								 | 
							
								func (s *Server) ListenSockets() map[int64]string {
							 | 
						||
| 
								 | 
							
									db.mu.RLock()
							 | 
						||
| 
								 | 
							
									defer db.mu.RUnlock()
							 | 
						||
| 
								 | 
							
									return copyMap(s.listenSockets)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// String returns a printable description of s.
							 | 
						||
| 
								 | 
							
								func (s *Server) String() string {
							 | 
						||
| 
								 | 
							
									return fmt.Sprintf("Server #%d", s.ID)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (s *Server) id() int64 {
							 | 
						||
| 
								 | 
							
									return s.ID
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (s *Server) addChild(id int64, e entry) {
							 | 
						||
| 
								 | 
							
									switch v := e.(type) {
							 | 
						||
| 
								 | 
							
									case *Socket:
							 | 
						||
| 
								 | 
							
										switch v.SocketType {
							 | 
						||
| 
								 | 
							
										case SocketTypeNormal:
							 | 
						||
| 
								 | 
							
											s.sockets[id] = v.RefName
							 | 
						||
| 
								 | 
							
										case SocketTypeListen:
							 | 
						||
| 
								 | 
							
											s.listenSockets[id] = v.RefName
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									default:
							 | 
						||
| 
								 | 
							
										logger.Errorf("cannot add a child (id = %d) of type %T to a server", id, e)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (s *Server) deleteChild(id int64) {
							 | 
						||
| 
								 | 
							
									delete(s.sockets, id)
							 | 
						||
| 
								 | 
							
									delete(s.listenSockets, id)
							 | 
						||
| 
								 | 
							
									s.deleteSelfIfReady()
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (s *Server) triggerDelete() {
							 | 
						||
| 
								 | 
							
									s.closeCalled = true
							 | 
						||
| 
								 | 
							
									s.deleteSelfIfReady()
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (s *Server) deleteSelfIfReady() {
							 | 
						||
| 
								 | 
							
									if !s.closeCalled || len(s.sockets)+len(s.listenSockets) != 0 {
							 | 
						||
| 
								 | 
							
										return
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									s.cm.deleteEntry(s.ID)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (s *Server) getParentID() int64 {
							 | 
						||
| 
								 | 
							
									return 0
							 | 
						||
| 
								 | 
							
								}
							 |