Search in sources :

Example 1 with BaseQueryMetric

use of datawave.microservice.querymetric.BaseQueryMetric in project datawave by NationalSecurityAgency.

the class CachedRunningQuery method setMetricsInfo.

private void setMetricsInfo() {
    BaseQueryMetric m = this.getMetric();
    // set the metric information
    m.setQueryType(this.getClass());
    m.setQueryId(this.queryId);
    m.setUser(this.user);
    m.setUserDN(this.query.getUserDN());
    if (this.query != null) {
        m.setColumnVisibility(this.query.getColumnVisibility());
        m.setQueryAuthorizations(this.query.getQueryAuthorizations());
        m.setQueryLogic(this.query.getQueryLogicName());
        m.setBeginDate(this.query.getBeginDate());
        m.setEndDate(this.query.getEndDate());
    }
}
Also used : BaseQueryMetric(datawave.microservice.querymetric.BaseQueryMetric)

Example 2 with BaseQueryMetric

use of datawave.microservice.querymetric.BaseQueryMetric in project datawave by NationalSecurityAgency.

the class HudBean method getRunningQueries.

/**
 * Return true if there is at least one log in the last 60 minutes.
 *
 * @return
 * @throws org.apache.accumulo.core.client.TableNotFoundException
 */
@Path("/runningqueries/{userid}")
@GET
public String getRunningQueries(@PathParam("userid") String userId) throws Exception {
    DatawavePrincipal principal = getPrincipal();
    boolean isAnAdmin = isAnAdmin(principal);
    QueryImplListResponse runningQueries = null;
    if (isAnAdmin) {
        runningQueries = queryExecutor.listQueriesForUser(userId);
    } else {
        runningQueries = queryExecutor.listUserQueries();
    }
    List<Query> queryList = runningQueries.getQuery();
    List<HudQuerySummary> querySummaryList = new ArrayList<>();
    for (Query query : queryList) {
        HudQuerySummary summary = summaryBuilder.build(query);
        String queryId = query.getId().toString();
        List<? extends BaseQueryMetric> queryMetricsList;
        queryMetricsList = queryMetrics.query(queryId).getResult();
        if (queryMetricsList != null && !queryMetricsList.isEmpty()) {
            BaseQueryMetric qm = queryMetricsList.get(0);
            List<PageMetric> pageMetrics = qm.getPageTimes();
            summary.setPageMetrics(pageMetrics);
            summary.setCreateDate(qm.getCreateDate().getTime());
            summary.setNumPages(qm.getNumPages());
            summary.setNumResults(qm.getNumResults());
            summary.setLastUpdated(qm.getLastUpdated().getTime());
            summary.setLifeCycle(qm.getLifecycle().toString());
        }
        querySummaryList.add(summary);
    }
    return gson.toJson(querySummaryList);
}
Also used : QueryImplListResponse(datawave.webservice.result.QueryImplListResponse) Query(datawave.webservice.query.Query) PageMetric(datawave.microservice.querymetric.BaseQueryMetric.PageMetric) ArrayList(java.util.ArrayList) DatawavePrincipal(datawave.security.authorization.DatawavePrincipal) BaseQueryMetric(datawave.microservice.querymetric.BaseQueryMetric) Path(javax.ws.rs.Path) GET(javax.ws.rs.GET)

Example 3 with BaseQueryMetric

use of datawave.microservice.querymetric.BaseQueryMetric in project datawave by NationalSecurityAgency.

the class QueryExecutorBeanTest method testPredict.

@SuppressWarnings("unchecked")
@Test
public void testPredict() throws Exception {
    QueryImpl q = createNewQuery();
    MultivaluedMap p = createNewQueryParameterMap();
    p.putSingle(QueryParameters.QUERY_LOGIC_NAME, queryLogicName);
    MultivaluedMap<String, String> optionalParameters = createNewQueryParameters(q, p);
    @SuppressWarnings("rawtypes") QueryLogic logic = createMock(BaseQueryLogic.class);
    DatawaveUser user = new DatawaveUser(SubjectIssuerDNPair.of(userDN, "<CN=MY_CA, OU=MY_SUBDIVISION, OU=MY_DIVISION, O=ORG, C=US>"), UserType.USER, Arrays.asList(auths), null, null, 0L);
    DatawavePrincipal principal = new DatawavePrincipal(Collections.singletonList(user));
    String[] dns = principal.getDNs();
    Arrays.sort(dns);
    List<String> dnList = Arrays.asList(dns);
    PowerMock.resetAll();
    EasyMock.expect(ctx.getCallerPrincipal()).andReturn(principal).anyTimes();
    suppress(constructor(QueryParametersImpl.class));
    EasyMock.expect(persister.create(principal.getUserDN().subjectDN(), dnList, (SecurityMarking) Whitebox.getField(bean.getClass(), "marking").get(bean), queryLogicName, (QueryParameters) Whitebox.getField(bean.getClass(), "qp").get(bean), optionalParameters)).andReturn(q);
    EasyMock.expect(queryLogicFactory.getQueryLogic(queryLogicName, principal)).andReturn(logic);
    EasyMock.expect(logic.getRequiredQueryParameters()).andReturn(Collections.EMPTY_SET);
    EasyMock.expect(logic.containsDNWithAccess(dnList)).andReturn(true);
    EasyMock.expect(logic.getMaxPageSize()).andReturn(0);
    BaseQueryMetric metric = new QueryMetricFactoryImpl().createMetric();
    metric.populate(q);
    metric.setQueryType(RunningQuery.class.getSimpleName());
    QueryMetric testMetric = new QueryMetric((QueryMetric) metric) {

        @Override
        public boolean equals(Object o) {
            // test for equality except for the create date
            if (null == o) {
                return false;
            }
            if (this == o) {
                return true;
            }
            if (o instanceof QueryMetric) {
                QueryMetric other = (QueryMetric) o;
                return new EqualsBuilder().append(this.getQueryId(), other.getQueryId()).append(this.getQueryType(), other.getQueryType()).append(this.getQueryAuthorizations(), other.getQueryAuthorizations()).append(this.getColumnVisibility(), other.getColumnVisibility()).append(this.getBeginDate(), other.getBeginDate()).append(this.getEndDate(), other.getEndDate()).append(this.getCreateDate(), other.getCreateDate()).append(this.getSetupTime(), other.getSetupTime()).append(this.getUser(), other.getUser()).append(this.getUserDN(), other.getUserDN()).append(this.getQuery(), other.getQuery()).append(this.getQueryLogic(), other.getQueryLogic()).append(this.getQueryName(), other.getQueryName()).append(this.getParameters(), other.getParameters()).append(this.getHost(), other.getHost()).append(this.getPageTimes(), other.getPageTimes()).append(this.getProxyServers(), other.getProxyServers()).append(this.getLifecycle(), other.getLifecycle()).append(this.getErrorMessage(), other.getErrorMessage()).append(this.getErrorCode(), other.getErrorCode()).append(this.getSourceCount(), other.getSourceCount()).append(this.getNextCount(), other.getNextCount()).append(this.getSeekCount(), other.getSeekCount()).append(this.getYieldCount(), other.getYieldCount()).append(this.getDocRanges(), other.getDocRanges()).append(this.getFiRanges(), other.getFiRanges()).append(this.getPlan(), other.getPlan()).append(this.getVersion(), other.getVersion()).append(this.getLoginTime(), other.getLoginTime()).append(this.getPredictions(), other.getPredictions()).isEquals();
            } else {
                return false;
            }
        }
    };
    Set<Prediction> predictions = new HashSet<>();
    predictions.add(new Prediction("source", 1));
    EasyMock.expect(predictor.predict(EasyMock.eq(testMetric))).andReturn(predictions);
    PowerMock.replayAll();
    GenericResponse<String> response = bean.predictQuery(queryLogicName, p);
    PowerMock.verifyAll();
    Object cachedRunningQuery = cache.get(q.getId().toString());
    Assert.assertNull(cachedRunningQuery);
    Assert.assertEquals(predictions.toString(), response.getResult());
}
Also used : DatawaveUser(datawave.security.authorization.DatawaveUser) Prediction(datawave.microservice.querymetric.BaseQueryMetric.Prediction) EqualsBuilder(org.apache.commons.lang.builder.EqualsBuilder) BaseQueryLogic(datawave.webservice.query.logic.BaseQueryLogic) QueryLogic(datawave.webservice.query.logic.QueryLogic) QueryParametersImpl(datawave.webservice.query.QueryParametersImpl) DatawavePrincipal(datawave.security.authorization.DatawavePrincipal) QueryImpl(datawave.webservice.query.QueryImpl) BaseQueryMetric(datawave.microservice.querymetric.BaseQueryMetric) QueryMetric(datawave.microservice.querymetric.QueryMetric) EasyMock.anyObject(org.easymock.EasyMock.anyObject) BaseQueryMetric(datawave.microservice.querymetric.BaseQueryMetric) MultivaluedMap(javax.ws.rs.core.MultivaluedMap) QueryMetricFactoryImpl(datawave.microservice.querymetric.QueryMetricFactoryImpl) HashSet(java.util.HashSet) Test(org.junit.Test) PrepareForTest(org.powermock.core.classloader.annotations.PrepareForTest)

Example 4 with BaseQueryMetric

use of datawave.microservice.querymetric.BaseQueryMetric in project datawave by NationalSecurityAgency.

the class QueryExecutorBeanTest method testCloseActuallyCloses.

@SuppressWarnings("unchecked")
@Test(timeout = 5000)
public void testCloseActuallyCloses() throws Exception {
    QueryImpl q = createNewQuery();
    final MultivaluedMap<String, String> queryParameters = createNewQueryParameterMap();
    queryParameters.putSingle(QueryParameters.QUERY_LOGIC_NAME, "EventQueryLogic");
    final Thread createQuery = new Thread(() -> {
        try {
            bean.createQuery("EventQueryLogic", queryParameters);
        } catch (Exception e) {
            // ok if we fail the call
            log.debug("createQuery terminated with " + e);
        }
    });
    final Throwable[] createQueryException = { null };
    createQuery.setUncaughtExceptionHandler((t, e) -> createQueryException[0] = e);
    @SuppressWarnings("rawtypes") QueryLogic logic = createMock(BaseQueryLogic.class);
    DatawaveUser user = new DatawaveUser(SubjectIssuerDNPair.of(userDN, "<CN=MY_CA, OU=MY_SUBDIVISION, OU=MY_DIVISION, O=ORG, C=US>"), UserType.USER, Arrays.asList(auths), null, null, 0L);
    DatawavePrincipal principal = new DatawavePrincipal(Collections.singletonList(user));
    principal.getShortName();
    String[] dns = principal.getDNs();
    Arrays.sort(dns);
    List<String> dnList = Arrays.asList(dns);
    InMemoryInstance instance = new InMemoryInstance();
    Connector c = instance.getConnector("root", new PasswordToken(""));
    MultivaluedMap<String, String> optionalParameters = createNewQueryParameters(q, queryParameters);
    PowerMock.resetAll();
    EasyMock.expect(ctx.getCallerPrincipal()).andReturn(principal).anyTimes();
    EasyMock.expect(logic.getAuditType(null)).andReturn(AuditType.NONE);
    EasyMock.expect(persister.create(principal.getUserDN().subjectDN(), dnList, Whitebox.getInternalState(bean, SecurityMarking.class), queryLogicName, Whitebox.getInternalState(bean, QueryParameters.class), optionalParameters)).andReturn(q);
    EasyMock.expect(persister.findById(EasyMock.anyString())).andReturn(null).anyTimes();
    EasyMock.expect(connectionFactory.getTrackingMap(anyObject())).andReturn(Maps.newHashMap()).anyTimes();
    BaseQueryMetric metric = new QueryMetricFactoryImpl().createMetric();
    metric.populate(q);
    EasyMock.expectLastCall();
    metric.setQueryType(RunningQuery.class.getSimpleName());
    metric.setLifecycle(Lifecycle.DEFINED);
    System.out.println(metric);
    Set<Prediction> predictions = new HashSet<>();
    predictions.add(new Prediction("source", 1));
    EasyMock.expect(predictor.predict(metric)).andReturn(predictions);
    connectionRequestBean.requestBegin(q.getId().toString());
    EasyMock.expectLastCall();
    EasyMock.expect(connectionFactory.getConnection(eq("connPool1"), anyObject(), anyObject())).andReturn(c).anyTimes();
    connectionRequestBean.requestEnd(q.getId().toString());
    EasyMock.expectLastCall();
    connectionFactory.returnConnection(c);
    EasyMock.expectLastCall();
    EasyMock.expect(queryLogicFactory.getQueryLogic(queryLogicName, principal)).andReturn(logic);
    EasyMock.expect(logic.getRequiredQueryParameters()).andReturn(Collections.emptySet());
    EasyMock.expect(logic.getConnectionPriority()).andReturn(AccumuloConnectionFactory.Priority.NORMAL).atLeastOnce();
    EasyMock.expect(logic.containsDNWithAccess(dnList)).andReturn(true);
    EasyMock.expect(logic.getMaxPageSize()).andReturn(0);
    EasyMock.expect(logic.getAuditType(q)).andReturn(AuditType.NONE);
    EasyMock.expect(logic.getConnPoolName()).andReturn("connPool1");
    EasyMock.expect(logic.getResultLimit(eq(q.getDnList()))).andReturn(-1L).anyTimes();
    EasyMock.expect(logic.getMaxResults()).andReturn(-1L).anyTimes();
    EasyMock.expect(connectionRequestBean.cancelConnectionRequest(q.getId().toString(), principal)).andReturn(false).anyTimes();
    connectionFactory.returnConnection(EasyMock.isA(Connector.class));
    final AtomicBoolean initializeLooping = new AtomicBoolean(false);
    // During initialize, mark that we get here, and then sleep
    final IAnswer<GenericQueryConfiguration> initializeAnswer = () -> {
        initializeLooping.set(true);
        try {
            while (true) {
                Thread.sleep(1000);
                log.debug("Initialize: woke up");
            }
        } catch (InterruptedException e) {
            throw new QueryException("EXPECTED EXCEPTION: initialize interrupted");
        }
    };
    EasyMock.expect(logic.initialize(anyObject(Connector.class), anyObject(Query.class), anyObject(Set.class))).andAnswer(initializeAnswer);
    EasyMock.expect(logic.getCollectQueryMetrics()).andReturn(Boolean.FALSE);
    // On close, interrupt the thread to simulate the ScannerFactory cleaning up
    final IAnswer<Object> closeAnswer = () -> {
        if (null != createQuery) {
            log.debug("createQuery thread is not null. interrupting");
            createQuery.interrupt();
        } else {
            log.debug("createQuery thread is null. not interrupting");
        }
        return null;
    };
    logic.close();
    EasyMock.expectLastCall().andAnswer(closeAnswer).anyTimes();
    // Make the QueryLogic mock not threadsafe, otherwise it will be blocked infinitely
    // trying to get the lock on the infinite loop
    EasyMock.makeThreadSafe(logic, false);
    metrics.updateMetric(EasyMock.isA(QueryMetric.class));
    PowerMock.replayAll();
    try {
        createQuery.start();
        // Wait for the create call to get to initialize
        while (!initializeLooping.get()) {
            if (!createQuery.isAlive() && !initializeLooping.get()) {
                Assert.fail("createQuery thread died before reaching initialize: " + createQueryException[0]);
            }
            Thread.sleep(50);
        }
        // initialize has not completed yet so it will not appear in the cache
        Object cachedRunningQuery = cache.get(q.getId().toString());
        Assert.assertNull(cachedRunningQuery);
        Pair<QueryLogic<?>, Connector> pair = qlCache.poll(q.getId().toString());
        Assert.assertNotNull(pair);
        Assert.assertEquals(logic, pair.getFirst());
        Assert.assertEquals(c, pair.getSecond());
        // Have to add these back because poll was destructive
        qlCache.add(q.getId().toString(), principal.getShortName(), pair.getFirst(), pair.getSecond());
        // Call close
        bean.close(q.getId().toString());
        // Make sure that it's gone from the qlCache
        pair = qlCache.poll(q.getId().toString());
        Assert.assertNull("Still found an entry in the qlCache: " + pair, pair);
        // Should have already joined by now, but just to be sure
        createQuery.join();
    } finally {
        if (null != createQuery && createQuery.isAlive()) {
            createQuery.interrupt();
        }
    }
}
Also used : Connector(org.apache.accumulo.core.client.Connector) Set(java.util.Set) HashSet(java.util.HashSet) Query(datawave.webservice.query.Query) InMemoryInstance(datawave.accumulo.inmemory.InMemoryInstance) DatawavePrincipal(datawave.security.authorization.DatawavePrincipal) GenericQueryConfiguration(datawave.webservice.query.configuration.GenericQueryConfiguration) QueryImpl(datawave.webservice.query.QueryImpl) PasswordToken(org.apache.accumulo.core.client.security.tokens.PasswordToken) SecurityMarking(datawave.marking.SecurityMarking) ColumnVisibilitySecurityMarking(datawave.marking.ColumnVisibilitySecurityMarking) BaseQueryMetric(datawave.microservice.querymetric.BaseQueryMetric) QueryMetric(datawave.microservice.querymetric.QueryMetric) BaseQueryMetric(datawave.microservice.querymetric.BaseQueryMetric) QueryMetricFactoryImpl(datawave.microservice.querymetric.QueryMetricFactoryImpl) HashSet(java.util.HashSet) DatawaveUser(datawave.security.authorization.DatawaveUser) Prediction(datawave.microservice.querymetric.BaseQueryMetric.Prediction) BaseQueryLogic(datawave.webservice.query.logic.BaseQueryLogic) QueryLogic(datawave.webservice.query.logic.QueryLogic) QueryParameters(datawave.webservice.query.QueryParameters) DatawaveWebApplicationException(datawave.webservice.common.exception.DatawaveWebApplicationException) IOException(java.io.IOException) QueryException(datawave.webservice.query.exception.QueryException) URISyntaxException(java.net.URISyntaxException) BadRequestException(datawave.webservice.common.exception.BadRequestException) SAXException(org.xml.sax.SAXException) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) QueryException(datawave.webservice.query.exception.QueryException) EasyMock.anyObject(org.easymock.EasyMock.anyObject) Test(org.junit.Test) PrepareForTest(org.powermock.core.classloader.annotations.PrepareForTest)

Example 5 with BaseQueryMetric

use of datawave.microservice.querymetric.BaseQueryMetric in project datawave by NationalSecurityAgency.

the class QueryExecutorBean method predictQuery.

/**
 * @param queryLogicName
 * @param queryParameters
 * @return query predictions
 */
@POST
@Path("/{logicName}/predict")
@Produces({ "application/xml", "text/xml", "application/json", "text/yaml", "text/x-yaml", "application/x-yaml", "application/x-protobuf", "application/x-protostuff" })
@Interceptors({ RequiredInterceptor.class, ResponseInterceptor.class })
@Timed(name = "dw.query.predictQuery", absolute = true)
public GenericResponse<String> predictQuery(@Required("logicName") @PathParam("logicName") String queryLogicName, MultivaluedMap<String, String> queryParameters) {
    CreateQuerySessionIDFilter.QUERY_ID.set(null);
    QueryData qd = validateQuery(queryLogicName, queryParameters, null);
    GenericResponse<String> response = new GenericResponse<>();
    if (predictor != null) {
        try {
            qp.setPersistenceMode(QueryPersistence.TRANSIENT);
            MultivaluedMap<String, String> optionalQueryParameters = new MultivaluedMapImpl<>();
            optionalQueryParameters.putAll(qp.getUnknownParameters(queryParameters));
            Query q = persister.create(qd.userDn, qd.dnList, marking, queryLogicName, qp, optionalQueryParameters);
            BaseQueryMetric metric = metricFactory.createMetric();
            metric.populate(q);
            metric.setQueryType(RunningQuery.class.getSimpleName());
            Set<Prediction> predictions = predictor.predict(metric);
            if (predictions != null && !predictions.isEmpty()) {
                String predictionString = predictions.toString();
                // now we have a predictions, lets broadcast
                log.info("Model predictions: " + predictionString);
                response.setHasResults(true);
                response.setResult(predictionString);
            } else {
                response.setHasResults(false);
            }
        } catch (Throwable t) {
            response.setHasResults(false);
            if (t instanceof Error && !(t instanceof TokenMgrError)) {
                log.error(t.getMessage(), t);
                throw (Error) t;
            } else if (t instanceof WebApplicationException) {
                log.error(t.getMessage(), t);
                throw ((WebApplicationException) t);
            } else {
                log.error(t.getMessage(), t);
                QueryException qe = new QueryException(DatawaveErrorCode.QUERY_PREDICTIONS_ERROR, t);
                response.addException(qe.getBottomQueryException());
                int statusCode = qe.getBottomQueryException().getStatusCode();
                throw new DatawaveWebApplicationException(qe, response, statusCode);
            }
        }
    } else {
        response.setHasResults(false);
    }
    return response;
}
Also used : Query(datawave.webservice.query.Query) DatawaveWebApplicationException(datawave.webservice.common.exception.DatawaveWebApplicationException) WebApplicationException(javax.ws.rs.WebApplicationException) GenericResponse(datawave.webservice.result.GenericResponse) Prediction(datawave.microservice.querymetric.BaseQueryMetric.Prediction) TokenMgrError(org.apache.commons.jexl2.parser.TokenMgrError) MultivaluedMapImpl(org.jboss.resteasy.specimpl.MultivaluedMapImpl) TokenMgrError(org.apache.commons.jexl2.parser.TokenMgrError) PreConditionFailedQueryException(datawave.webservice.query.exception.PreConditionFailedQueryException) NotFoundQueryException(datawave.webservice.query.exception.NotFoundQueryException) NoResultsQueryException(datawave.webservice.query.exception.NoResultsQueryException) QueryException(datawave.webservice.query.exception.QueryException) UnauthorizedQueryException(datawave.webservice.query.exception.UnauthorizedQueryException) BadRequestQueryException(datawave.webservice.query.exception.BadRequestQueryException) DatawaveWebApplicationException(datawave.webservice.common.exception.DatawaveWebApplicationException) BaseQueryMetric(datawave.microservice.querymetric.BaseQueryMetric) Path(javax.ws.rs.Path) Interceptors(javax.interceptor.Interceptors) POST(javax.ws.rs.POST) Produces(javax.ws.rs.Produces) Timed(com.codahale.metrics.annotation.Timed)

Aggregations

BaseQueryMetric (datawave.microservice.querymetric.BaseQueryMetric)8 DatawavePrincipal (datawave.security.authorization.DatawavePrincipal)4 Query (datawave.webservice.query.Query)4 Prediction (datawave.microservice.querymetric.BaseQueryMetric.Prediction)3 QueryMetric (datawave.microservice.querymetric.QueryMetric)3 DatawaveWebApplicationException (datawave.webservice.common.exception.DatawaveWebApplicationException)3 QueryException (datawave.webservice.query.exception.QueryException)3 BaseQueryLogic (datawave.webservice.query.logic.BaseQueryLogic)3 IOException (java.io.IOException)3 PageMetric (datawave.microservice.querymetric.BaseQueryMetric.PageMetric)2 QueryMetricFactoryImpl (datawave.microservice.querymetric.QueryMetricFactoryImpl)2 DatawaveUser (datawave.security.authorization.DatawaveUser)2 QueryImpl (datawave.webservice.query.QueryImpl)2 BadRequestQueryException (datawave.webservice.query.exception.BadRequestQueryException)2 NoResultsQueryException (datawave.webservice.query.exception.NoResultsQueryException)2 NotFoundQueryException (datawave.webservice.query.exception.NotFoundQueryException)2 PreConditionFailedQueryException (datawave.webservice.query.exception.PreConditionFailedQueryException)2 UnauthorizedQueryException (datawave.webservice.query.exception.UnauthorizedQueryException)2 QueryLogic (datawave.webservice.query.logic.QueryLogic)2 RunningQuery (datawave.webservice.query.runner.RunningQuery)2