.net core java go_在 .NetCore 项目中使用 SkyWalkingAPM 踩坑排坑日记

本文介绍了如何在.NetCore项目中使用SkyWalking应用性能管理系统,涉及Docker安装Elasticsearch、SkyWalking及SkyWalking-UI,以及遇到的错误和解决方法。在使用SkyAPM.Agent.AspNetCore时,因NuGet包版本不匹配导致服务注册失败,最终发现需使用SkyWalking 7.0或更低版本。
摘要由CSDN通过智能技术生成

SkyWalking 概述

SkyWalking 是观察性分析平台和应用性能管理系统。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。支持Java, .Net Core, PHP, NodeJS, Golang, LUA语言探针,支持Envoy + Istio构建的Service Mesh。

这里抛出两个概念,SkyWalking 服务和语言探针。SkyWalking 本身是用 Java 写的,作为应用性能管理系统,探针是收集应用性能指标数据的,比如在 .net core 项目中引入 SkyAPM.Agent.AspNetCore,做一些配置,就可以将该项目的数据报告给 SkyWalking 服务,在 SkyWalking UI 界面看到可视化的数据。

SkyWalking 展示的数据是需要存储的,默认是 H2,同时也支持使用ElasticSearch、MySQL、TiDB、InfluxDB,这里使用 elasticsearch。

环境说明

本机开发环境:Win10 + VS2019,服务器是 CentOS,ip:172.17.81.23

Docker 方式(踩坑)

安装 Elasticsearch

docker run --name elasticsearch --restart always -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.8.1

安装 Skywalking

docker run --name skywalking --restart always -d -p 11800:11800 -p 12800:12800 --link elasticsearch:elasticsearch -e SW_STORAGE=elasticsearch -e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 apache/skywalking-oap-server:8.1.0-es7

安装 SkyWalking-UI

docker run --name skywalking-ui --restart always -d -p 8080:8080 --link skywalking:skywalking -e SW_OAP_ADDRESS=skywalking:12800 apache/skywalking-ui:8.1.0

本机访问 skywalking 服务,然而页面一片空白,审查元素发现这么一句话:We're sorry but SkyWalking doesn't work properly without JavaScript enabled.Please enable it to continue.

9c0d07700165fae74345c8a5cb01fe7f.png

查看 Docker 服务,发现 SkyWalking 一直在 restart 状态。查看 dockerr 日志,skywalking 连接到 elasticsearch 超时。

ea12024cbdf7f239ae8ed4163dcdddff.png

Docker Compose 方式(踩坑)

说明:用到的 compose 文件版本是 3.8,需要 Docker 版本在 19.03.0 或更新的版本。

mkdir skywalking

cd skywalkingvi docker-compose.yml

# 内容见 https://github.com/apache/skywalking-docker/blob/master/8/8.1.0/compose-es7/docker-compose.yml

docker-compose up -d

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

# Licensed to the Apache Software Foundation (ASF) under one

# or more contributor license agreements. See the NOTICE file

# distributed with this work for additional information

# regarding copyright ownership. The ASF licenses this file

# to you under the Apache License, Version 2.0 (the

# "License"); you may not use this file except in compliance

# with the License. You may obtain a copy of the License at

#

# http://www.apache.org/licenses/LICENSE-2.0

#

# Unless required by applicable law or agreed to in writing, software

# distributed under the License is distributed on an "AS IS" BASIS,

# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

# See the License for the specific language governing permissions and

# limitations under the License.

version: '3.8'

services:

elasticsearch:

image: docker.elastic.co/elasticsearch/elasticsearch:7.5.0

container_name: elasticsearch

restart: always

ports:

- 9200:9200

healthcheck:

test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]

interval: 30s

timeout: 10s

retries: 3

start_period: 40s

environment:

- discovery.type=single-node

- bootstrap.memory_lock=true

- "ES_JAVA_OPTS=-Xms512m -Xmx512m"

ulimits:

memlock:

soft: -1

hard: -1

oap:

image: apache/skywalking-oap-server:8.1.0-es7

container_name: oap

depends_on:

- elasticsearch

links:

- elasticsearch

restart: always

ports:

- 11800:11800

- 12800:12800

healthcheck:

test: ["CMD-SHELL", "/skywalking/bin/swctl"]

interval: 30s

timeout: 10s

retries: 3

start_period: 40s

environment:

SW_STORAGE: elasticsearch7

SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200

ui:

image: apache/skywalking-ui:8.1.0

container_name: ui

depends_on:

- oap

links:

- oap

restart: always

ports:

- 8080:8080

environment:

SW_OAP_ADDRESS: oap:12800

sw8.1-es7.5/docker-compose.yml

启动之后可以看到 docker 服务状态正常。状态也是 healthy,总算放心了。

1416929ea89a472eb5a3c7a3bcd7af7a.png

本机访问 SkyWalking 服务地址,UI 暴露端口是 8080. 审查网络,没有错误。

bf22b71a01b739b469752dcf192c0db0.png

Asp.Net Core 项目应用

创建一个 WebAPI 项目,在项目中引用 NuGet 包:SkyAPM.Agent.AspNetCore,当前版本是 0.9.0

c2027cb3f36af4abe094bc4e305aa155.png

在项目根目录下新增 skyapm.json 配置文件。gRPC 下 的 Servers 为 SkyWalking 服务地址,注意替换成自己的服务地址。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

{

"SkyWalking": {

"ServiceName": "skyapm",

"Namespace": "",

"HeaderVersions": [

"sw6"

],

"Sampling": {

"SamplePer3Secs": -1,

"Percentage": -1.0

},

"Logging": {

"Level": "Information",

"FilePath": "logs\\skyapm-{Date}.log"

},

"Transport": {

"Interval": 3000,

"ProtocolVersion": "v6",

"QueueSize": 30000,

"BatchSize": 3000,

"gRPC": {

"Servers": "172.17.81.23:11800",

"Timeout": 10000,

"ConnectTimeout": 10000,

"ReportTimeout": 600000

}

}

}

}

skyapm.json

也可以通过命令行工具来生成配置文件。安装 SkyAPM.DotNet.CLI,在项目根目录下使用 CLI 命令生成 SkyWalking 配置文件。命令规则是:dotnet skyapm config [your_service_name] [your_servers]

dotnet tool install -g SkyAPM.DotNet.CLI

dotnet skyapm config skyapm172.17.81.23:11800

d5767efdf340a83b7a2d3b8feb4efea4.png

312e21bdd3204c60431726ae7106d90e.png

启动项目,没有异常,但是也没有展示出数据。查看日志,发现服务注册失败。

[skyapm] [Error] SkyApm.Transport.Grpc.V6.ServiceRegister : Register service fail.

Grpc.Core.RpcException: Status(StatusCode=Unimplemented, Detail="Method not found: Register/doServiceRegister")

at SkyApm.Transport.Grpc.V6.ServiceRegister.

翻看源码,查找GitHub issue,原来这个注册方法是 SkyWalking v7.0 中的方法,新的版本中是没有这个方法的。

b194d305187cc10e683972ab6029a9a8.png

破案了,SkyAPM.Agent.AspNetCore 这个 NuGet 包有一年未更新了,不支持 SkyWalking 8,在 .Net Core 项目中需要使用 SkyWalking v7 或更低的版本。

Docker 方式(√)

SW7.0 之后的版本是用不了了,所以目前只能用 7.0 版本。

docker run --name elasticsearch --restart always -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.8.1docker run--name skywalking --restart always -d -p 11800:11800 -p 12800:12800 --link elasticsearch:elasticsearch -e SW_STORAGE=elasticsearch7 -e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 apache/skywalking-oap-server:7.0.0-es7

docker run--name skywalking-ui --restart always -d -p 8080:8080 --link skywalking:skywalking -e SW_OAP_ADDRESS=skywalking:12800 apache/skywalking-ui:7.0.0

Docker Compose 方式(√)

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

version: '3.3'

services:

elasticsearch:

image: docker.elastic.co/elasticsearch/elasticsearch:7.5.0

container_name: elasticsearch

restart: always

ports:

- 9200:9200

environment:

- discovery.type=single-node

- bootstrap.memory_lock=true

- "ES_JAVA_OPTS=-Xms512m -Xmx512m"

ulimits:

memlock:

soft: -1

hard: -1

oap:

image: apache/skywalking-oap-server:7.0.0-es7

container_name: oap

depends_on:

- elasticsearch

links:

- elasticsearch

restart: always

ports:

- 11800:11800

- 12800:12800

environment:

SW_STORAGE: elasticsearch7

SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200

ui:

image: apache/skywalking-ui:7.0.0

container_name: ui

depends_on:

- oap

links:

- oap

restart: always

ports:

- 8080:8080

environment:

SW_OAP_ADDRESS: oap:12800

sw7.0-es7.5/docker-compose.yml

docker-compose 启动之后大概1分钟,启动 api 项目,查看日志,没有异常。访问 api 项目,查看 SkyWalking UI,激动人心的时刻终于到来了。

967c89eb7317ba1bd98c31f4f0eda4cf.png

15ace83ddafec097cefdfd7e2aa5e5b2.png 总结

SkyWalking 不同语言探针不是同一个团队开发的,SkyAPM-dotnet 也没怎么更新了,在 .NetCore 平台使用 SkyWalking 作为 APM,一定要选对版本,不要盲目求新啊

e032e98ac7481fcc3403b0429bdeef00.png

来源:oschina

链接:https://my.oschina.net/u/4409634/blog/4479895

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值