diff --git a/suripu-research/pom.xml b/suripu-research/pom.xml
index 71175114f..45a761add 100644
--- a/suripu-research/pom.xml
+++ b/suripu-research/pom.xml
@@ -42,6 +42,11 @@
1.2.2
true
+
+ com.yammer.metrics
+ metrics-graphite
+ 2.2.0
+
diff --git a/suripu-research/src/main/java/com/hello/suripu/research/SuripuResearch.java b/suripu-research/src/main/java/com/hello/suripu/research/SuripuResearch.java
index 36f828f7e..11a8a72e9 100644
--- a/suripu-research/src/main/java/com/hello/suripu/research/SuripuResearch.java
+++ b/suripu-research/src/main/java/com/hello/suripu/research/SuripuResearch.java
@@ -5,10 +5,12 @@
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.kinesis.AmazonKinesisAsyncClient;
+import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableMap;
import com.hello.suripu.core.ObjectGraphRoot;
import com.hello.suripu.core.bundles.KinesisLoggerBundle;
import com.hello.suripu.core.clients.AmazonDynamoDBClientFactory;
+import com.hello.suripu.core.configuration.DynamoDBTableName;
import com.hello.suripu.core.configuration.KinesisLoggerConfiguration;
import com.hello.suripu.core.configuration.QueueName;
import com.hello.suripu.core.db.AccessTokenDAO;
@@ -18,13 +20,14 @@
import com.hello.suripu.core.db.DeviceDAO;
import com.hello.suripu.core.db.DeviceDataDAO;
import com.hello.suripu.core.db.FeatureStore;
-import com.hello.suripu.core.db.UserLabelDAO;
import com.hello.suripu.core.db.TrackerMotionDAO;
+import com.hello.suripu.core.db.UserLabelDAO;
import com.hello.suripu.core.db.util.JodaArgumentFactory;
import com.hello.suripu.core.db.util.PostgresIntegerArrayArgumentFactory;
import com.hello.suripu.core.filters.CacheFilterFactory;
import com.hello.suripu.core.logging.DataLogger;
import com.hello.suripu.core.logging.KinesisLoggerFactory;
+import com.hello.suripu.core.metrics.RegexMetricPredicate;
import com.hello.suripu.core.oauth.OAuthAuthenticator;
import com.hello.suripu.core.oauth.OAuthProvider;
import com.hello.suripu.core.oauth.stores.PersistentAccessTokenStore;
@@ -43,11 +46,15 @@
import com.yammer.dropwizard.jdbi.ImmutableSetContainerFactory;
import com.yammer.dropwizard.jdbi.OptionalContainerFactory;
import com.yammer.dropwizard.jdbi.bundles.DBIExceptionsBundle;
+import com.yammer.metrics.Metrics;
+import com.yammer.metrics.reporting.GraphiteReporter;
import org.skife.jdbi.v2.DBI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.List;
import java.util.TimeZone;
+import java.util.concurrent.TimeUnit;
/**
* Created by pangwu on 3/2/15.
@@ -104,6 +111,27 @@ public void run(final SuripuResearchConfiguration configuration, final Environme
clientConfiguration.withConnectionTimeout(200); // in ms
clientConfiguration.withMaxErrorRetry(1);
+ if(configuration.getMetricsEnabled()) {
+ final String graphiteHostName = configuration.getGraphite().getHost();
+ final String apiKey = configuration.getGraphite().getApiKey();
+ final Integer interval = configuration.getGraphite().getReportingIntervalInSeconds();
+
+ final String env = (configuration.getDebug()) ? "dev" : "prod";
+
+ final String prefix = String.format("%s.%s.%s", apiKey, env, "suripu-research");
+
+ final List metrics = configuration.getGraphite().getIncludeMetrics();
+ final RegexMetricPredicate predicate = new RegexMetricPredicate(metrics);
+ final Joiner joiner = Joiner.on(", ");
+ LOGGER.info("Logging the following metrics: {}", joiner.join(metrics));
+
+ GraphiteReporter.enable(Metrics.defaultRegistry(), interval, TimeUnit.SECONDS, graphiteHostName, 2003, prefix, predicate);
+
+ LOGGER.info("Metrics enabled.");
+ } else {
+ LOGGER.warn("Metrics not enabled.");
+ }
+
final AWSCredentialsProvider awsCredentialsProvider = new DefaultAWSCredentialsProviderChain();
final AmazonKinesisAsyncClient kinesisClient = new AmazonKinesisAsyncClient(awsCredentialsProvider, clientConfiguration);
@@ -112,7 +140,7 @@ public void run(final SuripuResearchConfiguration configuration, final Environme
final DataLogger activityLogger = kinesisLoggerFactory.get(QueueName.ACTIVITY_STREAM);
final AmazonDynamoDBClientFactory featureStoreDynamoDBClientFactory = AmazonDynamoDBClientFactory.create(awsCredentialsProvider);
- final AmazonDynamoDB featureDynamoDB = featureStoreDynamoDBClientFactory.getForEndpoint(configuration.getFeaturesDynamoDBConfiguration().getEndpoint());
+ final AmazonDynamoDB featureDynamoDB = featureStoreDynamoDBClientFactory.getInstrumented(DynamoDBTableName.FEATURES, FeatureStore.class);
final String featureNamespace = (configuration.getDebug()) ? "dev" : "prod";
final FeatureStore featureStore = new FeatureStore(featureDynamoDB, "features", featureNamespace);
diff --git a/suripu-research/src/main/java/com/hello/suripu/research/configuration/SuripuResearchConfiguration.java b/suripu-research/src/main/java/com/hello/suripu/research/configuration/SuripuResearchConfiguration.java
index 1f5af67a9..4ea755d15 100644
--- a/suripu-research/src/main/java/com/hello/suripu/research/configuration/SuripuResearchConfiguration.java
+++ b/suripu-research/src/main/java/com/hello/suripu/research/configuration/SuripuResearchConfiguration.java
@@ -2,6 +2,7 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.hello.suripu.core.configuration.DynamoDBConfiguration;
+import com.hello.suripu.core.configuration.GraphiteConfiguration;
import com.hello.suripu.core.configuration.KinesisConfiguration;
import com.hello.suripu.core.configuration.KinesisLoggerConfiguration;
import com.yammer.dropwizard.config.Configuration;
@@ -50,6 +51,25 @@ public Boolean getDebug() {
return debug;
}
+ @Valid
+ @NotNull
+ @JsonProperty("metrics_enabled")
+ private Boolean metricsEnabled;
+
+ public Boolean getMetricsEnabled() {
+ return metricsEnabled;
+ }
+
+
+ @Valid
+ @NotNull
+ @JsonProperty("graphite")
+ private GraphiteConfiguration graphite;
+
+ public GraphiteConfiguration getGraphite() {
+ return graphite;
+ }
+
@Valid
@NotNull
@JsonProperty("kinesis")
diff --git a/suripu-research/suripu-research.dev.yml.example b/suripu-research/suripu-research.dev.yml.example
index 78517f8f5..fc5e50d89 100644
--- a/suripu-research/suripu-research.dev.yml.example
+++ b/suripu-research/suripu-research.dev.yml.example
@@ -1,4 +1,13 @@
+metrics_enabled: false
debug: true
+graphite:
+ host: carbon.hostedgraphite.com
+ api_key: 7509c0ff-4db5-4cae-91ee-6e78ff13b336
+ reporting_interval_in_seconds: 30
+ include_metrics:
+ - org.skife
+ - xx-responses
+ - com.hello
sensors_db:
# the name of your JDBC driver
diff --git a/suripu-research/suripu-research.prod.yml b/suripu-research/suripu-research.prod.yml
index ffa425f63..050d01ffb 100644
--- a/suripu-research/suripu-research.prod.yml
+++ b/suripu-research/suripu-research.prod.yml
@@ -1,4 +1,13 @@
+metrics_enabled: true
debug: false
+graphite:
+ host: carbon.hostedgraphite.com
+ api_key: 7509c0ff-4db5-4cae-91ee-6e78ff13b336
+ reporting_interval_in_seconds: 30
+ include_metrics:
+ - org.skife
+ - xx-responses
+ - com.hello
sensors_db:
driverClass: org.postgresql.Driver
diff --git a/suripu-research/suripu-research.staging.yml b/suripu-research/suripu-research.staging.yml
index 7ef9753fd..6662b83d9 100644
--- a/suripu-research/suripu-research.staging.yml
+++ b/suripu-research/suripu-research.staging.yml
@@ -1,4 +1,13 @@
+metrics_enabled: false
debug: false
+graphite:
+ host: carbon.hostedgraphite.com
+ api_key: 7509c0ff-4db5-4cae-91ee-6e78ff13b336
+ reporting_interval_in_seconds: 30
+ include_metrics:
+ - org.skife
+ - xx-responses
+ - com.hello
sensors_db:
driverClass: org.postgresql.Driver