/// <summary>
 ///     Creates a new upstream connected server group
 /// </summary>
 /// <param name="name">The name of the group.</param>
 /// <param name="visibility">The groups visibility.</param>
 /// <param name="threadHelper">The server's thread helper.</param>
 /// <param name="serverRegistryConnectorManager">The server's registry connector manager</param>
 /// <param name="remoteServerManager">The remote server manager for the server.</param>
 /// <param name="reconnectAttempts">The number of times to attempt to reconnect to a server before considering it unconnectable.</param>
 /// <param name="logger">The logger to use.</param>
 /// <param name="remoteServerLogger">The logger to pass to created remote servers.</param>
 /// <param name="metricsCollector">The metrics collector to use.</param>
 /// <param name="remoteServerMetricsCollector">The metrics collector to pass to created remote servers.</param>
 internal UpstreamServerGroup(string name, ServerVisibility visibility, DarkRiftThreadHelper threadHelper, ServerRegistryConnectorManager serverRegistryConnectorManager, RemoteServerManager remoteServerManager, int reconnectAttempts, Logger logger, Logger remoteServerLogger, MetricsCollector metricsCollector, MetricsCollector remoteServerMetricsCollector)
     : base(name, visibility, threadHelper, logger, metricsCollector)
 {
     this.threadHelper = threadHelper;
     this.serverRegistryConnectorManager = serverRegistryConnectorManager;
     this.remoteServerManager            = remoteServerManager;
     this.reconnectAttempts            = reconnectAttempts;
     this.logger                       = logger;
     this.remoteServerLogger           = remoteServerLogger;
     this.remoteServerMetricsCollector = remoteServerMetricsCollector;
 }
        /// <summary>
        ///     Creates a new remote server.
        /// </summary>
        /// <param name="remoteServerManager">The remote server manager for the server.</param>
        /// <param name="id">The ID of the server.</param>
        /// <param name="host">The host connected to.</param>
        /// <param name="port">The port connected to.</param>
        /// <param name="group">The group the server belongs to.</param>
        /// <param name="threadHelper">The thread helper to use.</param>
        /// <param name="logger">The logger to use.</param>
        /// <param name="metricsCollector">The metrics collector to use.</param>
        internal UpstreamRemoteServer(RemoteServerManager remoteServerManager, ushort id, string host, ushort port, UpstreamServerGroup group, DarkRiftThreadHelper threadHelper, Logger logger, MetricsCollector metricsCollector)
        {
            this.remoteServerManager = remoteServerManager;
            this.ID           = id;
            this.Host         = host;
            this.Port         = port;
            this.serverGroup  = group;
            this.threadHelper = threadHelper;
            this.logger       = logger;

            messagesSentCounter                    = metricsCollector.Counter("messages_sent", "The number of messages sent to remote servers.", "group").WithTags(group.Name);
            messagesReceivedCounter                = metricsCollector.Counter("messages_received", "The number of messages received from remote servers.", "group").WithTags(group.Name);
            messageReceivedEventTimeHistogram      = metricsCollector.Histogram("message_received_event_time", "The time taken to execute the MessageReceived event.", "group").WithTags(group.Name);
            messageReceivedEventFailuresCounter    = metricsCollector.Counter("message_received_event_failures", "The number of failures executing the MessageReceived event.", "group").WithTags(group.Name);
            serverConnectedEventTimeHistogram      = metricsCollector.Histogram("remote_server_connected_event_time", "The time taken to execute the ServerConnected event.", "group").WithTags(group.Name);
            serverDisconnectedEventTimeHistogram   = metricsCollector.Histogram("remote_server_disconnected_event_time", "The time taken to execute the ServerDisconnected event.", "group").WithTags(group.Name);
            serverConnectedEventFailuresCounter    = metricsCollector.Counter("remote_server_connected_event_failures", "The number of failures executing the ServerConnected event.", "group").WithTags(group.Name);
            serverDisconnectedEventFailuresCounter = metricsCollector.Counter("remote_server_disconnected_event_failures", "The number of failures executing the ServerDisconnected event.", "group").WithTags(group.Name);
        }