集成 OpenTelemetry#

什么是 OpenTelemetry?#

OpenTelemetry 是一个用于跟踪、指标和日志的开源可观测性框架。它是 OpenCensus 和 OpenTracing 项目的合并,由云原生计算基金会托管。

OpenTelemetry 允许开发人员以与供应商无关的方式收集和导出遥测数据。使用 OpenTelemetry,您可以一次性对应用程序进行检测,然后添加或更改供应商而无需更改检测,例如,以下是一些支持 OpenTelemetry 的流行 DataDog 竞争对手

什么是跟踪?#

OpenTelemetry 跟踪 允许您查看请求如何通过不同的服务和系统进行,每个操作的计时,以及发生的任何日志和错误。

在分布式环境中,跟踪还有助于您了解微服务之间的关系和交互。分布式跟踪可以深入了解特定微服务的性能以及该服务如何影响其他微服务。

Trace

使用跟踪,您可以将请求分解为跨度。跨度是您的应用程序执行的处理请求的操作(工作单元),例如数据库查询或网络调用。

跟踪是跨度树,显示请求通过应用程序的路径。根跨度是跟踪中的第一个跨度。

Trace

要了解有关跟踪的更多信息,请参阅使用 OpenTelemetry 进行分布式跟踪

OpenTelemetry 检测#

检测是针对流行框架和库的插件,它们使用 OpenTelemetry API 来记录重要操作,例如 HTTP 请求、数据库查询、日志、错误等等。

要安装 OpenTelemetry 检测 用于 redis-py

pip install opentelemetry-instrumentation-redis

然后,您可以使用它来检测代码,如下所示

from opentelemetry.instrumentation.redis import RedisInstrumentor

RedisInstrumentor().instrument()

代码修补后,您可以像往常一样使用 redis-py

# Sync client
client = redis.Redis()
client.get("my-key")

# Async client
client = redis.asyncio.Redis()
await client.get("my-key")

OpenTelemetry API#

OpenTelemetry API 是一个编程接口,您可以使用它来检测代码并收集遥测数据,例如跟踪、指标和日志。

您可以使用 OpenTelemetry API 来衡量重要操作

from opentelemetry import trace

tracer = trace.get_tracer("app_or_package_name", "1.0.0")

# Create a span with name "operation-name" and kind="server".
with tracer.start_as_current_span("operation-name", kind=trace.SpanKind.CLIENT) as span:
    do_some_work()

使用属性记录上下文信息

if span.is_recording():
    span.set_attribute("http.method", "GET")
    span.set_attribute("http.route", "/projects/:id")

并监控异常

except ValueError as exc:
    # Record the exception and update the span status.
    span.record_exception(exc)
    span.set_status(trace.Status(trace.StatusCode.ERROR, str(exc)))

有关详细信息,请参阅 OpenTelemetry Python Tracing API

Uptrace#

Uptrace 是一个 开源 APM,支持分布式跟踪、指标和日志。您可以使用它来监控应用程序并设置自动警报,以便通过电子邮件、Slack、Telegram 等方式接收通知。

您可以使用 Uptrace 来监控 redis-py,使用此 GitHub 示例 作为起点。

Redis-py trace

您可以通过下载 DEB/RPM 包或预编译二进制文件来 安装 Uptrace

监控 Redis 服务器性能#

除了监控 redis-py 客户端之外,您还可以使用 OpenTelemetry Collector Agent 监控 Redis 服务器性能。

OpenTelemetry Collector 是应用程序和 分布式跟踪工具(如 Uptrace 或 Jaeger)之间的代理/中间人。Collector 接收遥测数据,对其进行处理,然后将数据导出到可以永久存储它的 APM 工具。

例如,您可以使用 Otel Collector 提供的 OpenTelemetry Redis 接收器 <https://uptrace.dev/get/monitor/opentelemetry-redis.html> 来监控 Redis 性能

Redis metrics

有关详细信息,请参阅 OpenTelemetry Collector 简介。

警报和通知#

Uptrace 还允许您使用警报规则来监控 OpenTelemetry 指标。例如,以下监控器使用按节点分组表达式,在单个 Redis 分片出现故障时创建警报

monitors:
  - name: Redis shard is down
    metrics:
      - redis_up as $redis_up
    query:
      - group by cluster # monitor each cluster,
      - group by bdb # each database,
      - group by node # and each shard
      - $redis_up
    min_allowed_value: 1
    # shard should be down for 5 minutes to trigger an alert
    for_duration: 5m

您还可以创建具有更复杂表达式的查询。例如,以下规则在键空间命中率低于 75% 时创建警报

monitors:
  - name: Redis read hit rate < 75%
    metrics:
      - redis_keyspace_read_hits as $hits
      - redis_keyspace_read_misses as $misses
    query:
      - group by cluster
      - group by bdb
      - group by node
      - $hits / ($hits + $misses) as hit_rate
    min_allowed_value: 0.75
    for_duration: 5m

有关详细信息,请参阅 警报和通知

下一步#

接下来,您可以学习如何配置 uptrace-python 将跨度、指标和日志导出到 Uptrace。

您可能还会对以下指南感兴趣