RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1099340
Accepted
Dmytro
Dmytro
Asked:2020-03-25 02:58:02 +0000 UTC2020-03-25 02:58:02 +0000 UTC 2020-03-25 02:58:02 +0000 UTC

ASP.NET Core 3.1 中的指标。在里面收集什么以及如何捡起它们?

  • 772

大家好!

预览:我对收集 .NET Framework 和 Core 中的指标这一主题并不陌生。每天我都在学习新的东西,但脑子里已经在耳边流淌,所以我真的希望得到社区的帮助。

关于系统: ASP.NET Core 应用程序在 Windows Iron 服务器上运行。自然 - 它托管在 IIS 上。在这里(以及在许多其他服务器上)ASP.NET(非核心)应用程序和螺旋服务正在旋转,它们将它们的指标(包括自定义指标)存储在 Windows 性能计数器中,Zabbex 代理和 Telegraf 代理从那里获取它们。存储收集的 InfluxDB 指标。画格拉法纳。

任务 1:与 Windows Performance Counters(以下简称 WPC)交 ASP.NET Core 朋友。甚至可能吗?

任务 2:如果这不可能 - 您需要最可靠的方法来收集指标并在将它们发送到 InfluxDB 之前保存它们,即使在某些步骤出现问题(例如,网络问题、InfluxDB 的服务器崩溃等)。 .)。希望 Zabbex 或 Telegraf 代理参与其中。

Prometeus 服务器不是一种选择,因为当电报和 InfluxDB 可用时,没有人愿意部署另一项服务,但不排除使用 Prometeus 客户端的可能性,因为电报可以读取它。

目前我正在尝试了解是否有可能与电报建立 App Metrics ( https://www.app-metrics.io ) 朋友,但到目前为止还没有成功,因为对 ASP.NET Core 3.0+ 的支持已经还没有在这个库中完全实现,一半的功能是愚蠢的拒绝工作(库 4.0 预览版,还没有文档)。此外,如果电报由于某种原因无法接收到度量值,如何处理这些度量值的问题尚未得到解决(这里,在 Framework-a 的情况下,WPC 提供帮助,它存储度量值并且代理可以接收它们随时)。

App Metrics 可以写入文件(到目前为止它不能,而且我还没有弄清楚 - 它在我弯曲的手中,或者库还没有准备好,但是文件没有创建并且有没有错误),现在我想知道电报是否可以从文件度量中读取(还没有找到答案)。但即使它可以 - 阅读后如何处理这个文件?如果我们一直在写入文件,它会很快增长到一个巨大的大小,并且如果我们启用覆盖模式(AppendMetricsToTextFile = false;) - 我们没有解决如果没有人可以选择保存度量的问题现在起来。

也许您知道如何通过电报与另一个图书馆交朋友?

我很想阅读您的解决方案并感谢任何建议。

上:App Metrics 的最新进展 - 设法打开端点 https://{my-site}/metrics(以 JSON 格式返回指标)和 https://{my-site}/metrics-text(以格式化文本返回指标) . https://{my-site}/env 仍然不起作用。这并不能解决在代理未运行时存储指标的问题,但有些东西已经存在。我要去看看电报。也许代理可以在家里积累指标,直到它发送。

Up:找到允许从 Prometeus 和其他客户端读取指标的电报配置。现在我正在为 Zabbix 代理寻找类似的配置。一切准备就绪后,我将在答案中发布详细信息。

Ap:在 Zabbix 代理配置中有一个以下格式的 UserParameter: UserParameter=<ключ>,<powershell команда/скрипт>,这使得收集数据成为可能,例如,通过对我们的端点的 http 请求/metrics,但这是两难的。我真的不想使用 app-metrics,因为它还没有真正为 ASP.NET Core 3+ 做好准备,而且普罗米修斯的输出是愚蠢的文本。有人知道如何将 prometheus 输出转换为 JSON,以便使用 pavershell 脚本对其进行解析并将正确格式的字符串从脚本返回到 zabbix?

asp.net-core
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Dmytro
    2020-04-15T05:55:33Z2020-04-15T05:55:33Z

    正如问题本身已经说明的那样 - 我仍然使用 App Metrics 库(https://www.app-metrics.io)。即,以下软件包(目前最相关):

    Install-Package App.Metrics -Version 4.0.0-preview1.0.7
    Install-Package App.Metrics.AspNetCore 4.0.0-preview1.0.7
    Install-Package App.Metrics.AspNetCore.Endpoints 4.0.0-preview1.0.7
    Install-Package App.Metrics.AspNetCore.Mvc 4.0.0-preview1.0.7
    Install-Package App.Metrics.AspNetCore.Tracking 4.0.0-preview1.0.7
    Install-Package App.Metrics.Extensions.Configuration 4.0.0-preview1.0.7
    Install-Package App.Metrics.Extensions.Hosting 4.0.0-preview1.0.7
    Install-Package App.Metrics.Formatters.InfluxDB 4.0.0-preview1.0.7
    Install-Package App.Metrics.Reporting.InfluxDB 4.0.0-preview1.0.7
    

    在这个包的预览版中,一切都运行稳定。到目前为止,还没有发现任何错误。我决定暂时不使用 helschecks,但仅用于指标。我在对问题的最后一条评论Ap -e 中使用 Zabbix 。

    我使用Telegraf代理作为代理。电报可以累积收集到的指标并延迟发送,这样如果出现网络问题或数据库不可用,它会缓存这些指标。

    下面我将给出一个实现的例子,但是我是在一个商业项目上写的,我必须删除很多,只留下与主题相关的内容以及取自开源的内容。我希望我不会错过任何东西。嗯......仍然有点潮湿,但它的工作原理。

    程序.sc:

    public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                .UseInfluxDbReporter()
                .UseMetrics()
                .UseMetricsEndpoints()
                .UseMetricsWebTracking()
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    
    private static IHostBuilder UseInfluxDbReporter(this IHostBuilder hostBuilder)
    {
        var filter = new MetricsFilter();
        filter.WhereContext(c => c == MetricsRegistry.Context);
        hostBuilder.ConfigureMetricsWithDefaults(builder =>
        {
            builder.Filter.With(filter);
            builder.Report.ToInfluxDb(options =>
            {
                // адрес Telegraf-агента
                options.InfluxDb.BaseUri = new Uri("http://localhost:8186"); 
                options.InfluxDb.Database = "appmetricsdb";
                options.InfluxDb.Consistenency = "any";
                options.InfluxDb.UserName = "admin";
                options.InfluxDb.Password = "Password";
                options.InfluxDb.RetentionPolicy = "autogen";
                options.InfluxDb.CreateDataBaseIfNotExists = true;
                options.HttpPolicy.BackoffPeriod = TimeSpan.FromSeconds(30);
                options.HttpPolicy.FailuresBeforeBackoff = 5;
                options.HttpPolicy.Timeout = TimeSpan.FromSeconds(10);
                options.MetricsOutputFormatter = 
                         new MetricsInfluxDbLineProtocolOutputFormatter();
                options.Filter = filter;
                options.FlushInterval = TimeSpan.FromSeconds(1);
            });
        });
        return hostBuilder;
    }
    

    启动.cs:

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }
    
    public IConfiguration Configuration { get; }
    
    public void ConfigureServices(IServiceCollection services)
    {
        var metrics = new MetricsBuilder()             
            .Configuration.ReadFrom(Configuration)
            .Configuration.Configure(options =>
            {
                // Пишу все метрики в один контекст, но вы можете не добавлять это поле
                // В таком случае - в "Application.HttpRequests" 
                // будут записаны метрики по умолчанию
                // а в ваши в контекст, который вы укажете в appsettings.json
                options.DefaultContextLabel = "Application.HttpRequests";
            })
            .OutputMetrics.AsInfluxDbLineProtocol()
            .Build();
        services.AddMetricsTrackingMiddleware(Configuration);
        services.AddMetricsEndpoints(Configuration);
        services.AddMetricsReportingHostedService();
        services.AddMetricsAuthorization();
        // configure sending scheduler:
        UseReporterScheduler(metrics);
        services.AddMetrics(metrics);
        services.AddControllers().AddMetrics(); 
    }
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseMetricsAllMiddleware();
        app.UseMetricsAllEndpoints();
    
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
    
        app.UseHttpsRedirection();
    
        app.UseRouting();
    
        app.UseAuthorization();
    
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
    
    private static void UseReporterScheduler(IMetricsRoot metrics, int schedulerInterval = 5)
    {
        var scheduler = new AppMetricsTaskScheduler(TimeSpan.FromSeconds(schedulerInterval),
            () =>
            {
                return Task.WhenAll(metrics.ReportRunner.RunAllAsync());
    
            });
        scheduler.Start();
    }
    

    appsettings.json:

    "MetricsOptions": {
          "Enabled": true,
          "ReportingEnabled": true
        },
        "MetricsWebTrackingOptions": {
          "ApdexTrackingEnabled": true,
          "ApdexTSeconds": 0.1,
          "IgnoredHttpStatusCodes": [ 404 ],
          "IgnoredRoutesRegexPatterns": [],
          "OAuth2TrackingEnabled": false
        },
        "MetricEndpointsOptions": {
          "MetricsEndpointEnabled": true,
          "MetricsTextEndpointEnabled": true,
          "EnvironmentInfoEndpointEnabled": true
        }
    

    此外,您还可以使用各种指标来衡量单个操作,但对于初学者,我建议您构建这样一个项目,运行它,发出几个请求(希望其中有不成功的请求)并打开地址https://localhost:port/ 指标 在您的情况下,收集的指标可能就足够了。

    配置输入插件Telegraf -代理:

    # # Influx HTTP write listener
    [[inputs.http_listener]]
      ## Address and port to host HTTP listener on
      service_address = ":8186"
    
      ## timeouts
      read_timeout = "10s"
      write_timeout = "10s"
    
      ## HTTPS
      #tls_cert= "/etc/telegraf/cert.pem"
      #tls_key = "/etc/telegraf/key.pem"  
    
      ## MTLS
      #tls_allowed_cacerts = ["/etc/telegraf/clientca.pem"]
    
      ## Basic authentication
      #basic_username = "foobar"
      #basic_password = "barfoo"
    

    此配置将允许您捕获来自应用程序的请求,并且已经在您指定要将数据发送到哪里的输出插件中。默认情况下,我什么都有,除了服务器地址,所以没什么意思。

    接下来,为了可视化数据,我使用了以下 graphana 模板: https ://grafana.com/grafana/dashboards/2125

    它有它的缺点,但它是一个很好的测试模板,因为它的大多数图表都可以立即工作,而且你会知道它有效。这是一个小片段: 在此处输入图像描述

    如果没有数据,我们按顺序进行:

    1. 我们放了一个提琴手,在启动时我们改变了这一行:

      options.InfluxDb.BaseUri = new Uri("http://localhost:8186");

      对此:

      options.InfluxDb.BaseUri = new Uri("http://localhost.fiddler:8186");

    不要忘记您可能有不同的端口。我们启动应用程序,打开提琴手,看看它是否向电报发送数据。如果一切正常:

    1. 安装 Chronograf:https ://docs.influxdata.com/chronograf/v1.8/ 这是一个相当简单的实用程序,可以连接到您的 InfluxDB 并显示您在那里飞行的内容。如果没有数据看电报输出插件,如果有数据看grafana中的数据源。
    • 0

相关问题

  • 即使在 VS 中一切正常,Azure 中的错误 500

  • IIS 无法启动

  • JB Rider下Linux机器上的ASP.NET Core应用开发

  • 通过 ngrok 和 vpn 在本地机器上运行机器人

  • 为什么启动应用程序时会转到地址***/Home/User/2?

  • 无法将自定义字段添加到 UserIdentity

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5