其他分享
首页 > 其他分享> > 手把手教你学Dapr - 9. 可观测性

手把手教你学Dapr - 9. 可观测性

作者:互联网

目录

手把手教你学Dapr - 1. .Net开发者的大时代

手把手教你学Dapr - 2. 必须知道的概念

手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序

手把手教你学Dapr - 4. 服务调用

手把手教你学Dapr - 5. 状态管理

手把手教你学Dapr - 6. 发布订阅

手把手教你学Dapr - 7. Actors

手把手教你学Dapr - 8. 绑定

手把手教你学Dapr - 9. 可观测性

介绍

通过Tracing(跟踪)、Metrics(指标)、Logs(日志)和Health(运行状况)监控应用程序。

分布式跟踪

Dapr 使用 Zipkin 协议进行分布式跟踪 和 Metrics 收集。由于 Zipkin 协议的普遍性,许多后端都是开箱即用的,例如 Stackdriver、Zipkin、New Relic 等。结合 OpenTelemetry Collector,Dapr 可以将跟踪导出到许多其他后端,包括但不限于 Azure Monitor、Datadog、Instana、Jaeger 和 SignalFX。

tracing.png

Tracing设计

Dapr 在 Dapr Sidecar 中添加了一个 HTTP/gRPC 中间件。中间件拦截所有 Dapr 和应用程序流量,并自动注入关联 ID 以跟踪分布式事务。这种设计有几个好处:

W3C 关联 ID

Dapr 使用标准的 W3C 跟踪上下文标头。对于 HTTP 请求,Dapr 使用 traceparent 标头。对于 gRPC 请求,Dapr 使用 grpc-trace-bin 标头。当一个没有跟踪 ID 的请求到达时,Dapr 会创建一个新的。否则,它会沿着调用链传递跟踪 ID。

配置

Dapr 使用概率抽样。采样率定义了对跟踪跨度进行采样的概率,其值可以介于 0 和 1(含)之间。默认采样率为 0.0001(即采样 10,000 个跨度中的 1 个)。

要更改默认跟踪行为,请使用配置文件。例如,以下配置对象将采样率更改为 1(即每个跨度都被采样),并使用 Zipkin 协议将跟踪发送到位于 http://zipkin.default.svc.cluster.local 的 Zipkin 服务器

yaml文件路径:%UserProfile%\.dapr\config.yaml

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: tracing
  namespace: default
spec:
  tracing:
    samplingRate: "1"
    zipkin:
      endpointAddress: "http://zipkin.default.svc.cluster.local:9411/api/v2/spans"

:将采样率更改为 0 会完全禁用跟踪。

W3C 跟踪上下文

Dapr 使用 W3C 跟踪上下文对服务调用和发布/订阅消息进行分布式跟踪。Dapr 完成了生成和传播跟踪上下文信息的所有繁重工作,仅在极少数情况下,您需要传播或创建跟踪上下文。

W3C trace context有以下优势:

有两种情况需要了解如何使用跟踪:

  1. Dapr 在服务之间生成并传播跟踪上下文。
  2. Dapr 生成跟踪上下文,您需要将跟踪上下文传播到另一个服务,或者您生成跟踪上下文,Dapr 将跟踪上下文传播到服务。

Dapr 在服务之间生成并传播跟踪上下文

在某些情况下,Dapr 会为您完成所有工作。您不需要创建和传播任何跟踪标头。 Dapr 负责创建所有跟踪标头并传播它们。让我们通过示例来了解场景;

  1. 单个服务调用(服务 A -> 服务 B)

    Dapr 在服务 A 中生成跟踪标头,这些跟踪标头从服务 A 传播到服务 B。

  2. 多个顺序服务调用(服务 A -> 服务 B -> 服务 C)

    Dapr 在服务 A 中的请求开始时生成跟踪标头,这些跟踪标头从服务 A-> 服务 B -> 服务 C 等传播到进一步启用 Dapr 的服务。

  3. 请求是来自外部endpoint(例如从网关服务到启用 Dapr 的服务 A)

Dapr Sidecar 健康检查

Dapr 提供了一种使用 HTTP /healthz endpoint来确定其健康状况的方法。有了这个endpoint,可以探测 Dapr 进程或边车的健康状况,从而确定其准备情况和活跃度。

在将 Dapr 部署到托管平台(例如 Kubernetes)时,会自动为您配置 Dapr health endpoint。您无需进行任何配置。

Health endpoint: 与 Kubernetes 集成

Kubernetes 使用 readinessliveness 探测来确定容器的健康状况。

kubelet使用活动探针来知道何时重新启动容器。 例如,活动探测可以捕获死锁,即应用程序正在运行,但无法取得进展。在这种状态下重新启动容器有助于使应用程序更可用,尽管存在缺陷。

kubelet 使用就绪探针来了解容器何时准备好开始接受流量。当 pod 的所有容器都准备就绪时,它就被认为是准备好了的。这种准备信号的一个用途是控制哪些Pods被用作Kubernetes服务的后端。 当 Pod 未准备好时,它将从Kubernetes服务负载均衡器中删除。

当与 Kubernetes 集成时,Dapr Sidecar 被注入了一个 Kubernetes 探针配置,告诉它使用 Dapr healthz endpoint。这是由 Sidecar Injector 系统服务完成的。与 kubelet 的集成如下图所示。

20211117182319.jpg

如何在 Kubernetes 中配置活性探针

在 pod 配置文件中,在容器规范部分添加了 liveness 探针,如下所示:

livenessProbe:
     httpGet:
       path: /healthz
       port: 8080
     initialDelaySeconds: 3
     periodSeconds: 3

在上面的例子中, periodSeconds 字段指定 kubelet 应该每 3 秒执行一次活性探测。 initialDelaySeconds 字段告诉 kubelet 在执行第一次探测之前应该等待 3 秒。

:任何大于或等于 200 且小于 400 的代码都表示成功。其他代码表示失败。

如何在 Kubernetes 中配置就绪探针

就绪探针的配置类似于活性探针。唯一的区别是您使用 readinessProbe 字段而不是 livenessProbe 字段。

readinessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 3
      periodSeconds: 3

如何使用 Kubernetes 配置 Dapr Sidecar health endpoint

此配置由 Sidecar Injector 服务自动完成。Dapr 在端口 3500 上有它的 HTTP health endpint /v1.0/healthz,这可以与 Kubernetes 一起使用以进行就绪和活跃度探测。当注入 Dapr sidecar 时,readiness 和 liveness 探针在 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

.Net中使用可观测性

创建Assignment.Server

创建类库项目,并添加Dapr.AspNetCore, OpenTelemetry, OpenTelemetry.Instrumentation.AspNetCore, OpenTelemetry.Instrumentation.Http,OpenTelemetry.Extensions.HostingOpenTelemetry.Exporter.ZipkinNuGet包引用,最后修改程序端口为5000。

!!!注:版本很重要,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

修改program.cs

using OpenTelemetry.Resources;
using OpenTelemetry.Trace;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOpenTelemetryTracing((tracerProviderBuilder) =>
    tracerProviderBuilder
        .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("testobservability"))
        .AddAspNetCoreInstrumentation()
        .AddHttpClientInstrumentation()
        .AddZipkinExporter(zipkinOptions =>
        {
            zipkinOptions.Endpoint = new Uri("http://localhost:9411/api/v2/spans");
        }
    )
);
var app = builder.Build();

app.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}");
});

app.Run();

可以看到我们直接演示了一个好玩的用法,就是开启.Net的OpenTelemetry,然后修改Diagnostics.ActivityParentId,让当前的Tracing跟Dapr Sidecar传来的TraceId一致。

运行Assignment.Server

使用Dapr CLI来启动,先使用命令行工具跳转到目录 dapr-study-room\Assignment07\Assignment.Server,然后执行下面命令

dapr run --app-id testobservability --app-port 5000 --dapr-http-port 3500 --dapr-grpc-port 50001 dotnet run

使用Dapr CLI发个命令看看

dapr invoke --app-id testobservability --method /Amazing

打开Zipkin,地址:http://localhost:9411/, 来看一下Zipkin的Tracing,不单有Dapr Sidecar的请求记录进来了,还跟HttpClient的捆绑在了起来,是的,有趣的就在这里。

除了可以跟踪HttpClient以外,还有EF Core等都集成了。

16371523682162.png

至于Metrics和Logs集成也是非常简单,需要搭配不同的后端如Prometheus, Fluentd等。甚至可以通过自定义Exporter自行对接一些云厂商的云服务。

本章源码

Assignment09

https://github.com/doddgu/dapr-study-room

参考

https://docs.dapr.io/zh-hans/developing-applications/building-blocks/observability/tracing-overview/

我们正在行动,新的框架、新的生态

我们的目标是自由的易用的可塑性强的功能丰富的健壮的

所以我们借鉴Building blocks的设计理念,正在做一个新的框架MASA Framework,它有哪些特点呢?

经过几个月的生产项目实践,已完成POC,目前正在把之前的积累重构到新的开源项目中

目前源码已开始同步到Github(文档站点在规划中,会慢慢完善起来):

MASA.BuildingBlocks

MASA.Contrib

MASA.Utils

MASA.EShop

BlazorComponent

MASA.Blazor

QQ群:7424099

微信群:加技术运营微信(MasaStackTechOps),备注来意,邀请进群

masa_stack_tech_ops.png

标签:服务,Kubernetes,手把手,观测,OpenTelemetry,Dapr,跟踪
来源: https://www.cnblogs.com/doddgu/p/dapr-learning-9.html