Docker下Prometheus和Grafana三部曲之二:细说Docker编排

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 上一篇文章中快速搭建环境是否给您留下了印象,今天就来揭秘如何实现简单快捷的构建一个监控系统

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos

本篇概览

  • 本文是《Docker下Prometheus和Grafana三部曲》的第二篇,在上一章《Docker下Prometheus和Grafana三部曲之一:极速体验》中,我们只做了少量的操作就搭建了一个业务监控系统(包括prometheus、node-exporter、cadvisor、grafana、业务后台服务),本文就来揭示如何通过Docker编排来简化整个环境的搭建;

三部曲所有文章链接

回顾操作

  • 前文中,我们有三次操作:
  • 执行以下命令,用于创建所有容器:
wget https://raw.githubusercontent.com/zq2599/blog_demos/master/prometheusdemo/files/prometheus.yml && \
wget https://raw.githubusercontent.com/zq2599/blog_demos/master/prometheusdemo/files/docker-compose.yml && \
docker-compose up -d
  • 登录Grafana页面取得API Key;
  • 执行以下命令,用于创建Grafana上的数据源和监控图表:
wget https://raw.githubusercontent.com/zq2599/blog_demos/master/prometheusdemo/files/import_dashboard.sh && \
chmod a+x import_dashboard.sh && \
./import_dashboard.sh 192.168.1.101 xxxxxx
  • 接下来逐个分析;

prometheus的配置文件prometheus.yml

  • 来看看下载的prometheus配置文件的内容:
# 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: ['127.0.0.1:9090','node-exporterhost:9100','cadvisorhost:8080']

  - job_name: 'proemtheusdemo'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    metrics_path: '/prometheus'
    static_configs:
    - targets: ['prometheusdemohost:8080']
  • 这是个普通的prometheus配置文件,除了监控自身的9090端口,还有node-exporterhost、cadvisorhost、prometheusdemohost这三个host的不同端口,分别对应着宿主机自身、docker服务、业务web服务等三个监控数据源;
  • 看了上面的配置,您可能会疑惑:node-exporterhost、cadvisorhost、prometheusdemohost它们代表什么呢?配置项的那个位置应该填写具体的IP地址才对。
  • 其实,这个prometheus.yml文件是给Docker容器中的prometheus服务使用的,而node-exporter、cadvisor、业务web服务也分别运行在各自的Docker容器中,prometheus服务想要访问这些容器,最好的方法就是link参数,因此node-exporterhost、cadvisorhost、prometheusdemohost都是给prometheus容器配置的link参数,这就相当于docker给prometheus容器的/etc/hosts文件写入了上述三个容器的ip,对应的name就是node-exporterhost、cadvisorhost、prometheusdemohost,稍后在docker-compose.yml文件中可以看到;

容器编排文件docker-compose.yml

  • docker-compose.yml里面记录了所有的容器的设置和依赖关系:
version: '2'
services:
  node-exporter:
    image: prom/node-exporter:v0.17.0-rc.0
    container_name: node-exporter
    restart: unless-stopped
    ports:
      - '9100:9100'
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
      - '--collector.textfile.directory=/node_exporter/prom'
    volumes:
      - /proc:/host/proc
      - /sys:/host/sys
      - /:/rootfs
      - ./etc/node_exporter/prom:/node_exporter/prom
  cadvisor: 
    image: google/cadvisor:v0.28.0
    container_name: cadvisor
    depends_on:
      - node-exporter
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    ports: 
      - "8080:8080"
    restart: unless-stopped
  prometheusdemo:
    image: bolingcavalry/prometheusdemo:0.0.1-SNAPSHOT
    container_name: prometheusdemo
    ports:
    - "8081:8080"
    restart: unless-stopped
  prometheus: 
    image: prom/prometheus:v2.8.0-rc.0
    container_name: prometheus
    depends_on:
      - node-exporter
    links:
      - node-exporter:node-exporterhost
      - cadvisor:cadvisorhost
      - prometheusdemo:prometheusdemohost
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports: 
      - "9090:9090"
    restart: unless-stopped
  grafana: 
    image: grafana/grafana:5.4.2
    container_name: grafana
    links:
      - prometheus
    environment:
      - GF_SERVER_ROOT_URL=http://grafana.server.name
      - GF_SECURITY_ADMIN_PASSWORD=secret
      - GF_USERS_ALLOW_SIGN_UP=false
    depends_on:
      - prometheus
    ports: 
      - "3000:3000"
    restart: unless-stopped
  • 关于docker-compose.yml文件,有以下几点需要注意:

a. 为了采集到宿主机的数据,node-exporter、cadvisor这两个容器通过数据卷参数将宿主机的目录映射到容器中,这在生产环境是要严格控制的,不要将重要的目录轻易暴露给未经校验的容器,例如一个恶意的镜像被pull到本地,然后通过docker tag命令把名称改成了node-exporter、cadvisor;
b. prometheus容器的配置中使用了link参数,这样就能用node-exporterhost这样的名称直接访问到node-export容器了;
c. prometheus容器通过数据卷映射参数,将宿主机的prometheus.yml映射到容器中,这样我们只要配置好当前目录下的prometheus.yml文件,就可以直接在prometheus容器生效了(如果容器已经启动后再次修改了此文件,要使用docker restart prometheus命令重启容器才能生效);
d. prometheusdemo是基于springboot开发的一个web服务,对外提供一个接口,通过ports参数将容器的8080和宿主机的8081端口映射;
e. grafana容器的环境变量GF_SECURITY_ADMIN_PASSWORD=secret,表示Grafana的web网页用admin账号登录时,密码是secret;

  • 看过了docker-compose.yml文件,您对整个环境的容器信息已经清楚了,接下来看看import_dashboard.sh这个脚本做了什么;

通过import_dashboard.sh脚本在Grafana创建数据源和监控项

  • import_dashboard.sh的内容如下,其实就是用curl命令向Grafana服务器发送http请求,关键位置已加了中文注释,就不多赘述了:
#!/bin/bash
#第一个参数作为Grafana服务器的IP地址
GRAFANA_HOST=$1
#第二个参数作为身份鉴权的API Key
API_KEY=$2

echo "grafana host ["${GRAFANA_HOST}"]"
echo "api key ["${API_KEY}"]"

echo "start create datasource"

#通过curl工具发起一个POST请求,用来创建数据源
curl -X POST \
  http://${GRAFANA_HOST}:3000/api/datasources \
-H "Content-Type:application/json" \
-H "Authorization: Bearer ${API_KEY}" \
-d '{"name":"Prometheus","type":"prometheus","url":"http://prometheus:9090","access":"proxy","basicAuth":false}' \

echo ""
echo "start create host dashboard"

#通过curl工具发起一个POST请求,用来创建一个dashboard,也就是前文中我们看到的反映宿主机CPU、磁盘等基本状况的监控页面
curl -X POST \
  http://${GRAFANA_HOST}:3000/api/dashboards/db \
  -H 'Accept: application/json' \
  -H "Authorization: Bearer ${API_KEY}" \
  -H 'Content-Type: application/json' \
  -H 'Postman-Token: 2d3c3d60-4c5a-4936-836f-1572d447f473' \
  -H 'cache-control: no-cache' \
  -d '{
  "dashboard": {
  "annotations": {
    "list": [
      {
        "builtIn": 1,
        "datasource": "-- Grafana --",
        "enable": true,
        "hide": true,
        ...
        ...
        ...        
  • 以上只是部分内容,由于篇幅所限就不贴出整个脚本了,Grafana提供了丰富的http api给我们调用,帮用户实现更多的自定义和自动化配置,详情请参考官方文档:http://docs.grafana.org/http_api
  • 您可能会有疑问:上述脚本中,每个dashboard的配置信息多达数百行甚至上千行,是怎么做出来的?其实监控项一般都是网页上配置出来的,这些内容是将做好的监控项以json格式导出的内容,操作如下图:

在这里插入图片描述

  • 得到上述json内容,我们就可以很方便的将自己配置好的监控项导入导出了;
  • 至此,整个监控环境的编排和构建详情已经全部分析过了,相信您已经了解如何构建一个小而完整的监控系统,接下来的文章中,我们一起来实战自定义监控项的开发流程,这样就能通过prometheus和Grafana来展现个性化的业务数据了,请看 《Docker下Prometheus和Grafana三部曲之三:自定义监控项开发和配置》

欢迎关注阿里云开发者社区博客:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...
相关实践学习
通过可观测可视化Grafana版进行数据可视化展示与分析
使用可观测可视化Grafana版进行数据可视化展示与分析。
相关文章
|
1月前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第26天】Prometheus与Grafana是智能运维中的强大组合,前者是开源的系统监控和警报工具,后者是数据可视化平台。Prometheus具备时间序列数据库、多维数据模型、PromQL查询语言等特性,而Grafana支持多数据源、丰富的可视化选项和告警功能。两者结合可实现实时监控、灵活告警和高度定制化的仪表板,广泛应用于服务器、应用和数据库的监控。
230 3
|
8天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
61 24
|
10天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
76 6
|
19天前
|
Prometheus 监控 Cloud Native
如何使用Prometheus监控Docker Swarm集群的资源使用情况?
还可以根据实际需求进行进一步的配置和优化,如设置告警规则,当资源使用超出阈值时及时发出警报。通过这些步骤,能够有效地使用 Prometheus 对 Docker Swarm 集群的资源进行监控和管理。
37 8
|
1月前
|
应用服务中间件 PHP nginx
Docker-compose 编排lnmp(dockerfile) 完成Wordpress
通过使用Docker Compose,我们可以轻松编排LNMP环境并部署WordPress。本文详细介绍了各组件的Dockerfile和配置文件编写,并通过docker-compose.yml文件实现了整个环境的自动化部署。这种方法不仅简化了部署过程,还提高了环境的可移植性和一致性。希望本文能帮助你更好地理解和使用Docker Compose来管理和部署复杂的应用程序。
96 3
|
1月前
|
Prometheus 监控 Cloud Native
基于Docker安装Grafana和Prometheus
Grafana 是一款用 Go 语言开发的开源数据可视化工具,支持数据监控和统计,并具备告警功能。通过 Docker 部署 Grafana 和 Prometheus,可实现系统数据的采集、展示和告警。默认登录用户名和密码均为 admin。配置 Prometheus 数据源后,可导入主机监控模板(ID 8919)进行数据展示。
99 2
|
1月前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第27天】在智能运维中,Prometheus和Grafana的组合已成为监控和告警体系的事实标准。Prometheus负责数据收集和存储,支持灵活的查询语言PromQL;Grafana提供数据的可视化展示和告警功能。本文介绍如何配置Prometheus监控目标、Grafana数据源及告警规则,帮助运维团队实时监控系统状态,确保稳定性和可靠性。
191 0
|
4月前
|
Prometheus 监控 Cloud Native
【监控】prometheus传统环境监控告警常用配置
【监控】prometheus传统环境监控告警常用配置
【监控】prometheus传统环境监控告警常用配置
|
21天前
|
存储 Prometheus 监控
监控堆外第三方监控工具Prometheus
监控堆外第三方监控工具Prometheus
40 3
|
24天前
|
存储 Prometheus 运维
在云原生环境中,阿里云ARMS与Prometheus的集成提供了强大的应用实时监控解决方案
在云原生环境中,阿里云ARMS与Prometheus的集成提供了强大的应用实时监控解决方案。该集成结合了ARMS的基础设施监控能力和Prometheus的灵活配置及社区支持,实现了全面、精准的系统状态、性能和错误监控,提升了应用的稳定性和管理效率。通过统一的数据视图和高级查询功能,帮助企业有效应对云原生挑战,促进业务的持续发展。
32 3