一、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日志收集

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐