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

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

本文将介绍如何使用 Spring Boot 3.2.3结合Grafana、Prometheus和 Loki来构建一套轻量级的监控和日志收集系统。

1.技术选型

Spring Boot 3.2.3:用于构建高效、独立的Web应用程序。
Prometheus:开源的监控系统,用于收集和存储指标数据。
Grafana:数据可视化工具,用于创建美观的监控仪表盘。
Loki:日志收集和查询系统。

2.Spring Boot 应用配置

首先,创建一个Spring Boot项目,并添加相关依赖。

2.1 pom依赖

主依赖我就不贴了,这里贴下对应监控和日志推送的依赖

<!--监控功能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配置

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 接口代码

    @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

我是图省事放一个文件了,如果是不同服务器的可以拆开部署

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

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配置控制台的相关配置
#默认账户admin 设置密码admin
GF_SECURITY_ADMIN_PASSWORD=admin
#是否支持注册
GF_USERS_ALLOW_SIGN_UP=false
  • grafana.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 配置默认的数据源
# 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目录,用户存储配置历史,注意需要给这个权限赋予管理员权限
mkdri -p  loki/data
chmod -R 777 loki
  • config.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.启动容器

docker-compose up -d

启动后应该是这样的

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配置里面去,其他的配置就不贴了

	<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
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值