promethues基础

准备

  • 安装

    下载prometheus + node_exporter,下载地址 、解压

  • 配置

    地址

    需要配置2个文件,promethues.rules.yml以及promethues.yml

    promethues.rules.yml

    groups:
    - name: cpu-node
      rules:
      - record: job_instance_mode:node_cpu_seconds:avg_rate5m
        expr: avg by (job, instance, mode) (rate(node_cpu_seconds_total[5m]))
    

    promethues.yml

    global:
      scrape_interval:     15s # By default, scrape targets every 15 seconds.
      evaluation_interval: 15s # Evaluate rules every 15 seconds.
    
      # Attach these extra labels to all timeseries collected by this Prometheus instance.
      external_labels:
        monitor: 'codelab-monitor'
    
    rule_files:
      - 'prometheus.rules.yml'
    
    scrape_configs:
      - job_name: 'prometheus'
    
        # Override the global default and scrape targets from this job every 5 seconds.
        scrape_interval: 5s
    
        static_configs:
          - targets: ['localhost:9090']
    
      - job_name:       'node'
    
        # Override the global default and scrape targets from this job every 5 seconds.
        scrape_interval: 5s
    
        static_configs:
          - targets: ['localhost:8080', 'localhost:8081']
            labels:
              group: 'production'
    
          - targets: ['localhost:8082']
            labels:
              group: 'canary'
    
  • 启动

    先启动node_exporter

    cd到node_exporter目录下

    ./node_exporter --web.listen-address 127.0.0.1:8080
    ./node_exporter --web.listen-address 127.0.0.1:8081
    ./node_exporter --web.listen-address 127.0.0.1:8082
    

    再启动promethues

    cd到Promethues目录下

    ./prometheus --config.file=prometheus.yml
    
  • 入口

    http://localhost:9090/

概念

架构

image-20210318135923898

架构介绍的挺多的了,这里注意使用的时序数据库(TSDB: Time Series Database)。

promethues简单讲,就是建立在时序数据库下有专门采集、存储、查询机制的组件。它跟Elasticsearch很相似,它们都有采集、自己的存储系统、自己的查询机制。

时序数据库

时间序列数据库主要用于指处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据。

每个时序点结构如下:

  • metric: 度量,相同于关系型数据库中的table,有些系统中也称为measurement
  • data point: 数据点,相当于关系型数据库中的row,一个data point由tag、field、timestamp组成
  • tag: 标签,粗放不随时间戳变化的属性,起到关系型数据库的索引的作用
  • field: 度量下的不同字段,比如位置这个metric具有经度、维度两个field,会随时间戳的变化而变化
  • timestamp: 时间戳,表示数据发生的时间。

promethues如此,influxDB也是如此,这里先参考influxDB来看看。

influxdb
  • measurement:

    指标对象,也即一个数据源对象。每个measurement可以拥有一个或多个指标值,也即下文所述的field。在实际运用中,可以把一个现实中被检测的对象(如:“cpu”)定义为一个measurement

  • tags:

    概念等同于大多数时序数据库中的tags, 通常通过tags可以唯一标示数据源。每个tag的key和value必须都是字符串,有索引。

  • field:

    数据源记录的具体指标值。每一种指标被称作一个“field”,指标值就是 “field”对应的“value”。值一般是Number,无索引。

  • timestamp:

    数据的时间戳。

在这些概念技术上,还有series、database,跟hbase有些想象,时序数据库可以看成特殊版的NoSQL。

Promethues数据模型

  • metrics

    metrics表示要测量的系统指标,概念同时序数据库中的metric

  • label

    含义同field,指明metrics的具体细节

    api_http_requests_total{method="POST", handler="/messages"}

  • sample

    含义同data point,在Promethues中的每一个点称为一个样本(sample),样本由以下部分组成:

    • 样本值(value): 一个float64的浮点型数据表示当前样本的值。

    • 时间戳(timestamp):一个精确到毫秒的时间戳;

      示例如下:

  node_cpu_seconds_total{cpu="0",mode="idle"} 24247.91
  node_cpu_seconds_total{cpu="0",mode="iowait"} 1.5
  node_cpu_seconds_total{cpu="0",mode="irq"} 0
  node_cpu_seconds_total{cpu="0",mode="nice"} 0.19
  node_cpu_seconds_total{cpu="0",mode="softirq"} 461.31
  node_cpu_seconds_total{cpu="0",mode="steal"} 0
  node_cpu_seconds_total{cpu="0",mode="system"} 252.13
  node_cpu_seconds_total{cpu="0",mode="user"} 507.75

metrics

Promethues将metrics分成了4种类型:

  • counter:只增不减的计数,如: prometheus_http_requests_total

  • gauge:瞬时的指标,如cpu占用率、memory使用量等

  • histogram:对观测量(如request时延、response大小)进行抽样,并在不同的bucket上进行计数。

    prometheus_tsdb_compaction_chunk_range_bucket{le="100"} 0
    prometheus_tsdb_compaction_chunk_range_bucket{le="400"} 0
    prometheus_tsdb_compaction_chunk_range_bucket{le="1600"} 0
    prometheus_tsdb_compaction_chunk_range_bucket{le="6400"} 0
    prometheus_tsdb_compaction_chunk_range_bucket{le="25600"} 0
    prometheus_tsdb_compaction_chunk_range_bucket{le="102400"} 0
    prometheus_tsdb_compaction_chunk_range_bucket{le="409600"} 0
    prometheus_tsdb_compaction_chunk_range_bucket{le="1.6384e+06"} 260
    prometheus_tsdb_compaction_chunk_range_bucket{le="6.5536e+06"} 780
    prometheus_tsdb_compaction_chunk_range_bucket{le="2.62144e+07"} 780
    prometheus_tsdb_compaction_chunk_range_bucket{le="+Inf"} 780
    prometheus_tsdb_compaction_chunk_range_sum 1.1540798e+09
    prometheus_tsdb_compaction_chunk_range_count 780
    
  • summary:对观测值(request时延、response大小)进行抽样,并提供total count以及sum值

    go_gc_duration_seconds{quantile="0"} 1.3783e-05
    go_gc_duration_seconds{quantile="0.25"} 3.3982e-05
    go_gc_duration_seconds{quantile="0.5"} 9.9183e-05
    go_gc_duration_seconds{quantile="0.75"} 0.000251458
    go_gc_duration_seconds{quantile="1"} 0.000546347
    go_gc_duration_seconds_sum 1.4536648890000001
    go_gc_duration_seconds_count 9464
    

    这个有点像es中的函数,提供好多基本指标:sum、count、avg、quantile等。

    summary与histogram的不同是前者是quantile,后者是某个范围内的个数。

查询

promethues最基础的查询方法是PromQL,在此基础上,可以通过Http Api进行查询访问,下边对基础的PromQL进行介绍。

查询后的数据类型

  • Instant vector - 同一metric同一时刻的时序值

    ode_cpu_seconds_total{cpu="0", group="canary", instance="localhost:8082", job="node", mode="idle"} 	26021.18
    node_cpu_seconds_total{cpu="0", group="production", instance="localhost:8080", job="node", mode="idle"}	26024.38
    node_cpu_seconds_total{cpu="0", group="production", instance="localhost:8081", job="node", mode="idle"} 26022.78
    

    这种可以用图表来显示

  • Range vector - 同一metric一段时间内的时序值

    image-20210318160730974

    这种不可以用图表显示。

  • Scalar - 标量

  • String - 字符串

查询

<instant_query> '[' <range> ':' [<resolution>] ']' [ @ <float_literal> ] [ offset <duration> ]

  • instant类

    查询语法很简单,直接将metric与label输入即可

    如:

    http_requests_total

    http_requests_total{job="prometheus",group="canary"}

    注意的是,对于label可以使用非操作(!=)以及正则(=~)

    {__name__=~"job:.*"}

  • range类

    range类就是在instant类基础上,通过[]指明时间

    http_requests_total{job="prometheus"}[5m] 过去5min的指标

    时间间隔的符号可以是:ms、s、m、h、d、w、y,没有month

    []中可以有2个参数:[5m:1m],代表着分表率,5min内、每1min一个统计结果。

  • 装饰符

    @装饰符可以指明在某个时间点

    http_requests_total @ 1609746000

    offset指示一个偏移量

    它俩可以连用:http_requests_total @ 1609746000 offset 5m

聚合

相比与mysql、Elasticsearch,promethues的聚合会更简单一些,它的groupBy只针对时间,通过range vector就完成了,故而不复杂。

它的特别之处在于提供了一系列的函数,使得聚合变得更方便一些。

数据计算:

这个有点pandas的感觉,+-×/会直接作用在元素上,向量与标量的计算。

node_filesystem_files_free{device="/dev/sda4"}/1024

聚合函数包括:

sum (calculate sum over dimensions)
min (select minimum over dimensions)
max (select maximum over dimensions)
avg (calculate the average over dimensions)
group (all values in the resulting vector are 1)
stddev (calculate population standard deviation over dimensions)
stdvar (calculate population standard variance over dimensions)
count (count number of elements in the vector)
count_values (count number of elements with the same value)
bottomk (smallest k elements by sample value)
topk (largest k elements by sample value)
quantile (calculate φ-quantile (0 ≤ φ ≤ 1) over dimensions)

自带topN操作

其他的常用函数:

rate(v range-vector): 计算一段时间内的变化率,如sum(rate(process_cpu_seconds_total[10m])) * 100cpu10m中的使用率。

sort(v instant-vector): 根据样本值排序

predict_linear(v range-vector, t scalar)以v为基础,预测时间t内的值

监控

exporter

以上为Promethues基础,基本使用node exporter将主机的信息监控了起来,除了这些,我们还想对网络、容器、中间件状态、k8s等进行监控。相应的exporter包括:

目标内容exporter
主机cpu、memory、disknode exporter
k8s集群资源用量、调度K8S components
容器资源用量cAdvisor
网络nginxnginx-module-vts、nginx-vts-exporter
中间件数据库、redis、mq等postgres_exporter、mysqld_exporter、redis-exporter

4大指标

Google的Four Golden Signals,包括:

  • 延迟(Latency)

    监控请求所耗费的时间,重点是要区分成功请求的延迟时间和失败请求的延迟时间。

    例如在数据库或者其他关键祸端服务异常触发HTTP 500的情况下,用户也可能会很快得到请求失败的响应内容,如果不加区分计算这些请求的延迟,可能导致计算结果与实际结果产生巨大的差异。

  • 流量(Traffic)

    监控当前系统的流量。

    例如,在HTTP REST API中, 流量通常是每秒HTTP请求数;

  • 错误(Errors)

    监控当前系统所有发生的错误请求,衡量当前系统错误发生的速率。

    对于失败而言有些是显式的(比如, HTTP 500错误),而有些是隐式(比如,HTTP响应200,但实际业务流程依然是失败的)。对于一些显式的错误如HTTP 500可以通过在负载均衡器(如Nginx)上进行捕获,而对于一些系统内部的异常,则可能需要直接从服务中添加钩子统计并进行获取。

  • 饱和度(Saturation)

    衡量当前服务的饱和度。

    主要强调最能影响服务状态的受限制的资源。 例如,如果系统主要受内存影响,那就主要关注系统的内存状态,如果系统主要受限与磁盘I/O,那就主要观测磁盘I/O的状态。因为通常情况下,当这些资源达到饱和后,服务的性能会明显下降。

grafana

  • 下载

    官网国内

  • 启动

    sudo service grafana-server start

    sudo service grafana-server status

  • 入口:http://localhost:3000/

  • 配置数据源

  • 增加dashbord

# 微服务 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×