1 - 操作指南:使用 Prometheus 监控指标

使用 Prometheus 收集与 Dapr 运行时执行相关的时间序列数据

本地设置 Prometheus

在本地计算机上,您可以选择安装并作为进程运行 Prometheus,或者将其作为Docker 容器运行

安装

请按照此处提供的步骤,根据您的操作系统安装 Prometheus。

配置

安装完成后,您需要创建一个配置文件。

以下是一个示例 Prometheus 配置,请将其保存为文件,例如 /tmp/prometheus.ymlC:\Temp\prometheus.yml

global:
  scrape_interval:     15s # 默认情况下,每 15 秒收集一次指标。

# 包含一个收集端点的配置:
# 这里是 Prometheus 自身。
scrape_configs:
  - job_name: 'dapr'

    # 覆盖全局默认值,每 5 秒从此 job 收集指标。
    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 来查看其仪表板。

在 Kubernetes 上设置 Prometheus

先决条件

安装 Prometheus

  1. 首先创建一个命名空间,用于部署 Grafana 和 Prometheus 监控工具
kubectl create namespace dapr-monitoring
  1. 安装 Prometheus
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__
  1. 验证

确保 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 仪表板

要查看 Prometheus 仪表板并检查服务发现:

kubectl port-forward svc/dapr-prom-prometheus-server 9090:80 -n dapr-monitoring

打开浏览器并访问 http://localhost:9090。导航到 Status > Service Discovery 以验证 Dapr 目标是否被正确发现。

Prometheus Web UI

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

Prometheus Service Discovery

示例

参考资料

2 - 配置指标

启用或禁用Dapr指标

默认情况下,每个Dapr系统进程都会发出Go运行时和进程指标,并拥有自己的Dapr指标

Prometheus端点

Dapr sidecar提供了一个与Prometheus兼容的指标端点,您可以通过抓取该端点来更好地了解Dapr的运行状况。

使用CLI配置指标

指标应用程序端点默认是启用的。您可以通过传递命令行参数--enable-metrics=false来禁用它。

默认的指标端口是9090。您可以通过传递命令行参数--metrics-port给daprd来更改此设置。

在Kubernetes中配置指标

您还可以通过在应用程序部署上设置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.recordErrorCodestrue来为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指标报告

在使用HTTP调用Dapr时,默认情况下会为每个请求的方法创建指标。这可能导致大量指标,称为高基数,这可能会影响内存使用和CPU。

路径匹配允许您管理和控制Dapr中HTTP指标的基数。通过聚合指标,您可以减少指标事件的数量并报告一个总体数量。了解更多关于如何在配置中设置基数

此配置是选择加入的,并通过Dapr配置spec.metrics.http.pathMatching启用。当定义时,它启用路径匹配,这将标准化指定路径的两个指标路径。这减少了唯一指标路径的数量,使指标更易于管理,并以受控方式减少资源消耗。

spec.metrics.http.pathMatchingincreasedCardinality标志设置为false结合使用时,未匹配的路径会被转换为一个通用桶,以控制和限制基数,防止路径无限增长。相反,当increasedCardinalitytrue(默认值)时,未匹配的路径会像通常一样传递,允许潜在的更高基数,但保留原始路径数据。

HTTP指标中的路径匹配示例

以下示例演示了如何在Dapr中使用路径匹配API来管理HTTP指标。在每个示例中,指标是从5个HTTP请求到/orders端点收集的,具有不同的订单ID。通过调整基数和利用路径匹配,您可以微调指标粒度以平衡细节和资源效率。

这些示例说明了指标的基数,强调高基数配置会导致许多条目,这对应于处理指标的更高内存使用。为简单起见,以下示例专注于单个指标: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是不断增长的。

HTTP指标排除动词

excludeVerbs选项允许您从指标中排除特定的HTTP动词。这在内存节省至关重要的高性能应用程序中非常有用。

在指标中排除HTTP动词的示例

以下示例演示了如何在Dapr中排除HTTP动词以管理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动词

配置:

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,因为这两个请求都包含在这里。

这显示如下:

123456810131620253040506580100130160…..100000
00111112222222222222…..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,这更易于配置并提供更好的性能。

参考

3 - 如何使用Grafana监控指标

在Grafana仪表板中查看Dapr指标的方法。

可用的仪表板

grafana-system-services-dashboard.json模板展示了Dapr系统组件的状态,包括dapr-operator、dapr-sidecar-injector、dapr-sentry和dapr-placement:

系统服务仪表板的截图

grafana-sidecar-dashboard.json模板展示了Dapr sidecar 的状态,包括sidecar 的健康状况/资源使用情况、HTTP和gRPC的吞吐量/延迟、actor、mTLS等:

sidecar仪表板的截图

grafana-actor-dashboard.json模板展示了Dapr sidecar 的状态、actor 调用的吞吐量/延迟、timer/reminder触发器和基于回合的并发性:

actor仪表板的截图

前提条件

在Kubernetes上设置

安装Grafana

  1. 添加Grafana Helm仓库:

    helm repo add grafana https://grafana.github.io/helm-charts
    helm repo update
    
  2. 安装图表:

    helm install grafana grafana/grafana -n dapr-monitoring
    
  3. 获取Grafana登录的管理员密码:

    kubectl get secret --namespace dapr-monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
    

    您将看到一个类似于cj3m0OfBNx8SLzUlTx91dEECgzRlYJb60D2evof1%的密码。请去掉密码中的%字符,得到cj3m0OfBNx8SLzUlTx91dEECgzRlYJb60D2evof1作为管理员密码。

  4. 检查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作为数据源

首先,您需要将Prometheus连接为Grafana的数据源。

  1. 端口转发到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
    
  2. 打开浏览器访问http://localhost:8080

  3. 登录Grafana

    • 用户名 = admin
    • 密码 = 上述密码
  4. 选择ConfigurationData Sources

    Grafana添加数据源菜单的截图
  5. 添加Prometheus作为数据源。

    Prometheus添加数据源的截图
  6. 获取您的Prometheus HTTP URL

    Prometheus HTTP URL的格式为http://<prometheus服务端点>.<命名空间>

    首先通过运行以下命令获取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

  7. 填写以下设置:

    • 名称:Dapr
    • HTTP URL:http://dapr-prom-prometheus-server.dapr-monitoring
    • 默认:开启
    • 跳过TLS验证:开启
      • 这是保存和测试配置所必需的
    Prometheus数据源配置的截图
  8. 点击Save & Test按钮以验证连接是否成功。

在Grafana中导入仪表板

  1. 在Grafana主屏幕的左上角,点击“+”选项,然后选择“Import”。

    现在,您可以从发布资产中为您的Dapr版本导入Grafana仪表板模板

    Grafana仪表板上传选项的截图
  2. 找到您导入的仪表板并享受

    Dapr服务仪表板的截图

参考资料

示例

4 - 操作指南:配置 New Relic 以收集和分析指标

为 Dapr 指标配置 New Relic

前提条件

  • New Relic 账户,永久免费,每月提供 100 GB 的免费数据摄取,1 个免费完全访问用户,无限制的免费基本用户

背景信息

New Relic 支持 Prometheus 的 OpenMetrics 集成。

本文档将介绍如何在集群中安装该集成,建议使用 Helm chart 进行安装。

安装步骤

  1. 根据官方说明安装 Helm。

  2. 按照这些说明添加 New Relic 官方 Helm chart 仓库。

  3. 运行以下命令通过 Helm 安装 New Relic Logging Kubernetes 插件,并将 YOUR_LICENSE_KEY 替换为您的 New Relic 许可证密钥

    helm install nri-prometheus newrelic/nri-prometheus --set licenseKey=YOUR_LICENSE_KEY
    

查看指标

Dapr 指标

仪表板

相关链接/参考

5 - 操作指南:配置 Azure Monitor 以搜索日志和收集指标

为 Azure Kubernetes Service (AKS) 启用 Dapr 指标和日志的 Azure Monitor

前提条件

使用配置映射启用 Prometheus 指标抓取

  1. 确认 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
    ...
    
  2. 使用配置映射启用 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"
    ...
    

    应用配置映射:

    kubectl apply -f ./azm-config.map.yaml
    

安装带有 JSON 格式日志的 Dapr

  1. 安装 Dapr 并启用 JSON 格式日志。

    helm install dapr dapr/dapr --namespace dapr-system --set global.logAsJson=true
    
  2. 在 Dapr sidecar 中启用 JSON 格式日志并添加 Prometheus 注解。

    注意:只有设置了 Prometheus 注解,Azure Monitor Agents (AMA) 才会发送指标。

    在部署的 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 Monitor 搜索指标和日志

  1. 在 Azure 门户中进入 Azure Monitor。

  2. 搜索 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
    
  3. 搜索 指标

    这个查询,查询 process_resident_memory_bytes Prometheus 指标用于 Dapr 系统进程并渲染时间图表。

    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
    

参考资料