You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用InfluxDB v2.7.5对接Micrometer时遇未授权错误求助

问题描述

首次尝试使用InfluxDB v2.7.5存储和获取应用指标,已在Influx UI创建组织、Bucket并生成全权限API Token。在应用中配置了MicrometerMetricsOptions、InfluxMeterRegistry及Metrics控制器,但调用接口时出现如下错误:

i.micrometer.influx.InfluxMeterRegistry : unable to create database 'mydb': {"code":"unauthorized","message":"unauthorized access"}

Influx UI中没有创建数据库的入口,即使在配置中调用setDb方法,问题仍未解决。以下是配置代码:

@Configuration
public class VertxConfig {

    @Value("${influxdb.api.token}")
    public String authToken;

    @Bean
    @Autowired
    public Vertx vertx(VerticleFactory verticleFactory) {
        MicrometerMetricsOptions metricsOptions = new MicrometerMetricsOptions()
                .setInfluxDbOptions(new VertxInfluxDbOptions()
                        .setUri("http://localhost:8086")
                        .setOrg("Technologies")
                        .setDb("life")
                        .setUserName("life")
                        .setPassword("1234")
                        .setBucket("life")
                        .setToken(authToken)
                        .setEnabled(true))
                .setEnabled(true);

        VertxOptions vertxOptions = new VertxOptions()
                .setMetricsOptions(metricsOptions)
                .setWorkerPoolSize(35);
        Vertx vertx = Vertx.vertx(vertxOptions);
        vertx.registerVerticleFactory(verticleFactory);
        return vertx;
    }
}
@SpringBootApplication
public class MetricsApplication {

    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(MetricsApplication.class);
        springApplication.setWebApplicationType(WebApplicationType.NONE);
        springApplication.setAdditionalProfiles("prod");
        springApplication.run(args);


        InfluxConfig config = new InfluxConfig() {
            @Override
            public String get(String key) {
                return switch (key) {
                    case "influxdb.uri" -> "http://localhost:8086";
//                  case "influxdb.db" -> "life";
                    case "influxdb.userName" -> "life";
                    case "influxdb.password" -> "1234";
                    default -> null;
                };
            }
        };


        InfluxMeterRegistry registry = InfluxMeterRegistry.builder(config)
                .clock(Clock.SYSTEM)
                .build();

        registry.config().meterFilter(new MeterFilter() {
            @Override
            public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {
                return DistributionStatisticConfig.builder()
                        .percentilesHistogram(true)
                        .build()
                        .merge(config);
            }
        });
    }

}
解决方案

核心原因

InfluxDB v2.x已弃用v1.x的"database"概念,改用"bucket"管理数据。当前配置混用了v1和v2的参数,导致Micrometer尝试用v1的API创建数据库,而v2的Token无法通过v1的权限校验,引发授权错误。

配置修正步骤

1. 清理Vertx的Influx配置

移除v1相关的setDb、setUserName、setPassword参数,仅保留v2必需的配置项:

@Configuration
public class VertxConfig {

    @Value("${influxdb.api.token}")
    public String authToken;

    @Bean
    @Autowired
    public Vertx vertx(VerticleFactory verticleFactory) {
        MicrometerMetricsOptions metricsOptions = new MicrometerMetricsOptions()
                .setInfluxDbOptions(new VertxInfluxDbOptions()
                        .setUri("http://localhost:8086")
                        .setOrg("Technologies")
                        .setBucket("life")
                        .setToken(authToken)
                        .setEnabled(true))
                .setEnabled(true);

        VertxOptions vertxOptions = new VertxOptions()
                .setMetricsOptions(metricsOptions)
                .setWorkerPoolSize(35);
        Vertx vertx = Vertx.vertx(vertxOptions);
        vertx.registerVerticleFactory(verticleFactory);
        return vertx;
    }
}

2. 适配InfluxMeterRegistry的v2 API

修改InfluxConfig为v2配置键,并启用v2 API支持:

@SpringBootApplication
public class MetricsApplication {

    @Value("${influxdb.api.token}")
    private String authToken;

    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(MetricsApplication.class);
        springApplication.setWebApplicationType(WebApplicationType.NONE);
        springApplication.setAdditionalProfiles("prod");
        springApplication.run(args);
    }

    @Bean
    public InfluxMeterRegistry influxMeterRegistry() {
        InfluxConfig config = new InfluxConfig() {
            @Override
            public String get(String key) {
                return switch (key) {
                    case "influxdb.uri" -> "http://localhost:8086";
                    case "influxdb.org" -> "Technologies";
                    case "influxdb.bucket" -> "life";
                    case "influxdb.token" -> authToken;
                    default -> null;
                };
            }
        };

        return InfluxMeterRegistry.builder(config)
                .clock(Clock.SYSTEM)
                .useInfluxV2Api() // 关键:启用v2 API适配
                .build();
    }

    @Bean
    public MeterFilter percentileHistogramFilter() {
        return new MeterFilter() {
            @Override
            public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {
                return DistributionStatisticConfig.builder()
                        .percentilesHistogram(true)
                        .build()
                        .merge(config);
            }
        };
    }
}

3. 关键注意事项

  • 确保API Token拥有目标Bucket的写入权限(全权限Token可满足)
  • 禁止同时混用v1和v2配置参数,避免Registry混淆API版本
  • InfluxDB v2.x中无需创建"database",直接使用预先创建的Bucket即可

内容的提问来源于stack exchange,提问作者Plus Ultra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 15:26:16