Invalid distribution configuration: expiry (1ms) / bufferLength (3) must be greater than 0 解决

Caused by: io.micrometer.core.instrument.config.InvalidConfigurationException: Invalid distribution configuration: expiry (1ms) / bufferLength (3) must be greater than 0.
	at io.micrometer.core.instrument.distribution.AbstractTimeWindowHistogram.rejectHistogramConfig(AbstractTimeWindowHistogram.java:129)
	at io.micrometer.core.instrument.distribution.AbstractTimeWindowHistogram.<init>(AbstractTimeWindowHistogram.java:82)
	at io.micrometer.core.instrument.distribution.TimeWindowPercentileHistogram.<init>(TimeWindowPercentileHistogram.java:41)
	at io.micrometer.core.instrument.AbstractTimer.<init>(AbstractTimer.java:89)
	at io.micrometer.prometheus.PrometheusTimer.<init>(PrometheusTimer.java:65)
	at io.micrometer.prometheus.PrometheusMeterRegistry.newTimer(PrometheusMeterRegistry.java:324)
	at io.micrometer.core.instrument.MeterRegistry.lambda$timer$2(MeterRegistry.java:318)
	at io.micrometer.core.instrument.MeterRegistry.getOrCreateMeter(MeterRegistry.java:618)
	at io.micrometer.core.instrument.MeterRegistry.registerMeterIfNecessary(MeterRegistry.java:570)
	at io.micrometer.core.instrument.MeterRegistry.timer(MeterRegistry.java:316)
	at io.micrometer.core.instrument.Timer$Builder.register(Timer.java:400)
	at io.lettuce.core.metrics.MicrometerCommandLatencyRecorder.firstResponseTimer(MicrometerCommandLatencyRecorder.java:125)
	at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)
	at io.lettuce.core.metrics.MicrometerCommandLatencyRecorder.recordCommandLatency(MicrometerCommandLatencyRecorder.java:80)
	at io.lettuce.core.protocol.CommandHandler.recordLatency(CommandHandler.java:914)
	at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:771)
	at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:659)
	at io.lettuce.core.protocol.CommandHandler.channelRead(CommandHandler.java:599)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Thread.java:833)

这个问题是因为 durationBetweenRotatesMillis <= 0 导致,如下图所示:

在yml加上以下参数:

management:
  metrics:
    distribution:
      expiry:
        lettuce: 10ms

这样就保证durationBetweenRotatesMillis不小于0:

<think>我们正在讨论QFont的setPointSize方法,它要求pointsize必须大于0。用户遇到了一个错误,提示pointsize必须大于0。这意味着在代码中调用setPointSize时,传入的参数小于或等于0。根据引用[2],我们可以通过QWidget::setFont函数结合QFont::setPointSize函数来设置字体。但要注意,setPointSize的参数必须是一个正整数。错误原因分析:1.可能是在设置字体大小时,传入了一个负数或0。2.可能是一个变量作为参数传入,而该变量的值小于等于0解决方法:1.确保传入setPointSize的值是一个大于0的整数。例如,通常字体大小在8到72之间,但具体取决于系统支持。2.检查传入的变量,确保它在使用前被正确初始化为一个正数。示例代码:```cpp//创建一个QFont对象QFontfont;//设置字体大小为12(大于0)font.setPointSize(12);//正确//错误示例:设置字体大小为0或负数//font.setPointSize(0);//会触发错误//font.setPointSize(-1);//会触发错误```如果字体大小是从用户输入或配置文件中读取的,需要添加检查:```cppintfontSize=...;//从某处获取的字体大小if(fontSize<=0){//处理错误,例如设置为默认大小fontSize=12;}font.setPointSize(fontSize);```另外,根据引用[2],还可以使用QApplication::setFont来设置整个应用程序的字体,同样需要注意字体大小必须大于0。如果用户希望动态调整字体大小,例如根据用户输入调整,那么需要确保输入的值有效。注意:引用[3]提到的错误与字符编码转换有关,与当前问题无关。引用[1]提到的方法封装了获取字体的函数,其中也包含设置字体大小,同样需要确保size参数大于0。因此,用户需要检查代码中调用setPointSize的地方,确保传入的值大于0。§§相关问题§§1.如何动态改变QFont的字体大小而不触发错误?2.QFont中setPointSize和setPixelSize有什么区别?3.如何为不同的控件设置不同的字体大小?</think>### QFont setPointSize "point size must be greater than 0" 错误解析 #### 错误原因分析 当调用 `QFont::setPointSize()` 方法时,如果传入的参数小于或等于 0,Qt 会抛出 **"point size must be greater than 0"** 错误。这是 Qt 的硬性约束条件,因为: 1. **字体尺寸无效**:字体大小必须是正整数,表示字体的逻辑单位尺寸(1点≈1/72英寸) 2. **常见触发场景**: - 直接传入 `0` 或负数:`font.setPointSize(-1)` - 使用未初始化的变量:`int size; font.setPointSize(size);` - 从配置文件读取错误值:`font.setPointSize(config.getInt("font_size"))` - 数学计算错误:`font.setPointSize(width / height)`(当 `height=0` 时) #### 解决方法 1. **基础验证**(必需) ```cpp int fontSize = ...; // 获取字体尺寸值 if(fontSize > 0) { font.setPointSize(fontSize); } else { // 设置安全默认值(推荐8-12) font.setPointSize(10); qWarning() << "Invalid font size, using default 10"; } ``` 2. **配置读取防护** ```cpp // 从设置读取时添加范围检查 int size = settings.value("fontSize", 12).toInt(); size = qBound(8, size, 72); // 限制在8-72点范围内 ``` 3. **动态计算防护** ```cpp // 确保分母不为零 int dynamicSize = widget->height() / 20; if(dynamicSize <= 0) dynamicSize = 10; ``` 4. **替代方法**(引用[2]) ```cpp // 通过QWidget直接设置(自动处理无效值) QFont widgetFont = widget->font(); widgetFont.setPointSize(12); widget->setFont(widgetFont); ``` #### 最佳实践建议 1. **始终验证输入值**:在调用 `setPointSize()` 前添加 `if(size > 0)` 检查 2. **设置合理范围**:使用 `qBound(min, value, max)` 限制字体尺寸 3. **日志记录**:使用 `qWarning()` 记录无效值事件便于调试 4. **默认值策略**:在配置文件/代码中定义备用默认值(如 `#define DEFAULT_FONT_SIZE 10`) > 注意:此错误与引用[3]的字符编码错误无关,纯属参数验证问题。引用[1]中的封装方法同样需遵守此规则[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值