centos部署SkyWalking以及在springcloud项目中搭配loki使用

场景

SkyWalking是应用性能监控平台,可用于分布式系统,支持微服务、云原生、Docker、Kubernetes 等多种架构场景。 最近搞了一台家用服务器,下面演示下部署过程以及用法

SkyWalking介绍

部署

  1. Agent:在应用中,收集 Trace、Log、Metrics 等监控数据,使用 RPC、RESTful API、Kafka 等 Transport 传输方式,发送给 OAP 服务
  2. OAP:首先 Receiver 接收 Agent 发送的监控数据,然后 Aggregator 进行聚合计算,之后存储到 Storage 外部存储器,最终提供给 GUI 查询数据
  3. Storage:存储监控数据,支持 Elasticsearch、MySQL、TiDB、H2 等多种数据库
  4. GUI:UI 可视化界面,提供监控数据的查询后台
    在这里插入图片描述
部署Storage [单机版Elasticsearch]
  1. 修改用户的最大文件描述符数量到65535, /etc/security/limits.conf 添加下面的配置
    在这里插入图片描述
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535

# 限制 root /普通用户的最大文件描述符数量为 65535。
  1. 配置再当前会话生效 (root账号执行)

ulimit -n 65536

  1. 增加 Linux 系统中的内存映射区域的最大数量 在/etc/sysctl.conf添加下面的配置
vm.max_map_count=655360

# 默认情况下,Linux 系统通常会有一个较小的 vm.max_map_count 值,例如 1024。如果应用程序需要更高的映射区域(如 Elasticsearch),可能会因为超出该值而报错,增加这个值可以解决此问题。
  1. 执行命令,使配置立刻生效
sysctl -p
  1. 下载elasticsearch-6.7.2.tar.gz安装包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.7.2.tar.gz

tar -zxvf elasticsearch-6.7.2.tar.gz

vim elasticsearch-6.7.2/config/elasticsearch.yml
    network.host: 0.0.0.0 # 允许外网访问    

  1. 修改启动脚本, 指定使用jdk1.8 (因为我的环境默认是jdk17, 当前版本的es需要1.8) 该步骤选做
vim bin/elasticsearch-env
# 添加下面的配置 (路径是jdk1.8的路径)
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64

在这里插入图片描述

  1. 安装分词器插件
cd elasticsearch-6.7.2

wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.7.2/elasticsearch-analysis-ik-6.7.2.zip   


unzip elasticsearch-analysis-ik-6.7.2.zip -d plugins/ik/
                                                      


  1. 启动
bin/elasticsearch -d

  1. 查看是否部署成功, 浏览器查看 http://自己的ip:9200/

在这里插入图片描述

部署SkyWalking OAP 下载地址
  1. 下载脚本
wget https://archive.apache.org/dist/skywalking/9.4.0/apache-skywalking-apm-9.4.0.tar.gz
  1. 修改配置
vim config/application.yml
# storage.selector 修改成elasticsearch 默认h2
storage:
  selector: ${SW_STORAGE:elasticsearch}
  1. 另外需要自行调整es配置
    在这里插入图片描述
  2. 启动
 bin/oapService.sh start

SkyWalking OAP started successfully!
在这里插入图片描述

  1. 启动SkyWalking UI
 bin/./webappService.sh start

在这里插入图片描述
6. 访问ui

默认端口8080, webapp/webapp.yml 修改配置

server.port :SkyWalking UI 服务端口。
spring.cloud.discovery.client.simple.instances.oap-service :SkyWalking OAP 服务地址数组。因为 SkyWalking UI 界面的数据,是通过请求 SkyWalking OAP 服务来获得的

在这里插入图片描述

部署SkyWalking Java Agent
  1. 下载
wget https://archive.apache.org/dist/skywalking/java-agent/9.0.0/apache-skywalking-java-agent-9.0.0.tgz

springCloud 使用举例

  1. 启动脚本

下面这三个环境变量是需要必须设置的

 SW_AGENT_NAME=demo-application # 配置 Agent 名字。一般来说,我们直接使用 Spring Boot 项目的 `spring.application.name` 。
 SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 # 配置 Collector 地址。
 JAVA_AGENT=-javaagent:/Users/yunai/skywalking/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar # SkyWalking Agent jar 地址。

多个jar包都存放在/home/carsonlius/project/yudao/yudao-cloud-jdk17, 脚本指定这些脚本使用skywalking启动

#!/bin/bash

# 项目路径
PROJECT_PATH="/home/carsonlius/project/yudao/yudao-cloud-jdk17"
# Java 执行命令
JAVA_CMD="java"
# SkyWalking Agent 配置
SKYWALKING_AGENT="/home/carsonlius/software/skywalking/skywalking-agent/skywalking-agent.jar"
SW_AGENT_COLLECTOR_BACKEND_SERVICES="100.64.0.4:11800"
# 日志路径
LOG_PATH="/home/carsonlius/project/yudao/logs"

# 检查日志路径是否存在
mkdir -p "$LOG_PATH"

# 获取所有服务名称
SERVICES=($(ls "$PROJECT_PATH" | grep "\.jar$"))

# 启动单个服务
start_service() {
    SERVICE=$1
    PID=$(pgrep -f "$SERVICE")
    if [ -n "$PID" ]; then
        echo "$SERVICE 已经在运行 (PID: $PID)"
    else
        echo "正在启动 $SERVICE..."
        # 调试输出,检查服务名
        echo "服务名称: $SERVICE"
        SW_AGENT_NAME="${SERVICE%.jar}"
        echo "SkyWalking 服务名: $SW_AGENT_NAME"
        nohup $JAVA_CMD -javaagent:$SKYWALKING_AGENT \
            -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=$SW_AGENT_COLLECTOR_BACKEND_SERVICES \
            -DSW_AGENT_NAME=$SW_AGENT_NAME \
            -jar "$PROJECT_PATH/$SERVICE" > "$LOG_PATH/${SERVICE%.jar}.log" 2>&1 &
        sleep 2
        PID=$(pgrep -f "$SERVICE")
        if [ -n "$PID" ]; then
            echo "$SERVICE 启动成功 (PID: $PID)"
        else
            echo "$SERVICE 启动失败,请检查日志。"
        fi
    fi
}

# 停止单个服务
stop_service() {
    SERVICE=$1
    PID=$(pgrep -f "$SERVICE")
    if [ -n "$PID" ]; then
        echo "正在停止 $SERVICE (PID: $PID)..."
        kill -9 "$PID"
        echo "$SERVICE 已停止。"
    else
        echo "$SERVICE 未运行。"
    fi
}

# 启动所有服务
start_all() {
    for SERVICE in "${SERVICES[@]}"; do
        start_service "$SERVICE"
    done
}

# 停止所有服务
stop_all() {
    for SERVICE in "${SERVICES[@]}"; do
        stop_service "$SERVICE"
    done
}

# 显示脚本用法
usage() {
    echo "用法: $0 {start|stop} [service_name]"
    echo "  start: 启动指定服务或全部服务"
    echo "  stop: 停止指定服务或全部服务"
    echo "  service_name: 可选,指定服务名称 (如 carsonlius-gateway.jar)"
}

# 脚本主逻辑
case $1 in
    start)
        if [ -n "$2" ]; then
            start_service "$2"
        else
            start_all
        fi
        ;;
    stop)
        if [ -n "$2" ]; then
            stop_service "$2"
        else
            stop_all
        fi
        ;;
    *)
        usage
        ;;
esac

  1. 效果

在这里插入图片描述

在这里插入图片描述

追踪ID写入loki

  1. 自定义SkyWalkingTraceFilter

MDC 允许你为日志消息添加额外的上下文信息,例如:用户 ID、会话 ID、请求的追踪 ID(如 SkyWalking 的 traceId)。

package com.carsonlius.cloud.framework.common.filter;

import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import java.io.IOException;

/**
 * skyWalking的追踪过滤器
 * @author carsonlius
 */
@Component
public class SkyWalkingTraceFilter extends OncePerRequestFilter {

    private static final String TRACE_ID_KEY = "traceId";

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        try {

            MDC.put(TRACE_ID_KEY, TraceContext.traceId());

            // 继续过滤链
            filterChain.doFilter(request, response);
        }  finally {
            MDC.remove(TRACE_ID_KEY);
        }
    }
}
  1. 修改loki配置

修改日志模式 “traceId”: “%X{traceId}”,

    <appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender">
        <http>
            <url>http://100.64.0.4:3100/loki/api/v1/push</url>
        </http>
        <format>
            <label>
                <pattern>application=${name},level=%level</pattern>
                <readMarkers>true</readMarkers>
            </label>
            <message>
                <pattern>
                        {"timestamp": "%d{yyyy-MM-dd HH:mm:ss.SSS}",
                        "level": "%level",
                        "logger": "%logger{36}.%method",
                        "method":"%M",
                        "line":"%line",
                        "thread": "%thread",
                        "traceId": "%X{traceId}",
                        "message": "%msg%n"}
                </pattern>
            </message>
            <sortByTime>true</sortByTime>
        </format>
    </appender>
  1. loki 日志效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值