在日常系统工作中,我们为了洞察系统的问题和运作情况通常会记录日志的方式来进行分析,但是在很多情况下都是被动的在出问题后才会去查日志。在很多时候,我们可能更需要相对实时的了解整个系统或者某一时段的运行的情况,诸如系统出错的频率以及响应时间等等指标。这些动态的准实时信息对于监控整个系统的运行和健康状况非常重要,而本文的主角们能通过很好的配合帮助你实现这个目标,而且是一种高大上的实现方式。想想泡杯茶翘着二郎腿看着偌大的屏幕上有着一堆华丽的仪表和曲线图,即使看不懂也很牛B的样子啊!(谁知道我看得懂看不懂呢,是不是?)

Q: 那什么是App-Metrics?
A: App Metrics是一个开源和跨平台的.NET库,用于记录应用程序中各项指标。可以在.NET Core上运行,也可以在支持.NET 4.5.2的完整.NET框架上运行。
App Metrics对底层数据源做了很好的抽象以支持很多类型的数据库,例如:
InfluxDb、Prometheus、ElasticSearch等等。。
同时他又提供了很多Measurements比如Apdex, Gauges, Counters, Meters, Histograms 等等一大堆


1. 安装Grafana

Q: 什么是Grafana
A: 一个类似Kibana的可视化数据开源程序,一般配合时间序列数据库进行配合来展示数据

这里为了方便使用docker来运行Grafana



docker run -d --name=grafana -p 3000:3000 grafana/grafana



  

grafana改背景色 grafana界面修改_grafana改背景色


接着我们确认下是否正常运行了


docker ps -a


  

grafana改背景色 grafana界面修改_grafana改背景色_02



2. 安装 InfluxDB

InfluxDb是比较流行的时序数据库,可以根据需要替换成Prometheus同上为了方便我们还是使用docker来运行
如果你希望每次都能保持之前docker运行收集的数据可以用docker 的-v选项把目录映射到本机的目录以便持久化数据

==注意influxdb有2个端口一个是admin一个database==


docker run -d -p 8083:8083 -p 8086:8086 --expose 8090 --expose 8099 tutum/influxdb


  

如图另外开一个控制台我们看到后台已经运行了2个容器

grafana改背景色 grafana界面修改_数据库_03


输入http://127.0.0.1:8083/ 访问InfluxDb的控制界面以便创建数据库

grafana改背景色 grafana界面修改_App_04


grafana改背景色 grafana界面修改_App_05


grafana改背景色 grafana界面修改_App_06



3. 配置AspNet Core2.x

  • 先照常新建一个MVC项目
  • grafana改背景色 grafana界面修改_运维_07

  • 安装所需的第三方库

    dotnet add package App.Metrics.Extensions.Mvcdotnet add package App.Metrics.Formatters.Jsondotnet add package App.Metrics.Extensions.Reporting.InfluxDB
      
    控制台显示安装成功!

  • grafana改背景色 grafana界面修改_数据库_08

  • 修改Startup.cs

using System;
using System.Collections.Generic;

using System.Linq;

using System.Threading.Tasks;

using App.Metrics.Configuration;

using App.Metrics.Extensions.Reporting.InfluxDB;

using App.Metrics.Extensions.Reporting.InfluxDB.Client;

using App.Metrics.Reporting.Interfaces;

using Microsoft.AspNetCore.Builder;

using Microsoft.AspNetCore.Hosting;

using Microsoft.AspNetCore.Http;

using Microsoft.AspNetCore.HttpsPolicy;

using Microsoft.AspNetCore.Mvc;

using Microsoft.Extensions.Configuration;

using Microsoft.Extensions.DependencyInjection;

namespace WebApplication1

{

    public class Startup

    {

        public Startup(IConfiguration configuration)

        {

            Configuration = configuration;

        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)

        {

        #region 注册 App-Metrics & 配置输出report到influxdb

            var database = "MyMetrics";

            var uri = new Uri(" http://127.0.0.1:8086 ");  //本地Docker中运行的influx实例,注意InfluxDb有2个端口别搞错

            services.AddMetrics(options =>

                {

                    options.WithGlobalTags((globalTags, info) =>

                    {

                        globalTags.Add("app", info.EntryAssemblyName);

                        globalTags.Add("env", "stage");

                    });

                })

                .AddHealthChecks()

                .AddReporting(

                    factory =>

                    {

                        factory.AddInfluxDb(

                            new InfluxDBReporterSettings

                            {

                                InfluxDbSettings = new InfluxDBSettings(database, uri),

                                ReportInterval = TimeSpan.FromSeconds(5)

                            });

                    })

                .AddMetricsMiddleware(options => options.IgnoredHttpStatusCodes = new[] {404});

        #endregion

            services.Configure<CookiePolicyOptions>(options =>

            {

                options.CheckConsentNeeded = context => true;

                options.MinimumSameSitePolicy = SameSiteMode.None;

            });

            //添加Metric Filter到mvc

            services.AddMvc(options => options.AddMetricsResourceFilter())

                .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime lifetime)

        {

            if (env.IsDevelopment())

            {

                app.UseDeveloperExceptionPage();

            }

            else

            {

                app.UseExceptionHandler("/Home/Error");

                app.UseHsts();

            }

            app.UseHttpsRedirection();

            app.UseStaticFiles();

            app.UseCookiePolicy();

           loggerFactory.AddConsole(Configuration.GetSection(" Logging "));

        app.UseMetrics();

        app.UseMetricsReporting(lifetime);

            app.UseMvc(routes =>

            {

                routes.MapRoute(

                    name: "default",

                    template: "{controller=Home}/{action=Index}/{id?}");

            });

        }

    }

}
  • 接下来就是配置豪华的Grafana了!
    打开浏览器试着访问docker内运行的Grafana容器,默认的用户名和密码是admin/admin 不用担心,第一次登录成功后系统会要求你重新设置新的密码,很贴心!!
  • grafana改背景色 grafana界面修改_数据库_09


  • 登录成功后,配置Datasource当然是选择我们之前运行的InfluxDb
  • grafana改背景色 grafana界面修改_测试_10

按图进行配置

grafana改背景色 grafana界面修改_App_11


提交后,如下图显示即配置成功

grafana改背景色 grafana界面修改_运维_12


接着就是创建你的Dashboard,可以自己建立也可以自己配置json文件导入,网上有很多例子可以直接下载


  

最后启动AspNetCore站点,再建立点post get put什么的控制器和Action随便访问几次就可以了

grafana改背景色 grafana界面修改_grafana改背景色_13