新型监控告警工具prometheus(普罗米修斯)的入门使用(附视频讲解)

最全的Linux教程,Linux从入门到精通

======================

  1. linux从入门到精通(第2版)

  2. Linux系统移植

  3. Linux驱动开发入门与实战

  4. LINUX 系统移植 第2版

  5. Linux开源网络全栈详解 从DPDK到OpenFlow

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

作者: 李佶澳   转载请保留:原文地址   发布时间:2018/08/03 10:26:00

说明

视频讲解通过链接网易云课堂·IT技术快速入门学院进入。

Prometheus是最近几年开始流行的一个新兴监控告警工具,特别是kubernetes的流行带动了prometheus的应用。

Prometheus是一套完整的监控告警系统:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Prometheus的主要特点有:

1. a multi-dimensional data model with time series data identified by metric name and key/value pairs
2. a flexible query language to leverage this dimensionality
3. no reliance on distributed storage; single server nodes are autonomous
4. time series collection happens via a pull model over HTTP
5. pushing time series is supported via an intermediary gateway
6. targets are discovered via service discovery or static configuration
7. multiple modes of graphing and dashboarding support

influxdb、openTSDB等,是专门时间序列数据库,不是一套完整的监控告警系统,缺少告警功能。

Prometheus系统的服务发现功能很强大,可以直接通过Kubernetes等系统的接口,发现要监控的目标,不需要人员干预,不需要做系统对接方面的开发。

Prometheus系统的三部分:prometheus、alertmanager、*_exporter(多个),下文将分别讲解。

这里使用的机器IP为:192.168.88.10。

Prometheus

prometheus是最主要的组件,负责采集数据,发出告警。

部署、启动

prometheus负责根据配置文件发现监控目标,主动收集数据指标,并检查是否触发告警规则,是整个系统的核心。

可以直接使用Prometheus提供二进制文件:prometheus download

先下载下来,简单试用一下:

wget https://github.com/prometheus/prometheus/releases/download/v2.3.2/prometheus-2.3.2.linux-amd64.tar.gz
tar -xvf prometheus-2.3.2.linux-amd64.tar.gz

解压以后得到下面的文件:

$ ls
console_libraries  consoles  LICENSE  NOTICE  prometheus  prometheus.yml  promtool

如果想要学习源代码,可以自己从代码编译:

go get github.com/prometheus/prometheus
cd $GOPATH/src/github.com/prometheus/prometheus
git checkout <需要的版本>
make build

然后直接运行prometheus程序即可:

 ./prometheus
level=info ts=2018-08-18T12:57:33.232435663Z caller=main.go:222 msg="Starting Prometheus" version="(version=2.3.2, branch=HEAD, revision=71af5e29e815795e9dd14742ee7725682fa14b7b)"
level=info ts=2018-08-18T12:57:33.235107465Z caller=main.go:223 build_context="(go=go1.10.3, user=root@5258e0bd9cc1, date=20180712-14:02:52)"
...

通过192.168.88.10:9090,可以打开promtheus的网页。

prometheus的配置文件

使用prometheus最关键的还是搞清楚它的配置文件,仔细定制了配置文件,才能发挥出它的功能。

略微不幸的是,prometheus的配置文件有一些复杂,官方文档也不是很好:prometheus configuration

配置文件是yaml格式,结构如下:

$  cat prometheus.yml
# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9090']

其中global是一些常规的全局配置,这里只列出了两个参数:

  scrape_interval:     15s      #每15s采集一次数据
  evaluation_interval: 15s      #每15s做一次告警检测

rule_files指定加载的告警规则文件,告警规则放到下一节讲。

scrape_configs指定prometheus要监控的目标,这部分是最复杂的。

在scrape_config中每个监控目标是一个job,但job的类型有很多种。可以是最简单的static_config,即静态地指定每一个目标,例如上面的:

  - job_name: prometheus
    static_configs:
      - targets: ['localhost:9090']

也可以使用服务发现的方式,动态发现目标,例如将kubernetes中的node作为监控目标:

  - job_name: 'kubernetes-nodes'
    kubernetes_sd_configs:
    - role: node
      api_server: https://192.168.88.10
      tls_config:
        ca_file:   /opt/app/k8s/admin/cert/ca/ca.pem
        cert_file: /opt/app/k8s/admin/cert/apiserver-client/cert.pem
        key_file:  /opt/app/k8s/admin/cert/apiserver-client/key.pem
    bearer_token_file: /opt/app/k8s/apiserver/cert/token.csv
    scheme: https
    tls_config:
      ca_file:   /opt/app/k8s/admin/cert/ca/ca.pem
      cert_file: /opt/app/k8s/admin/cert/apiserver-client/cert.pem
      key_file:  /opt/app/k8s/admin/cert/apiserver-client/key.pem

使用这个新的配置文件,启动prometheus:

./prometheus --config.file=./prometheus.k8s.yml

prometheus运行时会自动探测kubernetes中的node变化,自动将kubernetes中的node作为监控目标。

在prometheus的页面中可以看到自动生成的监控目标。这里就不贴图了,可以自己试一下,或者看一下演示视频。

当前@2018-08-10 17:14:05,prometheus中与服务发现有关的配置有以下几项(前缀就是支持的系统,sd表示service discovery):

    azure_sd_config
    consul_sd_config
    dns_sd_config
    ec2_sd_config
    openstack_sd_config
    file_sd_config
    gce_sd_config
    kubernetes_sd_config
    marathon_sd_config
    nerve_sd_config
    serverset_sd_config
    triton_sd_config

服务发现是prometheus最强大的功能之一,这个功能配合relabel_config*_exporter可以做成很多事情。

使用relabel_config扩展采集能力

relabel_config,顾名思义,可以用来重新设置标签。标签是附属在每个监控目标的每个指标上的。

但有些标签是双下划线开头的,例如__address__,这样的标签是内置的有特殊意义的,不会附着在监控指标上。

这样的标签有:

__address__         : 检测目标的地址 
__scheme__          : http、https等
__metrics_path__    : 获取指标的路径

上面的三个标签将被组合成一个完整url,这个url就是监控目标,可以通过这个url读取到指标。

relabel_config提供了标签改写功能,通过标签改写,可以非常灵活地定义url。

另外在每个服务发现配置中,还会定义与服务相关的内置指标,例如kubernetes_sd_confignode的类型中又定义了:

__meta_kubernetes_node_name: The name of the node object.
__meta_kubernetes_node_label_<labelname>: Each label from the node object.
__meta_kubernetes_node_annotation_<annotationname>: Each annotation from the node object.
__meta_kubernetes_node_address_<address_type>: The first address for each node address type, if it exists.

在上一节中,是直接从默认的地址http://< NODE IP>/metrics中采集到每个node数据的,这里用relabel修改一下,改成从apiserver中获取:

  - job_name: 'kubernetes-nodes'
    kubernetes_sd_configs:
    - role: node
      api_server: https://192.168.88.10
      tls_config:
        ca_file:   /opt/app/k8s/admin/cert/ca/ca.pem
        cert_file: /opt/app/k8s/admin/cert/apiserver-client/cert.pem
        key_file:  /opt/app/k8s/admin/cert/apiserver-client/key.pem
    bearer_token_file: /opt/app/k8s/apiserver/cert/token.csv
    scheme: https
    tls_config:
      ca_file:   /opt/app/k8s/admin/cert/ca/ca.pem
      cert_file: /opt/app/k8s/admin/cert/apiserver-client/cert.pem
      key_file:  /opt/app/k8s/admin/cert/apiserver-client/key.pem
    relabel_configs:
    - action: labelmap
      regex: __meta_kubernetes_node_label_(.+)
    - target_label: __address__
      replacement: 192.168.88.10
    - source_labels: [__meta_kubernetes_node_name]
      regex: (.+)
      target_label: __metrics_path__
      replacement: /api/v1/nodes/${1}/proxy/metrics

其实就是在原先的配置后面增加了一节relabel_configs的配置。

重新加载配置文件,过一小会儿,就会发现target的url发生了变化。

relabel_config是一个很强大的功能,除了修改标签,还可以为采集的指标添加上新标签:

    - source_labels: [__meta_kubernetes_node_name]
      regex: (.+)
      replacement: hello_${1}
      target_label: label_add_by_me

在配置文件中加上上面的内容后,为每个指标都将被添加了一个名为label_add_by_me的标签。

prometheus的查询语句

prometheus的查询语句也是很重要的内容,除了用来查询数据,后面将要讲的告警规则也要用查询语句描述。

查询语句直接就是指标的名称:

go_memstats_other_sys_bytes

但是可以通过标签筛选:

go_memstats_other_sys_bytes{instance="192.168.88.10"}

标签属性可以使用4个操作符:

=: Select labels that are exactly equal to the provided string.
!=: Select labels that are not equal to the provided string.
=~: Select labels that regex-match the provided string (or substring).
!~: Select labels that do not regex-match the provided string (or substring).

并且可以使用多个标签属性,用“,”间隔,彼此直接是与的关系,下面是prometheus文档中的一个例子:

http_requests_total{environment=~"staging|testing|development",method!="GET"}

甚至只有标签:

{instance="192.168.88.10"}

对查询出来的结果进行运算也是可以的:

# 时间范围截取,Range Vector Selectors
http_requests_total{job="prometheus"}[5m]

# 时间偏移
http_requests_total offset 5m

# 时间段内数值累加
sum(http_requests_total{method="GET"} offset 5m) 

还可以进行多元运算:Operators,以及使用函数:Functions

prometheus的告警规则配置

alert rules在单独的文件中定义,然后在prometheus.yml中引用:

rule_files:
  - "first_rules.yml"
  # - "second_rules.yml"

rules文件格式如下:

$ cat first_rules.yml
groups:
- name: rule1-http_requst_total
  rules:
  - alert:  HTTP_REQUEST_TOTAL
    expr: http_requests_total > 100
    for: 1m
    labels:
      severity: page
    annotations:
      summary: Http request total reach limit

需要注意,还要在prometheus.yml中配置alertmanager的地址:

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - 127.0.0.1:9093

重新加载配置文件后,可以在prometheus的rule页面看到告警规则,在alert页面看到触发的告警,

现在alertmanager还没有部署,在下一节部署了alertmanager之后,告警可以在alertmanager中看到。

alertmanager

alertmanager是用来接收prometheus发出的告警,然后按照配置文件的要求,将告警用对应的方式发送出去。

将告警集中到alertmanager,可以对告警进行更细致的管理。

部署启动
wget https://github.com/prometheus/alertmanager/releases/download/v0.15.2/alertmanager-0.15.2.linux-amd64.tar.gz
tar -xvf alertmanager-0.15.2.linux-amd64.tar.gz

解压以后会得到下面这些文件:

alertmanager  alertmanager.yml  amtool  LICENSE  NOTICE

直接运行alertmanager就可以启动,然后通过http://IP地址:9093/#/alerts可以打开alertmanager的页面。

alertmanager的配置文件

alertmanager的配置文件格式如下:

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'web.hook'
receivers:
- name: 'web.hook'
  webhook_configs:
  - url: 'http://127.0.0.1:5001/'
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

其中最主要的是receivers,它定义了告警的处理方式,这里是webhook_config,意思是alertmananger将告警转发到这个url。

alertmanager configuration提供多种告警处理方式,webhook_configs只是其中一种:

email_config
hipchat_config
pagerduty_config
pushover_config
slack_config
opsgenie_config
victorops_config
webhook_config
wechat_config 

alertmanager配置邮件通知

这里给出一个用邮件通知告警的例子,发件邮箱用的是网易邮箱:

global:
  resolve_timeout: 5m
route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'mail'
receivers:
- name: 'web.hook'
  webhook_configs:
  - url: 'http://127.0.0.1:5001/'
- name: 'mail'
  email_configs:
  - to: 接收告警用的邮箱 
    from: 你的发件用的网易邮箱
    smarthost:  smtp.163.com:25
    auth_username: 网易邮箱账号
    auth_password: 网易邮箱密码
    # auth_secret:
    # auth_identity:
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

注意这里有web.hookmail两个reciver,使用哪个receive是在上面的router中配置的:

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'mail'

重新加载配置后,就可以收到告警邮件了。

alertmanager集群模式

alertmanager可以配置成集群模式,即多个alaertmanager一起运行,彼此之间通过gossip协议获知告警的处理状态,防止告警重复发出。

这种模式通常用在prometheus需要做高可用的场景中。

prometheus ha deploy的高可用部署通常至少会有两套prometheus独立工作,它们会执行各自的告警检查。

最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

资料预览

给大家整理的视频资料:

给大家整理的电子书资料:

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

lertmanager可以配置成集群模式,即多个alaertmanager一起运行,彼此之间通过gossip协议获知告警的处理状态,防止告警重复发出。

这种模式通常用在prometheus需要做高可用的场景中。

prometheus ha deploy的高可用部署通常至少会有两套prometheus独立工作,它们会执行各自的告警检查。

最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

资料预览

给大家整理的视频资料:

[外链图片转存中…(img-gp4lvu5n-1715481651366)]

给大家整理的电子书资料:

[外链图片转存中…(img-JyOBN5xp-1715481651366)]

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值