.NET 帮助

OpenTelemetry .NET(如何为开发者工作)

介绍

创建动态、数据驱动、内容丰富的 PDF 文档是现代软件开发中许多领域的典型需求。 无论是创建账单、报告还是文档,企业都非常依赖于快速生成高质量 PDF 的能力。 然而,随着应用程序的复杂化和大型化,跟踪和理解 PDF 生产流程的有效性对于维护应用程序的健康和确保用户的愉悦度至关重要。

本文旨在讨论开发人员如何利用 IronPDF 和 OpenTelemetry.NET 的功能改进 PDF 生成操作,并提供有关应用程序性能的重要见解。 我们将探讨这两种技术的特点和优势,并展示它们如何协调合作,以优化 .NET 应用程序中 PDF 的创建和监控。

什么是 OpenTelemetry?

OpenTelemetry 是一个厂商中立的可观测性框架,专为云原生应用程序而创建。OpenTelemetry 自动仪器提供了一个单一的 API,用于收集遥测信息,包括日志、跟踪和指标。 利用这些广泛的数据,开发人员可以有效地调试问题、找出性能瓶颈并全面了解程序行为。 OpenTelemetry 支持自动和手动仪器,可进行全面、灵活的遥测数据采集。

OpenTelemetry 的主要组件

  • API:为了对应用程序进行检测和生成遥测数据,OpenTelemetry指定了一套标准化的API。这使检测过程更加简单,并确保在不同的编程语言之间保持一致性。
  • SDKs:为了对应用程序进行检测,OpenTelemetry 提供了专门针对某些语言的 SDK。 在 .NET SDK 的帮助下,开发人员可以轻松地将 OpenTelemetry 功能集成到他们的 .NET 项目中。
  • 导出器:这些部分负责将收集的遥测数据传输到后端系统,以便存储和分析。 OpenTelemetry 支持许多广泛使用的后端系统的导出器,例如 Zipkin(追踪)、Prometheus(指标)和 Jaeger(追踪)。
  • 自动化仪表:这种方法简化了 .NET Core 应用程序的过程。 OpenTelemetry 库可以自动捕获网络应用程序或服务中常见操作的数据。这消除了手动代码修改,简化了集成过程。
  • 手动测量:为了对数据收集进行细粒度控制,OpenTelemetry 提供了用于手动测量的强大 API。 通过这种方法,您可以捕捉到与您独特的应用程序逻辑相关的特定指标和跟踪。 对于 .NET Framework 应用程序或自动仪器无法满足您特定需求的场景,它尤其有用。

在 .NET 中使用 OpenTelemetry 的好处

将 OpenTelemetry 集成到您的 .NET 应用程序中具有以下几个优势:

  • 供应商中立性:OpenTelemetry 提供灵活性,并通过与多种后端系统无缝集成来使您的应用程序具有未来适应性。 您的仪器代码无需更改即可切换后端系统。
  • 标准化方法:一致的API使得为应用程序的各个区域提供工具变得更加容易。 开发人员可以使用相同的 API 来收集日志、跟踪和指标,从而使代码更易于阅读和维护。
  • 深入的性能分析:OpenTelemetry 提供了丰富的数据(指标、追踪和日志),用于全面的性能分析。 通过这种包罗万象的视角,您可以找到需要优化的地方,并确定问题的根源。
  • 更好的故障排除:开发人员通过使用OpenTelemetry捕获的丰富跟踪数据,更容易检测和修复应用程序中的请求路径问题。
  • 改进的可扩展性:您应用程序的复杂性不会阻碍OpenTelemetry的扩展能力。 新的功能或服务可以在不需要修改大量代码的情况下随时使用。

创建和配置 OpenTelemetry

在 ASP.NET 应用程序中配置 OpenTelemetry

OpenTelemetry 需要在您的应用程序中进行配置; 对于 ASP.NET Core 应用程序,这通常在 Startup.cs 文件的 ConfigureServices 方法中完成。以下是 Jaeger 导出器配置的示例:

using OpenTelemetry.Trace;
using OpenTelemetry.Exporter.Jaeger;
using OpenTelemetry.Resources;

public void ConfigureServices(IServiceCollection services)
{
    // Configure OpenTelemetry
    builder.Services.AddOpenTelemetry().WithTracing(options =>
    {
        // Configure Jaeger exporter
        // serviceName we can read from environment variables
        options
            .SetResourceBuilder(
                ResourceBuilder.CreateDefault()
                    .AddService(serviceName))
            .AddAspNetCoreInstrumentation().AddJaegerExporter(opt =>
            {
                opt.AgentHost = "localhost"; // Jaeger agent host
                opt.AgentPort = 14250; // Jaeger agent port
            });
    });
    // Other service configurations...
}
using OpenTelemetry.Trace;
using OpenTelemetry.Exporter.Jaeger;
using OpenTelemetry.Resources;

public void ConfigureServices(IServiceCollection services)
{
    // Configure OpenTelemetry
    builder.Services.AddOpenTelemetry().WithTracing(options =>
    {
        // Configure Jaeger exporter
        // serviceName we can read from environment variables
        options
            .SetResourceBuilder(
                ResourceBuilder.CreateDefault()
                    .AddService(serviceName))
            .AddAspNetCoreInstrumentation().AddJaegerExporter(opt =>
            {
                opt.AgentHost = "localhost"; // Jaeger agent host
                opt.AgentPort = 14250; // Jaeger agent port
            });
    });
    // Other service configurations...
}
Imports OpenTelemetry.Trace
Imports OpenTelemetry.Exporter.Jaeger
Imports OpenTelemetry.Resources

Public Sub ConfigureServices(ByVal services As IServiceCollection)
	' Configure OpenTelemetry
	builder.Services.AddOpenTelemetry().WithTracing(Sub(options)
		' Configure Jaeger exporter
		' serviceName we can read from environment variables
		options.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(serviceName)).AddAspNetCoreInstrumentation().AddJaegerExporter(Sub(opt)
				opt.AgentHost = "localhost" ' Jaeger agent host
				opt.AgentPort = 14250 ' Jaeger agent port
		End Sub)
	End Sub)
	' Other service configurations...
End Sub
$vbLabelText   $csharpLabel

将您的服务名称替换为serviceName。 根据 Jaeger 配置选项,更改 Jaeger 代理主机和端口。

添加 OpenTelemetry 中间件

您必须在 ASP.NET Core 应用程序中包含 OpenTelemetry 中间件,以获得对传入 HTTP 请求的自动监测。 在您的Startup.cs文件中的Configure方法中,添加中间件:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // Add OpenTelemetry middleware if we are using Prometheus
    app.UseHttpMetrics();
    // Other middleware configurations...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // Add OpenTelemetry middleware if we are using Prometheus
    app.UseHttpMetrics();
    // Other middleware configurations...
}
Public Sub Configure(ByVal app As IApplicationBuilder, ByVal env As IWebHostEnvironment)
	' Add OpenTelemetry middleware if we are using Prometheus
	app.UseHttpMetrics()
	' Other middleware configurations...
End Sub
$vbLabelText   $csharpLabel

开始跟踪

设置好一切后,OpenTelemetry 将开始跟踪传入的 HTTP 请求,并自行向配置好的 Jaeger 后端发送遥测信息。

验证和监控

您可以检查 Jaeger 后端的痕迹,以确认 OpenTelemetry 运行正常。 打开 Jaeger 用户界面(通常可以在 http://localhost:16686 找到 Jaeger UI)并查找与您的服务相关的跟踪。

选择后台系统(可选)

OpenTelemetry 并非基本仪器的必备工具,但它可与其他后端操作系统集成,以存储和处理遥测数据。 热门选项包括官方支持的操作系统:

  • Jaeger(追踪)
  • Prometheus(指标)
  • Zipkin(追踪)

入门

什么是IronPDF?

流行的 .NET 软件包IronPDF允许您在 .NET 程序中创建、编辑和呈现 PDF 文档。 使用 PDF 的功能很多,包括:将 HTML 页面转换为 PDF; 从 PDF 中提取文本和图像; 在已有的 PDF 文档中添加文本、图像和形状; 以及根据 HTML 内容、照片或原始数据制作 PDF。

IronPdf 的两大优势是易用和简单。 由于.NET 具有直观的 API 和全面的文档,开发人员可以毫不费力地开始在其 .NET 项目中创建 PDF。 IronPdf 的效率和速度是帮助开发人员快速高效地创建高质量 PDF 文档的附加特性。

IronPDF 的部分优势:

  • 根据 HTML、图片和原始数据制作 PDF 文件
  • 从 PDF 文件中提取文本和图片
  • 在 PDF 文件中加入水印、页眉和页脚
  • PDF 文件受加密和密码保护
  • 电子签名和填写表格的能力

安装 NuGet 软件包

多个 NuGet 包可用于 OpenTelemetry 的不同组件。 根据您的需要,您可以安装所需的软件包。 要将遥测数据发送到可观测性后端(如 Jaeger、Zipkin 或 Prometheus),至少需要 OpenTelemetry 包、用于应用程序框架(如 ASP.NET Core)的检测包,以及一个导出器包。 此外,请确保在您的项目中安装了 IronPDF 软件包。 要安装它,请使用 NuGet 软件包管理器控制台:

Install-Package OpenTelemetry
Install-Package OpenTelemetry.Instrumentation.AspNetCore
Install-Package OpenTelemetry.Exporter.Jaeger
Install-Package IronPdf

将 OpenTelemetry 与 IronPDF 结合使用

打开 ASP.NET Core 应用程序的 Startup.cs 文件以访问 ConfigureServices 函数。 要设置 IronPDF,请包含后续代码。

using IronPdf;

public void ConfigureServices(IServiceCollection services)
{
    // Configure IronPDF
    services.AddSingleton<HtmlToPdf>();
    // Other service configurations...
}
using IronPdf;

public void ConfigureServices(IServiceCollection services)
{
    // Configure IronPDF
    services.AddSingleton<HtmlToPdf>();
    // Other service configurations...
}
Imports IronPdf

Public Sub ConfigureServices(ByVal services As IServiceCollection)
	' Configure IronPDF
	services.AddSingleton(Of HtmlToPdf)()
	' Other service configurations...
End Sub
$vbLabelText   $csharpLabel

此代码通过将 IronPDF 的 HtmlToPdf 服务配置为单例,确保应用程序仅创建并使用 HtmlToPdf 的实例。

通过将 OpenTelemetry.NET 与 IronPDF 集成,您可以跟踪和观察 .NET 应用程序中的 PDF 生成过程。 让我们深入研究一下代码示例,一步一步地检查每一个步骤:

using Microsoft.AspNetCore.Mvc;
using OpenTelemetry.Trace;
using System.Diagnostics;
using System.Net;
using System.Net.Http.Headers;

namespace DemoWebApplication.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class DemoController : ControllerBase
    {
        private readonly HtmlToPdf _htmlToPdf;
        private readonly ILogger<WeatherForecastController> _logger;
        private readonly Tracer _tracer;

        public WeatherForecastController(ILogger<WeatherForecastController> logger, HtmlToPdf htmlToPdf, TracerProvider tracerProvider)
        {
            _tracer = tracerProvider.GetTracer("Demo");
            _htmlToPdf = htmlToPdf;
        }

        [HttpGet]
        public FileContentResult Generate()
        {
            string fileName = "Sample.pdf";
            var stream = GeneratePdf("Hello IronPDF");
            return new FileContentResult(stream, "application/octet-stream")
            {
                FileDownloadName = fileName
            };
        }

        private byte[] GeneratePdf(string htmlContent)
        {
            using (var activity = _tracer.StartActiveSpan("PDF Generation"))
            {
                var pdfDocument = _htmlToPdf.RenderHtmlAsPdf(htmlContent);
                var pdfBytes = pdfDocument.BinaryData;
                return pdfBytes;
            }
        }
    }
}
using Microsoft.AspNetCore.Mvc;
using OpenTelemetry.Trace;
using System.Diagnostics;
using System.Net;
using System.Net.Http.Headers;

namespace DemoWebApplication.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class DemoController : ControllerBase
    {
        private readonly HtmlToPdf _htmlToPdf;
        private readonly ILogger<WeatherForecastController> _logger;
        private readonly Tracer _tracer;

        public WeatherForecastController(ILogger<WeatherForecastController> logger, HtmlToPdf htmlToPdf, TracerProvider tracerProvider)
        {
            _tracer = tracerProvider.GetTracer("Demo");
            _htmlToPdf = htmlToPdf;
        }

        [HttpGet]
        public FileContentResult Generate()
        {
            string fileName = "Sample.pdf";
            var stream = GeneratePdf("Hello IronPDF");
            return new FileContentResult(stream, "application/octet-stream")
            {
                FileDownloadName = fileName
            };
        }

        private byte[] GeneratePdf(string htmlContent)
        {
            using (var activity = _tracer.StartActiveSpan("PDF Generation"))
            {
                var pdfDocument = _htmlToPdf.RenderHtmlAsPdf(htmlContent);
                var pdfBytes = pdfDocument.BinaryData;
                return pdfBytes;
            }
        }
    }
}
Imports Microsoft.AspNetCore.Mvc
Imports OpenTelemetry.Trace
Imports System.Diagnostics
Imports System.Net
Imports System.Net.Http.Headers

Namespace DemoWebApplication.Controllers
	<ApiController>
	<Route("[controller]")>
	Public Class DemoController
		Inherits ControllerBase

		Private ReadOnly _htmlToPdf As HtmlToPdf
		Private ReadOnly _logger As ILogger(Of WeatherForecastController)
		Private ReadOnly _tracer As Tracer

		Private Function WeatherForecastController(ByVal logger As ILogger(Of WeatherForecastController), ByVal htmlToPdf As HtmlToPdf, ByVal tracerProvider As TracerProvider) As Public
			_tracer = tracerProvider.GetTracer("Demo")
			_htmlToPdf = htmlToPdf
		End Function

		<HttpGet>
		Public Function Generate() As FileContentResult
			Dim fileName As String = "Sample.pdf"
			Dim stream = GeneratePdf("Hello IronPDF")
			Return New FileContentResult(stream, "application/octet-stream") With {.FileDownloadName = fileName}
		End Function

		Private Function GeneratePdf(ByVal htmlContent As String) As Byte()
			Using activity = _tracer.StartActiveSpan("PDF Generation")
				Dim pdfDocument = _htmlToPdf.RenderHtmlAsPdf(htmlContent)
				Dim pdfBytes = pdfDocument.BinaryData
				Return pdfBytes
			End Using
		End Function
	End Class
End Namespace
$vbLabelText   $csharpLabel

要为我们的应用程序生成追踪器实例,我们注入TracerProvider服务。 由Generate方法创建一个名为“PDF Generation”的OpenTelemetry活动,以象征当前正在进行的工作。 我们在活动中模仿一些工作(替换为您自己的逻辑)。 我们建立了一个称为work_duration_ms的直方图指标,用于监控工作的毫秒持续时间。 我们在指标中添加一个数据点,将其标记为“Demo”,值为“PDF Generation”,并记录持续时间(在此情况下为1000毫秒)。 标签为分析提供了额外的语境。

根据上述源代码生成 PDF 输出:

OpenTelemetry .NET(开发人员使用指南):图 1 - 利用 IronPDF 和 OpenTelemetry 生成的输出代码

以下是 Jaeger UI 生成的跟踪屏幕:

OpenTelemetry .NET(它如何为开发者工作):图 2 - Jaeger UI 生成的输出跟踪

结论

OpenTelemetry 是.NET 应用程序性能优化和健康状况监控的变革者。 它通过提供一种中立且标准化的方法来收集、分析和导出遥测数据(指标、跟踪和日志),使开发人员对其应用程序的内部运作有透彻的了解。

通过将 OpenTelemetry.NET 与 IronPDF 集成,开发人员可以改进创建 PDF 的工作流程,并深入了解应用程序的性能。 通过利用 OpenTelemetry.NET 实现手动检测 PDF 生成过程,开发人员可以跟踪执行路径、监控性能指标并精确定位需要优化的区域。 此外,通过将遥测数据导出到可观测性平台,可实现集中监控指标的收集和分析,从而使开发人员有能力维护其应用程序的健康并提供完美的用户体验。

OpenTelemetry.NET 实现与 IronPDF 的集成可以增强开发人员创建 PDF 的工作流程,并保证 .NET 应用程序的可扩展性、性能和可靠性。 这些技术的集成可以帮助开发人员满足现代软件开发的需求,无论是创建发票、报告还是文档,都能产生出色的结果。

如果以套餐形式购买,IronPDF 价格公道,并包含终身许可证。 该软件包的价值在于仅为$749,这是针对许多系统的一次性费用。 它为许可证持有者提供全天候在线工程支持。 请访问Iron Software网站了解有关收费的更多详细信息。 探索Iron Software 的产品,了解他们提供的解决方案。

Chipego
软件工程师
Chipego 拥有出色的倾听技巧,这帮助他理解客户问题并提供智能解决方案。他在 2023 年加入 Iron Software 团队,此前他获得了信息技术学士学位。IronPDF 和 IronOCR 是 Chipego 主要专注的两个产品,但他对所有产品的了解每天都在增长,因为他不断找到支持客户的新方法。他喜欢 Iron Software 的合作氛围,公司各地的团队成员贡献他们丰富的经验,以提供有效的创新解决方案。当 Chipego 离开办公桌时,你经常可以发现他在看书或踢足球。
< 前一页
DotNetOpenAuth .NET Core(开发人员工作原理)
下一步 >
Autofac .NET 6(它是如何为开发人员工作的)