SkyWalking集成与案例


今天我们通过代码的形式来了解下,如何在项目中使用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如果遇到问题,可以优先升级最新版本;

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

79adbb185f54571e0d9dd15621260e17.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows Azure 安全最佳实践 - 第 6 部分:Azure 服务如何扩展应用程序安全性

多种 Windows Azure服务可以帮助您将应用程序安全性扩展到云。 有三种服务可提供多个提供程序之间的身份标识映射、内部部署数据中心间的连接和相互发送消息的应用程序功能&#xff08;无论应用程序位于何处&#xff09;。 使用Windows Azure Active Directory&#xff0c;您…

Windows Server 2012活动目录基础配置与应用(新手教程)之3---将客户机加入到指定域...

在WIN 2012服务器上安装AD后&#xff0c;WIN2012就从普通的服务器变成了域控制器。一个域也就产生了。但遗憾的是&#xff0c;目前这个域的规模还很小&#xff0c;只有DC这一台主机-------光杆司令&#xff01;&#xff01;下面尝试扩大域的规模&#xff0c;将客户机加入到域。…

论物理学界的神预言

全世界只有3.14 % 的人关注了爆炸吧知识一沙见世界 一花窥天堂手心握无限 须臾纳永恒杨振宁曾说读上面的四句诗可以感受到物理的美但物理的美不止于此物理还有一种庄严美一种神秘美一种初窥宇宙奥秘的畏惧美物理就是如此的迷人任何语言在它的面前都很贫瘠数学让人摆脱了愚昧而…

聊一聊如何用C#轻松完成一个SAGA分布式事务

背景 银行跨行转账业务是一个典型分布式事务场景&#xff0c;假设 A 需要跨行转账给 B&#xff0c;那么就涉及两个银行的数据&#xff0c;无法通过一个数据库的本地事务保证转账的 ACID &#xff0c;只能够通过分布式事务来解决。市面上使用比较多的分布式事务框架&#xff0c…

梯度消失和梯度爆炸_知识干货-动手学深度学习-05 梯度消失和梯度爆炸以及Kaggle房价预测...

梯度消失和梯度爆炸考虑到环境因素的其他问题Kaggle房价预测梯度消失和梯度爆炸深度模型有关数值稳定性的典型问题是消失&#xff08;vanishing&#xff09;和爆炸&#xff08;explosion&#xff09;。当神经网络的层数较多时&#xff0c;模型的数值稳定性容易变差。PyTorch的默…

Js中 关于top、clientTop、scrollTop、offsetTop的用法

2019独角兽企业重金招聘Python工程师标准>>> Js中 关于top、clientTop、scrollTop、offsetTop的用法 网页可见区域宽&#xff1a; document.body.clientWidth; 网页可见区域高&#xff1a; document.body.clientHeight; 网页可见区域宽&#xff1a; document.body.…

UVa 1639 (期望) Candy

题意&#xff1a; 两个盒子里各有n颗糖&#xff0c;每天有p的概率从第一个盒子里取一颗糖&#xff0c;1-p的概率从第二个盒子里去一颗糖。直到某一天打开某个盒子忽然发现没糖了&#xff0c;求另一个盒子里剩余糖果数的期望。 分析&#xff1a; 紫书上面已经分析的很清楚了&…

C#中的串口通信SerialPort

前言大家好&#xff0c;我是阿辉。今天这篇文章带大家学习下C#中的串口通讯。在日常的开发工作中&#xff0c;如果工作内容是CS方向的同学应该很容易接触到串口通讯方面的业务需求。那么也就很容易想到C#中SerialPort类&#xff0c;它就是专门来处理串口通讯相关的。了解什么是…

日本的酒店主题能有多丰富?

1 伤害性不大&#xff0c;侮辱性极强&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 好家伙&#xff0c;这字医生都看不懂&#xff01;&#xff08;via.你的野王&#xff0c;侵删&#xff09;▼3 当家里点了电子蜡烛&#xff08;素材来源网络&#xff0c;侵删&…

6款程序员不得不爱的bootstrap模板

Bootstrap是基于jQuery框架开发的&#xff0c;它在jQuery框架的基础上进行了更为个性化和人性化的完善&#xff0c;形成一套自己独有的网站风格&#xff0c;并兼容大 部分jQuery插件。Bootstrap中包含了丰富的Web组件&#xff0c;根据这些组件&#xff0c;可以快速的搭建一个漂…

Natasha 4.0 探索之路系列(四) 模板 API

相关文章Natasha 4.0 探索之路系列(一) 概况Natasha 4.0 探索之路系列(二) 「域」与插件Natasha 模板Natasha 在编译单元的基础上进行了封装整理, 并提供了多种模板帮助开发者构建功能.使用此篇的 API 前提是您对 C# 非常熟悉, 对系统的一些类型足够了解.据此 Natasha 将拒绝与…

青年博士离职高校被索赔10.5万违约金,后博士上诉至法院,判决来了!

全世界只有3.14 % 的人关注了爆炸吧知识本文转自募格学术我们都知道&#xff0c;现在入职高校往往都要签订一定的服务年限合同&#xff0c;如果合同期未满想要离职的话&#xff0c;需要给高校支付巨额违约金。但根据《劳动法》&#xff0c;有些巨额违约金从法律层面来说是站不住…

linux c 之使用-O来优化gcc

比如一般文件编译 gcc bfs.c -o bfs然后查看花了多少时间 time ./bfs 然后看结果 使用-O 优化&#xff0c;输入下面命令 gcc -O bfs.c -o bfs 再看所需时间&#xff0c;输入下面命令 time ./bfs 结果如图 我们还可以进一步优化用 -O1 -O2 -O3&#xff0c;列如 gcc -O2 bfs.c -…

Hbase Java API详解

2019独角兽企业重金招聘Python工程师标准>>> HBase是Hadoop的数据库&#xff0c;能够对大数据提供随机、实时读写访问。他是开源的&#xff0c;分布式的&#xff0c;多版本的&#xff0c;面向列的&#xff0c;存储模型。 在讲解的时候我首先给大家讲解一下HBase的整…

对C#未来的一点感悟

01—C#有前途吗&#xff1f;在国内C#比较冷门&#xff08;相对Python、Java&#xff09;&#xff0c;很多初学者可能都会对C#的未来有忧虑&#xff0c;害怕没有前途&#xff0c;担心找不到好的工作。其实&#xff0c;大可必须这样&#xff0c;就我在上海而言&#xff0c;我之前…

微软第二财季营收达 517 亿美元,净利润同比增长 21%

微软今日发布了 2022 财年第二财季财报&#xff0c;营收为 517.28 亿美元&#xff0c;与去年同期的 430.76 亿美元相比增长 20%。净利润为 187.65 亿美元&#xff0c;与去年同期的 154.63 亿美元相比增长 21%。生产力和业务流程部门的营收为 159.36 亿美元&#xff0c;与去年同…

二值图像--形态学处理3 开操作和闭操作

学习DIP第13天 转载请标明出处&#xff1a;http://blog.csdn.net/tonyshengtan&#xff0c;欢迎大家转载&#xff0c;发现博客被某些论坛转载后&#xff0c;图像无法正常显示&#xff0c;无法正常表达本人观点&#xff0c;对此表示很不满意。。。。。。。。 开篇废话 简单来说所…