SpringBoot进阶教程(七十一)详解Prometheus+Grafana

随着容器技术的迅速发展,Kubernetes已然成为大家追捧的容器集群管理系统。Prometheus作为生态圈Cloud Native Computing Foundation(简称:CNCF)中的重要一员。Prometheus是一套开源的系统监控报警框架。它启发于Google的borgmon监控系统,由工作在SoundCloud的google前员工在2012年创建,作为社区开源项目进行开发,并于2015年正式发布。2016年,Prometheus正式加入Cloud Native Computing Foundation,成为受欢迎度仅次于Kubernetes的项目。

作为新一代的监控框架,Prometheus具有以下特点:

  1. 强大的多维度数据模型:

(1) 时间序列数据通过metric名和键值对来区分。

(2) 所有的metrics都可以设置任意的多维标签。

(3) 数据模型更随意,不需要刻意设置为以点分隔的字符串。

(4) 可以对数据模型进行聚合,切割和切片操作。

(5) 支持双精度浮点类型,标签可以设为全unicode。

  1. 灵活而强大的查询语句(PromQL):在同一个查询语句,可以对多个metrics进行乘法、加法、连接、取分数位等操作。

  2. 易于管理: Prometheus server是一个单独的二进制文件,可直接在本地工作,不依赖于分布式存储。

  3. 高效:平均每个采样点仅占 3.5 bytes,且一个Prometheus server可以处理数百万的metrics。

  4. 使用 pull 模式采集时间序列数据,这样不仅有利于本机测试而且可以避免有问题的服务器推送坏的metrics。

  5. 可以采用push gateway的方式把时间序列数据推送至Prometheus server 端。

  6. 可以通过服务发现或者静态配置去获取监控的targets。

  7. 有多种可视化图形界面。

  8. 易于伸缩。

需要指出的是,由于数据采集可能会有丢失,所以Prometheus不适用对采集数据要100%准确的情形。但如果用于记录时间序列数据,Prometheus具有很大的查询优势,此外,Prometheus适用于微服务的体系架构。

Prometheus官方文档中的架构图:

SpringBoot进阶教程(七十一)详解Prometheus+Grafana

从上图可以看出,Prometheus的主要模块包括:Prometheus server, exporters, Pushgateway, PromQL, Alertmanager 以及图形界面。

Prometheus生态圈中包含了多个组件,其中许多组件是可选的:

  1. Prometheus Server: 用于收集和存储时间序列数据。

  2. Client Library: 客户端库,为需要监控的服务生成相应的metrics并暴露给Prometheus server。当Prometheus server来 pull 时,直接返回实时状态的metrics。

  3. Push Gateway: 主要用于短期的jobs。由于这类jobs存在时间较短,可能在Prometheus来pull之前就消失了。为此,这次jobs可以直接向Prometheus server端推送它们的metrics。这种方式主要用于服务层面的metrics,对于机器层面的metrices,需要使用node exporter。

  4. Exporters: 用于暴露已有的第三方服务的metrics给Prometheus。

  5. Alertmanager: 从Prometheus server端接收到alerts后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook等。

  6. 一些其他的工具。

其大概的工作流程是:

  1. Prometheus server定期从配置好的jobs或者exporters中拉metrics,或者接收来自Pushgateway发过来的metrics,或者从其他的Prometheus server中拉metrics。

  2. Prometheus server在本地存储收集到的metrics,并运行已定义好的alert.rules,记录新的时间序列或者向Alertmanager推送警报。

  3. Alertmanager根据配置文件,对接收到的警报进行处理,发出告警。

  4. 在图形界面中,可视化采集数据。

下面将对Prometheus中的数据模型,metric类型以及instance和job等概念进行介绍,以便读者在Prometheus的配置和使用中可以有一个更好的理解。

数据模型

Prometheus中存储的数据为时间序列,是由metric的名字和一系列的标签(键值对)唯一标识的,不同的标签则代表不同的时间序列。

  • metric 名字:该名字应该具有语义,一般用于表示metric的功能,例如:httprequests_total, 表示http请求的总数。其中,metric名字由ASCII字符,数字,下划线,以及冒号组成,且必须满足正则表达式 [a-zA-Z:][a-zA-Z0-9_:]*
  • 标签:使同一个时间序列有了不同维度的识别。例如 httprequests_total{method="Get"}表示所有http请求中的Get请求。当 method="post"时,则为新的一个metric。标签中的键由ASCII字符,数字,以及下划线组成,且必须满足正则表达式 [a-zA-Z:][a-zA-Z0-9_:]*
  • 样本:实际的时间序列,每个序列包括一个float64的值和一个毫秒级的时间戳。
  • 格式: {=,…},例如: http_requests_total{method="POST",endpoint="/api/tracks"}

四种Metric类型

Prometheus 客户端库主要提供四种主要的 metric 类型:

  1. Counter一种累加的 metric,典型的应用如:请求的个数,结束的任务数, 出现的错误数等等。

例子:查询 http_requests_total{method="get", job="Prometheus", handler="query"}返回8,10秒后,再次查询,则返回14。

  1. Gauge一种常规的metric,典型的应用如:温度,运行的goroutines的个数;可以任意加减。

例子: go_goroutines{instance="172.17.0.2″, job="Prometheus"}返回值147,10秒后返回124。

  1. Histogram可以理解为柱状图,典型的应用如:请求持续时间,响应大小;可以对观察结果采样,分组及统计。

例子:查询 http_request_duration_microseconds_sum{job="Prometheus", handler="query"}时,返回结果如下:

SpringBoot进阶教程(七十一)详解Prometheus+Grafana
  1. Summary类似于Histogram, 典型的应用如:请求持续时间,响应大小;提供观测值的count和sum功能;提供百分位的功能,即可以按百分比划分跟踪结果。

instance和jobs

instance: 一个单独scrape的目标, 一般对应于一个进程。

jobs: 一组同种类型的instances(主要用于保证可扩展性和可靠性),例如:

job和instance的关系:

job: api-server

    instance 1: 1.2.3.4:5670
    instance 2: 1.2.3.4:5671
    instance 3: 5.6.7.8:5670
    instance 4: 5.6.7.8:5671

当scrape目标时,Prometheus会自动给这个scrape的时间序列附加一些标签以便更好的分别,例如: instance,job。

注意:以上段落均出自《Prometheus入门与实践》, 感兴趣的可以看看原文。

  1. 下载所需镜像
docker pull prom/node-exporter
docker pull prom/prometheus
docker pull grafana/grafana
  1. 启动node-exporter
docker run -d -p 9100:9100 \
  -v "/proc:/host/proc:ro" \
  -v "/sys:/host/sys:ro" \
  -v "/:/rootfs:ro" \
  --net="host" \
  prom/node-exporter
  1. 验证node-exporter

url访问 http://toutou.com:9100/metrics,效果如下:

SpringBoot进阶教程(七十一)详解Prometheus+Grafana

Node exporter主要用于暴露metrics给Prometheus,其中metrics包括:cpu的负载,内存的使用情况,网络等。有了这些就可以做数据展示了

  1. 启动prometheus
mkdir /data/prometheus
mkdir config
cd /data/prometheus/config
vim prometheus.yml
全局设置,可以被覆盖
global:
  # 默认值为 15s,用于设置每次数据收集的间隔
  scrape_interval:     15s
  # 估算规则的默认周期 每15秒计算一次规则
  evaluation_interval: 15s
设置报警规则
#rule_files:
  #- "first_rules.yml"
#抓取配置列表
scrape_configs:
   # 一定要全局唯一, 采集 Prometheus 自身的 metrics
  - job_name: prometheus
    # 静态目标的配置
    static_configs:
       #这个自带的默认监控prometheus所在机器的prometheus状态
      - targets: ['localhost:9090']
        labels:
          instance: prometheus
   # 一定要全局唯一, 采集 Prometheus 自身的 metrics
  - job_name: linux
    static_configs:
      # 本机 node_exporter 的 endpoint
      - targets: ['localhost:9100']
        labels:
          # 新添加的标签,可以自定义
          instance: toutoudemo
docker run  -d \
  -p 9090:9090 \
  -v /data/prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml  \
  --name pr \
  prom/prometheus
  1. 验证prometheus

url访问 http://toutou.com:9090/graph,效果如下:

SpringBoot进阶教程(七十一)详解Prometheus+Grafana

SpringBoot进阶教程(七十一)详解Prometheus+Grafana
  1. 上文中已经拉取了grafana的镜像,这里直接启动即可

创建/data/app/grafana/data文件夹存储数据,创建好了以后启动grafana。

docker run -d \
  -p 3000:3000 \
  --name=grafana \
  -v /data/app/grafana/data:/var/lib/grafana \
  grafana/grafana

我们发现运行以后,docker实例并没有起来,于是我们用 docker logs grafana查看了docker日志。

[root@localhost data]# docker logs grafana
GF_PATHS_DATA='/var/lib/grafana' is not writable.

You may have issues with file permissions, more information here: http://docs.grafana.org/installation/docker/#migration-from-a-previous-version-of-the-docker-container-to-5-1-or-later
mkdir: can't create directory '/var/lib/grafana/plugins': Permission denied

因为grafana用户会在这个目录写入文件,所以需要设置权限

  1. /data/app/grafana/data设置权限

chmod 777 -R /data/app/grafana/data

  1. 验证grafana

url访问 http://toutou.com:3000,效果如下:

SpringBoot进阶教程(七十一)详解Prometheus+Grafana

打开之后的登录界面用默认账号/密码admin登录即可,会引导你修改密码,这里由于是本地测试的,就不设置了,直接skip跳过。

  1. Add data source

点开Configuration(齿轮图标)->Data Source,然后点击Add data source按钮。然后选择Prometheus则进入到Prometheus数据源配置。

SpringBoot进阶教程(七十一)详解Prometheus+Grafana

SpringBoot进阶教程(七十一)详解Prometheus+Grafana

注意,access中选择Browser,配置好Prometheus点击save & test,弹出提示”Data source is working”即可。

  1. Create Dashboard

回到首页,在创建(加号图标)中点击Dashboard,然后点击Add new panel按钮。然后点击Panel Title,点击标题下拉框中的Edit。

SpringBoot进阶教程(七十一)详解Prometheus+Grafana

SpringBoot进阶教程(七十一)详解Prometheus+Grafana

这里我们添加内存和cpu信息,点击保存,输入dashboard名称—cpu&memory(自定义)。回到首页即可看到我们保存的cpu&memory。

SpringBoot进阶教程(七十一)详解Prometheus+Grafana
  1. 添加引用
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-actuatorartifactId>
        dependency>
        <dependency>
            <groupId>io.micrometergroupId>
            <artifactId>micrometer-registry-prometheusartifactId>
        dependency>
  1. 添加application.properties
management.endpoints.web.exposure.include=prometheus
  1. 验证效果

SpringBoot进阶教程(七十一)详解Prometheus+Grafana

注意:开启actuator后要注意要防护,开启actuator的服务千万不能直接对外。常见的方法可以新增一个过滤器对 /actuator路径过滤,只允许内网IP地址访问。

如果不知道如何在springboot过滤拦截的话,可以看看这个。传送门:SpringBoot入门教程(十一)过滤器和拦截器

  1. 部署springboot

部署好了以后,重启docker实例,并查看效果。

如果不知道如何部署springboot的话,可以看看这个。传送门:SpringBoot入门教程(二)CentOS部署SpringBoot项目从0到1

SpringBoot进阶教程(七十一)详解Prometheus+Grafana
  1. prometheus.yml中添加job
global:                  # 全局设置,可以被覆盖
  scrape_interval:     15s # 默认值为 15s,用于设置每次数据收集的间隔

  external_labels:   # 所有时间序列和警告与外部通信时用的外部标签
    monitor: 'codelab-monitor'

rule_files: # 警告规则设置文件
  - '/etc/prometheus/alert.rules'

用于配置 scrape 的 endpoint  配置需要 scrape 的 targets 以及相应的参数
scrape_configs:
  # The job name is added as a label job=</span><span><</span><span>job_name</span><span>></span><span> to any timeseries scraped from this config.

  - job_name: 'prometheus'  # 一定要全局唯一, 采集 Prometheus 自身的 metrics

    # 覆盖全局的 scrape_interval
    scrape_interval: 5s

    static_configs:  # 静态目标的配置
      - targets: ['localhost:9090']

  - job_name: 'node'  # 一定要全局唯一, 采集本机的 metrics,需要在本机安装 node_exporter

    scrape_interval: 10s

    static_configs:
      - targets: ['127.0.0.1:9100']

  - job_name: 'hellolearn'  # 一定要全局唯一, 采集本机的 metrics,需要在本机安装 node_exporter

    scrape_interval: 10s
    metrics_path: /actuator/prometheus
    #params:
        #format: ["prometheus"]
    static_configs:
      - targets: ['127.0.0.1:8301']

SpringBoot进阶教程(七十一)详解Prometheus+Grafana
  1. import模板

上文中我们已经演示了如何在dashboard中逐条添加指标,逐条添加就是熟悉一下指标格式。同样的,Grafana也提供了很多功能强大的模板(更多模板可以在这找),这里我们直接引入一个酷炫一点的模板。更多模板可以在这里找到。

SpringBoot进阶教程(七十一)详解Prometheus+Grafana

SpringBoot进阶教程(七十一)详解Prometheus+Grafana

点击+号 –> Import –> 输入模板链接或ID –> 点击Load。

SpringBoot进阶教程(七十一)详解Prometheus+Grafana

SpringBoot进阶教程(七十一)详解Prometheus+Grafana

Name和Unique identifier (uid)可以自定义,也可以用默认的。

点击import,效果如下:

SpringBoot进阶教程(七十一)详解Prometheus+Grafana
  1. 配置多个应用

若是想配置多个应用,在prometheus.yml中添加job_name,添加好了之后重启docker即可。

- job_name: 'hellolearn'  # 一定要全局唯一, 采集本机的 metrics,需要在本机安装 node_exporter

    scrape_interval: 10s
    metrics_path: /actuator/prometheus
    #params:
        #format: ["prometheus"]
    static_configs:
      - targets: ['127.0.0.1:8301']

  - job_name: 'hellolearn-6'  # 一定要全局唯一, 采集本机的 metrics,需要在本机安装 node_exporter

    scrape_interval: 10s
    metrics_path: /actuator/prometheus
    #params:
        #format: ["prometheus"]
    static_configs:
      - targets: ['127.0.0.1:8306']

在Grafana的dashboard直接切换即可。

SpringBoot进阶教程(七十一)详解Prometheus+Grafana

其他参考/学习资料:

https://github.com/toutouge/javademosecond/tree/master/hellolearn

作 者: 请叫我头头哥
出 处:http://www.cnblogs.com/toutou/
关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角 推荐一下。您的鼓励是作者坚持原创和持续写作的最大动力!

Original: https://www.cnblogs.com/toutou/p/prometheus_grafana.html
Author: 请叫我头头哥
Title: SpringBoot进阶教程(七十一)详解Prometheus+Grafana

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/587006/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 地图坐标:地图火星坐标、地球坐标、百度坐标偏差转换(java代码)

    简单说明什么是坐标偏移? http://yanue.net/post-121.html 地球坐标 (WGS84) 国际标准,从 GPS 设备中取出的数据的坐标系 *国际地图提供商使…

    Java 2023年5月29日
    069
  • MyBatis 获取参数值的两种方式

    MyBatis获取参数值的两种方式:${}和#{}${}的本质就是字符串拼接,#{}的本质就是占位符赋值${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值…

    Java 2023年6月7日
    058
  • 《码处高效:Java开发手册》之代码风格

    流水淡,碧天长,鸿雁成行。编码风格,简捷清爽,反引无限风光。 在美剧《硅谷》中有这样一个经典镜头,主人公 Richard 与同为开发工程师的女友闹分手,理由是两人对缩进方式有着截然…

    Java 2023年6月5日
    061
  • Nginx模块开发入门

    Nginx配置文件基本结构 配置文件可以看做是Nginx的灵魂,Nginx服务在启动时会读入配置文件,而后续几乎一切动作行为都是按照配置文件中的指令进行的,因此如果将Nginx本身…

    Java 2023年5月30日
    064
  • [推荐]趣味剖析Spring5核心原理

    课程亮点; ●你想了解面试中碰到的spring的各种面试问题及背后的原理吗? ●你想知道如何在繁冗复杂的源码中揭开spring IoC的面纱吗? ●你想知道如何在拗口,晦涩的术语中…

    Java 2023年5月29日
    055
  • MyBatis(二四):缓存——一级缓存

    MyBatis的缓存分为一级缓存和二级缓存。 先看一下MyBatis官方文档给出的说明: MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。 为了使它…

    Java 2023年6月15日
    066
  • 关于C语言的学习 01

    include void main() //定义主函数 { //main 函数体开始 函数声明部分 C语言的各种语句 } //main函数结束 代码输出HelloWorld! 例子…

    Java 2023年6月5日
    090
  • SpringBoot 过滤器,拦截器初步学习整理(有示例代码)

    引言 关于两者的理论知识,网上有太多就补贴在本章了。该文章主要以代码的形式说明,方便新手理解。这里也是新手学习时整理的文档,主要针对于新手的,如果有不正确的地方希望加一指正。 两者…

    Java 2023年6月9日
    078
  • 【Java】Cron表达式

    一. 域说明 二. 特殊字符说明 三. 常用例子 四. 注意事项 1. 有些表达式能包含范围或列表 2. “/”字符用来指定数值的增量 3. “…

    Java 2023年5月29日
    042
  • PHP(基本语法)PHP中的Session-登录案例

    文件结构: config.php: php /**1、数据库服务器 */ define(‘DB_HOST’,’localhost’); /**2、数据库用户名 */ define(…

    Java 2023年5月30日
    071
  • JWT(JSON Web Token)的简单介绍及demo

    Original: https://www.cnblogs.com/qishanmozi/p/9761557.htmlAuthor: 祁山墨子Title: JWT(JSON Web…

    Java 2023年6月13日
    069
  • 定时执行任务-springboot

    定时执行任务-springboot 先看两个接口 这两个接口springboot已经帮我们封装好了,我们不需要去手动使用 TaskScheduler //任务调度者 TaskExe…

    Java 2023年6月13日
    074
  • 设计模式之代理模式

    代理模式属于结构型模式,代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,即通过代理对象访问目标对象。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能…

    Java 2023年6月5日
    069
  • 并查集size rank的优化

    目录 并查集 size 的优化 Java 实例代码 并查集 rank 的优化 Java 实例代码 并查集 size 的优化 按照上一篇文章的思路,我们把如下图所示的并查集,进行 u…

    Java 2023年6月5日
    076
  • Mall商城的高级篇的开发(二)性能压测和性能监控

    Mall商城的高级篇的开发(二) 性能压测–压力测试 压力测试考察当前软件硬件环境下系统所能承受的最大负荷并帮助找出系统的瓶颈所在。压测都是为了系统在上线的处理能力和稳…

    Java 2023年6月5日
    087
  • Spring Cloud Feign+Hystrix自定义异常处理

    开启Hystrix spring-cloud-dependencies Dalston版本之后,默认Feign对Hystrix的支持默认是关闭的,需要手动开启。 feign.hys…

    Java 2023年6月6日
    086
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球