今天我们通过代码的形式来了解下,如何在项目中使用Skywalking。

前几篇文章可以参考:

《学习Skywalking · 搭建篇》

《Skywalking执行效果 · 多图篇》

《Skywalking的ES索引 · 收藏篇》

今天说说代码篇。

先说下比较常见的开源 APM 如下:

  • CAT:由国内美团点评开源的,基于 Java 语言开发,目前提供 Java、C/C++、Node.js、Python、Go 等语言的客户端,监控数据会全量统计。国内很多公司在用,例如美团点评、携程、拼多多等。CAT 需要开发人员手动在应用程序中埋点,对代码侵入性比较强。

  • Zipkin:由 Twitter 公司开发并开源,Java 语言实现。侵入性相对于 CAT 要低一点,需要对web.xml 等相关配置文件进行修改,但依然对系统有一定的侵入性。Zipkin 可以轻松与 Spring Cloud 进行集成,也是 Spring Cloud 推荐的 APM 系统。

  • Pinpoint:韩国团队开源的 APM 产品,运用了字节码增强技术,只需要在启动时添加启动参数即可实现 APM 功能,对代码无侵入。目前支持 Java 和 PHP 语言,底层采用 HBase 来存储数据,探针收集的数据粒度非常细,但性能损耗较大,因其出现的时间较长,完成度也很高,文档也较为丰富,应用的公司较多。

  • SkyWalking:国人开源的产品,2019 年 4 月 17 日 SkyWalking 从 Apache 基金会的孵化器毕业成为顶级项目。目前 SkyWalking 支持 Java、.Net、Node.js 等探针,数据存储支持MySQL、ElasticSearch等。SkyWalking 与 Pinpoint 相同,Java 探针采用字节码增强技术实现,对业务代码无侵入。探针采集数据粒度相较于 Pinpoint 来说略粗,但性能表现优秀。目前,SkyWalking 增长势头强劲,社区活跃,中文文档齐全,没有语言障碍,支持多语言探针,这些都是 SkyWalking 的优势所在,还有就是 SkyWalking 支持很多框架,包括很多国产框架,例如,Dubbo、gRPC、SOFARPC 等等,也有很多开发者正在不断向社区提供更多插件以支持更多组件无缝接入 SkyWalking。还有很多不开源的 APM 系统,例如,淘宝鹰眼、Google Dapper 等等,不再展开介绍了。

SkyWalking 的核心功能

  • 服务、服务实例、端点指标分析。

  • 服务拓扑图分析

  • 服务、服务实例和端点(Endpoint)SLA 分析

  • 慢查询检测

  • 告警

  • 多语言自动探针,支持 Java、.NET Code 等多种语言。

  • 为多种开源项目提供了插件,为 Tomcat、 HttpClient、Spring、RabbitMQ、MySQL 等常见基础设施和组件提供了自动探针。

SkyWalking 三个核心部分

  • Agent(探针):Agent 运行在各个服务实例中,负责采集服务实例的 Trace 、Metrics 等数据,然后通过 gRPC 方式上报给 SkyWalking 后端。

  • OAP(后端服务):SkyWalking 的后端服务,其主要责任有两个。
    一个是负责接收 Agent 上报上来的 Trace、Metrics 等数据,交给 Analysis Core (涉及 SkyWalking OAP 中的多个模块)进行流式分析,最终将分析得到的结果写入持久化存储中。SkyWalking 可以使用 ElasticSearch、H2、MySQL 等作为其持久化存储,一般线上使用 ElasticSearch 集群作为其后端存储。
    另一个是负责响应 SkyWalking UI 界面发送来的查询请求,将前面持久化的数据查询出来,组成正确的响应结果返回给 UI 界面进行展示。

  • UI(展示界面 ):SkyWalking 前后端进行分离,该 UI 界面负责将用户的查询操作封装为 GraphQL 请求提交给 OAP 后端触发后续的查询操作,待拿到查询结果之后会在前端负责展示。

其他的不多说,直接上代码!

基础依赖安装

1、安装ES

docker run --name elasticsearch \
-p 9200:9200 -p 9300:9300  \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-d elasticsearch:6.8.19

2、安装Kibana

docker run -d --name kibana \
-p 5601:5601 \
-v D:/Code/k8s/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:6.8.0

项目迁移案例展示:

1、设置SKYWALKING-OAP 收集服务

docker run -p 11800:11800 -d \
-e SW_NAMESPACE=bg\
-e SW_STORAGE=elasticsearch \
-e SW_STORAGE_ES_CLUSTER_NODES=xxxxxx \
-e SW_ES_USER=xxx \
-e SW_ES_PASSWORD=xxx   \
apache/skywalking-oap-server:8.9.0

2、设置SKYWALKING-OAP API服务

docker run -p 12800:12800 -d \
-e SW_NAMESPACE=bg \
-e SW_STORAGE=elasticsearch \
-e SW_STORAGE_ES_CLUSTER_NODES=xxxxx \
-e SW_ES_USER=xxx \
-e SW_ES_PASSWORD=xxx   \
-e SW_SEARCHABLE_TAG_KEYS=http.method,status_code,db.type,db.instance,mq.queue,mq.topic,mq.broker,input,output,userId,account,number,systemid   \
apache/skywalking-oap-server:8.9.0

3、设置SKYWALKING-UI

docker run  -p 8080:8080 -d \
-e SW_OAP_ADDRESS=http://xxxx:12800 \
apache/skywalking-ui:8.9.0

以上环境变量均可配置到k8s中。

4、配置CLIENT(ASP.NET Core)

1、安装nuget包,提供探针
<PackageReference Include="SkyAPM.Agent.AspNetCore" Version="1.3.0" />
2、设置skyapm.json(可配置configmap)

说明

ps:skyapm.json需要设置属性——始终复制

{"SkyWalking": {"ServiceName": "bg::op::gateway","Namespace": "","HeaderVersions": ["sw8"],"Sampling": {"SamplePer3Secs": -1,"Percentage": -1.0,"IgnorePaths": ["**/nacos/**"]},"Logging": {"Level": "Debug","FilePath": "logs/skyapm-{Date}.log"},"Transport": {"Interval": 3000,"ProtocolVersion": "v8","QueueSize": 30000,"BatchSize": 3000,"gRPC": {"Servers": "bg-oap:11800","Timeout": 10000,"ConnectTimeout": 10000,"ReportTimeout": 600000}}}
}
3、配置K8s环境变量
ASPNETCORE_HOSTINGSTARTUPASSEMBLIES = SkyAPM.Agent.AspNetCore
4、问题排查

在容器内,会生成skyapm-2022xxxx.log文件,会有详细的连接信息和推送信息。
同时要检查下是否包含skyapm.json文件。

5、配置CLIENT(Java)

1、修改Dockerfile
FROM apache/skywalking-java-agent:8.8.0-java11 AS bg-base
WORKDIR /app// ...COPY --from=bg-base /skywalking/agent/optional-plugins/apm-trace-ignore-plugin-8.8.0.jar /skywalking/agent/plugins/apm-trace-ignore-plugin-8.8.0.jarENTRYPOINT ["sh","-c","exec java -Xmx1024m -Xms1024m  -Dproject.name=app-bg -Dskywalking.trace.ignore_path='**/nacos/**,**/JDBI/**' -Duser.language=zh -Duser.country=CN -jar /app/app.jar"]
2、配置k8s环境变量
SW_AGENT_COLLECTOR_BACKEND_SERVICES=bg-oap:11800
SW_AGENT_NAME="bg::op::svc"
3、配置Tag标记(可选项)

1、添加依赖包

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

2、设计过滤器

@Slf4j
@Component
public class ApmHttpInfoFilter extends HttpFilter {private static final ImmutableSet<String> IGNORED_HEADERS;static {Set<String> ignoredHeaders = ImmutableSet.of("Content-Type","User-Agent","Accept","Cache-Control","Postman-Token","Host","Accept-Encoding","Connection","Content-Length").stream().map(String::toUpperCase).collect(Collectors.toSet());IGNORED_HEADERS = ImmutableSet.copyOf(ignoredHeaders);}@Overridepublic void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request);ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response);try {filterChain.doFilter(requestWrapper, responseWrapper);} finally {try {//构造请求信息: 比如 curl -X GET http://localhost:18080/getPerson?id=1 -H 'token: me-token' -d '{ "name": "hello" }'//构造请求的方法&URL&参数StringBuilder sb = new StringBuilder("curl").append(" -X ").append(request.getMethod()).append(" ").append(request.getRequestURL().toString());if (StringUtils.hasLength(request.getQueryString())) {sb.append("?").append(request.getQueryString());}//构造headerEnumeration<String> headerNames = request.getHeaderNames();while (headerNames.hasMoreElements()) {String headerName = headerNames.nextElement();if (!IGNORED_HEADERS.contains(headerName.toUpperCase())) {sb.append(" -H '").append(headerName).append(": ").append(request.getHeader(headerName)).append("'");}}//获取bodyString body = new String(requestWrapper.getContentAsByteArray(), StandardCharsets.UTF_8);if (StringUtils.hasLength(body)) {sb.append(" -d '").append(body).append("'");}//输出到inputActiveSpan.tag("input", sb.toString());//输出到userIdActiveSpan.tag("userid", BaseMethodUtil.getUserIdByHeader(request)+"");//获取返回值bodyString responseBody = new String(responseWrapper.getContentAsByteArray(), StandardCharsets.UTF_8);//输出到outputActiveSpan.tag("output", responseBody);} catch (Exception e) {log.warn("fail to build http log", e);} finally {//这一行必须添加,否则就一直不返回responseWrapper.copyBodyToResponse();}}}
}

3、容器启动配置tag

-e SW_NAMESPACE=bg-e SW_SEARCHABLE_TAG_KEYS=http.method,status_code,db.type,db.instance,mq.queue,mq.topic,mq.broker,input,output,userid
4、挂载告警配置(可选项)

需要企业微信机器人

-v D:\Code\k8s\kibana\alarm-settings.yml:/skywalking/config/alarm-settings.yml

6、配置CLIENT(Vue.js)

1、安装npm
npm install skywalking-client-js --save
2、注册服务
import ClientMonitor from 'skywalking-client-js';ClientMonitor.register({collector: process.env.VUE_APP_PERMISSION_URL + '/ui',service: process.env.VUE_APP_SW_NAME || 'op::ui',pagePath: location.href,serviceVersion: 'v1.0.0',vue: Vue,useFmp: true,enableSPA: false,traceTimeInterval: 10000,apiErrors: true,})

3、拦截器

// 异常拦截器
Vue.config.errorHandler = (error) => {console.error(error)error.message += window.location.hrefconst _roles = store.state.user.rolesif (_roles) {error.message += (_roles.name || '') + ' ' + _roles.number}ClientMonitor.reportFrameErrors({collector: process.env.VUE_APP_PERMISSION_URL + '/ui',service: process.env.VUE_APP_SW_NAME || 'op::ui',pagePath: window.location.href,vue: Vue,serviceVersion: 'v1.0.0'}, error)
}// 路由拦截器
import ClientMonitor from 'skywalking-client-js'ClientMonitor.customOptions.pagePath = location.origin + location.pathname + '#' + to.fullPath

4、配置nginx代理收集器

server {listen       80;listen  [::]:80;server_name  localhost;#charset koi8-r;#access_log  /var/log/nginx/host.access.log  main;location / {root   /usr/share/nginx/html-test;index  index.html index.htm;}location /ui/browser/ {rewrite ^.+ui/?(.*)$ /$1 break;include uwsgi_params;proxy_pass xxxxxx;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;}location /ui/v3/ {rewrite ^.+ui/?(.*)$ /$1 break;include uwsgi_params;proxy_pass xxxxxxx;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;}location /ui {try_files $uri $uri/ /index.html;alias  /usr/share/nginx/html-test/ui;index  index.html index.htm;}#error_page  404              /404.html;# redirect server error pages to the static page /50x.html #error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}}

其他问题记录:

1、 删除索引后,记得删除对应的ES模板;
2、 VUE项目要根据实际情况,做sw服务的nginx的反向代理配置;
3、 skywalking如果遇到问题,可以优先升级最新版本;

最后打个广告,欢迎观看与分享。

SkyWalking集成与案例相关推荐

  1. 数据湖架构Hudi(五)Hudi集成Flink案例详解

    五.Hudi集成Flink案例详解 5.1 hudi集成flink flink的下载地址: https://archive.apache.org/dist/flink/ Hudi Supported ...

  2. DataWhale集成学习Task15 集成学习案例二 (蒸汽量预测)

    集成学习案例二 (蒸汽量预测) 文章目录 集成学习案例二 (蒸汽量预测) 1 整体思路 1.1 整体步骤 1.2 评价指标 2 实战演练 导入package 加载数据 探索数据分布 特征工程 模型构建 ...

  3. 【集成学习(下)】Task15 集成学习-案例 蒸汽量预测

    文章目录 集成学习案例二 (蒸汽量预测) 背景介绍 数据信息 评价指标 导入package 加载数据 探索数据分布 小小个人总结 特征工程 模型构建以及集成学习 进行模型的预测以及结果的保存 参考 集 ...

  4. flink集成springboot案例_Flink从流处理到流批一体的19个最佳实践

    近年来,随着实时化需求的场景日益增多,企业已不满足于简单使用流计算或批计算进行数据处理,采用一套引擎即可实现低延迟.高吞吐.高稳定的强大性能逐渐成为更多企业的追求.Apache Flink 作为领先的 ...

  5. Skywalking-11:Skywalking查询协议——案例分析

    以查询 Metrics 信息案例来分析 Skywalking 查询协议 基本概述 Skywalking 查询协议默认基于 GraphQL ,如果有需要也可以自定义扩展,提供一个实现了 org.apac ...

  6. 集成springboot案例_SpringBoot开发者都在用的五款优质扩展,每个都很能打!

    1.spring-boot-pay Spring Boot 的支付服务:支付宝,微信,银联详细代码案例. 项目地址:https://gitee.com/52itstyle/spring-boot-pa ...

  7. SAP Field Service Management 和微信集成的案例分享和实现介绍

    SAP FSM(Field Service Management), 属于SAP C/4HANA五朵云里的Service Cloud. 本文介绍笔者在工作中经历过的一个项目,包含 SAP Field ...

  8. 集成学习案例一:幸福感预测

    背景介绍 本文介绍数据挖掘竞赛--幸福感预测的baseline.使用包括个体变量(性别.年龄.地域.职业.健康.婚姻与政治面貌等).家庭变量(父母.配偶.子女.家庭资本等等).社会态度(公平.信用.公 ...

  9. 码垛机器人集成配置案例说明

    码垛机器人是一种专业化.集成化的工业设备,机器人将包装袋按照预定的编组方式,逐个逐层码放在托盘或箱体内.通常作为包装线的后续设备,提高生产能力和转运能力. 特点: 结构简单,专业化程度高 故障率低,性 ...

最新文章

  1. 华为徐文伟:后香农时代,面向数学的十大挑战问题
  2. DevOps:软件架构师行动指南(文摘)
  3. mysql性能优化教程_mysql性能优化教程
  4. 50本.NTE、C#相关技术书籍免费下载
  5. DFS应用——找出无向图的割点
  6. 区块链 matlab,matlab可以实现区块链吗?
  7. 传奇霸业维护服务器,37传奇霸业6月21日部分区服维护计划
  8. 啊哈 算法 啊哈磊 扫描版pdf
  9. 物业收费管理系统 java_基 于java的小区物业收费管理系统.doc
  10. python list倒序_Python 面试:这9个问题你一定要掌握!
  11. 线性回归分析步骤总结
  12. 163邮箱邮件被退回,什么企业邮箱可以接收国外邮件?
  13. python批量裁剪图像
  14. 金融业务-美港股和A股的区别
  15. 计算机慢的解决方法,电脑很卡反应很慢该如何处理【解决方法】
  16. Html5 Egret游戏开发 成语大挑战(七)游戏逻辑和数据处理
  17. 尝试搭建OPhone-sdk 手机模拟器的搭建
  18. Tair分布式锁 实践经验(160805更新)
  19. java抠图人物背景图片_对外景人物照片精细抠图换背景的PS教程
  20. 成纤维细胞生长因子家族介绍:(PEG-FGF/rb-bFGF/aFGF/rhaFGF/baFGF/rhKGF-2)

热门文章

  1. Tensorflow之安装
  2. windows 建立wifi热点
  3. asp.net 检测访问者是iphone,android,web(摘录)
  4. 话里话外:企业内控的灵魂——企业文化
  5. linux下telnet失败怎么处理,CentOS下telnet退出失败的解决办法
  6. Maven学习笔记(2) --mvn archetype:create 说明
  7. 命令行打印文件树列表: tree 1
  8. JDBC学习笔记之JDBC简介
  9. Supplemental Logging
  10. Unity中Instantiate一个prefab时需要注意的问题