跳過到頁腳內容
.NET幫助

OpenTelemetry .NET(對於開發者的運行原理)

簡介

建立動態、資料驅動、豐富的 PDF 文件是現代軟體開發許多領域的典型需求。 企業非常依賴快速產生高品質 PDF 的能力,不論是用於製作帳單、報告或文件。 然而,當應用程式愈來愈複雜、規模愈來愈大時,追蹤和理解 PDF 製作過程的有效性,對於維護應用程式的健康並確保使用者滿意度而言,變得至關重要。

本文旨在討論開發人員如何利用 IronPDF for .NET 和 OpenTelemetry.NET 的功能,改善 PDF 生成作業,並提供應用程式效能的重要洞察。 我們將探討這兩種技術的特點和優勢,並展示它們可如何和諧合作,以優化 .NET 應用程式中 PDF 的建立和監控。

什麼是 OpenTelemetry?

OpenTelemetry 是一個廠商中立的可觀測性架構,專為雲原生應用程式所打造。OpenTelemetry 自動儀器提供單一 API 用於收集遙測資訊,包括日誌、追蹤和度量。 透過使用這些廣泛的資料,開發人員可以有效地除錯問題、找出效能瓶頸,並全面瞭解程式行為。 OpenTelemetry 支援自動和手動儀器,以進行全面且彈性的遙測資料收集。

OpenTelemetry 的主要元件

  • API:為了偵測應用程式並產生遙測數據,OpenTelemetry 定義了一套標準化的 API。這簡化了檢測流程,並保證了不同程式語言之間的一致性。
  • SDK: 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 應用程式,這通常是在 ConfigureServices 檔案中的 Startup.cs 方法中完成的。以下是 Jaeger 匯出器設定的範例:

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

public void ConfigureServices(IServiceCollection services)
{
    // Configure OpenTelemetry
    services.AddOpenTelemetry().WithTracing(builder =>
    {
        // Configure Jaeger exporter. The 'serviceName' can be read from environment variables
        builder
            .SetResourceBuilder(
                ResourceBuilder.CreateDefault()
                    .AddService("YourServiceName"))
            .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
    services.AddOpenTelemetry().WithTracing(builder =>
    {
        // Configure Jaeger exporter. The 'serviceName' can be read from environment variables
        builder
            .SetResourceBuilder(
                ResourceBuilder.CreateDefault()
                    .AddService("YourServiceName"))
            .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
	services.AddOpenTelemetry().WithTracing(Sub(builder)
		' Configure Jaeger exporter. The 'serviceName' can be read from environment variables
		builder.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("YourServiceName")).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

請將 "YourServiceName" 替換為您服務的實際名稱。根據您的 Jaeger 設定選項調整 Jaeger 代理的主機和連接埠。

新增 OpenTelemetry 中介軟體

您必須在 ASP.NET Core 應用程式中加入 OpenTelemetry 中介軟體,才能自動偵測傳入的 HTTP 請求。 在您的 Startup.cs 檔案的 Configure 方法中,加入中間件:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // Add Prometheus metrics middleware if using Prometheus
    app.UseHttpMetrics();
    // Other middleware configurations...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // Add Prometheus metrics middleware if using Prometheus
    app.UseHttpMetrics();
    // Other middleware configurations...
}
Public Sub Configure(ByVal app As IApplicationBuilder, ByVal env As IWebHostEnvironment)
	' Add Prometheus metrics middleware if 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 專案中建立 PDF,因為它有直覺的 API 和全面的說明文件。 IronPDF 的效率和速度是幫助開發人員快速有效地建立高品質 PDF 文件的額外特點。

IronPDF 的部分優點:

  • 從 HTML、圖片和原始資料製作 PDF
  • 從 PDF 檔案擷取文字和圖片
  • 在 PDF 檔案中加入水印、頁首和頁尾
  • PDF 檔案受加密和密碼保護
  • 以電子方式簽署和填寫表格的能力

安裝 NuGet 套件

OpenTelemetry 的不同元件可使用多個 NuGet 套件。 根據您的需求,您可以安裝所需的套件。 若要將遙測資料傳送至可觀測性後端(例如 Jaeger、Zipkin 或 Prometheus),您至少需要 OpenTelemetry 套件、適用於您應用程式 Framework 的儀器套件(例如 ASP.NET Core),以及一個匯出套件。 此外,請確保您的專案中已安裝 IronPDF 套件。 若要安裝,請使用 NuGet 套件管理員控制台:

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

使用 IronPDF 進行 OpenTelemetry 測試

開啟 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 for .NET 來追蹤並觀察您的 .NET 應用程式中 PDF 的產生過程。 讓我們深入檢視這個程式碼範例,逐步檢視每個步驟:

using Microsoft.AspNetCore.Mvc;
using OpenTelemetry.Trace;
using System.Diagnostics;
using Microsoft.Extensions.Logging;
using IronPdf;

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

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

        [HttpGet]
        public FileContentResult Generate()
        {
            // Define the PDF file name
            string fileName = "Sample.pdf";

            // Generate PDF from HTML content
            _logger.LogInformation("Generating PDF...");
            var pdfBytes = GeneratePdf("Hello, IronPDF!");

            // Return the PDF as a file result
            return new FileContentResult(pdfBytes, "application/pdf")
            {
                FileDownloadName = fileName
            };
        }

        private byte[] GeneratePdf(string htmlContent)
        {
            // Start a tracing activity for PDF generation
            using (var activity = _tracer.StartActiveSpan("PDF Generation"))
            {
                var pdfDocument = _htmlToPdf.RenderHtmlAsPdf(htmlContent);

                // Log PDF generation
                _logger.LogInformation("PDF generated successfully.");

                return pdfDocument.BinaryData;
            }
        }
    }
}
using Microsoft.AspNetCore.Mvc;
using OpenTelemetry.Trace;
using System.Diagnostics;
using Microsoft.Extensions.Logging;
using IronPdf;

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

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

        [HttpGet]
        public FileContentResult Generate()
        {
            // Define the PDF file name
            string fileName = "Sample.pdf";

            // Generate PDF from HTML content
            _logger.LogInformation("Generating PDF...");
            var pdfBytes = GeneratePdf("Hello, IronPDF!");

            // Return the PDF as a file result
            return new FileContentResult(pdfBytes, "application/pdf")
            {
                FileDownloadName = fileName
            };
        }

        private byte[] GeneratePdf(string htmlContent)
        {
            // Start a tracing activity for PDF generation
            using (var activity = _tracer.StartActiveSpan("PDF Generation"))
            {
                var pdfDocument = _htmlToPdf.RenderHtmlAsPdf(htmlContent);

                // Log PDF generation
                _logger.LogInformation("PDF generated successfully.");

                return pdfDocument.BinaryData;
            }
        }
    }
}
Imports Microsoft.AspNetCore.Mvc
Imports OpenTelemetry.Trace
Imports System.Diagnostics
Imports Microsoft.Extensions.Logging
Imports IronPdf

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

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

		Public Sub New(ByVal logger As ILogger(Of DemoController), ByVal htmlToPdf As HtmlToPdf, ByVal tracerProvider As TracerProvider)
			_tracer = tracerProvider.GetTracer("Demo")
			_htmlToPdf = htmlToPdf
			_logger = logger
		End Sub

		<HttpGet>
		Public Function Generate() As FileContentResult
			' Define the PDF file name
			Dim fileName As String = "Sample.pdf"

			' Generate PDF from HTML content
			_logger.LogInformation("Generating PDF...")
			Dim pdfBytes = GeneratePdf("Hello, IronPDF!")

			' Return the PDF as a file result
			Return New FileContentResult(pdfBytes, "application/pdf") With {.FileDownloadName = fileName}
		End Function

		Private Function GeneratePdf(ByVal htmlContent As String) As Byte()
			' Start a tracing activity for PDF generation
			Using activity = _tracer.StartActiveSpan("PDF Generation")
				Dim pdfDocument = _htmlToPdf.RenderHtmlAsPdf(htmlContent)

				' Log PDF generation
				_logger.LogInformation("PDF generated successfully.")

				Return pdfDocument.BinaryData
			End Using
		End Function
	End Class
End Namespace
$vbLabelText   $csharpLabel

在這個範例中

  • 我們將 HtmlToPdfILoggerTracerProvider 注入 DemoController 中。
  • Generate 方法啟動檔案下載,返回一個動態建立的 PDF,內容為"你好,IronPDF!"。
  • GeneratePdf 方法使用 HtmlToPdf.RenderHtmlAsPdf 渲染 PDF 並輸出 PDF 的二進位資料。
  • 程式碼使用 OpenTelemetry 來追蹤 PDF 的產生過程,並記錄追蹤資料。

從上述原始碼產生 PDF 輸出:

OpenTelemetry .NET (How It Works For Developers):圖 1 - 上述程式碼利用 IronPDF 與 OpenTelemetry 所產生的輸出

以下是從 Jaeger UI 所產生的追蹤畫面:

OpenTelemetry .NET (How It Works For Developers):圖 2 - 從 Jaeger UI 產生的輸出軌跡

結論

OpenTelemetry 是 .NET 應用程式效能最佳化與健康監控的改變者。 它透過提供廠商中立且標準化的方法來收集、分析和匯出遙測資料(度量、軌跡和日誌),讓開發人員徹底了解其應用程式的內部運作。

透過將 OpenTelemetry.NET 與 IronPDF 整合,開發人員可以改善建立 PDF 的工作流程,並深入瞭解應用程式的效能。 透過利用 OpenTelemetry.NET 實作來手動檢測 PDF 產生程序,開發人員可以追蹤執行路徑、監控效能指標,並找出需要最佳化的區域。 此外,透過匯出遙測資料至可觀察性平台,可實現集中化的監控指標收集與分析,讓開發人員有能力維護應用程式的健康,並提供完美的使用者體驗。

OpenTelemetry.NET 實現和 IronPDF 的整合可以增強開發人員創建 PDF 的工作流程,並保證 .NET 應用程式的可擴展性、性能和可靠性。 這些技術的整合有助於開發人員滿足現代軟體開發的需求,並產生傑出的成果,無論是建立發票、報告或文件。

若以套裝形式購買,IronPDF 的價格相當合理,並包含終身授權。 該套餐物超所值,僅需 $999,對於許多系統而言,這是一次性費用。 它為授權持有人提供全天候的線上工程支援。 請造訪 Iron Software 網站,以瞭解更多收費詳情。 探索Iron Software 的產品,瞭解他們提供的解決方案。

常見問題解答

什麼是 OpenTelemetry,它如何增強 .NET 應用程式?

OpenTelemetry 是一個中立於供應商的可觀察性框架,專為雲原生應用程式設計。它透過提供標準化的 API 和 SDK 來增強 .NET 應用程式,以捕獲日誌、跟蹤和指標,這有助於診斷問題、識別性能瓶頸,並全面了解應用程式行為。

如何將 OpenTelemetry 與 ASP.NET Core 集成以進行自動儀器化?

可以通過在 `Startup.cs` 文件中配置服務和中介軟件將 OpenTelemetry 與 ASP.NET Core 集成,以啟用自動儀器化。這包括設置跟蹤和導出器,如 Jaeger,以傳輸遙測數據和監控應用程式性能。

IronPDF 在 .NET 應用程式的 PDF 生成中扮演什麼角色?

IronPDF 是一個 .NET 庫,簡化了在 .NET 應用程式中創建和操作 PDF。它支持將 HTML 轉換為 PDF、從 PDF 中提取文本,以及添加水印和加密等功能,使其成為處理 PDF 文檔的多功能工具。

開發人員如何使用 OpenTelemetry 跟蹤和分析 PDF 生成過程?

開發人員可以通過將 OpenTelemetry.NET 與 IronPDF 集成來跟蹤和分析 PDF 生成過程。這種集成允許收集和分析遙測數據,提供 PDF 生成工作流的見解,並幫助優化應用程式性能。

在 .NET 應用程式中使用 OpenTelemetry 與 IronPDF 有哪些好處?

在 .NET 應用程式中使用 OpenTelemetry 與 IronPDF 提供了多項優勢,包括改善應用程式擴展性、增強性能分析和優化 PDF 生成工作流。這一組合允許開發人員有效地監控和改善其應用程式的健康狀況。

開發人員如何在 ASP.NET Core 應用程式中使用 IronPDF 生成 PDF?

在 ASP.NET Core 應用程式中,開發人員可以將 `HtmlToPdf` 類注入控制器中,將 HTML 內容渲染為 PDF,然後以文件結果的形式返回生成的 PDF 以供下載。

OpenTelemetry 支持哪些後端系統的導出器?

OpenTelemetry 支持多種後端系統的導出器,包括用於跟蹤的 Jaeger、用於指標的 Prometheus 和用於跟蹤的 Zipkin。這些導出器能夠存儲和分析跨不同系統的遙測數據。

Jacob Mellor, Team Iron 首席技術官
首席技術官

Jacob Mellor是Iron Software的首席技術官,也是開創C# PDF技術的前瞻性工程師。作為Iron Software核心代碼庫的原始開發者,他自公司成立以來就塑造了公司的產品架構,並與CEO Cameron Rimington將公司轉型為服務NASA、Tesla以及全球政府機構的50多人公司。

Jacob擁有曼徹斯特大學土木工程一級榮譽學士學位(1998年–2001年)。他於1999年在倫敦開立首家軟體公司,並於2005年建立了他的第一個.NET組件,專注於解決Microsoft生態系統中的複雜問題。

他的旗艦作品IronPDF和Iron Suite .NET程式庫全球已獲得超過3000萬次NuGet安裝,他的基礎代碼不斷在全球各地驅動開發者工具。擁有25年以上的商業經驗和41年的編碼專業知識,Jacob仍然專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我