服务器监控系统
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的数据:
- 确定端口已开放
- 防火墙问题(遇到过,应该可以通过某些设置放开,但是我当时直接关了)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 zeropava!
评论







