Dapr - 可觀測性
前言:
前篇 - Actor 構建塊 文章對 Dapr 的 Actor 構建塊進行了解,本篇繼續對可觀測性 進行了解學習。
一、可觀測性
用於獲取可觀察性的系統信息稱爲遙測。它可以分爲四大類:
-
分佈式跟蹤 提供有關分佈式業務事務中所涉及服務之間的流量的見解。
-
度量值 可讓你深入瞭解服務的性能及其資源消耗情況。
-
日誌記錄 可提供代碼的執行方式和錯誤發生的見解。
-
運行狀況 終結點可讓你深入瞭解服務的可用性。
Dapr 可觀察性構建基塊將可觀察性與應用程序分離。它自動捕獲由 Dapr 分支和 Dapr 系統服務生成的、構成 Dapr 控制平面的流量。塊將流量與跨多個服務的單個操作關聯起來。它還公開了系統的性能指標、資源使用情況和運行狀況。遙測以開放標準格式發佈,使信息可以送入你選擇的監視後端。在這裏,可以對信息進行可視化、查詢和分析。
由於 Dapr 抽象掉了該管道,因此應用程序不知道如何實現可觀察性。無需引用庫或實現自定義檢測代碼。Dapr 使開發人員能夠專注於構建業務邏輯,而不是可觀察性管道。可觀察性在 Dapr 系統級別配置,在服務之間保持一致,即使是由不同的團隊創建,並使用不同的技術堆棧構建。
二、工作原理
Dapr 的 Sidecar 啓用內置可觀察性功能。服務通信時,Dapr 分支會截獲流量並提取跟蹤、指標和日誌記錄信息。遙測以開放標準格式發佈。默認情況下,Dapr 支持 OpenTelemetry 和 Zipkin。
Dapr 提供可將遙測發佈到不同後端監視工具的 收集 器。這些工具提供了 Dapr 遙測用於分析和查詢。下圖 顯示了 Dapr 可觀察性體系結構:
步驟:
-
服務 A 調用服務 B 上的操作。調用將從服務 A 的 Dapr 挎鬥路由到服務 B 的挎鬥。
-
當服務 B 完成操作時,響應將通過 Dapr 分支發送回服務 A。它們收集併發布每個請求和響應的所有可用遙測數據。
-
配置的收集器引入遙測數據,並將其發送到監視後端。
三、特點
-
分佈式跟蹤
分佈式跟蹤提供了跨分佈式應用程序中的服務的流量的見解。交換請求和響應消息的日誌是用於解決問題的有用信息的來源。硬部分正在關聯屬於同一業務事務的_消息_ 。
Dapr 將 HTTP/GRPC Middleware 添加到 Dapr sidecar。Middleware 攔截所有 Dapr 和應用程序流量,並自動注入關聯 ID 以跟蹤分佈式事務。此設計有如下優點:
-
無需代碼檢測。所有流量都會自動跟蹤可配置的跟蹤級別。
-
跨微服務的一致跟蹤行爲。跟蹤是在 Dapr sidecar 上進行配置和管理的,因此它可以在服務之間保持一致,這些服務由不同的團隊提供,並可能以不同的編程語言編寫。
-
可配置和可擴展。通過利用 Zipkin API 和 OpenTelemetry 收集器,可以將 Dapr 追蹤配置爲與流行的追蹤後端配合使用,包括客戶可能有的自定義後端。
-
可以同時定義和啓用多個 Exporter
步驟:
-
服務 A 在服務 B 上調用操作。當服務 A 啓動調用時,Dapr 將創建一個唯一的跟蹤上下文並將其注入到請求中。
-
服務 B 接收請求,並對服務 C 調用操作。Dapr 檢測傳入請求包含跟蹤上下文,並通過將其注入到服務 C 的傳出請求來傳播。
-
服務 C 接收請求並對其進行處理。Dapr 檢測到傳入請求包含跟蹤上下文,並通過將其注入到服務 B 的傳出響應來傳播。
-
服務 B 接收響應並對其進行處理。然後,它會創建新的響應,並通過將跟蹤上下文注入到服務 A 的傳出響應來傳播跟蹤上下文。
Zipkin 是開源分佈式跟蹤系統。它可以攝取和可視化遙測數據。Dapr 提供對 Zipkin 的默認支持。以下爲默認支持的 dapr 設置
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: daprConfig
spec:
tracing:
##採樣率
samplingRate: "1"
zipkin:
##zipkin地址
endpointAddress: http://localhost:9411/api/v2/spans
-
指標
指標(Metrics)是在一段時間內收集和存儲的一系列度量值和計數。 Dapr 指標 提供監控功能,以瞭解 Dapr sidecar 和系統服務的行爲。例如,Dapr sidecar 和用戶應用之間的服務指標可以展示調用延遲、流量故障、請求的錯誤率等。Dapr 的系統服務度量 則可以顯示 sidecar 注入失敗,系統服務的運行狀況 (包括 CPU 使用率,actor 位置數量等)
每個 Sidecar 和系統服務都公開一個在端口 9090 上偵聽的指標終結點。Prometheus 指標 Scrapper 從每個終結點捕獲指標,並將信息發佈到監視後端。
Dapr 爲 Dapr 系統服務及其運行時生成一組大量指標。示例包括:
配置指標:
運行時,可以通過在 Dapr 命令中包含 參數來 --enable-metrics=false
禁用指標收集終結點。或者,還可使用 參數更改終結點的默認 --metrics-port 9090
端口。
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: dapr-config
namespace: dapr-trafficcontrol
spec:
tracing:
samplingRate: "1"
metric:
enabled: false
Prometheus 抓取器將指標收集併發布到監視後端後,如何理解原始數據?用於分析指標的常用可視化工具是 Grafana。使用 Grafana,可以從可用指標創建儀表板。
-
日誌記錄
Dapr 生成 日誌,以提供 sidecar 操作的可見性,並幫助用戶識別問題並執行調試。日誌事件包含由 Dapr 系統服務生成的警告,錯誤,信息和調試消息。
Dapr 以純文本形式或 JSON 格式生成結構化日誌到標準輸出。默認情況下,所有 Dapr 進程 (運行時和系統服務) 都以純文本寫入控制檯輸出。要啓用 JSON 格式的日誌,您需要在運行 Dapr 進程時添加 --log-as-json
命令標誌。
Dapr 基於以下結構生成日誌:
-
運行情況
Dapr 提供了一種使用 HTTP /healthz 端點來確定其健康狀況的方法。通過此端點,對 Dapr 進程或 sidecar 進行探測,可以確定其運行狀況,從而確定其就緒程度和活躍度。
GET http://localhost:3500/v1.0/healthz
在自承載模式下運行時,不會自動調用運行狀況 API。不過,可以從應用程序代碼或運行狀況監視工具調用 API。
在 Kubernetes 中運行時,Dapr sidecar-execut 會自動將 Kubernetes 配置爲使用運行狀況 API 執行運行情況 探測 和 就緒情況探測。
Kubernetes 使用運行狀態探測來確定容器是否已啓動並正在運行。如果運行情況探測返回失敗代碼,Kubernetes 將假定容器已死並自動重啓。此功能可提高應用程序的整體可用性。
Kubernetes 使用就緒情況探測來確定容器是否已準備好開始接受流量。當 Pod 的所有容器都準備就緒時,它被視爲已就緒。就緒情況確定 Kubernetes 服務是否可以在負載均衡方案中將流量引導到 Pod。未就緒的 Pod 會自動從負載均衡器中刪除。
livenessProbe:
httpGet:
path: v1.0/healthz
port: 3500
initialDelaySeconds: 5
periodSeconds: 10
timeoutSeconds : 5
failureThreshold : 3
readinessProbe:
httpGet:
path: v1.0/healthz
port: 3500
initialDelaySeconds: 5
periodSeconds: 10
timeoutSeconds : 5
failureThreshold: 3
以下參數可用於探測:
-
path
指定 Dapr 運行狀況 API 終結點。 -
指定
port
Dapr 運行狀況 API 端口。 -
指定 Kubernetes 在開始首次探測容器之前等待
initialDelaySeconds
的秒數。 -
periodSeconds
指定 Kubernetes 在每個探測之間等待的秒數。 -
指定 Kubernetes 在超時之前等待來自 API 的響應
timeoutSeconds
的秒數。超時被解釋爲失敗。 -
指定 Kubernetes 在考慮容器未處於活動狀態或未就緒之前將接受的失敗
failureThreshold
狀態代碼數。
四、.Net Core 應用
1、添加以下 Nuget 包:
注:版本很重要,NuGet 要打開包含預發行版,並且使用指定版本
OpenTelemetry-1.2.0-beta1
OpenTelemetry.Instrumentation.AspNetCore-1.0.0-rc8
OpenTelemetry.Instrumentation.Http-1.0.0-rc8
OpenTelemetry.Exporter.Zipkin-1.2.0-beta1
OpenTelemetry.Extensions.Hosting-1.0.0-rc8
2、修改 Startup 文件:添加監控
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddActors(option =>
{
option.Actors.RegisterActor<OrderStatusActor>();
});
//添加TelemetryTracing監控
services.AddOpenTelemetryTracing((tracerProviderBuilder) => tracerProviderBuilder
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("DaprBackEnd"))
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
//設置zipkin相關設置
.AddZipkinExporter(zipkinOptions => { zipkinOptions.Endpoint = new Uri("http://localhost:9411/api/v2/spans"); }
));
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
//開啓.Net的OpenTelemetry,然後修改Diagnostics.Activity的ParentId,讓當前的Tracing跟Dapr Sidecar傳來的TraceId一致
endpoints.Map("/Amazing", async (HttpContext context) =>
{
if (context.Request.Headers.TryGetValue("traceparent", out var traceparent))
{
Console.WriteLine($"TraceParent: {traceparent}");
}
if (context.Request.Headers.TryGetValue("tracestate", out var tracestate))
{
Console.WriteLine($"TraceState: {tracestate}");
}
System.Diagnostics.Activity.Current?.SetParentId(traceparent.ToString());
_ = await new HttpClient().GetStringAsync("https://www.baidu.com");
Console.WriteLine($"Invoke succeed: traceID:{traceparent}");
});
endpoints.MapControllers();
endpoints.MapActorsHandlers();
});
}
}
3、啓動 dapr 應用:
dapr run --dapr-http-port 3511 --app-port 8220 --app-id DaprBackEnd dotnet .\DaprBackEnd.dl
4、使用 Dapr CLI 命令:
dapr invoke --app-id DaprBackEnd --method /Amazing
5、查看檢測效果:
打開 Zipkin,地址:http://localhost:9411/
, 來看一下 Zipkin 的 Tracing
總結:
詳細的可觀察性在生產中運行分佈式系統至關重要。
Dapr 提供不同類型的遙測,包括分佈式跟蹤、日誌記錄、指標和運行狀況狀態。
Dapr 僅生成 Dapr 系統服務和分支的遙測。不會自動包含應用程序代碼中的遙測數據。不過,可以使用特定的 SDK (如 OpenTelemetry SDK for .NET)從應用程序代碼發出遙測數據。
Dapr 遙測採用基於開放標準的格式生成,因此可通過大量可用的監視工具來引入。示例包括 Zipkin、Azure 應用程序 Insights、ELK Stack、New Relic 和 Grafana。有關如何監視具有特定監視後端的 Dapr 應用程序的教程,請參閱 Dapr 文檔中的 監視應用程序 Dapr 。
參考:
https://docs.microsoft.com/zh-cn/dotnet/architecture/dapr-for-net-developers/observability
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/K8iYBfAaF6GC5eWvvD2__Q