【问题标题】:Configuring DropWizard Programmatically以编程方式配置 DropWizard
【发布时间】:2015-08-04 10:20:45
【问题描述】:

我有基本相同的问题as here,但我希望得到一个不那么含糊、信息更丰富的答案。

我正在寻找一种以编程方式配置 DropWizard 的方法,或者至少能够在运行时调整配置。具体来说,我有一个用例,我想在 YAML 文件中 configure metrics 以 2 分钟的频率发布。这将是“正常”的默认值。但是,在某些情况下,我可能希望将其加速到例如每 10 秒一次,然后将其调回正常/默认值。

我该如何做到这一点,不仅针对 metrics.frequency 属性,还针对 YAML 配置文件中可能存在的任何配置?

【问题讨论】:

    标签: java configuration dropwizard metric codahale-metrics


    【解决方案1】:

    Dropwizard 仅在启动时读取 YAML 配置文件并配置所有组件一次。 YAML 文件和Configuration 对象都不再使用。这意味着没有直接的方式在运行时进行配置。

    它也没有提供可以操作组件的特殊接口/委托。但是,您可以访问组件的对象(通常;如果不是,您可以随时发送拉取请求)并根据需要手动配置它们。您可能需要稍微阅读一下源代码,但通常很容易浏览。

    metrics.frequency 的情况下,您可以看到MetricsFactory 类使用frequency 设置为每个度量类型创建ScheduledReporterManager 对象,并且看起来您无法在运行时更改它们。但是您可能可以以某种方式甚至更好地解决它,修改代码并向 dropwizard 社区发送 Pull Request。

    【讨论】:

      【解决方案2】:

      虽然 dropwizard 不支持开箱即用的此功能,但您可以使用他们提供的工具轻松完成此功能。请注意,以下解决方案绝对适用于您提供的配置值,但它可能不适用于内置配置值。

      另请注意,这不会将更新的配置值保留config.yml。但是,这很容易实现,只需从应用程序写入配置文件即可。如果有人想编写此实现,请随时在我下面链接的示例项目中open a PR

      代码

      从一个最小的配置开始:

      config.yml

      myConfigValue: "hello"
      

      并且是对应的configuration文件:

      ExampleConfiguration.java

      public class ExampleConfiguration extends Configuration {
          private String myConfigValue;
      
          public String getMyConfigValue() {
              return myConfigValue;
          }
      
          public void setMyConfigValue(String value) {
              myConfigValue = value;
          }
      }
      

      然后创建一个task 来更新配置:

      UpdateConfigTask.java

      public class UpdateConfigTask extends Task {
          ExampleConfiguration config;
      
          public UpdateConfigTask(ExampleConfiguration config) {
              super("updateconfig");
              this.config = config;
          }
      
          @Override
          public void execute(Map<String, List<String>> parameters, PrintWriter output) {
              config.setMyConfigValue("goodbye");
          }
      }
      

      同样出于演示目的,创建一个resource,它允许您获取配置值:

      ConfigResource.java

      @Path("/config")
      public class ConfigResource {
          private final ExampleConfiguration config;
      
          public ConfigResource(ExampleConfiguration config) {
              this.config = config;
          }
      
          @GET
          public Response handleGet() {
              return Response.ok().entity(config.getMyConfigValue()).build();
          }
      }
      

      最后把所有东西都连接到你的application:

      ExampleApplication.java(摘录)

      environment.jersey().register(new ConfigResource(configuration));
      environment.admin().addTask(new UpdateConfigTask(configuration));
      

      用法

      Start up the application 然后运行:

      $ curl 'http://localhost:8080/config'
      hello
      $ curl -X POST 'http://localhost:8081/tasks/updateconfig'
      $ curl 'http://localhost:8080/config'
      goodbye
      

      工作原理

      只需将相同的引用传递给ConfigResource.javaUpdateConfigTask.java 的构造函数即可。如果您不熟悉该概念,请参见此处: Is Java "pass-by-reference" or "pass-by-value"?

      上面的链接类是我创建的一个项目,它证明了这是一个完整的解决方案。这是该项目的链接:

      scottg489/dropwizard-runtime-config-example

      脚注:我还没有验证这是否适用于 built in configuration。但是,您需要为自己的配置扩展的 dropwizard Configuration 类确实有各种用于内部配置的“setter”,但更新 run() 之外的那些可能不安全。



      免责声明:我在这里链接的项目是我创建的。

      【讨论】:

        【解决方案3】:

        我通过 Javassist 通过字节码操作解决了这个问题 就我而言,我想改变“涌入”记者 并且 modifyInfluxDbReporterFactory 应该在 dropwizard 启动之前运行

        private static void modifyInfluxDbReporterFactory() throws Exception {
            ClassPool cp = ClassPool.getDefault();
            CtClass cc = cp.get("com.izettle.metrics.dw.InfluxDbReporterFactory"); // do NOT use InfluxDbReporterFactory.class.getName() as this will force the class into the classloader
            CtMethod m = cc.getDeclaredMethod("setTags");
            m.insertAfter(
                        "if (tags.get(\"cloud\") != null) tags.put(\"cloud_host\", tags.get(\"cloud\") + \"_\" + host);tags.put(\"app\", \"sam\");");
            cc.toClass();
        }
        

        【讨论】:

          猜你喜欢
          • 2015-07-30
          • 2019-03-05
          • 2016-12-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多