.NET 帮助

Opentelemetry C#(开发人员如何使用)

发布 2024年三月6日
分享:

OpenTelemetry是一套工具、API 和 SDK,可共同收集、处理和导出应用程序中的跟踪、度量和日志等遥测数据。 本教程旨在帮助初学者了解如何使用扩展方法在 C# 应用程序中集成 OpenTelemetry,重点是内置指标收集,以有效监控 .NET 应用程序。 我们还将了解用 C# 生成 PDF 的 IronPDF 库.

OpenTelemetry 简介

OpenTelemetry C#(如何为开发人员工作):图 1 - OpenTelemetry

OpenTelemetry该工具提供了一种从应用程序中收集各种数据的统一方法。 对于 .NET 开发人员来说,集成 OpenTelemetry 意味着您可以更密切地监控应用程序,了解它们的实时运行情况,并快速发现问题。 OpenTelemetry 的仪器库可自动跟踪 .NET 应用程序并收集指标。

通过 OpenTelemetry Framework 收集的指标,开发人员可以获得对 .NET 运行环境的宝贵见解。 OpenTelemetry .NET 实现支持 .NET 运行时,包括 .NET Core 和 .NET Framework。 它遵循 OpenTelemetry 协议,用于标准化遥测数据收集。

设置环境

首先,您需要在计算机上安装 .NET SDK。如果您使用的是 Visual Studio,它很可能自带 .NET SDK。 您可以打开命令行并运行以下命令来检查当前的 .NET SDK 版本:

dotnet --version

接下来,运行.NET Framework 3.0,创建一个新的 .NET Web 项目:

dotnet new web -o MyTelemetryApp
cd MyTelemetryApp

此命令将在名为 MyTelemetryApp 的目录下创建一个新的 ASP.NET Core 项目。

集成 OpenTelemetry

添加所需软件包

首先,将必要的 OpenTelemetry 软件包添加到您的项目中。 打开终端并导航到项目目录。 然后,使用 NuGet 软件包管理器 CLI 安装以下软件包:

dotnet add package OpenTelemetry -Version <version>
dotnet add package OpenTelemetry.Extensions.Hosting -Version <version>
dotnet add package OpenTelemetry.Instrumentation.AspNetCore -Version <version>
dotnet add package OpenTelemetry.Exporter.Console -Version <version>

更换 每个软件包的最新版本。

在应用程序中配置 OpenTelemetry

添加必要的软件包后,您需要在应用程序中配置 OpenTelemetry。 这包括设置 OpenTelemetry SDK 和指定要收集的遥测数据。 OpenTelemetry 提供可与 .NET 应用程序无缝集成的仪器库。

打开项目中的Startup.cs文件,修改ConfigureServices方法以包含OpenTelemetry,如下所示:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddOpenTelemetryTracing(builder =>
    {
        builder.AddAspNetCoreInstrumentation()
               .AddHttpClientInstrumentation()
               .AddConsoleExporter();
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddOpenTelemetryTracing(builder =>
    {
        builder.AddAspNetCoreInstrumentation()
               .AddHttpClientInstrumentation()
               .AddConsoleExporter();
    });
}
Public Sub ConfigureServices(ByVal services As IServiceCollection)
	services.AddControllers()
	services.AddOpenTelemetryTracing(Sub(builder)
		builder.AddAspNetCoreInstrumentation().AddHttpClientInstrumentation().AddConsoleExporter()
	End Sub)
End Sub
VB   C#

本代码片段展示了如何配置 OpenTelemetry 从 ASP.NET Core 应用程序和 HTTP 客户端调用中收集遥测数据,然后将这些数据导出到控制台。 AddAspNetCoreInstrumentation 方法可自动启用对传入 ASP.NET Core 应用程序的 HTTP 请求的检测。

收集指标

要收集指标,您还需要配置 OpenTelemetry Metrics API,重点是指标而不是跟踪。

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddOpenTelemetryMetrics(builder =>
    {
        builder.AddAspNetCoreInstrumentation()
               .AddHttpClientInstrumentation()
               .AddConsoleExporter(options => options.Targets = ConsoleExporterOutputTargets.Console);
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddOpenTelemetryMetrics(builder =>
    {
        builder.AddAspNetCoreInstrumentation()
               .AddHttpClientInstrumentation()
               .AddConsoleExporter(options => options.Targets = ConsoleExporterOutputTargets.Console);
    });
}
Public Sub ConfigureServices(ByVal services As IServiceCollection)
	services.AddControllers()
	services.AddOpenTelemetryMetrics(Sub(builder)
		builder.AddAspNetCoreInstrumentation().AddHttpClientInstrumentation().AddConsoleExporter(Sub(options) options.Targets = ConsoleExporterOutputTargets.Console)
	End Sub)
End Sub
VB   C#

此设置可从 ASP.NET Core 和 HTTP 客户端仪器中收集内置指标,并将其导出到控制台以方便查看。

创建自定义指标

虽然 OpenTelemetry 会自动收集许多有用的指标,但您可能还想收集针对自己应用程序的自定义指标。 利用仪器库提供的扩展方法不仅能自动收集遥测数据,还能让开发人员对发布的指标进行更精细的控制。 这可以通过手动检测代码来创建和记录自定义指标来实现。

var meter = new Meter("MyCustomMetrics", "1.0");
var counter = meter.CreateCounter<int>("custom_request_count", description: "Counts custom requests");
app.Use((context, next) =>
{
    counter.Add(1, new KeyValuePair<string, object>("path", context.Request.Path));
    return next();
});
var meter = new Meter("MyCustomMetrics", "1.0");
var counter = meter.CreateCounter<int>("custom_request_count", description: "Counts custom requests");
app.Use((context, next) =>
{
    counter.Add(1, new KeyValuePair<string, object>("path", context.Request.Path));
    return next();
});
Dim meter As New Meter("MyCustomMetrics", "1.0")
Dim counter = meter.CreateCounter(Of Integer)("custom_request_count", description:= "Counts custom requests")
app.Use(Function(context, [next])
	counter.Add(1, New KeyValuePair(Of String, Object)("path", context.Request.Path))
	Return [next]()
End Function)
VB   C#

本代码片段演示了如何创建一个自定义指标,用于统计对应用程序的请求,并用请求路径标记每个指标。 通过利用 OpenTelemetry 提供的扩展方法,开发人员可以对遥测数据收集过程进行更精细的控制。

测试集成

使用命令行或 Visual Studio 运行应用程序。 通过在网络浏览器中导航到应用程序的 URL 或使用 curl 等工具,向应用程序提出一些请求。 您应该看到遥测数据(包括跟踪和指标)被打印到控制台输出中。

curl http://localhost:5000

IronPDF 介绍

Opentelemetry C#(如何为开发人员工作):图 2 - IronPDF

IronPDF 是面向 C# 开发人员的强大库,可直接在 .NET 应用程序中生成、处理和渲染 PDF 文档。 这种能力尤其适用于生成报告、发票或任何其他文件。使用 HTML 从网络应用程序输出基于文档的内容IronPDF 可为开发人员的应用程序、服务或桌面应用程序提供支持。将 IronPDF 与 OpenTelemetry 相结合,开发人员就可以监控其应用程序中 PDF 生成过程的性能和可靠性,从而确保流畅的用户体验。

设置 IronPDF

首先,您需要将 IronPDF 添加到您的 .NET 项目中。 您可以使用 NuGet 软件包管理器来完成这项工作。 打开终端并导航到项目目录。 然后,运行以下命令安装 IronPDF:

dotnet add package IronPDF

使用 IronPDF 生成 PDF 并使用 OpenTelemetry 进行监控

以下是如何使用 OpenTelemetry 生成简单 PDF 文档并监控操作的示例。 下面的示例假定您已经在应用程序中配置了 OpenTelemetry(如前所述)。

using IronPdf;
using OpenTelemetry.Trace;
public class PdfService
{
    private readonly Tracer _tracer;
    public PdfService(Tracer tracer)
    {
        _tracer = tracer;
    }
    public void GeneratePdf()
    {
        // Create a new activity for this operation
        using var activity = _tracer.StartActivity("Generate PDF");
        // Simulate adding some attributes related to the operation
        activity?.SetTag("pdf.size", "A4");
        activity?.SetTag("pdf.content", "Hello World");
        try
        {
            // Initialize the PDF generator
            var renderer = new ChromePdfRenderer();
            // Generate a PDF from HTML
            var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
            // Save the PDF to a file
            var outputPath = "output.pdf";
            pdf.SaveAs(outputPath);
            // Log success
            activity?.SetTag("pdf.status", "Success");
            activity?.SetTag("pdf.outputPath", outputPath);
        }
        catch (Exception ex)
        {
            // Log any exceptions that occur during PDF generation
            activity?.SetTag("pdf.status", "Error");
            activity?.SetTag("pdf.error", ex.Message);
            throw;
        }
    }
}
using IronPdf;
using OpenTelemetry.Trace;
public class PdfService
{
    private readonly Tracer _tracer;
    public PdfService(Tracer tracer)
    {
        _tracer = tracer;
    }
    public void GeneratePdf()
    {
        // Create a new activity for this operation
        using var activity = _tracer.StartActivity("Generate PDF");
        // Simulate adding some attributes related to the operation
        activity?.SetTag("pdf.size", "A4");
        activity?.SetTag("pdf.content", "Hello World");
        try
        {
            // Initialize the PDF generator
            var renderer = new ChromePdfRenderer();
            // Generate a PDF from HTML
            var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
            // Save the PDF to a file
            var outputPath = "output.pdf";
            pdf.SaveAs(outputPath);
            // Log success
            activity?.SetTag("pdf.status", "Success");
            activity?.SetTag("pdf.outputPath", outputPath);
        }
        catch (Exception ex)
        {
            // Log any exceptions that occur during PDF generation
            activity?.SetTag("pdf.status", "Error");
            activity?.SetTag("pdf.error", ex.Message);
            throw;
        }
    }
}
Imports IronPdf
Imports OpenTelemetry.Trace
Public Class PdfService
	Private ReadOnly _tracer As Tracer
	Public Sub New(ByVal tracer As Tracer)
		_tracer = tracer
	End Sub
	Public Sub GeneratePdf()
		' Create a new activity for this operation
		Dim activity = _tracer.StartActivity("Generate PDF")
		' Simulate adding some attributes related to the operation
		If activity IsNot Nothing Then
			activity.SetTag("pdf.size", "A4")
		End If
		If activity IsNot Nothing Then
			activity.SetTag("pdf.content", "Hello World")
		End If
		Try
			' Initialize the PDF generator
			Dim renderer = New ChromePdfRenderer()
			' Generate a PDF from HTML
			Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>")
			' Save the PDF to a file
			Dim outputPath = "output.pdf"
			pdf.SaveAs(outputPath)
			' Log success
			If activity IsNot Nothing Then
				activity.SetTag("pdf.status", "Success")
			End If
			If activity IsNot Nothing Then
				activity.SetTag("pdf.outputPath", outputPath)
			End If
		Catch ex As Exception
			' Log any exceptions that occur during PDF generation
			If activity IsNot Nothing Then
				activity.SetTag("pdf.status", "Error")
			End If
			If activity IsNot Nothing Then
				activity.SetTag("pdf.error", ex.Message)
			End If
			Throw
		End Try
	End Sub
End Class
VB   C#

在本例中,我们创建了一个新的服务类 PDFService,其中包含一个用于生成 PDF 文档的方法 GeneratePdf。 我们使用 IronPDF 的 ChromePdfRenderer 类将 HTML 呈现为 PDF 文档。 通过 OpenTelemetry,我们启动了一个名为 "生成 PDF "的新活动来监控该操作。 我们在活动中添加了自定义标签,以提供有关 PDF 生成过程的额外上下文,例如 PDF 的大小、内容类型和输出路径。 我们还要捕捉任何异常情况,以便在同一活动中适当记录错误。

结论

Opentelemetry C#(如何为开发人员工作):图 3 - 许可证

将 OpenTelemetry 集成到您的 .NET 应用程序中,您就可以收集宝贵的遥测数据,深入了解应用程序的性能和行为。 按照本教程概述的步骤,您已经为 .NET 网络应用程序设置了基本的跟踪和指标收集功能。 通过探索更高级的 OpenTelemetry 功能,如将遥测数据导出到外部监控工具或收集日志以及跟踪和指标,进一步进行实验。

IronPDF 提供一个免费试用 IronPDF我们将在本文档的最后一部分中介绍我们的产品,以测试其全部功能。 许可证起价低至 399 美元。

< 前一页
C# Span(开发人员如何使用)
下一步 >
C# WebRTC(开发人员如何工作)

准备开始了吗? 版本: 2024.12 刚刚发布

免费NuGet下载 总下载量: 11,781,565 查看许可证 >