手把手教你学Dapr - 9. 可观测性
目录
手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序
介绍
通过Tracing(跟踪)、Metrics(指标)、Logs(日志)和Health(运行状况)监控应用程序。
分布式跟踪
Dapr 使用 Zipkin 协议进行分布式跟踪 和 Metrics 收集。由于 Zipkin 协议的普遍性,许多后端都是开箱即用的,例如 Stackdriver、Zipkin、New Relic 等。结合 OpenTelemetry Collector,Dapr 可以将跟踪导出到许多其他后端,包括但不限于 Azure Monitor、Datadog、Instana、Jaeger 和 SignalFX。

Tracing设计
Dapr 在 Dapr Sidecar 中添加了一个 HTTP/gRPC 中间件。中间件拦截所有 Dapr 和应用程序流量,并自动注入关联 ID 以跟踪分布式事务。这种设计有几个好处:
- 无需代码检测。使用可配置的跟踪级别自动跟踪所有流量。
- 跨微服务的一致性跟踪行为。跟踪是在 Dapr Sidecar 上配置和管理的,因此它在由不同团队制作并可能用不同编程语言编写的服务之间保持一致。
- 可配置和可扩展。利用 Zipkin API 和 OpenTelemetry Collector,Dapr 跟踪可以配置为与流行的跟踪后端一起使用,包括客户可能拥有的自定义后端。
- 您可以同时定义和启用多个导出器。
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有以下优势:
- 为单个跟踪和请求提供唯一标识符,允许将多个提供程序的跟踪数据链接在一起。
- 提供转发特定于供应商的跟踪数据的商定机制,并避免跟踪在多个工具参与单个事务时中断。
- 提供中间商、平台和硬件提供商可以支持的行业标准。
有两种情况需要了解如何使用跟踪:
- Dapr 在服务之间生成并传播跟踪上下文。
- Dapr 生成跟踪上下文,您需要将跟踪上下文传播到另一个服务,或者您生成跟踪上下文,Dapr 将跟踪上下文传播到服务。
Dapr 在服务之间生成并传播跟踪上下文
在某些情况下,Dapr 会为您完成所有工作。您不需要创建和传播任何跟踪标头。 Dapr 负责创建所有跟踪标头并传播它们。让我们通过示例来了解场景;
单个服务调用(服务 A -> 服务 B)
Dapr 在服务 A 中生成跟踪标头,这些跟踪标头从服务 A 传播到服务 B。
多个顺序服务调用(服务 A -> 服务 B -> 服务 C)
Dapr 在服务 A 中的请求开始时生成跟踪标头,这些跟踪标头从服务 A-> 服务 B -> 服务 C 等传播到进一步启用 Dapr 的服务。
请求是来自外部endpoint(例如从网关服务到启用 Dapr 的服务 A)
Dapr Sidecar 健康检查
Dapr 提供了一种使用 HTTP /healthz endpoint来确定其健康状况的方法。有了这个endpoint,可以探测 Dapr 进程或边车的健康状况,从而确定其准备情况和活跃度。
在将 Dapr 部署到托管平台(例如 Kubernetes)时,会自动为您配置 Dapr health endpoint。您无需进行任何配置。
Health endpoint: 与 Kubernetes 集成
Kubernetes 使用 readiness 和 liveness 探测来确定容器的健康状况。
kubelet使用活动探针来知道何时重新启动容器。 例如,活动探测可以捕获死锁,即应用程序正在运行,但无法取得进展。在这种状态下重新启动容器有助于使应用程序更可用,尽管存在缺陷。
kubelet 使用就绪探针来了解容器何时准备好开始接受流量。当 pod 的所有容器都准备就绪时,它就被认为是准备好了的。这种准备信号的一个用途是控制哪些Pods被用作Kubernetes服务的后端。 当 Pod 未准备好时,它将从Kubernetes服务负载均衡器中删除。
当与 Kubernetes 集成时,Dapr Sidecar 被注入了一个 Kubernetes 探针配置,告诉它使用 Dapr healthz endpoint。这是由 Sidecar Injector 系统服务完成的。与 kubelet 的集成如下图所示。

如何在 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.Hosting和OpenTelemetry.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.Activity的ParentId,让当前的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等都集成了。

至于Metrics和Logs集成也是非常简单,需要搭配不同的后端如Prometheus, Fluentd等。甚至可以通过自定义Exporter自行对接一些云厂商的云服务。
本章源码
Assignment09
https://github.com/doddgu/dapr-study-room
我们正在行动,新的框架、新的生态
我们的目标是自由的、易用的、可塑性强的、功能丰富的、健壮的。
所以我们借鉴Building blocks的设计理念,正在做一个新的框架MASA Framework,它有哪些特点呢?
- 原生支持Dapr,且允许将Dapr替换成传统通信方式
- 架构不限,单体应用、SOA、微服务都支持
- 支持.Net原生框架,降低学习负担,除特定领域必须引入的概念,坚持不造新轮子
- 丰富的生态支持,除了框架以外还有组件库、权限中心、配置中心、故障排查中心、报警中心等一系列产品
- 核心代码库的单元测试覆盖率90%+
- 开源、免费、社区驱动
- 还有什么?我们在等你,一起来讨论
经过几个月的生产项目实践,已完成POC,目前正在把之前的积累重构到新的开源项目中
目前源码已开始同步到Github(文档站点在规划中,会慢慢完善起来):
QQ群:7424099
微信群:加技术运营微信(MasaStackTechOps),备注来意,邀请进群

手把手教你学Dapr - 9. 可观测性的更多相关文章
- 手把手教你学Dapr - 4. 服务调用
上一篇:手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序 介绍 通过使用服务调用,您的应用程序可以使用标准的gRPC或HTTP协议与其他应用程序可靠.安全地通信. 为什么不直接用Ht ...
- 手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序
上一篇:手把手教你学Dapr - 2. 必须知道的概念 注意: 文章中提到的命令行工具即是Windows Terminal/PowerShell/cmd其中的一个,推荐使用Windows Termin ...
- 手把手教你学Dapr - 5. 状态管理
上一篇:手把手教你学Dapr - 4. 服务调用 介绍 使用状态管理,您的应用程序可以将数据作为键/值对存储在支持的状态存储中. 您的应用程序可以使用 Dapr 的状态管理 API 使用状态存储组件来 ...
- 手把手教你学Dapr - 6. 发布订阅
上一篇:手把手教你学Dapr - 5. 状态管理 介绍 发布/订阅模式允许微服务使用消息相互通信.生产者或发布者在不知道哪个应用程序将接收它们的情况下向主题发送消息.这涉及将它们写入输入通道.同样,消 ...
- 手把手教你学Dapr - 7. Actors
上一篇:手把手教你学Dapr - 6. 发布订阅 介绍 Actor模式将Actor描述为最低级别的"计算单元".换句话说,您在一个独立的单元(称为actor)中编写代码,该单元接收 ...
- 手把手教你学Dapr - 8. 绑定
目录 手把手教你学Dapr - 1. .Net开发者的大时代 手把手教你学Dapr - 2. 必须知道的概念 手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序 手把手教你学Dapr ...
- 手把手教你学Dapr - 1. .Net开发者的大时代
Dapr全称 Distributed Application Runtime,分布式应用运行时 Dapr的口号 简化云原生应用开发,聚焦在应用的核心逻辑,让代码简单.可移植 Dapr的目标 最佳实践的 ...
- 手把手教你学Dapr - 2. 必须知道的概念
Sidecar 边车 Dapr API提供Http和gRPC两种通讯方式. 运行方式则可以是容器也可以是进程(Windows开发推荐使用Self Hosted,后续会解释). 这样的好处是与运行环境无 ...
- 30分钟手把手教你学webpack实战
30分钟手把手教你学webpack实战 阅读目录 一:什么是webpack? 他有什么优点? 二:如何安装和配置 三:理解webpack加载器 四:理解less-loader加载器的使用 五:理解ba ...
随机推荐
- 基于深度学习的建筑能耗预测02——安装Tensorflow-gpu
一.检查显卡 ·查看自己的显卡配置是否能支持cuda,以及Tensorflow不同版本要求与CUDA及CUDNN版本对应关系: https://developer.nvidia.com/zh-cn/c ...
- dbus中的数据类型
DBus中也是类似于静态语言,使用了"强类型"数据格式.在DBus上传递的所有数据都需要声明其对应的类型,下面整理了下,DBus中的数据类型,以及在DBus中声明的数据类型是什么意 ...
- WinForm事件与消息
WinForm事件与消息 消息概述以及在C#下的封装 Windows下应用程序的执行是通过消息驱动的.所有的外部事件,如键盘输入.鼠标移动.按动鼠标都由OS系统转换成相应的"消息" ...
- Python小知识之对象的比较
好久不见 国庆回了趟老家,躺平了10天.作息时间基本和小学生差不多,8.9点就睡了, 那滋味别提多舒服了.时间也和小时候过得一样慢了...长时间不更新,还是不行滴,粉都快掉没了. 今天就结合日常生活的 ...
- 【数据结构与算法Python版学习笔记】树——相关术语、定义、实现方法
概念 一种基本的"非线性"数据结构--树 根 枝 叶 广泛应用于计算机科学的多个领域 操作系统 图形学 数据库 计算机网络 特征 第一个属性是层次性,即树是按层级构建的,越笼统就越 ...
- 一文看懂JVM内存区域分布与作用
那么我们在开始介绍Java内存区域之前,我们先放一张内存区域的图,方便我们后面介绍的时候可以对照着看. 须知,本文是根据JDK8来介绍的. 程序计数器 首先它是线程私有的,它也称为代码的行号指示器,字 ...
- MySQL:提高笔记-5
MySQL:提高笔记-5 学完基础的语法后,进一步对 MySQL 进行学习,前几篇为: MySQL:提高笔记-1 MySQL:提高笔记-2 MySQL:提高笔记-3 MySQL:提高笔记-4 MySQ ...
- OO第四单元
OO第四单元总结 第四单元架构设计 第一次作业 uml类图 这次作业我采取的基本思路就是根据指令来建造一个简易的类图,用于查询,其中umlclass中包含了umlAttraibute,umlOpera ...
- Balance的数学思想构造辅助函数
本类题的证明难点便在于如何构造出满足答案的辅助函数.通过下列类题便可以很好的理解. 题一 该类题可以理解为积分内部f(x)与xf(x)处于一种失衡状态,故我们需要使其平衡,否则直接构造出的函数无法满足 ...
- hdu 5094 Maze (BFS+状压)
题意: n*m的迷宫.多多要从(1,1)到达(n,m).每移动一步消耗1秒.有P种钥匙. 有K个门或墙.给出K个信息:x1,y1,x2,y2,gi 含义是(x1,y1)与(x2,y2)之间有gi ...