草庐IT

Linux搭建Skywalking9.3

猿仁 2023-04-22 原文

开始语

一位普通的程序员,慢慢在努力变强!

1.安装

skywalking官网访问👈

1.1 下载文件压缩包

wget https://dlcdn.apache.org/skywalking/9.3.0/apache-skywalking-apm-9.3.0.tar.gz
wget https://dlcdn.apache.org/skywalking/java-agent/8.14.0/apache-skywalking-java-agent-8.14.0.tgz

1.2 解压压缩包

tar -xzvf apache-skywalking-apm-9.3.0.tar.gz  
tar -zxvf apache-skywalking-java-agent-8.14.0.tgz

1.3 修改web-ui启动端口

# 找到webapp目录下的yml文件
vim apache-skywalking-apm-bin/webapp/application.yml
serverPort: ${SW_SERVER_PORT:-8686}  # 修改这行,默认是8080

1.4 修改存储:我这里使用的是mysql

# 找到config目录下对应的yml文件
vim apache-skywalking-apm-bin/config/application.yml
storage:
  selector: ${SW_STORAGE:mysql} # 默认是h2,将数据进行持久化。重启数据不丢失。 关于存储类选型,设置方式都差不多
mysql:
    properties:
      jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/skywalking_data?rewriteBatchedStatements=true"}
      dataSource.user: ${SW_DATA_SOURCE_USER:root}
      dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root@1234} # 配置数据库

温馨提示:由于缺少mysql驱动,自行下载将驱动jar放置此目录下:/apache-skywalking-apm-bin/oap-libs
再去mysql中新增库:skywalking_data # 不然启动会报错!

maven下载jar链接请点击此处👈

1.4 执行文件:startup.sh

./startup.sh  
# 出现下面提示说明执行成功:
SkyWalking OAP started successfully!                                                                                                                                       
SkyWalking Web Application started successfully! 

1.5 访问展示

浏览器输入:ip:8686

上面是接入了两个服务!

# 接入方法:  java-ops
-javaagent:/skywalking/skywalking-agent/skywalking-agent.jar # jar包位置
-DSW_AGENT_NAME=dev::demo2 # 前面的代表分组,后面的是项目名称
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 # 数据接入点

# 每个项目需要拷贝一份skywalking-agent.jar

温馨提示:如果您是jenkins-k8s集成,请查看此篇文章:jenkins自动化部署👈

2.SpringBoot集成

温馨提示:此处的接入重点是针对jenkins-k8s的方式进行部署

2.1 本地项目部署

2.2 jenkins项目部署

2.2.1 将skywalking-agent.jar打包成镜像

vim Dockerfile

# (方式一)注意Dockerfile文件放置skywalking-agent根目录
FROM busybox:latest
LABEL maintainer="tianyu"
COPY ./ /usr/skywalking/agent/

# (方式二[推荐])如果你不想将Dockerfile放置容器中,那么你的Dockerfile需要放置skywalking-agent父级目录下
FROM busybox:latest
LABEL maintainer="tianyu"
COPY skywalking-agent/ /usr/skywalking/agent/

# 开始制作镜像,版本最好是和你的jar一致
docker build -t skywalking-agent:8.14.0 .

# (此处是进入了容器内部)因为在容器中接入agent和Dockerfile没有关系,所以不需要将它也复制到容器内部,如下:
root@demo3-75c8d69dfb-ff85z:/usr/skywalking/agent# ls
Dockerfile(这个复制到容器内部中了)  LICENSE  NOTICE  activations  bootstrap-plugins  config  licenses  logs  optional-plugins  optional-reporter-plugins  plugins  skywalking-agent.jar

2.2.2 开始编写Deployment.yaml文件

温馨提示:如果您使用的是jenkins-k8s的方式,则可以忽略次此步骤!
请查看此篇文章:jenkins自动化部署👈

# 编写yml文件
cat > demo-deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: test-apps
  name: demo3
  labels:
    app.kubernetes.io/name: demo3
spec:
  replicas: 1
  selector:
    matchLabels:
       name: demo3
  template:
    metadata:
      labels:
        name: demo3
    spec:
      # 构建初始化镜像 (通过初始化镜像的方式集成SkyWalking Agent)
      initContainers:
        - name: skywalking-agent
          imagePullPolicy: IfNotPresent
          image: skywalking-agent:8.14.0 # 2.2.1 构建的镜像
          command: [ "sh" ]
          args:
            [
                "-c",
                "cp -R /usr/skywalking/agent/* /skywalking/agent", # 将文件copy到容器内部,下列-javaagent需要使用
            ]
          volumeMounts:
            - mountPath: /skywalking/agent
              name: sw-agent
      containers:
        - name: demo3
          image: demo3:v43 # 通过docker build 进行构建镜像
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
              name: "demo3"
          resources: 
            requests: 
              cpu: "100m" #CPU限制
              memory: "1024Mi" #内存限制
          env: 
            - name: SPRING_PROFILES_ACTIVE
              value: "test"
            - name: SERVER_PORT
              value: "80"
            - name: SW_AGENT_NAME
              value: "dev::demo3"
            - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
              value: 124.222.177.150:11800 # ip:11800采集接口
            - name: JAVA_TOOL_OPTIONS
              value: "-javaagent:/usr/skywalking/agent/skywalking-agent.jar" # 容器内部的jar位置
          volumeMounts:
            - mountPath: /usr/skywalking/agent
              name: sw-agent
      volumes:
        - name: sw-agent
          emptyDir: { }
---
apiVersion: v1
kind: Service
metadata:
  namespace: test-apps
  name: demo3
spec:
  selector:
    name: demo3
  ports:
    - name: demo3
      protocol: TCP
      port: 80
      targetPort: 80
EOF

# 开始部署yml文件
kubectl apply -f demo-deployment.yaml

2.2.3 验证结果


2.3 集成日志采集

2.3.1 pom文件中添加依赖

<!--start skywalking8.5集成-->
<!--skywalking8.5日志集成-->
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-logback-1.x</artifactId>
    <version>${skywalking.version}</version>
</dependency>

<!-- 该引用用于代码获取tranceId -->
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-trace</artifactId>
    <version>${skywalking.version}</version>
</dependency>
<!--end skywalking8.5集成-->

<!--xml.value解析表达式-->
<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    <version>3.0.6</version>
</dependency>

2.3.2 生成两个xml日志文件

温馨提示:我分了两个文件进行配置,此处可以使用一个配置文件!

#文件1:logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>

<configuration>
    <include resource="logback-skywalking.xml"/>  # 引入sky日志(也可以写在一个文件中)
    <property name="LOG_PATH" value="logs"/>
    <property name="MAX_FILE_SIZE" value="10MB"/>
    <property name="MAX_HISTORY" value="30"/>

    <springProperty scope="context" name="applicationName" source="spring.application.name" defaultValue="demo" />
    <springProperty scope="context" name="loglevel" source="logging.level.root" defaultValue="info" />
    <springProperty scope="context" name="skyLogEnable" source="skywalking.log.enable" defaultValue="false"/> # 新增sky日志的开关,yml中配置
    <!-- 控制台日志样式 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%d{[${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}]}-[${LOG_LEVEL_PATTERN:-%5p}]-[%-30.30logger{29}] : %m%n}"/>
    <!-- 文件日志样式 -->
    <property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{[${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}]}-[${LOG_LEVEL_PATTERN:-%5p}]-[%-30.30logger{29}] : %m%n}"/>

   <!-- 控制台 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- 日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <!-- <file>${LOG_PATH}/ztproject.log</file> -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${applicationName}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
            <maxHistory>${MAX_HISTORY}</maxHistory>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
    </appender>

    <!-- 错误日志文件 我们在k8s环境下 没必要做错误日志文件 -->
    <!-- <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <file>${LOG_PATH}/ztproject-error-error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${applicationName}-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
            <maxHistory>${MAX_HISTORY}</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender> -->

    <!-- 异步写日志 -->
    <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <appender-ref ref ="FILE"/>
    </appender>
    <!-- <appender name="ASYNC_ERROR_FILE" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <appender-ref ref ="ERROR_FILE"/>
    </appender> -->

    <root level="INFO">
        <appender-ref ref="ASYNC_FILE"/>
        <if condition='${skyLogEnable}'> # js表达式
            <then>
                <appender-ref ref="SKY_WALKING_CONSOLE"/>
                <appender-ref ref="GRPC_LOG"/>
            </then>
            <else>
                <appender-ref ref="CONSOLE"/>
            </else>
        </if>
    </root>
</configuration>

#文件2:logback-skywalking.xml
<?xml version="1.0" encoding="UTF-8"?>
<included>
    <!--日志渲染-->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />

    <!-- skywalking日志样式 -->
    <property name="SKY_WALKING_PATTERN" value="[%tid] ${SKY_WALKING_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39} %line){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <!-- skywalking控制台 -->
    <appender name="SKY_WALKING_CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <pattern>${SKY_WALKING_PATTERN}</pattern>
            </layout>
        </encoder>
    </appender>

    <!--推送日志至管理后台-->
    <appender name="GRPC_LOG" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
                <pattern>%date [%file:%line]-%msg%n</pattern>
            </layout>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>
    <!-- skywalking控制台 -->
</included>

2.3.3 配置yml开关,启动日志,测试结果

#application.yml开启日志追踪
skywalking:
  log:
    enable: true # false是关闭,不配默认关闭

2.3.4 验证是否配置成功

温馨提示:项目自行定义接口,然后通过日志@Slf4j来记录日志!
温馨提示:如果需要k8s或者docker部署skywalking方式的猿友们,在下方评论或者联系我,可以对其进行编写部署方案提供猿友们参考!

结束语

本章节完成了,各位正在努力的程序员们,如果你们觉得本文章对您有用的话,或者是你学到了一些东西,期待您用漂亮,帅气的小手点个赞+关注,支持一下猿仁!
持续更新中…

有关Linux搭建Skywalking9.3的更多相关文章

  1. 【Linux操作系统】——网络配置与SSH远程 - 2

    Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好

  2. Linux磁盘分区中物理卷(PV)、卷组(VG)、逻辑卷(LV)创建和(LVM)管理 - 2

    文章目录一基础定义二创建逻辑卷2-1准备物理设备2-2创建物理卷2-3创建卷组2-4创建逻辑卷2-5创建文件系统并挂载文件三扩展卷组和缩减卷组3-1准备物理设备3-2创建物理卷3-3扩展卷组3-4查看卷组的详细信息以验证3-5缩减卷组四扩展逻辑卷4-1检查卷组是否有可用的空间4-2扩展逻辑卷4-3扩展文件系统五删除逻辑卷5-1备份数据5-2卸载文件系统5-3删除逻辑卷5-4删除卷组5-5删除物理卷六LVM逻辑卷缩容6-1缩容注意事项6-2标准缩容步骤一基础定义LVM,LogicalVolumeManger,逻辑卷管理,Linux磁盘分区管理的一种机制,建立在硬盘和分区上的一个逻辑层,提高磁盘分

  3. ruby - 如何在 Ruby 中获取 linux 系统信息 - 2

    如何在Ruby中获取linux系统(这必须适用于Fedora、Ubuntu等)的软件/硬件信息? 最佳答案 Chef背后的优秀人才,拥有一颗名为Ohai的优秀gemhttps://github.com/opscode/ohai以散列形式返回系统信息,例如操作系统、内核、规范、fqdn、磁盘、空间、内存、用户、接口(interface)、sshkey等。它非常完整,非常好。它还会安装命令行二进制文件(也称为ohai)。 关于ruby-如何在Ruby中获取linux系统信息,我们在Stack

  4. ruby - rbenv:在 Linux Mint 上找不到 gem 命令 - 2

    我在LinuxMint17.2上。我最近使用apt-getpurgeruby​​删除了ruby​​。然后我安装了rbenv然后rbenvinstall2.3.0所以现在,~/.rbenv/versions/2.3.0/bin/ruby存在。但是现在,我无法执行geminstallrubocop。我明白了:$geminstallrubocoprbenv:gem:commandnotfoundThe`gem'commandexistsintheseRubyversions:2.3.0但是我可以~/.rbenv/versions/2.3.0/bin/geminstallrubocop。但是,

  5. ruby - 在 Linux 上编译 Ruby 1.9.2 所需的先决条件? - 2

    我是Ruby和RoR的新手。我有一个带有Ubuntu镜像的干净Linode实例,我想从源代码编译Ruby而不是使用apt-get。我已经在谷歌上搜索了执行此操作的说明,但经过一些尝试后,当我尝试运行一些教程示例时,我不断收到有关缺少zlib和其他一些包的错误。任何人都可以给我详细的说明(或链接),教我如何在从源代码编译Ruby之前安装必要的必备包吗?我的目的是编译Ruby的最新稳定版本,然后安装Rubygems和Rails。提前感谢您的帮助!!! 最佳答案 Thisblogpost涵盖从源代码编译ruby​​所需的包和安装过程;它引

  6. centos 安装 最新版 skywalking 8.9.1 - 2

    一、相关网址1、官网(可以下载,查看文章)https://skywalking.apache.org/downloads/2、github地址:(可提问题寻求帮助)https://github.com/apache/skywalking二、 实验环境操作系统 centos7.9先安装好 elasticsearch7.16.2操作系统安装好jdk8-17,实验机器jdk11java下载地址:https://www.oracle.com/java/technologies/downloads/#java8IP地址为192.168.24.160三、安装skywalking 1、下载skywalkin

  7. Linux网络编程必备的POSIX API的细节 - 2

    目录POSIXAPI大集合五元组三次握手的过程,内核协议栈分析listen函数DDOS攻击,洪水攻击DDOS攻击的应对措施数据发送 怎么保证顺序?如何保证包地顺序到达(序号+确认应答机制+重传)TCP断开连接的过程问题1.大量的CLOSE_WAIT+FIN_WAIT2是为啥?time_wait状态存在的原因?POSIXAPI大集合五元组(sip,sport,dip,dport,protocol)三次握手的过程,内核协议栈分析内核协议栈中是有内核数据结构的.  我们send/write数据,都是先发送到内核协议栈中,然后由内核协议栈封装发送到物理介质中传输到对端的对端的接收过程也是经有内核协议栈

  8. Linux export 命令及如何删除export设置的环境变量 - 2

    背景:Linuxexport命令用于设置或显示环境变量。在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅限于该次登陆操作。语法:export[-fnp][变量名称]=[变量设置值]参数说明:-f 代表[变量名称]中为函数名称。-n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。-p 列出所有的shell赋予程序的环境变量。实例:列出当前所有的环境变量#export-p//列出当前的环境变量值定义环境变量赋值#exportMYENV=7//定义环境变量并赋值添加环境变量:默认保存在

  9. Linux操作系统CentOS7安装Nginx[详细版] - 2

    Nginx安装1.官网下载Nginx2.使用XShell和Xftp将压缩包上传到Linux虚拟机中3.解压文件nginx-1.20.2.tar.gz4.配置nginx5.启动nginx6.拓展(修改端口和常用命令)(一)修改nginx端口(二)常用命令1.官网下载Nginxhttp://nginx.org/en/download.html这里我下载的是1.20.2版本,大家按需下载对应稳定版即可2.使用XShell和Xftp将压缩包上传到Linux虚拟机中没有XShell可以参考《Linux操作系统CentOS7连接XShell》3.解压文件nginx-1.20.2.tar.gz1)检查是否存

  10. 【Linux】初识Linux --指令Ⅰ - 2

    Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法,Linux…感兴趣就关注我吧!你定不会失望。目录1.ls显示当前目录下的文件内内容2.pwd-显示用户当前所在的目录3.cd-改变工作目录。将当前工作目录改变到指定的目录下1.cd-回到上一次待的工作空间2.cd..返回上一层目录1.相对路径:cd../aurora2.绝对路径:cd/home/aurora/lesson1/aurora3.cd~进入用户家目录4.cd/进入root目录4.mkdir-新建目录5.rmdir/rm-删除1.rmdir删除空文件夹2.rm删除1.rm-f2.rm-i3.rm-r1.ls显示当前目

随机推荐