美文网首页dotNET.NETAmazing .NET
利用Skywalking-netcore监控你的应用性能

利用Skywalking-netcore监控你的应用性能

作者: _黑冰_ | 来源:发表于2018-05-07 10:14 被阅读2065次

    Skywalking

    SkyWalking开源项目由吴晟于2015年创建,同年10月在GitHub上作为个人项目开源。

    SkyWalking项目的核心目标,是针对微服务、Cloud Native、容器化架构,提供应用性能监控(APM)和分布式调用链追踪能力。

    2017年11月,SkyWalking社区正式决定,寻求加入Apache基金会,希望能使项目成为更为开放、全球化和强大的APM开源产品,并加强来自社区的合作和交流。最终实现构建一款功能强大、简单易用的开源APM产品。

    2017年12月8日,Apache软件基金会孵化器项目管理委员会 ASF IPMC宣布“SkyWalking全票通过,进入Apache孵化器”。

    架构图

    官方版:https://github.com/apache/incubator-skywalking

    .Net core Agent + Skywalking

    架构图

    什么是APM

    APM = Application Performance Management,即应用性能管理,主要是针对企业级应用软件市场,对企业系统实施即时监控,以实现对应用程序性能管理和故障管理的系统化的解决方案。

    APM的覆盖范围包括五个层次的实现:终端用户体验,应用架构映射,应用事务的分析,深度应用诊断,和数据分析。

    过去,企业的IT部门在收集系统性能参数时,一般重点关注为最终用户提供服务的硬件组件的利用率,如CPU利用率、内存占用、网络吞吐量。虽然这种方法也提供了一些宝贵的信息,但却忽视了最重要的因素:最终用户的响应时间。

    现在,通过事务处理过程监测、模拟等手段,可以真实测量用户响应时间,此外还可以报告谁正在使用某一应用、该应用的使用频率以及用户所进行的事务处理过程是否成功完成、发生错误时的参数与堆栈调用信息、数据库查询语句跟踪等。

    .Net Core

    自微软发布 .net core 2.0以来,.net开发者迎来了幸福的春天,我们的程序将不再局限于Windows平台。2.x版的.net core已趋于稳定,各厂的配套也在逐步跟上,使得整个生态在逐渐的丰富起来。

    SkyWalking-netcore是.net core平台下的代理程序,在NCC社区的Lemon大神带领下进行开发,并于2018年4月17日正式加入OpenSkywalking,于2018年4月19日发布v0.1.0版本。

    实验目标

    布署一个基于SkyWalking的.net core应用监控系统,监控Web应用的性能。

    所需第三方软件

    • XShell
    • WinSCP
    • Visual Studio 2017
    • .net Core 2.0.3 SDK
    • JDK8+
    • Elasticsearch 5.x

    网络结构

    本次实验采用三台服务器 ,Elasticsearch 与 Collector 放在一台服务器上,收集另外两台Web服务器提供的数据,实验应用架构如下图。

    实验架构

    实验过程

    安装系统

    Server-01、Web01、Web02安装 CentOS系统,安装过程详见《IT基础设施:CentOS7安装指南》

    IP配置表

    服务器 IP 备注
    Server-01 192.168.10.191 提供ES服务、Collector与WebUI
    Web01 192.168.10.192 运行App1
    Web02 192.168.10.193 运行 App2
    MSSQL 暂无 因.net Core的代理程序暂未提供支持,故本文不演示此部分,待新版本发布后更新
    WebService 暂无 因.net Core的代理程序暂未提供支持,故本文不演示此部分,待新版本发布后更新

    安装 .net core 2.0 SDK

    在Web01、Web02上安装.net core 2.0 SDK,详见《在CentOS7下安装.Net Core 2.0.3 SDK》

    安装JDK8

    下载JDK

    因为oracle现在要同意协议才能下载,直接使用wget加链接下载不到,所以要加上前面的那些代码:

    wget --no-check-certificate --no-cookie --header "Cookie: oraclelicense=accept-securebackup-cookie;" http://download.oracle.com/otn-pub/java/jdk/8u171-b11/512cd62ec5174c3487ac17c61aaa89e8/jdk-8u171-linux-x64.rpm
    
    下载JDK

    也可以先用迅雷下到主机,再通过局域网下载到虚拟机

    使用rpm -ivh jdk-8u171-linux-x64.rpm进行安装

    命令执行完毕即安装完成,使用java -version 检查是否安装成功

    安装成功

    部署Elasticsearch

    /etc/yum.repo.d/下新建elasticsearch.repo文件,内容如下:

    [elasticsearch-5.x]
    name=Elasticsearch repository for 5.x packages
    baseurl=https://artifacts.elastic.co/packages/5.x/yum
    gpgcheck=1
    gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
    enabled=1
    autorefresh=1
    type=rpm-md
    

    :wq保存后执行sudo yum install elasticsearch -y安装

    安装成功

    用vim配置文件/etc/elasticsearch/elasticsearch.yml

    • 设置 cluster.name: CollectorDBCluster。此名称需要和collector配置文件一致。
    • 设置 node.name: masterNode, 节点名称可以设置为任意名字,如为集群模式,则每个节点名称需要不同。
      增加如下配置
    cluster.name: CollectorDBCluster
    network.host: 0.0.0.0
    thread_pool.bulk.queue_size: 1000
    

    最终配置如下:

    # ======================== Elasticsearch Configuration =========================
    #
    # NOTE: Elasticsearch comes with reasonable defaults for most settings.
    #       Before you set out to tweak and tune the configuration, make sure you
    #       understand what are you trying to accomplish and the consequences.
    #
    # The primary way of configuring a node is via this file. This template lists
    # the most important settings you may want to configure for a production cluster.
    #
    # Please consult the documentation for further information on configuration options:
    # https://www.elastic.co/guide/en/elasticsearch/reference/index.html
    #
    # ---------------------------------- Cluster -----------------------------------
    #
    # Use a descriptive name for your cluster:
    cluster.name: CollectorDBCluster
    network.host: 0.0.0.0
    thread_pool.bulk.queue_size: 1000
    #cluster.name: my-application
    #
    # ------------------------------------ Node ------------------------------------
    #
    # Use a descriptive name for the node:
    #
    #node.name: node-1
    #
    # Add custom attributes to the node:
    #
    #node.attr.rack: r1
    #
    # ----------------------------------- Paths ------------------------------------
    #
    # Path to directory where to store the data (separate multiple locations by comma):
    #
    #path.data: /path/to/data
    #
    # Path to log files:
    #
    #path.logs: /path/to/logs
    #
    # ----------------------------------- Memory -----------------------------------
    #
    # Lock the memory on startup:
    #
    #bootstrap.memory_lock: true
    #
    # Make sure that the heap size is set to about half the memory available
    # on the system and that the owner of the process is allowed to use this
    # limit.
    #
    # Elasticsearch performs poorly when the system is swapping the memory.
    #
    # ---------------------------------- Network -----------------------------------
    #
    # Set the bind address to a specific IP (IPv4 or IPv6):
    #
    #network.host: 192.168.0.1
    #
    # Set a custom port for HTTP:
    #
    #http.port: 9200
    #
    # For more information, consult the network module documentation.
    #
    # --------------------------------- Discovery ----------------------------------
    #
    # Pass an initial list of hosts to perform discovery when new node is started:
    # The default list of hosts is ["127.0.0.1", "[::1]"]
    #
    #discovery.zen.ping.unicast.hosts: ["host1", "host2"]
    #
    # Prevent the "split brain" by configuring the majority of nodes (total number of master-eligible nodes / 2 + 1):
    #
    #discovery.zen.minimum_master_nodes: 3
    #
    # For more information, consult the zen discovery module documentation.
    #
    # ---------------------------------- Gateway -----------------------------------
    #
    # Block initial recovery after a full cluster restart until N nodes are started:
    #
    #gateway.recover_after_nodes: 3
    #
    # For more information, consult the gateway module documentation.
    #
    # ---------------------------------- Various -----------------------------------
    #
    # Require explicit names when deleting indices:
    #
    #action.destructive_requires_name: true
    
    

    启动服务systemctl start elasticsearch.service

    设为开机启动systemctl enable elasticsearch.service

    部署collector

    下载release的版本https://github.com/OpenSkywalking/skywalking-netcore/releases

    下载

    将压缩包解压到Server-01/home/collector/目录

    • 修改/home/collector/bin/webappService.sh中的127.0.0.1Server-01的IP地址,目前为192.168.10.191

    最终脚本如下:

    # 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.
    
    #!/usr/bin/env sh
    
    PRG="$0"
    PRGDIR=`dirname "$PRG"`
    [ -z "$WEBAPP_HOME" ] && WEBAPP_HOME=`cd "$PRGDIR/.." >/dev/null; pwd`
    
    WEBAPP_LOG_DIR="${WEBAPP_HOME}/logs"
    JAVA_OPTS=" -Xms256M -Xmx512M"
    JAR_PATH="${WEBAPP_HOME}/webapp"
    
    if [ ! -d "${WEBAPP_HOME}/logs" ]; then
        mkdir -p "${WEBAPP_LOG_DIR}"
    fi
    
    _RUNJAVA=${JAVA_HOME}/bin/java
    [ -z "$JAVA_HOME" ] && _RUNJAVA=java
    
    eval exec "\"$_RUNJAVA\" ${JAVA_OPTS} -jar ${JAR_PATH}/skywalking-webapp.jar \
             --server.port=8080 --collector.ribbon.listOfServers=192.168.10.191:10800 \
            2>${WEBAPP_LOG_DIR}/webapp.log 1> /dev/null &"
    
    if [ $? -eq 0 ]; then
        sleep 1
        echo "Skywalking Web Application started successfully!"
    else
        echo "Skywalking Web Application started failure!"
        exit 1
    fi
    
    
    • 修改/home/collector/config/application.yml中的所有localhostServer-01的IP地址,目前为192.168.10.191

    最终配置文件如下:

    # 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.
    
    #cluster:
    #  zookeeper:
    #    hostPort: localhost:2181
    #    sessionTimeout: 100000
    naming:
      jetty:
        host: 192.168.10.191
        port: 10800
        contextPath: /
    cache:
    #  guava:
      caffeine:
    remote:
      gRPC:
        host: 192.168.10.191
        port: 11800
    agent_gRPC:
      gRPC:
        host: 192.168.10.191
        port: 11800
        #Set these two setting to open ssl
        #sslCertChainFile: $path
        #sslPrivateKeyFile: $path
    
        #Set your own token to active auth
        #authentication: xxxxxx
    agent_jetty:
      jetty:
        host: 192.168.10.191
        port: 12800
        contextPath: /
    analysis_register:
      default:
    analysis_jvm:
      default:
    analysis_segment_parser:
      default:
        bufferFilePath: ../buffer/
        bufferOffsetMaxFileSize: 10M
        bufferSegmentMaxFileSize: 500M
    ui:
      jetty:
        host: 192.168.10.191
        port: 12800
        contextPath: /
    storage:
      elasticsearch:
        clusterName: CollectorDBCluster
        clusterTransportSniffer: true
        clusterNodes: localhost:9300
        indexShardsNumber: 2
        indexReplicasNumber: 0
        highPerformanceMode: true
        ttl: 7
    #storage:
    #  h2:
    #    url: jdbc:h2:~/memorydb
    #    userName: sa
    configuration:
      default:
    #     namespace: xxxxx
        applicationApdexThreshold: 2000
        serviceErrorRateThreshold: 10.00
        serviceAverageResponseTimeThreshold: 2000
        instanceErrorRateThreshold: 10.00
        instanceAverageResponseTimeThreshold: 2000
        applicationErrorRateThreshold: 10.00
        applicationAverageResponseTimeThreshold: 2000
    

    给脚本权限

    chmod 777 /home/collector/bin/*.sh
    

    运行/home/collector/bin/startup.sh启动WebUI和Collector。

    运行

    创建WebApplication

    接下来,我们创建一个Web应用,并在其中加入Skywalking for dotnet core的代理程序。

    1、打开VS2017,创建一个.Net Core MVC应用,请跟着我操作:VS中点击菜单“文件”——“新建”——“项目”(按Ctrl+Shift+N同等效果),在弹出的对话框中从左到右进行如下操作。


    .Net Core Web应用 选择项目类型

    2、等项目建好,右键点击“依赖项”——“管理Nuget程序包”,打开Nuget管理器。

    操作

    在“浏览”选项卡,输入“Skywalking.AspNetCore”搜索,并安装

    找到包

    安装前需要接受许可证,点击“我接受”(不接受请关闭本文)


    许可证

    3、安装完成后,打开Startup.cs,在ConfigureServices函数中加入

                services.AddSkyWalking(option =>
                {
                    //这里填本应用的名称,每个应用不同
                    option.ApplicationCode = "OurApplication1";
                    //这里填Collector的地址
                    option.DirectServers = "192.168.10.191:11800";
    
                });
    

    Startup.cs完整代码如下

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using SkyWalking.AspNetCore;
    
    namespace WebApplication2
    {
        public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public IConfiguration Configuration { get; }
    
            // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddSkyWalking(option =>
                {
                    //这里填本应用的名称,每个应用不同
                    option.ApplicationCode = "OurApplication1";
                    //这里填Collector的地址
                    option.DirectServers = "192.168.10.191:11800";
    
                });
    
                services.AddMvc();
    
            }
    
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                    app.UseBrowserLink();
                }
                else
                {
                    app.UseExceptionHandler("/Home/Error");
                }
    
                app.UseStaticFiles();
    
                app.UseMvc(routes =>
                {
                    routes.MapRoute(
                        name: "default",
                        template: "{controller=Home}/{action=Index}/{id?}");
                });
            }
        }
    }
    
    

    打开Program.cs文件,允许非本地访问,最终代码如下

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Logging;
    
    namespace WebApplication2
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                BuildWebHost(args).Run();
            }
    
            public static IWebHost BuildWebHost(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .UseUrls("http://*:5000")
                    .UseStartup<Startup>()
                    .Build();
        }
    }
    
    

    4、发布:点击我们的WEB应用,右键——发布,接下来看图操作。

    发布 发布到文件夹 选择目标位置 发布 没有失败,恭喜,大吉大利,今晚吃鸡

    我们可以看到,发布完成后的文件,一大堆,我们把这个文件夹改名为App1

    发布成功

    5、接下来,我们在StartUp.cs中把ApplicationCode改一下,按上面的步骤再发布一次。

    image.png

    这次发布生成的Publish3文件夹,我们改名为App2

    布署Web

    1、打开WinSCP,连上Web01,将App1拖到/home下。
    2、打开XShell,连上Web01,执行如下命令

    # 关掉防火墙(生产环境不宜)
    systemctl stop firewalld
    
    # 给予执行权限
    chmod 777 /home/App1/WebApplication2.dll
    
    # 在后台运行应用
    nohup dotnet /home/App1/WebApplication2.dll &
    
    1. 同样的操作,将App2布署到Web02上。

    访问应用

    我们打开两个应用,随机点击一下应用顶部的链接。

    http://192.168.10.192:5000,这是我们的app1
    http://192.168.10.193:5000,这是我们的app2

    查看监测

    打开http://192.168.10.191:8080,查看监测情况

    监测到的应用

    查看被访问的服务响应速度

    服务状态

    FAQ

    Q:Collector无法启动

    删除buffer文件夹,重新启动startup.sh

    Q:监测不到数据

    检查WebApplication2.dll有没有执行权限

    Q:WEBUI报404错误

    检查与ES的连接配置是否正确

    Q:Dashboard报500错误

    关闭Collector, 关闭WebUI,关闭ES,删除buffer文件夹,清除ES数据(位于/var/lib/elasticsearch/nodes下),先重启ES,再启动Collector和WebUI,再去访问一下应用生产一点数据。

    结语

    Skywalking-netcore做为.Net core社区的新生命,具有无限的潜力,据可靠消息,新版本将更深入地监测数据库操作及状态,HTTP请求消息以及StackTrace跟踪,让我们一起为它打Call加油吧。猛戮这里,到Github给Skywalking-netcore点星星。 :)

    引用

    Install Elasticsearch with RPM

    相关文章

      网友评论

      • michel4liu:补充一下:1、ES确保启动无问题后 在启动 Skywalking各种服务。要不然也会出现500问题。2、Skywalking 后续版本(我用的5.0.0-RC2)的 更改IP方式已经变成在config中了。在 agent、config、webapp中都需要更改里面配置文件的对应ip
      • 倾听心的声音_41bd:如何检测jboss下的应用请问
      • 游泳的鱼SF:入门过程写的够详细👍
      • 蒙古海军司令三德子:写的很好,本司令很喜欢!

      本文标题:利用Skywalking-netcore监控你的应用性能

      本文链接:https://www.haomeiwen.com/subject/pnxjhftx.html