使用Dokcer-compose一站式搭建Prometheus+Grafana监控

组件说明

组件说明

Prometheus Server

Prometheus组件中的核心部分,负责实现对监控数据的获取,存储以及查询

Tsdb

监控数据持久化数据库,时序数据库

  • chunks:存储所有时间序列数据块(chunk),每个块包含一定时间范围内的一组样本数据。Prometheus 会周期性地将采集到的样本数据划分为一些块,并将它们写入此目录下的子目录中。

  • index:存储所有时间序列的索引信息,以便 Prometheus 可以快速查找和检索样本数据。索引文件按照特定格式存储,其中包含了各种元数据(例如标签名称、值、时间戳等)以及对应数据块的位置和偏移量等信息。

  • meta.json:存储整个 TSDB 数据库的元数据,例如版本信息、块大小、块数、最小和最大时间戳等。当 Prometheus 启动时,会读取此文件以恢复先前保存的数据库状态。

  • tombstones:存储所有被删除时间序列的墓碑记录,以便在垃圾回收期间清理相应的数据块。每个墓碑包含被删除时间序列的 ID、起始时间戳和结束时间戳等信息

Prometheus 的 TSDB 存储默认保留 15 天的时间序列数据,可在启动脚本参数中配置数据存储时间

Prometheus Server

Prometheus组件中的核心部分,负责实现对监控数据的获取,存储以及查询

Tsdb

监控数据持久化数据库,时序数据库

  • chunks:存储所有时间序列数据块(chunk),每个块包含一定时间范围内的一组样本数据。Prometheus 会周期性地将采集到的样本数据划分为一些块,并将它们写入此目录下的子目录中。

  • index:存储所有时间序列的索引信息,以便 Prometheus 可以快速查找和检索样本数据。索引文件按照特定格式存储,其中包含了各种元数据(例如标签名称、值、时间戳等)以及对应数据块的位置和偏移量等信息。

  • meta.json:存储整个 TSDB 数据库的元数据,例如版本信息、块大小、块数、最小和最大时间戳等。当 Prometheus 启动时,会读取此文件以恢复先前保存的数据库状态。

  • tombstones:存储所有被删除时间序列的墓碑记录,以便在垃圾回收期间清理相应的数据块。每个墓碑包含被删除时间序列的 ID、起始时间戳和结束时间戳等信息

Prometheus 的 TSDB 存储默认保留 15 天的时间序列数据,可在启动脚本参数中配置数据存储时间

--storage.tsdb.retention.time=180d

Exporter业务数据源

业务数据源通过 Pull/Push 两种方式推送数据到 Prometheus Server

AlertManager

报警管理器,Prometheus 通过配置报警规则,如果符合报警规则,那么就将报警推送到 AlertManager,由其进行报警处理

下载地址:Download | Prometheus

Grafana

监控数据可视化平台,默认使用SQLite 数据库(存储在/var/lib/grafana/grafana.db),也可在grafana配置使用其他自定义数据库(MySQL、PostgreSQL 或 Microsoft SQL Server等)

PromQL(Prometheus Query Language)

用于查询和分析 Prometheus 时间序列数据的语言

# 基本语法
# 用于查询指定标签名和标签值的度量名称
<metric_name>{<label_name>=<label_value>, ...}
 
# 聚合函数
# 用于对一个或多个指标进行聚合运算,其中 <aggr_func> 可以是 sum、avg、min、max 等聚合函数,<metric_expression> 是一个查询表达式
<aggr_func>([parameter,] <metric_expression>)
 
# 时间范围选择
# 用于选择指定时间范围内的度量名称,其中 <range_duration> 是一个数字后接 s、m、h 或 d 表示秒、分钟、小时或天
<metric_name>[<range_duration>]
 
# 二元运算符
# 用于对两个表达式进行二元运算操作,其中 <binary_op> 可以是 +、-、*、/ 和 % 等运算符
<expr> <binary_op> <expr>
 
# 函数调用
# 用于调用内置或自定义的函数,其中 <func> 是函数名,<args> 是一个或多个参数
<func>(<args>)
 
用于调用内置或自定义的函数,其中 <func> 是函数名,<args> 是一个或多个参数
 
# 特殊关键字
# 用于在查询表达式中进行偏移量、聚合、过滤和分组等操作
offset, by, without, group_left, group_right, on

官方语法文档地址:Querying basics | Prometheus

前置环境

环境要求

Docker版本不低于18.03

Dokcer-compose 版本不低于1.29

以下演示操作系统:Centos 7

安装Docker

安装docker

# 安装所需包
yum install -y yum-utils device-mapper-persistent-data lvm2
   
# 添加 Docker 仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  
# 查看可用版本
# yum list docker-ce --showduplicates | sort -r
  
# 安装 docker,可指定版本,如:docker-ce-19.03.0
yum install -y docker-ce-19.03.0

重启docker服务

systemctl enable docker && systemctl restart docker

安装Docker-compose(离线方式)

https://download.csdn.net/download/xactuax/89292317

上传docker-compose安装包,移动并修改名字:

sudo mv docker-compose-Linux-x86_64   /usr/local/bin/docker-compose

添加权限

sudo chmod +x /usr/local/bin/docker-compose

查看docker-compose版本,如回显正常则成功

docker-compose -v

部署Prometheus+Grafana

创建配置和数据挂载目录(为了做持久化)

mkdir -p  /monitoring/grafana/data  #grafana的数据文件挂载目录

mkdir -p  /monitoring/prometheus/conf  #prometheus的配置文件挂载目录

mkdir -p  /monitoring/prometheus/data。#prometheus的数据文件挂载目录

给挂载目录赋权

chown -R 1001:1001 /monitoring/prometheus/

chown -R 1001:1001 /monitoring/grafana/

新建/monitoring/prometheus/conf/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']

新建/monitoring/docker-compose.yml文件,内容为:

version: '2'
services:
  prometheus:
    image: bitnami/prometheus:latest
    container_name: prometheus
    ports:
      - "9090:9090"
    volumes: #挂载配置和数据文件
      - "/monitoring/prometheus/conf/prometheus.yml:/opt/bitnami/prometheus/conf/prometheus.yml"
      - "/monitoring/prometheus/data:/opt/bitnami/prometheus/data"
    environment:
      - TZ=Asia/Shanghai
    command:
      - '--config.file=/opt/bitnami/prometheus/conf/prometheus.yml'
      - '--storage.tsdb.retention.time=180d'#启动参数设置数据存储时间为180天
 
  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - "3000:3000"
    volumes: #挂载数据文件
      - "/monitoring/grafana/data:/var/lib/grafana/"
    environment:
      - TZ=Asia/Shanghai

启动服务(Prometheus+Grafana)

cd /monitoring && docker-compose up d  

检查服务运行情况

docker-compose ps                        #查看各组件启动情况                                      

在浏览器打开http://宿主机ip:9090  #检查页面是否正常访问

客户端安装配置

安装客户端

prometheus 客户端(导出器)有很多种,具体可以参考官网

官网下载监控客户端链接:Download | Prometheus

node_exporter               主机监控客户端,主要用于收集操作系统级别的指标,如CPU、内存、磁盘IO等

mongodb_exporter       mongodb监控客户端,收集MongoDB数据库的性能指标,如查询速度、连接数、缓存命中率等

kafka_exporter              kafka监控客户端,用于收集Apache Kafka集群的性能指标,如消费者组的偏移量、主题的副本数量等

说明:导出器(exporter)一般安装在被监控的机器上,但不是必须

比如kafka_exporter(或mongodb_exporter),收集指标是基于服务本身的,只要确保exporter能够访问Kafka(或mongodb),并不一定需要部署在被监控机器上

而node_exporter 则不同,它收集的是操作系统级别的指标,故它必须部署在被监控机器上

方式一:直接在被监控机器上部署

以node_exporter为例

https://download.csdn.net/download/c69359577/87354377?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171535208016800215054660%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fdownload.%2522%257D&request_id=171535208016800215054660&biz_id=1&utm_medium=distribute.pc_search_result.none-task-download-2~download~first_rank_ecpm_v1~rank_v31_ecpm-2-87354377-null-null.269^v2^control&utm_term=node_exporter-1.5.0&spm=1018.2226.3001.4451.3

将安装包上传到被监控端后,执行以下命令,启动客户端

# 解压到/usr/local/目录
tar -zxvf node_exporter-1.5.0.linux-amd64.tar.gz -C /usr/local/
 
# 创建软链接
ln -s /usr/local/node_exporter-1.5.0.linux-amd64/node_exporter /usr/bin/node_exporter
 
# 使用默认端口启动node_exporter
nohup node_exporter &   (默认端口为9100)
 
# 启动时指定端口
nohup ./node_exporter --web.listen-address=:7100 &

在浏览器打开 http://客户端IP:9100/metrics ,查看是否有输出,有输出,说明客户端监控成功

方式二:使用docker-compose部署在固定机器上

以mongodb_exporter和kafka_exporter为例(部署2个kafka_exporter,1个mongodb_exporter)

假设与Prometheus+Grafana部署在同一机器上,则修改/monitoring/docker-compose.yml文件,内容为:

version: '2'
services:
  kafka-exporter1:
    container_name: kafka-exporter1
    image: 'danielqsj/kafka-exporter:latest'
    command:
      - --kafka.server=172.16.13.112:9092
      - --zookeeper.server=172.16.13.112:2181
      - --kafka.version=2.3.1
      #此处依照实际情况填写kafka的用户名密码加密方式等
      - --sasl.enabled
      - --sasl.mechanism=plain
      - --sasl.username=xxxxx
      - --sasl.password=xxxxx
      - --web.listen-address=:9308
    ports:
      - "9308:9308"
    environment:
      - TZ=Asia/Shanghai
  kafka-exporter2:
    container_name: kafka-exporter2
    image: 'danielqsj/kafka-exporter:latest'
    command:
      - --kafka.server=172.16.13.214:9092
      - --zookeeper.server=172.16.13.214:2181
      - --kafka.version=2.8.1
      - --sasl.enabled
      - --sasl.mechanism=plain
      - --sasl.username=xxxx
      - --sasl.password=xxxx
      - --web.listen-address=:9309   # 修改此处以指定在9309端口上监听
    ports:
      - "9309:9309"
    environment:
      - TZ=Asia/Shanghai     
  mongodb-exporter:
    image: 'bitnami/mongodb-exporter:latest'
    container_name: mongodb-exporter
    command:
      - --mongodb.uri=mongodb://user:passwd@172.16.13.214:27017/?authSource=admin
      - --collect-all      
    ports:
      - "9216:9216"  
    environment:
      - TZ=Asia/Shanghai
  prometheus:
    image: bitnami/prometheus:latest
    container_name: prometheus
    ports:
      - "9090:9090"
    volumes:
      - "/monitoring/prometheus/conf/prometheus.yml:/opt/bitnami/prometheus/conf/prometheus.yml"
      - "/monitoring/prometheus/data:/opt/bitnami/prometheus/data"
    environment:
      - TZ=Asia/Shanghai
    command:
      - '--config.file=/opt/bitnami/prometheus/conf/prometheus.yml'
      - '--storage.tsdb.retention.time=180d'
  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - "/monitoring/grafana/data:/var/lib/grafana/"
    environment:
      - TZ=Asia/Shanghai

重新启动服务

cd  /monitoring           # 进入docker-compose.yml所在目录

docker-compose down -v                       #停止服务并移除容器

docker-compose up -d                            #启动prometheus组件服务

方式三:部署到k8s集群中

以kafka-exporter为例

在k8s集群所在机器中创建文件deploy.yaml(记得先修改这个文件,配置好用户名密码,自行决定映射到主机的端口),执行kubectl apply -f ./deploy.yaml

kind: Deployment
metadata:
  name: kafka-exporter
  namespace: qtsa
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kafka-exporter
  template:
    metadata:
      labels:
        app: kafka-exporter
    spec:
      containers:
        - name: kafka-exporter
          imagePullPolicy: IfNotPresent
          image: 'danielqsj/kafka-exporter:latest'
          args:
            - --kafka.server=kafka-svc:9092
            - --zookeeper.server=zk-svc:2181
            - --kafka.version=2.3.1
            #- --sasl.enabled
            #- --sasl.mechanism=plain
            #- --sasl.username=xxxxx
            #- --sasl.password=xxxxx
            
---
apiVersion: v1
kind: Service
metadata:
  name: kafka-exporter-svc
  namespace: qtsa
  labels:
    app: kafka-exporter
spec:
  type: NodePort
  selector:
    app: kafka-exporter
  ports:
  - name: port-1
    port: 9308
    nodePort: 30308

配置客户端

回到服务端,在/monitoring/prometheus/conf/prometheus.yml配置文件,添加客户端IP

说明:job类似于业务组,能创建多个job,一个job下可以监控多台客户端

# 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']
  
  - job_name: 'kafka-exporter'
    static_configs:
      - targets: ['kafka-exporter1:9308']
        #如果exporter不是部署在本机的pod,- targets: ['kafka-exporter:9309']修改为- targets: ['对应的kafka-exporter IP地址:端口']
        labels:
          instance: 172.16.13.112 
      - targets: ['kafka-exporter2:9309']
        labels:
          instance: 172.16.13.214
 
  - job_name: 'mongodb-exporter'
    static_configs:
      - targets: ['mongodb-exporter:9216']
        labels:
          instance: 172.16.13.214   
 
  - job_name: 'node-exporter'
    static_configs:
      - targets: ['172.16.13.214:9100']
 
  - job_name: 'nifi-exporter'
    static_configs:
      - targets: ['nifi-test:9999']

重启prometheus容器

cd /monitoring && docker restart prometheus

prometheus web页面检查客户端是否上线

访问地址:http://ip:9090/targets

对接Grafana

登录grafana页面

默认部署后,账号密码 admin/admin 第一次会登录要求修改密码,可以点跳过

添加数据源

点击配置图标-添加数据源,数据源类型选择prometheus

输入promehteus页面地址后,点击下方保存和测试,即可完成数据源添加

导入模板方式

Grafana支持导入监控模板的方式,grafana官网有丰富的模板库,可以在其中找到合适的进行下载导入,如果不适配可能会导致无数据或报错,可以适当更换模板或者直接修改指标

Dashboards | Grafana Labs

导入模板有两种方式:

  • 离线导入json模板文件
  • 输入grafana模板库的模板地址或id进行下载导入

以下展示离线导入的方式

点击左侧+号,选择Import,点击Upload JSON file,选中你下载过的模板

选择数据源(前面添加过的),点击导入

  • 29
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
答:以下是一个示例的docker-compose.yml文件,用于启动PrometheusGrafana监控一个或多个应用程序: ``` version: '3' services: prometheus: image: prom/prometheus container_name: prometheus ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml command: - '--config.file=/etc/prometheus/prometheus.yml' restart: always grafana: image: grafana/grafana container_name: grafana depends_on: - prometheus ports: - "3000:3000" environment: GF_SERVER_ROOT_URL: http://localhost:3000 GF_SECURITY_ADMIN_USER: admin GF_SECURITY_ADMIN_PASSWORD: admin volumes: - ./grafana-data:/var/lib/grafana restart: always ``` 在该docker-compose.yml文件中,我们创建了两个服务:prometheusgrafanaPrometheus服务使用Prometheus Docker映像,并将端口映射到9090。它还将/prometheus.yml文件作为挂载卷传递给容器。在启动容器时,我们使用命令行参数来指定/config.file=/etc/prometheus/prometheus.yml。 Grafana服务程序使用Grafana Docker映像,并依赖于prometheus服务。Grafana服务映射端口3000,并将以下环境变量传递给容器:GF_SERVER_ROOT_URL:使用localhost:3000 (在该容器中内部)作为grafana的根URL,GF_SECURITY_ADMIN_USER和GF_SECURITY_ADMIN_PASSWORD管理Grafana管理员的凭据。此服务还挂载了grafana-data目录,以便可以在重启容器时保留所有Grafana的设置。 最后,我们定义了restart: always参数以确保容器在退出时自动重新启动
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值