收集日志

本任务展示如何配置 Istio 来自动地收集网格中服务的遥测指标。任务的最后,将为调用网格内部的服务打开一个新的日志流。

全文以 Bookinfo 作为示例应用。

开始之前

  • 在集群中安装 Istio 并部署一个应用。本任务假定在默认配置(--configDefaultNamespace=istio-system)中安装了 Mixer。如果您使用了不同的配置,请更新本任务中配置文件和命令的对应项与之匹配。

收集新的日志数据

  1. 为新日志流生效一个 YAML 配置文件,Istio 将自动生成并收集日志信息。

    Zip
    $ kubectl apply -f @samples/bookinfo/telemetry/log-entry.yaml@
    
  2. 向示例应用发送流量。

    以 Bookinfo 为例,在浏览器中访问 http://$GATEWAY_URL/productpage 或执行如下命令:

    $ curl http://$GATEWAY_URL/productpage
    
  3. 验证是否已经生成了日志流并且正向其中不断增添请求。

    在 Kubernetes 环境中,搜索 istio-telemetry pods 的日志信息,如下所示:

    $ kubectl logs -n istio-system -l istio-mixer-type=telemetry -c mixer | grep "newlog" | grep -v '"destination":"telemetry"' | grep -v '"destination":"pilot"' | grep -v '"destination":"policy"' | grep -v '"destination":"unknown"'
    {"level":"warn","time":"2018-09-15T20:46:36.009801Z","instance":"newlog.xxxxx.istio-system","destination":"details","latency":"13.601485ms","responseCode":200,"responseSize":178,"source":"productpage","user":"unknown"}
    {"level":"warn","time":"2018-09-15T20:46:36.026993Z","instance":"newlog.xxxxx.istio-system","destination":"reviews","latency":"919.482857ms","responseCode":200,"responseSize":295,"source":"productpage","user":"unknown"}
    {"level":"warn","time":"2018-09-15T20:46:35.982761Z","instance":"newlog.xxxxx.istio-system","destination":"productpage","latency":"968.030256ms","responseCode":200,"responseSize":4415,"source":"istio-ingressgateway","user":"unknown"}
    

理解日志配置文件

在本任务中,您新增了 Istio 配置来通知 Mixer 自动生成并报告一个新的日志流,以记录网格内的所有请求。

新增配置控制 Mixer 的三项功能:

  1. 基于 Istio 的属性信息,生成 实例 (本示例中,指的是日志项)。

  2. 创建 handler (配置好的 Mixer 适配器),处理生成的 实例

  3. 根据一组 规则 ,将 实例 分配给 handler

日志配置文件指示 Mixer 将日志项发送到标准输出。其中使用了三段(或块)配置:实例 配置,handler 配置以及 规则 配置。

配置段 kind: instance 为生成的日志项(或 实例 )定义了一个模式,名为 newlog。实例配置通知 Mixer 如何基于 Envoy 报告的属性信息,为请求生成日志项。

参数 severity 用于为生成的 logentry 标识日志级别。在本示例中,使用了一个字面表达,值为 “warn”。logentry handler 将把该字面值映射为其支持的日志级别。

参数 timestamp 提供所有日志项的时间信息。在本示例中,根据 Envoy 提供的信息,时间为属性 request.time 的值。

参数 variables 允许运维人员配置应该在每个 logentry 中显示的信息。一组表达式负责管理从 Istio 属性值和字面值到构成 logentry 对应值的映射关系。在本示例中,每个 logentry 实例都包含一个域名 latency,其对应着属性 response.duration 的值。如果没有已知的 response.duration 属性值,则将 latency 域值设置为 0ms

配置段 kind: handler 定义了一个名为 newloghandlerhandler 。Handler spec 负责配置 stdio 编译的适配器代码如何处理接收到的 logentry 实例。参数 severity_levels 负责管理 logentryseverity 域值如何映射到所支持的日志级别。本示例中,“warn” 映射为日志级别 “WARNING”。参数 outputAsJson 指示适配器生成 JSON 格式的日志行。

配置段 kind: rule 定义了一个新 规则 ,名为 newlogstdio。该规则指示 Mixer 将所有 newlog 实例发送给 handler newloghandler。由于参数 match 被设置为 true,该规则对网格中的所有请求都生效。

规则规范中的 match: true 表达式无需对所有请求配置一个执行规则。删掉 spec 中的 match 参数等价于设置了 match: true。本案例中将其包含在 spec 中,是为了说明如何使用 match 表达式来控制执行规则。

清除

  • 删除新的日志配置:

    Zip
    $ kubectl delete -f @samples/bookinfo/telemetry/log-entry.yaml@
    

    若使用 Istio 1.1.2 或更早版本:

    Zip
    $ kubectl delete -f @samples/bookinfo/telemetry/log-entry-crd.yaml@
    
  • 若无后续任务,请参考 Bookinfo cleanup 命令关掉应用。

这些信息有用吗?
Do you have any suggestions for improvement?

Thanks for your feedback!