我正在创建一个 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/