• Skywalking APM监控系列(一丶.NET5.0+接入Skywalking监听)


    前言

    新项目采用的abp vnext的微服务模块化架构,所以把应用的服务拆成了很多独立模块

    在初期,我们通过日志还能跟踪到问题,

    后期服务越来越多(大约扩充到了十几个),随着调用链路越来越深

    ,问题也越来越难排查了.

    往往入口报错之后,要跟好几个服务的日志 才能找到最终节点.

    所以考虑引入Skywalking链路跟踪服务,来监听整个应用

     

     

    什么是Skywalking

    以下内容为照葫芦画瓢,觉得写的不错,所以就CV了~

    Skywalking是一款分布式链路追踪组件

    那么什么是链路追踪?

    随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心。

    所以微服务面临了这些问题:

         某个核心服务挂了,导致大量报错,如何快速确定哪里出了问题?

         用户请求响应延迟高,怎么确定是哪些服务导致的?

         应用程序有性能瓶颈,怎样确定瓶颈在哪里?

         如何准实时的了解应用部署环境(CPU、内存、进程、线程、网络、带宽)情况,以便快速扩容/缩容、流量控制、业务迁移

         如何统计各个调用的性能指标,比如:吞吐量(TPS)、响应时间及错误记录等

    分布式链路跟踪系统就是为了解决这些问题应运而生。

     

    Skywalking有哪些功能?

      1. 多种监控手段。可以通过语言探针和 service mesh 获得监控数据。

      2.多个语言自动探针。包括 Java,.NET Core 和 Node.JS。

      3.轻量高效。无需大数据平台,和大量的服务器资源。

      4.模块化。UI、存储、集群管理都有多种机制可选。

      5.支持告警。

      6.优秀的可视化解决方案。

    Skywalking的整体架构图

     

     

    部署搭建Skywalking

    Skywalking是支持容器化部署的,所以这里我们只讲如何通过Docker进行部署

    1.部署ES数据库

    这里说明一下.Skywalking容器里本身是自带H2数据库的并支持持久化的,如果想简化部署,可以直接使用

    这里ES推荐使用7.10版本,因为7.11以上的版本 授权协议变更了 可能有法律风险

    docker run -d -p 9200:9200 -p 9300:9300 --name es -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms128m -Xmx256m" -v /home/elasticsearch/data:/usr/share/elasticsearch/data elasticsearch:7.10.1

    上面的命令是运行一个基础的ES数据库,并将数据持久化到宿主机 /home/elasticsearch/data,各位可以根据自己情况 自行更改

    3.部署skywalking-oap服务

    复制代码
    docker run --name skywalking-oap 
    --restart always 
    -p 11800:11800 
    -p 12800:12800 
    -d -e TZ=Asia/Shanghai 
    -e SW_ES_USER=
    -e SW_ES_PASSWORD= 
    -e SW_STORAGE=elasticsearch 
    -e SW_STORAGE_ES_CLUSTER_NODES=ES数据库地址:9200 
    -v /etc/localtime:/etc/localtime:ro  
    apache/skywalking-oap-server:9.6.0
    复制代码

     

    3.部署skywalking-ui服务

    复制代码
    docker run -d 
    --name skywalking-ui 
    --restart always 
    -p 8080:8080 
    -e TZ=Asia/Shanghai 
    -e SW_OAP_ADDRESS=http://这里填写skywalking-oap的地址:12800 
    -v /etc/localtime:/etc/localtime:ro 
    apache/skywalking-ui:9.6.0
    复制代码

     

    这样,我们就完成了基本的skywalking服务的搭建

     

    ASP.NET Core如何集成Skywalking

    在.NET中接入Skywalking,主要使用  SkyAPM.Agent.AspNetCore  这个开源代理

    SkyAPM.Agent.AspNetCore采用了IHostingStartup接口通过探针的形式进行接入

    所以对应用的入侵性很小,几乎为0.所以接入数据很简单

    我们只需要三步即可

    1.给服务的宿主层添加引用:

    SkyAPM.Agent.AspNetCore

    2.然后添加环境变量:

    ASPNETCORE_HOSTINGSTARTUPASSEMBLIES=SkyAPM.Agent.AspNetCore (PS:如果有其他的拦截,这里的环境变量可以配置多个,通过逗号分隔)

    3.添加Skywalking配置项,创建skyapm.json文件:

    (PS:这里不一定要创建skyapm.json文件,也可以把配置写在appsettings.json里,研究过代理工具的源码,他也读取了appsettings的配置)

    类似如下:

    复制代码
    {
      "SkyWalking": {
        "ServiceName": "asp-net-core-backend", //服务名
        "Namespace": "",
        "HeaderVersions": [
          "sw8"
        ],
        "Sampling": {
          "SamplePer3Secs": -1,
          "Percentage": -1.0,
          "LogSqlParameterValue": false  
        },
        "Logging": {
          "Level": "Information",
          "FilePath": "logs/skyapm-{Date}.log"
        },
        "Transport": {
          "Interval": 3000,
          "ProtocolVersion": "v8",
          "QueueSize": 30000,
          "BatchSize": 3000,
          "gRPC": {
            "Servers": "localhost:11800", //指向SkywalkingOAP的地址
            "Timeout": 100000,
            "ConnectTimeout": 100000,
            "ReportTimeout": 600000
          }
        }
      }
    }
    复制代码

     

    由于可能线上的数据量很大,所以除了代理类自行监听的日志以外

    我们还可以通过代码自行添加Tag和Log,方便跟踪查询

    可以通过依赖注入的形式,拿到IEntrySegmentContextAccessor对象,进行标记和日志记录

    代码如下:

    复制代码
    private readonly IEntrySegmentContextAccessor _segContext; 
    public Test(IEntrySegmentContextAccessor segContext = null)
     {
         _segContext = segContext;
     }
    
    public void Doing()
     {
        _segContext.Context.Span.AddLog(LogEvent.Message(""));//记录日志
        _segContext.Context.Span.AddTag("lowsql", "lowsql");//记录标签
     }
    复制代码

    可以在此基础上自行扩展,比如加到ActionFilterAttribute拦截里面进行跟踪拦截

     

     

     

    最后

    最后,我们来看看效果:

    链路情况:

     

     

     

    这样,我们就能很方便的知道哪个服务调用了哪些服务,执行了哪些SQL操作了..

     

  • 相关阅读:
    直方图的计算,绘制与分析
    C++模板元模板(异类词典与policy模板)- - - 后篇
    伦敦银最新价格能进吗?
    [附源码]计算机毕业设计springboot人员信息管理
    斯坦福计算机视觉cs231n-assignment3总结
    CSS实现背景图片模糊——毛玻璃效果 | 浅谈CSS属性 filter、backdrop-filter
    力扣(LeetCode)566. 重塑矩阵(C语言)
    SoloX:Android和iOS性能数据的实时采集工具
    分布式锁,redis锁,执行的过程
    Python的垃圾回收机制
  • 原文地址:https://www.cnblogs.com/GuZhenYin/p/17757705.html