Skip to content

Commit 110158c

Browse files
committed
traces in the quick start
1 parent 43b8178 commit 110158c

36 files changed

+938
-8
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package com.marklogic.hub;
2+
3+
import com.fasterxml.jackson.databind.JsonNode;
4+
import com.marklogic.client.DatabaseClient;
5+
import com.marklogic.client.MarkLogicIOException;
6+
import com.marklogic.client.document.GenericDocumentManager;
7+
import com.marklogic.client.helper.LoggingObject;
8+
import com.marklogic.client.io.SearchHandle;
9+
import com.marklogic.client.io.StringHandle;
10+
import com.marklogic.client.query.QueryManager;
11+
import com.marklogic.client.query.RawCombinedQueryDefinition;
12+
import com.marklogic.client.query.StructuredQueryBuilder;
13+
import com.marklogic.client.query.StructuredQueryDefinition;
14+
15+
import javax.xml.XMLConstants;
16+
import javax.xml.stream.XMLOutputFactory;
17+
import javax.xml.stream.XMLStreamWriter;
18+
import java.io.ByteArrayOutputStream;
19+
import java.io.OutputStream;
20+
import java.util.ArrayList;
21+
22+
public class TraceManager extends LoggingObject {
23+
24+
private static final String SEARCH_OPTIONS_NAME = "traces";
25+
private static final String SEARCH_API_NS = "http://marklogic.com/appservices/search";
26+
27+
private DatabaseClient databaseClient;
28+
29+
public TraceManager(DatabaseClient client) {
30+
31+
this.databaseClient = client;
32+
}
33+
34+
private XMLStreamWriter makeSerializer(OutputStream out) {
35+
XMLOutputFactory factory = XMLOutputFactory.newInstance();
36+
factory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true);
37+
38+
try {
39+
XMLStreamWriter serializer = factory.createXMLStreamWriter(out, "UTF-8");
40+
41+
serializer.setDefaultNamespace(SEARCH_API_NS);
42+
serializer.setPrefix("xs", XMLConstants.W3C_XML_SCHEMA_NS_URI);
43+
44+
return serializer;
45+
} catch (Exception e) {
46+
throw new MarkLogicIOException(e);
47+
}
48+
}
49+
50+
private String serializeQuery(StructuredQueryBuilder sb, StructuredQueryBuilder.AndQuery query, String sortOrder) {
51+
String result;
52+
try {
53+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
54+
XMLStreamWriter serializer = makeSerializer(baos);
55+
56+
serializer.writeStartElement(SEARCH_API_NS, "search");
57+
serializer.writeStartElement(SEARCH_API_NS, "query");
58+
59+
60+
for (String prefix : sb.getNamespaces().getAllPrefixes()) {
61+
serializer.writeNamespace(prefix, sb.getNamespaces().getNamespaceURI(prefix));
62+
}
63+
64+
query.innerSerialize(serializer);
65+
66+
serializer.writeStartElement("operator-state");
67+
serializer.writeStartElement("operator-name");
68+
serializer.writeCharacters("sort");
69+
serializer.writeEndElement();
70+
71+
serializer.writeStartElement("state-name");
72+
serializer.writeCharacters(sortOrder);
73+
serializer.writeEndElement();
74+
75+
serializer.writeEndElement();
76+
77+
serializer.writeEndElement();
78+
serializer.writeEndElement();
79+
result = baos.toString("UTF-8");
80+
} catch (Exception e) {
81+
throw new MarkLogicIOException(e);
82+
}
83+
return result;
84+
}
85+
86+
public SearchHandle getTraces(String query, long start, long count) {
87+
QueryManager queryMgr = databaseClient.newQueryManager();
88+
89+
StructuredQueryBuilder sb = queryMgr.newStructuredQueryBuilder(SEARCH_OPTIONS_NAME);
90+
91+
ArrayList<StructuredQueryDefinition> queries = new ArrayList<>();
92+
if (query != null && !query.equals("")) {
93+
queries.add(sb.term(query));
94+
}
95+
96+
StructuredQueryBuilder.AndQuery sqd = sb.and(queries.toArray(new StructuredQueryDefinition[0]));
97+
98+
String sort = "date-desc";
99+
String searchXml = serializeQuery(sb, sqd, sort);
100+
101+
RawCombinedQueryDefinition querydef = queryMgr.newRawCombinedQueryDefinition(new StringHandle(searchXml), SEARCH_OPTIONS_NAME);
102+
queryMgr.setPageLength(count);
103+
SearchHandle results = queryMgr.search(querydef, new SearchHandle(), start);
104+
return results;
105+
}
106+
107+
public JsonNode getTrace(String traceId) {
108+
GenericDocumentManager docMgr = databaseClient.newDocumentManager();
109+
return docMgr.readAs("/" + traceId, JsonNode.class);
110+
}
111+
}

marklogic-data-hub/src/main/java/com/marklogic/hub/commands/LoadHubModulesCommand.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,12 @@ private DatabaseClient jobDbClient() {
119119
return DatabaseClientFactory.newClient(hubConfig.host, hubConfig.jobPort, hubConfig.jobDbName, hubConfig.adminUsername, hubConfig.adminPassword, authMethod);
120120
}
121121

122+
private DatabaseClient traceDbClient() {
123+
DatabaseClientFactory.Authentication authMethod = DatabaseClientFactory.Authentication
124+
.valueOf(hubConfig.authMethod.toUpperCase());
125+
return DatabaseClientFactory.newClient(hubConfig.host, hubConfig.tracePort, hubConfig.traceDbName, hubConfig.adminUsername, hubConfig.adminPassword, authMethod);
126+
}
127+
122128
@Override
123129
public void execute(CommandContext context) {
124130
initializeActiveSession(context);
@@ -184,11 +190,23 @@ public void execute(CommandContext context) {
184190
duration = (endTime - startTime);
185191
logger.info("Rest Transforms took: " + (duration / 1000000000) + " seconds");
186192

193+
logger.info("Loading Trace Rest Options");
194+
// switch to job db to do this:
195+
this.modulesLoader.setDatabaseClient(traceDbClient());
196+
startTime = System.nanoTime();
197+
resources = findResources("classpath*:/ml-modules/options", "/**/traces.xml");
198+
for (Resource r : resources) {
199+
this.modulesLoader.installQueryOptions(r);
200+
}
201+
endTime = System.nanoTime();
202+
duration = (endTime - startTime);
203+
logger.info("Trace Rest Options took: " + (duration / 1000000000) + " seconds");
204+
187205
logger.info("Loading Job Rest Options");
188206
// switch to job db to do this:
189207
this.modulesLoader.setDatabaseClient(jobDbClient());
190208
startTime = System.nanoTime();
191-
resources = findResources("classpath*:/ml-modules/options", "/**/*.xml");
209+
resources = findResources("classpath*:/ml-modules/options", "/**/spring-batch.xml");
192210
for (Resource r : resources) {
193211
this.modulesLoader.installQueryOptions(r);
194212
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.marklogic.hub.trace;
2+
3+
public class Trace {
4+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<options xmlns="http://marklogic.com/appservices/search">
2+
<additional-query>
3+
<cts:collection-query xmlns:cts="http://marklogic.com/cts">
4+
<cts:uri>trace</cts:uri>
5+
</cts:collection-query>
6+
</additional-query>
7+
<constraint name="flowType">
8+
<value>
9+
<element name="flowType" ns="" />
10+
</value>
11+
</constraint>
12+
<constraint name="flowFormat">
13+
<value>
14+
<element name="format" ns="" />
15+
</value>
16+
</constraint>
17+
<constraint name="identifier">
18+
<value>
19+
<element name="identifier" ns="" />
20+
</value>
21+
</constraint>
22+
<operator name="sort">
23+
<state name="date-desc">
24+
<sort-order direction="descending" type="xs:dateTime">
25+
<element ns="" name="created"/>
26+
</sort-order>
27+
</state>
28+
<state name="date-asc">
29+
<sort-order direction="ascending" type="xs:dateTime">
30+
<element ns="" name="created"/>
31+
</sort-order>
32+
</state>
33+
</operator>
34+
<transform-results apply="raw" />
35+
</options>

marklogic-data-hub/src/main/resources/ml-modules/root/com.marklogic.hub/lib/flow-lib.xqy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -759,8 +759,8 @@ declare function flow:run-writer(
759759
trace:plugin-trace(
760760
$identifier,
761761
$module-uri,
762-
$flow-type,
763762
"writer",
763+
$flow-type,
764764
$envelope,
765765
if ($envelope instance of element()) then ()
766766
else null-node {},

marklogic-data-hub/src/main/resources/ml-modules/root/com.marklogic.hub/lib/trace-lib.xqy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ declare function trace:write-trace()
7979
element created { map:get($current-trace, "created") },
8080
element identifier { map:get($current-trace, "identifier") },
8181
element flowType { map:get($current-trace, "flowType") },
82+
element hasError { trace:has-errors() },
8283
for $key in ("collectorPlugin", "contentPlugin", "headersPlugin", "triplesPlugin", "writerPlugin")
8384
let $m := map:get($current-trace, $key)
8485
return

marklogic-data-hub/src/main/resources/ml-modules/transforms/run-flow.xqy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ declare function runFlow:transform(
3535
if ($envelope instance of element()) then ()
3636
else
3737
null-node {},
38-
$flow/hub:type,
3938
"writer",
39+
$flow/hub:type,
4040
$envelope,
4141
if ($envelope instance of element()) then ()
4242
else
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.marklogic.hub;
2+
3+
import org.junit.Test;
4+
5+
public class TraceManagerTest extends HubTestBase {
6+
@Test
7+
public void getTraces() throws Exception {
8+
TraceManager tm = new TraceManager(traceClient);
9+
tm.getTraces(null, 1, 10);
10+
}
11+
12+
}

quick-start/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,15 @@
8282
"angular2-clipboard": "^0.2.12",
8383
"angular2-mdl": "^1.0.0-rc1",
8484
"angular2-moment": "^0.8.1",
85+
"codemirror": "^5.17.0",
8586
"core-js": "^2.4.0",
8687
"font-awesome": "^4.6.3",
8788
"http-server": "^0.9.0",
8889
"ie-shim": "^0.1.0",
8990
"lodash": "^4.13.1",
9091
"material-design-icons": "^2.2.3",
9192
"material-design-lite": "^1.1.3",
93+
"ng2-codemirror": "^0.1.0",
9294
"rxjs": "5.0.0-beta.6",
9395
"sockjs-client": "^1.1.1",
9496
"stompjs": "^2.3.3",
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.marklogic.quickstart;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.boot.context.web.SpringBootServletInitializer;
6+
import org.springframework.scheduling.annotation.EnableAsync;
7+
8+
@SpringBootApplication
9+
@EnableAsync
10+
public class WarApplication extends SpringBootServletInitializer {
11+
public static void main(String[] args) {
12+
SpringApplication.run(WarApplication.class, args);
13+
}
14+
}

0 commit comments

Comments
 (0)