当前位置: 首页 > 知识库问答 >
问题:

连接Spring-Boot和StatsD的最佳方式是什么,尤其是对于计时器?

浦德明
2023-03-14

所以我有一个使用Spring引导致动器的Spring引导应用程序。通过定义<code>spring.metrics.export.statsd。host属性,一个<code>StatsdMetricWriter

然而,对于计时器来说,事情有点尴尬。对于Java8,Spring Boot会自动创建一个BufferGaugeService实例 - 这导致计时器值基本上像一个仪表一样被报告:最后一个值每5秒(或者不管它是什么,人们也可以配置它)。这基本上使计时器指标变得无用,因为StatsD对这些指标所做的所有精彩事情都是倾斜的。

现在可以回到使用Java8之前的默认DefaultGaugeService,但话说回来,对于计数器,BufferCounterService很好。查看MetricRepositoryAutoConfiguration,手动设置对于未来的更新似乎是不平凡和脆弱的。

关于如何在这里进行的任何建议?还是有一些蓝图提供了一些灵感?

撇开当前情况不谈:是否有一些计划首先提出BufferTimerServiceTimerService

共有2个答案

郗亦
2023-03-14

感谢您提供解决方案!< br >我实现了Dropwizard,并使用以下覆盖帮助捕获计时器中的请求时间度量,而不是仪表。

@Bean
DropwizardMetricServices dropwizardMetricServices(MetricRegistry metricRegistry,
                                                  ObjectProvider<ReservoirFactory> resFactoryProvider) {
    return new DropwizardMetricServices(metricRegistry, resFactoryProvider.getIfAvailable()) {
        @Override
        public void submit(String name, double value) {
            if (name.startsWith("response.")) {
                super.submit("timer." + name, value);
            } else {
                super.submit(name, value);
            }
        }
    };
}

关于TimerService,这个Spring启动问题可能是相关的。

正如我所看到的,有计划对2.0的Spring启动指标进行重大改进,描述如下:指标主题和执行器指标的改进

司空锋
2023-03-14

就其价值而言,我找到了一个相当不显眼的解决方案。不确定这是否是最佳方式,但它可以完美地工作:

@Autowired
@Bean
public static BeanPostProcessor wrapGaugeService(ApplicationContext applicationContext) {
    return new BeanPostProcessor() {
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) {
            return bean;
        }
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) {
            if (!GaugeService.class.isInstance(bean)) {
                return bean;
            }
            final GaugeService gaugeService = GaugeService.class.cast(bean);
            final MetricWriter metricWriter = applicationContext.getBean(MetricWriter.class);
            return (GaugeService) (metricName, value) -> {
                if (metricName.startsWith("timer.")) {
                    metricWriter.set(new Metric<>(metricName, value));
                } else {
                    gaugeService.submit(metricName, value);
                }
            };
        }
    };
}

对于计时器值,我们模仿Spring Boots在Java8之前的行为。这包装了由Spring Boot提供的< code>GaugeService:用于“计时器”。* "值,它调用< code>MetricWriter(这应该是< code>StatsdMetricWriter,否则整个设置没有意义),否则它将仪表值传递给< code>GaugeService。

 类似资料:
  • 我在一个数据库中有两个表,这两个表都来自最初以电子表格形式提供的官方政府参考表。 下面说明了这两个表的结构。 表1(物种代码) 表2(允许的表示代码) 当我尝试在第一个和第二个之间创建关系时(以便充分利用在第二个表中查找值的能力),当我尝试将speciescodes.FAOC的颂歌链接到alolwestates. Ers物种代码时,会出现以下错误。 “SpeciesCodeLookup”表已成功保

  • 我想添加一个新的属性源,可用于读取应用程序中的属性值。我想使用Spring来做到这一点。我在@Configuration类中有一段这样的代码: 这看起来工作得很好。但是,它也在覆盖我不想覆盖的其他属性值(例如server.port在Spring启动使用的application.properties文件中的属性)。所以基本问题是添加此属性源但不让它覆盖其他属性的最佳方法是什么。有什么方法可以获取现有

  • 有一个 K8S 群集,我们的大多数部署只是更新映像的版本,但有时我们也希望更新部署配置的某些部分。我们的部署配置不包括映像的标记。 对于更新映像版本似乎是我最好的选择。至于一起更新部署配置和映像,我看到了几种方法: < li>kubectl部署...:< code>kubectl集合图像...[但是有两个部署] < li >使用实际图像标记编辑部署YAML[看起来不太优雅] < li>kubect

  • 和是我用来表示成功和错误响应的两个类。

  • 我想用Spring Boot和JWT开始一个项目。我看到了一些将刷新令牌保存在数据库中的示例。我是否必须将刷新令牌插入数据库,或者我是否有其他最佳实践方法? 如果我必须插入数据库,以删除过期的令牌,我应该在Spring中创建一个作业吗?

  • 问题内容: 我已经开发了一些类似于DAO的自定义类,以满足我的项目的一些非常特殊的要求,这是一个不在任何框架内运行的服务器端进程。 该解决方案非常有效,除了每次发出新请求时,我都会通过MySQLdb.connect打开一个新连接。 将其切换为在python中使用连接池的最佳“插入”解决方案是什么?我在想像Java的通用DBCP解决方案。 该过程运行很长时间,并且有许多线程需要发出请求,但不是所有线