文档章节

prometheus收集springboot指标

super-wen
 super-wen
发布于 2017/06/02 17:53
字数 577
阅读 134
收藏 4
点赞 0
评论 0

##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
粉丝 4
博文 34
码字总数 12835
作品 0
徐汇
程序员
springboot2输出metrics到influxdb

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

go4it ⋅ 前天 ⋅ 0

恒宇少年/spring-boot-chapter

简书整套文档以及源码解析 专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解 003 Quer...

恒宇少年 ⋅ 04/19 ⋅ 0

一个 SpringBoot 项目通过 SOFALookout & Prometheus 进行监控

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

Harries Blog™ ⋅ 06/11 ⋅ 0

SpringBoot学习【简】

这里有一个不错的专栏,推荐一下 SpringBoot 教程 SpringBoot(四):SpringBoot整合JdbcTemplate SpringBoot(五):SpringBoot整合MyBatis 尤其这两文...

anlve ⋅ 05/22 ⋅ 0

学习 Spring Boot 知识看这一篇就够了

从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区、我的博客和我的公号内。粗略的统计了一下总共的文章加起来大概有六十多篇了,其中一部分...

ityouknow ⋅ 05/28 ⋅ 0

SpringBoot 整合(六)Security & Oauth2.0(完整篇)

1. 快速实现篇(实现最基本的登录): SpringSecurity 快速实现项目 2. 企业级封装篇 我的 Spring Security 文集 SpringBoot 整合 Security(一)实现用户认证并判断返回json还是view SpringBo...

FantJ ⋅ 05/22 ⋅ 0

SpringBoot 入门实例

SpringBoot 是由 pivotal 提供的 Java 开发框架,伴随着 spring 4.0 版本一起发布,旨在简化 Spring 项目的初始化及开发过程,框架本身为开发过程提供了大量的默认配置,当然我们也可以通过简...

Aotian ⋅ 05/29 ⋅ 0

Spring Boot干货系列: (三)启动原理解析

     前言   前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏。所以这次博主就跟你们一起一步步...

后端编程嘟 ⋅ 2017/03/13 ⋅ 0

springboot开发简单的web应用前篇

你已经会spring了,也非常熟悉springmvc的开发,平时你搭建个web应用简单吗?好像也不难!那么今天我来试试用springboot来开发个简单的web应用来试试。 在正式讲解springboot开发web应用之前...

GeCoder ⋅ 05/04 ⋅ 0

使用IntelliJ Idea新建SpringBoot项目

简单给大家介绍一下我来创建SpringBoot项目使用的工具,本人使用IntelliJ Idea来创建项目,利用其中的Spring Initializr工具来快速创建项目。 步骤如下: 菜单栏中选择File--New--Project,出...

dalaoyang ⋅ 03/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 39分钟前 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部