Search in sources :

Example 1 with LogSearchResult

use of com.hortonworks.streamline.streams.logsearch.LogSearchResult in project streamline by hortonworks.

the class AmbariInfraWithStormLogSearchTest method testLogSearchWithMinimumParameters.

@Test
public void testLogSearchWithMinimumParameters() throws Exception {
    stubSolrUrl();
    LogSearchCriteria logSearchCriteria = new LogSearchCriteria.Builder(TEST_APP_ID, TEST_FROM, TEST_TO).build();
    LogSearchResult result = logSearch.search(logSearchCriteria);
    verifyLogSearchResults(result);
    // please note that space should be escaped to '+' since Wiremock doesn't handle it when matching...
    String dateRangeValue = "%s:[%s+TO+%s]";
    Instant fromInstant = Instant.ofEpochMilli(TEST_FROM);
    Instant toInstant = Instant.ofEpochMilli(TEST_TO);
    dateRangeValue = String.format(dateRangeValue, COLUMN_NAME_LOG_TIME, fromInstant.toString(), toInstant.toString());
    String expectedLogLevels = "(" + String.join("+OR+", AmbariInfraWithStormLogSearch.DEFAULT_LOG_LEVELS) + ")";
    List<LoggedRequest> requests = wireMockRule.findAll(getRequestedFor(urlPathEqualTo(STUB_REQUEST_API_PATH)));
    assertEquals(1, requests.size());
    LoggedRequest request = requests.get(0);
    QueryParameter qParam = request.queryParameter("q");
    assertTrue(qParam.containsValue(COLUMN_NAME_LOG_MESSAGE + ":*"));
    QueryParameter fqParam = request.queryParameter("fq");
    assertTrue(fqParam.containsValue(COLUMN_NAME_STREAMLINE_TOPOLOGY_ID + ":" + TEST_APP_ID));
    assertTrue(fqParam.containsValue(COLUMN_NAME_TYPE + ":" + COLUMN_VALUE_TYPE_WORKER_LOG));
    assertTrue(fqParam.containsValue(dateRangeValue));
    assertTrue(fqParam.containsValue(COLUMN_NAME_LOG_LEVEL + ":" + expectedLogLevels));
    assertFalse(fqParam.hasValueMatching(ValuePattern.containing(COLUMN_NAME_STREAMLINE_COMPONENT_NAME)));
    QueryParameter sortParam = request.queryParameter("sort");
    assertTrue(sortParam.containsValue(COLUMN_NAME_LOG_TIME + "+asc"));
}
Also used : QueryParameter(com.github.tomakehurst.wiremock.http.QueryParameter) LoggedRequest(com.github.tomakehurst.wiremock.verification.LoggedRequest) LogSearchCriteria(com.hortonworks.streamline.streams.logsearch.LogSearchCriteria) Instant(java.time.Instant) LogSearchResult(com.hortonworks.streamline.streams.logsearch.LogSearchResult) Test(org.junit.Test)

Example 2 with LogSearchResult

use of com.hortonworks.streamline.streams.logsearch.LogSearchResult in project streamline by hortonworks.

the class AmbariInfraWithStormLogSearchTest method testLogSearchWithFullParameters.

@Test
public void testLogSearchWithFullParameters() throws Exception {
    stubSolrUrl();
    int testStart = 100;
    int testLimit = 2000;
    List<String> testLogLevels = Lists.newArrayList("INFO", "DEBUG");
    String testSearchString = "helloworld";
    List<String> testComponentNames = Lists.newArrayList("testComponent", "testComponent2");
    LogSearchCriteria logSearchCriteria = new LogSearchCriteria.Builder(TEST_APP_ID, TEST_FROM, TEST_TO).setLogLevels(testLogLevels).setSearchString(testSearchString).setComponentNames(testComponentNames).setStart(testStart).setLimit(testLimit).setAscending(false).build();
    LogSearchResult result = logSearch.search(logSearchCriteria);
    // note that the result doesn't change given that we just provide same result from file
    verifyLogSearchResults(result);
    // please note that space should be escaped to '+' since Wiremock doesn't handle it when matching...
    String dateRangeValue = "%s:[%s+TO+%s]";
    Instant fromInstant = Instant.ofEpochMilli(TEST_FROM);
    Instant toInstant = Instant.ofEpochMilli(TEST_TO);
    dateRangeValue = String.format(dateRangeValue, COLUMN_NAME_LOG_TIME, fromInstant.toString(), toInstant.toString());
    String expectedComponentNames = "(" + String.join("+OR+", testComponentNames) + ")";
    String expectedLogLevels = "(" + String.join("+OR+", testLogLevels) + ")";
    List<LoggedRequest> requests = wireMockRule.findAll(getRequestedFor(urlPathEqualTo(STUB_REQUEST_API_PATH)));
    assertEquals(1, requests.size());
    LoggedRequest request = requests.get(0);
    QueryParameter qParam = request.queryParameter("q");
    assertTrue(qParam.containsValue(COLUMN_NAME_LOG_MESSAGE + ":" + testSearchString));
    QueryParameter fqParam = request.queryParameter("fq");
    assertTrue(fqParam.containsValue(COLUMN_NAME_STREAMLINE_TOPOLOGY_ID + ":" + TEST_APP_ID));
    assertTrue(fqParam.containsValue(COLUMN_NAME_TYPE + ":" + COLUMN_VALUE_TYPE_WORKER_LOG));
    assertTrue(fqParam.containsValue(COLUMN_NAME_STREAMLINE_COMPONENT_NAME + ":" + expectedComponentNames));
    assertTrue(fqParam.containsValue(COLUMN_NAME_LOG_LEVEL + ":" + expectedLogLevels));
    assertTrue(fqParam.containsValue(dateRangeValue));
    QueryParameter sortParam = request.queryParameter("sort");
    assertTrue(sortParam.containsValue(COLUMN_NAME_LOG_TIME + "+desc"));
    QueryParameter startParam = request.queryParameter("start");
    assertTrue(startParam.containsValue(String.valueOf(testStart)));
    QueryParameter rowsParam = request.queryParameter("rows");
    assertTrue(rowsParam.containsValue(String.valueOf(testLimit)));
}
Also used : QueryParameter(com.github.tomakehurst.wiremock.http.QueryParameter) LoggedRequest(com.github.tomakehurst.wiremock.verification.LoggedRequest) LogSearchCriteria(com.hortonworks.streamline.streams.logsearch.LogSearchCriteria) Instant(java.time.Instant) LogSearchResult(com.hortonworks.streamline.streams.logsearch.LogSearchResult) Test(org.junit.Test)

Example 3 with LogSearchResult

use of com.hortonworks.streamline.streams.logsearch.LogSearchResult in project streamline by hortonworks.

the class AmbariInfraWithStormLogSearchTest method testLogSearchWithSingleComponentNameAndLogLevelParameters.

@Test
public void testLogSearchWithSingleComponentNameAndLogLevelParameters() throws Exception {
    stubSolrUrl();
    int testStart = 100;
    int testLimit = 2000;
    List<String> testLogLevels = Collections.singletonList("INFO");
    String testSearchString = "helloworld";
    List<String> testComponentNames = Collections.singletonList("testComponent");
    LogSearchCriteria logSearchCriteria = new LogSearchCriteria.Builder(TEST_APP_ID, TEST_FROM, TEST_TO).setLogLevels(testLogLevels).setSearchString(testSearchString).setComponentNames(testComponentNames).setStart(testStart).setLimit(testLimit).build();
    LogSearchResult result = logSearch.search(logSearchCriteria);
    // note that the result doesn't change given that we just provide same result from file
    verifyLogSearchResults(result);
    // others are covered from testLogSearchWithFullParameters()
    List<LoggedRequest> requests = wireMockRule.findAll(getRequestedFor(urlPathEqualTo(STUB_REQUEST_API_PATH)));
    assertEquals(1, requests.size());
    LoggedRequest request = requests.get(0);
    QueryParameter fqParam = request.queryParameter("fq");
    assertTrue(fqParam.containsValue(COLUMN_NAME_STREAMLINE_COMPONENT_NAME + ":" + testComponentNames.get(0)));
    assertTrue(fqParam.containsValue(COLUMN_NAME_TYPE + ":" + COLUMN_VALUE_TYPE_WORKER_LOG));
    assertTrue(fqParam.containsValue(COLUMN_NAME_LOG_LEVEL + ":" + testLogLevels.get(0)));
}
Also used : QueryParameter(com.github.tomakehurst.wiremock.http.QueryParameter) LoggedRequest(com.github.tomakehurst.wiremock.verification.LoggedRequest) LogSearchCriteria(com.hortonworks.streamline.streams.logsearch.LogSearchCriteria) LogSearchResult(com.hortonworks.streamline.streams.logsearch.LogSearchResult) Test(org.junit.Test)

Example 4 with LogSearchResult

use of com.hortonworks.streamline.streams.logsearch.LogSearchResult in project streamline by hortonworks.

the class AmbariInfraWithStormLogSearch method search.

/**
 * {@inheritDoc}
 */
@Override
public LogSearchResult search(LogSearchCriteria logSearchCriteria) {
    SolrQuery query = new SolrQuery();
    query.setQuery(buildColumnAndValue(COLUMN_NAME_LOG_MESSAGE, buildValue(logSearchCriteria.getSearchString())));
    query.addFilterQuery(buildColumnAndValue(COLUMN_NAME_TYPE, COLUMN_VALUE_TYPE_WORKER_LOG));
    query.addFilterQuery(buildColumnAndValue(COLUMN_NAME_STREAMLINE_TOPOLOGY_ID, buildValue(logSearchCriteria.getAppId())));
    query.addFilterQuery(buildColumnAndValue(COLUMN_NAME_LOG_TIME, buildDateRangeValue(logSearchCriteria.getFrom(), logSearchCriteria.getTo())));
    List<String> componentNames = logSearchCriteria.getComponentNames();
    if (componentNames != null && !componentNames.isEmpty()) {
        query.addFilterQuery(buildColumnAndValue(COLUMN_NAME_STREAMLINE_COMPONENT_NAME, buildORValues(componentNames)));
    }
    List<String> logLevels = logSearchCriteria.getLogLevels();
    if (logLevels == null || logLevels.isEmpty()) {
        logLevels = DEFAULT_LOG_LEVELS;
    }
    query.addFilterQuery(buildColumnAndValue(COLUMN_NAME_LOG_LEVEL, buildORValues(logLevels)));
    if (logSearchCriteria.getAscending() == null || logSearchCriteria.getAscending()) {
        query.addSort(COLUMN_NAME_LOG_TIME, SolrQuery.ORDER.asc);
    } else {
        query.addSort(COLUMN_NAME_LOG_TIME, SolrQuery.ORDER.desc);
    }
    if (logSearchCriteria.getStart() != null) {
        query.setStart(logSearchCriteria.getStart());
    }
    if (logSearchCriteria.getLimit() != null) {
        query.setRows(logSearchCriteria.getLimit());
    }
    LOG.debug("Querying to Solr: query => {}", query);
    long numFound;
    List<LogSearchResult.LogDocument> results = new ArrayList<>();
    try {
        QueryResponse response = solr.query(query);
        SolrDocumentList docList = response.getResults();
        numFound = docList.getNumFound();
        for (SolrDocument document : docList) {
            String appId = (String) document.getFieldValue(COLUMN_NAME_STREAMLINE_TOPOLOGY_ID);
            String componentName = (String) document.getFieldValue(COLUMN_NAME_STREAMLINE_COMPONENT_NAME);
            String logLevel = (String) document.getFieldValue(COLUMN_NAME_LOG_LEVEL);
            String logMessage = (String) document.getFieldValue(COLUMN_NAME_LOG_MESSAGE);
            String host = (String) document.getFieldValue(COLUMN_NAME_HOST);
            String port = (String) document.getFieldValue(COLUMN_NAME_STORM_WORKER_PORT);
            Date logDate = (Date) document.getFieldValue(COLUMN_NAME_LOG_TIME);
            long timestamp = logDate.toInstant().toEpochMilli();
            LogSearchResult.LogDocument logDocument = new LogSearchResult.LogDocument(appId, componentName, logLevel, logMessage, host, port != null ? Integer.parseInt(port) : null, timestamp);
            results.add(logDocument);
        }
    } catch (SolrServerException | IOException e) {
        // TODO: any fine-grained control needed?
        throw new RuntimeException(e);
    }
    return new LogSearchResult(numFound, results);
}
Also used : SolrServerException(org.apache.solr.client.solrj.SolrServerException) ArrayList(java.util.ArrayList) SolrDocumentList(org.apache.solr.common.SolrDocumentList) IOException(java.io.IOException) SolrQuery(org.apache.solr.client.solrj.SolrQuery) Date(java.util.Date) SolrDocument(org.apache.solr.common.SolrDocument) QueryResponse(org.apache.solr.client.solrj.response.QueryResponse) LogSearchResult(com.hortonworks.streamline.streams.logsearch.LogSearchResult)

Aggregations

LogSearchResult (com.hortonworks.streamline.streams.logsearch.LogSearchResult)4 QueryParameter (com.github.tomakehurst.wiremock.http.QueryParameter)3 LoggedRequest (com.github.tomakehurst.wiremock.verification.LoggedRequest)3 LogSearchCriteria (com.hortonworks.streamline.streams.logsearch.LogSearchCriteria)3 Test (org.junit.Test)3 Instant (java.time.Instant)2 IOException (java.io.IOException)1 ArrayList (java.util.ArrayList)1 Date (java.util.Date)1 SolrQuery (org.apache.solr.client.solrj.SolrQuery)1 SolrServerException (org.apache.solr.client.solrj.SolrServerException)1 QueryResponse (org.apache.solr.client.solrj.response.QueryResponse)1 SolrDocument (org.apache.solr.common.SolrDocument)1 SolrDocumentList (org.apache.solr.common.SolrDocumentList)1