在当今的软件开发中,监控和日志收集是至关重要的环节。它们帮助我们了解系统额运行状况、发现潜在问题,并及时进行优化和故障排除。
本文将介绍如何使用 Spring Boot 3.2.3
结合Grafana、Prometheus和 Loki
来构建一套轻量级的监控和日志收集系统。
快捷目录
- 1.技术选型
- [2.Spring Boot 应用配置](#2.Spring Boot 应用配置)
-
- [2.1 pom依赖](#2.1 pom依赖)
- [2.2 yml配置](#2.2 yml配置)
- [2.3 接口代码](#2.3 接口代码)
- [3.Prometheus 配置](#3.Prometheus 配置)
-
- [3.1 目录结构](#3.1 目录结构)
- [3.2 docker-compose.yml](#3.2 docker-compose.yml)
- [3.3 Prometheus 配置](#3.3 Prometheus 配置)
- [3.4 Grafana 配置](#3.4 Grafana 配置)
- [3.5 Loki 配置](#3.5 Loki 配置)
- 4.启动容器
- 5.控制台访问
-
- [5.1 控制台](#5.1 控制台)
- [5.2 配置Prometheus数据源](#5.2 配置Prometheus数据源)
-
- [5.2.1 面板菜单](#5.2.1 面板菜单)
- [5.2.2 新增数据源,如果前面有配置默认数据源可以忽略此操作](#5.2.2 新增数据源,如果前面有配置默认数据源可以忽略此操作)
- [5.2.3 进入数据源详情,在此处填写Prometheus的地址,保存即可](#5.2.3 进入数据源详情,在此处填写Prometheus的地址,保存即可)
- [5.2.4 配置好之后再数据源列表选项添加到仪表盘,`Build a dashboard`](#5.2.4 配置好之后再数据源列表选项添加到仪表盘,
Build a dashboard
) - [5.2.5 然后选择名称和数据源接口新增一个统计仪表了](#5.2.5 然后选择名称和数据源接口新增一个统计仪表了)
- [5.2.6 接下来回到仪表盘,点击对应名称进入详情](#5.2.6 接下来回到仪表盘,点击对应名称进入详情)
- [5.2.7 仪表盘面板](#5.2.7 仪表盘面板)
- [5.3 配置Loki数据源](#5.3 配置Loki数据源)
-
- [5.3.1 数据源新增 Loki,并填写对应部署的地址与端口](#5.3.1 数据源新增 Loki,并填写对应部署的地址与端口)
- [5.3.2 保存后,直接点右边的探索(Explore),到详情界面](#5.3.2 保存后,直接点右边的探索(Explore),到详情界面)
- [5.3.3 项目logback.xml配置](#5.3.3 项目logback.xml配置)
- [5.3.4 日志控制台面板](#5.3.4 日志控制台面板)
- 6.系统整合与优化
1.技术选型
Spring Boot 3.2.3:用于构建高效、独立的Web应用程序。
Prometheus:开源的监控系统,用于收集和存储指标数据。
Grafana:数据可视化工具,用于创建美观的监控仪表盘。
Loki:日志收集和查询系统。
2.Spring Boot 应用配置
首先,创建一个Spring Boot项目,并添加相关依赖。
2.1 pom依赖
主依赖我就不贴了,这里贴下对应监控和日志推送的依赖
xml
<!--监控功能Actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Micrometer Prometheus Registry -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<scope>runtime</scope>
</dependency>
<!-- loki日志推送-->
<dependency>
<groupId>com.github.loki4j</groupId>
<artifactId>loki-logback-appender</artifactId>
<version>1.5.2</version>
</dependency>
<!--httpclient loki 推送走的是http如果不引用 会一直卡在启动-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
2.2 yml配置
yml
server:
port: 9999
spring:
application:
name: redis-test
management:
endpoint:
metrics:
enabled: true #开启metrics,其实默认就是开的
prometheus:
enabled: true #开启普罗米修斯,其实默认就是开的
metrics:
tags:
application: ${spring.application.name} #实例采集名
endpoints:
web:
exposure:
include: "*" #开放所有接口
prometheus:
metrics:
export:
enabled: true
2.3 接口代码
java
@GetMapping("/test")
public void test() {
log.info("请求:{}", new Date().getTime());
}
3.Prometheus 配置
安装 Prometheus,并配置其抓取 Spring Boot 应用的指标数据。这里采用的是Docker部署的方式,无对应环境的请先自行安装。我这里是下面目录
3.1 目录结构
prometheus_grafana/
grafana/
provisioning/
datasources/
datasource.yml
grafana.ini
config.monitoring
prometheus/
prometheus.yml
loki/
data/
config.yaml
docker-compose.yml
每个目录分别对应每个中间件,具体可以参考映射
3.2 docker-compose.yml
我是图省事放一个文件了,如果是不同服务器的可以拆开部署
yml
version: "2"
services:
prometheus:
image: prom/prometheus:v2.54.0
container_name: 'prometheus'
environment:
- TZ=Asia/Shanghai
ports:
- '9090:9090'
volumes:
# 映射prometheus的配置文件
- ./prometheus/:/etc/prometheus/
# 同步容器与宿主机的时间,这个非常重要,如果时间不一致,会导致prometheus抓不到数据
- /etc/localtime:/etc/localtime:ro
grafana:
image: grafana/grafana:11.0.3
container_name: 'grafana'
ports:
- '3000:3000'
volumes:
# grafana报警邮件配置,暂不使用
#- ./grafana/grafana.ini:/etc/grafana/grafana.ini
# 配置grafana的prometheus数据源
- ./grafana/provisioning/:/etc/grafana/provisioning/
- /etc/localtime:/etc/localtime:ro
env_file:
# grafana登录配置
- ./grafana/config.monitoring
depends_on:
# grafana需要在prometheus之后启动
- prometheus
loki:
image: grafana/loki:latest
container_name: loki
hostname: loki
#restart: always
command: -config.file=/etc/loki/config.yaml
volumes:
# 挂载chunks文件夹及配置文件,loki收集到日志后会存储到chunks中
- ./loki/data:/loki
- ./loki/config.yaml:/etc/loki/config.yaml
ports:
- "3100:3100"
- "9095:9095"
depends_on:
- prometheus
接下来开始写每个中间件的配置。
3.3 Prometheus 配置
prometheus.yml
yml
global: #全局配置
scrape_interval: 10s #全局定时任务抓取性能数据间隔
# 监控SpringBoot应用:redis-test
scrape_configs:
- job_name: 'redis-test'
scrape_interval: 5s #每5s抓取一次
metrics_path: '/actuator/prometheus' #抓取数据的url
static_configs:
- targets: ['192.168.168.199:9999'] #修改为Spring Boot应用程序的实际地址
labels:
application: 'redis-profile-label' #抓取任务标签
3.4 Grafana 配置
- config.monitoring配置控制台的相关配置
json
#默认账户admin 设置密码admin
GF_SECURITY_ADMIN_PASSWORD=admin
#是否支持注册
GF_USERS_ALLOW_SIGN_UP=false
- grafana.ini 邮件报警配置,这里只贴一下,暂未使用
ini
#################################### SMTP / Emailing ##########################
# 配置邮件服务器
[smtp]
enabled = true
# 发件服务器
host = smtp.xxx.com:25
# smtp账号
user = xxx@xxx.com
# smtp 授权码,设置里面开通获取授权码
password = xxx
# 发信邮箱
from_address = xxx@xxx.com
# 发信人
from_name = message_notice # 注意此处不能是中文,否则报错,应该有配置编码的地方,目前没发现
- provisioning/datasources/datasource.yml 配置默认的数据源
yml
# config file version
apiVersion: 1
deleteDatasources: #如果之前存在name为Prometheus,orgId为1的数据源先删除
- name: Prometheus
orgId: 1
datasources: #配置Prometheus的数据源
- name: Prometheus
type: prometheus
access: proxy
orgId: 1
url: http://192.168.168.199:9090 #在相同的docker compose下,可以直接用prometheus服务名直接访问
basicAuth: false
isDefault: true
version: 1
editable: true
此配置可省略,可在控制台上配置
3.5 Loki 配置
安装 Loki,这可能需要一些日志输出的配置调整,例如将日志以特定格式输出到标准输出或文件。
- 新建data目录,用户存储配置历史,注意需要给这个权限赋予管理员权限
shell
mkdri -p loki/data
chmod -R 777 loki
- config.yml
yml
auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9095
grpc_server_max_recv_msg_size: 1572864000 #grpc最大接收消息值,默认4m
grpc_server_max_send_msg_size: 1572864000 #grpc最大发送消息值,默认4m
ingester:
lifecycler:
address: 192.168.168.199 #绑定本机 ip
ring:
kvstore:
store: inmemory
replication_factor: 1
final_sleep: 0s
chunk_idle_period: 5m
chunk_retain_period: 30s
wal:
dir: /loki/wal
compactor:
working_directory: /loki/persistent # 压缩目录,一般也作为持久化目录
compaction_interval: 10m # 压缩间隔
retention_enabled: true # 持久化开启
retention_delete_delay: 5m # 过期后多久删除
retention_delete_worker_count: 150 # 过期删除协程数目
schema_config:
configs:
- from: "2024-08-27"
index:
period: 24h
prefix: loki_index_
object_store: filesystem # 持久化方式:本地文件
schema: v11
store: boltdb-shipper
storage_config:
boltdb_shipper:
active_index_directory: /loki/boltdb-index # index 目录
cache_location: /loki/boltdb-cache # cache 目录
filesystem:
directory: /loki/chunks # chunks 目录
limits_config:
retention_period: 240h # 多久过期
4.启动容器
shell
docker-compose up -d
启动后应该是这样的
shell
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8d5b5c2bbde3 grafana/loki:latest "/usr/bin/loki -conf..." 18 hours ago Up 18 hours 0.0.0.0:3100->3100/tcp, 0.0.0.0:9095->9095/tcp loki
d715a50b3506 prom/prometheus:v2.54.0 "/bin/prometheus --c..." 20 hours ago Up 18 hours 0.0.0.0:9090->9090/tcp prometheus
30d0e22d0257 grafana/grafana:11.0.3 "/run.sh" 20 hours ago Up 18 hours 0.0.0.0:3000->3000/tcp grafana
同时Java服务也一并启动,并且http://192.168.168.199:9999/actuator/prometheus
能正常访问,才说明Java服务的监控正常生效的
5.控制台访问
打开 Grafana控制台,并添加 Prometheus 和 Loki 作为数据源。然后创建仪表盘来展示监控数据和查询日志。
5.1 控制台
http://192.168.168.199:3000/
账户密码都是admin(配置的)
中文切换在Administration -> General -> Default preferences
里面切换
5.2 配置Prometheus数据源
5.2.1 面板菜单
5.2.2 新增数据源,如果前面有配置默认数据源可以忽略此操作
5.2.3 进入数据源详情,在此处填写Prometheus的地址,保存即可
5.2.4 配置好之后再数据源列表选项添加到仪表盘,Build a dashboard
- 这里可以选择去
grafana.com/dashboards
上面找对应模版下载为json或者直接记录模版id即可 - 我这里用的是id,4701,然后点加载
5.2.5 然后选择名称和数据源接口新增一个统计仪表了
5.2.6 接下来回到仪表盘,点击对应名称进入详情
5.2.7 仪表盘面板
5.3 配置Loki数据源
5.3.1 数据源新增 Loki,并填写对应部署的地址与端口
5.3.2 保存后,直接点右边的探索(Explore),到详情界面
5.3.3 项目logback.xml配置
添加一个appender
,url我写死了,需要不同环境的可以参考application
写到yml配置里面去,其他的配置就不贴了
xml
<springProperty name="application" source="spring.application.name" />
<property name="PATTERN" value="${application} %d{yyyy-MM-dd HH:mm:ss} [%-4level] %logger{}:%L [%thread] %msg%n" />
<!--添加loki-->
<appender name="lokiAppender" class="com.github.loki4j.logback.Loki4jAppender">
<batchTimeoutMs>1000</batchTimeoutMs>
<http class="com.github.loki4j.logback.ApacheHttpSender">
<url>http://192.168.168.199:3100/loki/api/v1/push</url>
</http>
<format>
<!-- 页面上显示的标签-->
<label>
<pattern>system=${application},level=%level,logType=%X{log_file_type:-logType}</pattern>
</label>
<message>
<pattern>${PATTERN}</pattern>
</message>
<sortByTime>true</sortByTime>
</format>
</appender>
<!--普通日志输出到控制台-->
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="lokiAppender" />
</root>
需要注意的是<label>
标签,会对应控制台页面上的筛选,另外日志是通过http请求push到loki上的,如果没有引入http依赖包的切记一定要引入,最后启动SpringBoot服务,调用接口并打印日志
5.3.4 日志控制台面板
label标签对应红框这一块的内容,黄框对应搜索条件
至此,服务监控和日志在线查询已全部实现。
6.系统整合与优化
通过不断调整和优化各个组件的配置,以满足实际的监控和日志收集需求。例如,设置合适的告警规则、优化数据存储和查询性能等。
总之,使用 Spring Boot 3.2.3 与 Grafana、Prometheus 和 Loki 相结合,可以构建出一套功能强大、易于扩展和维护的轻量级监控和日志收集系统,帮助我们更好地保障系统的稳定性和可靠性。
以上就是本文的全部内容了,希望以上内容对您有所帮助!
上一篇:随手记录第十四话 -- 在 Spring Boot 3.2.3 中使用 springdoc-openapi-starter-webmvc-ui
下一篇:随手记录第十六话 -- xxxx
一寸光阴一寸金,寸金难买寸光阴