Prometheus Server

Prometheus服务的主服务器,收集监控信息

docker run -d -p 9090:9090 --name prometheus --net=host prom/prometheus
#先基于prom/prometheus镜像随便运行一个容器,我们需要将其主配置文件复制一份进行更改
docker cp prometheus:/etc/prometheus/prometheus.yml ./
#复制prometheus容器中的主配置文件到宿主机本地
docker rm -f prometheus 
vim prometheus.yml 
#找到如下行并修改
    - targets: ['localhost:9090','localhost:8080','localhost:9100','192.168.171.150:9100','192.168.171.150:8080','192.168.171.152:9100','192.168.171.152:8080']
#上述内容看似杂乱无章,其实无非就是指定了本机的9090、8080、9100这三个端口,
#还增加了另外两台被监控的服务器的8080端口和9100端口
#若需要监控更多的服务器,只需依次在上面指定添加即可,当然了,被监控端需要运行前面的两个容器
docker run -d -p 9090:9090 -v ./prometheus.yml:/etc/prometheus/prometheus.yml --name prometheus --net=host prom/prometheus
#执行上述命令,运行新的prometheus容器,并将刚刚修改的主配置文件挂载到容器中的指定位置
#以后若要修改主配置文件,则直接修改本地的即可。
#挂载主配置文件后,本地的和容器内的相当于同一份,在本地修改内容的话,会同步到容器中

Node Exporter

收集Host硬件和操作系统的信息

docker run -d -p 9100:9100 -v /proc:/host/proc -v /sys:/host/sys -v /:/rootfs --net=host --restart=always prom/node-exporter --path.procfs /host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
#基于“prom/node-exporter”镜像运行容器,可以去github官网搜索该镜像,以便了解其主要功能
#注:每台需要被监控的主机都需要执行上述命令以便运行容器,以便收集主机信息

cAdvrisor

负责收集Host上运行的容器信息

docker run -v /:/rootfs:ro -v /var/run:/var/run:rw -v /sys:/sys:ro -v /var/lib/docker:/var/lib/docker:ro -p 8080:8080 --detach=true --name=cadvisor --net=host google/cadvisor

grafana

用来展示Prometheus监控操作界面(给我们提供一个友好的web界面)

 mkdir grafana-storage
chmod 777 -R grafana-storage/
docker run -d -p 3000:3000 --name grafana -v ./grafana-storage:/var/lib/grafana -e "GF_SECURITY_ADMIN_PASSWORD=123456" grafana/grafana
#上述命令中的“-e”选项是为了设置默认的登录用户admin,密码为“123456”。
#如果启动容器的过程中,提示iptables等相关的错误信息,
#则需要执行命令systemctl restart docker,重启docker服务,然后重新运行容器
#但是需要注意,若运行容器时没有增加“--restart=always”选项的话,
#那么在重启docker服务后,还需将所有容器手动重启。
#重启所有容器命令“docker ps -a -q | xargs docker start”

grafana通过nginx进行转发

nginx和grafana均使用docker部署

grafana官方文档:在反向代理|后面运行 Grafana格拉法纳实验室

nginx配置

# this is required to proxy Grafana Live WebSocket connections.
map $http_upgrade $connection_upgrade {
  default upgrade;
  '' close;
}

upstream grafana {
  server domain.com:3000; #域名:端口 由于使用docker,所以不能像官方文档一样使用localhost
}

server {
  listen 80;
  root /usr/share/nginx/html;
  index index.html index.htm;

  location /grafana/ {
    rewrite  ^/grafana/(.*)  /$1 break;
    proxy_set_header Host $http_host;
    proxy_pass http://grafana;
  }

  # Proxy Grafana Live WebSocket connections.
  location /grafana/api/live/ {
    rewrite  ^/grafana/(.*)  /$1 break;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_set_header Host $http_host;
    proxy_pass http://grafana;
  }
}

grafana配置

[server]
domain = domain.com
root_url = %(protocol)s://%(domain)s/grafana/
serve_from_sub_path = true

之后重启容器访问 http://domain.com/grafana 即可

loki + promtail

日志收集系统,在grafana中展示

docker-compose.yml文件:

version: "1"
services:
  promtail:
    image: grafana/promtail:2.2.0
    container_name: promtail
    volumes:
      - ./promtail/promtail-docker-config.yaml:/etc/promtail/docker-config.yaml
      - /var/test/usr/:/var/log/user/
      #这里可依次将需要的日志文件夹挂载上去,因为有些服务日志是定期清楚更换的,所以不便挂载日志文件本身
    command: "--config.file=/etc/promtail/docker-config.yaml"
  loki:
    image: grafana/loki:2.2.0
    container_name: loki
    command: -config.file=/etc/loki/local-config.yaml
    ports:
      - "3100:3100"

loki可能会出现日志过大现象,严重占用内存空间,所以使用docker run

docker run -it --log-opt max-size=10m --log-opt max-file=3 --name loki  -p 3100:3100 grafana/loki:2.2.0 -config.file=/etc/loki/local-config.yaml
# max-size 最大数值
# max-file 最大日志数

promtail-docker-config.yaml 文件:

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push #loki主机的ip地址或域名

scrape_configs:
  - job_name: system
    static_configs:
    - targets:
        - localhost
      labels:
        job: test
        app: user-service
        __path__: /var/log/user/logs.txt

    pipeline_stages:
      - match:
          selector: '{job="test"}'
          stages: 
          - multiline:
              firstline: '\d{4}-\d{2}-\d{2}\s\d{1,2}:\d{2}:\d{2}.\d{3}\s*(INFO|ERROR|DEBUG|WARN|CRITICAL)'
              #使用正则匹配日志首行,比如java的error日志会打印出错误堆栈信息,会被promtail分解为多条日志
          - regex:
              expression: '\d{4}-\d{2}-\d{2}\s\d{1,2}:\d{2}:\d{2}.\d{3}\s*(?P<level>INFO|ERROR|DEBUG|WARN|CRITICAL)'
              #此处使用正则提取出日志等级,INFO|ERROR|DEBUG|WARN|CRITICAL,方便展示
          - labels:
              level:

如果grafana获取不到loki的数据:

  • 确定端口已开放
  • 防火墙问题(遇到过,应该可以通过某些设置放开,但是我当时直接关了)