Beispiel #1
0
        private void Accumulate(Messages.MetricsToBeProcessed msg)
        {
            _log.Debug("This accumulator is for vmName={0}, date={1}. Process data request for vmName={2}, date={3}, time={4}, element={5}, element name={6}",
                       vmName, date, msg.vmName, msg.date, msg.time, msg.element, msg.elementName);

            // Get the list of elements accumulated for the element name
            if (!metrics.ContainsKey(msg.elementName))
            {
                // The metric is new so add it
                var newElements = new SortedDictionary <long, float>();
                newElements.Add(msg.time, msg.element);
                metrics.Add(msg.elementName, newElements);
            }
            else
            {
                // The metric exists so check if the element needs to be added or updated
                var   elements = metrics[msg.elementName];
                float element;
                if (!metrics[msg.elementName].TryGetValue(msg.time, out element))
                {
                    elements.Add(msg.time, msg.element);
                }
                else
                {
                    elements[msg.time] = msg.element;
                }
            }
        }
        private void Dispatch(Messages.MetricsToBeProcessed msg)
        {
            // Lookup the Actor to handle this request
            string    key = "MetricAccumulator:" + msg.vmName + ":" + msg.date;
            IActorRef actor;

            if (!routingTable.TryGetValue(key, out actor))
            {
                // Create the actor to store the metrics in once they have been accumulated
                actor = CreateMetricStoreActor(msg.vmName, msg.date);

                // Create the actor for the accumulator and store its reference
                actor = Context.ActorOf(Props.Create(() =>
                                                     new MetricAccumulatorActor(msg.vmName, msg.date, actor)).WithDispatcher("vmstats-default-dispatcher"), key);
                routingTable.Add(key, actor);

                // Dispatch the message
                actor.Tell(msg);
            }
            else
            {
                actor.Tell(msg);
            }

            // TODO remove, temp to find potential leak
            var count = 0;

            foreach (var child in Context.GetChildren())
            {
                count++;
            }
            _log.Info($"Actor name: { Context.Self.Path} has { count} children after dispatch");
        }