什么是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>
<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> <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"> <FileNamePattern>${APPLOG_PATH}/${APP_NAME}-error.%d{yyyy-MM-dd}.log</FileNamePattern> <maxHistory>15</maxHistory> </rollingPolicy> <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"> <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>
|