/// <summary> /// Callback for channel subscriptions. /// </summary> /// <param name="counterSampleMessage">The counter sample message.</param> private void OnCounterSample(CounterSampleMessage counterSampleMessage) { if (Interlocked.Read(ref state) == 1L) { CounterSampleCollection samples; if (!sampleDictionary.TryGetValue(counterSampleMessage.CounterName, out samples)) { samples = new CounterSampleCollection(counterSampleMessage.CounterName); sampleDictionary.Add(counterSampleMessage.CounterName, samples); } samples.Add(counterSampleMessage.CounterSample); sampleCount++; } }
/// <summary> /// The <see cref="E:ExitGames.Net.Sockets.ISocketReceiver.Receive"/> callback. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The event args.</param> private void OnReceive(object sender, SocketReceiveEventArgs e) { try { DateTime receiveTime = DateTime.UtcNow; if (log.IsDebugEnabled) { log.DebugFormat("Received data from {0}.", new object[] { e.RemoteEndPoint }); } if ((OnCounterDataReceived != null) || Channel.HasSubscriptions) { using (MemoryStream input = new MemoryStream(e.Buffer, e.Offset, e.BytesReceived)) { BinaryReader binaryReader = new BinaryReader(input); binaryReader.PeekChar(); long dateData = binaryReader.ReadInt64(); DateTime senderTime = DateTime.FromBinary(dateData); int count = binaryReader.ReadInt32(); string senderId = binaryReader.ReadString(); CounterSampleCollection[] counterSamples = new CounterSampleCollection[count]; for (int i = 0; i < count; i++) { counterSamples[i] = CounterSampleCollection.Deserialize(binaryReader); } CounterSamplesPackage counterSamle = new CounterSamplesPackage(e.RemoteEndPoint, senderId, senderTime, receiveTime, counterSamples); if (OnCounterDataReceived != null) { OnCounterDataReceived(this, counterSamle); } Channel.Publish(counterSamle); } } } catch (ThreadAbortException) { throw; } catch (OutOfMemoryException) { throw; } catch (Exception exception) { if (log.IsErrorEnabled) { log.Error("Error during receive.", exception); } } }
/// <summary> /// Deserializes a stream of <see cref="T:ExitGames.Diagnostics.Counter.CounterSample"/>s. /// </summary> /// <param name="binaryReader">The reader wrapping a stream.</param> /// <returns>A new <see cref="T:ExitGames.Diagnostics.Monitoring.CounterSampleCollection"/>.</returns> public static CounterSampleCollection Deserialize(BinaryReader binaryReader) { string name = binaryReader.ReadString(); short count = binaryReader.ReadInt16(); CounterSampleCollection samples = new CounterSampleCollection(name); for (int i = 0; i < count; i++) { long dateData = binaryReader.ReadInt64(); DateTime timestamp = DateTime.FromBinary(dateData); float value = binaryReader.ReadSingle(); samples.Add(new CounterSample(timestamp, value)); } return(samples); }
/// <summary> /// Sends samples to the socket sender. /// </summary> private void Publish() { if (!socketSender.Connected) { RaiseOnDisconnetedEvent(); } if (sampleCount > 0) { if (log.IsDebugEnabled) { log.DebugFormat("Publishing counter data.", new object[0]); } CounterSampleCollection[] array = new CounterSampleCollection[sampleDictionary.Count]; sampleDictionary.Values.CopyTo(array, 0); sampleDictionary.Clear(); using (MemoryStream output = new MemoryStream()) { using (BinaryWriter binaryWriter = new BinaryWriter(output)) { for (int i = 0; i < array.Length; i += MaxQueueLength) { int num2 = array.Length - i; if (num2 > MaxQueueLength) { num2 = MaxQueueLength; } binaryWriter.Write(0xffee); binaryWriter.Write(DateTime.UtcNow.ToBinary()); binaryWriter.Write(num2); binaryWriter.Write(senderId); for (int j = i; j < (i + num2); j++) { array[j].Serialize(binaryWriter); } byte[] buffer = output.ToArray(); Add(buffer); output.Position = 0; } } } fiber.Enqueue(Send); } }