随手记录第十五话 -- 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

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

相关推荐
工业甲酰苯胺1 小时前
Spring Boot 整合 MyBatis 的详细步骤(两种方式)
spring boot·后端·mybatis
bjzhang753 小时前
SpringBoot开发——集成Tess4j实现OCR图像文字识别
spring boot·ocr·tess4j
鱼饼6号3 小时前
Prometheus 上手指南
linux·运维·centos·prometheus
flying jiang3 小时前
Spring Boot 入门面试五道题
spring boot
小菜yh3 小时前
关于Redis
java·数据库·spring boot·redis·spring·缓存
爱上语文4 小时前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
荆州克莱5 小时前
springcloud整合nacos、sentinal、springcloud-gateway,springboot security、oauth2总结
spring boot·spring·spring cloud·css3·技术
serve the people5 小时前
springboot 单独新建一个文件实时写数据,当文件大于100M时按照日期时间做文件名进行归档
java·spring boot·后端
罗政10 小时前
[附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离
vue.js·spring boot·后端
Java小白笔记13 小时前
关于使用Mybatis-Plus 自动填充功能失效问题
spring boot·后端·mybatis