【问题标题】:How to export metrics to Prometheus via PushGateway using Spring Boot 2.0如何使用 Spring Boot 2.0 通过 PushGateway 将指标导出到 Prometheus
【发布时间】:2018-04-11 16:00:27
【问题描述】:

我将 Spring Boot 版本从 1.5.x 升级到 2.0.1,但遇到了新 Metrics 问题。

要在 Spring boot 2.0+ 中使用千分尺,我必须删除 micrometer-spring-legacy<dependency/>。不幸的是,management.metrics.export.prometheus.pushgateway 的所有配置都消失了。那么如何使用 spring boot 2.0 将指标导出到 pushgateway? 非常感谢!

【问题讨论】:

    标签: spring-boot prometheus micrometer


    【解决方案1】:

    不幸的是,Prometheus Pushgateway 自动配置没有进入 Spring-Boot 2。不确定包含 micromter-spring-legacy 设置的 PR 是否会被接受。

    与此同时,您可以尝试设置自己的 @Configuration 类,其中包括以 here 开头的所有内容。

    这是一个快速拼接的解决方案:

    @Configuration
    @EnableConfigurationProperties(PushgatewayProperties.class)
    public class PushgatewayConfiguration {
    
        @ConfigurationProperties(prefix = "management.metrics.export.prometheus.pushgateway")
        public static class PushgatewayProperties {
            /**
            * Enable publishing via a Prometheus Pushgateway.
            */
            private Boolean enabled = false;
    
            /**
            * Required host:port or ip:port of the Pushgateway.
            */
            private String baseUrl = "localhost:9091";
    
            /**
            * Required identifier for this application instance.
            */
            private String job;
    
            /**
            * Frequency with which to push metrics to Pushgateway.
            */
            private Duration pushRate = Duration.ofMinutes(1);
    
            /**
            * Push metrics right before shut-down. Mostly useful for batch jobs.
            */
            private boolean pushOnShutdown = true;
    
            /**
            * Delete metrics from Pushgateway when application is shut-down
            */
            private boolean deleteOnShutdown = true;
    
            /**
            * Used to group metrics in pushgateway. A common example is setting
            */
            private Map<String, String> groupingKeys = new HashMap<>();
    
            public Boolean getEnabled() {
                return enabled;
            }
    
            public void setEnabled(Boolean enabled) {
                this.enabled = enabled;
            }
    
            public String getBaseUrl() {
                return baseUrl;
            }
    
            public void setBaseUrl(String baseUrl) {
                this.baseUrl = baseUrl;
            }
    
            public String getJob() {
                return job;
            }
    
            public void setJob(String job) {
                this.job = job;
            }
    
            public Duration getPushRate() {
                return pushRate;
            }
    
            public void setPushRate(Duration pushRate) {
                this.pushRate = pushRate;
            }
    
            public boolean isPushOnShutdown() {
                return pushOnShutdown;
            }
    
            public void setPushOnShutdown(boolean pushOnShutdown) {
                this.pushOnShutdown = pushOnShutdown;
            }
    
            public boolean isDeleteOnShutdown() {
                return deleteOnShutdown;
            }
    
            public void setDeleteOnShutdown(boolean deleteOnShutdown) {
                this.deleteOnShutdown = deleteOnShutdown;
            }
    
            public Map<String, String> getGroupingKeys() {
                return groupingKeys;
            }
    
            public void setGroupingKeys(Map<String, String> groupingKeys) {
                this.groupingKeys = groupingKeys;
            }
        }
    
        static class PrometheusPushGatewayEnabledCondition extends AllNestedConditions {
            public PrometheusPushGatewayEnabledCondition() {
                super(ConfigurationPhase.PARSE_CONFIGURATION);
            }
    
            @ConditionalOnProperty(value = "management.metrics.export.prometheus.enabled", matchIfMissing = true)
            static class PrometheusMeterRegistryEnabled {
                //
            }
    
            @ConditionalOnProperty("management.metrics.export.prometheus.pushgateway.enabled")
            static class PushGatewayEnabled {
                //
            }
        }
    
        /**
        * Configuration for
        * <a href="https://github.com/prometheus/pushgateway">Prometheus
        * Pushgateway</a>.
        *
        * @author David J. M. Karlsen
        */
        @Configuration
        @ConditionalOnClass(PushGateway.class)
        @Conditional(PrometheusPushGatewayEnabledCondition.class)
        @Incubating(since = "1.0.0")
        public class PrometheusPushGatewayConfiguration {
            private final Logger logger = LoggerFactory.getLogger(PrometheusPushGatewayConfiguration.class);
            private final CollectorRegistry collectorRegistry;
            private final PushgatewayProperties pushgatewayProperties;
            private final PushGateway pushGateway;
            private final Environment environment;
            private final ScheduledExecutorService executorService;
    
            PrometheusPushGatewayConfiguration(CollectorRegistry collectorRegistry,
                    PushgatewayProperties pushgatewayProperties, Environment environment) {
                this.collectorRegistry = collectorRegistry;
                this.pushgatewayProperties = pushgatewayProperties;
                this.pushGateway = new PushGateway(pushgatewayProperties.getBaseUrl());
                this.environment = environment;
                this.executorService = Executors.newSingleThreadScheduledExecutor((r) -> {
                    final Thread thread = new Thread(r);
                    thread.setDaemon(true);
                    thread.setName("micrometer-pushgateway");
                    return thread;
                });
                executorService.scheduleAtFixedRate(this::push, 0, pushgatewayProperties.getPushRate().toMillis(),
                        TimeUnit.MILLISECONDS);
            }
    
            void push() {
                try {
                    pushGateway.pushAdd(collectorRegistry, job(), pushgatewayProperties.getGroupingKeys());
                } catch (UnknownHostException e) {
                    logger.error("Unable to locate host '" + pushgatewayProperties.getBaseUrl()
                            + "'. No longer attempting metrics publication to this host");
                    executorService.shutdown();
                } catch (Throwable t) {
                    logger.error("Unable to push metrics to Prometheus Pushgateway", t);
                }
            }
    
            @PreDestroy
            void shutdown() {
                executorService.shutdown();
                if (pushgatewayProperties.isPushOnShutdown()) {
                    push();
                }
                if (pushgatewayProperties.isDeleteOnShutdown()) {
                    try {
                        pushGateway.delete(job(), pushgatewayProperties.getGroupingKeys());
                    } catch (Throwable t) {
                        logger.error("Unable to delete metrics from Prometheus Pushgateway", t);
                    }
                }
            }
    
            private String job() {
                String job = pushgatewayProperties.getJob();
                if (job == null) {
                    job = environment.getProperty("spring.application.name");
                }
                if (job == null) {
                    // There's a history of Prometheus spring integration defaulting the job name to
                    // "spring" from when
                    // Prometheus integration didn't exist in Spring itself.
                    job = "spring";
                }
                return job;
            }
        }
    
    }
    

    【讨论】:

    • 不错的解决方案。这就是我想要的!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2018-05-14
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2020-10-06
    相关资源
    最近更新 更多