Merge "Adding the CacheMetric counters"

"The CacheMetric is used to return statistics on the cache.  This series adds
the definition of the CacheMetric and initilized it in the CacheSerivce.

After this series it will be possible to connect with jconsole and see that
there are 3 mbean available for key, row and counter cache statistics."
This commit is contained in:
Avi Kivity 2015-07-05 16:47:53 +03:00
commit 16368ca915
2 changed files with 115 additions and 0 deletions

View File

@ -0,0 +1,106 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* Copyright 2015 Cloudius Systems
*
* Modified by Cloudius Systems
*/
package org.apache.cassandra.metrics;
import java.util.concurrent.TimeUnit;
import com.cloudius.urchin.api.APIClient;
import com.cloudius.urchin.metrics.APIMetrics;
import com.cloudius.urchin.metrics.DefaultNameFactory;
import com.cloudius.urchin.metrics.MetricNameFactory;
import com.yammer.metrics.core.Gauge;
import com.yammer.metrics.core.Meter;
/**
* Metrics for {@code ICache}.
*/
public class CacheMetrics {
/** Cache capacity in bytes */
public final Gauge<Long> capacity;
/** Total number of cache hits */
public final Meter hits;
/** Total number of cache requests */
public final Meter requests;
/** cache hit rate */
public final Gauge<Double> hitRate;
/** Total size of cache, in bytes */
public final Gauge<Long> size;
/** Total number of cache entries */
public final Gauge<Integer> entries;
private APIClient c = new APIClient();
/**
* Create metrics for given cache.
*
* @param type
* Type of Cache to identify metrics.
* @param cache
* Cache to measure metrics
*/
public CacheMetrics(String type, String url) {
MetricNameFactory factory = new DefaultNameFactory("Cache", type);
capacity = APIMetrics.newGauge(factory.createMetricName("Capacity"),
new Gauge<Long>() {
public Long value() {
return c.getLongValue("/cache_service/metrics/" + url
+ "/capacity");
}
});
hits = APIMetrics.newMeter("/cache_service/metrics/" + url
+ "/hits", factory.createMetricName("Hits"), "hits",
TimeUnit.SECONDS);
requests = APIMetrics.newMeter("/cache_service/metrics/" + url
+ "/requests", factory.createMetricName("Requests"),
"requests", TimeUnit.SECONDS);
hitRate = APIMetrics.newGauge(factory.createMetricName("HitRate"),
new Gauge<Double>() {
@Override
public Double value() {
return c.getDoubleValue("/cache_service/metrics/" + url
+ "/hit_rate");
}
});
size = APIMetrics.newGauge(factory.createMetricName("Size"),
new Gauge<Long>() {
public Long value() {
return c.getLongValue("/cache_service/metrics/" + url
+ "/size");
}
});
entries = APIMetrics.newGauge(factory.createMetricName("Entries"),
new Gauge<Integer>() {
public Integer value() {
return c.getIntValue("/cache_service/metrics/" + url
+ "/entries");
}
});
}
// for backward compatibility
@Deprecated
public double getRecentHitRate() {
return 0;
}
}

View File

@ -26,10 +26,13 @@ package org.apache.cassandra.service;
import java.lang.management.ManagementFactory;
import java.util.concurrent.ExecutionException;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.ws.rs.core.MultivaluedMap;
import org.apache.cassandra.metrics.CacheMetrics;
import com.cloudius.urchin.api.APIClient;
import com.sun.jersey.core.util.MultivaluedMapImpl;
@ -44,6 +47,9 @@ public class CacheService implements CacheServiceMBean {
public static final String MBEAN_NAME = "org.apache.cassandra.db:type=Caches";
public final CacheMetrics keyCache;
public final CacheMetrics rowCache;
public final CacheMetrics counterCache;
public final static CacheService instance = new CacheService();
public static CacheService getInstance() {
@ -59,6 +65,9 @@ public class CacheService implements CacheServiceMBean {
throw new RuntimeException(e);
}
keyCache = new CacheMetrics("KeyCache", "key");
rowCache = new CacheMetrics("RowCache", "row");
counterCache = new CacheMetrics("CounterCache", "counter");
}
public int getRowCacheSavePeriodInSeconds() {