用Prometheus开始简单的服务器监控

简介

使用Prometheus开始简单地监视个人服务器。

使用的物品

    • prometheus

 

    docker

Prometheus是一种数据按需收集的应用程序,为了获取指标,需要分别使用exporter和应用程序。由于在Prometheus和exporter自己安装会有很多麻烦,所以可以使用Docker容器进行构建。这里没有涉及Grafana。

我这次构建的环境如下所示。

    • Ubuntu 16.04.1 LTS

 

    • Docker 1.13.0

 

    prometheus 1.5.0

请将以下内容用中文进行适当的改写,只需一种选项:

1. The content is:
– The content of the article is…
– What is written in the article is…
– The information provided is…
– This passage talks about…
– The main idea of the article is…

首先,在这里把所有的工作总结起来,然后再逐一详细写下来。

总结

    • ここでは下記メトリクスが取得できるようにする

CPU やメモリなどの基本的な項目
docker コンテナそれぞれの基本的な項目

docker のコンテナで構成する

docker の User-defined network を使う

直接外から見られないようにするため
コンテナの IP アドレスを固定するため

prometheus および alertmanger の UI 用にリバースプロキシする
アラート飛ばせるようにする

設定例は gmail

这是理所当然的,但只有一台,如果我自己摔坏了,就没办法了。

构成

d60de4f270285bc85a846ab084fb3a2f.png

容器信息
IP地址可以是任何范围内的,以下是示例。

コンテナ名IPアドレスポートprometheus-container172.18.0.29090node-exporter-container172.18.0.39100alertmanager-container172.18.0.49093cadviser-container172.18.0.68080

步骤

创建Docker的用户定义网络

$ docker network create --subnet=172.18.0.0/24 prometheus_nw

获取图像

$ echo "prom/prometheus prom/alertmanager google/cadvisor prom/node-exporter" | xargs -n 1 docker pull

请在 Prometheus 和 exporter 中分别配置必要的设置文件。我们假设这些文件位于 /home/prometheus 目录下。如果需要更改,请同时修改启动参数。

$ pwd
/home/prometheus
$ tree -L 2
.
├── alertmanager
│   ├── alertmanager.yml
│   └── data
└── prometheus
    ├── alerts.rule
    ├── data
    └── prometheus.yml
                                                                                                                                           4 directories, 3 files                                                                                                                                                                                                                                                             
global:
  scrape_interval:     15s # By default, scrape targets every 15 seconds.

rule_files:
  - alerts.rule

scrape_configs:
- job_name: node
  static_configs:
  - targets: ['172.18.0.3:9100']
- job_name: docker
  static_configs:
  - targets: ['172.18.0.6:8080']
ALERT InstanceDown
  IF up == 0
  FOR 5m
  LABELS { severity = "page" }
  ANNOTATIONS {
    summary = "Instance {{ $labels.instance }} down",
    description = "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
  }

设置发送警报的目标。
以下是发送到Gmail时的示例。

通过 Gmail 用 Alertmanager 发送电子邮件

如果针对每个应用程序设置密码时需要帮助

请使用应用密码进行登录
https://support.google.com/accounts/answer/185833?hl=zh-Hans

在这里创建密码
https://security.google.com/settings/security/apppasswords

route:
  receiver: hogehoge-mail
receivers:
  - name: hogehoge-mail
    email_configs:
    - to: "hogehoge@example.com"
      from: "hogehoge@example.com"
      smarthost: smtp.gmail.com:587
      auth_username: "hogehoge@example.com"
      auth_identity: "hogehoge@example.com"
      auth_password: "brabrabrabra"

启动

$ docker run --name=prometheus-container -d --net=prometheus_nw --ip=172.18.0.2 -v /home/prometheus/prometheus:/prometheus prom/prometheus -config.file=/prometheus/prometheus.yml   -alertmanager.url=http://172.18.0.4
$ docker run --name=node-exporter-container -d --net=prometheus_nw --ip=172.18.0.3 -v "/proc:/host/proc"  -v /sys:/host/sys -v /:/rootfs prom/node-exporter -collector.procfs /host/proc -collector.sysfs /host/sys -collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
$ docker run --name=alertmanager-container -d --net=prometheus_nw --ip=172.18.0.4 -v /home/prometheus/alertmanager:/alertmanager prom/alertmanager -config.file=/alertmanager/alertmanager.yml -web.external-url=http://alertmanager.example.com
$ docker run --name=cadvisor-container -d --net=prometheus_nw --ip=172.18.0.6 --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --detach=true  google/cadvisor:latest

将Nginx配置以便能够查看用户界面。

upstream prometheus {
  server 172.18.0.2:9090;
}
upstream alertmanager {
  server 172.18.0.4:9093;
}

server {
  listen 80
  server_name prometheus.example.com;

  location / {
    proxy_pass http://prometheus;

    auth_basic "Prometheus";
    auth_basic_user_file ".htpasswd";
  }
}
server {
  listen 80
  server_name alertmanager.example.com;

  location / {
    proxy_pass http://alertmanager;

    auth_basic "AlertManager";
    auth_basic_user_file ".htpasswd";
  }
}

生成htpasswd文件

$ cd /etc/nginx/
$ sudo htpasswd -c .htpasswd prometheus

验证通过重新加载或重启Nginx,确保prometheus.example.com和alertmanager.example.com可以显示。

然后,我们可以根据个人需求修改设置、安装所需的内容,或使用 Grafana 创建仪表盘。

杂记

关于普罗米修斯

最近,监控服务器的方法有很多种,但据说最热门的是 prometheus。
prometheus 由自身和出口器(exporter)组成。

出口商清单
https://prometheus.io/docs/instrumenting/exporters/

为了运行prometheus,可以使用像apt等软件包管理系统进行安装,但由于它们相对较旧且麻烦,因此决定使用官方提供的docker映像。

顺便提一下,进入apt安装的Prometheus可能与最新版本和配置文件不同,所以在从现有的环境迁移到Docker镜像的Prometheus时需要注意。

Docker 上的 Prometheus

普罗米修斯公式的Docker镜像
https://hub.docker.com/u/prom/

如果仅需要启动 Prometheus,那就先执行这个。

使用Docker
https://prometheus.io/docs/introduction/install/#using-docker

可以使用主机端口,但是直接从外部访问exporter有点可怕。虽然可以通过iptables进行设置,但这次我们使用了Docker的用户定义网络。

另外,如果隨意連接到網絡上,IP地址將在每次啟動時更改。我認為這些部分在prometheus的設定中寫死了,所以需要固定這些地方。這些設置應在容器啟動時進行。我覺得如果一直保持連接到網絡上,則無法固定IP地址。

http://qiita.com/paihu/items/17aa47906dd2bf935a25
– 这是一个 Qiita 上有关于 paihu 的帖子,内容为 “17aa47906dd2bf935a25″。
http://qiita.com/takara@github/items/2349fff473474d7fcf47
– 这是一个 Qiita 上有关于 takara@github 的帖子,内容为 “2349fff473474d7fcf47″。

通过以下命令可以创建一个挂载监视容器的网络。可能只有这一个选项。通过指定这个网络来创建容器或在启动过程中连接到它。如果没有指定,则容器将进入默认的网络。

$ docker network create --subnet=172.18.0.0/24 prometheus_nw

关于Docker容器。

大致上的意思是这样的,当执行docker pull时,可以像下面这样(使用xargs进行简便写法)。

$ echo "prom/prometheus prom/alertmanager google/cadvisor prom/blackbox_exporter prom/node-exporter" | xargs -n 1 docker pull

解释

名前雑な説明リポジトリprometheusメトリクスを exporter から pull してファイルシステムに保存するhttps://github.com/prometheus/prometheusnode-expoterCPU とか メモリ とか見られるからとりあえずいれとけって exporterhttps://github.com/prometheus/node_exporteralertmanagerアラート飛ばすときにどこに飛ばすかとか静観するかとか設定できる。ルール自体は prometheus で指定するけど。https://github.com/prometheus/alertmanagercadvisorDocker コンテナの監視に使うらしい。 mysql-exporter と同じポートを使うのでホストに紐付ける場合は注意。https://github.com/google/cadvisor

本次设置如下:将container设置为后缀,以避免与命令等混淆。

启动命令

普罗米修斯 (Pǔ xiū sī)

$ docker run --name=prometheus-container --net=prometheus_nw --ip=172.18.0.2 -d -v /home/prometheus/prometheus:/prometheus prom/prometheus -config.file=/prometheus/prometheus.yml   -alertmanager.url=http://172.18.0.4

节点导出器

$ docker run --name node-exporter-container -d --net=prometheus_nw --ip=172.18.0.3 -v "/proc:/host/proc"  -v "/sys:/host/sys" -v "/:/rootfs" prom/node-exporter -collector.procfs /host/proc -collector.sysfs /host/sys -collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"

请参考 https://github.com/prometheus/node_exporter
鉴于本次情况下正在运行 Docker,因此请按照 README 中的最后一部分进行启动。

警报管理器

UI的URL根据您的环境进行相应的调整。

$ docker run --name alertmanager-container -d --net=prometheus_nw --ip=172.18.0.4 -v /home/prometheus/alertmanager:/alertmanager prom/alertmanager -config.file=/alertmanager/alertmanager.yml -web.external-url=http://alertmanager.example.com

cAdvisor: cAdvisor监控

$ docker run --name=cadvisor-container --net=prometheus_nw --ip=172.18.0.6 --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --detach=true  google/cadvisor:latest

Prometheus的配置

设定文件之类的,将会被放置在主机端。放置的位置可以任意选择。对于我个人而言,由于我原本是使用 apt 安装的 prometheus 用户,所以我将 prometheus 的设定暂时放在了 /home 目录下。

$ pwd
/home/prometheus
$ tree -L 2
.
├── alertmanager
│   ├── alertmanager.yml
│   └── data
└── prometheus
    ├── alerts.rule
    ├── data
    └── prometheus.yml
                                                                                                                                           4 directories, 3 files                                                                                                                                                                                                                                                             

普罗米修斯的设定本身

请提供网址参考

https://prometheus.io/docs/operating/configuration/:
https://prometheus.io/docs/introduction/getting_started/:
https://prometheus.io/docs/operating/configuration/:
https://prometheus.io/docs/introduction/getting_started/

将以上链接分别翻译为中文:
https://prometheus.io/docs/operating/configuration/:
https://prometheus.io/docs/introduction/getting_started/:

以下是将node_exporter和docker拉取为设置的内容,如果增加或更改exporter,则需要相应修改此文件。

global:
  scrape_interval:     15s # By default, scrape targets every 15 seconds.

rule_files:
  - alerts.rule

scrape_configs:
- job_name: node
  static_configs:
  - targets: ['172.18.0.3:9100']
- job_name: docker
  static_configs:
  - targets: ['172.18.0.6:8080']

把警报规则写在另一个文件中。

可以查看的网址

https://prometheus.io/docs/zh-cn/alerting/rules/

如果 node_expoter 崩溃了,就发送一个警报的示例。我想要了解关于警报规则的知识。

ALERT InstanceDown
  IF up == 0
  FOR 5m
  LABELS { severity = "page" }
  ANNOTATIONS {
    summary = "Instance {{ $labels.instance }} down",
    description = "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
  }

AlertManager的配置

在这里设置发送警报的目标。

以下是通过Gmail发送的示例。

使用Gmail通过Alertmanager发送电子邮件。
https://www.robustperception.io/sending-email-with-the-alertmanager-via-gmail/

如果您希望为每个应用程序设置密码时需要帮助,请问如何提供帮助?

请使用应用密码进行登录
https://support.google.com/accounts/answer/185833?hl=zh-CN

在这里创建密码:
https://security.google.com/settings/security/apppasswords

因为其他情况也需要处理,所以要设置所需的通知接收方。通过使用 Prometheus 分配的 job 或标签,可以灵活地更改通知接收方和通知消息,因此需要巧妙处理。

route:
  receiver: hogehoge-mail
receivers:
  - name: hogehoge-mail
    email_configs:
    - to: "hogehoge@example.com"
      from: "hogehoge@example.com"
      smarthost: smtp.gmail.com:587
      auth_username: "hogehoge@example.com"
      auth_identity: "hogehoge@example.com"
      auth_password: "brabrabrabra"

关于设定反映的问题

如果更改了通过Docker启动的Prometheus或Exporter的配置,只需要执行docker stop && docker start命令即可。

如果您的系统支持systemd,您可以像以前那样进行配置,然后使用systemctl restart命令进行重启,这也是一个好的选择。

启动的管理和更新

在Ubuntu 16.04.1中使用systemd进行启动管理,如果能够成功实现,则会变得更加方便。

自动启动容器
https://docs.docker.com/engine/admin/host_integration/

设定如下。必须删除运行命令中的 “-d” 或 “–detach=true”。

确保不要使用“-d”参数来运行“detached mode”。从“ExecStart”执行的命令需要在前台运行。

[Unit]
Description=prometheus container
Requires=docker.service
After=docker.service
                                                                                                                                                                  [Service]
Restart=always
ExecStart=
ExecStart=/usr/bin/docker run --name=prometheus-container --net=prometheus_nw --ip=172.18.0.2 -v /home/prometheus/prometheus:/prometheus prom/prometheus -config.file=/prometheus/prometheus.yml -alertmanager.url=http://172.18.0.4
ExecStop=/usr/bin/docker stop -t 2 prometheus-container
ExecStopPost=/usr/bin/docker rm -f prometheus-container

[Install]
WantedBy=default.target

只要按照以下步骤进行,应用程序的更新就可以轻松完成。

$ docker pull prom/prometheus 
$ sudo systemctl restart prometheus-container.service

不过根据下文,也许可以在ExecStartPre阶段进行拉取,但个人不太喜欢只重新启动而不更新,所以没有这样做。

使用systemd来管理docker容器
http://qiita.com/74th/items/e8dc1ac1295140413dc8

用户界面

为了能够查看UI,可以在nginx上进行适当的配置。以下是一个简单的示例。cadviser也有一个UI,如果想要确认cadviser的UI,也可以类似地添加。
为了防止易于被查看,我们简单地添加了基本认证。如果要使用grafana并将prometheus作为数据源指定使用,即使在这种情况下,也可以在grafana的配置中添加基本认证,没有问题。

upstream prometheus {
  server 172.18.0.2:9090;
}
upstream alertmanager {
  server 172.18.0.4:9093;
}

server {
  listen 80
  server_name prometheus.example.com;

  location / {
    proxy_pass http://prometheus;

    auth_basic "Prometheus";
    auth_basic_user_file ".htpasswd";
  }
}
server {
  listen 80
  server_name alertmanager.example.com;

  location / {
    proxy_pass http://alertmanager;

    auth_basic "AlertManager";
    auth_basic_user_file ".htpasswd";
  }
}

先创建一个.htpasswd文件。

$ cd /etc/nginx/
$ sudo htpasswd -c .htpasswd prometheus
广告
将在 10 秒后关闭
bannerAds