背景
OpenTelemetry 简介
OpenTelemetry[1] (以下简称 Otel)是一个开源项目,旨在为分布式追踪、度量和日志提供统一的标准,简化应用程序的观测性(Observability)。它提供了一系列工具和 API,用于收集和传输应用程序的性能数据和日志,帮助开发者和运维团队更好地理解系统的行为。功能包括自动和手动检测应用程序的追踪数据,收集关键度量指标,以及捕获和传输日志。Otel 支持多种编程语言和框架,可以与多个后端系统集成,如 Prometheus、Jaeger、Elasticsearch 等。
Log 是 OpenTelemetry 项目的一部分,旨在提供一种标准化的方式来收集、传输和存储日志数据。
Loki 简介
Loki[2] 是 Grafana Labs[3] 开发的一个水平可扩展、高可用性、多租户的日志聚合系统,专为效率和易用性而设计。与传统的日志聚合系统不同,Loki 主要索引日志内容的元数据而不是内容本身,这使得它既轻量又高效。Loki 采用了与 Prometheus[4] 类似的标签系统,使得日志查询更加灵活和强大。常用于存储和查询大量日志数据,特别是与 Grafana 结合使用时,提供了强大的日志可视化和分析能力。
演示
在本演示中将使用 Java 应用进行日志闭环操作的演示,在 Otel Log 支持的语言[5] 中,Java 是的最全面的语言之一。
架构
图片
前置条件
- Kubernetes 集群
- kubectl cli
- helm cli
安装 Loki 和 Grafana
安装 Grafana helm 库。
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
准备 Loki 的配置文件 values.yaml。
loki:
auth_enabled: false
commonConfig:
replication_factor: 1
storage:
type: 'filesystem'
singleBinary:
replicas: 1
安装 Loki。
helm install --values values.yaml loki grafana/loki
安装 Grafana。
helm install grafana grafana/grafana
通过 port forward 可以访问 Grafana http://localhost:3000 。
POD_NAME="$(kubectl get pod -l app.kubernetes.io/name=grafana -o jsnotallow='{.items[0].metadata.name}')"
kubectl --namespace default port-forward $POD_NAME 3000
在 Grafana 中配置 Loki 数据源,指向上面部署 Loki。
图片
安装 Otel Operator
Otel Operator 依赖 cert-manager 进行证书的管理,安装 operator 之前需要安装 cert-manager。
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.2/cert-manager.yaml
执行下面命令安装 Otel Operator
kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml
配置 Instrumentation
成功安装 Otel Operator 之后,接下来就是配置探针的安装和配置了,详细的配置说明,可以参考 Instrumentation API 文档[6]。
Instrumentation 是 Otel Operator 的另一个 CRD,用于自动安装 Otel 探针和配置。本演示虽然主要聚焦在日志,但我们依然保留了之前使用的分布式跟踪的配置,保证链路信息的传递。
- propagators 用于配置跟踪信息在上下文的传递方式。
- sampler 采样器
- env 和 [language].env 添加到容器的环境变量
针对 Java 应用,通过环境变量 OTEL_EXPORTER_OTLP_ENDPOINT 设置 oltp 的端点,以及 OTEL_LOGS_EXPORTER 设置应用 日志的输出方式[7] oltp。也可以设置为 logging、oltp,将日志输出到控制台以及 oltp 端点。
kubectl apply -f -