From 818258c2370c687de93edc887b32019d25c34095 Mon Sep 17 00:00:00 2001 From: Moiz Raja Date: Fri, 26 Sep 2014 10:59:17 -0700 Subject: [PATCH] BUG 2221 : Add metering to ShardTransaction actor Change-Id: I4cbf74f9e8979b996a30a019657177b92fbdfc18 Signed-off-by: Abhishek Kumar Signed-off-by: Moiz Raja --- .../AbstractUntypedActorWithMetering.java | 13 ++++++++++ .../common/actor/MeteringBehavior.java | 26 +++++++++++++++---- .../cluster/datastore/ShardTransaction.java | 5 ++-- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/common/actor/AbstractUntypedActorWithMetering.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/common/actor/AbstractUntypedActorWithMetering.java index 5497f93c43..04d9a43c2d 100644 --- a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/common/actor/AbstractUntypedActorWithMetering.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/common/actor/AbstractUntypedActorWithMetering.java @@ -12,13 +12,26 @@ package org.opendaylight.controller.cluster.common.actor; */ public abstract class AbstractUntypedActorWithMetering extends AbstractUntypedActor { + //this is used in the metric name. Some transient actors do not have defined names + private String actorNameOverride; + public AbstractUntypedActorWithMetering() { if (isMetricsCaptureEnabled()) getContext().become(new MeteringBehavior(this)); } + public AbstractUntypedActorWithMetering(String actorNameOverride){ + this.actorNameOverride = actorNameOverride; + if (isMetricsCaptureEnabled()) + getContext().become(new MeteringBehavior(this)); + } + private boolean isMetricsCaptureEnabled(){ CommonConfig config = new CommonConfig(getContext().system().settings().config()); return config.isMetricCaptureEnabled(); } + + public String getActorNameOverride() { + return actorNameOverride; + } } diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/common/actor/MeteringBehavior.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/common/actor/MeteringBehavior.java index d67d413d09..9ff185a61e 100644 --- a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/common/actor/MeteringBehavior.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/common/actor/MeteringBehavior.java @@ -32,19 +32,35 @@ public class MeteringBehavior implements Procedure { private final MetricRegistry METRICREGISTRY = MetricsReporter.getInstance().getMetricsRegistry(); private final String MSG_PROCESSING_RATE = "msg-rate"; - private String actorName; + private String actorQualifiedName; private Timer msgProcessingTimer; /** * * @param actor whose behaviour needs to be metered */ - public MeteringBehavior(UntypedActor actor){ + public MeteringBehavior(AbstractUntypedActorWithMetering actor){ Preconditions.checkArgument(actor != null, "actor must not be null"); + this.meteredActor = actor; + String actorName = actor.getActorNameOverride() != null ? actor.getActorNameOverride() + : actor.getSelf().path().name(); + init(actorName); + } + + public MeteringBehavior(UntypedActor actor){ + Preconditions.checkArgument(actor != null, "actor must not be null"); this.meteredActor = actor; - actorName = meteredActor.getSelf().path().toStringWithoutAddress(); - final String msgProcessingTime = MetricRegistry.name(actorName, MSG_PROCESSING_RATE); + + String actorName = actor.getSelf().path().name(); + init(actorName); + } + + private void init(String actorName){ + actorQualifiedName = new StringBuilder(meteredActor.getSelf().path().parent().toStringWithoutAddress()). + append("/").append(actorName).toString(); + + final String msgProcessingTime = MetricRegistry.name(actorQualifiedName, MSG_PROCESSING_RATE); msgProcessingTimer = METRICREGISTRY.timer(msgProcessingTime); } @@ -69,7 +85,7 @@ public class MeteringBehavior implements Procedure { final String messageType = message.getClass().getSimpleName(); final String msgProcessingTimeByMsgType = - MetricRegistry.name(actorName, MSG_PROCESSING_RATE, messageType); + MetricRegistry.name(actorQualifiedName, MSG_PROCESSING_RATE, messageType); final Timer msgProcessingTimerByMsgType = METRICREGISTRY.timer(msgProcessingTimeByMsgType); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransaction.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransaction.java index edaf935678..bb676e3757 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransaction.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardTransaction.java @@ -15,7 +15,7 @@ import akka.actor.ReceiveTimeout; import akka.japi.Creator; import com.google.common.base.Optional; import com.google.common.util.concurrent.CheckedFuture; -import org.opendaylight.controller.cluster.common.actor.AbstractUntypedActor; +import org.opendaylight.controller.cluster.common.actor.AbstractUntypedActorWithMetering; import org.opendaylight.controller.cluster.datastore.exceptions.UnknownMessageException; import org.opendaylight.controller.cluster.datastore.jmx.mbeans.shard.ShardStats; import org.opendaylight.controller.cluster.datastore.messages.CloseTransaction; @@ -55,7 +55,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext; *
  • {@link org.opendaylight.controller.cluster.datastore.messages.CloseTransaction} *

    */ -public abstract class ShardTransaction extends AbstractUntypedActor { +public abstract class ShardTransaction extends AbstractUntypedActorWithMetering { private final ActorRef shardActor; private final SchemaContext schemaContext; @@ -64,6 +64,7 @@ public abstract class ShardTransaction extends AbstractUntypedActor { protected ShardTransaction(ActorRef shardActor, SchemaContext schemaContext, ShardStats shardStats, String transactionID) { + super("shard-tx"); //actor name override used for metering. This does not change the "real" actor name this.shardActor = shardActor; this.schemaContext = schemaContext; this.shardStats = shardStats; -- 2.36.6