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

  1. 云栖社区>
  2. 博客>
  3. 正文

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

黑冰中国 2018-05-07 10:14:00 浏览1840
展开阅读全文

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

img_4648e1684072e17476b38a5990c23b00.png
架构图

什么是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服务器提供的数据,实验应用架构如下图。

img_378649223cceb43fd407a72e734754ab.png
实验架构

实验过程

安装系统

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
img_fa2b198d8010121ad7a27a20fc4a78f6.png
下载JDK

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

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

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

img_6da1cd7a15c11bf01fe1971006a8a3bf.png
安装成功

部署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安装

img_da6deeea9aa19a9272349680789d1357.png
安装成功

用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

img_6ca1a07360f6f19bb78fe01c334aea36.png
下载

将压缩包解压到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。

img_b92ab4f1dcb1e242c8cc24544c7a9cec.png
运行

创建WebApplication

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

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


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

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

img_fc44db3df8105976ab38fc5c319f1865.png
操作

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

img_c78ee1dac463535fa596bf5fab1e07ca.png
找到包

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


img_b0ca02c21949fe9e9360cac4b248f459.png
许可证

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应用,右键——发布,接下来看图操作。

img_0455c9a5996dc9e8a2540756cdc9c45b.png
发布
img_cb40f5c9478cbd5999a0a9fa63a5cf12.png
发布到文件夹
img_d52e8474cb433ec7841266ebff5942cb.png
选择目标位置
img_fa692be196890d2edde0091699cedc3e.png
发布
img_fcc97615b721a230ab458e6cf1f33036.png
没有失败,恭喜,大吉大利,今晚吃鸡

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

img_632ffb5234ead45197a7d8fa86430799.png
发布成功

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

img_11fc32cc5f07ec39cccc6673f548f2c2.png
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,查看监测情况

img_68004829e9802f2b8345f88715ba4c9c.png
监测到的应用

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

img_f9123f3a8148dafabca628775562fc65.png
服务状态

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

网友评论

登录后评论
0/500
评论
黑冰中国
+ 关注