首先,准备一个虚拟机,为此,我们编写了一个小脚本来部署和自动化一些常规操作,该脚本使用Azure Cli:
在脚本中,我们使用cloud-init.txt文件 ,该文件将在虚拟机上自动安装Docker和Docker-Compose。
cloud-init.txt #cloud-config package_upgrade: true write_files: - path: /etc/systemd/system/docker.service.d/docker.conf content: | [Service] ExecStart= ExecStart=/usr/bin/dockerd - path: /etc/docker/daemon.json content: | { "hosts": ["fd://","tcp://127.0.0.1:2375"] } runcmd: - apt-get update && apt-get install mc -y - curl -sSL https://get.docker.com/ | sh - curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose - chmod +x /usr/local/bin/docker-compose
在主目录中,为项目和docker-compose.yaml文件创建一个文件夹
docker-compose.yaml version: '3.2' services: alertmanager-bot: image: metalmatze/alertmanager-bot:0.3.1 environment: - ALERTMANAGER_URL=http://<alertmngerURL>:9093 # - LISTEN_ADDR=0.0.0.0:8080 - BOLT_PATH=/data/bot.db - STORE=bolt - TELEGRAM_ADMIN=<TelegramAdminID> # ID - TELEGRAM_TOKEN=<TelegramBotToken> # - TEMPLATE_PATHS=/templates/default.tmpl volumes: - /srv/monitoring/alertmanager-bot:/data ports: - 8080:8080 prometheus: image: prom/prometheus:latest volumes: - ./prometheus:/etc/prometheus/ command: - --config.file=/etc/prometheus/prometheus.yml ports: - 9090:9090 links: - cadvisor:cadvisor depends_on: - cadvisor restart: always node-exporter: image: prom/node-exporter volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - --path.procfs=/host/proc - --path.sysfs=/host/sys - --collector.filesystem.ignored-mount-points - ^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/) ports: - 9100:9100 restart: always deploy: mode: global alertmanager: image: prom/alertmanager ports: - 9093:9093 volumes: - ./alertmanager/:/etc/alertmanager/ restart: always command: - --config.file=/etc/alertmanager/config.yml - --storage.path=/alertmanager cadvisor: image: google/cadvisor volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro ports: - 8081:8080 restart: always deploy: mode: global grafana: image: grafana/grafana depends_on: - prometheus ports: - 3000:3000 volumes: - ./grafana:/var/lib/grafana - ./grafana/provisioning/:/etc/grafana/provisioning/ restart: always
不要忘记,在yaml中不应有制表符,只能有空格,请小心观看。 让我们更详细地看一下docker-compose.yaml文件 :
图片: -这是我们将使用的docker容器图片
现在,让我们开始创建Telegram机器人。 我们不会对此进行详细介绍,因为互联网上充满了描述,我只是说通过@BotFather机器人进行创建。
我们需要机器人的令牌和您的TelegramID来管理机器人,您需要将此数据替换为docker-compose.yaml文件
让我们创建文件:
prometheus目录中的prometheus.yml ,描述用于收集指标和发送警报的服务器。
普罗米修斯 scrape_configs: - job_name: node scrape_interval: 5s static_configs: - targets: ['ip_node_explorer:9100'] rule_files: - './con.yml' alerting: alertmanagers: - static_configs: - targets: ['ip_alertmanager:9093']
con.yml位于同一目录中,用于警报描述。 此警报描述了一种警报,用于检查我们的Node Exporter是否还处于活动状态。
浓缩液 groups: - name: ExporterDown rules: - alert: NodeDown expr: up{job='Node'} == 0 for: 1m labels: severity: Error annotations: summary: "Node Explorer instance ($instance) down" description: "NodeExporterDown"
alertmanager目录中的config.yml ,我们在其中添加了与Telegram bot的连接
配置文件 route: group_wait: 20s # group_interval: 20s # repeat_interval: 60s # group_by: ['alertname', 'cluster', 'service'] receiver: alertmanager-bot receivers: - name: alertmanager-bot webhook_configs: - send_resolved: true url: 'http://ip_telegram_bot:8080'
运行我们的图像并检查结果:
docker-compose up -d
docker-compose ps
您应该得到类似以下内容:

当我们看到所有Up容器的状态时,如果由于某种原因其中一个容器没有启动,我们可以使用以下命令查看日志:
docker logs < >
例如:
docker logs docker logs project_alertmanager_1
将给我们以下结果:

现在创建一个test.sh脚本来检查通知
test.sh #!/bin/sh curl \ --request POST \ --data '{"receiver":"telegram","status":"firing","alerts":[{"status":"firing","labels":{"alertname":"Fire","severity":"critical"},"annotations":{"message":"Something is on fire"},"startsAt":"2018-11-04T22:43:58.283995108+01:00","endsAt":"2018-11-04T22:46:58.283995108+01:00","generatorURL":"http://localhost:9090/graph?g0.expr=vector%28666%29\u0026g0.tab=1"}],"groupLabels":{"alertname":"Fire"},"commonLabels":{"alertname":"Fire","severity":"critical"},"commonAnnotations":{"message":"Something is on fire"},"externalURL":"http://localhost:9093","version":"4","groupKey":"{}:{alertname=\"Fire\"}"}' \ localhost:8080
启动后,机器人应发送测试消息。
我们还可以检查con.yml中描述的警报的操作, 为此 ,我们使用以下命令停止Node Exporter
docker stop < node exporter>
两分钟后,机器人将向您发送服务器崩溃的通知,并使用以下命令启动Node Exporter
docker start < node exporter>
一段时间后,机器人将响应服务器已启动。
就是这样,在下一篇文章中,我将教您连接其他指标并在Prometheus中创建通知。