2021-06-25 基于windows docker 搭建Prometheus+grafana监控报警系统

image.png

搭建分为2部分:

一:windows docker的安装和操作, golang的安装(这里不写这个步骤)

二:prometheus+grafana监控报警系统搭建

注意,我的截图中的端口跟我写的步骤可能不一样,因为我本地一些端口被占用,如果你们也是这样,也可以修改端口映射


接下来是具体操作
一:windows docker的安装和操作

本机系统:windows 10

由于docker for windows软件可能升级后安装步骤不一定相同,所以安装步骤直接照着这上面走:https://www.runoob.com/docker/windows-docker-install.html, 文中的Hyper-V和WSL 2.0(适用于 Linux 的 Windows 子系统 (WSL) )是一定要安装的,不然无法启动windows docker. WSL 2.0, (无法共享磁盘)安装参考https://docs.microsoft.com/zh-cn/windows/wsl/install-win10

image.png

安装完后启动windows的powershell,注意gitbash下有些container无法进入,比如prometheus
image.png

二:prometheus+grafana监控报警系统搭建

先总体说下一共7个步骤如下,再详细说明

  1. 创建一个prometheus文件目录,里面放如下目录分别用于存放各个子系统的配置文件:

    image.png

    /client目录下建prometheus.yml, rules.yml

  2. 搭建 prometheus(docker镜像)

  3. 搭建client-docker, node_exporter(docker镜像),用于初步prometheus测试

  4. 搭建pushgateway(docker镜像), 连同prometheus

  5. 搭建Grafana(docker镜像), 连同prometheus

  6. 搭建alertmanager(docker镜像), 连同prometheus

  7. 编写一后台接受警报处理系统

接下来罗列2-7的详细步骤:

  1. 在powershell里操作下面命令:
拉取最新prometheus镜像
docker pull prom/prometheus

启动一个prometheuscontainer
简单版:docker run -p 9090:9090 prom/prometheus
复杂版:docker run --name=prometheus -d -p 9090:9090 -v /yourpathto/promethues/conf/prometheus.yml:/etc/prometheus/prometheus.yml -v /yourpathto/promethues/conf/rules.yml:/etc/prometheus/rules.yml prom/prometheus --config.file=/etc/prometheus/prometheus.yml(挂载了prometheus.yml就要指定config.file) --web.enable-lifecycle(这句最好在最后,否则可能报错)

额外说几个常用docker调试命令:
查看上面命令是否真的启动成功,看docker ps是否有罗列名为promtheus的container,
docker ps 

如果没有,运行
docker logs prometheus 查看log

如果container名字冲突,可以删掉不用的container
docker stop xx
docker rm xx
或者重命名当前的container或者旧的container
docker rename oldname newname

进入docker container 查看或者调试
docker exec -it prometheus sh

测试看看:打开网页访问localhost:9090(我改成9093, 你如果上面配的端口是9090就访问9090)

可以切换到classic UI ,这样就可以看到可以用的metrics

image.png
  1. 拉取client-golang github的测试用例,启动 prom/node-exporter, 并将二者配置入prometheus里,这样prometheus就可以读到二者暴露出来的metrics:
-----------------------搭建启动client-golang-----------------------
打开gitbash,切换到步骤1的client目录:
运行
git clone https://github.com/prometheus/client_golang.git
cd client_golang/examples/random
go get -d
go build #编译出random.exe

## 启动三个服务
./random -listen-address=:8080
./random -listen-address=:8081
./random -listen-address=:8082

现在你在浏览器输入:http://localhost:8080/metrics, http://localhost:8081/metrics, http://localhost:8082/metrics, 能看到所有采集到的采样点数据。
-----------------搭建启动node-exporter---------------------------
docker run -d --name=node-exporter -p 9100:9100 prom/node-exporter

-----------------把上面2个exporter配置到prometheus.yml这里我把我这个项目完整的prometheus.yml贴出来,但是每次更新的步骤我用红色标注,你做到这步就只需要修改红色部分,请按顺序来,还有要注意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: ['192.168.31.223:9098']
      # - alertmanager:9093


# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - /etc/prometheus/rules.yml
  # - "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']
      labels:
        group: 'promself'
        
    - targets: ['192.168.31.223:8080','192.168.31.223:8081'] #注意,此时prometheus是以container形式存在,所以配置的地址不能是localhost,而要以你的内网IP地址(快),还有前面不能有http
      labels:
        group: 'client-golang'
        
    - targets: ['192.168.31.223:9100']
      labels:
        group: 'client-node'
  
  - job_name: 'pushgateway'
    static_configs:
    - targets: ['192.168.31.223:9099']

完成上面步骤,你可以打开prometheus, 可以在metric里找到 rpc_durations_seconds, 这个是client-golang暴露出来的metric, 同时也可以看到很多node_x 相关的指标:

测试看看:

3步骤:metric选择rpc_duration_seconds->execute->graph


image.png
  1. 搭建pushgateway(docker镜像), 连同prometheus
docker run -d -p 9091:9091 --name pushgateway prom/pushgateway

测试看看:我修改了端口到9099


image.png

接下来我们就可以往pushgateway推送数据了,prometheus提供了多种语言的sdk,最简单的方式就是通过shell
powershell无法执行curl, 这个步骤在gitbash里完成

#推送一个指标
echo "cqh_metric 100" | curl --data-binary @- http://ubuntu-linux:9091/metrics/job/cqh
#推送多个指标, 你可以修改数据多推几个以便后面用
$ cat <<EOF | curl --data-binary \@-  http://192.168.31.223:9099/metrics/job/cqh/instance/test
> bench_press 110
> dead_lift 200
> deep_squal 80
> EOF
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    44    0     0  100    44      0   2750 --:--:-- --:--:-- --:--:--  2750

然后我们再将pushgateway配置到prometheus.yml里边,即修改prometheus.yml, 再重起prometheus container

# 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: ['192.168.31.223:9098']
      # - alertmanager:9093


# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - /etc/prometheus/rules.yml
  # - "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']
      labels:
        group: 'promself'
        
    - targets: ['192.168.31.223:8080','192.168.31.223:8081'] #注意,此时prometheus是以container形式存在,所以配置的地址不能是localhost,而要以你的内网IP地址(快),还有前面不能有http
      labels:
        group: 'client-golang'
        
    - targets: ['192.168.31.223:9100']
      labels:
        group: 'client-node'
  
  - job_name: 'pushgateway'
    static_configs:
    - targets: ['192.168.31.223:9099']

docker restart prometheus

测试看看:
Status->targets里已经出现pushgateway


Image.png

回到Graph(菜单栏)可以看到刚刚推的metric

image.png
  1. 搭建Grafana(docker镜像), 连同prometheus
docker run -d -p 3000:3000 --name grafana grafana/grafana

测试看看:默認账号admin/admin


image.png

配置上prometheus, 注意这里要用内网地址。

image.png

配置自己的panel

image.png
image.png
image.png
  1. 编写一后台接受警报处理系统,为第7步准备

用go-gin 编写一个简单的API用于接收警报,并处理警报,这里用于测试,只打印出来

image.png
  1. 搭建alertmanager(docker镜像), 连同prometheus

在第1步的alertmanager目录下,放入一个alertmanager.yml, 内容:

global:
  resolve_timeout: 5m


route:
  group_by: ['cqh']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1m
  receiver: 'web.hook'
receivers:
- name: 'web.hook'
  webhook_configs:
  - url: 'http://192.168.31.223:8888/send-alert' #上面go-gin系统API
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

启动alertmanager:

docker run -d -p 9093:9093 --name alertmanager -v /yourpathto/promethues/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager

测试看看:


image.png

写入 promethues/conf/rules.yml 内容如下:下面的{{ $labels.instance }}不要写错,最好拷贝。 这条规则的意思是,硬拉超过150公斤,持续一分钟,就报警通知

groups:
  - name: cqh
    rules:
    - alert: cqhtest
      expr: dead_lift > 150
      for: 1m
      labels:
        status: warning
      annotations:
        summary: "{{ $labels.instance }}:warnning! lightweight baby!"
        description: "{{ $labels.instance }}:warning! lightweight baby!"

然后再修改prometheus添加altermanager配置

# 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: ['192.168.31.223:9098']
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - /etc/prometheus/rules.yml
  # - "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']
      labels:
        group: 'promself'
        
    - targets: ['192.168.31.223:8080','192.168.31.223:8081'] #注意,此时prometheus是以container形式存在,所以配置的地址不能是localhost,而要以你的内网IP地址(快),还有前面不能有http
      labels:
        group: 'client-golang'
        
    - targets: ['192.168.31.223:9100']
      labels:
        group: 'client-node'
  
  - job_name: 'pushgateway'
    static_configs:
    - targets: ['192.168.31.223:9099']

重启prometheus:docker restart prometheus
观察grafana中数据的变化(选中放大)

image.png

设置 dead_lift > 150

然后1分钟后,后端就会一直收到警报:

image.png

来到prometheus页面,切换到newUI 在alert下也可以看到警报

image.png

第二阶段:由于之前在配置文件里都是用IP来让这些container互通,但是局域网IP是动态的,换个网络就要修改所有的配置文件。为了解决这个问题,就要创建一个docker network(docker桥接) , 然后把这些现成的container加入这个network,在同一个docker network里的container可以识别彼此的container name,端口用container的端口,而不必用暴露在物理机的端口。

PS C:\vicky\test> docker network create monitor-net
PS C:\vicky\test> docker network connect monitor-net prod-prometheus
PS C:\vicky\test> docker network connect monitor-net  prod-prometheus-node-exporter
PS C:\vicky\test> docker network connect monitor-net prod-prometheus-pushgateway

prometheus.yml里的IP改成container name:container port

image.png
image.png

完。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容