コード例 #1
0
            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;
                }
            }
コード例 #2
0
            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));
                    }
                }
            }
コード例 #3
0
            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));
                }
            }
コード例 #4
0
            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));
                }
            }
コード例 #5
0
            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);
                }
            }