1

我的问题与这里基本相同,但希望得到一个不那么模糊、信息量更大的答案。

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

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

4

3 回答 3

1

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

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

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

于 2015-08-10T20:03:03.403 回答
0

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

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

代码

从一个最小的配置开始:

配置.yml

myConfigValue: "hello"

以及对应的配置文件:

ExampleConfiguration.java

public class ExampleConfiguration extends Configuration {
    private String myConfigValue;

    public String getMyConfigValue() {
        return myConfigValue;
    }

    public void setMyConfigValue(String value) {
        myConfigValue = value;
    }
}

然后创建一个更新配置的任务:

更新配置任务.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");
    }
}

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

配置资源.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();
    }
}

最后将所有内容连接到您的应用程序中:

ExampleApplication.java(摘录)

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

用法

启动应用程序然后运行:

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

这个怎么运作

这只需将相同的引用传递给ConfigResource.javaand的构造函数即可UpdateConfigTask.java。如果您不熟悉该概念,请参见此处: Java 是“按引用传递”还是“按值传递”?

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

scottg489/dropwizard-runtime-config-example

脚注:我还没有验证这适用于内置配置。但是,您需要为自己的配置扩展的 dropwizard配置类确实有各种用于内部配置的“设置器”,但在run().



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

于 2020-11-20T04:35:32.553 回答
0

我通过 Javassist 通过字节码操作解决了这个问题在我的情况下,我想更改“流入”报告器,并且应该在 dropwizard 启动之前运行 modifyInfluxDbReporterFactory

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();
}
于 2021-01-29T18:52:36.827 回答