java - 在 Dropwizard Bundle 中注册 MetricRegistry

标签 java bundle dropwizard codahale-metrics

我正在创建一个 Dropwizard Bundle,以便在我的所有微服务中重复使用。我想要标准化的事情之一是每个服务使用的 MetricRegistry

如果我可以通过简单地在 init 上添加我的包来将每个服务配置为使用相同的 MetricRegistry 那就太好了,例如:

class Microservice1 extends Application<Microservice1Config> {
    @Override
    void initialize(Bootstrap<Microservice1Config> cfg) {
        // Boom! Standardized metrics/reporters configured and initialized!
        bootstrap.addBundle(new MyBundle())
    }
}

问题是 Bundle API 似乎不利于这种类型的行为:

class MyBundle implements Bundle {
    MetricRegistry metricRegistry

    @Override
    void initialize(Bootstrap bootstrap) {

    }

    @Override
    void run(Environment environment) {
        environment.jersey().register(???)
    }
}

由于 register(...) 方法没有将 metricRegistry 注册为 JAX-RS 资源,因此我不知道如何连接事物以便此 metricRegistry 用于整个微服务中的所有指标。有想法吗?

<小时/>

更新

我正在寻找的是放置以下内容的位置:

MetricRegistry metricRegistry = new MetricRegistry()
Slf4jReporter slf4jReporter = Slf4jReporter.forRegistry(metricRegistry)
    .convertRatesTo(TimeUnit.SECONDS)
    .convertDurationsTo(TimeUnit.SECONDS)
    .build()

slf4jReporter.start(5, TimeUnit.SECONDS)

最佳答案

嗯,有一个可以从 environment.metrics() 访问的指标注册表。有很多方法可以将其注入(inject)到需要的地方。我用dropwizard-guice bundle 以添加 Guice 支持。

private GuiceBundle<MyConfiguration> guiceBundle;

@Override
public void initialize(Bootstrap<MyConfiguration> bootstrap) {

  guiceBundle = GuiceBundle.<MyConfiguration>newBuilder()
    .addModule(new MyModule())
    .setConfigClass(MyConfiguration.class)
    .build(Stage.DEVELOPMENT);

  bootstrap.addBundle(guiceBundle);
}

然后,我在应用程序的模块中为指标注册表创建一个提供程序规则。

public class MyModule extends AbstractModule {

  ...

  @Provides
  @Singleton
  public MetricRegistry provideRegistry( Environment environment ) {
    return environment.metrics();
  }
}

在我的资源中,我将注册表标记为已注入(inject)。

@Path("/resource")
public class MyResource {
  @Inject
  MetricRegistry registry;
}

最后,我从 Guice 的注入(inject)器请求静态资源,然后将一个实例而不是类名传递给 Jersey。

@Override
public void run(Environment environment) {
  Injector injector = guiceBundle.getInjector();
  environment.jersey().register(injector.getInstance(MyResource.class));
}

您可能只需注册类名并依赖 Guice/HK2 桥来提供注入(inject),但历史上 Guice/HK2 集成一直存在问题。

连接指标注册表后,您将需要配置指标以将数据发送到某处。您可以使用 metrics configuration block 来执行此操作.

例如,如果您想将指标发送到 Graphite,您可以设置 graphite metrics reporter 。您将需要添加对 Graphite 报告器的依赖项。

<dependency>
  <artifactId>dropwizard-metrics-graphite</artifactId>
  <groupId>io.dropwizard</groupId>
  <version>${dropwizard.version}</version>
</dependency>

并添加报告器的配置。

metrics:
  reporters:
    - type: graphite
      prefix: <PREFIX_FOR_METRICS>
      host: <GRAPHITE_HOST>
      port: <GRAPHITE_PORT>
      frequency: 10s

关于java - 在 Dropwizard Bundle 中注册 MetricRegistry,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32511159/

相关文章:

java - 可选的 jDBI 参数

Java 准备语句不适用于我的循环

java - 将 Optional.absent() 元素添加到 Guava 中的集合

html - 如何在 UIWebview 中加载目录(js、图像、css)中的本地 html Assets ? (iOS)

javafx-2 - 减少 JavaFx 包中 JRE 的大小

java - Gradle + Dropwizard + Shadow -> 无法找到或加载主类

java - 使用 PHP 脚本在 Java 中创建树结构

java - 使用 Java unsafe 将 char 数组指向内存位置

design-patterns - 如何在 Laravel 中为基于用户角色的菜单构建代码?

java - 使用自定义注释调用方法 - JAVA