什么是SkyWalking

SkyWalking官网

SkyWalking是一个优秀的国产开源框架,2015年由个人吴晟(华为开发者)开源,2017年加入Apache孵化器。短短两年就被收入Apache麾下,实力可见一斑。SkyWalking支持dubbo,SpringCloud,SpringBoot集成,代码无侵入,通信方式采用GRPC,性能较好,实现方式是java探针,支持告警,支持JVM监控,支持全局调用统计等,功能比较完善。

SkyWalking优势

  • 采用字节码增强的技术实现代码无侵入

  • 功能比较丰富,报表统计,UI界面更加人性化

SkyWalking架构

SkyWalking和zipkin一样,分为服务端和客户端,服务端负责手机日志数据并且展示

SkyWalking在逻辑上风味四个部分:Probes(探针),Platform backend(平台后端),Storage (存储)and UI(用户界面)

  • Probes:收集数据并根据SkyWalking要求重新格式化(不同探头支持不同的来源)
  • Platform backend:支持数据聚合,分析,涵盖跟踪、指标和日志
  • Storage:存储SkyWalking数据,可以选择现有的实现,如ElasticSearch、H2、MySQL等
  • UI:负责提供web控制台,查看链路,查看各种指标,性能等等

部署skywalking

安装docker

# 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 添加源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 更新
sudo yum makecache fast

# 安装docker-ce
sudo yum -y install docker-ce

# 创建配置文件目录
sudo mkdir -p /etc/docker

# 创建配置文件
touch /etc/docker/daemon.json

# 新增配置文件内容 /mitr/middleware/docker目录已创建
# 在 docker 19.xx 版本以后使用data-root来代替graph
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"],
"data-root": "/mitr/middleware/docker" # docker主目录 存储images等
}
EOF

# 加载启动并设置开机自启
systemctl daemon-reload && systemctl enable docker && systemctl start docker

部署Elasticsearch

# 1.拉取镜像
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.7.1

# 2.调整系统内核参数
# elastic官方建议 生产环境下使用 elasticsearch镜像 需设置Linux参数 vm.max_map_count
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p

# 3.新建 elasticsearch 目录
mkdir -p /hsadata/elasticsearch/{config,data,plugins}

# 4.修改 elasticsearch 配置
vim /hsadata/elasticsearch/config/elasticsearch.yml

# 配置内容如下
cluster.name: "docker-cluster"
network.host: 0.0.0.0
# 开启 elasticsearch 安全认证 xpack认证
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

# 5.添加系统用户 elasticsearch
adduser elasticsearch

# 6.授权目录及所属
chmod g+rwx /hsadata/elasticsearch
chown -R elasticsearch:root /hsadata/elasticsearch/

# 7.创建并启动容器(4核8G)
# ES_JAVA_OPTS="-Xms2688m -Xmx2688m" JVM内核参数优化
# --ulimit nofile=65535:65535 设置 系统限制用户最大进程数 限制用户打开最大文件数
# --cpuset-cpus="1" -m 4G 限制容器可用的CPU和内存资源
# Redhat8.6 涉及到权限问题 导致启动失败
# 解决方案 不挂载data目录启动镜像 然后将容器内的data目录拷贝到宿主机即可
# docker cp es:/usr/share/elasticsearch/data /hsadata/elasticsearch/data
docker run -d -e ES_JAVA_OPTS="-Xms2688m -Xmx2688m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 --restart=always --ulimit nofile=65535:65535 --cpuset-cpus="1" -m 4G -v /hsadata/elasticsearch/data:/usr/share/elasticsearch/data -v /hsadata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -v /hsadata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml --name es 830a894845e3

# 8.启动xpack认证 并设置 elasticsearch 密码
# 进入 docker 容器
docker exec -it es bash
# 在容器内执行 并设置密码
elasticsearch-setup-passwords interactive
#.... 设置 es_xpack 认证的6个账户密码 ....

# 9.验证部署是否成功
curl -u 用户名:密码 -XGET 'http://127.0.0.1:9200'

# 结果如下为部署成功
{
"name" : "ba34d751f560",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "AIm_UjiAT2-8X4gDjbPYxA",
"version" : {
"number" : "7.7.1",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ad56dce891c901a492bb1ee393f12dfff473a423",
"build_date" : "2020-05-28T16:30:01.040088Z",
"build_snapshot" : false,
"lucene_version" : "8.5.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}

部署SkyWalking OAP

# 拉取镜像
docker pull apache/skywalking-oap-server:8.3.0-es7

# 启动SkyWalking OAP
# 注:–link后面的第一个参数和elasticsearch容器名一致;
# -e SW_STORAGE_ES_CLUSTER_NODES:es7也可改为你es服务器部署的Ip地址,即ip:9200
# SW_ES_USER:es用户名
# SW_ES_PASSWORD:es密码
docker run --name oap --restart always -d --restart=always -p 12800:12800 -p 11800:11800 --link es:elasticsearch -e TZ=Asia/Shanghai -e SW_STORAGE=elasticsearch7 -e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 -e SW_ES_USER=elastic -e SW_ES_PASSWORD=3cu8rt00@A apache/skywalking-oap-server:8.3.0-es7

部署SkyWalking UI

# 拉取镜像
docker pull apache/skywalking-ui:8.3.0

# 启动SkyWalking UI
# 注:–link后面的第一个参数和skywalking OAP容器名一致
docker run -d --name skywalking-ui --restart=always -p 8098:8080 --link oap:oap -e TZ=Asia/Shanghai -e SW_OAP_ADDRESS=oap:12800 apache/skywalking-ui:8.3.0

应用程序配合SkyWalking Agent

# 下载SkyWalking Agent
wget https://archive.apache.org/dist/skywalking/8.3.0/apache-skywalking-apm-es7-8.3.0.tar.gz

# 解压
tar -zxvf apache-skywalking-apm-es7-8.3.0.tar.gz

# 启动java服务 agent路径 我放到了 /mitr/middleware/skywalking-apm/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar 所以配置如下
# backend_service是skywalking-oap服务地址
java -jar -javaagent:/mitr/middleware/skywalking-apm/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar -Dskywalking.agent.service_name=118erptest -Dskywalking.collector.backend_service=127.0.0.1:11800 app.jar

集成日志 logback

引入POM依赖

<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.3.0</version>
<scope>provided</scope>
</dependency>

<!--打印skywalking的TraceId到日志-->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.3.0</version>
</dependency>

修改logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds" debug="false">
<property name="APP_NAME" value="hsa-iep-opp"/>
<property name="APPLOG_PATH" value="/var/log/hsa-iep-opp-local"/>

<appender name="dailyRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${APPLOG_PATH}/${APP_NAME}.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${APPLOG_PATH}/${APP_NAME}.%d{yyyy-MM-dd}.log</FileNamePattern>
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 打印tid -->
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %highlight(%5level) %cyan(%-40logger{40}) %4line : %msg %n</pattern>
</layout>
</encoder>
</appender>

<appender name="dailyRollingFileErrorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${APPLOG_PATH}/${APP_NAME}-error.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<FileNamePattern>${APPLOG_PATH}/${APP_NAME}-error.%d{yyyy-MM-dd}.log</FileNamePattern>
<!-- keep 30 days' worth of history -->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 打印tid -->
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %highlight(%5level) %cyan(%-40logger{40}) %4line : %msg %n</pattern>
</layout>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

<appender name= "STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 打印tid -->
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %highlight(%5level) %cyan(%-40logger{40}) %4line : %msg %n</pattern>
</layout>
</encoder>
</appender>

<!-- 自定义日志 -->
<logger name="cn.hsa" level="DEBUG"/>
<logger name="org.springframework" level="WARN"/>

<root level="DEBUG">
<appender-ref ref="dailyRollingFileAppender"/>
<appender-ref ref="dailyRollingFileErrorAppender"/>
<appender-ref ref="STDOUT"/>
</root>
</configuration>