服务图
服务图是各种服务之间相互关系的可视化表示。服务图帮助您理解分布式系统的结构,以及组件之间的连接和依赖关系:
- 推断分布式系统的拓扑结构。随着分布式系统的发展,它们变得更加复杂。服务图帮助您理解系统的结构。
- 提供系统运行状况的高级概述。服务图显示错误率、延迟以及其他相关数据。
- 提供系统拓扑的历史视图。分布式系统变化非常频繁,服务图提供了一种查看这些系统如何随时间发展的方法。
它们是如何工作的
度量生成器以prometheus度量的形式处理跟踪并生成服务图。
服务图的工作原理是检查跟踪并寻找具有表示请求的父子关系的跨度。处理器使用OpenTelemetry语义约定检测无数的请求。它目前支持以下请求:
- 两个服务之间的直接请求,其中传出和传入跨度必须具有
span.kind
客户端
而且服务器
分别。 - 跨消息传递系统的请求,其中传出和传入范围必须具有
span.kind
生产商
而且消费者
分别。 - 一个数据库请求;在这种情况下,处理器查找包含属性的span
span.kind
=客户端
还有db.name
.
每个可以配对形成请求的span都保存在内存存储中,直到接收到其对应的pair span或超过最大等待时间。当达到这些条件中的任何一个时,将记录请求并从本地存储中删除。
每个发出的指标系列都具有客户端
而且服务器
与执行请求的服务和接收请求的服务对应的标签。
20 . Tempo_service_graph_request_total {client="app", server="db", connection_type="database"
指标
导出的指标如下:
度规 | 类型 | 标签 | 描述 |
---|---|---|---|
traces_service_graph_request_total | 计数器 | 客户端,服务器,连接类型 | 两个节点之间的请求总数 |
traces_service_graph_request_failed_total | 计数器 | 客户端,服务器,连接类型 | 两个节点之间失败的请求总数 |
traces_service_graph_request_server_seconds | 柱状图 | 客户端,服务器,连接类型 | 从服务器上看到的两个节点之间请求的时间 |
traces_service_graph_request_client_seconds | 柱状图 | 客户端,服务器,连接类型 | 从客户端看到的两个节点之间请求的时间 |
traces_service_graph_unpaired_spans_total | 计数器 | 客户端,服务器,连接类型 | 未配对span的总数 |
traces_service_graph_dropped_spans_total | 计数器 | 客户端,服务器,连接类型 | 丢失跨度的总数 |
持续时间从客户端和服务器端同时测量。
可能的值为connection_type
:设置,messaging_system
,或数据库
.
属性可以包含其他标签维
配置选项。
由于服务图处理器必须处理边缘的两边,因此它需要处理跟踪的所有范围才能正常工作。如果跟踪的跨度分布在多个实例上,那么跨度就不能可靠地配对。
基数
当您拥有大量服务时,基数性可能会带来问题。这个问题没有一个直接的公式或解决方案。但是下面的指南应该有助于估计该特性将生成的基数。
如何估计基数
来自轨迹的基数
边的数量取决于系统中节点的数量以及它们之间请求的方向。我们称它为跳数。每一跳都是客户机+服务器标签的唯一组合。
例如:
- 一个有三个节点的系统
(a, b, c)
其中A只调用B B只调用C将有2跳(a→b, b→c)
- 一个有三个节点的系统
(a, b, c)
相互调用(即所有双向链接)将有6跳(a→b, b→a, b→c, c→b, a→c, c→a)
我们不能根据节点自动计算跳数,但它应该是之间的值#services - 1
而且#服务!
.
如果我们知道系统中的跳数,我们可以计算生成的服务图的基数:
traces_service_graph_request_failed_total: #hops traces_service_graph_request_server_seconds: 3个桶* #hops traces_service_graph_request_client_seconds: 3个桶* #hops traces_service_graph_unpaired_spans_total: #services(绝对最坏情况)traces_service_graph_dropped_spans_total: #services(绝对最坏情况)
最后得到如下基数估计:
和:8 * #跳数+ 2 * #服务
运行参数生成器
通常最可靠的解决方案是在干运行模式下运行度量生成器。这是生成指标,但不收集它们,因此不将它们写入指标存储。覆盖metrics_generator_disable_collection
为此用例定义。
要获得估算,正常运行metrics-generator并将重写设置为假
.然后,检查tempo_metrics_generator_registry_active_series
来估计这种情况下的活动级数。
如何跑步
服务图在Tempo中生成,并推送到度量存储中。然后,它们可以在Grafana中表示为图。您将需要这些组件来充分使用服务图。
节奏
要在Tempo/GET中启用服务图,请启用度量生成器并添加一个覆盖部分service-graphs
发电机。看到这里是配置细节.
Grafana
请注意从9.0.4开始,Grafana默认启用了服务图。在Grafana 9.0.4之前,服务图隐藏在功能切换tempoServiceGraph
.
通过链接到发送指标的Prometheus后端来配置Tempo数据源的“服务图表”:
apiVersion: 1 datasources: # Prometheus后端,其中度量被发送- name: Prometheus类型:Prometheus uid: Prometheus url: < Prometheus -url> jsonData: httpMethod: GET版本:1 - name: Tempo类型:Tempo uid: Tempo url: < Tempo -url> jsonData: httpMethod: GET serviceMap: datasourceUid: ' Prometheus '版本:1
Tempo相关资源
GrafanaCONline 2021
成为第一个了解Grafana 8.0中令人兴奋的下一代功能的人,受到社区成员正在构建的东西的启发,并参加有关Grafana、Prometheus、Loki logs等的专家领导的会议和研讨会。
开始跟踪和Grafana Tempo
在本次网络研讨会中,我们将向您展示如何开始设置Grafana Tempo,我们的开源,易于使用和高容量分布式跟踪后端。
用Grafana使跟踪变得简单
深入研究在Grafana中查看跟踪数据的新选项,并学习如何使跟踪成为可观察性策略的一个组成部分。