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 搜索,分组,静音等操作

  • 相关阅读:
    MySQL中内存分为全局内存和线程内存
    mysql 线程级别的缓冲区
    MySQL Handler变量解析
    HANDLER命令与实现
    MySQL Spatial Extensions 地理信息
    C++中临时对象的学习笔记
    HDC与CDC相互转换
    B树
    基于R-Tree的最近邻查询
    地图发布的几种服务的区别
  • 原文地址:https://www.cnblogs.com/lemanlai/p/13523882.html
Copyright © 2011-2022 走看看