以下概述视频和演示 展示了 Dapr 中的可观测性如何工作。
更多关于 Dapr 可观测性
了解有关如何使用 Dapr 可观测性的更多信息:
- 通过任何支持的 Dapr SDK 探索可观测性。
- 查看 可观测性 API 参考文档。
- 阅读 Dapr 中 可观测性概念的总体概述。
This is the multi-page printable view of this section. Click here to print.
以下概述视频和演示 展示了 Dapr 中的可观测性如何工作。
了解有关如何使用 Dapr 可观测性的更多信息:
Dapr 使用 Open Telemetry (OTEL) 和 Zipkin 协议进行分布式跟踪。OTEL 是行业标准,是推荐的跟踪协议。
大多数可观测性工具都支持 OTEL,包括:
下图演示了 Dapr(使用 OTEL 和 Zipkin 协议)如何与多个可观测性工具集成。

跟踪与服务调用和发布订阅 API 一起使用。你可以在使用这些 API 的服务之间流转跟踪上下文。跟踪的使用有两种场景:
Dapr 负责创建跟踪头。但是,当有两个以上服务时,你需要负责在它们之间传播跟踪头。让我们通过示例来了解这些场景:
例如,service A -> service B。
Dapr 在 service A 中生成跟踪头,然后从 service A 传播到 service B。不需要进一步传播。
例如,service A -> service B -> 传播跟踪头到 -> service C,依此类推到其他启用 Dapr 的服务。
Dapr 在请求开始时在 service A 中生成跟踪头,然后传播到 service B。你现在需要负责获取这些头并将它们传播到 service C,因为这是特定于你的应用程序的。
换句话说,如果应用程序调用 Dapr 并希望使用现有跟踪头(span)进行跟踪,它必须始终传播到 Dapr(在本示例中从 service B 到 service C)。Dapr 始终将跟踪 span 传播到应用程序。
例如,从网关服务到启用 Dapr 的服务 A。
外部网关入口调用 Dapr,Dapr 生成跟踪头并调用 service A。Service A 然后调用 service B 和其他启用 Dapr 的服务。
你必须将头从 service A 传播到 service B。例如:Ingress -> service A -> 传播跟踪头 -> service B。这类似于情况 2。
Dapr 在发布的消息主题中生成跟踪头。对于 rawPayload 消息,可以指定 traceparent 头来传播跟踪信息。这些跟踪头被传播到监听该主题的任何服务。
在以下场景中,Dapr 会为你完成部分工作,然后由你创建或传播跟踪头。
当你从单个服务调用多个服务时,需要传播跟踪头。例如:
service A -> service B
[ .. 一些代码逻辑 ..]
service A -> service C
[ .. 一些代码逻辑 ..]
service A -> service D
[ .. 一些代码逻辑 ..]
在这种情况下:
service A 首次调用 service B 时,Dapr 在 service A 中生成跟踪头。service A 中的跟踪头被传播到 service B。service B 的响应中作为响应头的一部分返回。service C 和 service D,因为 Dapr 不知道你想重用同一个头。生成自己的跟踪上下文头不太常见,并且在调用 Dapr 时通常不需要。
但是,有些场景你可能会选择在服务调用中添加 W3C 跟踪头。例如,你有一个不使用 Dapr 的现有应用程序。在这种情况下,Dapr 仍然会为你传播跟踪上下文头。
如果你决定自己生成跟踪头,可以通过三种方式完成:
标准 OpenTelemetry SDK
你可以使用行业标准 OpenTelemetry SDK 生成跟踪头,并将这些跟踪头传递给启用 Dapr 的服务。这是首选方法。
供应商 SDK
你可以使用提供生成 W3C 跟踪头方法的供应商 SDK,并将它们传递给启用 Dapr 的服务。
W3C 跟踪上下文
你可以按照 W3C 跟踪上下文规范 手工制作跟踪上下文,并将它们传递给启用 Dapr 的服务。
阅读跟踪上下文概述以获取有关 W3C 跟踪上下文和头的更多背景信息和示例。
Dapr 支持两种不同的机制来传播 W3C Baggage 以及跟踪上下文:
Context Baggage(OpenTelemetry)
Header/Metadata Baggage
%20,斜杠使用 %2F)serverNode=DF%2028(而不是 serverNode=DF 28)出于安全目的,上下文 baggage 和头 baggage 严格分离,永远不会在域之间合并。这确保 baggage 值保持其预期的格式和安全属性。
你可以根据用例使用任一机制传播 baggage。
以下是这两种机制的示例:
1. 使用 Context Baggage (OpenTelemetry)
使用 OpenTelemetry SDK 时:
import otelbaggage "go.opentelemetry.io/otel/baggage"
// Set baggage in context (values remain unencoded)
baggage, err = otelbaggage.Parse("userId=cassie,serverNode=DF%2028")
...
ctx := otelbaggage.ContextWithBaggage(t.Context(), baggage)
)
// Pass this context to any Dapr API call
client.InvokeMethodWithContent(ctx, "serviceB", ...)
2. 使用 Header/Metadata Baggage
使用 gRPC 元数据时:
import "google.golang.org/grpc/metadata"
// Set URL-encoded baggage in context
ctx = metadata.AppendToOutgoingContext(ctx,
"baggage", "userId=cassie,serverNode=DF%2028",
)
// Pass this context to any Dapr API call
client.InvokeMethodWithContent(ctx, "serviceB", ...)
3. 在目标服务中接收 Baggage
在目标服务中,你可以访问传播的 baggage:
// Using OpenTelemetry (values are automatically decoded)
import "go.opentelemetry.io/otel/baggage"
bag := baggage.FromContext(ctx)
userID := bag.Member("userId").Value() // "cassie"
// Using raw gRPC metadata (values remain percent-encoded)
import "google.golang.org/grpc/metadata"
md, _ := metadata.FromIncomingContext(ctx)
if values := md.Get("baggage"); len(values) > 0 {
// values[0] contains the percent-encoded string you set: "userId=cassie,serverNode=DF%2028"
// Remember: You must URL encode special characters when setting baggage
// To decode the values, use OpenTelemetry APIs:
bag, err := baggage.Parse(values[0])
...
userID := bag.Member("userId").Value() // "cassie"
}
HTTP 示例(URL 编码):
curl -X POST http://localhost:3500/v1.0/invoke/serviceB/method/hello \
-H "Content-Type: application/json" \
-H "baggage: userID=cassie,serverNode=DF%2028" \
-d '{"message": "Hello service B"}'
gRPC 示例(URL 编码):
ctx = grpcMetadata.AppendToOutgoingContext(ctx,
"baggage", "userID=cassie,serverNode=DF%2028",
)
Baggage 适用于:
选择正确的机制
安全考虑
Dapr 使用 Open Telemetry 协议,而该协议又使用 W3C 追踪上下文进行分布式追踪,涵盖服务调用和发布订阅消息。Dapr 生成并传播追踪上下文信息,可将其发送到可观测性工具以进行可视化和查询。
分布式追踪是追踪工具实现的一种方法论,用于跟踪、分析和调试跨越多个软件组件的事务。
通常,分布式追踪会跨越多个服务,因此需要能够唯一标识。追踪上下文传播会传递这一唯一标识。
过去,追踪上下文传播由各个追踪供应商单独实现。在多供应商环境中,这会导致互操作性问题,例如:
以前,大多数应用程序由单个追踪供应商监控,并保持在单个平台供应商的边界内,因此这些问题没有产生重大影响。
如今,越来越多的应用程序是分布式的,并利用多个中间件服务和云平台。现代应用程序的这一转变需要一个分布式追踪上下文传播标准。
W3C 追踪上下文规范定义了交换追踪上下文传播数据(称为追踪上下文)的通用约定格式。追踪上下文通过提供以下功能解决了上述问题:
这种统一的追踪数据传播方法提高了对分布式应用程序行为的可见性,便于进行问题和性能分析。
Dapr 使用标准的 W3C 追踪上下文标头。
traceparent 标头。grpc-trace-bin 标头。当请求到达时没有追踪 ID,Dapr 会创建一个新的。否则,它会将追踪 ID 沿调用链传递。
以下是 Dapr 为 HTTP 和 gRPC 生成和传播的特定追踪上下文标头。
在将追踪上下文标头从 HTTP 响应传播到 HTTP 请求时,复制这些标头:
Traceparent 标头
traceparent 标头以通用格式表示追踪系统中的传入请求,所有供应商都能理解:
traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
Tracestate 标头
tracestate 标头以可能特定于供应商的格式包含父级:
tracestate: congo=t61rcWkgMzE
Baggage 支持
Dapr 支持 W3C Baggage,通过两种不同的机制传播键值对以及追踪上下文:
上下文 Baggage(OpenTelemetry)
baggage: userId=cassie,serverNode=DF 28,isVIP=true
HTTP 标头 Baggage
%20,斜杠用 %2F)otelbaggage.Parse() 这样的 OpenTelemetry API 会解码值%20):curl -X POST http://localhost:3500/v1.0/invoke/serviceB/method/hello \
-H "Content-Type: application/json" \
-H "baggage: userId=cassie,serverNode=DF%2028,isVIP=true" \
-d '{"message": "Hello service B"}'
出于安全目的,上下文 baggage 和标头 baggage 严格分离,永不跨域合并。这确保 baggage 值在每个域中保持其预期的格式和安全属性。
支持多个 baggage 标头,将根据 W3C 规范进行组合。Dapr 在服务调用之间自动传播 baggage,同时为每个域维护适当的编码。
在 gRPC API 调用中,追踪上下文通过 grpc-trace-bin 标头传递。
Baggage 支持
Dapr 支持 W3C Baggage,通过两种不同的机制传播键值对以及追踪上下文:
上下文 Baggage(OpenTelemetry)
baggage: userId=cassie,serverNode=DF 28,isVIP=true
gRPC 元数据 Baggage
%20,斜杠用 %2F)%20):baggage: userId=cassie,serverNode=DF%2028,isVIP=true
出于安全目的,上下文 baggage 和元数据 baggage 严格分离,永不跨域合并。这确保 baggage 值在每个域中保持其预期的格式和安全属性。
支持多个 baggage 元数据条目,将根据 W3C 规范进行组合。Dapr 在服务调用之间自动传播 baggage,同时为每个域维护适当的编码。
Configuration 规范下的 tracing 部分包含以下属性:
spec:
tracing:
samplingRate: "1"
otel:
endpointAddress: "myendpoint.cluster.local:4317"
headers:
- name: "x-api-key"
secretKeyRef:
name: "my-secret-store"
key: "otel-api-key"
timeout: "30s"
zipkin:
endpointAddress: "https://..."
下表列出了追踪的属性:
| 属性 | 类型 | 描述 |
|---|---|---|
samplingRate | string | 设置追踪的采样率以启用或禁用。 |
stdout | bool | True 向追踪写入更详细的信息 |
otel.endpointAddress | string | 设置 Open Telemetry (OTEL) 目标主机名和可选端口。如果使用此选项,则不需要指定 ‘zipkin’ 部分。 |
otel.isSecure | bool | 到端点地址的连接是否加密。 |
otel.protocol | string | 设置为 http 或 grpc 协议。 |
otel.headers | array | 要包含在 OTLP 导出器请求中的标头。每个条目都有一个 name 和明文 value 或 secretKeyRef(用于引用 Kubernetes secret)。 |
otel.timeout | string | OTLP 导出器请求的超时时间(例如 30s、5m)。 |
zipkin.endpointAddress | string | 设置 Zipkin 服务器 URL。如果使用此选项,则不需要指定 otel 部分。 |
要启用追踪,请使用配置文件(在自托管模式下)或 Kubernetes 配置对象(在 Kubernetes 模式下)。例如,以下配置对象将采样率更改为 1(每个 span 都被采样),并使用 OTEL 协议将追踪发送到位于 localhost:4317 的 OTEL 服务器
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: tracing
spec:
tracing:
samplingRate: "1"
otel:
endpointAddress: "localhost:4317"
isSecure: false
protocol: grpc
headers:
- name: "x-api-key"
value: "my-api-key"
- name: "x-secret-header"
secretKeyRef:
name: "my-secret"
key: "header-value"
timeout: "30s"
Dapr 使用概率采样。采样率定义了追踪 span 被采样的概率,其值可以在 0 到 1 之间(含)。默认采样率为 0.0001(即每 10,000 个 span 中采样 1 个)。
将 samplingRate 更改为 0 会完全禁用追踪。
OpenTelemetry (otel) 端点也可以通过环境变量进行配置。存在 OTEL_EXPORTER_OTLP_ENDPOINT 环境变量时 会为边车启用追踪。
| 环境变量 | 描述 |
|---|---|
OTEL_EXPORTER_OTLP_ENDPOINT | 设置 Open Telemetry (OTEL) 服务器主机名和可选端口,启用追踪 |
OTEL_EXPORTER_OTLP_INSECURE | 将到端点的连接设置为未加密(true/false) |
OTEL_EXPORTER_OTLP_PROTOCOL | 传输协议(grpc、http/protobuf、http/json) |
OTEL_EXPORTER_OTLP_TRACES_HEADERS | OTLP 追踪导出器的逗号分隔的 key=value 标头列表 |
OTEL_EXPORTER_OTLP_TRACES_TIMEOUT | OTLP 追踪导出器的超时时间(以毫秒为单位,例如 30000) |
了解如何使用以下工具之一设置追踪:
Dapr 使用 OpenTelemetry (OTLP) 协议直接写入追踪数据,这是推荐的方法。对于直接支持 OTLP 的可观测性工具,建议使用 OpenTelemetry Collector,因为它允许应用程序快速卸载数据,并包含重试、批处理和加密等功能。更多信息,请阅读 OpenTelemetry Collector 文档。
Dapr 也可以使用 Zipkin 协议写入追踪数据。在支持 OTLP 协议之前,Zipkin 协议与 OpenTelemetry Collector 一起使用,将追踪数据发送到 AWS X-Ray、Google Cloud Operations Suite 和 Azure Monitor 等可观测性工具。两种协议方法都是有效的,但 OpenTelemetry 协议是推荐的选择。

将 <your-exporter-here> 部分替换为您的追踪 exporter 的正确设置。
使用以下命令应用配置:
kubectl apply -f open-telemetry-collector-generic.yaml
设置一个 Dapr 配置文件来启用追踪,并部署一个使用 OpenTelemetry Collector 的追踪 exporter 组件。
使用此 collector-config.yaml 文件创建您自己的配置。
使用以下命令应用配置:
kubectl apply -f collector-config.yaml
通过在要参与分布式追踪的容器上添加 dapr.io/config 注解来应用 appconfig 配置,如下例所示:
apiVersion: apps/v1
kind: Deployment
metadata:
...
spec:
...
template:
metadata:
...
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "MyApp"
dapr.io/app-port: "8080"
dapr.io/config: "appconfig"
您可以同时注册多个追踪 exporter,追踪日志会转发到所有已注册的 exporter。
就这样!无需包含任何 SDK 或检测您的应用程序代码。Dapr 会自动为您处理分布式追踪。
部署并运行一些应用程序。等待追踪数据传播到您的追踪后端,然后在那里查看它们。
Dapr 使用 OpenTelemetry 协议 (OTLP) 与 OpenTelemetry (OTEL) Collector 集成。本指南通过一个示例演示如何使用 Dapr 通过 OpenTelemetry Collector 将追踪数据推送到 Azure Application Insights。
要将追踪数据推送到你的 Application Insights 实例,请在 Kubernetes 集群上安装 OpenTelemetry Collector。
将 <CONNECTION_STRING> 占位符替换为你的 Application Insights 连接字符串。
将 OpenTelemetry Collector 部署到运行 Dapr 应用的同一命名空间:
kubectl apply -f open-telemetry-collector-appinsights.yaml
创建 Dapr 配置文件以启用追踪,并通过 OTLP 将追踪数据发送到 OpenTelemetry Collector。
下载并查看 collector-config-otel.yaml。更新 namespace 和 otel.endpointAddress 值,使其与部署 Dapr 应用和 OpenTelemetry Collector 的命名空间一致。
使用以下命令应用配置:
kubectl apply -f collector-config-otel.yaml
通过向要包含在分布式追踪中的 Dapr 应用添加 dapr.io/config 注解来应用 tracing 配置,如下例所示:
apiVersion: apps/v1
kind: Deployment
metadata:
...
spec:
...
template:
metadata:
...
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "MyApp"
dapr.io/app-port: "8080"
dapr.io/config: "tracing"
你可以同时注册多个追踪导出器,追踪日志将转发到所有已注册的导出器。
就是这样!无需包含任何 SDK 或对应用程序代码进行插桩。Dapr 会自动为你处理分布式追踪。
部署并运行一些应用程序。几分钟后,你应该会看到追踪日志出现在你的 Application Insights 资源中。你还可以使用 Application Map 来检查服务的拓扑,如下所示:

Dapr 使用 OpenTelemetry 协议(OTLP)与 Dynatrace Collector 集成。本指南将通过一个示例演示如何使用 Dapr 通过 Dynatrace 版本的 OpenTelemetry Collector 向 Dynatrace 推送追踪信息。
openTelemetryTrace.ingest、metrics.ingest 和 logs.ingest 作用域的 API 令牌要将追踪信息推送到您的 Dynatrace 实例,请在您的 Kubernetes 集群上安装 Dynatrace OpenTelemetry Collector。
使用您的 Dynatrace 凭证创建 Kubernetes secret:
kubectl create secret generic dynatrace-otelcol-dt-api-credentials \
--from-literal=DT_ENDPOINT=https://YOUR_TENANT.live.dynatrace.com/api/v2/otlp \
--from-literal=DT_API_TOKEN=dt0s01.YOUR_TOKEN_HERE
将 YOUR_TENANT 替换为您的 Dynatrace 租户 ID,将 YOUR_TOKEN_HERE 替换为您的 Dynatrace API 令牌。
使用 Dynatrace OpenTelemetry Collector 发行版以获得比开源版本更好的默认值和支持。下载并检查 collector-helm-values.yaml 文件。这基于 k8s enrichment demo,并包含 Kubernetes 元数据增强以获得适当的 pod/namespace/cluster 上下文。
使用 Helm 部署 Dynatrace Collector。
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm repo update
helm upgrade -i dynatrace-collector open-telemetry/opentelemetry-collector -f collector-helm-values.yaml
创建 Dapr 配置文件以启用追踪,并通过 OTLP 将追踪信息发送到 OpenTelemetry Collector。
更新以下文件以确保 endpointAddress 指向 Kubernetes 集群中的 Dynatrace OpenTelemetry Collector 服务。如果在 default 命名空间中部署,通常是 dynatrace-collector.default.svc.cluster.local。
重要提示: 确保 endpointAddress 不包含 http:// 前缀,以避免 URL 编码问题:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: tracing
spec:
tracing:
samplingRate: "1"
otel:
endpointAddress: "dynatrace-collector.default.svc.cluster.local:4318" # 使用您的 collector 服务地址更新
应用配置:
kubectl apply -f collector-config-otel.yaml
通过向要包含在分布式追踪中的 Dapr 应用添加 dapr.io/config 注解来应用 tracing 配置,如以下示例所示:
apiVersion: apps/v1
kind: Deployment
metadata:
...
spec:
...
template:
metadata:
...
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "MyApp"
dapr.io/app-port: "8080"
dapr.io/config: "tracing"
您可以同时注册多个追踪导出器,追踪日志将转发到所有已注册的导出器。
就是这样!无需包含任何 SDK 或对应用代码进行检测。Dapr 会自动为您处理分布式追踪。
部署并运行一些应用。几分钟后,您应该会看到追踪信息出现在您的 Dynatrace 租户中:

如果您在集群中运行 Dynatrace OneAgent,您应该将 daprd 边车容器从 OneAgent 监控中排除,以防止此配置中的干扰。排除它可以防止任何可能破坏功能或导致追踪混乱的自动注入尝试。
将此注解添加到您的应用部署或在 dynakube 配置文件中全局添加:
metadata:
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "MyApp"
dapr.io/app-port: "8080"
dapr.io/config: "tracing"
container.inject.dynatrace.com/daprd: "false" # 排除 dapr sidecar 被 OneAgent 自动监控
Dapr 支持使用 OpenTelemetry (OTLP) 协议写入 traces,而 Jaeger V2 原生支持 OTLP,允许 Dapr 直接向 Jaeger V2 实例发送 traces。这种方法推荐用于生产环境,以利用 Jaeger V2 的分布式追踪能力。
启动 Jaeger 最简单的方式是运行发布到 DockerHub 的预构建 all-in-one Jaeger 镜像并暴露 OTLP 端口:
注意: 端口 9411 通常由 Zipkin 使用。如果你正在运行 Zipkin(运行
dapr init时默认启动),请先停止dapr_zipkin容器以避免端口冲突:docker stop dapr_zipkin
docker run -d --rm --name jaeger \
-p 16686:16686 \
-p 4317:4317 \
-p 4318:4318 \
-p 5778:5778 \
-p 9411:9411 \
cr.jaegertracing.io/jaegertracing/jaeger:2.11.0
你也可以使用以下命令查看 jaeger 容器的日志:
docker logs jaeger
你有两个选项来配置 Dapr 向 Jaeger V2 发送 traces:
创建一个包含以下内容的 config.yaml 文件:
注意: 由于你使用 OpenTelemetry 协议与 Jaeger 通信,你需要填写追踪配置的
otel部分,并将endpointAddress设置为 Jaeger 容器的地址。
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: tracing
namespace: default
spec:
tracing:
samplingRate: "1"
stdout: true
otel:
endpointAddress: "localhost:4317"
isSecure: false
protocol: grpc
要启动引用新 YAML 配置文件的应用程序,请使用 --config 选项。例如:
dapr run --app-id myapp --app-port 3000 node app.js --config config.yaml
或者,在你的开发环境中,导航到你的本地 Dapr 组件目录并使用上述 OTLP 配置更新默认的 config.yaml 文件。这样,所有 Dapr 应用程序将默认使用 Jaeger V2 追踪配置,无需每次指定 --config 标志。
要在浏览器中查看 traces,请访问 http://localhost:16686 以查看 Jaeger UI。
以下步骤展示了如何配置 Dapr 将分布式追踪数据直接发送到使用 OpenTelemetry Operator 部署的 Jaeger V2 实例,该实例使用内存存储。
Jaeger V2 可以使用 OpenTelemetry Operator 部署,以简化管理并获得原生 OTLP 支持。以下示例配置了使用内存存储的 Jaeger V2。
存储后端说明: 此示例使用内存存储(
memstore)以简化操作,适用于开发或测试环境,因为它在内存中最多存储 100,000 条 traces。对于生产环境,请考虑配置持久化存储后端(如 Cassandra 或 Elasticsearch)以确保 trace 数据的持久性。
注意: 为了使 API 服务器与 Operator 的 webhook 组件通信,webhook 需要 API 服务器配置为信任的 TLS 证书。你可以使用几种不同的方式来生成/配置所需的 TLS 证书,详细信息见 otel operator chart 文档
为简化操作,你可以使用 Helm 创建自动生成的自签名证书。
安装 OpenTelemetry Operator:
helm install opentelemetry-operator open-telemetry/opentelemetry-operator -n opentelemetry-operator-system --create-namespace \
--set "manager.collectorImage.repository=ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-k8s" \
--set admissionWebhooks.certManager.enabled=false \
--set admissionWebhooks.autoGenerateCert.enabled=true
确认 opentelemetry-operator-system 命名空间中的所有资源已就绪。
部署使用内存存储的 Jaeger V2 实例:
创建一个名为 jaeger-inmemory.yaml 的文件,包含以下配置:
apiVersion: opentelemetry.io/v1beta1
kind: OpenTelemetryCollector
metadata:
name: jaeger-inmemory-instance
namespace: observability
spec:
image: jaegertracing/jaeger:latest
ports:
- name: jaeger
port: 16686
config:
service:
extensions: [jaeger_storage, jaeger_query]
pipelines:
traces:
receivers: [otlp]
exporters: [jaeger_storage_exporter]
extensions:
jaeger_query:
storage:
traces: memstore
jaeger_storage:
backends:
memstore:
memory:
max_traces: 100000
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
exporters:
jaeger_storage_exporter:
trace_storage: memstore
使用以下命令应用它:
kubectl apply -f jaeger-inmemory.yaml -n observability
创建一个 Dapr 配置文件以启用追踪,并将边车 traces 直接导出到 Jaeger V2 实例。
创建一个配置文件(例如 tracing.yaml),包含以下内容,更新 namespace 和 otel.endpointAddress 以匹配你的 Jaeger V2 实例:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: tracing
namespace: order-system
spec:
tracing:
samplingRate: "1"
otel:
endpointAddress: "jaeger-inmemory-instance-collector.observability.svc.cluster.local:4317"
isSecure: false
protocol: grpc
应用配置:
kubectl apply -f tracing.yaml -n order-system
通过在要启用分布式追踪的应用程序部署中添加 dapr.io/config 注解来应用 tracing Dapr 配置,如以下示例所示:
apiVersion: apps/v1
kind: Deployment
metadata:
...
spec:
...
template:
metadata:
...
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "MyApp"
dapr.io/app-port: "8080"
dapr.io/config: "tracing"
你可以同时注册多个追踪导出器,追踪日志将转发到所有已注册的导出器。
就是这样!无需包含 OpenTelemetry SDK 或检测应用程序代码。Dapr 会自动为你处理分布式追踪。
要查看 Dapr 边车 traces,请转发 Jaeger V2 服务的端口并打开 UI:
kubectl port-forward svc/jaeger-inmemory-instance-collector 16686:16686 -n observability
在浏览器中,访问 http://localhost:16686 以查看 Jaeger V2 UI。

Dapr 原生捕获可以直接发送到 New Relic 的指标和链路。最简单的导出方式是将 Dapr 配置为使用 Zipkin 追踪格式将链路发送到 New Relic 的 Trace API。
为了让集成将数据发送到 New Relic 遥测数据平台,你需要一个 New Relic Insights Insert API 密钥。
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: appconfig
namespace: default
spec:
tracing:
samplingRate: "1"
zipkin:
endpointAddress: "https://trace-api.newrelic.com/trace/v1?Api-Key=<NR-INSIGHTS-INSERT-API-KEY>&Data-Format=zipkin&Data-Format-Version=2"
New Relic 分布式追踪概览

New Relic 分布式追踪详情

为了让集成将数据发送到 New Relic 遥测数据平台,你需要一个 New Relic 许可证密钥 或 New Relic Insights Insert API 密钥。
利用不同语言的特定 OpenTelemetry 实现,例如 New Relic Telemetry SDK 和 OpenTelemetry 对 .NET 的支持。在这种情况下,使用 OpenTelemetry Trace Exporter。参见示例。
与 OpenTelemetry instrumentation 类似,你也可以利用 New Relic 语言代理。例如,New Relic 代理对 .NET Core 的 instrumentation是 Dockerfile 的一部分。参见示例。
如果 Dapr 和你的应用程序在 Kubernetes 环境中运行,你可以启用额外的指标和日志。
安装 New Relic Kubernetes 集成的最简单方法是使用自动化安装程序生成清单。它不仅打包了集成 DaemonSets,还包含其他 New Relic Kubernetes 配置,如 Kubernetes 事件、Prometheus OpenMetrics和 New Relic 日志监控。
New Relic Kubernetes Cluster Explorer为 Kubernetes 集成收集的整个数据和部署提供了独特的可视化。
这是观察所有数据并深入了解应用程序或微服务内部发生的任何性能问题或事件的良好起点。

自动化关联是 New Relic 可视化功能的一部分。





New Relic 与 Grafana Labs合作,你可以将遥测数据平台用作 Prometheus 指标的数据源,并在现有仪表板中查看它们,无缝利用 New Relic 提供的可靠性、规模和安全性。
用于监控 Dapr 系统服务和边车的 Grafana 仪表板模板无需任何更改即可轻松使用。New Relic 提供了用于 Grafana 的 Prometheus 指标原生端点。可以轻松设置数据源:

并且可以从 Dapr 导入完全相同的仪表板模板来可视化 Dapr 系统服务和边车。

从 Dapr、Kubernetes 或其上运行的任何服务收集的所有数据都可以用于在您选择的首选渠道中设置告警和通知。参见告警和 Applied Intelligence。
对于自托管模式,在运行 dapr init 时:
$HOME/.dapr/config.yaml(Linux/Mac 上)或 %USERPROFILE%\.dapr\config.yaml(Windows 上)创建以下 YAML 文件,并且在 dapr run 调用时会默认引用该文件,除非被覆盖:apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: daprConfig
namespace: default
spec:
tracing:
samplingRate: "1"
zipkin:
endpointAddress: "http://localhost:9411/api/v2/spans"
dapr init 时,会启动 openzipkin/zipkin docker 容器,或者可以使用以下代码启动它。使用 Docker 启动 Zipkin:
docker run -d -p 9411:9411 openzipkin/zipkin
dapr run 启动的应用程序默认引用 $HOME/.dapr/config.yaml 或 %USERPROFILE%\.dapr\config.yaml 中的配置文件,并可以通过使用 --config 参数的 Dapr CLI 覆盖它:dapr run --app-id mynode --app-port 3000 node app.js
要查看追踪,请在浏览器中打开 http://localhost:9411,您将看到 Zipkin UI。
以下步骤向您展示如何配置 Dapr 将分布式追踪数据发送到在 Kubernetes 集群中作为容器运行的 Zipkin,以及如何查看它们。
首先,部署 Zipkin:
kubectl create deployment zipkin --image openzipkin/zipkin
为 Zipkin pod 创建 Kubernetes 服务:
kubectl expose deployment zipkin --type ClusterIP --port 9411
接下来,在本地创建以下 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"
现在,部署 Dapr 配置文件:
kubectl apply -f tracing.yaml
为了为您的 Dapr 边车启用此配置,请将以下注解添加到您的 pod 规范模板中:
annotations:
dapr.io/config: "tracing"
就是这样!您的边车现在已配置为向 Zipkin 发送追踪数据。
要查看追踪数据,请连接到 Zipkin 服务并打开 UI:
kubectl port-forward svc/zipkin 9411:9411
在浏览器中,打开 http://localhost:9411,您将看到 Zipkin UI。

Dapr 可捕获指标、链路追踪和日志,并可以通过 OpenTelemetry Collector 直接发送到 Dash0。Dash0 是一个原生 OpenTelemetry 可观测性平台,为分布式应用程序提供全面的监控能力。
通过使用带有 OTLP 导出器的 OpenTelemetry Collector 向 Dash0 发送数据,你可以配置 Dapr 为 Kubernetes 集群中的每个应用程序创建链路追踪,并在 Dash0 中收集它们进行分析和监控。
kubectlkubectl create namespace opentelemetry
kubectl create secret generic dash0-secrets \
--from-literal=dash0-authorization-token="<your_auth_token>" \
--from-literal=dash0-endpoint="<your_otlp_grpc_endpoint>" \
--namespace opentelemetry
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm repo update
values.yaml此配置:
mode: deployment
fullnameOverride: otel-collector
replicaCount: 1
image:
repository: otel/opentelemetry-collector-k8s
extraEnvs:
- name: DASH0_AUTHORIZATION_TOKEN
valueFrom:
secretKeyRef:
name: dash0-secrets
key: dash0-authorization-token
- name: DASH0_ENDPOINT
valueFrom:
secretKeyRef:
name: dash0-secrets
key: dash0-endpoint
config:
receivers:
otlp:
protocols:
grpc: {}
http: {}
processors:
batch: {}
exporters:
otlp/dash0:
auth:
authenticator: bearertokenauth/dash0
endpoint: ${env:DASH0_ENDPOINT}
extensions:
bearertokenauth/dash0:
scheme: Bearer
token: ${env:DASH0_AUTHORIZATION_TOKEN}
health_check: {}
service:
extensions:
- bearertokenauth/dash0
- health_check
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [otlp/dash0]
metrics:
receivers: [otlp]
processors: [batch]
exporters: [otlp/dash0]
logs:
receivers: [otlp]
processors: [batch]
exporters: [otlp/dash0]
helm upgrade --install otel-collector open-telemetry/opentelemetry-collector \
--namespace opentelemetry \
-f values.yaml
创建 dapr-config.yaml:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: tracing
namespace: default
spec:
tracing:
samplingRate: "1"
otel:
endpointAddress: "otel-collector.opentelemetry.svc.cluster.local:4317"
isSecure: false
protocol: grpc
应用配置:
kubectl apply -f dapr-config.yaml
在每个需要 Dapr 追踪的 Deployment/Pod 中添加:
metadata:
annotations:
dapr.io/config: "tracing"
kubectl get pods -n opentelemetry
kubectl logs -n opentelemetry deployment/otel-collector
完成设置且遥测数据开始流动后,你可以在 Dash0 中查看链路追踪:

helm -n opentelemetry uninstall otel-collector
kubectl -n opentelemetry delete secret dash0-secrets
kubectl delete ns opentelemetry
Dapr 可以捕获指标和链路追踪数据,并通过 OpenTelemetry Collector 的 Datadog 导出器直接发送到 Datadog。
使用 OpenTelemetry Collector 的 Datadog 导出器,你可以配置 Dapr 为 Kubernetes 集群中的每个应用创建链路追踪,并在 Datadog 中收集它们。
在开始之前,先设置 OpenTelemetry Collector。
将你的 Datadog API 密钥添加到 ./deploy/opentelemetry-collector-generic-datadog.yaml 文件的 datadog 导出器配置部分中:
data:
otel-collector-config:
...
exporters:
...
datadog:
api:
key: <YOUR_API_KEY>
通过运行以下命令来应用 opentelemetry-collector 配置。
kubectl apply -f ./deploy/open-telemetry-collector-generic-datadog.yaml
创建一个 Dapr 配置文件,用于启用追踪并部署一个使用 OpenTelemetry Collector 的追踪导出器组件。
kubectl apply -f ./deploy/collector-config.yaml
通过向希望参与分布式追踪的容器添加 dapr.io/config 注解来应用 appconfig 配置。
annotations:
dapr.io/config: "appconfig"
创建并配置应用程序。一旦运行,遥测数据将发送到 Datadog,并可在 Datadog APM 中查看。

要在本地计算机上运行 Prometheus,您可以安装并作为进程运行,也可以将其作为 Docker 容器运行。
要安装 Prometheus,请按照此处针对您的操作系统概述的步骤操作。
现在您已经安装了 Prometheus,需要创建一个配置。
下面是一个 Prometheus 配置示例,将其保存到文件中,例如 /tmp/prometheus.yml 或 C:\Temp\prometheus.yml
global:
scrape_interval: 15s # 默认情况下,每 15 秒抓取一次目标。
# 一个恰好包含一个要抓取的端点的抓取配置:
# 这里是 Prometheus 本身。
scrape_configs:
- job_name: 'dapr'
# 覆盖全局默认值,并每 5 秒从此作业抓取目标。
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090'] # 如果不是默认值,请替换为 Dapr 指标端口
使用您的配置运行 Prometheus,以开始从指定目标收集指标。
./prometheus --config.file=/tmp/prometheus.yml --web.listen-address=:8080
我们更改了端口,使其不会与 Dapr 自己的指标端点冲突。
如果您当前没有运行 Dapr 应用程序,目标将显示为离线。为了开始收集指标,您必须使用与配置中提供的目标匹配的指标端口启动 Dapr。
Prometheus 运行后,您可以通过访问 http://localhost:8080 来访问其仪表板。
要在本地计算机上将 Prometheus 作为 Docker 容器运行,首先确保已安装并运行 Docker。
然后您可以使用以下命令将 Prometheus 作为 Docker 容器运行:
docker run \
--net=host \
-v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus --config.file=/etc/prometheus/prometheus.yml --web.listen-address=:8080
--net=host 确保 Prometheus 实例能够连接到在主机上运行的任何 Dapr 实例。如果您还计划在容器中运行 Dapr 应用,则需要在共享的 Docker 网络上运行它们,并使用正确的目标地址更新配置。
Prometheus 运行后,您可以通过访问 http://localhost:8080 来访问其仪表板。
kubectl create namespace dapr-monitoring
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install dapr-prom prometheus-community/prometheus -n dapr-monitoring
如果您是 Minikube 用户或出于开发目的想要禁用持久卷,可以使用以下命令禁用它。
helm install dapr-prom prometheus-community/prometheus -n dapr-monitoring
--set alertmanager.persistence.enabled=false --set pushgateway.persistentVolume.enabled=false --set server.persistentVolume.enabled=false
要自动发现 Dapr 目标(服务发现),请使用:
helm install dapr-prom prometheus-community/prometheus -f values.yaml -n dapr-monitoring --create-namespace
values.yaml 文件alertmanager:
persistence:
enabled: false
pushgateway:
persistentVolume:
enabled: false
server:
persistentVolume:
enabled: false
# 向 prometheus.yml 添加额外的抓取配置
# 使用服务发现来查找 Dapr 和 Dapr sidecar 目标
extraScrapeConfigs: |-
- job_name: dapr-sidecars
kubernetes_sd_configs:
- role: pod
relabel_configs:
- action: keep
regex: "true"
source_labels:
- __meta_kubernetes_pod_annotation_dapr_io_enabled
- action: keep
regex: "true"
source_labels:
- __meta_kubernetes_pod_annotation_dapr_io_enable_metrics
- action: replace
replacement: ${1}
source_labels:
- __meta_kubernetes_namespace
target_label: namespace
- action: replace
replacement: ${1}
source_labels:
- __meta_kubernetes_pod_name
target_label: pod
- action: replace
regex: (.*);daprd
replacement: ${1}-dapr
source_labels:
- __meta_kubernetes_pod_annotation_dapr_io_app_id
- __meta_kubernetes_pod_container_name
target_label: service
- action: replace
replacement: ${1}:9090
source_labels:
- __meta_kubernetes_pod_ip
target_label: __address__
- job_name: dapr
kubernetes_sd_configs:
- role: pod
relabel_configs:
- action: keep
regex: dapr
source_labels:
- __meta_kubernetes_pod_label_app_kubernetes_io_name
- action: keep
regex: dapr
source_labels:
- __meta_kubernetes_pod_label_app_kubernetes_io_part_of
- action: replace
replacement: ${1}
source_labels:
- __meta_kubernetes_pod_label_app
target_label: app
- action: replace
replacement: ${1}
source_labels:
- __meta_kubernetes_namespace
target_label: namespace
- action: replace
replacement: ${1}
source_labels:
- __meta_kubernetes_pod_name
target_label: pod
- action: replace
replacement: ${1}:9090
source_labels:
- __meta_kubernetes_pod_ip
target_label: __address__
确保 Prometheus 在您的集群中运行。
kubectl get pods -n dapr-monitoring
预期输出:
NAME READY STATUS RESTARTS AGE
dapr-prom-kube-state-metrics-9849d6cc6-t94p8 1/1 Running 0 4m58s
dapr-prom-prometheus-alertmanager-749cc46f6-9b5t8 2/2 Running 0 4m58s
dapr-prom-prometheus-node-exporter-5jh8p 1/1 Running 0 4m58s
dapr-prom-prometheus-node-exporter-88gbg 1/1 Running 0 4m58s
dapr-prom-prometheus-node-exporter-bjp9f 1/1 Running 0 4m58s
dapr-prom-prometheus-pushgateway-688665d597-h4xx2 1/1 Running 0 4m58s
dapr-prom-prometheus-server-694fd8d7c-q5d59 2/2 Running 0 4m58s
要查看 Prometheus 仪表板并检查服务发现:
kubectl port-forward svc/dapr-prom-prometheus-server 9090:80 -n dapr-monitoring
打开浏览器并访问 http://localhost:9090。导航到 Status > Service Discovery 以验证 Dapr 目标是否被正确发现。

您可以看到 job_name 及其发现的目标。

默认情况下,每个 Dapr 系统进程都会发出 Go 运行时/进程指标,并具有各自的 Dapr 指标。
Dapr sidecar 暴露了一个兼容 Prometheus 的指标端点,您可以对其进行抓取以更深入地了解 Dapr 的运行状态。
指标应用端点默认启用。您可以通过传递命令行参数 --enable-metrics=false 来禁用它。
默认指标端口为 9090。您可以通过向 daprd 传递命令行参数 --metrics-port 来覆盖此设置。
您还可以通过在应用程序部署上设置 dapr.io/enable-metrics: "false" 注解来为特定应用程序启用/禁用指标。在禁用指标导出器的情况下,daprd 不会打开指标监听端口。
以下 Kubernetes 部署示例显示了如何显式启用指标并将端口指定为 “9090”。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodeapp
labels:
app: node
spec:
replicas: 1
selector:
matchLabels:
app: node
template:
metadata:
labels:
app: node
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "nodeapp"
dapr.io/app-port: "3000"
dapr.io/enable-metrics: "true"
dapr.io/metrics-port: "9090"
spec:
containers:
- name: node
image: dapriosamples/hello-k8s-node:latest
ports:
- containerPort: 3000
imagePullPolicy: Always
您还可以通过应用程序配置启用指标。要默认禁用 Dapr sidecar 中的指标收集,请将 spec.metrics.enabled 设置为 false。
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: tracing
namespace: default
spec:
metrics:
enabled: false
您可以通过将 spec.metrics.recordErrorCodes 设置为 true 来为 Dapr API 错误代码 启用其他指标。与调用者通信的 Dapr API 可能返回标准化的错误代码。记录了一个名为 error_code_total 的新指标,它允许监控由应用程序、代码和类别触发的错误代码。有关特定代码和类别,请参阅 errorcodes 包。
配置示例:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: tracing
namespace: default
spec:
metrics:
enabled: true
recordErrorCodes: true
指标示例:
{
"app_id": "publisher-app",
"category": "state",
"dapr_io_enabled": "true",
"error_code": "ERR_STATE_STORE_NOT_CONFIGURED",
"instance": "10.244.1.64:9090",
"job": "kubernetes-service-endpoints",
"namespace": "my-app",
"node": "my-node",
"service": "publisher-app-dapr"
}
在使用 HTTP 调用 Dapr 时,默认会为每个请求的方法创建指标。这可能导致大量指标,即高基数,从而影响内存使用和 CPU。
路径匹配允许您管理和控制 Dapr 中 HTTP 指标的基数。这是指标的聚合,因此您无需为每个事件设置一个指标,而是可以减少指标事件的数量并报告一个总体数字。了解如何在配置中设置基数。
此配置是可选的,通过 Dapr 配置 spec.metrics.http.pathMatching 启用。定义后,它启用路径匹配,该匹配会为两个指标路径标准化指定的路径。这减少了唯一指标路径的数量,使指标更易于管理,并以受控方式减少资源消耗。
当 spec.metrics.http.pathMatching 与设置为 false 的 increasedCardinality 标志结合使用时,非匹配路径将转换为 catch-all 存储桶以控制和限制基数,防止无限制的路径增长。相反,当 increasedCardinality 为 true(默认值)时,非匹配路径照常传递,从而允许可能更高的基数,但保留原始路径数据。
以下示例演示了如何在 Dapr 中使用路径匹配 API 来管理 HTTP 指标。在每个示例中,指标是从 5 个对带有不同订单 ID 的 /orders 端点的 HTTP 请求中收集的。通过调整基数并利用路径匹配,您可以微调指标的粒度,以平衡细节和资源效率。
这些示例说明了指标的基数,强调高基数配置会导致许多条目,这对应于处理指标的更高内存使用。为简单起见,以下示例侧重于单个指标:dapr_http_server_request_count。
配置:
http:
increasedCardinality: false
pathMatching:
- /orders/{orderID}
生成的指标:
# 匹配的路径
dapr_http_server_request_count{app_id="order-service",method="GET",path="/orders/{orderID}",status="200"} 5
# 未匹配的路径
dapr_http_server_request_count{app_id="order-service",method="GET",path="",status="200"} 1
通过配置低基数和路径匹配,您可以通过为重要端点分组指标来获得两全其美的效果,而不会影响基数。这种方法有助于避免高内存使用和潜在的安全问题。
配置:
http:
increasedCardinality: false
生成的指标:
dapr_http_server_request_count{app_id="order-service",method="GET", path="",status="200"} 5
在低基数模式下,作为无限制基数的主要来源的路径将被丢弃。这导致指标主要指示对给定 HTTP 方法向服务发出的请求数,但没有任何关于所调用路径的信息。
配置:
http:
increasedCardinality: true
pathMatching:
- /orders/{orderID}
生成的指标:
dapr_http_server_request_count{app_id="order-service",method="GET",path="/orders/{orderID}",status="200"} 5
此示例产生与上述示例相同的 HTTP 请求,但为路径 /orders/{orderID} 配置了路径匹配。通过使用路径匹配,您可以通过根据匹配的路径对指标进行分组来实现基数降低。
配置:
http:
increasedCardinality: true
生成的指标:
dapr_http_server_request_count{app_id="order-service",method="GET",path="/orders/1",status="200"} 1
dapr_http_server_request_count{app_id="order-service",method="GET",path="/orders/2",status="200"} 1
dapr_http_server_request_count{app_id="order-service",method="GET",path="/orders/3",status="200"} 1
dapr_http_server_request_count{app_id="order-service",method="GET",path="/orders/4",status="200"} 1
dapr_http_server_request_count{app_id="order-service",method="GET",path="/orders/5",status="200"} 1
对于每个请求,都会使用请求路径创建一个新指标。此过程继续进行对每个新订单 ID 发出的每个请求,导致无限制的基数,因为 ID 不断增长。
excludeVerbs 选项允许您排除特定 HTTP 动词在指标中报告。这在内存节省至关重要的高性能应用程序中非常有用。
以下示例演示了如何在 Darp r 中排除 HTTP 动词以管理 HTTP 指标。
配置:
http:
excludeVerbs: false
生成的指标:
dapr_http_server_request_count{app_id="order-service",method="GET",path="/orders",status="200"} 1
dapr_http_server_request_count{app_id="order-service",method="POST",path="/orders",status="200"} 1
在此示例中,HTTP 方法包含在指标中,导致对 /orders 端点的每个请求都有单独的指标。
配置:
http:
excludeVerbs: true
生成的指标:
dapr_http_server_request_count{app_id="order-service",method="",path="/orders",status="200"} 2
在此示例中,HTTP 方法从指标中排除,导致对 /orders 端点的所有请求都有单个指标。
Dapr 使用累积直方图指标将延迟值分组到存储桶中,其中每个存储桶包含:
默认情况下,Dapr 将请求延迟指标分组到以下存储桶中:
1, 2, 3, 4, 5, 6, 8, 10, 13, 16, 20, 25, 30, 40, 50, 65, 80, 100, 130, 160, 200, 250, 300, 400, 500, 650, 800, 1000, 2000, 5000, 10000, 20000, 50000, 100000
以累积方式对延迟值进行分组允许根据需要使用或删除存储桶,以增加或减少数据的粒度。 例如,如果请求花费 3ms,它将计入 3ms 存储桶、4ms 存储桶、5ms 存储桶等。 同样,如果请求花费 10ms,它将计入 10ms 存储桶、13ms 存储桶、16ms 存储桶等。 在这两个请求完成后,3ms 存储桶的计数为 1,10ms 存储桶的计数为 2,因为这里包括 3ms 和 10ms 请求。
这显示如下:
| 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 13 | 16 | 20 | 25 | 30 | 40 | 50 | 65 | 80 | 100 | 130 | 160 | ….. | 100000 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | ….. | 2 |
默认的存储桶数量适用于大多数用例,但可以根据需要进行调整。每个请求会创建 34 个不同的指标,如果应用程序数量很大,这个值可能会大幅增长。 通过增加存储桶的数量,可以实现更准确的延迟百分位数。但是,存储桶数量越多,用于存储指标的内存就越多,可能会对您的监控系统产生负面影响。
建议将延迟存储桶的数量保持为默认值,除非您在监控系统中看到不必要的内存压力。配置存储桶的数量允许您选择以下应用程序:
在配置存储桶数量之前,请注意您的应用程序生成的默认延迟值。
通过修改应用程序的 Dapr 配置规范 中的 spec.metrics.latencyDistributionBuckets 字段,根据您的需求定制延迟存储桶。
例如,如果您对极低的延迟值(1-10ms)不感兴趣,可以将它们分组到一个 10ms 存储桶中。同样,您可以将高值分组到一个存储桶中(1000-5000ms),同时在您最感兴趣的中间值范围内保留更多详细信息。
以下配置规范示例用 11 个存储桶替换了默认的 34 个存储桶,在中间值范围内提供了更高级别的粒度:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: custom-metrics
spec:
metrics:
enabled: true
latencyDistributionBuckets: [10, 25, 40, 50, 70, 100, 150, 200, 500, 1000, 5000]
您可以为 Dapr sidecar 暴露的每个指标设置正则表达式,以"转换"它们的值。查看所有 Dapr 指标的列表。
规则的名称必须与要转换的指标的名称匹配。以下示例显示了如何为指标 dapr_runtime_service_invocation_req_sent_total 中的标签 method 应用正则表达式:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: daprConfig
spec:
metrics:
enabled: true
http:
increasedCardinality: true
rules:
- name: dapr_runtime_service_invocation_req_sent_total
labels:
- name: method
regex:
"orders/": "orders/.+"
应用此配置后,method 标签为 orders/a746dhsk293972nz 的记录指标将替换为 orders/。
使用正则表达式减少指标基数被视为传统方法。我们鼓励所有用户改为将 spec.metrics.http.increasedCardinality 设置为 false,这样配置更简单,并提供更好的性能。
grafana-system-services-dashboard.json 模板显示 Dapr 系统组件状态,包括 dapr-operator、dapr-sidecar-injector、dapr-sentry 和 dapr-placement:

grafana-sidecar-dashboard.json 模板显示 Dapr 边车状态,包括边车健康状态/资源使用、HTTP 和 gRPC 的吞吐量/延迟、Actor、mTLS 等:

grafana-actor-dashboard.json 模板显示 Dapr Sidecar 状态、Actor 调用吞吐量/延迟、timer/reminder 触发器以及轮转并发:

添加 Grafana Helm 仓库:
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
安装 chart:
helm install grafana grafana/grafana -n dapr-monitoring
如果你是 Minikube 用户或出于开发目的想要禁用持久卷,可以使用以下命令来禁用它:
helm install grafana grafana/grafana -n dapr-monitoring --set persistence.enabled=false
获取 Grafana 登录的管理员密码:
kubectl get secret --namespace dapr-monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
你将获得一个类似于 cj3m0OfBNx8SLzUlTx91dEECgzRlYJb60D2evof1% 的密码。从密码中移除 % 字符,得到 cj3m0OfBNx8SLzUlTx91dEECgzRlYJb60D2evof1 作为管理员密码。
验证 Grafana 是否在你的集群中运行:
kubectl get pods -n dapr-monitoring
NAME READY STATUS RESTARTS AGE
dapr-prom-kube-state-metrics-9849d6cc6-t94p8 1/1 Running 0 4m58s
dapr-prom-prometheus-alertmanager-749cc46f6-9b5t8 2/2 Running 0 4m58s
dapr-prom-prometheus-node-exporter-5jh8p 1/1 Running 0 4m58s
dapr-prom-prometheus-node-exporter-88gbg 1/1 Running 0 4m58s
dapr-prom-prometheus-node-exporter-bjp9f 1/1 Running 0 4m58s
dapr-prom-prometheus-pushgateway-688665d597-h4xx2 1/1 Running 0 4m58s
dapr-prom-prometheus-server-694fd8d7c-q5d59 2/2 Running 0 4m58s
grafana-c49889cff-x56vj 1/1 Running 0 5m10s
首先需要将 Prometheus 作为数据源连接到 Grafana。
将 svc/grafana 端口转发:
kubectl port-forward svc/grafana 8080:80 -n dapr-monitoring
Forwarding from 127.0.0.1:8080 -> 3000
Forwarding from [::1]:8080 -> 3000
Handling connection for 8080
Handling connection for 8080
在浏览器中打开 http://localhost:8080
登录 Grafana
admin选择 Configuration 和 Data Sources

添加 Prometheus 作为数据源。

获取你的 Prometheus HTTP URL
Prometheus HTTP URL 遵循格式 http://<prometheus service endpoint>.<namespace>
首先通过运行以下命令获取 Prometheus 服务器端点:
kubectl get svc -n dapr-monitoring
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dapr-prom-kube-state-metrics ClusterIP 10.0.174.177 <none> 8080/TCP 7d9h
dapr-prom-prometheus-alertmanager ClusterIP 10.0.255.199 <none> 80/TCP 7d9h
dapr-prom-prometheus-node-exporter ClusterIP None <none> 9100/TCP 7d9h
dapr-prom-prometheus-pushgateway ClusterIP 10.0.190.59 <none> 9091/TCP 7d9h
dapr-prom-prometheus-server ClusterIP 10.0.172.191 <none> 80/TCP 7d9h
elasticsearch-master ClusterIP 10.0.36.146 <none> 9200/TCP,9300/TCP 7d10h
elasticsearch-master-headless ClusterIP None <none> 9200/TCP,9300/TCP 7d10h
grafana ClusterIP 10.0.15.229 <none> 80/TCP 5d5h
kibana-kibana ClusterIP 10.0.188.224 <none> 5601/TCP 7d10h
在本指南中,服务器名称是 dapr-prom-prometheus-server,命名空间是 dapr-monitoring,所以 HTTP URL 将是 http://dapr-prom-prometheus-server.dapr-monitoring。
填写以下设置:
Daprhttp://dapr-prom-prometheus-server.dapr-monitoring
点击 Save & Test 按钮验证连接是否成功。
在 Grafana 主屏幕的左上角,点击 “+” 选项,然后选择 “Import”。
现在你可以从 发布资源中导入适用于你的 Dapr 版本的 Grafana 仪表板模板:

找到你导入的仪表板并开始使用

将鼠标悬停在角落的 i 上以查看每个图表的描述:

New Relic 提供 Prometheus OpenMetrics 集成。
本文档介绍如何在集群中安装它,使用 Helm chart(推荐方式)。
按照官方说明安装 Helm。
按照这些说明添加 New Relic 官方 Helm chart 仓库。
运行以下命令通过 Helm 安装 New Relic Logging Kubernetes 插件,将占位符值 YOUR_LICENSE_KEY 替换为您的 New Relic 许可证密钥:
helm install nri-prometheus newrelic/nri-prometheus --set licenseKey=YOUR_LICENSE_KEY


确保 Azure Monitor Agents (AMA) 正在运行。
$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
...
ama-logs-48kpv 2/2 Running 0 2d13h
ama-logs-mx24c 2/2 Running 0 2d13h
ama-logs-rs-f9bbb9898-vbt6k 1/1 Running 0 30h
ama-logs-sm2mz 2/2 Running 0 2d13h
ama-logs-z7p4c 2/2 Running 0 2d13h
...
应用 Config Map 以启用 Prometheus 指标端点采集。
你可以使用 azm-config-map.yaml 来启用 Prometheus 指标端点采集。
如果你将 Dapr 安装到不同的命名空间,需要更改 monitor_kubernetes_pod_namespaces 数组值。例如:
...
prometheus-data-collection-settings: |-
[prometheus_data_collection_settings.cluster]
interval = "1m"
monitor_kubernetes_pods = true
monitor_kubernetes_pods_namespaces = ["dapr-system", "default"]
[prometheus_data_collection_settings.node]
interval = "1m"
...
应用 Config Map:
kubectl apply -f ./azm-config.map.yaml
安装 Dapr 并启用 JSON 格式日志。
helm install dapr dapr/dapr --namespace dapr-system --set global.logAsJson=true
在 Dapr sidecar 中启用 JSON 格式日志并添加 Prometheus 注解。
注意:Azure Monitor Agents (AMA) 仅在设置了 Prometheus 注解时才会发送指标。
在你的部署 yaml 中添加 dapr.io/log-as-json: "true" 注解。
示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: pythonapp
namespace: default
labels:
app: python
spec:
replicas: 1
selector:
matchLabels:
app: python
template:
metadata:
labels:
app: python
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "pythonapp"
dapr.io/log-as-json: "true"
prometheus.io/scrape: "true"
prometheus.io/port: "9090"
prometheus.io/path: "/"
...
转到 Azure 门户中的 Azure Monitor。
搜索 Dapr 日志。
下面是一个示例查询,用于解析 JSON 格式的日志并从 Dapr 系统进程查询日志。
ContainerLog
| extend parsed=parse_json(LogEntry)
| project Time=todatetime(parsed['time']), app_id=parsed['app_id'], scope=parsed['scope'],level=parsed['level'], msg=parsed['msg'], type=parsed['type'], ver=parsed['ver'], instance=parsed['instance']
| where level != ""
| sort by Time
此查询用于查询 Dapr 系统进程的 process_resident_memory_bytes Prometheus 指标并渲染时间图表。
InsightsMetrics
| where Namespace == "prometheus" and Name == "process_resident_memory_bytes"
| extend tags=parse_json(Tags)
| project TimeGenerated, Name, Val, app=tostring(tags['app'])
| summarize memInBytes=percentile(Val, 99) by bin(TimeGenerated, 1m), app
| where app startswith "dapr-"
| render timechart
Dapr 会生成结构化日志并输出到 stdout,格式可以是纯文本或 JSON。默认情况下,所有 Dapr 进程(runtime 或 sidecar,以及所有控制平面服务)以纯文本形式将日志写入控制台(stdout)。要启用 JSON 格式的日志记录,在运行 Dapr 进程时需要添加 --log-as-json 命令标志。
Dapr 根据以下架构生成日志:
| 字段 | 描述 | 示例 |
|---|---|---|
| time | ISO8601 时间戳 | 2011-10-05T14:48:00.000Z |
| level | 日志级别(info/warn/debug/error) | info |
| type | 日志类型 | log |
| msg | 日志消息 | hello dapr! |
| scope | 日志记录范围 | dapr.runtime |
| instance | 容器名称 | dapr-pod-xxxxx |
| app_id | Dapr App ID | dapr-app |
| ver | Dapr Runtime 版本 | 1.9.0 |
API 日志记录可能会添加其他结构化字段,如 API 日志记录文档 中所述。
time="2022-11-01T17:08:48.303776-07:00" level=info msg="starting Dapr Runtime -- version 1.9.0 -- commit v1.9.0-g5dfcf2e" instance=dapr-pod-xxxx scope=dapr.runtime type=log ver=1.9.0
time="2022-11-01T17:08:48.303913-07:00" level=info msg="log level set to: info" instance=dapr-pod-xxxx scope=dapr.runtime type=log ver=1.9.0
{"instance":"dapr-pod-xxxx","level":"info","msg":"starting Dapr Runtime -- version 1.9.0 -- commit v1.9.0-g5dfcf2e","scope":"dapr.runtime","time":"2022-11-01T17:09:45.788005Z","type":"log","ver":"1.9.0"}
{"instance":"dapr-pod-xxxx","level":"info","msg":"log level set to: info","scope":"dapr.runtime","time":"2022-11-01T17:09:45.788075Z","type":"log","ver":"1.9.0"}
Dapr 支持输出纯文本(默认)或 JSON 格式的日志。
要使用 JSON 格式的日志,你需要在安装 Dapr 和部署应用时添加额外的配置选项。建议使用 JSON 格式的日志,因为大多数日志收集器和搜索引擎可以使用内置的解析器更轻松地解析 JSON。
使用 Dapr CLI 运行应用程序时,传递 --log-as-json 选项以启用 JSON 格式的日志,例如:
dapr run \
--app-id orderprocessing \
--resources-path ./components/ \
--log-as-json \
-- python3 OrderProcessingService.py
以下步骤描述了如何为 Kubernetes 配置 JSON 格式的日志
Dapr 控制平面中的所有服务(例如 operator、sentry 等)都支持 --log-as-json 选项来启用 JSON 格式的日志记录。
如果你使用 Helm chart 将 Dapr 部署到 Kubernetes,可以通过传递 --set global.logAsJson=true 选项为 Dapr 系统服务启用 JSON 格式的日志,例如:
helm upgrade --install dapr \
dapr/dapr \
--namespace dapr-system \
--set global.logAsJson=true
你可以通过在部署中添加 dapr.io/log-as-json: "true" 注解来为 Dapr sidecars 启用 JSON 格式的日志,例如:
apiVersion: apps/v1
kind: Deployment
metadata:
name: pythonapp
labels:
app: python
spec:
selector:
matchLabels:
app: python
template:
metadata:
labels:
app: python
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "pythonapp"
# This enables JSON-formatted logging
dapr.io/log-as-json: "true"
...
API 日志记录使你能够查看应用程序对 Dapr sidecar 发起的 API 调用,以调试问题或监控应用程序的行为。你可以将 Dapr API 日志记录与 Dapr 日志事件结合使用。
有关更多信息,请参阅配置和查看 Dapr 日志和配置和查看 Dapr API 日志。
如果你在 Kubernetes 集群中运行 Dapr,Fluentd 是一个流行的容器日志收集器。你可以将 Fluentd 与 JSON 解析器插件结合使用来解析 Dapr JSON 格式的日志。这个操作指南展示了如何在集群中配置 Fluentd。
如果你使用 Azure Kubernetes Service,可以使用内置代理通过 Azure Monitor 收集日志,无需安装 Fluentd。
如果你使用 Fluentd,我们建议使用 Elastic Search 和 Kibana。这个操作指南展示了如何在 Kubernetes 集群中设置 Elastic Search 和 Kibana。
如果你使用 Azure Kubernetes Service,可以使用 Azure Monitor for containers 而无需安装任何其他监控工具。另请参阅如何为容器启用 Azure Monitor
为监控工具创建一个 Kubernetes 命名空间
kubectl create namespace dapr-monitoring
添加 Elasticsearch 的 helm 仓库
helm repo add elastic https://helm.elastic.co
helm repo update
使用 Helm 安装 Elasticsearch
默认情况下,该 chart 会创建 3 个副本,这些副本必须分布在不同的节点上。如果你的集群节点数少于 3 个,请指定较小的副本数。例如,以下命令将副本数设置为 1:
helm install elasticsearch elastic/elasticsearch --version 7.17.3 -n dapr-monitoring --set replicas=1
否则:
helm install elasticsearch elastic/elasticsearch --version 7.17.3 -n dapr-monitoring
如果你正在使用 minikube 或只是为了开发目的想禁用持久卷,可以使用以下命令:
helm install elasticsearch elastic/elasticsearch --version 7.17.3 -n dapr-monitoring --set persistence.enabled=false,replicas=1
安装 Kibana
helm install kibana elastic/kibana --version 7.17.3 -n dapr-monitoring
确保 Elasticsearch 和 Kibana 在你的 Kubernetes 集群中运行
$ kubectl get pods -n dapr-monitoring
NAME READY STATUS RESTARTS AGE
elasticsearch-master-0 1/1 Running 0 6m58s
kibana-kibana-95bc54b89-zqdrk 1/1 Running 0 4m21s
安装 config map 和以 daemonset 方式运行的 Fluentd
下载这些配置文件:
注意:如果你的集群中已经有 Fluentd 在运行,请启用嵌套 JSON 解析器,以便它可以解析来自 Dapr 的 JSON 格式日志。
将配置应用到你的集群:
kubectl apply -f ./fluentd-config-map.yaml
kubectl apply -f ./fluentd-dapr-with-rbac.yaml
确保 Fluentd 作为 daemonset 运行。Fluentd 实例的数量应与集群节点数相同。在下面的示例中,集群中只有一个节点:
$ kubectl get pods -n kube-system -w
NAME READY STATUS RESTARTS AGE
coredns-6955765f44-cxjxk 1/1 Running 0 4m41s
coredns-6955765f44-jlskv 1/1 Running 0 4m41s
etcd-m01 1/1 Running 0 4m48s
fluentd-sdrld 1/1 Running 0 14s
安装 Dapr 并启用 JSON 格式日志
helm repo add dapr https://dapr.github.io/helm-charts/
helm repo update
helm install dapr dapr/dapr --namespace dapr-system --set global.logAsJson=true
在 Dapr sidecar 中启用 JSON 格式日志
将 dapr.io/log-as-json: "true" 注解添加到你的 deployment yaml 中。例如:
apiVersion: apps/v1
kind: Deployment
metadata:
name: pythonapp
namespace: default
labels:
app: python
spec:
replicas: 1
selector:
matchLabels:
app: python
template:
metadata:
labels:
app: python
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "pythonapp"
dapr.io/log-as-json: "true"
...
注意:Elasticsearch 需要一些时间来索引 Fluentd 发送的日志。
从本地端口转发到 svc/kibana-kibana
$ kubectl port-forward svc/kibana-kibana 5601 -n dapr-monitoring
Forwarding from 127.0.0.1:5601 -> 5601
Forwarding from [::1]:5601 -> 5601
Handling connection for 5601
Handling connection for 5601
浏览到 http://localhost:5601
展开下拉菜单并点击 Management → Stack Management

在 Stack Management 页面上,选择 Data → Index Management 并等待 dapr-* 被索引。

一旦 dapr-* 被索引,点击 Kibana → Index Patterns,然后点击 Create index pattern 按钮。

通过在 Index Pattern name 字段中输入 dapr* 来定义新的索引模式,然后点击 Next step 按钮继续。

通过从 Time field 下拉列表中选择 @timestamp 选项,配置与新索引模式一起使用的主时间字段。点击 Create index pattern 按钮完成索引模式的创建。

应该显示新创建的索引模式。通过使用 Fields 选项卡中的搜索框,确认感兴趣的字段(如 scope、type、app_id、level 等)正在被索引。
注意:如果你找不到索引字段,请稍候。搜索所有索引字段所需的时间取决于数据量和运行 Elasticsearch 的资源大小。

要浏览索引数据,展开下拉菜单并点击 Analytics → Discover。

在搜索框中输入查询字符串,例如 scope:*,然后点击 Refresh 按钮查看结果。
注意:这可能需要很长时间。返回所有结果所需的时间取决于数据量和运行 Elasticsearch 的资源大小。

New Relic 提供了一个 Fluent Bit 输出插件,可以轻松将日志转发到 New Relic Logs。该插件也以独立的 Docker 镜像形式提供,可以以 DaemonSet 的形式安装在 Kubernetes 集群中,我们称之为 Kubernetes 插件。
本文档介绍了如何在集群中安装该插件,可以使用 Helm chart(推荐),或者通过手动应用 Kubernetes 清单文件。
按照官方说明安装 Helm。
按照这些说明添加 New Relic 官方 Helm chart 仓库
运行以下命令通过 Helm 安装 New Relic Logging Kubernetes 插件,将占位符值 YOUR_LICENSE_KEY 替换为您的 New Relic 许可证密钥:
Helm 3
helm install newrelic-logging newrelic/newrelic-logging --set licenseKey=YOUR_LICENSE_KEY
Helm 2
helm install newrelic/newrelic-logging --name newrelic-logging --set licenseKey=YOUR_LICENSE_KEY
对于欧盟用户,请在上述任何 helm install 命令中添加 --set endpoint=https://log-api.eu.newrelic.com/log/v1。
默认情况下,日志跟踪设置为 /var/log/containers/*.log。要更改此设置,请在上述任何 helm install 命令中添加 –set fluentBit.path=DESIRED_PATH 来提供您首选的路径。
将以下 3 个清单文件下载到当前工作目录:
curl https://raw.githubusercontent.com/newrelic/helm-charts/master/charts/newrelic-logging/k8s/fluent-conf.yml > fluent-conf.yml
curl https://raw.githubusercontent.com/newrelic/helm-charts/master/charts/newrelic-logging/k8s/new-relic-fluent-plugin.yml > new-relic-fluent-plugin.yml
curl https://raw.githubusercontent.com/newrelic/helm-charts/master/charts/newrelic-logging/k8s/rbac.yml > rbac.yml
在下载的 new-relic-fluent-plugin.yml 文件中,将占位符值 LICENSE_KEY 替换为您的 New Relic 许可证密钥。
对于欧盟用户,将 ENDPOINT 环境变量替换为 https://log-api.eu.newrelic.com/log/v1。
添加许可证密钥后,在终端或命令行界面中运行以下命令:
kubectl apply -f .
[可选] 您可以通过编辑 fluent-conf.yml 文件中的 parsers.conf 部分来配置插件如何解析数据。有关更多信息,请参阅 Fluent Bit 关于 Parsers 配置的文档。
默认情况下,日志跟踪设置为 /var/log/containers/*.log。要更改此设置,请在 new-relic-fluent-plugin.yml 文件中将默认路径替换为您首选的路径。

