菜单
开源 RSS

服务图

服务图是各种服务之间相互关系的视觉表示。服务图有助于您理解分布式系统的结构,以及其组件之间的连接和依赖关系。

  • 推断分布式系统的拓扑结构。随着分布式系统的增长,它们变得越来越复杂。服务图有助于您理解系统的结构。
  • 提供系统健康状况的高级概览。服务图显示错误率、延迟以及其他相关数据。
  • 提供系统拓扑结构的历史视图。分布式系统变化非常频繁,服务图提供了一种查看这些系统随时间如何演变的方式。

Service graphs example

工作原理

metrics-generator 处理追踪并以 Prometheus 指标的形式生成服务图。

服务图通过检查追踪并查找代表请求的具有父子关系的 Span 来工作。该处理器使用 OpenTelemetry 语义约定 来检测各种请求。它支持以下请求

  • 两个服务之间的直接请求,其中出站 Span 和入站 Span 必须分别具有 span.kindclientserver
  • 跨消息系统的请求,其中出站 Span 和入站 Span 必须分别具有 span.kindproducerconsumer
  • 数据库请求;在这种情况下,处理器会查找包含属性 span.kind=client 以及 db.namedb.system 之一的 Span。有关如何确定数据库请求的节点名称,请参见下文。

每个可以配对形成请求的 Span 都保存在内存存储中,直到收到其对应的配对 Span 或达到最大等待时间。当满足任一条件时,该请求将被记录并从本地存储中移除。

每个发出的指标序列都带有 clientserver 标签,分别对应于发起请求的服务和接收请求的服务。

  traces_service_graph_request_total{client="app", server="db", connection_type="database"} 20

虚拟节点

虚拟节点是构成追踪生命周期的节点,但未为其收集 Span,因为它们超出了用户范围或未进行插桩。例如,对于用户交互之外的支付处理外部服务,您可能不会收集其 Span。

可以通过两种不同的方式检测虚拟节点

  • 根 Span 的 span.kind 设置为 server。这表示该请求是由未进行插桩的外部系统(如前端应用或通过 curl 的工程师)发起的。
  • 一个 client Span 没有匹配的 server Span,但存在对等属性。在这种情况下,假设调用了一个外部服务,Tempo 将不会收到其 Span。
    • 默认对等属性为 peer.servicedb.namedb.system
    • 属性的顺序很重要,因为第一个属性用作虚拟节点名称。

数据库节点通过至少具有 db.namedb.system 属性的 Span 来识别。

数据库节点的名称按优先级顺序使用以下 Span 属性确定:peer.serviceserver.addressnetwork.peer.address:network.peer.portdb.name

指标

导出以下指标

指标类型标签描述
traces_service_graph_request_total计数器client, server, connection_type两个节点之间的请求总数
traces_service_graph_request_failed_total计数器client, server, connection_type两个节点之间失败的请求总数
traces_service_graph_request_server_seconds直方图client, server, connection_type从服务器端看到的两个节点之间的请求时间
traces_service_graph_request_client_seconds直方图client, server, connection_type从客户端看到的两个节点之间的请求时间
traces_service_graph_request_messaging_system_seconds直方图client, server, connection_type(默认关闭)通过消息系统通信的服务之间发布者和消费者之间的时间
traces_service_graph_unpaired_spans_total计数器client, server, connection_type未配对 Span 的总数
traces_service_graph_dropped_spans_total计数器client, server, connection_type丢弃的 Span 总数

持续时间从客户端和服务器端测量。

connection_type 的可能值:unset, virtual_node, messaging_system, 或 database

可以使用 dimensions 配置选项或 enable_virtual_node_label 选项包含其他标签。

由于服务图处理器必须处理边的两侧,因此需要处理追踪的所有 Span 才能正常工作。如果追踪的 Span 分散在多个实例上,则 Span 无法可靠配对。

激活 enable_virtual_node_label

激活此功能会添加以下标签和对应值

标签可能值描述
virtual_nodeunset, client, server明确指示未插桩的一侧