Commit 10e82ff4 by Madhan Neethiraj

ATLAS-1471: updated logging for better troubleshooting and reduce overhead

parent 34d235f3
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
package org.apache.atlas.repository.graph; package org.apache.atlas.repository.graph;
import org.apache.atlas.AtlasException; import org.apache.atlas.AtlasException;
import org.apache.atlas.aspect.Monitored;
import org.apache.atlas.repository.graphdb.AtlasVertex; import org.apache.atlas.repository.graphdb.AtlasVertex;
import org.apache.atlas.typesystem.ITypedInstance; import org.apache.atlas.typesystem.ITypedInstance;
import org.apache.atlas.typesystem.ITypedReferenceableInstance; import org.apache.atlas.typesystem.ITypedReferenceableInstance;
...@@ -50,7 +49,6 @@ public class FullTextMapper { ...@@ -50,7 +49,6 @@ public class FullTextMapper {
instanceCache = new HashMap<>(); instanceCache = new HashMap<>();
} }
@Monitored
public String mapRecursive(AtlasVertex instanceVertex, boolean followReferences) throws AtlasException { public String mapRecursive(AtlasVertex instanceVertex, boolean followReferences) throws AtlasException {
String guid = GraphHelper.getGuid(instanceVertex); String guid = GraphHelper.getGuid(instanceVertex);
ITypedReferenceableInstance typedReference; ITypedReferenceableInstance typedReference;
......
...@@ -19,7 +19,6 @@ package org.apache.atlas.repository.graph; ...@@ -19,7 +19,6 @@ package org.apache.atlas.repository.graph;
import com.google.inject.Singleton; import com.google.inject.Singleton;
import org.apache.atlas.AtlasException; import org.apache.atlas.AtlasException;
import org.apache.atlas.aspect.Monitored;
import org.apache.atlas.repository.Constants; import org.apache.atlas.repository.Constants;
import org.apache.atlas.repository.graphdb.AtlasEdge; import org.apache.atlas.repository.graphdb.AtlasEdge;
import org.apache.atlas.repository.graphdb.AtlasEdgeDirection; import org.apache.atlas.repository.graphdb.AtlasEdgeDirection;
...@@ -66,7 +65,6 @@ public final class GraphToTypedInstanceMapper { ...@@ -66,7 +65,6 @@ public final class GraphToTypedInstanceMapper {
this.graph = graph; this.graph = graph;
} }
@Monitored
public ITypedReferenceableInstance mapGraphToTypedInstance(String guid, AtlasVertex instanceVertex) public ITypedReferenceableInstance mapGraphToTypedInstance(String guid, AtlasVertex instanceVertex)
throws AtlasException { throws AtlasException {
...@@ -104,7 +102,6 @@ public final class GraphToTypedInstanceMapper { ...@@ -104,7 +102,6 @@ public final class GraphToTypedInstanceMapper {
return typedInstance; return typedInstance;
} }
@Monitored
private void mapVertexToInstanceTraits(AtlasVertex instanceVertex, ITypedReferenceableInstance typedInstance, private void mapVertexToInstanceTraits(AtlasVertex instanceVertex, ITypedReferenceableInstance typedInstance,
List<String> traits) throws AtlasException { List<String> traits) throws AtlasException {
for (String traitName : traits) { for (String traitName : traits) {
...@@ -117,7 +114,6 @@ public final class GraphToTypedInstanceMapper { ...@@ -117,7 +114,6 @@ public final class GraphToTypedInstanceMapper {
} }
} }
@Monitored
public void mapVertexToInstance(AtlasVertex instanceVertex, ITypedInstance typedInstance, public void mapVertexToInstance(AtlasVertex instanceVertex, ITypedInstance typedInstance,
Map<String, AttributeInfo> fields) throws AtlasException { Map<String, AttributeInfo> fields) throws AtlasException {
......
...@@ -20,7 +20,6 @@ package org.apache.atlas.repository.graph; ...@@ -20,7 +20,6 @@ package org.apache.atlas.repository.graph;
import com.google.inject.Inject; import com.google.inject.Inject;
import org.apache.atlas.AtlasException; import org.apache.atlas.AtlasException;
import org.apache.atlas.RequestContext; import org.apache.atlas.RequestContext;
import org.apache.atlas.aspect.Monitored;
import org.apache.atlas.repository.Constants; import org.apache.atlas.repository.Constants;
import org.apache.atlas.repository.RepositoryException; import org.apache.atlas.repository.RepositoryException;
import org.apache.atlas.repository.graphdb.AtlasEdge; import org.apache.atlas.repository.graphdb.AtlasEdge;
...@@ -85,7 +84,6 @@ public final class TypedInstanceToGraphMapper { ...@@ -85,7 +84,6 @@ public final class TypedInstanceToGraphMapper {
UPDATE_FULL UPDATE_FULL
} }
@Monitored
void mapTypedInstanceToGraph(Operation operation, ITypedReferenceableInstance... typedInstances) void mapTypedInstanceToGraph(Operation operation, ITypedReferenceableInstance... typedInstances)
throws AtlasException { throws AtlasException {
RequestContext requestContext = RequestContext.get(); RequestContext requestContext = RequestContext.get();
...@@ -156,7 +154,6 @@ public final class TypedInstanceToGraphMapper { ...@@ -156,7 +154,6 @@ public final class TypedInstanceToGraphMapper {
return guids; return guids;
} }
@Monitored
private String addOrUpdateAttributesAndTraits(Operation operation, ITypedReferenceableInstance typedInstance) private String addOrUpdateAttributesAndTraits(Operation operation, ITypedReferenceableInstance typedInstance)
throws AtlasException { throws AtlasException {
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
...@@ -254,7 +251,6 @@ public final class TypedInstanceToGraphMapper { ...@@ -254,7 +251,6 @@ public final class TypedInstanceToGraphMapper {
} }
} }
@Monitored
private TypeUtils.Pair<List<ITypedReferenceableInstance>, List<ITypedReferenceableInstance>> createVerticesAndDiscoverInstances( private TypeUtils.Pair<List<ITypedReferenceableInstance>, List<ITypedReferenceableInstance>> createVerticesAndDiscoverInstances(
Collection<IReferenceableInstance> instances) throws AtlasException { Collection<IReferenceableInstance> instances) throws AtlasException {
......
/**
* 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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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.
*/
package org.apache.atlas;
import org.apache.atlas.aspect.Monitored;
import org.apache.atlas.metrics.Metrics;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
public class MonitoredAspectTest {
@Monitored
public void monitoredMethod() throws InterruptedException {
Thread.sleep(1);
}
@Test
public void testMonitoredAspect() throws Exception {
RequestContext.clear();
monitoredMethod();
Metrics metrics = RequestContext.getMetrics();
Metrics.Counters counters = metrics.getCounters("MonitoredAspectTest.monitoredMethod");
assertNotNull(counters);
assertEquals(counters.getInvocations(), 1);
assertTrue(counters.getTotalTimeMSecs() > 0);
}
}
...@@ -41,6 +41,22 @@ ...@@ -41,6 +41,22 @@
<appender-ref ref="console"/> <appender-ref ref="console"/>
</logger> </logger>
<!-- uncomment this block to generate performance traces
<appender name="perf_appender" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="${atlas.log.dir}/atlas_perf.log" />
<param name="datePattern" value="'.'yyyy-MM-dd" />
<param name="append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d|%t|%m%n" />
</layout>
</appender>
<logger name="org.apache.atlas.perf" additivity="false">
<level value="debug" />
<appender-ref ref="perf_appender" />
</logger>
-->
<appender name="FAILED" class="org.apache.log4j.DailyRollingFileAppender"> <appender name="FAILED" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${atlas.log.dir}/failed.log"/> <param name="File" value="${atlas.log.dir}/failed.log"/>
<param name="Append" value="true"/> <param name="Append" value="true"/>
......
...@@ -20,8 +20,6 @@ package org.apache.atlas.web.resources; ...@@ -20,8 +20,6 @@ package org.apache.atlas.web.resources;
import com.google.inject.Inject; import com.google.inject.Inject;
import org.apache.atlas.AtlasClient; import org.apache.atlas.AtlasClient;
import org.apache.atlas.aspect.Monitored;
import org.apache.atlas.utils.AtlasPerfTracer;
import org.apache.atlas.web.filters.AtlasCSRFPreventionFilter; import org.apache.atlas.web.filters.AtlasCSRFPreventionFilter;
import org.apache.atlas.web.service.ServiceState; import org.apache.atlas.web.service.ServiceState;
import org.apache.atlas.web.util.Servlets; import org.apache.atlas.web.util.Servlets;
...@@ -31,6 +29,7 @@ import org.apache.commons.lang.StringUtils; ...@@ -31,6 +29,7 @@ import org.apache.commons.lang.StringUtils;
import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject; import org.codehaus.jettison.json.JSONObject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
...@@ -52,7 +51,7 @@ import java.util.Set; ...@@ -52,7 +51,7 @@ import java.util.Set;
@Path("admin") @Path("admin")
@Singleton @Singleton
public class AdminResource { public class AdminResource {
private static final Logger PERF_LOG = AtlasPerfTracer.getPerfLogger("rest.AdminResource"); private static final Logger LOG = LoggerFactory.getLogger(AdminResource.class);
private static final String isCSRF_ENABLED = "atlas.rest-csrf.enabled"; private static final String isCSRF_ENABLED = "atlas.rest-csrf.enabled";
private static final String BROWSER_USER_AGENT_PARAM = "atlas.rest-csrf.browser-useragents-regex"; private static final String BROWSER_USER_AGENT_PARAM = "atlas.rest-csrf.browser-useragents-regex";
...@@ -73,11 +72,14 @@ public class AdminResource { ...@@ -73,11 +72,14 @@ public class AdminResource {
* *
* @return json representing the thread stack dump. * @return json representing the thread stack dump.
*/ */
@Monitored
@GET @GET
@Path("stack") @Path("stack")
@Produces(MediaType.TEXT_PLAIN) @Produces(MediaType.TEXT_PLAIN)
public String getThreadDump() { public String getThreadDump() {
if (LOG.isDebugEnabled()) {
LOG.debug("==> AdminResource.getThreadDump()");
}
ThreadGroup topThreadGroup = Thread.currentThread().getThreadGroup(); ThreadGroup topThreadGroup = Thread.currentThread().getThreadGroup();
while (topThreadGroup.getParent() != null) { while (topThreadGroup.getParent() != null) {
...@@ -93,6 +95,11 @@ public class AdminResource { ...@@ -93,6 +95,11 @@ public class AdminResource {
String stackTrace = StringUtils.join(threads[i].getStackTrace(), "\n"); String stackTrace = StringUtils.join(threads[i].getStackTrace(), "\n");
builder.append(stackTrace); builder.append(stackTrace);
} }
if (LOG.isDebugEnabled()) {
LOG.debug("<== AdminResource.getThreadDump()");
}
return builder.toString(); return builder.toString();
} }
...@@ -101,11 +108,14 @@ public class AdminResource { ...@@ -101,11 +108,14 @@ public class AdminResource {
* *
* @return json representing the version. * @return json representing the version.
*/ */
@Monitored
@GET @GET
@Path("version") @Path("version")
@Produces(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE)
public Response getVersion() { public Response getVersion() {
if (LOG.isDebugEnabled()) {
LOG.debug("==> AdminResource.getVersion()");
}
if (version == null) { if (version == null) {
try { try {
PropertiesConfiguration configProperties = new PropertiesConfiguration("atlas-buildinfo.properties"); PropertiesConfiguration configProperties = new PropertiesConfiguration("atlas-buildinfo.properties");
...@@ -124,34 +134,51 @@ public class AdminResource { ...@@ -124,34 +134,51 @@ public class AdminResource {
} }
} }
if (LOG.isDebugEnabled()) {
LOG.debug("<== AdminResource.getVersion()");
}
return version; return version;
} }
@Monitored
@GET @GET
@Path("status") @Path("status")
@Produces(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE)
public Response getStatus() { public Response getStatus() {
JSONObject responseData = new JSONObject(); if (LOG.isDebugEnabled()) {
LOG.debug("==> AdminResource.getStatus()");
}
Response response;
try { try {
JSONObject responseData = new JSONObject();
responseData.put(AtlasClient.STATUS, serviceState.getState().toString()); responseData.put(AtlasClient.STATUS, serviceState.getState().toString());
Response response = Response.ok(responseData).build(); response = Response.ok(responseData).build();
return response;
} catch (JSONException e) { } catch (JSONException e) {
throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR)); throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR));
} }
if (LOG.isDebugEnabled()) {
LOG.debug("<== AdminResource.getStatus()");
}
return response;
} }
@Monitored
@GET @GET
@Path("session") @Path("session")
@Produces(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE)
public Response getUserProfile() { public Response getUserProfile() {
JSONObject responseData = new JSONObject(); if (LOG.isDebugEnabled()) {
Boolean enableTaxonomy = null; LOG.debug("==> AdminResource.getUserProfile()");
}
Response response;
try { try {
PropertiesConfiguration configProperties = new PropertiesConfiguration("atlas-application.properties"); PropertiesConfiguration configProperties = new PropertiesConfiguration("atlas-application.properties");
enableTaxonomy = configProperties.getBoolean(isTaxonomyEnabled, false); Boolean enableTaxonomy = configProperties.getBoolean(isTaxonomyEnabled, false);
Authentication auth = SecurityContextHolder.getContext().getAuthentication(); Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String userName = null; String userName = null;
Set<String> groups = new HashSet<>(); Set<String> groups = new HashSet<>();
...@@ -163,18 +190,25 @@ public class AdminResource { ...@@ -163,18 +190,25 @@ public class AdminResource {
} }
} }
JSONObject responseData = new JSONObject();
responseData.put(isCSRF_ENABLED, AtlasCSRFPreventionFilter.isCSRF_ENABLED); responseData.put(isCSRF_ENABLED, AtlasCSRFPreventionFilter.isCSRF_ENABLED);
responseData.put(BROWSER_USER_AGENT_PARAM, AtlasCSRFPreventionFilter.BROWSER_USER_AGENTS_DEFAULT); responseData.put(BROWSER_USER_AGENT_PARAM, AtlasCSRFPreventionFilter.BROWSER_USER_AGENTS_DEFAULT);
responseData.put(CUSTOM_METHODS_TO_IGNORE_PARAM, AtlasCSRFPreventionFilter.METHODS_TO_IGNORE_DEFAULT); responseData.put(CUSTOM_METHODS_TO_IGNORE_PARAM, AtlasCSRFPreventionFilter.METHODS_TO_IGNORE_DEFAULT);
responseData.put(CUSTOM_HEADER_PARAM, AtlasCSRFPreventionFilter.HEADER_DEFAULT); responseData.put(CUSTOM_HEADER_PARAM, AtlasCSRFPreventionFilter.HEADER_DEFAULT);
responseData.put(isTaxonomyEnabled, enableTaxonomy); responseData.put(isTaxonomyEnabled, enableTaxonomy);
responseData.put("userName", userName); responseData.put("userName", userName);
responseData.put("groups", groups); responseData.put("groups", groups);
return Response.ok(responseData).build();
response = Response.ok(responseData).build();
} catch (JSONException | ConfigurationException e) { } catch (JSONException | ConfigurationException e) {
throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR)); throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR));
} }
if (LOG.isDebugEnabled()) {
LOG.debug("<== AdminResource.getUserProfile()");
}
return response;
} }
} }
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
package org.apache.atlas.web.resources; package org.apache.atlas.web.resources;
import org.apache.atlas.AtlasClient; import org.apache.atlas.AtlasClient;
import org.apache.atlas.aspect.Monitored;
import org.apache.atlas.discovery.DiscoveryException; import org.apache.atlas.discovery.DiscoveryException;
import org.apache.atlas.discovery.LineageService; import org.apache.atlas.discovery.LineageService;
import org.apache.atlas.typesystem.exception.EntityNotFoundException; import org.apache.atlas.typesystem.exception.EntityNotFoundException;
...@@ -69,15 +68,22 @@ public class DataSetLineageResource { ...@@ -69,15 +68,22 @@ public class DataSetLineageResource {
* *
* @param tableName table name * @param tableName table name
*/ */
@Monitored
@GET @GET
@Path("table/{tableName}/inputs/graph") @Path("table/{tableName}/inputs/graph")
@Consumes(Servlets.JSON_MEDIA_TYPE) @Consumes(Servlets.JSON_MEDIA_TYPE)
@Produces(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE)
public Response inputsGraph(@Context HttpServletRequest request, @PathParam("tableName") String tableName) { public Response inputsGraph(@Context HttpServletRequest request, @PathParam("tableName") String tableName) {
LOG.info("Fetching lineage inputs graph for tableName={}", tableName); if (LOG.isDebugEnabled()) {
LOG.debug("==> DataSetLineageResource.inputsGraph({})", tableName);
}
AtlasPerfTracer perf = null;
try { try {
if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "DataSetLineageResource.inputsGraph(tableName=" + tableName + ")");
}
final String jsonResult = lineageService.getInputsGraph(tableName); final String jsonResult = lineageService.getInputsGraph(tableName);
JSONObject response = new JSONObject(); JSONObject response = new JSONObject();
...@@ -95,6 +101,8 @@ public class DataSetLineageResource { ...@@ -95,6 +101,8 @@ public class DataSetLineageResource {
} catch (Throwable e) { } catch (Throwable e) {
LOG.error("Unable to get lineage inputs graph for table {}", tableName, e); LOG.error("Unable to get lineage inputs graph for table {}", tableName, e);
throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR)); throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR));
} finally {
AtlasPerfTracer.log(perf);
} }
} }
...@@ -103,15 +111,22 @@ public class DataSetLineageResource { ...@@ -103,15 +111,22 @@ public class DataSetLineageResource {
* *
* @param tableName table name * @param tableName table name
*/ */
@Monitored
@GET @GET
@Path("table/{tableName}/outputs/graph") @Path("table/{tableName}/outputs/graph")
@Consumes(Servlets.JSON_MEDIA_TYPE) @Consumes(Servlets.JSON_MEDIA_TYPE)
@Produces(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE)
public Response outputsGraph(@Context HttpServletRequest request, @PathParam("tableName") String tableName) { public Response outputsGraph(@Context HttpServletRequest request, @PathParam("tableName") String tableName) {
LOG.info("Fetching lineage outputs graph for tableName={}", tableName); if (LOG.isDebugEnabled()) {
LOG.debug("==> DataSetLineageResource.outputsGraph({})", tableName);
}
AtlasPerfTracer perf = null;
try { try {
if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "DataSetLineageResource.outputsGraph(tableName=" + tableName + ")");
}
final String jsonResult = lineageService.getOutputsGraph(tableName); final String jsonResult = lineageService.getOutputsGraph(tableName);
JSONObject response = new JSONObject(); JSONObject response = new JSONObject();
...@@ -129,6 +144,8 @@ public class DataSetLineageResource { ...@@ -129,6 +144,8 @@ public class DataSetLineageResource {
} catch (Throwable e) { } catch (Throwable e) {
LOG.error("Unable to get lineage outputs graph for table {}", tableName, e); LOG.error("Unable to get lineage outputs graph for table {}", tableName, e);
throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR)); throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR));
} finally {
AtlasPerfTracer.log(perf);
} }
} }
...@@ -137,15 +154,22 @@ public class DataSetLineageResource { ...@@ -137,15 +154,22 @@ public class DataSetLineageResource {
* *
* @param tableName table name * @param tableName table name
*/ */
@Monitored
@GET @GET
@Path("table/{tableName}/schema") @Path("table/{tableName}/schema")
@Consumes(Servlets.JSON_MEDIA_TYPE) @Consumes(Servlets.JSON_MEDIA_TYPE)
@Produces(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE)
public Response schema(@Context HttpServletRequest request, @PathParam("tableName") String tableName) { public Response schema(@Context HttpServletRequest request, @PathParam("tableName") String tableName) {
LOG.info("Fetching schema for tableName={}", tableName); if (LOG.isDebugEnabled()) {
LOG.debug("==> DataSetLineageResource.schema({})", tableName);
}
AtlasPerfTracer perf = null;
try { try {
if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "DataSetLineageResource.schema(tableName=" + tableName + ")");
}
final String jsonResult = lineageService.getSchema(tableName); final String jsonResult = lineageService.getSchema(tableName);
JSONObject response = new JSONObject(); JSONObject response = new JSONObject();
...@@ -163,6 +187,8 @@ public class DataSetLineageResource { ...@@ -163,6 +187,8 @@ public class DataSetLineageResource {
} catch (Throwable e) { } catch (Throwable e) {
LOG.error("Unable to get schema for table {}", tableName, e); LOG.error("Unable to get schema for table {}", tableName, e);
throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR)); throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR));
} finally {
AtlasPerfTracer.log(perf);
} }
} }
} }
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
package org.apache.atlas.web.resources; package org.apache.atlas.web.resources;
import org.apache.atlas.AtlasClient; import org.apache.atlas.AtlasClient;
import org.apache.atlas.aspect.Monitored;
import org.apache.atlas.discovery.AtlasLineageService; import org.apache.atlas.discovery.AtlasLineageService;
import org.apache.atlas.discovery.DiscoveryException; import org.apache.atlas.discovery.DiscoveryException;
import org.apache.atlas.discovery.LineageService; import org.apache.atlas.discovery.LineageService;
...@@ -29,6 +28,7 @@ import org.apache.atlas.model.lineage.AtlasLineageInfo.LineageDirection; ...@@ -29,6 +28,7 @@ import org.apache.atlas.model.lineage.AtlasLineageInfo.LineageDirection;
import org.apache.atlas.type.AtlasTypeRegistry; import org.apache.atlas.type.AtlasTypeRegistry;
import org.apache.atlas.typesystem.exception.EntityNotFoundException; import org.apache.atlas.typesystem.exception.EntityNotFoundException;
import org.apache.atlas.typesystem.exception.SchemaNotFoundException; import org.apache.atlas.typesystem.exception.SchemaNotFoundException;
import org.apache.atlas.utils.AtlasPerfTracer;
import org.apache.atlas.web.util.LineageUtils; import org.apache.atlas.web.util.LineageUtils;
import org.apache.atlas.web.util.Servlets; import org.apache.atlas.web.util.Servlets;
import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONException;
...@@ -50,6 +50,7 @@ import javax.ws.rs.core.Response; ...@@ -50,6 +50,7 @@ import javax.ws.rs.core.Response;
@Singleton @Singleton
public class LineageResource { public class LineageResource {
private static final Logger LOG = LoggerFactory.getLogger(DataSetLineageResource.class); private static final Logger LOG = LoggerFactory.getLogger(DataSetLineageResource.class);
private static final Logger PERF_LOG = AtlasPerfTracer.getPerfLogger("rest.LineageResource");
private final AtlasLineageService atlasLineageService; private final AtlasLineageService atlasLineageService;
private final LineageService lineageService; private final LineageService lineageService;
...@@ -73,15 +74,21 @@ public class LineageResource { ...@@ -73,15 +74,21 @@ public class LineageResource {
* @param guid dataset entity id * @param guid dataset entity id
* @return * @return
*/ */
@Monitored
@GET @GET
@Path("{guid}/inputs/graph") @Path("{guid}/inputs/graph")
@Consumes(Servlets.JSON_MEDIA_TYPE) @Consumes(Servlets.JSON_MEDIA_TYPE)
@Produces(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE)
public Response inputsGraph(@PathParam("guid") String guid) { public Response inputsGraph(@PathParam("guid") String guid) {
LOG.info("Fetching lineage inputs graph for guid={}", guid); if (LOG.isDebugEnabled()) {
LOG.debug("==> LineageResource.inputsGraph({})", guid);
}
AtlasPerfTracer perf = null;
try { try {
if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "LineageResource.inputsGraph(" + guid + ")");
}
AtlasLineageInfo lineageInfo = atlasLineageService.getAtlasLineageInfo(guid, LineageDirection.INPUT, -1); AtlasLineageInfo lineageInfo = atlasLineageService.getAtlasLineageInfo(guid, LineageDirection.INPUT, -1);
final String result = LineageUtils.toLineageStruct(lineageInfo, typeRegistry); final String result = LineageUtils.toLineageStruct(lineageInfo, typeRegistry);
...@@ -96,6 +103,12 @@ public class LineageResource { ...@@ -96,6 +103,12 @@ public class LineageResource {
} catch (JSONException e) { } catch (JSONException e) {
LOG.error("Unable to get lineage inputs graph for entity guid={}", guid, e); LOG.error("Unable to get lineage inputs graph for entity guid={}", guid, e);
throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR)); throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR));
} finally {
AtlasPerfTracer.log(perf);
if (LOG.isDebugEnabled()) {
LOG.debug("<== LineageResource.inputsGraph({})", guid);
}
} }
} }
...@@ -104,15 +117,22 @@ public class LineageResource { ...@@ -104,15 +117,22 @@ public class LineageResource {
* *
* @param guid dataset entity id * @param guid dataset entity id
*/ */
@Monitored
@GET @GET
@Path("{guid}/outputs/graph") @Path("{guid}/outputs/graph")
@Consumes(Servlets.JSON_MEDIA_TYPE) @Consumes(Servlets.JSON_MEDIA_TYPE)
@Produces(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE)
public Response outputsGraph(@PathParam("guid") String guid) { public Response outputsGraph(@PathParam("guid") String guid) {
LOG.info("Fetching lineage outputs graph for entity guid={}", guid); if (LOG.isDebugEnabled()) {
LOG.debug("==> LineageResource.outputsGraph({})", guid);
}
AtlasPerfTracer perf = null;
try { try {
if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "LineageResource.outputsGraph(" + guid + ")");
}
AtlasLineageInfo lineageInfo = atlasLineageService.getAtlasLineageInfo(guid, LineageDirection.OUTPUT, -1); AtlasLineageInfo lineageInfo = atlasLineageService.getAtlasLineageInfo(guid, LineageDirection.OUTPUT, -1);
final String result = LineageUtils.toLineageStruct(lineageInfo, typeRegistry); final String result = LineageUtils.toLineageStruct(lineageInfo, typeRegistry);
...@@ -127,6 +147,12 @@ public class LineageResource { ...@@ -127,6 +147,12 @@ public class LineageResource {
} catch (JSONException e) { } catch (JSONException e) {
LOG.error("Unable to get lineage outputs graph for entity guid={}", guid, e); LOG.error("Unable to get lineage outputs graph for entity guid={}", guid, e);
throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR)); throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR));
} finally {
AtlasPerfTracer.log(perf);
if (LOG.isDebugEnabled()) {
LOG.debug("<== LineageResource.outputsGraph({})", guid);
}
} }
} }
...@@ -135,15 +161,21 @@ public class LineageResource { ...@@ -135,15 +161,21 @@ public class LineageResource {
* *
* @param guid dataset entity id * @param guid dataset entity id
*/ */
@Monitored
@GET @GET
@Path("{guid}/schema") @Path("{guid}/schema")
@Consumes(Servlets.JSON_MEDIA_TYPE) @Consumes(Servlets.JSON_MEDIA_TYPE)
@Produces(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE)
public Response schema(@PathParam("guid") String guid) { public Response schema(@PathParam("guid") String guid) {
LOG.info("Fetching schema for entity guid={}", guid); if (LOG.isDebugEnabled()) {
LOG.debug("==> LineageResource.schema({})", guid);
}
AtlasPerfTracer perf = null;
try { try {
if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "LineageResource.schema(" + guid + ")");
}
final String jsonResult = lineageService.getSchemaForEntity(guid); final String jsonResult = lineageService.getSchemaForEntity(guid);
JSONObject response = new JSONObject(); JSONObject response = new JSONObject();
...@@ -163,6 +195,12 @@ public class LineageResource { ...@@ -163,6 +195,12 @@ public class LineageResource {
} catch (Throwable e) { } catch (Throwable e) {
LOG.error("Unable to get schema for entity={}", guid, e); LOG.error("Unable to get schema for entity={}", guid, e);
throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR)); throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR));
} finally {
AtlasPerfTracer.log(perf);
if (LOG.isDebugEnabled()) {
LOG.debug("<== LineageResource.schema({})", guid);
}
} }
} }
} }
...@@ -21,7 +21,6 @@ package org.apache.atlas.web.resources; ...@@ -21,7 +21,6 @@ package org.apache.atlas.web.resources;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import org.apache.atlas.AtlasClient; import org.apache.atlas.AtlasClient;
import org.apache.atlas.AtlasConfiguration; import org.apache.atlas.AtlasConfiguration;
import org.apache.atlas.aspect.Monitored;
import org.apache.atlas.classification.InterfaceAudience; import org.apache.atlas.classification.InterfaceAudience;
import org.apache.atlas.discovery.DiscoveryException; import org.apache.atlas.discovery.DiscoveryException;
import org.apache.atlas.discovery.DiscoveryService; import org.apache.atlas.discovery.DiscoveryService;
...@@ -83,7 +82,6 @@ public class MetadataDiscoveryResource { ...@@ -83,7 +82,6 @@ public class MetadataDiscoveryResource {
* @param offset offset to the results returned, used for pagination. offset >= 0. -1 maps to offset 0 * @param offset offset to the results returned, used for pagination. offset >= 0. -1 maps to offset 0
* @return JSON representing the type and results. * @return JSON representing the type and results.
*/ */
@Monitored
@GET @GET
@Path("search") @Path("search")
@Consumes(Servlets.JSON_MEDIA_TYPE) @Consumes(Servlets.JSON_MEDIA_TYPE)
...@@ -99,13 +97,17 @@ public class MetadataDiscoveryResource { ...@@ -99,13 +97,17 @@ public class MetadataDiscoveryResource {
dslQueryFailed = true; dslQueryFailed = true;
} }
} catch (Exception e) { } catch (Exception e) {
if (LOG.isDebugEnabled()) {
LOG.debug("Error while running DSL. Switching to fulltext for query {}", query, e); LOG.debug("Error while running DSL. Switching to fulltext for query {}", query, e);
}
dslQueryFailed = true; dslQueryFailed = true;
} }
if ( dslQueryFailed ) { if ( dslQueryFailed ) {
response = searchUsingFullText(query, limit, offset); response = searchUsingFullText(query, limit, offset);
} }
return response; return response;
} }
...@@ -121,7 +123,6 @@ public class MetadataDiscoveryResource { ...@@ -121,7 +123,6 @@ public class MetadataDiscoveryResource {
* *
* @return JSON representing the type and results. * @return JSON representing the type and results.
*/ */
@Monitored
@GET @GET
@Path("search/dsl") @Path("search/dsl")
@Consumes(Servlets.JSON_MEDIA_TYPE) @Consumes(Servlets.JSON_MEDIA_TYPE)
...@@ -129,7 +130,16 @@ public class MetadataDiscoveryResource { ...@@ -129,7 +130,16 @@ public class MetadataDiscoveryResource {
public Response searchUsingQueryDSL(@QueryParam("query") String dslQuery, public Response searchUsingQueryDSL(@QueryParam("query") String dslQuery,
@DefaultValue(LIMIT_OFFSET_DEFAULT) @QueryParam("limit") int limit, @DefaultValue(LIMIT_OFFSET_DEFAULT) @QueryParam("limit") int limit,
@DefaultValue(LIMIT_OFFSET_DEFAULT) @QueryParam("offset") int offset) { @DefaultValue(LIMIT_OFFSET_DEFAULT) @QueryParam("offset") int offset) {
if (LOG.isDebugEnabled()) {
LOG.debug("==> MetadataDiscoveryResource.searchUsingQueryDSL({}, {}, {})", dslQuery, limit, offset);
}
AtlasPerfTracer perf = null;
try { try {
if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "MetadataDiscoveryResource.searchUsingQueryDSL(" + dslQuery + ", " + limit + ", " + offset + ")");
}
dslQuery = ParamChecker.notEmpty(dslQuery, "dslQuery cannot be null"); dslQuery = ParamChecker.notEmpty(dslQuery, "dslQuery cannot be null");
QueryParams queryParams = validateQueryParams(limit, offset); QueryParams queryParams = validateQueryParams(limit, offset);
final String jsonResultStr = discoveryService.searchByDSL(dslQuery, queryParams); final String jsonResultStr = discoveryService.searchByDSL(dslQuery, queryParams);
...@@ -143,6 +153,12 @@ public class MetadataDiscoveryResource { ...@@ -143,6 +153,12 @@ public class MetadataDiscoveryResource {
} catch (Throwable e) { } catch (Throwable e) {
LOG.error("Unable to get entity list for dslQuery {}", dslQuery, e); LOG.error("Unable to get entity list for dslQuery {}", dslQuery, e);
throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR)); throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR));
} finally {
AtlasPerfTracer.log(perf);
if (LOG.isDebugEnabled()) {
LOG.debug("<== MetadataDiscoveryResource.searchUsingQueryDSL({}, {}, {})", dslQuery, limit, offset);
}
} }
} }
...@@ -174,14 +190,22 @@ public class MetadataDiscoveryResource { ...@@ -174,14 +190,22 @@ public class MetadataDiscoveryResource {
* @param gremlinQuery search query in raw gremlin format. * @param gremlinQuery search query in raw gremlin format.
* @return JSON representing the type and results. * @return JSON representing the type and results.
*/ */
@Monitored
@GET @GET
@Path("search/gremlin") @Path("search/gremlin")
@Consumes(Servlets.JSON_MEDIA_TYPE) @Consumes(Servlets.JSON_MEDIA_TYPE)
@Produces(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE)
@InterfaceAudience.Private @InterfaceAudience.Private
public Response searchUsingGremlinQuery(@QueryParam("query") String gremlinQuery) { public Response searchUsingGremlinQuery(@QueryParam("query") String gremlinQuery) {
if (LOG.isDebugEnabled()) {
LOG.debug("==> MetadataDiscoveryResource.searchUsingGremlinQuery({})", gremlinQuery);
}
AtlasPerfTracer perf = null;
try { try {
if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "MetadataDiscoveryResource.searchUsingGremlinQuery(" + gremlinQuery + ")");
}
gremlinQuery = ParamChecker.notEmpty(gremlinQuery, "gremlinQuery cannot be null or empty"); gremlinQuery = ParamChecker.notEmpty(gremlinQuery, "gremlinQuery cannot be null or empty");
final List<Map<String, String>> results = discoveryService.searchByGremlin(gremlinQuery); final List<Map<String, String>> results = discoveryService.searchByGremlin(gremlinQuery);
...@@ -204,6 +228,12 @@ public class MetadataDiscoveryResource { ...@@ -204,6 +228,12 @@ public class MetadataDiscoveryResource {
} catch (Throwable e) { } catch (Throwable e) {
LOG.error("Unable to get entity list for gremlinQuery {}", gremlinQuery, e); LOG.error("Unable to get entity list for gremlinQuery {}", gremlinQuery, e);
throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR)); throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR));
} finally {
AtlasPerfTracer.log(perf);
if (LOG.isDebugEnabled()) {
LOG.debug("<== MetadataDiscoveryResource.searchUsingGremlinQuery({})", gremlinQuery);
}
} }
} }
...@@ -215,7 +245,6 @@ public class MetadataDiscoveryResource { ...@@ -215,7 +245,6 @@ public class MetadataDiscoveryResource {
* @param offset offset to the results returned, used for pagination. offset >= 0. -1 maps to offset 0 * @param offset offset to the results returned, used for pagination. offset >= 0. -1 maps to offset 0
* @return JSON representing the type and results. * @return JSON representing the type and results.
*/ */
@Monitored
@GET @GET
@Path("search/fulltext") @Path("search/fulltext")
@Consumes(Servlets.JSON_MEDIA_TYPE) @Consumes(Servlets.JSON_MEDIA_TYPE)
...@@ -223,7 +252,16 @@ public class MetadataDiscoveryResource { ...@@ -223,7 +252,16 @@ public class MetadataDiscoveryResource {
public Response searchUsingFullText(@QueryParam("query") String query, public Response searchUsingFullText(@QueryParam("query") String query,
@DefaultValue(LIMIT_OFFSET_DEFAULT) @QueryParam("limit") int limit, @DefaultValue(LIMIT_OFFSET_DEFAULT) @QueryParam("limit") int limit,
@DefaultValue(LIMIT_OFFSET_DEFAULT) @QueryParam("offset") int offset) { @DefaultValue(LIMIT_OFFSET_DEFAULT) @QueryParam("offset") int offset) {
if (LOG.isDebugEnabled()) {
LOG.debug("==> MetadataDiscoveryResource.searchUsingFullText({}, {}, {})", query, limit, offset);
}
AtlasPerfTracer perf = null;
try { try {
if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "MetadataDiscoveryResource.searchUsingFullText(" + query + ", " + limit + ", " + offset + ")");
}
query = ParamChecker.notEmpty(query, "query cannot be null or empty"); query = ParamChecker.notEmpty(query, "query cannot be null or empty");
QueryParams queryParams = validateQueryParams(limit, offset); QueryParams queryParams = validateQueryParams(limit, offset);
final String jsonResultStr = discoveryService.searchByFullText(query, queryParams); final String jsonResultStr = discoveryService.searchByFullText(query, queryParams);
...@@ -237,6 +275,12 @@ public class MetadataDiscoveryResource { ...@@ -237,6 +275,12 @@ public class MetadataDiscoveryResource {
} catch (Throwable e) { } catch (Throwable e) {
LOG.error("Unable to get entity list for query {}", query, e); LOG.error("Unable to get entity list for query {}", query, e);
throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR)); throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR));
} finally {
AtlasPerfTracer.log(perf);
if (LOG.isDebugEnabled()) {
LOG.debug("<== MetadataDiscoveryResource.searchUsingFullText({}, {}, {})", query, limit, offset);
}
} }
} }
......
...@@ -22,7 +22,6 @@ import com.sun.jersey.api.client.ClientResponse; ...@@ -22,7 +22,6 @@ import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.core.ResourceContext; import com.sun.jersey.api.core.ResourceContext;
import org.apache.atlas.AtlasClient; import org.apache.atlas.AtlasClient;
import org.apache.atlas.AtlasException; import org.apache.atlas.AtlasException;
import org.apache.atlas.aspect.Monitored;
import org.apache.atlas.exception.AtlasBaseException; import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.model.TypeCategory; import org.apache.atlas.model.TypeCategory;
import org.apache.atlas.model.typedef.AtlasClassificationDef; import org.apache.atlas.model.typedef.AtlasClassificationDef;
...@@ -88,17 +87,29 @@ public class TypesResource { ...@@ -88,17 +87,29 @@ public class TypesResource {
* Submits a type definition corresponding to a given type representing a meta model of a * Submits a type definition corresponding to a given type representing a meta model of a
* domain. Could represent things like Hive Database, Hive Table, etc. * domain. Could represent things like Hive Database, Hive Table, etc.
*/ */
@Monitored
@POST @POST
@Consumes({Servlets.JSON_MEDIA_TYPE, MediaType.APPLICATION_JSON}) @Consumes({Servlets.JSON_MEDIA_TYPE, MediaType.APPLICATION_JSON})
@Produces(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE)
public Response submit(@Context HttpServletRequest request) { public Response submit(@Context HttpServletRequest request) {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TypesResource.submit()");
}
AtlasPerfTracer perf = null;
if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "TypesResource.submit()");
}
TypesREST typesRest = resourceContext.getResource(TypesREST.class); TypesREST typesRest = resourceContext.getResource(TypesREST.class);
JSONArray typesResponse = new JSONArray(); JSONArray typesResponse = new JSONArray();
try { try {
final String typeDefinition = Servlets.getRequestPayload(request); final String typeDefinition = Servlets.getRequestPayload(request);
LOG.info("Creating type with definition {} ", typeDefinition);
if (LOG.isDebugEnabled()) {
LOG.debug("Creating type with definition {} ", typeDefinition);
}
AtlasTypesDef createTypesDef = RestUtils.toAtlasTypesDef(typeDefinition, typeRegistry); AtlasTypesDef createTypesDef = RestUtils.toAtlasTypesDef(typeDefinition, typeRegistry);
AtlasTypesDef createdTypesDef = typesRest.createAtlasTypeDefs(createTypesDef); AtlasTypesDef createdTypesDef = typesRest.createAtlasTypeDefs(createTypesDef);
...@@ -127,6 +138,12 @@ public class TypesResource { ...@@ -127,6 +138,12 @@ public class TypesResource {
} catch (Throwable e) { } catch (Throwable e) {
LOG.error("Unable to persist types", e); LOG.error("Unable to persist types", e);
throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR)); throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR));
} finally {
AtlasPerfTracer.log(perf);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TypesResource.submit()");
}
} }
} }
...@@ -139,16 +156,28 @@ public class TypesResource { ...@@ -139,16 +156,28 @@ public class TypesResource {
* @param request * @param request
* @return * @return
*/ */
@Monitored
@PUT @PUT
@Consumes({Servlets.JSON_MEDIA_TYPE, MediaType.APPLICATION_JSON}) @Consumes({Servlets.JSON_MEDIA_TYPE, MediaType.APPLICATION_JSON})
@Produces(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE)
public Response update(@Context HttpServletRequest request) { public Response update(@Context HttpServletRequest request) {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TypesResource.update()");
}
AtlasPerfTracer perf = null;
if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "TypesResource.update()");
}
TypesREST typesRest = resourceContext.getResource(TypesREST.class); TypesREST typesRest = resourceContext.getResource(TypesREST.class);
JSONArray typesResponse = new JSONArray(); JSONArray typesResponse = new JSONArray();
try { try {
final String typeDefinition = Servlets.getRequestPayload(request); final String typeDefinition = Servlets.getRequestPayload(request);
LOG.info("Updating type with definition {} ", typeDefinition);
if (LOG.isDebugEnabled()) {
LOG.debug("Updating type with definition {} ", typeDefinition);
}
AtlasTypesDef updateTypesDef = RestUtils.toAtlasTypesDef(typeDefinition, typeRegistry); AtlasTypesDef updateTypesDef = RestUtils.toAtlasTypesDef(typeDefinition, typeRegistry);
AtlasTypesDef updatedTypesDef = typesRest.updateAtlasTypeDefs(updateTypesDef); AtlasTypesDef updatedTypesDef = typesRest.updateAtlasTypeDefs(updateTypesDef);
...@@ -174,6 +203,12 @@ public class TypesResource { ...@@ -174,6 +203,12 @@ public class TypesResource {
} catch (Throwable e) { } catch (Throwable e) {
LOG.error("Unable to persist types", e); LOG.error("Unable to persist types", e);
throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR)); throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR));
} finally {
AtlasPerfTracer.log(perf);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TypesResource.update()");
}
} }
} }
...@@ -182,11 +217,20 @@ public class TypesResource { ...@@ -182,11 +217,20 @@ public class TypesResource {
* *
* @param typeName name of a type which is unique. * @param typeName name of a type which is unique.
*/ */
@Monitored
@GET @GET
@Path("{typeName}") @Path("{typeName}")
@Produces(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE)
public Response getDefinition(@Context HttpServletRequest request, @PathParam("typeName") String typeName) { public Response getDefinition(@Context HttpServletRequest request, @PathParam("typeName") String typeName) {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TypesResource.getDefinition({})", typeName);
}
AtlasPerfTracer perf = null;
if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "TypesResource.getDefinition(" + typeName + ")");
}
TypesREST typesRest = resourceContext.getResource(TypesREST.class); TypesREST typesRest = resourceContext.getResource(TypesREST.class);
JSONObject response = new JSONObject(); JSONObject response = new JSONObject();
...@@ -233,6 +277,12 @@ public class TypesResource { ...@@ -233,6 +277,12 @@ public class TypesResource {
} catch (Throwable e) { } catch (Throwable e) {
LOG.error("Unable to get type definition for type {}", typeName, e); LOG.error("Unable to get type definition for type {}", typeName, e);
throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR)); throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR));
} finally {
AtlasPerfTracer.log(perf);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TypesResource.getDefinition({})", typeName);
}
} }
} }
...@@ -248,12 +298,21 @@ public class TypesResource { ...@@ -248,12 +298,21 @@ public class TypesResource {
* For example, typeCategory = TRAIT && supertype contains 'X' && supertype !contains 'Y' * For example, typeCategory = TRAIT && supertype contains 'X' && supertype !contains 'Y'
* If there is no filter, all the types are returned * If there is no filter, all the types are returned
*/ */
@Monitored
@GET @GET
@Produces(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE)
public Response getTypesByFilter(@Context HttpServletRequest request, @QueryParam("type") String typeCategory, public Response getTypesByFilter(@Context HttpServletRequest request, @QueryParam("type") String typeCategory,
@QueryParam("supertype") String supertype, @QueryParam("supertype") String supertype,
@QueryParam("notsupertype") String notsupertype) throws AtlasBaseException { @QueryParam("notsupertype") String notsupertype) throws AtlasBaseException {
if (LOG.isDebugEnabled()) {
LOG.debug("==> TypesResource.getTypesByFilter({}, {}, {})", typeCategory, supertype, notsupertype);
}
AtlasPerfTracer perf = null;
if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "TypesResource.getTypesByFilter(" + typeCategory + ", " + supertype + ", " + notsupertype + ")");
}
TypesREST typesRest = resourceContext.getResource(TypesREST.class); TypesREST typesRest = resourceContext.getResource(TypesREST.class);
JSONObject response = new JSONObject(); JSONObject response = new JSONObject();
try { try {
...@@ -270,6 +329,12 @@ public class TypesResource { ...@@ -270,6 +329,12 @@ public class TypesResource {
} catch (Throwable e) { } catch (Throwable e) {
LOG.error("Unable to get types list", e); LOG.error("Unable to get types list", e);
throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR)); throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR));
} finally {
AtlasPerfTracer.log(perf);
if (LOG.isDebugEnabled()) {
LOG.debug("<== TypesResource.getTypesByFilter({}, {}, {})", typeCategory, supertype, notsupertype);
}
} }
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment