blob: 3ee61d5485bfdd74d254249a333f545671a3486f [file] [log] [blame]
<!DOCTYPE html>
<!--
| Generated by Apache Maven Doxia Site Renderer 1.8 from src/site/markdown/metron-platform/metron-parsing/metron-parsers-common/3rdPartyParser.md at 2019-05-14
| Rendered using Apache Maven Fluido Skin 1.7
-->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="Date-Revision-yyyymmdd" content="20190514" />
<meta http-equiv="Content-Language" content="en" />
<title>Metron &#x2013; Custom Metron Parsers</title>
<link rel="stylesheet" href="../../../css/apache-maven-fluido-1.7.min.css" />
<link rel="stylesheet" href="../../../css/site.css" />
<link rel="stylesheet" href="../../../css/print.css" media="print" />
<script type="text/javascript" src="../../../js/apache-maven-fluido-1.7.min.js"></script>
<script type="text/javascript">
$( document ).ready( function() { $( '.carousel' ).carousel( { interval: 3500 } ) } );
</script>
</head>
<body class="topBarDisabled">
<div class="container-fluid">
<div id="banner">
<div class="pull-left"><a href="http://metron.apache.org/" id="bannerLeft"><img src="../../../images/metron-logo.png" alt="Apache Metron" width="148px" height="48px"/></a></div>
<div class="pull-right"></div>
<div class="clear"><hr/></div>
</div>
<div id="breadcrumbs">
<ul class="breadcrumb">
<li class=""><a href="http://www.apache.org" class="externalLink" title="Apache">Apache</a><span class="divider">/</span></li>
<li class=""><a href="http://metron.apache.org/" class="externalLink" title="Metron">Metron</a><span class="divider">/</span></li>
<li class=""><a href="../../../index.html" title="Documentation">Documentation</a><span class="divider">/</span></li>
<li class="active ">Custom Metron Parsers</li>
<li id="publishDate" class="pull-right"><span class="divider">|</span> Last Published: 2019-05-14</li>
<li id="projectVersion" class="pull-right">Version: 0.7.1</li>
</ul>
</div>
<div class="row-fluid">
<div id="leftColumn" class="span2">
<div class="well sidebar-nav">
<ul class="nav nav-list">
<li class="nav-header">User Documentation</li>
<li><a href="../../../index.html" title="Metron"><span class="icon-chevron-down"></span>Metron</a>
<ul class="nav nav-list">
<li><a href="../../../CONTRIBUTING.html" title="CONTRIBUTING"><span class="none"></span>CONTRIBUTING</a></li>
<li><a href="../../../Upgrading.html" title="Upgrading"><span class="none"></span>Upgrading</a></li>
<li><a href="../../../metron-analytics/index.html" title="Analytics"><span class="icon-chevron-right"></span>Analytics</a></li>
<li><a href="../../../metron-contrib/metron-docker/index.html" title="Docker"><span class="none"></span>Docker</a></li>
<li><a href="../../../metron-contrib/metron-performance/index.html" title="Performance"><span class="none"></span>Performance</a></li>
<li><a href="../../../metron-deployment/index.html" title="Deployment"><span class="icon-chevron-right"></span>Deployment</a></li>
<li><a href="../../../metron-interface/index.html" title="Interface"><span class="icon-chevron-right"></span>Interface</a></li>
<li><a href="../../../metron-platform/index.html" title="Platform"><span class="icon-chevron-down"></span>Platform</a>
<ul class="nav nav-list">
<li><a href="../../../metron-platform/Performance-tuning-guide.html" title="Performance-tuning-guide"><span class="none"></span>Performance-tuning-guide</a></li>
<li><a href="../../../metron-platform/metron-common/index.html" title="Common"><span class="none"></span>Common</a></li>
<li><a href="../../../metron-platform/metron-data-management/index.html" title="Data-management"><span class="none"></span>Data-management</a></li>
<li><a href="../../../metron-platform/metron-elasticsearch/index.html" title="Elasticsearch"><span class="none"></span>Elasticsearch</a></li>
<li><a href="../../../metron-platform/metron-enrichment/index.html" title="Enrichment"><span class="icon-chevron-right"></span>Enrichment</a></li>
<li><a href="../../../metron-platform/metron-hbase-server/index.html" title="Hbase-server"><span class="none"></span>Hbase-server</a></li>
<li><a href="../../../metron-platform/metron-indexing/index.html" title="Indexing"><span class="none"></span>Indexing</a></li>
<li><a href="../../../metron-platform/metron-job/index.html" title="Job"><span class="none"></span>Job</a></li>
<li><a href="../../../metron-platform/metron-management/index.html" title="Management"><span class="none"></span>Management</a></li>
<li><a href="../../../metron-platform/metron-parsing/index.html" title="Parsing"><span class="icon-chevron-down"></span>Parsing</a>
<ul class="nav nav-list">
<li><a href="../../../metron-platform/metron-parsing/metron-parsers/index.html" title="Parsers"><span class="icon-chevron-right"></span>Parsers</a></li>
<li><a href="../../../metron-platform/metron-parsing/metron-parsers-common/index.html" title="Parsers-common"><span class="icon-chevron-down"></span>Parsers-common</a>
<ul class="nav nav-list">
<li class="active"><a href="#"><span class="none"></span>3rdPartyParser</a></li>
<li><a href="../../../metron-platform/metron-parsing/metron-parsers-common/ParserChaining.html" title="ParserChaining"><span class="none"></span>ParserChaining</a></li>
<li><a href="../../../metron-platform/metron-parsing/metron-parsers-common/message-parser-implementation-notes.html" title="message-parser-implementation-notes"><span class="none"></span>message-parser-implementation-notes</a></li>
<li><a href="../../../metron-platform/metron-parsing/metron-parsers-common/parser-testing.html" title="parser-testing"><span class="none"></span>parser-testing</a></li>
<li><a href="../../../metron-platform/metron-parsing/metron-parsers-common/src/test/java/org/apache/metron/parsers/paloalto/index.html" title="Paloalto"><span class="none"></span>Paloalto</a></li>
</ul>
</li>
<li><a href="../../../metron-platform/metron-parsing/metron-parsing-storm/index.html" title="Parsing-storm"><span class="none"></span>Parsing-storm</a></li>
</ul>
</li>
<li><a href="../../../metron-platform/metron-pcap-backend/index.html" title="Pcap-backend"><span class="none"></span>Pcap-backend</a></li>
<li><a href="../../../metron-platform/metron-solr/index.html" title="Solr"><span class="none"></span>Solr</a></li>
<li><a href="../../../metron-platform/metron-writer/index.html" title="Writer"><span class="none"></span>Writer</a></li>
</ul>
</li>
<li><a href="../../../metron-sensors/index.html" title="Sensors"><span class="icon-chevron-right"></span>Sensors</a></li>
<li><a href="../../../metron-stellar/stellar-3rd-party-example/index.html" title="Stellar-3rd-party-example"><span class="none"></span>Stellar-3rd-party-example</a></li>
<li><a href="../../../metron-stellar/stellar-common/index.html" title="Stellar-common"><span class="icon-chevron-right"></span>Stellar-common</a></li>
<li><a href="../../../metron-stellar/stellar-zeppelin/index.html" title="Stellar-zeppelin"><span class="none"></span>Stellar-zeppelin</a></li>
<li><a href="../../../use-cases/index.html" title="Use-cases"><span class="icon-chevron-right"></span>Use-cases</a></li>
</ul>
</li>
</ul>
<hr />
<div id="poweredBy">
<div class="clear"></div>
<div class="clear"></div>
<div class="clear"></div>
<div class="clear"></div>
<a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="../../../images/logos/maven-feather.png" /></a>
</div>
</div>
</div>
<div id="bodyColumn" class="span10" >
<!--
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
http://www.apache.org/licenses/LICENSE-2.0
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.
-->
<h1>Custom Metron Parsers</h1>
<p><a name="Custom_Metron_Parsers"></a></p>
<p>We have many stock parsers for normal operations. Some of these are networking and cybersecurity focused (e.g. the ASA Parser), some of these are general purpose (e.g. the CSVParser), but inevitably users will want to extend the system to process their own data formats. To enable this, this is a walkthrough of how to create and use a custom parser within Metron.</p>
<p><a name="Writing_A_Custom_Parser"></a></p>
<h1>Writing A Custom Parser</h1>
<p>Before we can use a parser, we will need to create a custom parser. The parser is the workhorse of Metron ingest. It provides the mapping between the raw data coming in via the Kafka value and a <tt>JSONObject</tt>, the internal data structure provided.</p>
<div class="section">
<h2><a name="Implementation"></a>Implementation</h2>
<p>In order to do create a custom parser, we need to do one of the following:</p>
<ul>
<li>Write a class which conforms to the <tt>org.apache.metron.parsers.interfaces.MessageParser&lt;JSONObject&gt;</tt> and <tt>java.util.Serializable</tt> interfaces
<ul>
<li>Implement <tt>init()</tt>, <tt>validate(JSONObject message)</tt>, and <tt>List&lt;JSONObject&gt; parse(byte[] rawMessage)</tt></li>
</ul>
</li>
<li>Write a class which extends <tt>org.apache.metron.parsers.BasicParser</tt>
<ul>
<li>Provides convenience implementations to <tt>validate</tt> which ensures <tt>timestamp</tt> and <tt>original_string</tt> fields exist.</li>
</ul>
</li>
</ul></div>
<div class="section">
<h2><a name="Example"></a>Example</h2>
<p>In order to illustrate how this might be done, let&#x2019;s create a very simple parser that takes a comma separated pair and creates a couple of fields:</p>
<ul>
<li><tt>original_string</tt> &#x2013; the raw data</li>
<li><tt>timestamp</tt> &#x2013; the current time</li>
<li><tt>first</tt> &#x2013; the first field of the comma separated pair</li>
<li><tt>last</tt> &#x2013; the last field of the comma separated pair</li>
</ul>
<p>For this demonstration, let&#x2019;s create a maven project to compile our project. We&#x2019;ll call it <tt>extra_parsers</tt>, so in your workspace, let&#x2019;s set up the maven project:</p>
<ul>
<li>
<p>Create the maven infrastructure for <tt>extra_parsers</tt> via</p>
<div>
<div>
<pre class="source">mkdir -p extra_parsers/src/{main,test}/java
</pre></div></div>
</li>
<li>
<p>Create a pom file indicating how we should build our parsers by editing <tt>extra_parsers/pom.xml</tt> with the following content:</p>
<div>
<div>
<pre class="source">&lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&quot;&gt;
&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
&lt;groupId&gt;com.3rdparty&lt;/groupId&gt;
&lt;artifactId&gt;extra-parsers&lt;/artifactId&gt;
&lt;packaging&gt;jar&lt;/packaging&gt;
&lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
&lt;name&gt;extra-parsers&lt;/name&gt;
&lt;url&gt;http://thirdpartysoftware.org&lt;/url&gt;
&lt;properties&gt;
&lt;!-- The java version to conform to. Metron works all the way to 1.8 --&gt;
&lt;java_version&gt;1.8&lt;/java_version&gt;
&lt;!-- The version of Metron that we'll be targetting. --&gt;
&lt;metron_version&gt;0.4.1&lt;/metron_version&gt;
&lt;!-- To complete the simulation, we'll depend on a common dependency --&gt;
&lt;guava_version&gt;19.0&lt;/guava_version&gt;
&lt;!-- We will shade our dependencies to create a single jar at the end --&gt;
&lt;shade_version&gt;2.4.3&lt;/shade_version&gt;
&lt;/properties&gt;
&lt;dependencies&gt;
&lt;!--
We want to depend on Metron, but ensure that the scope is &quot;provided&quot;
as we do not want to include it in our bundle.
--&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.apache.metron&lt;/groupId&gt;
&lt;artifactId&gt;metron-parsers-common&lt;/artifactId&gt;
&lt;version&gt;${metron_version}&lt;/version&gt;
&lt;scope&gt;provided&lt;/scope&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;com.google.guava&lt;/groupId&gt;
&lt;artifactId&gt;guava&lt;/artifactId&gt;
&lt;version&gt;${guava_version}&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;junit&lt;/groupId&gt;
&lt;artifactId&gt;junit&lt;/artifactId&gt;
&lt;version&gt;3.8.1&lt;/version&gt;
&lt;scope&gt;test&lt;/scope&gt;
&lt;/dependency&gt;
&lt;/dependencies&gt;
&lt;build&gt;
&lt;plugins&gt;
&lt;!-- We will set up the shade plugin to create a single jar at the
end of the build lifecycle. We will exclude some things and
relocate others to simulate a real situation.
One thing to note is that it's a good practice to shade and
relocate common libraries that may be dependencies in Metron.
Your jar will be merged with the parsers jar, so the metron
version will be included for all overlapping classes.
So, shade and relocate to ensure that YOUR version of the library is used.
--&gt;
&lt;plugin&gt;
&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
&lt;artifactId&gt;maven-shade-plugin&lt;/artifactId&gt;
&lt;version&gt;${shade_version}&lt;/version&gt;
&lt;configuration&gt;
&lt;createDependencyReducedPom&gt;true&lt;/createDependencyReducedPom&gt;
&lt;artifactSet&gt;
&lt;excludes&gt;
&lt;!-- Exclude slf4j for no reason other than to illustrate how to exclude dependencies.
The metron team has nothing against slf4j. :-)
--&gt;
&lt;exclude&gt;*slf4j*&lt;/exclude&gt;
&lt;/excludes&gt;
&lt;/artifactSet&gt;
&lt;/configuration&gt;
&lt;executions&gt;
&lt;execution&gt;
&lt;phase&gt;package&lt;/phase&gt;
&lt;goals&gt;
&lt;goal&gt;shade&lt;/goal&gt;
&lt;/goals&gt;
&lt;configuration&gt;
&lt;shadedArtifactAttached&gt;true&lt;/shadedArtifactAttached&gt;
&lt;shadedClassifierName&gt;uber&lt;/shadedClassifierName&gt;
&lt;filters&gt;
&lt;filter&gt;
&lt;!-- Sometimes these get added and confuse the uber jar out of shade --&gt;
&lt;artifact&gt;*:*&lt;/artifact&gt;
&lt;excludes&gt;
&lt;exclude&gt;META-INF/*.SF&lt;/exclude&gt;
&lt;exclude&gt;META-INF/*.DSA&lt;/exclude&gt;
&lt;exclude&gt;META-INF/*.RSA&lt;/exclude&gt;
&lt;/excludes&gt;
&lt;/filter&gt;
&lt;/filters&gt;
&lt;relocations&gt;
&lt;!-- Relocate guava as it's used in Metron and I really want 0.19 --&gt;
&lt;relocation&gt;
&lt;pattern&gt;com.google&lt;/pattern&gt;
&lt;shadedPattern&gt;com.thirdparty.guava&lt;/shadedPattern&gt;
&lt;/relocation&gt;
&lt;/relocations&gt;
&lt;artifactSet&gt;
&lt;excludes&gt;
&lt;!-- We can also exclude by artifactId and groupId --&gt;
&lt;exclude&gt;storm:storm-core:*&lt;/exclude&gt;
&lt;exclude&gt;storm:storm-lib:*&lt;/exclude&gt;
&lt;exclude&gt;org.slf4j.impl*&lt;/exclude&gt;
&lt;exclude&gt;org.slf4j:slf4j-log4j*&lt;/exclude&gt;
&lt;/excludes&gt;
&lt;/artifactSet&gt;
&lt;/configuration&gt;
&lt;/execution&gt;
&lt;/executions&gt;
&lt;/plugin&gt;
&lt;!--
We want to make sure we compile using java 1.8.
--&gt;
&lt;plugin&gt;
&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
&lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
&lt;version&gt;3.5.1&lt;/version&gt;
&lt;configuration&gt;
&lt;forceJavacCompilerUse&gt;true&lt;/forceJavacCompilerUse&gt;
&lt;source&gt;${java_version}&lt;/source&gt;
&lt;compilerArgument&gt;-Xlint:unchecked&lt;/compilerArgument&gt;
&lt;target&gt;${java_version}&lt;/target&gt;
&lt;showWarnings&gt;true&lt;/showWarnings&gt;
&lt;/configuration&gt;
&lt;/plugin&gt;
&lt;/plugins&gt;
&lt;/build&gt;
&lt;/project&gt;
</pre></div></div>
</li>
<li>
<p>Now let&#x2019;s create our parser <tt>com.thirdparty.SimpleParser</tt> by creating the file <tt>extra-parsers/src/main/java/com/thirdparty/SimpleParser.java</tt> with the following content:</p>
<div>
<div>
<pre class="source">package com.thirdparty;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import org.apache.metron.parsers.BasicParser;
import org.json.simple.JSONObject;
import java.util.List;
import java.util.Map;
public class SimpleParser extends BasicParser {
@Override
public void init() {
}
@Override
public List&lt;JSONObject&gt; parse(byte[] bytes) {
String input = new String(bytes);
Iterable&lt;String&gt; it = Splitter.on(&quot;,&quot;).split(input);
JSONObject ret = new JSONObject();
ret.put(&quot;original_string&quot;, input);
ret.put(&quot;timestamp&quot;, System.currentTimeMillis());
ret.put(&quot;first&quot;, Iterables.getFirst(it, &quot;missing&quot;));
ret.put(&quot;last&quot;, Iterables.getLast(it, &quot;missing&quot;));
return ImmutableList.of(ret);
}
@Override
public void configure(Map&lt;String, Object&gt; map) {
}
}
</pre></div></div>
</li>
<li>Compile the parser via <tt>mvn clean package</tt> in <tt>extra_parsers</tt></li>
<li>
<p>This will create a jar containing your parser and its dependencies (sans Metron dependencies) in <tt>extra-parsers/target/extra-parsers-1.0-SNAPSHOT-uber.jar</tt></p>
</li>
</ul>
<p><a name="Deploying_Your_Custom_Parser"></a></p>
<h1>Deploying Your Custom Parser</h1>
<p>In order to deploy your newly built custom parser, you would place the jar file above in the <tt>$METRON_HOME/parser_contrib</tt> directory on the Metron host (i.e. any host you would start parsers from or, alternatively, where the Metron REST is hosted).</p></div>
<div class="section">
<h2><a name="Example"></a>Example</h2>
<p>Let&#x2019;s work through deploying the example above.</p>
<div class="section">
<h3><a name="Preliminaries"></a>Preliminaries</h3>
<p>We assume that the following environment variables are set:</p>
<ul>
<li><tt>METRON_HOME</tt> - the home directory for metron</li>
<li><tt>ZOOKEEPER</tt> - The zookeeper quorum (comma separated with port specified: e.g. <tt>node1:2181</tt> for full-dev)</li>
<li><tt>BROKERLIST</tt> - The Kafka broker list (comma separated with port specified: e.g. <tt>node1:6667</tt> for full-dev)</li>
<li><tt>ES_HOST</tt> - The elasticsearch master (and port) e.g. <tt>node1:9200</tt> for full-dev.</li>
</ul>
<p>Also, this does not assume that you are using a kerberized cluster. If you are, then the parser start command will adjust slightly to include the security protocol.</p></div>
<div class="section">
<h3><a name="Copy_the_jar_file_up"></a>Copy the jar file up</h3>
<p>Copy the jar file located in <tt>extra-parsers/target/extra-parsers-1.0-SNAPSHOT-uber.jar</tt> to <tt>$METRON_HOME/parser_contrib</tt> and ensure the permissions are such that the <tt>metron</tt> user can read and execute.</p></div>
<div class="section">
<h3><a name="Restart_the_REST_service_in_Ambari"></a>Restart the REST service in Ambari</h3>
<p>In order for new parsers to be picked up, the REST service must be restarted. You can do that from within Ambari by restarting the <tt>Metron REST</tt> service.</p></div>
<div class="section">
<h3><a name="Create_a_Kafka_Topic"></a>Create a Kafka Topic</h3>
<p>Create a kafka topic, let&#x2019;s call it <tt>test</tt>.</p>
<div>
<div>
<pre class="source">KAFKA_HOME=/usr/hdp/current/kafka-broker
$KAFKA_HOME/bin/kafka-topics.sh --zookeeper $ZOOKEEPER --create --topic test --partitions 1 --replication-factor 1
</pre></div></div>
<p>Note, in a real deployment, that topic would be named something more descriptive and would have replication factor and partitions set to something less trivial.</p></div>
<div class="section">
<h3><a name="Configure_Test_Parser"></a>Configure Test Parser</h3>
<p>Create the a file called <tt>$METRON_HOME/config/zookeeper/parsers/test.json</tt> with the following content:</p>
<div>
<div>
<pre class="source">{
&quot;parserClassName&quot;:&quot;com.thirdparty.SimpleParser&quot;,
&quot;sensorTopic&quot;:&quot;test&quot;
}
</pre></div></div>
</div>
<div class="section">
<h3><a name="Push_the_Zookeeper_Configs"></a>Push the Zookeeper Configs</h3>
<p>Now push the config to Zookeeper with the following command.</p>
<div>
<div>
<pre class="source">$METRON_HOME/bin/zk_load_configs.sh -m PUSH -i $METRON_HOME/config/zookeeper/ -z $ZOOKEEPER
</pre></div></div>
</div>
<div class="section">
<h3><a name="Start_Parser"></a>Start Parser</h3>
<p>Now we can start the parser and send some data through:</p>
<ul>
<li>
<p>Start the parser</p>
<div>
<div>
<pre class="source">$METRON_HOME/bin/start_parser_topology.sh -k $BROKERLIST -z $ZOOKEEPER -s test
</pre></div></div>
</li>
<li>
<p>Send example data through:</p>
<div>
<div>
<pre class="source">echo &quot;apache,metron&quot; | /usr/hdp/current/kafka-broker/bin/kafka-console-producer.sh --broker-list $BROKERLIST --topic test
</pre></div></div>
</li>
<li>
<p>Validate data was written in ES:</p>
<div>
<div>
<pre class="source">curl -XPOST &quot;http://$ES_HOST/test*/_search?pretty&quot; -d '
{
&quot;_source&quot; : [ &quot;original_string&quot;, &quot;timestamp&quot;, &quot;first&quot;, &quot;last&quot;]
}
'
</pre></div></div>
</li>
<li>
<p>This should yield something like:</p>
<div>
<div>
<pre class="source">{
&quot;took&quot; : 23,
&quot;timed_out&quot; : false,
&quot;_shards&quot; : {
&quot;total&quot; : 1,
&quot;successful&quot; : 1,
&quot;failed&quot; : 0
},
&quot;hits&quot; : {
&quot;total&quot; : 1,
&quot;max_score&quot; : 1.0,
&quot;hits&quot; : [ {
&quot;_index&quot; : &quot;test_index_2017.10.04.17&quot;,
&quot;_type&quot; : &quot;test_doc&quot;,
&quot;_id&quot; : &quot;3ae4dd4d-8c09-4f2a-93c0-26ec5508baaa&quot;,
&quot;_score&quot; : 1.0,
&quot;_source&quot; : {
&quot;original_string&quot; : &quot;apache,metron&quot;,
&quot;last&quot; : &quot;metron&quot;,
&quot;first&quot; : &quot;apache&quot;,
&quot;timestamp&quot; : 1507138373223
}
} ]
}
}
</pre></div></div>
</li>
</ul></div>
<div class="section">
<h3><a name="Via_the_Management_UI"></a>Via the Management UI</h3>
<p>As long as the REST service is restarted after new parsers are added to <tt>$METRON_HOME/parser_contrib</tt>, they are available in the UI to creating and deploying parsers.</p></div></div>
</div>
</div>
</div>
<hr/>
<footer>
<div class="container-fluid">
<div class="row-fluid">
© 2015-2016 The Apache Software Foundation. Apache Metron, Metron, Apache, the Apache feather logo,
and the Apache Metron project logo are trademarks of The Apache Software Foundation.
</div>
</div>
</footer>
</body>
</html>