public PerformanceCounterTracker(Logging.IBasicLogger logger, PerformanceCounterSpec pcs) { this.pcs = pcs; pcc = pcs.GetPerformanceCounterCategory(); useRawPerfCtrValue = pcs.UseRawValue; gpInfo = new MDRF.Writer.GroupPointInfo() { Name = pcs.PointName, ValueCST = ContainerStorageType.None, }; try { var categorySample = pcc.ReadCategory(); Service(logger, categorySample, true); } catch (System.Exception ex) { Logging.IMesgEmitter emitter = (logger == null ? Logging.NullEmitter : logger.Info); emitter.Emit("{0} for '{1}' generated unexpected exception: {2}", CurrentMethodName, gpInfo.Name, ex.ToString(ExceptionFormat.TypeAndMessage)); isUsable = false; } }
public void SendNextPingRequest(Logging.IBasicLogger logger) { if (ping == null) { ping = new System.Net.NetworkInformation.Ping(); ping.PingCompleted += ping_PingCompleted; } lock (mutex) { pingCompleteEventArgs = null; pingToReplyElapsedTime = TimeSpan.Zero; currentUserToken = Token.SetToNow(); try { ping.SendAsync(IPAddress, responseTimeLimitInMSec, extraData, currentUserToken); } catch (System.Exception ex) { logger.Trace.Emit("{0} (SendAsync) generated unexpected exception: {1}", CurrentMethodName, ex.ToString(ExceptionFormat.TypeAndMessage)); } } }
public SerialEchoTracker(string portPartID, string portTargetSpec, double[] binBoundariesArray, SerialEchoPerformancePartConfig config, INotifyable notifyOnDone, Logging.IBasicLogger logger) { PortTargetSpec = portTargetSpec; Config = config; NotifyOnDone = notifyOnDone; Logger = logger; h = new Histogram(binBoundariesArray); timeoutCountGPI = new MDRF.Writer.GroupPointInfo() { Name = "timeoutCount", ValueCST = ContainerStorageType.UInt64, VC = new ValueContainer(0L) }; failureCountGPI = new MDRF.Writer.GroupPointInfo() { Name = "failureCount", ValueCST = ContainerStorageType.UInt64, VC = new ValueContainer(0L) }; hGrp = new MDRFHistogramGroupSource("{0}".CheckedFormat(portPartID), h, (ulong)config.AggregateGroupsFileIndexUserRowFlagBits, extraClientNVS: new NamedValueSet() { { "SerialEcho" }, { "PortTargetSpec", PortTargetSpec } }, extraGPISet: new[] { timeoutCountGPI, failureCountGPI }); try { portConfig = new PortConfig(portPartID, portTargetSpec) { TxLineTerm = LineTerm.None, RxLineTerm = LineTerm.CR, ConnectTimeout = (2.0).FromSeconds(), WriteTimeout = (1.0).FromSeconds(), ReadTimeout = (1.0).FromSeconds(), IdleTime = (1.0).FromSeconds(), EnableAutoReconnect = true, }; port = MosaicLib.SerialIO.Factory.CreatePort(portConfig); portGetNextPacketAction = port.CreateGetNextPacketAction(); portFlushAction = port.CreateFlushAction(); portWriteAction = port.CreateWriteAction(portWriteActionParam = new WriteActionParam()); } catch (System.Exception ex) { Logger.Error.Emit("Port setup for '{0}' failed: {1}", portTargetSpec, ex.ToString(ExceptionFormat.TypeAndMessage)); } }
public void Service(Logging.IBasicLogger logger, InstanceDataCollectionCollection categorySample, bool rethrow = false) { if (!isUsable) { return; } try { InstanceDataCollection instanceDataCollection = categorySample[pcs.CounterName]; InstanceData instanceData = instanceDataCollection[pcs.InstanceName.MapNullToEmpty()]; // use empty string for counters that only have one value CounterSample counterSample = instanceData.Sample; if (!useRawPerfCtrValue) { gpInfo.VC = new ValueContainer(CounterSample.Calculate(lastCounterSample, counterSample)); } else { gpInfo.VC = new ValueContainer(counterSample.RawValue); } lastCounterSample = counterSample; logExceptionElevationHoldoffTimer.StopIfNeeded(); } catch (System.Exception ex) { bool useHighLevelMesg = (logExceptionElevationHoldoffTimer.IsTriggered || !logExceptionElevationHoldoffTimer.Started); logExceptionElevationHoldoffTimer.StartIfNeeded(); Logging.IMesgEmitter emitter = (logger == null ? Logging.NullEmitter : (useHighLevelMesg ? logger.Info : logger.Trace)); emitter.Emit("{0} for '{1}' generated exception: {2}", CurrentMethodName, gpInfo.Name, ex.ToString(ExceptionFormat.TypeAndMessage)); } }
public void Service(bool sampleTimerTriggered, Logging.IBasicLogger logger) { if (currentUserToken != null) { TimeSpan currentElapsedTime = currentUserToken.sendTimeStamp.Age; if (pingCompleteEventArgs != null) { // process ping response if (!pingCompleteEventArgs.Cancelled && pingCompleteEventArgs.Error == null && pingCompleteEventArgs.Reply != null) { switch (pingIPStatus = pingCompleteEventArgs.Reply.Status) { case System.Net.NetworkInformation.IPStatus.Success: h.Add(pingToReplyElapsedTime.TotalSeconds); break; case System.Net.NetworkInformation.IPStatus.TimedOut: timeoutCount++; timeoutCountGPI.VC = new ValueContainer(timeoutCount); break; default: failureCount++; failureCountGPI.VC = new ValueContainer(failureCount); break; } } else { pingIPStatus = System.Net.NetworkInformation.IPStatus.Unknown; failureCount++; failureCountGPI.VC = new ValueContainer(failureCount); } ReleaseToken(); } else if (currentElapsedTime >= responseWaitTimeLimit) { pingIPStatus = System.Net.NetworkInformation.IPStatus.Unknown; failureCount++; failureCountGPI.VC = new ValueContainer(failureCount); AbortCurrentPingRequest(); } if (lastPingIPStatus != pingIPStatus) { if (pingIPStatus != System.Net.NetworkInformation.IPStatus.Success) { logger.Info.Emit("Ping to '{0}' [{1}] failed: {2} after {3:f6} sec", HostNameOrAddress, IPAddress, pingIPStatus, currentElapsedTime.TotalSeconds); } lastPingIPStatus = pingIPStatus; } } if (sampleTimerTriggered && (currentUserToken == null)) { SendNextPingRequest(logger); } }