介绍

SigNoz 是一种开源应用程序性能监控工具,可帮助您监控应用程序并解决问题。SigNoz 使用分布式跟踪来了解您的软件堆栈。

使用 SigNoz,您可以执行以下操作:
1.监控应用程序指标,例如延迟、每秒请求数、错误率
2.监控基础架构指标,例如 CPU 利用率或内存使用率
3.跨服务跟踪用户请求
4.设置指标警报
5.通过转到导致问题的确切痕迹来找到问题的根本原因
6.查看各个请求跟踪的详细火焰图

SigNoz 使用开源可观察性解决方案 OpenTelemetry 收集数据。因此,SigNoz 支持 OpenTelemetry 支持的所有框架和语言。

组件

SigNoz 包括以下组件:
1.OpenTelemetry Collector: 从您的服务和应用程序收集遥测数据。
2.ClickHouse: 一个开源的、高性能的列式 OLAP 数据库管理系统。
3.Query Service: 前端与ClickHouse的接口
4.Frontend: 用户界面,内置 ReactJS 和 TypeScript。

架构


架构组件:
1.SigNoz OpenTelemetry Collector
2.ClickHouse
3.Query Service
4.Frontend
5.Alert Manager

OpenTelemetry Collector可以接收多种格式的数据。以下是一些常用的接收器:
1.Jaeger Receiver
2.Kafka Receiver
3.OpenCensus Receiver
4.OTLP Receiver
5.Zipkin Receiver

可以将应用程序中的数据直接发送到SigNoz Otel collector,也可以使用外部Otel采集器收集遥测数据并发送到SigNoz Otel collector。然后,这些外部otel收集器作为代理有效地工作,首先收集数据,然后发送到SigNoz Otel collector。

Query Service是前端和ClickHouse之间的接口。它提供前端应用程序使用的API,并在响应前端之前查询ClickHouse以获取数据和处理数据。

Frontend是UI,内置于ReactJS和Typescript中,提供高级trace/span过滤功能和绘图度量,以提供服务概述。

Alert Manager评估用户设置的不同警报规则,并在超过阈值时触发警报。

OpenTelemetry

OpenTelemetry,也简称为 OTel,是一个供应商中立的开源 可观察性框架,用于检测、生成、收集和导出遥测数据,如 跟踪、 指标、 日志。作为行业标准,它 本身就受到许多供应商的支持。


微服务架构使开发人员能够更快地构建和发布软件,并具有更大的独立性,因为他们不再受制于与单体架构相关的复杂发布流程。
随着这些现在分布式系统的扩展,开发人员越来越难以了解他们自己的服务如何依赖或影响其他服务,尤其是在部署之后或中断期间,速度和准确性至关重要。
可观察性 使开发人员和运维人员都有可能获得对其系统的可见性。

为了使系统可观察,必须对其进行检测。也就是说,代码必须发出traces、 metrics和 logs。然后必须将经过检测的数据发送到可观察性后端。那里有许多可观察性后端,从自托管开源工具(例如 Jaeger和Zipkin)到商业 SaaS 产品。
OTel 的目标是提供一组标准化的与供应商无关的 SDK、API 和 工具,用于摄取、转换数据并将数据发送到可观察性后端(即开源或商业供应商)。

OTel得到了云提供商、供应商和最终用户的广泛行业支持和采用。它为您提供:
1.每种语言都有一个单一的、与供应商无关的检测库,同时支持自动和手动检测。
2.一个独立于供应商的收集器二进制文件,可以通过多种方式进行部署。
3.生成、发送、收集、处理和导出遥测数据的端到端实现。
4.完全控制您的数据,并能够通过配置将数据并行发送到多个目的地。
5.开放标准语义约定,以确保供应商不可知的数据收集
6.能够并行支持多种上下文传播格式,以帮助随着标准的发展进行迁移。

OpenTelemetry 不是像 Jaeger 或 Prometheus 那样的可观察性后端。相反,它支持将数据导出到各种开源和商业后端。

Observability可观测性

可观测性让我们从外部了解一个系统,让我们在不知道其内部工作原理的情况下询问有关该系统的问题。此外,它使我们能够轻松地排除和处理新问题(即“未知的未知因素”),并帮助我们回答“为什么会发生这种情况?”

为了能够向系统提出这些问题,必须对应用程序进行适当的检测。也就是说,应用程序代码必须发出跟踪、指标和日志等信号。当开发人员不需要添加更多的检测来解决问题时,应用程序就会得到正确的检测,因为他们已经掌握了所需的所有信息。

OpenTelemetry是一种对应用程序代码进行检测的机制,有助于使系统变得可观察。

Reliability(可靠性) & Metrics(指标)

Telemetry是指系统发出的有关其行为的数据。数据可以采用Traces、Metrics和Logs的形式。
可靠性回答了这样一个问题:“服务正在做用户期望它做的事情吗?”一个系统可能100%都在运行,但如果用户点击“添加到购物车”将一条黑色裤子添加到他们的购物车中,而系统却一直添加一条红色裤子,那么这个系统就会被认为是不可靠的。
Metrics 是一段时间内有关基础结构或应用程序的数字数据的聚合。示例包括:系统错误率、CPU利用率、给定服务的请求率。
SLI,或称服务级别指示符,代表对服务行为的衡量。一个好的SLI从用户的角度来衡量您的服务。一个示例SLI可以是网页加载的速度。
SLO或服务水平目标是将可靠性传达给组织/其他团队的手段。这是通过将一个或多个SLI附加到业务价值上来实现的。

Distributed Tracing(分布式追踪)

Logs是由服务或其他组件发出的带有时间戳的消息。然而,与Traces不同的是,它们不一定与任何特定的用户请求或交易相关联。它们在软件中几乎无处不在,并且在过去一直被开发人员和操作人员严重依赖,以帮助他们了解系统行为。
不幸的是,日志对于跟踪代码执行并不是非常有用,因为它们通常缺乏上下文信息,例如它们是从哪里调用的。
当它们作为Span的一部分包含时,它们会变得更加有用。

Span表示一个工作单位或操作单位。它跟踪请求进行的特定操作,描绘执行该操作期间发生的事情。
Span包含名称、与时间相关的数据、结构化日志消息和其他元数据(即属性),以提供有关其跟踪的操作的信息。

| span属性 | span示例值 |
| net.transport | IP.TCP |
| net.peer.ip | 10.244.0.1 |
| net.peer.port | 10243 |
| net.host.name | localhost |
| http.method | GET |
| http.target | /cart |
| http.server_name | frontend |
| http.route | /cart |
| http.scheme | http |
| http.host | localhost |
| http.flavor | 1.1 |
| http.status_code | 200 |
| http.user_agent | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 |
分布式跟踪,通常称为跟踪,记录请求(由应用程序或最终用户发出)在多服务架构(如微服务和无服务器应用程序)中传播时所采用的路径。
在没有跟踪的情况下,很难确定分布式系统中性能问题的原因。
跟踪提高了应用程序或系统运行状况的可见性,并使我们能够调试难以在本地重现的行为。对于分布式系统来说,跟踪是必不可少的,因为分布式系统通常存在不确定性问题,或者过于复杂而无法在本地复现。
跟踪通过分解请求在分布式系统中流动时发生的事情,使调试和理解分布式系统变得不那么困难。
轨迹由一个或多个跨度组成。第一个跨度表示根跨度。每个根跨度表示从开始到结束的一个请求。父级下面的Spans提供了一个更深入的上下文,说明请求过程中发生了什么(或者组成请求的步骤)。

许多Observability后端将Traces可视化为瀑布图,可能看起来像这样:


瀑布图显示了根跨度与其子跨度之间的父子关系。当一个跨度封装另一个跨度时,这也表示嵌套关系。

安装SigNoz

# git clone -b main https://github.com/SigNoz/signoz.git && cd signoz/deploy# docker-compose up -d[+] Running 10/10⠿ Network clickhouse-setup_default Created 0.1s⠿ Container zookeeper-1 Started 2.6s⠿ Container hotrod Started 2.4s⠿ Container load-hotrod Started 2.7s⠿ Container clickhouse Healthy 33.0s⠿ Container clickhouse-setup-otel-collector-metrics-1 Started 33.7s⠿ Container query-service Healthy 94.2s⠿ Container clickhouse-setup-otel-collector-1 Started 34.2s⠿ Container clickhouse-setup-alertmanager-1 Started 94.5s⠿ Container frontend Started 95.0s
# docker-compose psNAME COMMAND SERVICE STATUS PORTSclickhouse "/entrypoint.sh" clickhouse running (healthy) 0.0.0.0:8123->8123/tcp, :::8123->8123/tcp, 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp, 0.0.0.0:9181->9181/tcp, :::9181->9181/tcp, 9009/tcpclickhouse-setup-alertmanager-1 "/bin/alertmanager -…" alertmanager running 9093/tcpclickhouse-setup-otel-collector-1 "/signoz-collector -…" otel-collector running 0.0.0.0:4317-4318->4317-4318/tcp, :::4317-4318->4317-4318/tcpclickhouse-setup-otel-collector-metrics-1 "/signoz-collector -…" otel-collector-metrics running 4317-4318/tcpfrontend "nginx -g 'daemon of…" frontend running 80/tcp, 0.0.0.0:3301->3301/tcp, :::3301->3301/tcphotrod "/go/bin/hotrod-linu…" hotrod running 8080-8083/tcpload-hotrod "/docker-entrypoint.…" load-hotrod running 5557-5558/tcp, 8089/tcpquery-service "./query-service -co…" query-service running (healthy) 8080/tcpzookeeper-1 "/opt/bitnami/script…" zookeeper-1 running 0.0.0.0:2181->2181/tcp, :::2181->2181/tcp, 0.0.0.0:2888->2888/tcp, :::2888->2888/tcp, 0.0.0.0:3888->3888/tcp, :::3888->3888/tcp, 8080/tcp# docker-compose imagesContainer Repository Tag Image Id Sizeclickhouse clickhouse/clickhouse-server 22.8.15-alpine 924f50198f77 769MBclickhouse-setup-alertmanager-1 signoz/alertmanager 0.23.0-0.1 a83451cad76b 58MBclickhouse-setup-otel-collector-1 signoz/signoz-otel-collector 0.66.6 b230c8288664 182MBclickhouse-setup-otel-collector-metrics-1 signoz/signoz-otel-collector 0.66.6 b230c8288664 182MBfrontend signoz/frontend 0.17.0 1f57bb3c08c5 35MBhotrod jaegertracing/example-hotrod 1.43 f5787681aae9 21MBload-hotrod grubykarol/locust 1.2.3-python3.9-alpine3.12 1cf17487debf 81.2MBquery-service signoz/query-service 0.17.0 143164c4db47 36MBzookeeper-1 bitnami/zookeeper 3.8.0 27f4ec7785d8 509MB
Tomcat OpenTelemetry 检测


OpenTelemetry 帮助从 Tomcat 应用程序生成和收集遥测数据,然后可以将这些数据发送到 SigNoz 进行存储、可视化和分析。

OpenTelemetry Java 是 Java 中 OpenTelemetry 的特定语言实现,可用于检测来自 Tomcat 应用程序的跟踪、指标和日志。收集遥测数据后,可以配置导出器以将数据发送到 SigNoz。

SigNoz使用 OpenTelemetry 分为三个主要步骤:
1.使用 OpenTelemetry 检测您的 Tomcat 应用程序
2.配置导出器以将数据发送到 SigNoz
3.验证该配置以确保数据按预期发送

OpenTelemetry Java JAR 代理

OpenTelemetry 提供了一个方便的 Java JAR 代理,可以附加到任何 Java 8+ 应用程序,并动态注入字节码以从许多流行的库和框架中捕获遥测数据。

wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
启用检测代理并运行您的应用程序

如果通过放入webapps文件夹来运行.war包,只需在Tomcat的bin文件夹中添加setenv.sh即可。

设置环境变量,并开始将遥测数据发送到IP中指定的SigNoz后端:

export CATALINA_OPTS="$CATALINA_OPTS -javaagent:/path/to/opentelemetry-javaagent.jar"export OTEL_EXPORTER_OTLP_ENDPOINT=http://<IP of SigNoz Backend>:4317export OTEL_RESOURCE_ATTRIBUTES=service.name=<app_name>
其中app_name是要为应用程序设置的名称,SigNoz后端的IP是SigNoz后台可访问的IP。
使用上述环境变量,我们正在配置导出程序以将数据发送到SigNoz后端。默认情况下,OpenTelemetry Java代理使用配置为发送数据的OTLP导出器。

export CATALINA_OPTS="$CATALINA_OPTS -javaagent:/data/war_files/opentelemetry-javaagent.jar"export OTEL_EXPORTER_OTLP_ENDPOINT=http://192.168.50.150:4317export OTEL_RESOURCE_ATTRIBUTES=service.name=Tomcat-SigNoz
浏览器指向http://<IP-ADDRESS>:3301/访问仪表盘。
在 SigNoz 中,打开 Services 选项卡。点击 Refresh 右上角的按钮,您的应用程序应该会出现在 Applications。
转到该 Traces 选项卡,并应用相关过滤器以查看您的应用程序的踪迹。

查看Services

应用程序指标将您的应用程序的特征表示为特定时间点的值。例如,应用程序指标是您的应用程序每秒处理的请求数。SigNoz 每分钟将信息收集为一系列数据点,然后以图形形式表示随时间变化的数据。X 轴是时间,Y 轴是值。

Services部分依靠速率、错误和持续时间(RED)方法来帮助您预测用户的体验,并包括以下关键指标:
P99延迟:应用程序处理99%的最快请求所花费的时间。例如,如果P99延迟的值为760ms,则99%的请求的响应等于或快于760ms。
错误率:失败请求的百分比,即错误请求占总请求的比率。
每秒请求数:应用程序每秒处理的请求数。


此页面概述了您的应用程序的运行状况和性能。它以表格形式显示您的应用程序列表,对于每个应用程序,SigNoz 显示上述 RED 指标。

此页面显示所有将数据发送到 SigNoz 的检测应用程序。这包括 Web 服务器、消息代理/队列系统、Web/移动客户端、corn作业等。


查看Traces

事务跟踪是一种跨应用程序的各个组件监视请求的方法。每个请求都分配有一个唯一标识符,用于在应用程序的每个组件中跟踪它,让您可以查看某个函数的哪个特定实例运行缓慢或失败。
在分布式架构中,一个服务可以运行在不同的虚拟机或容器上。分布式跟踪是一种允许您跨不同虚拟机或容器监视应用程序的方法。


在Traces页面上,您可以在请求通过应用程序的各个组件传播时查看和分析请求,并了解用户的体验。如下跟踪具体接口使用情况:


查看Logs


查看Exceptions异常情况


查看Service Map

这个映射提供了基础设施中服务的概念,以及一个服务如何调用另一个服务。
P99延迟、错误率和RPS通过在服务之间的边缘上方悬停来显示。
如果边缘服务映射显示为红色,则意味着它有一些4xx错误或高延迟。


查看Usage Explorer资源情况管理器


查看Settings


默认情况下,日志和跟踪的保留期设置为 7 天,指标的保留期设置为 30 天。要为指标、跟踪和日志设置保留期,您可以导航到页面General上的选项卡Settings进行配置。





