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"); }