Plugins

OpenTSDB 实现了一个非常简单的插件模型来扩展应用程序。插件使用 Java 1.6 中内置的* service service provider *工具,该工具允许在 OpenTSDB 启动后动态加载 JAR 文件并实例化插件实现。尽管不如许多框架实现那样灵活,但是我们需要做的只是在启动时加载插件,初始化实现,然后开始向其传递数据或通过它传递数据。

要创建插件,您需要做的就是扩展* abstract *插件类之一,编写服务描述/清单,编译,将 JAR(连同所需的任何依赖项)放到 OpenTSDB 插件文件夹中,编辑 TSD 配置然后重新启动。这里的所有都是它的。没有花哨的框架,也不必担心在奇怪的时间进行加载和卸载等。

Manifest

插件 JAR 需要带有特殊* services *文件夹和文件的清单,以使ServiceLoader正确加载。以下是创建正确文件的步骤:

Note

  • 在您的src目录下创建一个META-INF目录。一些 IDE 可以自动生成

  • META-INF目录中,创建一个名为MANIFEST.MF的文件。同样,某些 IDE 可以自动生成此代码。

  • 编辑MANIFEST.MF文件并添加:

Manifest-Version: 1.0

确保以空行结尾。您可以根据需要添加更多清单信息。这是满足插件要求的最低要求。

  • META-INF下创建一个services目录

  • services内,使用您要实现的抽象插件类的规范类名创建一个文件。例如。如果您实现net.opentsdb.search.SearchPlugin,请使用它作为文件名。

  • 编辑新文件,并将实现抽象接口的每个类的规范名称放在文件的新行中。例如。如果您的实现称为net.opentsdb.search.ElasticSearch,则将其放在一行上。有关此文件的一些快速 Comments:

  • 您可以在服务实现文件中添加 Comments。Comments 字符是#,就像 Java 属性文件一样。例如。:

# ElasticSearch plugin written by John Doe
# that sends data over HTTP to a number of ElasticSearch servers
net.opentsdb.search.ElasticSearch
  • 在一个 JAR 和此文件中,您可以具有多个相同抽象类的实现。注意:如果实现方式差异很大,请启动其他项目和 JAR。例如。如果您为 ElasticSearch 实现搜索插件,为 Solr 实现另一个插件,则将 Solr 放在另一个项目中。但是,如果您有两个非常相似但略有不同的实现,则可以创建一个项目。例如,您可以编写一个使用 HTTP 协议的 ElasticSearch 插件,另一个使用 Thrift 的插件。在这种情况下,您可能有一个类似以下的文件:
# ElasticSearch HTTP
net.opentsdb.search.ElasticSearchHTTP
# ElasticSearch Thrift
net.opentsdb.search.ElasticSearchThrift
  • 现在编译您的 JAR,并确保包括清单文件。每个 IDE 的处理方式都不相同。如果要使用命令行,请尝试以下操作:
jar cvmf <path to MANIFEST.MF> <plugin jar name> <list of class files>

<list of class files>包含您在上面创建的服务文件的位置。例如。:

jar cvmf META-INF/MANIFEST.MF searchplugin.jar ../bin/net/opentsdb/search/myplugin.class META-INF/services/net.opentsdb.search.SearchPlugin

Startup Plugins

在 OpenTSDB 启动过程中,启动插件可用于执行其他初始化步骤。

  • 有四个钩子可用,它们按以下 Sequences 调用:

      • Constructor
  • Initialize

  • Ready

  • Shutdown

Constructor

在插件的构造函数中,您应该初始化插件并在此处进行所需的任何外部连接。例如,连接到服务发现工具,例如 Etcd 或 Curator。

Initialize

一旦 OpenTSDB 从文件和命令行中完全读取了配置选项,就会调用 Initialize 钩子。这是在创建 TSDB 对象之前调用的,因此您此时可以修改配置。

该钩子可用于通过服务发现机制注册 OpenTSDB 或动态查找 HBase 群集的位置并填充配置。如果当前不存在 HBase 表,则可能会创建它们。

Note

您将需要确保在调用该服务时将其状态设置为 PENDING 或服务发现系统中的其他一些未就绪状态。此时 TSDB 尚未初始化。

Ready

一旦完全初始化 OpenTSDB 并准备为流量提供服务,就将调用此钩子。该钩子可用于在服务发现系统中将状态设置为 READY,更改负载平衡器中的状态,或执行其他需要功能全面的 OpenTSDB 实例的任务。

Shutdown

当 OpenTSDB 执行关闭任务时,将调用此钩子。在此不需要进行任何工作并且需要连接 OpenTSDB 实例的工作。您可以使用它来更新服务发现机制中此节点的状态。