zoukankan      html  css  js  c++  java
  • 91)Prometheus简单入门

    1- 简介

    • 一套开源的系统监控报警框架
    • 启发于 Google 的 borgmon 监控系统
    • 2012 年由由工作在 SoundCloud 的 google 前员工创建,为社区开源项目进行开发,并于 2015 年正式发布
    • 2016 年,Prometheus 正式加入 Cloud Native Computing Foundation

    1.1- 特点

    1. 强大的多维度数据模型:
      • 时间序列数据通过 metric 名和键值对来区分。
      • 所有的 metrics 都可以设置任意的多维标签。
      • 数据模型更随意,不需要刻意设置为以点分隔的字符串。
      • 可以对数据模型进行聚合,切割和切片操作。
      • 支持双精度浮点类型,标签可以设为全 unicode。
    2. 灵活而强大的查询语句(PromQL
      • 在同一个查询语句,可以对多个 metrics 进行乘法、加法、连接、取分数位等操作
    3. 易于管理
      • server 是一个单独的二进制文件,可直接在本地工作,不依赖于分布式存储。
    4. 高效
      • 平均每个采样点仅占 3.5 byte
      • 一个 Prometheus server 可以处理数百万的 metrics。
    5. 使用 pull 模式采集时间序列数据
      • 有利于本机测试
      • 避免有问题的服务器推送坏的 metrics
    6. 可以采用 push gateway 的方式把时间序列数据推送至 Prometheus server 端
    7. 可以通过服务发现或者静态配置去获取监控的 targets
    8. 支持多种可视化图形界面
    9. 易于伸缩

    【注意:】

    • 数据采集可能会有丢失
    • 不适用对采集数据要 100% 准确的情形
    • 适用于微服务的体系架构

    1.2- 组件

    Prometheus具有以下组件,并且是可以选择安装的:

    • Prometheus Server: 用于收集和存储时间序列数据。
    • Client Library: 客户端库,为需要监控的服务生成相应的 metrics 并暴露给 Prometheus server。当 Prometheus server 来 pull 时,直接返回实时状态的 metrics。
    • Push Gateway: 主要用于短期的 jobs。由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。为此,这次 jobs 可以直接向 Prometheus server 端推送它们的 metrics。这种方式主要用于服务层面的 metrics,对于机器层面的 metrices,需要使用 node exporter。
    • Exporters: 用于暴露已有的第三方服务的 metrics 给 Prometheus。
    • Alertmanager: 从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook 等。
    • 一些其他的工具。

    1.3- 架构

    Prometheus 的主要模块包括:Prometheus server, exporters, Pushgateway, PromQL, Alertmanager 以及图形界面

    架构图

    1.4- 工作流程

    1. Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics。
    2. Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。
    3. Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警。
    4. 在图形界面中,可视化采集数据。

    2- Prometheus 数据类型

    2.1- 数据类型

    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”}。

    2.2- metric类型

    1. Counter(计数器)

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

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

    2. Gauge

      • 常规的 metric,典型的应用如:温度,运行的 goroutines 的个数
      • 支持任意加减

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

    3. Histogram

      • 柱状图,典型的应用如:请求持续时间,响应大小
      • 观察结果采样,分组及统计
    4. Summary

      • 类似于 Histogram, 典型的应用如:请求持续时间,响应大小。
      • 提供观测值的 count 和 sum 功能。
      • 提供百分位的功能,即可以按百分比划分跟踪结果
    5. instance 和 jobs

      • instance: 一个单独 scrape 的目标, 一般对应于一个进程
      • jobs: 一组同种类型的 instances(主要用于保证可扩展性和可靠性)

      例如:

      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

    3- Node exporter

    • 监控linux,需要在机器上安装 node exporter。

    • Node exporter 主要用于暴露 metrics 给 Prometheus,其中 metrics 包括:cpu 的负载,内存的使用情况,网络等

    3.1- 安装

    cd /opt/
    wget https://github.com/prometheus/node_exporter/releases/download/v0.14.0/node_exporter-0.14.0.linux-amd64.tar.gz
    tar -xvzf node_exporter-0.14.0.linux-amd64.tar.gz
    

    当 node exporter 启动时,可以通过 curl http://localhost:9100/metrics 或者在浏览器中查看 ubuntu server 里面的 metrics

    3.2- 验证 node exporter

    curl http://localhost:9100/metrics
    ......
    # HELP node_cpu Seconds the cpus spent in each mode.
    # TYPE node_cpu counter
    node_cpu{cpu="cpu0",mode="guest"} 0
    node_cpu{cpu="cpu0",mode="idle"} 30.02
    node_cpu{cpu="cpu0",mode="iowait"} 0.5
    node_cpu{cpu="cpu0",mode="irq"} 0
    node_cpu{cpu="cpu0",mode="nice"} 0
    node_cpu{cpu="cpu0",mode="softirq"} 0.34
    node_cpu{cpu="cpu0",mode="steal"} 0
    node_cpu{cpu="cpu0",mode="system"} 5.38
    node_cpu{cpu="cpu0",mode="user"} 11.34
    # HELP node_disk_bytes_read The total number of bytes read successfully.
    # TYPE node_disk_bytes_read counter
    node_disk_bytes_read{device="sda"} 5.50009856e+08
    node_disk_bytes_read{device="sr0"} 67584
    # HELP node_disk_bytes_written The total number of bytes written successfully.
    # TYPE node_disk_bytes_written counter
    node_disk_bytes_written{device="sda"} 2.0160512e+07
    node_disk_bytes_written{device="sr0"} 0
    # HELP node_disk_io_now The number of I/Os currently in progress.
    # TYPE node_disk_io_now gauge
    node_disk_io_now{device="sda"} 0
    node_disk_io_now{device="sr0"} 0
    # HELP node_disk_io_time_ms Total Milliseconds spent doing I/Os.
    # TYPE node_disk_io_time_ms counter
    node_disk_io_time_ms{device="sda"} 3484
    node_disk_io_time_ms{device="sr0"} 12
    ......
    # HELP node_memory_MemAvailable Memory information field MemAvailable.
    # TYPE node_memory_MemAvailable gauge
    node_memory_MemAvailable 1.373270016e+09
    # HELP node_memory_MemFree Memory information field MemFree.
    # TYPE node_memory_MemFree gauge
    node_memory_MemFree 9.2403712e+08
    # HELP node_memory_MemTotal Memory information field MemTotal.
    # TYPE node_memory_MemTotal gauge
    node_memory_MemTotal 2.098388992e+09
    ......
    # HELP node_network_receive_drop Network device statistic receive_drop.
    # TYPE node_network_receive_drop gauge
    node_network_receive_drop{device="docker0"} 0
    node_network_receive_drop{device="eth0"} 0
    node_network_receive_drop{device="eth1"} 0
    node_network_receive_drop{device="lo"} 0
    

    4- Prometheus 安装和配置

    4.1 安装

    Prometheus 可以采用多种方式安装

    • 二进制
    • docker images
    • kubernetes

    使用docker images安装如下:

    docker run -d -p 9090:9090 
                -v $PWD/prometheus.yml:/etc/prometheus/prometheus.yml 
                -v $PWD/alert.rules:/etc/prometheus/alert.rules 
                --name prometheus 
                prom/prometheus 
                -config.file=/etc/prometheus/prometheus.yml 
                -alertmanager.url=http://0.0.0.0:9093
    

    4.2- 配置

    Prometheus.yml 配置文件:
    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=<job_name>` to any timeseries scraped from this config.
      - job_name: 'prometheus'  # 一定要全局唯一, 采集 Prometheus 自身的 metrics
    
        # 覆盖全局的 scrape_interval
        scrape_interval: 5s
    
        static_configs:  # 静态目标的配置
          - targets: ['172.17.0.2:9090']
    
      - job_name: 'node'  # 一定要全局唯一, 采集本机的 metrics,需要在本机安装 node_exporter
    
        scrape_interval: 10s
    
        static_configs:
          - targets: ['10.0.2.15:9100']  # 本机 node_exporter 的 endpoint
    

    alert 规则文件的内容如下:

    # Alert for any instance that is unreachable for >5 minutes.
    ALERT InstanceDown   # alert 名字
      IF up == 0           # 判断条件
      FOR 5m             # 条件保持 5m 才会发出 alert
      LABELS { severity = "critical" }  # 设置 alert 的标签
      ANNOTATIONS {             # alert 的其他标签,但不用于标识 alert
        summary = "Instance {{ $labels.instance }} down",
        description = "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.",
      }
    

    Prometheus server 起来时,可以在 Prometheus 容器的日志中看到:

    time="2017-09-05T08:18:02Z" level=info msg="Starting prometheus (version=1.7.1, branch=master,
    revision=3afb3fffa3a29c3de865e1172fb740442e9d0133)" source="main.go:88"
    time="2017-09-05T08:18:02Z" level=info msg="Build context (go=go1.8.3, user=root@0aa1b7fc430d, date=20170612-
    11:44:05)" source="main.go:89"
    time="2017-09-05T08:18:02Z" level=info msg="Host details (Linux 3.19.0-75-generic #83~14.04.1-Ubuntu SMP Thu Nov
    10 10:51:40 UTC 2016 x86_64 71984d75e6a1 (none))" source="main.go:90"
    time="2017-09-05T08:18:02Z" level=info msg="Loading configuration file /etc/prometheus/prometheus.yml"
    source="main.go:252"
    time="2017-09-05T08:18:03Z" level=info msg="Loading series map and head chunks..." source="storage.go:428"
    time="2017-09-05T08:18:03Z" level=info msg="0 series loaded." source="storage.go:439"
    time="2017-09-05T08:18:03Z" level=info msg="Starting target manager..." source="targetmanager.go:63"
    time="2017-09-05T08:18:03Z" level=info msg="Listening on :9090" source="web.go:259"
    

    浏览器中访问 Prometheus 的主页 http://localhost:9091, 可以看到 Prometheus 的信息如下:

    5- Alertmanager 安装和配置

    当接收到 Prometheus 端发送过来的 alerts 时,Alertmanager 会对 alerts 进行去重复,分组,路由到对应集成的接受端,包括:slack,电子邮件,pagerduty,hitchat,webhook

    5.1- Alermanager 中 config.yml 文件

    root@ubuntu1404-dev:~/alertmanager# cat config.yml
    global:
        resolve_timeout: 5m
    route:
        receiver: 'default-receiver'
        group_wait: 30s
        group_interval: 1m
        repeat_interval: 1m
        group_by: ['alertname']
    
        routes:
        - match:
            severity: critical
          receiver: my-slack
    
    receivers:
    - name: 'my-slack'
      slack_configs:
      - send_resolved: true
        api_url: https://hooks.slack.com/services/***
        channel: '#alertmanager-critical'
        text: "{{ .CommonAnnotations.description }}"
    
    - name: 'default-receiver'
      slack_configs:
      - send_resolved: true
        api_url: https://hooks.slack.com/services/***
        channel: '#alertmanager-default'
        text: "{{ .CommonAnnotations.description }}"
    

    5.2- 用 docker 启动一个 Alertmanager 的容器

    docker run -d -p 9093:9093
                     –v /opt/config.yml:/etc/alertmanager/config.yml 
                     --name alertmanager 
                     prom/alertmanager
    
    docker ps | grep alert
    d1b7a753a688        prom/alertmanager   "/bin/alertmanager -c"   25 hours ago        Up 25 hours
    0.0.0.0:9093->9093/tcp   alertmanager
    

    通过浏览器访 Alertmanager 的主页 http://localhost:9093

    在 alerts 的页面中,我们可以看到从 Prometheus sever 端发过来的 alerts,此外,还可以做 alerts 搜索,分组,静音等操作

  • 相关阅读:
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第50章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第49章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第48章 读书笔记(待更新)
    Spring Boot 中使用 Quartz 实现任务调度
    实战 FastDFS Java 客户端上传文件
    分布式文件系统之 FastDFS
    Java 持久层框架之 MyBatis
    C语言实现贪吃蛇
    [转载]分享三篇非常好的学习心得
    selenium加载cookie报错问题:selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain
  • 原文地址:https://www.cnblogs.com/lemanlai/p/13523882.html
Copyright © 2011-2022 走看看