暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

开源应用程序性能监控工具SigNoz

ZhiBlog 2023-03-20
4642


介绍

     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.transportIP.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_code200
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 ps
      NAME COMMAND SERVICE STATUS PORTS
      clickhouse "/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/tcp
      clickhouse-setup-alertmanager-1 "/bin/alertmanager -…" alertmanager running 9093/tcp
      clickhouse-setup-otel-collector-1 "/signoz-collector -…" otel-collector running 0.0.0.0:4317-4318->4317-4318/tcp, :::4317-4318->4317-4318/tcp
      clickhouse-setup-otel-collector-metrics-1 "/signoz-collector -…" otel-collector-metrics running 4317-4318/tcp
      frontend "nginx -g 'daemon of…" frontend running 80/tcp, 0.0.0.0:3301->3301/tcp, :::3301->3301/tcp
      hotrod "/go/bin/hotrod-linu…" hotrod running 8080-8083/tcp
      load-hotrod "/docker-entrypoint.…" load-hotrod running 5557-5558/tcp, 8089/tcp
      query-service "./query-service -co…" query-service running (healthy) 8080/tcp
      zookeeper-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 images
      Container Repository Tag Image Id Size
      clickhouse clickhouse/clickhouse-server 22.8.15-alpine 924f50198f77 769MB
      clickhouse-setup-alertmanager-1 signoz/alertmanager 0.23.0-0.1 a83451cad76b 58MB
      clickhouse-setup-otel-collector-1 signoz/signoz-otel-collector 0.66.6 b230c8288664 182MB
      clickhouse-setup-otel-collector-metrics-1 signoz/signoz-otel-collector 0.66.6 b230c8288664 182MB
      frontend signoz/frontend 0.17.0 1f57bb3c08c5 35MB
      hotrod jaegertracing/example-hotrod 1.43 f5787681aae9 21MB
      load-hotrod grubykarol/locust 1.2.3-python3.9-alpine3.12 1cf17487debf 81.2MB
      query-service signoz/query-service 0.17.0 143164c4db47 36MB
      zookeeper-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>:4317
          export 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:4317
            export OTEL_RESOURCE_ATTRIBUTES=service.name=Tomcat-SigNoz

               浏览器指向http://<IP-ADDRESS>:3301/访问仪表盘。

               在 SigNoz 中,打开 Services 选项卡。点击 Refresh 右上角的按钮,您的应用程序应该会出现在 Applications。

               转到该 Traces 选项卡,并应用相关过滤器以查看您的应用程序的踪迹。

            查看Services

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

                Services部分依靠速率、错误和持续时间(RED)方法来帮助您预测用户的体验,并包括以下关键指标:


            1. P99延迟:应用程序处理99%的最快请求所花费的时间。例如,如果P99延迟的值为760ms,则99%的请求的响应等于或快于760ms。

            2. 错误率:失败请求的百分比,即错误请求占总请求的比率。

            3. 每秒请求数:应用程序每秒处理的请求数。

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

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

            查看Traces

                 事务跟踪是一种跨应用程序的各个组件监视请求的方法。每个请求都分配有一个唯一标识符,用于在应用程序的每个组件中跟踪它,让您可以查看某个函数的哪个特定实例运行缓慢或失败。

                在分布式架构中,一个服务可以运行在不同的虚拟机或容器上。分布式跟踪是一种允许您跨不同虚拟机或容器监视应用程序的方法。

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

            查看Logs

            查看Exceptions异常情况

            查看Service Map

                这个映射提供了基础设施中服务的概念,以及一个服务如何调用另一个服务。

                P99延迟、错误率和RPS通过在服务之间的边缘上方悬停来显示。

                如果边缘服务映射显示为红色,则意味着它有一些4xx错误或高延迟。

            查看Usage Explorer资源情况管理器

            查看Settings

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

            关于SigNoz
            https://signoz.io/docs/
            关于opentelemetry
            https://opentelemetry.io/docs
            关于SigNoz Dashboards
            https://github.com/SigNoz/dashboards

            文章转载自ZhiBlog,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论