首页 > 编程语言 >使用 dotnet-monitor 诊断.NET应用程序

使用 dotnet-monitor 诊断.NET应用程序

时间:2023-11-13 22:45:55浏览次数:37  
标签:MyEventSource monitor counter custom systemruntime dotnet NET my

生产环境中收集诊断信息

在生产环境中,收集诊断信息(如跟踪、日志、度量和转储)可能具有挑战性。通常,必须访问环境,安装一些工具,然后收集信息。dotnet-monitor 简化并统一了收集诊断信息的方式,通过暴露一个 REST API,无论您的应用程序在哪里执行(在您的本地机器上,内部服务器上,或在 Kubernetes 集群内)。根据我们的需求,dotnet-monitor 可能会替代其他 .NET 诊断工具,如 dotnet-counters、dotnet-dump、dotnet-gcdump 和 dotnet-trace,特别是在信息收集的上下文中。

设置

我们可以使用以下命令将其安装为全局工具:

dotnet tool install --global dotnet-monitor --version 8.0.0-rc.2.23502.11
安装完成后,我们可以通过以下命令启动:

dotnet monitor collect --no-auth
dotnet-monitor 包括用于在 . 中浏览 API 表面的 Swagger UI。要测试工具,我们将使用一个标准的 .NET 应用程序。运行以下命令:

dotnet new web - o DotNetMonitorSandBox
dotnet new sln - n DotNetMonitorSandbox
dotnet sln add --in-root DotNetMonitorSandBox

Processes

Processes API 列出了可以检测到的进程并获取它们的元数据。打开浏览器并导航到 https://localhost:52323/processes 以列出可用的进程(确保您已运行我们的示例应用程序):

[
  {
    "pid": 19828,
    "uid": "66140161-2208-4e7c-b874-79aa037d4344",
    "name": "dotnet",
    "isDefault": false
  },
  {
  "pid": 57388,
    "uid": "2b0aba55-1579-41a5-b6a7-c1575650352a",
    "name": "DotNetMonitorSandBox",
    "isDefault": false
  }
]

属性表示进程的 ID。属性在进程运行在进程 ID 可能不唯一的环境中(例如,在 Kubernetes pod 内的多个容器将具有进程 ID 为 1 的入口点进程)时,对于唯一标识进程非常有用。导航到 https://localhost:52323/process?pid={pid} 以查看更多信息或获取指定进程的环境变量。

Logs

Logs API 使我们能够收集记录到 ILogger<> 基础结构的日志。打开 Program.cs 文件并更新内容如下:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () =>
{
  app.Logger.LogInformation("Hello World!");
  return "Hello World!";
});

app.Run();

运行应用程序并导航到 https://localhost:52323/logs?pid={pid}&durationSeconds=60 以在接下来的 60 秒内实时查看我们的日志记录。

Traces

Traces API 使我们能够收集格式化的跟踪。要使用预定义的跟踪配置文件集(如 Cpu、HttpLogs、Metrics)捕获进程的跟踪,请导航到 https://localhost:52323/trace?pid={pid}&durationSeconds=60 并等待获取 .nettrace 文件。打开 Program.cs 文件并更新内容如下:

using System.Diagnostics.Tracing;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () =>
{
app.Logger.LogInformation("Hello World!");
MyEventSource.Log.Request("Hello World!");
return "Hello World!";
});

app.Run();

[EventSource(Name = "MyEventSource")]
public sealed class MyEventSource : EventSource
{
    public static MyEventSource Log { get; } = new MyEventSource();

    [Event(1, Level = EventLevel.Informational)]
    public void Request(string message)
    {
        WriteEvent(1, message);
    }
}

要捕获自定义事件提供程序的跟踪,我们需要对相同的端点进行 POST 调用,并使用以下请求正文:

{
    "Providers": [{
        "Name": "MyEventSource",
        "EventLevel": "Informational"
    }],
    "BufferSizeInMB": 1024
}

在 Windows 上,.nettrace 文件可以在 PerfView 中查看以进行分析,或在 Visual Studio 中查看。

Metrics

Metrics API 获取单个进程的 Prometheus 暴露格式的度量快照(pid 将通过配置设置)。dotnet-monitor 可以从多个来源读取和合并配置。Windows 的文件设置路径为 %USERPROFILE%.dotnet-monitor\settings.json。因此,让我们用以下内容更新文件(如果不存在,请创建它):

{
  "DefaultProcess": {
    "Filters": [{
        "Key": "ProcessId",
      "Value": "<pid>"
    }]
  },
}

配置将自动被 dotnet-monitor 加载。默认情况下,收集的度量来自以下提供程序:

System.Runtime
Microsoft.AspNetCore.Hosting
Grpc.AspNetCore.Server
导航到 https://localhost:52323/metrics 查看类似于以下的输出:

# HELP systemruntime_cpu_usage_ratio CPU Usage
# TYPE systemruntime_cpu_usage_ratio gauge
systemruntime_cpu_usage_ratio 0 1699198374885
systemruntime_cpu_usage_ratio 0 1699198379898
systemruntime_cpu_usage_ratio 0 1699201002325
# HELP systemruntime_working_set_bytes Working Set
# TYPE systemruntime_working_set_bytes gauge
systemruntime_working_set_bytes 63393792 1699198364894
systemruntime_working_set_bytes 63401984 1699198369888
systemruntime_working_set_bytes 63418368 1699198374885
# HELP systemruntime_gc_heap_size_bytes GC Heap Size
# TYPE systemruntime_gc_heap_size_bytes gauge 
systemruntime_gc_heap_size_bytes 7085504 1699198364894 
systemruntime_gc_heap_size_bytes 7093696 1699198369888 
systemruntime_gc_heap_size_bytes 7110080 1699198374885

dotnet-monitor 支持 System.Diagnostics.Metrics(.NET 8 应用程序)基于 API 和 EventCounters(您可以在这里查看度量 API 之间的区别)。由于我们使用的是 .NET 7,我们将按如下方式修改 Program.cs 文件:

using System.Diagnostics.Tracing;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () =>
{
app.Logger.LogInformation("Hello World!");
MyEventSource.Log.Request("Hello World!");
return "Hello World!";
});

app.Run();

[EventSource(Name = "MyEventSource")]
public sealed class MyEventSource : EventSource
{
    public static MyEventSource Log { get; } = new MyEventSource();

    private EventCounter _counter;

    public MyEventSource()
    {
        _counter = new EventCounter("my-custom-counter", this)
        {
            DisplayName = "my-custom-counter",
            DisplayUnits = "ms"
        };
    }

    [Event(1, Level = EventLevel.Informational)]
    public void Request(string message)
    {
        WriteEvent(1, message);
        _counter.WriteMetric(1);
    }
}

要捕获自定义事件提供程序的度量,我们需要修改 settings.json 文件,如下所示:

{
  "Metrics": {
    "Providers": [
      {
        "ProviderName": "MyEventSource",
        "CounterNames": [
          "my-custom-counter"
        ]
      }
    ]
  },
  "DefaultProcess": {
    "Filters": [{
        "Key": "ProcessId",
      "Value": "<pid>"
    }]
  },
}

Live Metrics

Live Metrics API 为所选进程捕获度量(与度量部分中列出的相同默认提供程序)。导航到 https://localhost:52323/livemetrics?pid={pid}&durationSeconds=60 并等待获取 .json 文件。要捕获自定义事件提供程序的实时度量,我们需要对同一端点进行调用,并使用以下请求正文:

{
    "includeDefaultProviders": false,
    "providers": [
        {
        "providerName": "MyEventSource",
            "counterNames": [
                "my-custom-counter"
            ]
        }
    ]
}

输出将类似于以下内容:

{"timestamp":"2023-11-05T18:52:32.5333078-05:00","provider":"MyEventSource","name":"my-custom-counter","displayName":"my-custom-counter","unit":"ms","counterType":"Metric","tags":"","value":1}
{ "timestamp":"2023-11-05T18:52:37.5321623-05:00","provider":"MyEventSource","name":"my-custom-counter","displayName":"my-custom-counter","unit":"ms","counterType":"Metric","tags":"","value":1}
{ "timestamp":"2023-11-05T18:52:42.5360839-05:00","provider":"MyEventSource","name":"my-custom-counter","displayName":"my-custom-counter","unit":"ms","counterType":"Metric","tags":"","value":1}
{ "timestamp":"2023-11-05T18:52:47.5309596-05:00","provider":"MyEventSource","name":"my-custom-counter","displayName":"my-custom-counter","unit":"ms","counterType":"Metric","tags":"","value":1} { "timestamp":"2023-11-05T18:52:52.5323712-05:00","provider":"MyEventSource","name":"my-custom-counter","displayName":"my-custom-counter","unit":"ms","counterType":"Metric","tags":"","value":1} { "timestamp":"2023-11-05T18:52:57.5310386-05:00","provider":"MyEventSource","name":"my-custom-counter","displayName":"my-custom-counter","unit":"ms","counterType":"Metric","tags":"","value":1}

Dump

Dump API 在不使用调试器的情况下捕获指定进程的托管转储。导航到 https://localhost:52323/dump?pid={pid}&durationSeconds=60 并等待获取 .dmp 文件(在收集转储时,应用程序将被挂起)。转储文件可以使用诸如 dotnet-dump 或 Visual Studio 之类的工具进行分析。在捕获时,转储文件不能在具有不同操作系统/架构的计算机上进行分析。

GCDump

GCDump API 捕获指定进程的 GC 转储。导航到 https://localhost:52323/gcdump?pid={pid}&durationSeconds=60 并等待获取 .gcdump 文件。除了 Visual Studio 外,我们还可以使用 PerfView 分析 gcdump 文件,并使用 dotnet-gcdump 生成报告。与转储文件不同,gcdump 文件是一种可移植格式,无论在哪个平台上收集,都可以进行分析。

标签:MyEventSource,monitor,counter,custom,systemruntime,dotnet,NET,my
From: https://www.cnblogs.com/MrChuJiu/p/17830492.html

相关文章

  • 推荐.Net 必须学习的几个库
    实体框架(EntityFramework)实体框架(EF)是微软为.NET应用程序提供的主要数据访问技术,它提供了一个对象关系映射器(ORM),使得.NET开发者可以使用.NET对象来操作数据库。EF通过将复杂的SQL查询抽象为.NET对象集合来简化数据库操作。EF的关键功能包括:通过配置将.NET类映射......
  • .NET快速对接极光消息推送
    什么是消息推送?很多手机APP会不定时的给用户推送消息,例如一些新闻APP会给用户推送用户可能感兴趣的新闻,或者APP有更新了,会给用户推送是否选择更新的消息等等,这就是所谓的“消息推送”。更多APP消息推送的介绍可查阅该篇文章:十分钟带你了解APP消息推送(Push)......
  • Azure DevOps 发布.Net项目到Windows IIS站点之通过公网IP(账号、密码)
    在AzureDevOps中通过指定公网IP发布代码到指定目录#ASP.NETCore(.NETCore7.0)#BuildandtestASP.NETCoreprojectstargeting.NETCore7.0.#Addstepsthatpublishsymbols,savebuildartifacts,andmore:#https://docs.microsoft.com/azure/devops/pipeli......
  • Azure DevOps 发布.Net项目到Windows IIS站点之Azure项目发布内网VM
    当你有一个需求,需要通过AzureDevOps发布到一个没有公网的VM的时候,你将需要使用以下脚本trigger:-masterpool:vmImage:'windows-2022'variables:-name:Build.ArtifactStagingDirectoryvalue:'$(Build.Repository.LocalPath)\artifacts'-name:buildConf......
  • 【Azure Storage Blob】如何通过.NET Azure Storage Blobs SDK获取到Blob的MD5值呢?
    问题描述通过.NETAzureStorageBlobsSDK,获取Blob的MD5值,查看了Azure操作手册中,介绍可以使用 blob.Properties.ContentMD5属性。//blob文件测试CloudBlobClientblobClient=storageAccount.CreateCloudBlobClient();CloudBlobContainercontainer=blobClient......
  • .NET之默认依赖注入 注入方式(构造函数注入、FromServices操作注入)和 获取服务(Contr
    .NET之默认依赖注入注入方式(构造函数注入、FromServices操作注入)和获取服务(Controller构造函数中注入获取、IServiceProvider获取、statrup中获取服务)介绍领券https://www.cps3.cn/不要依赖于具体的实现,应该依赖于抽象,高层模块不应该依赖于底层模块,二者应该依赖于抽......
  • 使用.NET Core创建Windows服务
    使用.NETCore创建Windows服务1.创建一个新的WorkerService项目打开命令行工具(例如:PowerShell、CMD、或者终端),然后输入以下命令创建一个新的WorkerService项目:dotnet new worker -n MyWorkerService这个命令将会创建一个名为"MyWorkerService"的新项目。2.添加必要的NuGe......
  • .NET Web API 详解
    当涉及到.NETWebAPI时,这是Microsoft提供的一个框架,用于构建可以被各种客户端消费的HTTP服务,包括浏览器、移动设备和桌面应用程序。它是ASP.NET平台的一部分,旨在简化构建RESTfulWebAPI的过程。以下是.NETWebAPI的一些关键概念和特性:RESTful服务:WebAPI建立在Representational......
  • Intel黑客松大赛——EfficientNet分类
    1.模型介绍为什么选用EfficientNet为什么选用EfficientNet呢?EfficientNet是一种高效的卷积神经网络架构,具有以下优势:更高的准确率:EfficientNet在ImageNet数据集上取得了更好的准确率,相比其他网络结构,参数更少,模型更小,但是性能更好。更高的计算效率:EfficientNet在保持准确率的......
  • 使用PageHelper.startPage时 net.sf.jsqlparser.parser.ParseException: Encountered
    使用PageHelper.startPage时net.sf.jsqlparser.parser.ParseException:Encountered解决方案对比代码:原来的写法:PageHelper.startPage(page,size,order);List<xxx>list=xxxMapperExt.selectxxx(id,type);修改之后:PageHelper.startPage(page,size);List<xxx>list=xxxM......