随手记录第十五话 -- Spring Boot 3.2.3+Grafana+Prometheus+Loki实现一套轻量级监控加日志收集系统

在当今的软件开发中,监控和日志收集是至关重要的环节。它们帮助我们了解系统额运行状况、发现潜在问题,并及时进行优化和故障排除。

本文将介绍如何使用 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

一寸光阴一寸金,寸金难买寸光阴

相关推荐
爱编程的小生14 分钟前
SpringBoot Task
java·spring boot·后端
CoderJia程序员甲21 分钟前
重学SpringBoot3-异步编程完全指南
java·spring boot·后端·异步编程
扬子鳄00824 分钟前
Spring Boot自动配置机制
java·数据库·spring boot
岁岁岁平安26 分钟前
springboot实战(19)(条件分页查询、PageHelper、MYBATIS动态SQL、mapper映射配置文件、自定义类封装分页查询数据集)
java·spring boot·后端·mybatis·动态sql·pagehelper·条件分页查询
泰山小张只吃荷园1 小时前
期末Python复习-输入输出
java·前端·spring boot·python·spring cloud·docker·容器
曲邹萌3 小时前
springboot-vue excel上传导出
vue.js·spring boot·导入导出
HaiFan.4 小时前
Spring日志
java·spring boot
Hello Dam4 小时前
基于 Spring Boot 实现图片的服务器本地存储及前端回显
服务器·前端·spring boot
cnsxjean13 小时前
SpringBoot集成Minio实现上传凭证、分片上传、秒传和断点续传
java·前端·spring boot·分布式·后端·中间件·架构
《源码好优多》14 小时前
基于Java Springboot汽配销售管理系统
java·开发语言·spring boot