You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2021/10/25 12:11:47 UTC

[tinkerpop] branch master updated (447f455 -> e0ddcc3)

This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git.


    from 447f455  Merge branch '3.5-dev'
     new 7dccf95  TINKERPOP-2630 Added some docs around GraphSON 1.0 CTR
     new 77aa863  Merge branch '3.4-dev' into 3.5-dev
     new e0ddcc3  Merge branch '3.5-dev'

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 docs/src/reference/gremlin-applications.asciidoc | 49 ++++++++++++++++--------
 1 file changed, 34 insertions(+), 15 deletions(-)

[tinkerpop] 03/03: Merge branch '3.5-dev'

Posted by sp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit e0ddcc31f2bce822eab00d3d8be29f10de191efe
Merge: 447f455 77aa863
Author: Stephen Mallette <st...@amazon.com>
AuthorDate: Mon Oct 25 08:11:36 2021 -0400

    Merge branch '3.5-dev'

 docs/src/reference/gremlin-applications.asciidoc | 49 ++++++++++++++++--------
 1 file changed, 34 insertions(+), 15 deletions(-)


[tinkerpop] 01/03: TINKERPOP-2630 Added some docs around GraphSON 1.0 CTR

Posted by sp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 7dccf9524ccb0d87fca3e46ee1b3b82110a42fae
Author: Stephen Mallette <st...@amazon.com>
AuthorDate: Mon Oct 25 08:03:50 2021 -0400

    TINKERPOP-2630 Added some docs around GraphSON 1.0 CTR
---
 docs/src/reference/gremlin-applications.asciidoc | 48 +++++++++++++++++-------
 1 file changed, 34 insertions(+), 14 deletions(-)

diff --git a/docs/src/reference/gremlin-applications.asciidoc b/docs/src/reference/gremlin-applications.asciidoc
index ffce0c0..ecd11b2 100644
--- a/docs/src/reference/gremlin-applications.asciidoc
+++ b/docs/src/reference/gremlin-applications.asciidoc
@@ -812,6 +812,7 @@ the one in `conf/remote.yaml` should perform better.
 NOTE: Console commands, those that begin with a colon (e.g. `:x`, `:remote`) do not execute remotely when in this mode.
 They are all still evaluated locally.
 
+[[connecting-via-http]]
 === Connecting via HTTP
 
 image:gremlin-rexster.png[width=225,float=left] While the default behavior for Gremlin Server is to provide a
@@ -1514,12 +1515,10 @@ link:https://tinkerpop.apache.org/docs/current/dev/io/#graphson[IO Documentation
 
 [source,yaml]
 ----
-  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0 }
-  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV2d0 }
+  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0 }
 ----
 
-The above configuration represents the default serialization under the `application/json` MIME type and produces JSON
-consistent with standard JSON data types.  It has the following configuration option:
+Gremlin Server is configured by default with GraphSON 3.0 as shown above. It has the following configuration option:
 
 [width="100%",cols="3,10,^2",options="header"]
 |=========================================================
@@ -1527,19 +1526,40 @@ consistent with standard JSON data types.  It has the following configuration op
 |ioRegistries |A list of `IoRegistry` implementations to be applied to the serializer. |_none_
 |=========================================================
 
+It is worth noting that GraphSON 1.0 still has some appeal for some users as it can be configured to produce an untyped
+JSON format which is a bit easier to consume than its successors which embed data types into the output. This version
+of GraphSON tends to be the one that users like to utilize when <<connecting-via-http,connecting via HTTP>> and is still
+used by some <<connecting-rgp, Remote Gremlin Providers>> for this purpose.
+
+To configure Gremlin Server this way, the `GraphSONMessageSerializerV1d0` must be included:
+
 [source,yaml]
-  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0 }
+----
+  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0 }
+  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0 }
+----
 
-When the standard JSON data types are not enough (e.g. need to identify the difference between `double` and `float`
-data types), the above configuration will embed types into the JSON itself.  The type embedding uses standard Java
-type names, so interpretation from non-JVM languages will be required.  It has the MIME type of
-`application/vnd.gremlin-v1.0+json` and the following configuration options:
+In the above situation, both `GraphSONMessageSerializerV1d0` and `GraphSONMessageSerializerV3d0` each bind to the
+`application/json` mime type. When such conflicts arise, Gremlin Server will use the order of the serializers to
+determine priority such that the first serializer to bind to a type will be used and the others ignored. The following
+log message will indicate how the server is ultimately configured:
 
-[width="100%",cols="3,10,^2",options="header"]
-|=========================================================
-|Key |Description |Default
-|ioRegistries |A list of `IoRegistry` implementations to be applied to the serializer. |_none_
-|=========================================================
+[source,text]
+----
+[INFO] AbstractChannelizer - Configured application/json with org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0
+[INFO] AbstractChannelizer - Configured application/vnd.gremlin-v3.0+json with org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0
+[INFO] AbstractChannelizer - application/json already has org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0 configured - it will not be replaced by org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, change order of serialization configuration if this is not desired.
+----
+
+Given the above, using GraphSON 3.0 under this configuration will require that the user specific the type:
+
+[source,text]
+----
+$ curl -X POST -d "{\"gremlin\":\"100-1\"}" "http://localhost:8182"
+{"requestId":"f8720ad9-2c8b-4eef-babe-21792a3e3157","status":{"message":"","code":200,"attributes":{}},"result":{"data":[99],"meta":{}}}
+$ curl -H "Accept:application/vnd.gremlin-v3.0+json" -X POST -d "{\"gremlin\":\"100-1\"}" "http://localhost:8182"
+{"requestId":"9fdf0892-d86c-41f2-94b5-092785c473eb","status":{"message":"","code":200,"attributes":{"@type":"g:Map","@value":[]}},"result":{"data":{"@type":"g:List","@value":[{"@type":"g:Int32","@value":99}]},"meta":{"@type":"g:Map","@value":[]}}
+----
 
 ===== Gryo
 

[tinkerpop] 02/03: Merge branch '3.4-dev' into 3.5-dev

Posted by sp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 77aa8636c577e6582708edd41ccc791fab2557c3
Merge: 5f3d3b0 7dccf95
Author: Stephen Mallette <st...@amazon.com>
AuthorDate: Mon Oct 25 08:11:30 2021 -0400

    Merge branch '3.4-dev' into 3.5-dev

 docs/src/reference/gremlin-applications.asciidoc | 49 ++++++++++++++++--------
 1 file changed, 34 insertions(+), 15 deletions(-)

diff --cc docs/src/reference/gremlin-applications.asciidoc
index 5372e12,ecd11b2..eb6c4df
--- a/docs/src/reference/gremlin-applications.asciidoc
+++ b/docs/src/reference/gremlin-applications.asciidoc
@@@ -1086,221 -1076,23 +1087,240 @@@ method for processing script evaluatio
  ===== TraversalOpProcessor
  
  The `TraversalOpProcessor` provides a way to accept traversals configured via <<connecting-via-drivers,withRemote()>>.
 +It has no special configuration settings.
 +
 +==== Serialization
 +
 +Gremlin Server can accept requests and return results using different serialization formats. Serializers implement the
 +`MessageSerializer` interface. In doing so, they express the list of mime types they expect to support. When
 +configuring multiple serializers it is possible for two or more serializers to support the same mime type. Such a
 +situation may be common with a generic mime type such as `application/json`. Serializers are added in the order that
 +they are encountered in the configuration file and the first one added for a specific mime type will not be overridden
 +by other serializers that also support it.
 +
 +The format of the serialization is configured by the `serializers` setting described in the table above.  Note that
 +some serializers have additional configuration options as defined by the `serializers[X].config` setting.  The
 +`config` setting is a `Map` where the keys and values get passed to the serializer at its initialization.  The
 +available and/or expected keys are dependent on the serializer being used.  Gremlin Server comes packaged with three
 +different serializers: GraphSON, Gryo, and GraphBinary (however, GraphSON and GraphBinary are the only two configured
 +by default).
 +
 +===== GraphSON
 +
 +The GraphSON serializer produces human readable output in JSON format and is a good configuration choice for those
 +trying to use TinkerPop from non-JVM languages.  JSON obviously has wide support across virtually all major
 +programming languages and can be consumed by a wide variety of tools. The format itself is described in the
 +link:https://tinkerpop.apache.org/docs/current/dev/io/#graphson[IO Documentation].
 +
 +[source,yaml]
 +----
-   - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0 }
-   - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV2d0 }
++  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0 }
 +----
 +
- The above configuration represents the default serialization under the `application/json` MIME type and produces JSON
- consistent with standard JSON data types.  It has the following configuration option:
++Gremlin Server is configured by default with GraphSON 3.0 as shown above. It has the following configuration option:
  
  [width="100%",cols="3,10,^2",options="header"]
  |=========================================================
 -|Name |Description |Default
 -|cacheExpirationTime |Time in milliseconds before side-effects from a `Traversal` will be evicted. |60000
 -|cacheMaxSize |The maximum number of entries in the side-effect cache. |1000
 +|Key |Description |Default
 +|ioRegistries |A list of `IoRegistry` implementations to be applied to the serializer. |_none_
 +|=========================================================
 +
++It is worth noting that GraphSON 1.0 still has some appeal for some users as it can be configured to produce an untyped
++JSON format which is a bit easier to consume than its successors which embed data types into the output. This version
++of GraphSON tends to be the one that users like to utilize when <<connecting-via-http,connecting via HTTP>> and is still
++used by some <<connecting-rgp, Remote Gremlin Providers>> for this purpose.
++
++To configure Gremlin Server this way, the `GraphSONMessageSerializerV1d0` must be included:
++
 +[source,yaml]
-   - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0 }
++----
++  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0 }
++  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0 }
++----
 +
- When the standard JSON data types are not enough (e.g. need to identify the difference between `double` and `float`
- data types), the above configuration will embed types into the JSON itself.  The type embedding uses standard Java
- type names, so interpretation from non-JVM languages will be required.  It has the MIME type of
- `application/vnd.gremlin-v1.0+json` and the following configuration options:
++In the above situation, both `GraphSONMessageSerializerV1d0` and `GraphSONMessageSerializerV3d0` each bind to the
++`application/json` mime type. When such conflicts arise, Gremlin Server will use the order of the serializers to
++determine priority such that the first serializer to bind to a type will be used and the others ignored. The following
++log message will indicate how the server is ultimately configured:
 +
- [width="100%",cols="3,10,^2",options="header"]
- |=========================================================
- |Key |Description |Default
- |ioRegistries |A list of `IoRegistry` implementations to be applied to the serializer. |_none_
- |=========================================================
++[source,text]
++----
++[INFO] AbstractChannelizer - Configured application/json with org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0
++[INFO] AbstractChannelizer - Configured application/vnd.gremlin-v3.0+json with org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0
++[INFO] AbstractChannelizer - application/json already has org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0 configured - it will not be replaced by org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, change order of serialization configuration if this is not desired.
++----
++
++Given the above, using GraphSON 3.0 under this configuration will require that the user specific the type:
++
++[source,text]
++----
++$ curl -X POST -d "{\"gremlin\":\"100-1\"}" "http://localhost:8182"
++{"requestId":"f8720ad9-2c8b-4eef-babe-21792a3e3157","status":{"message":"","code":200,"attributes":{}},"result":{"data":[99],"meta":{}}}
++$ curl -H "Accept:application/vnd.gremlin-v3.0+json" -X POST -d "{\"gremlin\":\"100-1\"}" "http://localhost:8182"
++{"requestId":"9fdf0892-d86c-41f2-94b5-092785c473eb","status":{"message":"","code":200,"attributes":{"@type":"g:Map","@value":[]}},"result":{"data":{"@type":"g:List","@value":[{"@type":"g:Int32","@value":99}]},"meta":{"@type":"g:Map","@value":[]}}
++----
 +
 +===== Gryo
 +
 +WARNING: Gryo is no longer the recommended serialization format for Gremlin Server. Consider using
 +<<server-graphbinary, GraphBinary>> instead.
 +
 +The Gryo serializer utilizes Kryo-based serialization which produces a binary output.  This format is best consumed
 +by JVM-based languages. The format itself is described in the
 +link:https://tinkerpop.apache.org/docs/current/dev/io/#gryo[IO Documentation].
 +
 +[source,yaml]
 +  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerGremlinV3d0 }
 +
 +It has the MIME type of `application/vnd.gremlin-v3.0+gryo` and the following configuration options:
 +
 +[width="100%",cols="3,10,^2",options="header"]
 +|=========================================================
 +|Key |Description |Default
 +|bufferSize |The maximum size of the Kryo buffer for use on a single object being serialized.  Increasing this value will correct `KryoException` errors that complain of "Buffer too small". |_4096_
 +|classResolverSupplier |The fully qualified classname of a custom `Supplier<ClassResolver>` which will be used when constructing `Kryo` instances. There is no direct default for this setting, but without a setting the `GryoClassResolver` is used. |_none_
 +|custom |A list of classes with custom kryo `Serializer` implementations related to them in the form of `<class>;<serializer-class>`. |_none_
 +|ioRegistries |A list of `IoRegistry` implementations to be applied to the serializer. |_none_
 +|serializeResultToString |When set to `true`, results are serialized by first calling `toString()` on each object in the result list resulting in an extended MIME Type of `application/vnd.gremlin-v1.0+gryo-stringd`.  When set to `false` Kryo-based serialization is applied. |_false_
  |=========================================================
  
 -If there is no intention to gather side-effects from traversals, the `cacheMaxSize` can be set to zero to disable the
 -cache.
 +As described above, there are multiple ways in which to register serializers for Kryo-based serialization.  Note
 +that the `ioRegistries` setting is applied first, followed by the `custom` setting.
 +
 +Those configuring or implementing a `Supplier<ClassResolver>` should consider this an "advanced" option and typically
 +important to use cases where server types need to be coerced to client types (i.e. a type is available on the server
 +but not on the client).  Implementations should typically instantiate `ClassResolver` implementations that are
 +extensions of the `GryoClassResolver` as this class is important to most serialization tasks in TinkerPop.
 +
 +[[server-graphbinary]]
 +===== GraphBinary
 +
 +GraphBinary is a binary serialization format suitable for object trees, designed to reduce serialization overhead on
 +both the client and the server, as well as limiting the size of the payload that is transmitted over the wire. The
 +format itself is described in the link:https://tinkerpop.apache.org/docs/current/dev/io/#graphbinary[IO Documentation].
 +
 +[source,yaml]
 +  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1 }
 +
 +It has the MIME type of `application/vnd.graphbinary-v1.0` and the following configuration options:
 +
 +[width="100%",cols="3,10,^2",options="header"]
 +|=========================================================
 +|Key |Description |Default
 +|custom |A list of classes with custom kryo `Serializer` implementations related to them in the form of `<class>;<serializer-class>`. |_none_
 +|ioRegistries |A list of `IoRegistry` implementations to be applied to the serializer. |_none_
 +|builder |Name of the `TypeSerializerRegistry.Builder` instance to be used to construct the `TypeSerializerRegistry`. |_none_
 +|=========================================================
 +
 +As described above, there are multiple ways in which to register serializers for GraphBinary-based serialization. Note
 +that the `ioRegistries` setting is applied first, followed by the `custom` setting.
 +
 +[[metrics]]
 +==== Metrics
 +
 +Gremlin Server produces metrics about its operations that can yield some insight into how it is performing. These
 +metrics are exposed in a variety of ways:
 +
 +* Directly to the console where Gremlin Server is running
 +* CSV file
 +* link:http://ganglia.info/[Ganglia]
 +* link:http://graphite.wikidot.com/[Graphite]
 +* link:http://www.slf4j.org/[SLF4j]
 +* link:https://en.wikipedia.org/wiki/Java_Management_Extensions[JMX]
 +
 +The configuration of each of these outputs is described in the Gremlin Server <<_configuring_2, Configuring>> section.
 +Note that Graphite and Ganglia are not included as part of the Gremlin Server distribution and must be installed
 +to the server manually.
 +
 +[source,text]
 +----
 +bin/gremlin-server.sh install com.codahale.metrics metrics-ganglia 3.0.2
 +bin/gremlin-server.sh install com.codahale.metrics metrics-graphite 3.0.2
 +----
 +
 +WARNING: Gremlin Server is built to work with Metrics 3.0.2. Usage of other versions may lead to unexpected problems.
 +
 +NOTE: Installing Ganglia will include `org.acplt:oncrpc`, which is an LGPL licensed dependency.
 +
 +Regardless of the output, the metrics gathered are the same. Each metric is prefixed with
 +`org.apache.tinkerpop.gremlin.server.GremlinServer` and the following metrics are reported:
 +
 +* `sessions` - The number of sessions open at the time the metric was last measured. For the `UnifiedChannelizer`, each
 +request creates a "session", even a so-called "sessionless request", which is basically a session that will only
 +execute within the context of that single request.
 +* `errors` - The number of total errors, mean rate, as well as the 1, 5, and 15-minute error rates.
 +* `op.eval` - The number of script evaluations, mean rate, 1, 5, and 15 minute rates, minimum, maximum, median, mean,
 +and standard deviation evaluation times, as well as the 75th, 95th, 98th, 99th and 99.9th percentile evaluation times
 +(note that these time apply to both sessionless and in-session requests).
 +* `op.traversal` - The number of `Traversal` bytecode-based executions, mean rate, 1, 5, and 15 minute rates, minimum,
 +maximum, median, mean, and standard deviation evaluation times, as well as the 75th, 95th, 98th, 99th and 99.9th
 +percentile evaluation times.
 +* `engine-name.session.session-id.*` - Metrics related to different `GremlinScriptEngine` instances configured for
 +session-based requests where "engine-name" will be the actual name of the engine, such as "gremlin-groovy" and
 +"session-id" will be the identifier for the session itself. This metric is not measured under the `UnifiedChannelizer`.
 +* `engine-name.sessionless.*` - Metrics related to different `GremlinScriptEngine` instances configured for sessionless
 +requests where "engine-name" will be the actual name of the engine, such as "gremlin-groovy". This metric is not
 +measured under the `UnifiedChannelizer`.
 +
 +==== As A Service
 +
 +Gremlin server can be configured to run as a service.
 +
 +===== Init.d (SysV)
 +
 +Link `bin/gremlin-server.sh` to `init.d`
 +Be sure to set RUNAS to the service user in `bin/gremlin-server.conf`
 +
 +[source,bash]
 +----
 +# Install
 +ln -s /path/to/apache-tinkerpop-gremlin-server-x.y.z/bin/gremlin-server.sh /etc/init.d/gremlin-server
 +
 +# Systems with chkconfig/service. E.g. Fedora, Red Hat
 +chkconfig --add gremlin-server
 +
 +# Start
 +service gremlin-server start
 +
 +# Or call directly
 +/etc/init.d/gremlin-server restart
 +
 +----
 +
 +===== Systemd
 +
 +To install, copy the service template below to /etc/systemd/system/gremlin.service
 +and update the paths `/path/to/apache-tinkerpop-gremlin-server` with the actual install path of Gremlin Server.
 +
 +[source,bash]
 +----
 +[Unit]
 +Description=Apache TinkerPop Gremlin Server daemon
 +Documentation=https://tinkerpop.apache.org/
 +After=network.target
 +
 +[Service]
 +Type=forking
 +ExecStart=/path/to/apache-tinkerpop-gremlin-server/bin/gremlin-server.sh start
 +ExecStop=/path/to/apache-tinkerpop-gremlin-server/bin/gremlin-server.sh stop
 +PIDFile=/path/to/apache-tinkerpop-gremlin-server/run/gremlin.pid
 +
 +[Install]
 +WantedBy=multi-user.target
 +----
 +
 +
 +Enable the service with `systemctl enable gremlin-server`
 +
 +Start the service with `systemctl start gremlin-server`
 +
  
  [[security]]
 -==== Security
 +=== Security
  
  image:gremlin-server-secure.png[width=175,float=right] Gremlin Server provides for several features that aid in the
 -security of the graphs that it exposes.  In particular it supports SSL for transport layer security, protective
 -measures against malicious script execution, and authentication.  Client SSL options are described in the
 +security of the graphs that it exposes.  In particular it supports SSL for transport layer security, authentication,
 +authorization and protective measures against malicious script execution.  Client SSL options are described in the
  <<gremlin-drivers-variants, Gremlin Drivers and Variants">> sections with varying capability depending on the driver
  chosen. Script execution options are covered <<script-execution, "at the end of this section">>. This section
  starts with authentication.
@@@ -2044,7 -1491,226 +2064,6 @@@ A final thought on the topic of `Groovy
  can fine tune the Groovy compilation process.  Read more about compilation customization in the
  link:http://docs.groovy-lang.org/latest/html/documentation/#compilation-customizers[Groovy Documentation].
  
 -==== Serialization
 -
 -Gremlin Server can accept requests and return results using different serialization formats. Serializers implement the
 -`MessageSerializer` interface. In doing so, they express the list of mime types they expect to support. When
 -configuring multiple serializers it is possible for two or more serializers to support the same mime type. Such a
 -situation may be common with a generic mime type such as `application/json`. Serializers are added in the order that
 -they are encountered in the configuration file and the first one added for a specific mime type will not be overridden
 -by other serializers that also support it.
 -
 -The format of the serialization is configured by the `serializers` setting described in the table above.  Note that
 -some serializers have additional configuration options as defined by the `serializers[X].config` setting.  The
 -`config` setting is a `Map` where the keys and values get passed to the serializer at its initialization.  The
 -available and/or expected keys are dependent on the serializer being used.  Gremlin Server comes packaged with three
 -different serializers: GraphSON, Gryo, and GraphBinary.
 -
 -===== GraphSON
 -
 -The GraphSON serializer produces human readable output in JSON format and is a good configuration choice for those
 -trying to use TinkerPop from non-JVM languages.  JSON obviously has wide support across virtually all major
 -programming languages and can be consumed by a wide variety of tools. The format itself is described in the
 -link:https://tinkerpop.apache.org/docs/current/dev/io/#graphson[IO Documentation].
 -
 -[source,yaml]
 -----
 -  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0 }
 -----
 -
 -Gremlin Server is configured by default with GraphSON 3.0 as shown above. It has the following configuration option:
 -
 -[width="100%",cols="3,10,^2",options="header"]
 -|=========================================================
 -|Key |Description |Default
 -|ioRegistries |A list of `IoRegistry` implementations to be applied to the serializer. |_none_
 -|=========================================================
 -
 -It is worth noting that GraphSON 1.0 still has some appeal for some users as it can be configured to produce an untyped
 -JSON format which is a bit easier to consume than its successors which embed data types into the output. This version
 -of GraphSON tends to be the one that users like to utilize when <<connecting-via-http,connecting via HTTP>> and is still
 -used by some <<connecting-rgp, Remote Gremlin Providers>> for this purpose.
 -
 -To configure Gremlin Server this way, the `GraphSONMessageSerializerV1d0` must be included:
 -
 -[source,yaml]
 -----
 -  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0 }
 -  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0 }
 -----
 -
 -In the above situation, both `GraphSONMessageSerializerV1d0` and `GraphSONMessageSerializerV3d0` each bind to the
 -`application/json` mime type. When such conflicts arise, Gremlin Server will use the order of the serializers to
 -determine priority such that the first serializer to bind to a type will be used and the others ignored. The following
 -log message will indicate how the server is ultimately configured:
 -
 -[source,text]
 -----
 -[INFO] AbstractChannelizer - Configured application/json with org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0
 -[INFO] AbstractChannelizer - Configured application/vnd.gremlin-v3.0+json with org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0
 -[INFO] AbstractChannelizer - application/json already has org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0 configured - it will not be replaced by org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, change order of serialization configuration if this is not desired.
 -----
 -
 -Given the above, using GraphSON 3.0 under this configuration will require that the user specific the type:
 -
 -[source,text]
 -----
 -$ curl -X POST -d "{\"gremlin\":\"100-1\"}" "http://localhost:8182"
 -{"requestId":"f8720ad9-2c8b-4eef-babe-21792a3e3157","status":{"message":"","code":200,"attributes":{}},"result":{"data":[99],"meta":{}}}
 -$ curl -H "Accept:application/vnd.gremlin-v3.0+json" -X POST -d "{\"gremlin\":\"100-1\"}" "http://localhost:8182"
 -{"requestId":"9fdf0892-d86c-41f2-94b5-092785c473eb","status":{"message":"","code":200,"attributes":{"@type":"g:Map","@value":[]}},"result":{"data":{"@type":"g:List","@value":[{"@type":"g:Int32","@value":99}]},"meta":{"@type":"g:Map","@value":[]}}
 -----
 -
 -===== Gryo
 -
 -The Gryo serializer utilizes Kryo-based serialization which produces a binary output.  This format is best consumed
 -by JVM-based languages. The format itself is described in the
 -link:https://tinkerpop.apache.org/docs/current/dev/io/#gryo[IO Documentation].
 -
 -[source,yaml]
 -  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerGremlinV1d0 }
 -
 -It has the MIME type of `application/vnd.gremlin-v1.0+gryo` and the following configuration options:
 -
 -[width="100%",cols="3,10,^2",options="header"]
 -|=========================================================
 -|Key |Description |Default
 -|bufferSize |The maximum size of the Kryo buffer for use on a single object being serialized.  Increasing this value will correct `KryoException` errors that complain of "Buffer too small". |_4096_
 -|classResolverSupplier |The fully qualified classname of a custom `Supplier<ClassResolver>` which will be used when constructing `Kryo` instances. There is no direct default for this setting, but without a setting the `GryoClassResolver` is used. |_none_
 -|custom |A list of classes with custom kryo `Serializer` implementations related to them in the form of `<class>;<serializer-class>`. |_none_
 -|ioRegistries |A list of `IoRegistry` implementations to be applied to the serializer. |_none_
 -|serializeResultToString |When set to `true`, results are serialized by first calling `toString()` on each object in the result list resulting in an extended MIME Type of `application/vnd.gremlin-v1.0+gryo-stringd`.  When set to `false` Kryo-based serialization is applied. |_false_
 -|=========================================================
 -
 -As described above, there are multiple ways in which to register serializers for Kryo-based serialization.  Note
 -that the `ioRegistries` setting is applied first, followed by the `custom` setting.
 -
 -Those configuring or implementing a `Supplier<ClassResolver>` should consider this an "advanced" option and typically
 -important to use cases where server types need to be coerced to client types (i.e. a type is available on the server
 -but not on the client).  Implementations should typically instantiate `ClassResolver` implementations that are
 -extensions of the `GryoClassResolver` as this class is important to most serialization tasks in TinkerPop.
 -
 -===== GraphBinary
 -
 -GraphBinary is a binary serialization format suitable for object trees, designed to reduce serialization overhead on
 -both the client and the server, as well as limiting the size of the payload that is transmitted over the wire. The
 -format itself is described in the link:https://tinkerpop.apache.org/docs/current/dev/io/#graphbinary[IO Documentation].
 -
 -IMPORTANT: GraphBinary is currently only supported on the JVM.
 -
 -[source,yaml]
 -  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1 }
 -
 -It has the MIME type of `application/vnd.graphbinary-v1.0` and the following configuration options:
 -
 -[width="100%",cols="3,10,^2",options="header"]
 -|=========================================================
 -|Key |Description |Default
 -|custom |A list of classes with custom kryo `Serializer` implementations related to them in the form of `<class>;<serializer-class>`. |_none_
 -|ioRegistries |A list of `IoRegistry` implementations to be applied to the serializer. |_none_
 -|builder |Name of the `TypeSerializerRegistry.Builder` instance to be used to construct the `TypeSerializerRegistry`. |_none_
 -|=========================================================
 -
 -As described above, there are multiple ways in which to register serializers for GraphBinary-based serialization. Note
 -that the `ioRegistries` setting is applied first, followed by the `custom` setting.
 -
 -[[metrics]]
 -==== Metrics
 -
 -Gremlin Server produces metrics about its operations that can yield some insight into how it is performing. These
 -metrics are exposed in a variety of ways:
 -
 -* Directly to the console where Gremlin Server is running
 -* CSV file
 -* link:http://ganglia.info/[Ganglia]
 -* link:http://graphite.wikidot.com/[Graphite]
 -* link:http://www.slf4j.org/[SLF4j]
 -* link:https://en.wikipedia.org/wiki/Java_Management_Extensions[JMX]
 -
 -The configuration of each of these outputs is described in the Gremlin Server <<_configuring_2, Configuring>> section.
 -Note that Graphite and Ganglia are not included as part of the Gremlin Server distribution and must be installed
 -to the server manually.
 -
 -[source,text]
 -----
 -bin/gremlin-server.sh install com.codahale.metrics metrics-ganglia 3.0.2
 -bin/gremlin-server.sh install com.codahale.metrics metrics-graphite 3.0.2
 -----
 -
 -WARNING: Gremlin Server is built to work with Metrics 3.0.2. Usage of other versions may lead to unexpected problems.
 -
 -NOTE: Installing Ganglia will include `org.acplt:oncrpc`, which is an LGPL licensed dependency.
 -
 -Regardless of the output, the metrics gathered are the same. Each metric is prefixed with
 -`org.apache.tinkerpop.gremlin.server.GremlinServer` and the following metrics are reported:
 -
 -* `sessions` - the number of sessions open at the time the metric was last measured.
 -* `errors` - the number of total errors, mean rate, as well as the 1, 5, and 15-minute error rates.
 -* `op.eval` - the number of script evaluations, mean rate, 1, 5, and 15 minute rates, minimum, maximum, median, mean,
 -and standard deviation evaluation times, as well as the 75th, 95th, 98th, 99th and 99.9th percentile evaluation times
 -(note that these time apply to both sessionless and in-session requests).
 -* `op.traversal` - the number of `Traversal` executions, mean rate, 1, 5, and 15 minute rates, minimum, maximum, median,
 -mean, and standard deviation evaluation times, as well as the 75th, 95th, 98th, 99th and 99.9th percentile evaluation
 -times.
 -* `engine-name.session.session-id.*` - metrics related to different `GremlinScriptEngine` instances configured for
 -session-based requests where "engine-name" will be the actual name of the engine, such as "gremlin-groovy" and
 -"session-id" will be the identifier for the session itself.
 -* `engine-name.sessionless.*` - metrics related to different `GremlinScriptEngine` instances configured for sessionless
 -requests where "engine-name" will be the actual name of the engine, such as "gremlin-groovy".
 -
 -==== As A Service
 -
 -Gremlin server can be configured to run as a service.
 -
 -===== Init.d (SysV)
 -
 -Link `bin/gremlin-server.sh` to `init.d`
 -Be sure to set RUNAS to the service user in `bin/gremlin-server.conf`
 -
 -[source,bash]
 -----
 -# Install
 -ln -s /path/to/apache-tinkerpop-gremlin-server-x.y.z/bin/gremlin-server.sh /etc/init.d/gremlin-server
 -
 -# Systems with chkconfig/service. E.g. Fedora, Red Hat
 -chkconfig --add gremlin-server
 -
 -# Start
 -service gremlin-server start
 -
 -# Or call directly
 -/etc/init.d/gremlin-server restart
 -
 -----
 -
 -===== Systemd
 -
 -To install, copy the service template below to /etc/systemd/system/gremlin.service
 -and update the paths `/path/to/apache-tinkerpop-gremlin-server` with the actual install path of Gremlin Server.
 -
 -[source,bash]
 -----
 -[Unit]
 -Description=Apache TinkerPop Gremlin Server daemon
 -Documentation=https://tinkerpop.apache.org/
 -After=network.target
 -
 -[Service]
 -Type=forking
 -ExecStart=/path/to/apache-tinkerpop-gremlin-server/bin/gremlin-server.sh start
 -ExecStop=/path/to/apache-tinkerpop-gremlin-server/bin/gremlin-server.sh stop
 -PIDFile=/path/to/apache-tinkerpop-gremlin-server/run/gremlin.pid
 -
 -[Install]
 -WantedBy=multi-user.target
 -----
 -
 -
 -Enable the service with `systemctl enable gremlin-server`
 -
 -Start the service with `systemctl start gremlin-server`
 -
--
  === Best Practices
  
  The following sections define best practices for working with Gremlin Server.