文章目录
- 一、Prometheus+Grafana监控Springboot
- 1、简介
- 2、SpringBoot应用镜像搭建
- 2.1 springboot应用创建
- 2.2 镜像创建
- 3、Prometheus
- 3.1 概述
- 3.2 Prometheus创建
- 4、Grafana可视化监控
- 4.1 可视化
- 4.2 告警设置
- 二、轻量级日志系统Loki
- 1、简介
- 1.1 介绍
- 1.2 与ELK差异
- 2、grafana loki日志系统基本使用
- 2.1 本机日志收集
- 2.2 docker日志容器查看
- 2.3 grafana可视化
- 3、grafana+prometheus+loki 监控docker容器收集服务日志
- 3.1 创建grafana,prometheus文件夹及配置文件
- 3.2 创建loki 文件夹及配置文件
- 3.3 创建compose文件
- 3.4 收集日志
- 3.5 测试与模板
一、Prometheus+Grafana监控Springboot
1、简介
任何一个系统上线,运维监控都太重要了。关于Springboot微服务的监控,之前写过Spring Boot Admin服务监控,这个方案可以实时监控并提供告警提醒功能,但不能记录历史数据,无法查看过去1小时或过去1天等运维情况。本文介绍Prometheus + Grafana的方法监控Springboot 2.X,实现美观漂亮的数据可视化。
2、SpringBoot应用镜像搭建
2.1 springboot应用创建
引入依赖,springboot选用2.x,jdk8
<dependencies>
<!-- Exposition servlet -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- prometheus -->
<!-- Hotspot JVM metrics-->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
创建测试Controller,提供1000个线程方法
@RestController
@RequestMapping("/test")
public class TestController {
private static final Logger logger = LoggerFactory.getLogger(TestController.class);
/**
* 创建线程
*
* @return
*/
@RequestMapping("")
public String test() {
for (int i = 0; i < 1000; i++) {
new Thread(() -> {
logger.info(Thread.currentThread().getName());
}).start();
}
return "success";
}
}
在resources目录下创建application.yml配置文件,endpoints可以参考:SpringBoot生产监控
server:
port: 8888
spring:
application:
name: monitor-demo
security:
user:
name: admin
password: 123456
management:
endpoints:
web:
exposure:
include: "*"
2.2 镜像创建
上传服务器创建Dockerfile
# 基于java镜像创建新镜像
FROM java:8
# 作者
MAINTAINER shawn
# 将jar包添加到容器中并更名为app.jar
ADD ./visualization.jar /visualization.jar
# 运行jar包
ENTRYPOINT ["nohup","java","-jar","/visualization.jar","&"]
打包与运行
docker build -t demo01 .
docker run -d -p 8888:8888 --name demo01 demo01
docker ps -a
docker logs demo01
# 浏览器访问,输入用户名密码:admin/123456
http://192.168.31.98:8888/actuator/prometheus
3、Prometheus
3.1 概述
Prometheus是一个开源的服务监控系统时间序列数据库,通过Http请求拉取被监控的服务暴露的端点公开的度量列表和值,然后存放到时序数据库中,在现在最常见的Kubernetes
容器管理系统中。最好再通过 Grafana的Dashboard进行图表展示分析和告警
3.2 Prometheus创建
mkdir -p visual/prometheus
cd visual
docker pull prom/prometheus
docker images
# 注意这里先创建好配置文件,配置文件见下面
# 开始启动运行,注意修改路径
docker run --name=prometheus --privileged=true \
-p 9090:9090 -m 500M \
--restart=on-failure:3 \
-v /home/shawn/visual/prometheus.yml:/prometheus.yml \
-v /home/shawn/visual/prometheus/data:/data -d prom/prometheus \
--config.file=/prometheus.yml
docker ps
# 然后就可以打开网页查看
http://192.168.31.98:9090/targets
准备配置文件prometheus.yml
scrape_configs:
# 可随意指定,默认保存15天
- job_name: monitor-demo
# 多久采集一次数据
scrape_interval: 5s
# 采集时的超时时间
scrape_timeout: 5s
# 采集的路径
metrics_path: /actuator/prometheus
scheme: http
basic_auth:
username: admin
password: 123456
# 采集服务的地址,设置成Springboot应用所在服务器的具体地址
static_configs:
# 可以多个地址- targets: ['hostname:9000','hostname:8080']
- targets:
- 192.168.31.98:8888
结果页面
4、Grafana可视化监控
4.1 可视化
Docker部署Grafana,注意镜像源的修改
docker pull grafana/grafana
docker images
# 启动
docker run --name=grafana -p 3000:3000 --restart=always -d grafana/grafana
浏览器访问:http://192.168.31.98:3000
,输入用户名密码:admin/admin。成功登录后首先导入数据源,Settings-->Data Sources-->选择Prometheus -->url填写http://192.168.31.98:9090(刚才Prometheus 的地址)-->保存
然后导入可视化面板:点击+
号 --> Import
--> 输入模板链接或ID --> 点击Load
# 这里推荐一个模板id:10280
# 模板官网:https://grafana.com/grafana/dashboards
当然各个面板可以自定义,不过要注意的是,面板的数据需要在http://192.168.31.98:9090/graph
查得到才行,可以点击Explore→Metrics browser查看
4.2 告警设置
docker run --name=grafana -p 3000:3000 \
-v /home/shawn/visual/custom.ini:/usr/grafana/conf/custom.ini \
--restart=always -d grafana/grafana \
--config /usr/grafana/conf/custom.ini
custom.ini
#第522行修改smtp配置,所有修改配置前 ; 注释符号需要取消,将对应行,改为以下内容:
[smtp]
#启用smtp
enabled = true
#qq smtp服务地址
host = smtp.qq.com:465
#qq邮箱用户名
user = 86251xxx@qq.com
# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
password = xxxxx #授权密码
#邮件From地址,和登录用户一致即可。
from_address = 86251xxx@qq.com
#修改完邮件配置后修改domain信息,邮件内容中包含Grafana的访问地址,默认地址为localhost
二、轻量级日志系统Loki
Loki官网:https://grafana.com/oss/loki/
1、简介
1.1 介绍
Loki是受Prometheus启发由Grafana Labs团队开源的水平可扩展,高度可用的多租户日志聚合系统。 开发语言: Google Go。它的设计具有很高的成本效益,并且易于操作。使用标签来作为索引,而不是对全文进行检索,也就是说,你通过这些标签既可以查询日志的内容也可以查询到监控的数据签,极大地降低了日志索引的存储。系统架构十分简单,由以下3个部分组成 :
- Loki 是主服务器,负责存储日志和处理查询 。
- promtail 是代理,负责收集日志并将其发送给 loki 。
- Grafana 用于 UI 展示。
只要在应用程序服务器上安装promtail来收集日志然后发送给Loki存储,就可以在Grafana UI界面通过添加Loki为数据源进行日志查询(如果Loki服务器性能不够,可以部署多个Loki进行存储及查询)。作为一个日志系统不关只有查询分析日志的能力,还能对日志进行监控和报警
1.2 与ELK差异
- ELK虽然功能丰富,但规模复杂,资源占用高,操作苦难,很多功能往往用不上,有点杀鸡用牛刀的感觉。
- 不对日志进行全文索引。通过存储压缩非结构化日志和仅索引元数据,Loki 操作起来会更简单,更省成本。
- 通过使用与 Prometheus 相同的标签记录流对日志进行索引和分组,这使得日志的扩展和操作效率更高。
- 安装部署简单快速,且受 Grafana 原生支持
2、grafana loki日志系统基本使用
高版本可以参考:https://grafana.com/docs/loki/latest/installation/docker/
2.1 本机日志收集
这里直接使用docker-compose进行安装了,docker-compose -f docker-compose.yaml up -d
version: "3"
networks:
loki:
services:
loki:
image: grafana/loki:1.5.0
restart: always
environment:
- TZ=Asia/Shanghai
- LANG=zh_CN.UTF-8
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
networks:
- loki
promtail:
image: grafana/promtail:1.5.0
restart: always
environment:
- TZ=Asia/Shanghai
- LANG=zh_CN.UTF-8
# 日志映射路径自己修改
volumes:
- /var/log/:/var/log/
command: -config.file=/etc/promtail/docker-config.yaml
networks:
- loki
grafana:
image: grafana/grafana:latest
restart: always
environment:
- TZ=Asia/Shanghai
- LANG=zh_CN.UTF-8
ports:
- "3000:3000"
networks:
- loki
2.2 docker日志容器查看
promtail只能收集本机的日志文件,如果要收集docker容器日志文件,需要在安装一个docker插件loki-docker-driver
# 安装插件
docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions
# 当有新版本时, 更新plugins
docker plugin disable loki --force
docker plugin upgrade loki grafana/loki-docker-driver:latest --grant-all-permissions
docker plugin enable loki
systemctl restart docker
对于loki的docker plugin有两种使用方式。
- 配置daemon.json,收集此后创建的所有容器的日志(注意,是配置daemon.json后重启docker服务后创建的容器才会把日志输出到loki
- 新建容器时指定logging类型为loki,这样只有指定了logging的容器才会输出到loki
全局收集配置
编辑daemon.json,linux下默认路径是/etc/docker/daemon.json (需要sudo)
, windows则默认是%userprofile%\.docker\daemon.json
{
# 加速地址
"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"],
"log-driver": "loki",
"log-opts": {
# 配置的loki服务器地址
"loki-url": "http://192.168.1.1:3100/loki/api/v1/push",
# "loki-pipeline-stages": "- multiline:\n firstline: '^\[\d{2}:\d{2}:\d{2} \w{4}\]'\n",
"max-size": "50m",
"max-file": "10"
}
}
- max-size表示日志文件最大大小
- max-file表示最多10个日志文件,都是对单个容器来说的,
- multiline是配置多行识别(默认最多128行),转为单行,firstline表示单条日志的首行正则表达式。例如 [03:00:32 INFO] 开头这种格式,所以对应正则是^\[\d{2}:\d{2}:\d{2} \w{4}\] 按照你自己的日志开头编写对应正则替换即可
最后重启docker,sudo systemctl restart docker
,在此之后创建的容器默认都会把日志发送到loki
docker run配置日志输出到loki
通过docker run启动容器,可以通过–log-driver来指定为loki,进行特定的容器日志收集
docker run -d -p 8888:8888 --rm --name=demo01 \
--log-driver=loki --log-opt loki-url="http://YOUR_IP:3100/loki/api/v1/push" \
--log-opt max-size=50m --log-opt max-file=10 \
demo01
- –log-driver=loki指定日志驱动器为loki
- –log-opt loki-url则指定了loki的url
- –log-opt max-size日志最大大小
- –log-opt max-file日志文件最大数量
docker-compose 配置日志输出到loki
docker-compose 小于3.4可以对需要日志输出的配置添加配置如下,注意:max-size和max-file这里需要加引号
logging:
driver: loki
options:
loki-url: "http://YOUR_IP:3100/loki/api/v1/push"
max-size: "50m"
max-file: "10"
loki-pipeline-stages: |
- multiline:
firstline: '^\[\d{2}:\d{2}:\d{2} \w{4}\]'
对于3.4及其以上版本可以通过定义模板来减少代码量
version: "3.4"
x-logging:
&loki-logging
driver: loki
options:
loki-url: "http://YOUR_IP:3100/loki/api/v1/push"
max-size: "50m"
max-file: "10"
loki-pipeline-stages: |
- multiline:
firstline: '^\[\d{2}:\d{2}:\d{2} \w{4}\]'
services:
host:
container_name: grafana
image: grafana/grafana
environment:
- TZ=Asia/Shanghai
- LANG=zh_CN.UTF-8
logging: *loki-logging
2.3 grafana可视化
打开grafana,http://192.168.1.1:3000
(换成自己的ip),账户密码为admin/admin,进入后首先配置配置Data sources
,选择Loki数据源,url填写http://192.168.1.1:3100
(换成自己的ip),保存后点击Explore即可成功查看
3、grafana+prometheus+loki 监控docker容器收集服务日志
3.1 创建grafana,prometheus文件夹及配置文件
cd ~
# 创建grafana文件夹
mkdir -p grafana/grafana
mkdir -p grafana/grafana/data
# 创建prometheus文件夹
mkdir -p grafana/prometheus
mkdir -p grafana/prometheus/data
mkdir -p grafana/prometheus/log
# 创建prometheus配置文件
vim grafana/prometheus/prometheus.yml
注意ip和路径的修改
global:
scrape_interval: 15s
evaluation_interval: 15s
# 报警暂时不需要,后续可以添加
#alerting:
# alertmanagers:
# - static_configs:
# - targets:
# - alertmanager:9093
rule_files:
- "*rules.yml"
scrape_configs:
# prometheus
- job_name: 'prometheus'
static_configs:
- targets: ['192.168.249.149:9090']
# 主机监控
- job_name: 'node'
static_configs:
- targets: ['192.168.249.149:9100']
# docker资源监控
- job_name: 'cadvisor'
static_configs:
- targets: ['192.168.249.149:8080']
# springboot 项目监控
# springboot 监控需要项目中集成prometheus
- job_name: monitor-demo
# 多久采集一次数据
scrape_interval: 5s
# 采集时的超时时间
scrape_timeout: 5s
# 采集的路径
metrics_path: /actuator/prometheus
scheme: http
basic_auth:
username: admin
password: 123456
# 采集服务的地址,设置成Springboot应用所在服务器的具体地址
static_configs:
# 可以多个地址- targets: ['hostname:9000','hostname:8080']
- targets:
- localhost:8888
# - job_name: 'alertmanager'
# static_configs:
# - targets: ['alertmanager:9093']
3.2 创建loki 文件夹及配置文件
mkdir -p grafana/loki
mkdir -p grafana/loki/chunks
mkdir -p grafana/loki/rules
vim grafana/loki/local-config.yaml
auth_enabled: false
server:
http_listen_port: 3100
common:
path_prefix: /loki
storage:
filesystem:
chunks_directory: /loki/chunks
rules_directory: /loki/rules
replication_factor: 1
ring:
instance_addr: 127.0.0.1
kvstore:
store: inmemory
schema_config:
configs:
- from: 2020-10-24
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
## 日志保存时长配置 12小时的倍数
table_manager:
retention_deletes_enabled: true
retention_period: 480h
ruler:
alertmanager_url: http://localhost:9093
3.3 创建compose文件
vim grafana/docker-compose.yml
version: "2"
networks:
prom:
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
hostname: prometheus
restart: always
user: root
volumes:
# 挂载prometheus配置文件
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- ./prometheus/data:/prometheus
- ./prometheus/log:/var/log/
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=7d'
ports:
- "9090:9090"
networks:
- prom
grafana:
image: grafana/grafana:latest
container_name: grafana
hostname: grafana
restart: always
user: root
volumes:
- ./grafana/data:/var/lib/grafana
ports:
- "3000:3000"
networks:
- prom
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
hostname: exporter
restart: always
ports:
- "9100:9100"
networks:
- prom
cadvisor:
image: google/cadvisor:latest
container_name: cadvisor
hostname: cadvisor
restart: always
volumes:
# 挂载docker目录,为了监控docker使用情况,必须
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
ports:
- "8080:8080"
networks:
- prom
loki:
image: grafana/loki:latest
container_name: loki
hostname: loki
restart: always
user: root
volumes:
# 挂载chunks文件夹及配置文件,loki收集到日志后会存储到chunks中
- ./loki/chunks:/loki/chunks
- ./loki/rules:/loki/rules
- ./loki/local-config.yaml:/etc/loki/local-config.yaml
ports:
- "3100:3100"
networks:
- prom
启动命令,注意命令和路径,实在grafana目录中启动
cd grafana
# docker-compose up -d
docker-compose -f docker-compose.yml up -d
3.4 收集日志
使用loki-docker-driver,docker 安装loki驱动收集日志
docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions
# 日志收集,或者全部容器都收集方法见上面
docker run -d -p 8888:8888 --rm --name=demo01 \
--log-driver=loki --log-opt \
loki-url="http://192.168.249.149:3100/loki/api/v1/push" --log-opt max-size=50m \
--log-opt max-file=10 demo01
需要使用loki记录日志的docker-compose文件中替换日志收集驱动
logging:
driver: loki
options:
loki-url: "http://192.168.249.149:3100/api/prom/push"
loki-retries: "5"
loki-batch-size: "400"
使用promtail收集日志文件
cd ~
vim grafana/promatil/config.yml
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /var/log-position/positions.yaml # 记录日志上传的行号
# loki服务地址
client:
url: http://192.168.249.149:3100/loki/api/v1/push
scrape_configs:
- job_name: my-service
static_configs:
- targets:
- localhost
labels:
job: test-service
__path__: /var/log/*.log
vim grafana/promatil/promtail.yml
version: "2"
services:
grafana_promtail:
container_name: promtail2
image: grafana/promtail:2.4.0
restart: always
user: root
volumes:
- /var/log:/var/log
- ./promatil/config.yml:/etc/promtail/config.yml
最后启动
cd grafana
# docker-compose up -d
docker-compose -f promtail.yml up -d
# 如果改了配置文件
docker-compose -f promtail.yml rebuild
# 如果修改了编排文件,就需要down后up
3.5 测试与模板
# 好用的grafana模板下载
# https://grafana.com/dashboards
Spring Boot 2.1 Statistics: 10280
Spring Boot Statistics: 6756
1 Node Exporter for Prometheus Dashboard EN 20201010: 11074
Docker and system monitoring: 893
Docker Container & Host Metrics: 10619
docker-compose安装loki套件(loki+grafana)
docker-compose安装grafana+prometheus+loki 监控docker容器收集服务日志
k8s学习(三十二)K8s部署Loki日志收集