Skip to content

Commit

Permalink
Splunk report extension (#521)
Browse files Browse the repository at this point in the history
Co-authored-by: Daniel.Smrcek <daniel.smrcek@embedit.cz>
  • Loading branch information
xsmrcek and Daniel.Smrcek authored Dec 10, 2020
1 parent e246544 commit c01c81c
Show file tree
Hide file tree
Showing 9 changed files with 190 additions and 1 deletion.
3 changes: 3 additions & 0 deletions jbehave-support-core/docs/Reporting.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ There are several extensions already prepared and ready to use:
- CACHE: copies cached server log(s) used within scenario execution
- Extension contains fail mode, which acts like TEMPLATE mode if test fails
- it can be turned on by using property: ssh.reporting.logOnFailure with value "true"
- `SplunkXmlReporterExtension` (copies Splunk queries and their results from [SplunkSteps](Splunk.md))
- Splunk implementation is still under active development and changes can/will be done.
- Reporting works with default implementation of `OneShotSearchSplunkClient` provided by us


To use these extensions simply register the wanted extension as a bean, e.g.:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.jbehavesupport.core.internal.splunk;

import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.jbehavesupport.core.splunk.SplunkSearchResultEntry;

@AllArgsConstructor
public class SplunkSearchContext {
@Getter
private List<SplunkSearchResultEntry> searchResults;
@Getter
private String query;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package org.jbehavesupport.core.report.extension;

import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import org.jbehavesupport.core.report.ReportContext;
import org.jbehavesupport.core.internal.splunk.SplunkSearchContext;
import org.jbehavesupport.core.splunk.SplunkSearchResultEntry;

public class SplunkXmlReporterExtension extends AbstractXmlReporterExtension {

private static final String SPLUNK_XML_REPORTER_EXTENSION = "splunk";
private static final String SEARCH_RESULT_TAG = "searchResult";
private static final String TIME_TAG = "time";
private static final String QUERY_TAG = "query";
private static final String MESSAGE_TAG = "message";
private static final String RECORD_TAG = "record";

private final List<SplunkSearchContext> searchResults = new ArrayList<>();

@Override
public String getName() {
return SPLUNK_XML_REPORTER_EXTENSION;
}

@Override
public void print(Writer writer, ReportContext reportContext) {
searchResults.forEach(query -> printSplunkSearchResult(writer, query));
searchResults.clear();
}

public void addSplunkSearchContext(SplunkSearchContext splunkSearchContext) {
searchResults.add(splunkSearchContext);
}

private void printSplunkSearchResult(Writer writer, SplunkSearchContext splunkSearchContext) {
printBegin(writer, SEARCH_RESULT_TAG);
printBegin(writer, QUERY_TAG);
printCData(writer, splunkSearchContext.getQuery());
printEnd(writer, QUERY_TAG);

for(SplunkSearchResultEntry searchResult : splunkSearchContext.getSearchResults()){
printBegin(writer, RECORD_TAG);
printBegin(writer, TIME_TAG);
printCData(writer, searchResult.getTime());
printEnd(writer, TIME_TAG);
printBegin(writer, MESSAGE_TAG);
printCData(writer, searchResult.getMessage());
printEnd(writer, MESSAGE_TAG);
printEnd(writer, RECORD_TAG);
}

printEnd(writer, SEARCH_RESULT_TAG);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import org.jbehavesupport.core.internal.splunk.SplunkSearchContext;
import org.jbehavesupport.core.report.extension.SplunkXmlReporterExtension;
import org.springframework.beans.factory.annotation.Autowired;

import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
Expand Down Expand Up @@ -53,6 +56,8 @@ public class OneShotSearchSplunkClient implements SplunkClient {
@NonNull
private final SplunkConfig config;
private Service service;
@Autowired(required = false)
private SplunkXmlReporterExtension splunkXmlReporterExtension;

/**
* {@inheritDoc}
Expand All @@ -61,7 +66,7 @@ public class OneShotSearchSplunkClient implements SplunkClient {
public List<SplunkSearchResultEntry> search(String query, String earliestTime, String latestTime, SplunkOutputModes splunkOutputMode) {
validateTimes(earliestTime, latestTime);
try {
return processSearchResult(getSplunkService().oneshotSearch(
List<SplunkSearchResultEntry> searchResults = processSearchResult(getSplunkService().oneshotSearch(
query,
toArgs(
Arrays.asList(
Expand All @@ -71,6 +76,10 @@ public List<SplunkSearchResultEntry> search(String query, String earliestTime, S
)
)
), splunkOutputMode);
if (splunkXmlReporterExtension != null){
splunkXmlReporterExtension.addSplunkSearchContext(new SplunkSearchContext(searchResults, query));
}
return searchResults;
} catch (IOException e) {
throw new IllegalArgumentException("Splunk search failed", e);
}
Expand Down
4 changes: 4 additions & 0 deletions jbehave-support-core/src/main/resources/functions.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ function reportReady() {
showHideAllInElement('#sql-queries-body');
});

$('#expand-all-splunk-queries').click(function () {
showHideAllInElement('#splunk-queries-body');
});

$('#expand-all-step-screenshots').click(function () {
showHideAllInElement('#step-screen-shots');
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,17 @@
</a>
</li>
</xsl:if>
<xsl:if test="splunk">
<li class="nav-item">
<a class="nav-link">
<xsl:attribute name="href">
<xsl:value-of select="concat('#splunk-queries',$storyIndex)"/>
</xsl:attribute>
<i class="fa fa-file-text-o" aria-hidden="true"></i>
Splunk queries
</a>
</li>
</xsl:if>
</ul>
</nav>

Expand Down Expand Up @@ -194,6 +205,9 @@
<xsl:call-template name="serverLog">
<xsl:with-param name="storyIndex" select="$storyIndex"/>
</xsl:call-template>
<xsl:call-template name="splunk">
<xsl:with-param name="storyIndex" select="$storyIndex"/>
</xsl:call-template>
</main>
</div>
</xsl:for-each>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template name="splunk">
<xsl:param name="storyIndex"/>
<xsl:for-each select="splunk">
<p>
<div class="card">
<xsl:attribute name="id">
<xsl:value-of select="concat('splunk-queries',$storyIndex)"/>
</xsl:attribute>
<div class="card-header">
<i class="fa fa-file-text-o" aria-hidden="true"></i>
Splunk queries (<a href="#splunk-queries-body" id="expand-all-splunk-queries">Toggle all queries</a>)
<a href="#splunk-queries-body" data-toggle="collapse" class="float-right">Collapse</a>
</div>
<div id="splunk-queries-body" class="card-body collapse show">
<xsl:choose>
<xsl:when test="searchResult">
<xsl:call-template name="searchResult"/>
</xsl:when>
<xsl:otherwise>No splunk queries available</xsl:otherwise>
</xsl:choose>
</div>
</div>
</p>
</xsl:for-each>
</xsl:template>

<xsl:template name="searchResult">
<xsl:for-each select="searchResult">
<xsl:variable name="searchResultNum">
<xsl:number level="any"/>
</xsl:variable>

<div>
<xsl:attribute name="class">
<xsl:if test="not(record)">emptySplunkSearch</xsl:if>
</xsl:attribute>

<a data-toggle="collapse">
<xsl:attribute name="class">
<xsl:choose>
<xsl:when test="record">pointerCursor</xsl:when>
<xsl:otherwise>inactiveLink</xsl:otherwise>
</xsl:choose>
</xsl:attribute>

<xsl:if test="record">
<xsl:attribute name="href">
#search-result-<xsl:value-of select="$searchResultNum"/>
</xsl:attribute>
<i class="fa fa-plus-circle" aria-hidden="true"/>
</xsl:if>
<xsl:value-of select="query" disable-output-escaping="yes"/>
</a>

<div id="search-result-{$searchResultNum}" class="collapse">
<xsl:if test="record">
<table class="table table-sm table-hover">
<thead>
<tr>
<th>Time</th>
<th>Message</th>
</tr>
</thead>
<xsl:for-each select="record">
<tr>
<td>
<xsl:value-of select="time"/>
</td>
<td>
<xsl:value-of select="message"/>
</td>
</tr>
</xsl:for-each>
</table>>
</xsl:if>
</div>
</div>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>
1 change: 1 addition & 0 deletions jbehave-support-core/src/main/resources/report.xslt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<xsl:import href="report-generator/failScreenshotReport.xslt"/>
<xsl:import href="report-generator/screenshotReport.xslt"/>
<xsl:import href="report-generator/jmsXmlReport.xslt"/>
<xsl:import href="report-generator/splunkXmlReport.xslt"/>

<xsl:output method="html" doctype-system="about:legacy-compat"/>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import org.jbehavesupport.core.healthcheck.HealthCheck;
import org.jbehavesupport.core.healthcheck.HealthChecks;
import org.jbehavesupport.core.internal.FileNameResolver;
import org.jbehavesupport.core.report.extension.SplunkXmlReporterExtension;
import org.jbehavesupport.core.splunk.OneShotSearchSplunkClient;
import org.jbehavesupport.core.jms.JmsJaxbHandler;
import org.jbehavesupport.core.report.XmlReporterFactory;
Expand Down Expand Up @@ -148,6 +149,11 @@ public ScreenshotReporterExtension screenshotReporterExtension(TestContext testC
return new ScreenshotReporterExtension(testContext);
}

@Bean
public SplunkXmlReporterExtension splunkXmlReporterExtension(){
return new SplunkXmlReporterExtension();
}

@Bean
@Qualifier("TEST")
public RestServiceHandler testRestServiceHandler() {
Expand Down

0 comments on commit c01c81c

Please sign in to comment.