You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2015/05/27 21:35:12 UTC
[23/50] [abbrv] incubator-usergrid git commit: First cut of metrics
for SSO.
First cut of metrics for SSO.
Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/4e42353c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/4e42353c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/4e42353c
Branch: refs/heads/two-dot-o
Commit: 4e42353c334665798978d8142fb0b4813e72901b
Parents: 2e90f39
Author: Dave Johnson <dm...@apigee.com>
Authored: Tue Apr 21 16:31:50 2015 -0400
Committer: Dave Johnson <dm...@apigee.com>
Committed: Tue Apr 21 16:31:50 2015 -0400
----------------------------------------------------------------------
.../apache/usergrid/metrics/MetricsFactory.java | 30 +++++----
.../rest/management/ManagementResource.java | 64 +++++++++++++++++---
2 files changed, 71 insertions(+), 23 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/4e42353c/stack/core/src/main/java/org/apache/usergrid/metrics/MetricsFactory.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/metrics/MetricsFactory.java b/stack/core/src/main/java/org/apache/usergrid/metrics/MetricsFactory.java
index e9888e9..9b98799 100644
--- a/stack/core/src/main/java/org/apache/usergrid/metrics/MetricsFactory.java
+++ b/stack/core/src/main/java/org/apache/usergrid/metrics/MetricsFactory.java
@@ -48,25 +48,29 @@ public class MetricsFactory {
@PostConstruct
void init() {
+
registry = new MetricRegistry();
String badHost = "badhost";
- String metricsHost = properties.getProperty("usergrid.metrics.graphite.host", badHost);
- Graphite graphite = new Graphite(new InetSocketAddress(metricsHost, 2003));
- graphiteReporter = GraphiteReporter.forRegistry(registry)
- .prefixedWith("notifications")
- .convertRatesTo(TimeUnit.SECONDS)
- .convertDurationsTo(TimeUnit.MILLISECONDS)
- .filter(MetricFilter.ALL)
- .build(graphite);
- if(metricsHost!=badHost) {
- graphiteReporter.start(30, TimeUnit.SECONDS);
- }else {
- LOG.warn("MetricsService:Logger not started.");
+ String metricsHost = properties.getProperty( "usergrid.metrics.graphite.host", badHost );
+ Graphite graphite = new Graphite( new InetSocketAddress( metricsHost, 2003 ) );
+
+ graphiteReporter = GraphiteReporter.forRegistry( registry )
+ .prefixedWith( "notifications" )
+ .convertRatesTo( TimeUnit.SECONDS )
+ .convertDurationsTo( TimeUnit.MILLISECONDS )
+ .filter( MetricFilter.ALL )
+ .build( graphite );
+
+ if (metricsHost != badHost) {
+ graphiteReporter.start( 30, TimeUnit.SECONDS );
+ LOG.info("MetricsService: Reporter started.");
+ } else {
+ LOG.warn( "MetricsService: Reporter not started." );
graphiteReporter.stop();
}
hashMap = new ConcurrentHashMap<String, Metric>();
- jmxReporter = JmxReporter.forRegistry(registry).build();
+ jmxReporter = JmxReporter.forRegistry( registry ).build();
jmxReporter.start();
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/4e42353c/stack/rest/src/main/java/org/apache/usergrid/rest/management/ManagementResource.java
----------------------------------------------------------------------
diff --git a/stack/rest/src/main/java/org/apache/usergrid/rest/management/ManagementResource.java b/stack/rest/src/main/java/org/apache/usergrid/rest/management/ManagementResource.java
index 2bbcfd9..2e5f5e4 100644
--- a/stack/rest/src/main/java/org/apache/usergrid/rest/management/ManagementResource.java
+++ b/stack/rest/src/main/java/org/apache/usergrid/rest/management/ManagementResource.java
@@ -18,9 +18,7 @@ package org.apache.usergrid.rest.management;
import java.net.URLEncoder;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.UUID;
+import java.util.*;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
@@ -28,6 +26,8 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
+import com.codahale.metrics.Counter;
+import com.codahale.metrics.Timer;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
@@ -37,6 +37,7 @@ import org.apache.usergrid.exception.NotImplementedException;
import org.apache.usergrid.management.ApplicationCreator;
import org.apache.usergrid.management.OrganizationInfo;
import org.apache.usergrid.management.OrganizationOwnerInfo;
+import org.apache.usergrid.metrics.MetricsFactory;
import org.apache.usergrid.persistence.entities.User;
import org.apache.usergrid.persistence.exceptions.EntityNotFoundException;
import org.codehaus.jackson.JsonNode;
@@ -92,7 +93,9 @@ public class ManagementResource extends AbstractContextResource {
/*-
* New endpoints:
- *
+ *
+ * /management/externaltoken?ext_access_token=<token-from-central-usergrid>&ttl=<time-to-live>
+ *
* /management/organizations/<organization-name>/applications
* /management/organizations/<organization-name>/users
* /management/organizations/<organization-name>/keys
@@ -105,10 +108,18 @@ public class ManagementResource extends AbstractContextResource {
@Autowired
private ApplicationCreator applicationCreator;
- public static final String USERGRID_CENTRAL_URL = "usergrid.central.url";
+ @Autowired
+ MetricsFactory metricsFactory;
- public static final String USERGRID_SYSADMIN_LOGIN_NAME = "usergrid.sysadmin.login.name";
+ // names for metrics to be collected
+ private static final String SSO_TOKENS_REJECTED = "sso_tokens_rejected";
+ private static final String SSO_TOKENS_VALIDATED = "sso_tokens_validated";
+ private static final String SSO_CREATED_LOCAL_ADMINS = "sso_created_local_admins";
+ private static final String SSO_PROCESSING_TIME = "sso_processing_time";
+ // usergrid configuration property names needed
+ public static final String USERGRID_CENTRAL_URL = "usergrid.central.url";
+ public static final String USERGRID_SYSADMIN_LOGIN_NAME = "usergrid.sysadmin.login.name";
public static final String USERGRID_SYSADMIN_LOGIN_ALLOWED = "usergrid.sysadmin.login.allowed";
@@ -492,7 +503,7 @@ public class ManagementResource extends AbstractContextResource {
}
String extAccessToken = json.get("ext_access_token").toString();
- Object ttlObj = json.get("ttl");
+ Object ttlObj = json.get( "ttl" );
if ( ttlObj == null ) {
throw new IllegalArgumentException("ttl must be specified");
}
@@ -551,6 +562,11 @@ public class ManagementResource extends AbstractContextResource {
}
AccessInfo accessInfo = null;
+ Timer processingTimer = metricsFactory.getTimer(
+ ManagementResource.class, SSO_PROCESSING_TIME );
+
+ Timer.Context timerContext = processingTimer.time();
+
try {
// look up user via UG Central's /management/me endpoint.
@@ -573,7 +589,12 @@ public class ManagementResource extends AbstractContextResource {
String dummyPassword = RandomStringUtils.randomAlphanumeric( 40 );
JsonNode orgsNode = userNode.get( "organizations" );
- final Iterator<String> fieldNames = orgsNode.getFieldNames();
+ Iterator<String> fieldNames = orgsNode.getFieldNames();
+ if ( !fieldNames.hasNext() ) {
+ // no organizations for user exist in response from central Usergrid SSO
+ // so create user's personal organization and use username as organization name
+ fieldNames = Collections.singletonList( username ).iterator();
+ }
// create user and any organizations that user is supposed to have
@@ -593,6 +614,10 @@ public class ManagementResource extends AbstractContextResource {
userId = ownerOrgInfo.getOwner().getUuid();
userInfo = ownerOrgInfo.getOwner();
+ Counter createdAdminsCounter = metricsFactory.getCounter(
+ ManagementResource.class, SSO_CREATED_LOCAL_ADMINS );
+ createdAdminsCounter.inc();
+
} else {
// already created user, so just create an org
@@ -614,11 +639,18 @@ public class ManagementResource extends AbstractContextResource {
.withAccessToken( extAccessToken );
} catch (Exception e) {
+ timerContext.stop();
+ timerContext.close();
logger.debug("Error validating external token", e);
throw e;
}
- return Response.status( SC_OK ).type( jsonMediaType( callback ) ).entity( accessInfo ).build();
+ final Response response = Response.status( SC_OK ).type( jsonMediaType( callback ) ).entity( accessInfo ).build();
+
+ timerContext.stop();
+ timerContext.close();
+
+ return response;
}
@@ -631,6 +663,13 @@ public class ManagementResource extends AbstractContextResource {
*/
private JsonNode getMeFromUgCentral( String extAccessToken ) throws EntityNotFoundException {
+ // prepare to count tokens validated and rejected
+
+ Counter tokensRejectedCounter = metricsFactory.getCounter(
+ ManagementResource.class, SSO_TOKENS_REJECTED );
+ Counter tokensValidatedCounter = metricsFactory.getCounter(
+ ManagementResource.class, SSO_TOKENS_VALIDATED );
+
// create URL of central Usergrid's /management/me endpoint
String externalUrl = properties.getProperty( USERGRID_CENTRAL_URL ).trim();
@@ -643,18 +682,23 @@ public class ManagementResource extends AbstractContextResource {
ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put( JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
- Client client = Client.create(clientConfig);
+ Client client = Client.create( clientConfig );
+
final JsonNode accessInfoNode;
try {
accessInfoNode = client.resource( me )
.type( MediaType.APPLICATION_JSON_TYPE)
.get(JsonNode.class);
+ tokensValidatedCounter.inc();
+
} catch ( Exception e ) {
// user not found 404
+ tokensRejectedCounter.inc();
String msg = "Cannot find Admin User associated with " + extAccessToken;
throw new EntityNotFoundException( msg, e );
}
+
return accessInfoNode;
}