文档章节

prometheus收集springboot指标

super-wen
 super-wen
发布于 2017/06/02 17:53
字数 577
阅读 241
收藏 3

##prometheus 主动采集 springboot

maven dependency

          <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-actuator</artifactId>
                <version>${spring-boot.version}</version>
         </dependency>

        <dependency>
            <groupId>com.moelholm</groupId>
            <artifactId>prometheus-spring-boot-starter</artifactId>
            <version>1.0.1</version>
        </dependency>

实现逻辑

将springboot内部的publicMetrics转为prometheus 格式.

@Component
public class SpringBootMetricsCollector extends Collector {
  private final Collection<PublicMetrics> publicMetrics;

  @Autowired
  public SpringBootMetricsCollector(Collection<PublicMetrics> publicMetrics) {
    this.publicMetrics = publicMetrics;
  }

  @Override
  public List<MetricFamilySamples> collect() {
    ArrayList<MetricFamilySamples> samples = new ArrayList<MetricFamilySamples>();
    for (PublicMetrics publicMetrics : this.publicMetrics) {
      for (Metric<?> metric : publicMetrics.metrics()) {
        String name = Collector.sanitizeMetricName(metric.getName());
        double value = metric.getValue().doubleValue();
        MetricFamilySamples metricFamilySamples = new MetricFamilySamples(
                name, Type.GAUGE, name, Collections.singletonList(
                new MetricFamilySamples.Sample(name, new ArrayList<String>(), new ArrayList<String>(), value)));
        samples.add(metricFamilySamples);
      }
    }
    return samples;
  }
}

prometheus 通过访问/prometheus节点采集。

git库地址:https://github.com/thomasdarimont/prometheus-spring-boot-starter

springboot 推送metrics 到 pushGateway,然后prometheus 去pushGateway采集。

          <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-actuator</artifactId>
                <version>${spring-boot.version}</version>
         </dependency>

            <dependency>
                <groupId>io.prometheus</groupId>
                <artifactId>simpleclient_pushgateway</artifactId>
                <version>0.0.21</version>
            </dependency>
             <dependency>
                <groupId>io.prometheus</groupId>
                <artifactId>simpleclient_spring_boot</artifactId>
                <version>0.0.21</version>
            </dependency>
            

具体代码

@Configuration
@ComponentScan("io.prometheus.client.spring.boot")
public class PrometheusConfiguration {
    private static final Logger LOGGER = LoggerFactory.getLogger(PrometheusConfiguration.class);

    @Value("${spring.application.name}")
    String applicationName;

    @Value("${prometheus.pushgateway.host}")
    String pushHost;

    @Value("${prometheus.pushgateway.intervalInMillis:10000}")
    long intervalInMillis;


    @Autowired
    private SpringBootMetricsCollector springBootMetricsCollector;


    @PostConstruct
    public void initialize() {
        Map<String,String> map = new HashMap<>();
        //这里存在问题,在docker中获得的是1@localhost
        map.put("instance", ManagementFactory.getRuntimeMXBean().getName());
        PushGateway prometheusPush = new PushGateway(pushHost);
        Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(() -> {
            try {
                LOGGER.debug("prometheus push");
                prometheusPush.push(springBootMetricsCollector, applicationName,map);
            } catch (Exception e) {
                LOGGER.error("prometheus push error", e);
            }
        }, 5000, intervalInMillis, TimeUnit.MILLISECONDS);
    }
}

修改上述代码,使之适用dcos,docker环境

当服务部署在dcos上时,端口是不固定,数量是不固定的.这时候就需要通过主动推送到pushGateway后,交由prometheus 采集.

@Configuration
public class SystemConfiguration implements EnvironmentAware {

    private static final Logger LOGGER = LoggerFactory.getLogger(SystemConfiguration.class);

    private String host;//docker 传入的宿主机ip

    private String port0;

    private String prot1;

    @Value("${server.port}")
    private String serverPort;

    @Override
    public void setEnvironment(Environment environment) {
        /**
         * 在docker中.目的是从环境变量中获得传入的宿主机ip和端口.
         */
        this.host = environment.getProperty("HOST");
        this.port0 = environment.getProperty("PORT0");
        this.prot1 = environment.getProperty("PORT1");
        LOGGER.info("-------------------------environment");
        LOGGER.info("host:"+host);
        LOGGER.info("port0:"+ port0);
        LOGGER.info("prot1:"+ prot1);
    }

    @PostConstruct
    public void init(){
        if(StringUtils.isEmpty(host)){
            //未能从环境变量中获得host
            try {
                 this.host = InetAddress.getLocalHost().getHostAddress();
            } catch (UnknownHostException e) {
                LOGGER.error("获得host失败",e);
            }
            this.port0 = serverPort;
        }
        LOGGER.info("-------------------------postConstruct");
        LOGGER.info("host:"+this.host);
        LOGGER.info("port0:"+this.port0);
    }


    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public String getPort0() {
        return port0;
    }

    public void setPort0(String port0) {
        this.port0 = port0;
    }

    public String getProt1() {
        return prot1;
    }

    public void setProt1(String prot1) {
        this.prot1 = prot1;
    }

    public String getServerPort() {
        return serverPort;
    }

    public void setServerPort(String serverPort) {
        this.serverPort = serverPort;
    }
}

@Configuration
@ComponentScan("io.prometheus.client.spring.boot")
public class PrometheusConfiguration  {
    private static final Logger LOGGER = LoggerFactory.getLogger(PrometheusConfiguration.class);

    @Value("${spring.application.name}")
    String applicationName;

    @Value("${prometheus.pushgateway.host}")
    String pushHost;

    @Value("${prometheus.pushgateway.intervalInMillis:10000}")
    long intervalInMillis;

    @Autowired
    private SystemConfiguration systemConfiguration;


    @Autowired
    private SpringBootMetricsCollector springBootMetricsCollector;


    @PostConstruct
    public void initialize() {


        Map<String,String> map = new HashMap<>();
        map.put("instance", systemConfiguration.getHost()+"@"+systemConfiguration.getPort0());
        PushGateway prometheusPush = new PushGateway(pushHost);
        Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(() -> {
            try {
                LOGGER.debug("prometheus push");
                prometheusPush.push(springBootMetricsCollector, applicationName,map);
            } catch (Exception e) {
                LOGGER.error("prometheus push error", e);
            }
        }, 5000, intervalInMillis, TimeUnit.MILLISECONDS);
    }


}

© 著作权归作者所有

共有 人打赏支持
super-wen
粉丝 5
博文 37
码字总数 13546
作品 0
徐汇
程序员
私信 提问
基于Docker+Prometheus+Grafana监控SpringBoot健康信息

在微服务体系当中,监控是必不可少的。当系统环境超过指定的阀值以后,需要提醒指定的运维人员或开发人员进行有效的防范,从而降低系统宕机的风险。在CNCF云计算平台中,Prometheus+Grafana是...

融科聂晨
11/05
0
0
springboot2输出metrics到influxdb

序 本文主要研究一下如何将springboot2的metrics输出到influxdb maven 配置 influx 启动之后创建数据库 命令行创建 rest接口创建 返回 或者直接配置文件指定auto-create-db=true,就无需额外...

go4it
06/17
0
0
为springboot项目添加springboot-admin监控

我们知道spring-boot-actuator暴露了大量统计和监控信息的端点,spring-boot-admin 就是为此提供的监控项目。 先来看看大概会提供什么样的功能 从图中可以看出,主要内容都是由spring boot a...

ryan-miao
06/12
0
0
深入理解SpringBoot的过滤条件--AutoConfigure

我们知道在Spring及SpringBoot里按条件创建Bean的核心是接口与注解,其实在SpringBoot里还有一种AutoConfigure也可以来过滤配置,只不过这种技术,能够让SpringBoot更快速的启动,那么下面我们...

融科聂晨
07/23
0
0
一个 SpringBoot 项目通过 SOFALookout & Prometheus 进行监控

一个 SpringBoot 项目通过 SOFALookout & Prometheus 进行监控 Harries Blog™2018-06-110 阅读 SpringAppcatclientbuildapache...

Harries Blog™
06/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

oh-my-zsh 自定义

GitHub 地址 基于 oh-my-zsh 的自定义配置,增加了一些个人常用插件与皮肤。 采用的是 git submodule 来维护,包括 oh-my-zsh,之所以这么搞,主要是手头有多台 linux 需要维护, 每台机器、...

郁也风
今天
4
0
Docker安装踩坑:E_FAIL 0x80004005的解决

参考 菜鸟教程--Windows Docker 安装 http://www.runoob.com/docker/windows-docker-install.html 官方文档-Install Docker Toolbox on Windows https://docs.docker.com/toolbox/toolbox_in......

karma123
今天
4
0
js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
17
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
27
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
31
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部