博客/工程

使用Grafana Cloud、Prometheus和OpenTelemetry设置并观察Spring Boot应用程序

2022年4月26日16分钟

Spring Boot是一个非常流行的微服务框架,它通过为Java开发人员提供一个平台来开始自动配置的产品级Spring应用程序,极大地简化了web应用程序开发。

在这篇博客中,我们将详细介绍如何观察春天的引导应用程序,通过仪器普罗米修斯而且OpenTelementry通过收集和关联来自应用程序的日志、度量和跟踪Grafana云

更具体地说,我们将:

  1. 使用OpenTelemetry来测量一个简单的Spring Boot应用程序,你好可观测性,并将跟踪发送到Grafana Cloud使用Grafana代理
  2. 自动记录对应用程序的每个请求,并使用Grafana Agent将这些日志发送到Grafana Cloud。然后将日志与来自应用程序的跟踪和度量关联起来。
  3. 使用Prometheus来检测应用程序,这样我们就可以收集度量标准,并将度量标准与利用Grafana的跟踪相关联范本

非常激动人心!让我首先介绍一个非常简单的Spring Boot应用程序,Hello Observability。

Spring Boot应用程序的介绍

Hello Observability应用程序非常简单。它主要包含一个Java类HelloObservabilityBootApp,其中包含两个可以服务HTTP请求的方法。

Spring Boot应用程序在Grafana云:HTTP请求的图表
Spring Boot应用程序在Grafana云:HTTP请求的图表

克隆的存储库要查看代码,然后构建应用程序和应用程序容器:

Git克隆https://github.com/adamquan/hello-observability.git CD hello-observability/hello-observability ./mvnw package docker build -t hello-observability。

然后你可以直接运行应用程序,并在这里访问它:http://localhost:8080/hello。非常简单的应用!

Java -jar目标/*.jar

Spring Boot应用在Grafana Cloud: Hello Observability UI
Spring Boot应用在Grafana Cloud: Hello Observability UI

你也可以使用下面的命令在Docker容器中运行它,并在这里访问应用程序:http://localhost:8080/hello

Docker运行-d -p 8080:8080——name hello-observability hello-observability

使用以下命令停止docker容器:

Docker stop hello-observability

到目前为止,我们还没有使用任何工具来收集日志、度量和跟踪。为此,您必须使用docker-compose启动所有服务。生成和收集日志、度量和跟踪所需的所有配置都已配置。

现在让我们在Docker内部本地运行整个堆栈,看看它是如何工作的。整个堆栈包含:

CD hello-可观测性/local docker-compose up

在所有容器都启动后,你可以在这里访问应用程序:http://localhost:8080/hello,这里是Grafana:http://localhost:3000。一个仪表盘叫做你好可观测性也是预加载的。

Spring Boot应用程序在Grafana Cloud: Spring Boot应用程序的Grafana仪表板
Spring Boot应用程序在Grafana Cloud: Spring Boot应用程序的Grafana仪表板

希望这能让你兴奋!接下来,在查看仪器细节之前,我们将快速介绍Grafana Cloud和Grafana Agent。

如何配置Grafana Cloud

Grafana云是一个完全管理的可组合观测平台,集成了Grafana的度量、跟踪和日志。使用Grafana Cloud,您可以利用最好的开源可观测性软件,包括Prometheus、Grafana Loki和Grafana Tempo,而无需安装、维护和扩展可观测性堆栈的开销。这使您可以专注于数据和它们所显示的业务见解,而不是存储和服务数据的基础设施堆栈。

Spring Boot在Grafana Cloud中的应用:Grafana Cloud堆栈示意图
Spring Boot在Grafana Cloud中的应用:Grafana Cloud堆栈示意图

Grafana云的免费的计划让每个人都能接触到。除了免费之外,该计划还为您提供了高级功能,例如Grafana OnCall综合监测,报警创建免费帐户跟着走!

为了将日志、度量和跟踪发送到Grafana Cloud,我们需要为Loki、Prometheus和Tempo收集Grafana Cloud连接信息,这样我们就可以相应地配置我们的Agent。这就是我们接下来要做的。

连接Grafana云痕迹

Grafana Cloud Traces是一种完全管理、高度可扩展且具有成本效益的分布式跟踪系统Grafana节奏。那就是我们追踪的方向。

Tempo连接信息包括端点URL和用户凭证。导航到www.tubolov.com和登录。确保您从帐户下拉菜单中选择了正确的帐户。我的账户名是aquan。点击我的账户,然后发送的痕迹节奏部分。

Spring Boot应用程序在Grafana云:Grafana云UI配置跟踪与Grafana Tempo
Spring Boot应用程序在Grafana云:Grafana云UI配置跟踪与Grafana Tempo

您应该会看到类似下面截图的内容,其中包含关于端点和用户凭证的信息。方法生成一个新的API密钥现在生成链接或导航到安全→API密钥部分。

Spring Boot应用程序在Grafana云:配置Grafana Tempo
Spring Boot应用程序在Grafana云:配置Grafana Tempo

无论哪种方式,API Key创建屏幕如下所示。(不用担心我暴露我的API密钥。已经被删除了。)

Spring Boot应用程序在Grafana云:创建API密钥
Spring Boot应用程序在Grafana云:创建API密钥
Spring Boot应用程序在Grafana云:API令牌创建的UI
Spring Boot应用程序在Grafana云:API令牌创建的UI

在这种情况下,这里是Tempo信息为我的Grafana云帐户:

  • 端点:https://tempo-us-central1.grafana.net:443
  • 用户:160639
  • API密匙:eyJrIjoiZGNjYjFjMzFjMTQ2YTA4MmI3YzhiMWRhNDdlOTFhNmJiNGE5OTRmMyIsIm4iOiJhZGFtIiwiaWQiOjYwMTM4MH0 =

连接Grafana云日志

Grafana Cloud Logs是Grafana的全管理日志解决方案Grafana洛基。Loki是一个水平可伸缩、高可用、多租户日志聚合解决方案,灵感来自Prometheus。它的设计具有成本效益和易于操作。它不索引日志的内容,而是为每个日志流创建一组标签。

与Tempo连接信息类似,我们可以从洛基在我的帐户页面的部分:

  • 端点:https://logs-prod3.grafana.net/loki/api/v1/push
  • 用户:164126
  • API密匙:eyJrIjoiOWYzMmViNDMwNGMzZjM5ZDZjY2JiZTUwZDI4YTlmMDY3MTlkZGM3YSIsIm4iOiJhcXVhbi1lYXN5c3RhcnQtcHJvbS1wdWJsaXNoZXIiLCJpZCI6NjAxMzgwfQ = =

连接Grafana云度量

最后,对于Grafana Cloud Metrics,我们可以从普罗米修斯在我的帐户页面的部分:

  • 端点:https://prometheus-prod-10-prod-us-central-0.grafana.net/api/prom/push
  • 用户:330312
  • API密匙:eyJrIjoiOWYzMmViNDMwNGMzZjM5ZDZjY2JiZTUwZDI4YTlmMDY3MTlkZGM3YSIsIm4iOiJhcXVhbi1lYXN5c3RhcnQtcHJvbS1wdWJsaXNoZXIiLCJpZCI6NjAxMzgwfQ = =

收集了所有的连接信息之后,我们就可以配置我们的Grafana代理了,这样代理就可以将我们的日志、度量和跟踪发送到Grafana Cloud。

如何配置Grafana Agent

Grafana代理是用于收集度量、日志和跟踪的一体化代理。通过包括用于开箱即用监控的通用集成,它消除了安装多个软件的需要。Grafana Agent可以很容易地发送遥测数据,并且是首选的遥测收集器,用于将度量、日志和跟踪数据发送到Grafana可观测性堆栈,无论是在prem上还是在Grafana Cloud中。

Spring Boot在Grafana Cloud中的应用:Grafana Agent如何在堆栈中工作的图表
Spring Boot在Grafana Cloud中的应用:Grafana Agent如何在堆栈中工作的图表

所有代理配置信息都在agent.yaml文件。让我们看看代理是如何配置的。

配置的痕迹

在跟踪上下文中,Grafana Agent通常用作跟踪管道,从应用程序卸载跟踪并将其转发到存储后端。Grafana Agent支持多种格式的跟踪接收:OpenTelemetry (OTLP)、Jaeger、Zipkin和OpenCensus。

Spring Boot在Grafana Cloud中的应用:Grafana Agent如何摄取跟踪的图表
Spring Boot在Grafana Cloud中的应用:Grafana Agent如何摄取跟踪的图表

这是痕迹部分从Grafana代理配置文件。除了Grafana Cloud Tempo URL和身份验证信息之外,我们基本上是说代理希望通过HTTP协议获得OTLP格式的跟踪。如果您愿意,还可以将其配置为使用Jaeger格式,但我们建议使用OTLP格式。

traces: configs:—name: default remote_write:—endpoint: tempo-us-central1.grafana.net:443 basic_auth: username: 160639 password:  receivers: otlp: protocols: http:

配置日志

的客户端部分agent.yaml文件,其中包含我们之前收集的所有连接信息。

clients:—url: https://logs-prod3.grafana.net/loki/api/v1/push basic_auth: username: 164126 password: 

配置指标

在度量部分,remote_write包含所有连接信息。的scrape_configs节定义抓取作业,我们将在后面讨论。

remote_write:—basic_auth: username: 330312 password:  url: https://prometheus-prod-10-prod-us-central-0.grafana.net/api/prom/push

让我们继续,看看如何使用这些工具,以及如何收集日志、度量和跟踪。我们将从OpenTelemetry轨迹开始。

如何用OpenTelemetry测量弹簧靴

开源的可观察性框架,OpenTelemetry,正迅速流行起来。OpenTelemetry是OpenTracing和OpenCensus合并的结果。在撰写本文时,跟踪是OpenTelemetry最成熟的组件,而日志仍处于实验阶段。在这篇博客中,我们将重点关注OpenTelemetry的跟踪方面。

OpenTelemetry是一个api、sdk和工具的集合,您可以使用这些工具来测量、生成、收集和导出遥测数据,这些数据反过来可以帮助您分析软件的性能和行为。OpenTelemetry是供应商和平台不可知的,这是它迅速流行的原因之一。

Spring Boot在Grafana Cloud中的应用:OpenTelemetry架构图
Spring Boot在Grafana Cloud中的应用:OpenTelemetry架构图

一般来说,插装可以在三个不同的地方完成:应用程序代码;应用程序所依赖的库和框架;以及底层平台,如Kubernetes、Envoy或Istio。OpenTelemetry的好处是,许多流行的库和框架(如Spring、Express等)已经完成了检测。

值得注意的是auto-instrumentationOpenTelementry的功能。自动检测允许开发人员在不修改任何代码的情况下收集遥测数据。我们将利用Java Agent的自动检测功能来检测我们的Hello Observability应用程序,而不需要修改代码。

使用Java代理进行自动检测

的OpenTelemetryJava代理可以附加到任何Java 8+应用程序以实现自动插装。它动态地注入字节码,以从许多流行的库和框架中捕获遥测数据。一旦附加,它就会自动捕获应用程序和服务边缘的遥测数据,比如入站请求、出站HTTP调用、数据库调用等等。如果希望以其他自定义方式在应用程序或服务中插入应用程序代码,则必须使用手动插入。

借助Java Agent出色的自动检测功能,对Spring Boot应用程序进行检测非常简单。我们只需要包含-javagent:。/ opentelemetry-javaagent.jar选项。内部的hello-observability应用服务云/ docker-compose.yaml文件如下所示:

hello-observability: image: hello-observability volumes:—./logs/hello-observability.log:/tmp/hello-observability.log - ./logs/access_log.log:/tmp/access_log.log环境:JAVA_TOOL_OPTIONS: -javaagent:./opentelemetry-javaagent.jar OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: http://agent:4317 OTEL_SERVICE_NAME: hello-observability otel_traces_export: otlp ports: - "8080:8080"

注意,我们在Java代理jar文件中传入- javaagent选项,作为docker容器的环境变量。在撰写本文时,回购已经包含了一个最新的代理。如果你愿意,你也可以下载最新版本,并将其复制到hello-observability目录中。

其他三个环境变量用于告知在哪里以及如何发送跟踪。参见OpenTelemetry Java Agent配置有关可用于配置代理的系统属性和环境变量的详细信息。

  • OTEL_TRACES_EXPORTER:出口商追查。我们通过设置OpenTelemetry导出器来使用它otlp
  • OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:OTLP跟踪要连接到的端点。由于我们通过Grafana代理将跟踪发送到Grafana Cloud,所以我们需要将其设置为代理URL。注意端口号4317
  • OTEL_SERVICE_NAME:用于标识应用程序的服务名称。我们只是将它设置为我们的应用程序名称hello-observability

当应用程序正在运行时,登录到您的Grafana Cloud帐户。选择Tempo数据源探索。对我来说,它叫grafanacloud-aquan-traces。控件查看跟踪搜索按钮和选择hello-observability服务名称。记住我们设OTEL_SERVICE_NAMEhello-observability?

Spring Boot应用程序在Grafana云:用户界面仪表Java代理与OpenTelemetry
Spring Boot应用程序在Grafana云:用户界面仪表Java代理与OpenTelemetry

单击其中一个以查看跟踪的瀑布可视化。稍后,一旦我们将日志和指标也交付到Grafana Cloud,您将能够将日志、指标和跟踪关联在一起!统一可观测平台的力量!

Spring Boot在Grafana Cloud中的应用:跟踪可视化过程的截图
Spring Boot在Grafana Cloud中的应用:跟踪可视化过程的截图

如果你在本地运行所有东西,你也能看到红利节点图截至撰写本文时,该软件仍处于测试阶段。

Spring Boot应用程序在Grafana云:用户界面的节点图在Grafana云
Spring Boot应用程序在Grafana云:用户界面的节点图在Grafana云

这是上面跟踪的节点图的样子:

Spring Boot应用程序:Grafana Cloud中跟踪的节点图
Spring Boot应用程序:Grafana Cloud中跟踪的节点图

收集日志,关联跟踪

有了跟踪,我们还可以从应用程序收集日志,看看如何将日志与跟踪关联起来。

Spring Boot具有内置的自动请求日志记录支持。的CommonsRequestLoggingFilter类可用于记录传入请求。您只需要通过添加bean定义来配置它。我们在源代码目录中有以下Java类定义,在名为RequestLoggingFilterConfig.java

@配置公共类RequestLoggingFilterConfig {@Bean公共CommonsRequestLoggingFilter logFilter() {CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter();filter.setIncludeQueryString(真正的);filter.setIncludeHeaders(真正的);filter.setIncludeClientInfo(真正的);返回过滤器;}}

此日志筛选器还要求将日志级别设置为调试。这就是application.properties文件如下所示:

logging.file.name=/tmp/hello-observability.log logging.level.org.springframework=INFO logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=DEBUG logging.pattern。file=%d{yyyy-MM-dd HH:mm:ss} - %msg traceID=%X{trace_id} %n

我们正在告诉Spring Boot将日志写入/ tmp / hello-observability.log日志文件,其中包含关于日期/时间、日志消息和跟踪ID的信息。特别有趣的是trace_id。它允许我们将日志与之前收集的跟踪自动关联起来,稍后您将看到这一点。

如果你看hello-observability.log日志文件,您应该看到这样的日志行。注意到跟踪ID吗?

2022-03-11 18:15:56 - After request [GET /hello, client=192.168.80.2, headers=[host:"hello-observability:8080", user-agent:"curl/7.81.0-DEV", accept:"*/*"]] traceID=f179e69bd5f342233b9bc66728901f7f .

使用Grafana Agent将日志发送到Grafana Cloud非常简单。请参考文档使用Grafana Agent收集日志获取详细信息。这是scrape_configsagent.yaml日志文件:

Scrape_configs:—job_name: hello-observability static_configs:—targets: [localhost] labels: job: hello-observability __path__: /tmp/hello-observability.log—job_name: tomcat-access static_configs:—targets: [localhost] labels: job: tomcat-access __path__: /tmp/access_log.log

如您所见,代理正在从hello-observability.log文件。我们还从应用程序中启用和收集Tomcat访问日志,以便我们可以根据它创建一些有趣的可视化。这是里面的部分application.properties用于配置Tomcat访问日志。我们基本上是在写访问日志/ tmp / access_log.log文件。格拉夫纳特工也是在那里发现的。应用程序容器和代理容器都可以通过docker卷挂载看到相同的文件。

server.tomcat.accesslog。= true server.tomcat.accesslog启用。Rotate =false server.tomcat.accesslog.suffix=.log server.tomcat.accesslog。前缀= access_log server.tomcat.accesslog。目录= / tmp server.tomcat.accesslog.pattern =常见

那就去格拉夫纳云吧探索,并选择Loki数据源。对我来说,它叫grafanacloud-aquan-logs。使用日志浏览器若要选择hello-observability的工作。然后点击显示日志

Spring Boot应用程序在Grafana云:在Spring Boot应用程序仪表日志的UI
Spring Boot应用程序在Grafana云:在Spring Boot应用程序仪表日志的UI

您应该可以看到一些日志线。展开其中一条日志行并单击grafanacloud-quan-traces,您应该看到如下所示的内容。由于跟踪ID,日志和跟踪之间的神奇关联都是自动完成的!

Spring Boot应用程序在Grafana云:用户界面相关的日志和跟踪
Spring Boot应用程序在Grafana云:用户界面相关的日志和跟踪

现在让我们通过收集度量来完成我们的可观察性故事。

与普罗米修斯仪器弹簧启动

Grafana Cloud有一个Spring Boot集成它可以将Spring Boot应用程序的指标发送到Grafana Cloud,以及一个开箱即用的可视化仪表板。

Spring Boot还内置了对指标收集的支持测微计。但是,到今天为止,Micrometer还不支持范本然而。因为我们想要展示Grafana的范例功能,所以我们将使用Prometheus直接检测我们的应用程序来收集性能指标,而不是使用Spring Boot集成。(bob电竞频道Grafana实验室的产品经理Jen Villa有一个很好的关于范例的博客文章。)

看一下HelloObservabilityBootAppJava类。我们基本上是用工具来测试我们的简单应用程序计数器,一个,一个柱状图,以及总结,仅供示范之用。

确保应用程序正在运行。转到Grafana Cloud,然后是Hello Observability仪表板。的每分钟请求数可视化显示了带有样本的普罗米修斯度量标准,这些样本是绿色的点。

Spring Boot在Grafana Cloud中的应用:用于Prometheus度量的Grafana仪表板
Spring Boot在Grafana Cloud中的应用:用于Prometheus度量的Grafana仪表板

将鼠标移到其中一个上,您将看到一个弹出面板trace_id标签,该标签具有直接指向跟踪的链接。榜样的力量!

Spring Boot在Grafana Cloud中的应用:Grafana Cloud中的示例
Spring Boot在Grafana Cloud中的应用:Grafana Cloud中的示例

如果您对Prometheus收集的样本的度量标准感到好奇,请发送请求到http://localhost: 9090 / api / v1 / query_exemplars ?查询={工作= " hello-observability "}来看看。它看起来像下面这样。示例被设置为元数据标签,如span_id而且trace_id

{"标签":{“span_id”:“405 e4b409d62cd38”、“trace_id”:“7893 cdf3ce9d2401ffcee7d7f0db569d”},“价值”:“1.090101375”,“时间戳”:1647142355.737}

为了让示例弹出对话框显示到Tempo的链接,您必须将Label名称配置为trace_id在Prometheus数据源配置中。默认为traceID。否则,您将看不到该链接。无法在云帐户中编辑预配置的Prometheus数据源。您必须使用相同的连接信息创建另一个Prometheus数据源,然后添加示例配置。

Grafana Cloud中的Spring Boot应用程序:配置示例
Grafana Cloud中的Spring Boot应用程序:配置示例

此外,由于范例仍然是新的,您必须请求为您的Grafana Cloud帐户启用它。如果在本地运行Grafana,则最新版本的Grafana已经支持范例。

在Grafana中关联日志、度量和跟踪

可观测性不仅仅是以日志、指标和轨迹的形式收集所有遥测数据。更重要的是,它是关于关联这些遥测数据的能力,并从中获得可操作的见解。

Spring Boot在Grafana Cloud中的应用:可观测性支柱图
Spring Boot在Grafana Cloud中的应用:可观测性支柱图

通过在同一个仪表板上绘制图形,您显然可以直观地连接和关联任何遥测数据。从导出的中导入Hello Observability仪表板云/仪表板/ hello-observability.json文件并选择相应的Loki和Prometheus数据源。你会看到同样的情况你好可观测性显示和连接日志、指标和跟踪的仪表板。

在仪表板的顶部,Grafana允许您以许多不同的方式连接和关联日志、指标和跟踪:

  1. 使用分屏从指标中查找相关日志。Loki的日志以与Prometheus度量相同的方式系统地标记,使用相同的服务发现机制。这使您能够找到任何给定指标可视化的日志,以便通过一个UI进行更快的故障排除,只需单击几下即可。例如,从每分钟请求数面板,点击探索然后分裂,并选择洛基数据源。您将看到同一时间范围内指标的相关日志。日志为我们正在可视化和调查的指标提供了准确的上下文。
Spring Boot应用程序在Grafana云:Grafana仪表板关联指标和日志
Spring Boot应用程序在Grafana云:Grafana仪表板关联指标和日志
  1. 使用洛基从日志中提取指标。Loki使用LogQL(一种普罗米修斯式的查询语言)从日志中提取指标。从日志中提取指标并在时间序列可视化中可视化日志消息,可以轻松快速地深入了解应用程序的行为。作为一个例子,HTTP状态码随着时间的推移面板是一个基于Tomcat访问日志创建的指标可视化,使用以下查询:

Sum by (status) (count_over_time({job="tomcat-access"} |模式<> - - <>” < _ > " = "/metrics" [1m]))

Spring Boot应用程序在Grafana云:http状态代码
Spring Boot应用程序在Grafana云:http状态代码
  1. 使用带有跟踪ID的日志查找跟踪。正如您所看到的,您可以通过跟踪ID链接轻松地从日志转向跟踪。使用日志,您可以通过路径、状态代码、延迟时间、用户、IP或任何可以添加到与跟踪ID相同的日志行的内容进行搜索。例如,您可以轻松地过滤日志,只查看失败的跟踪、超过延迟的sla等。这使得在发生问题时更容易进行故障排除。
  2. 找出给定张成空间的所有对数。span包含到关联日志的链接。只需单击一下,就可以探索与span关联的相关日志。
  3. 使用范例从度量中找到痕迹。当使用一致的元数据装饰跟踪、日志和指标时,您可以创建以前不可能的相关性。正如你所看到的延迟面板,当OpenTelemetry也用于跟踪时,Prometheus度量标准被装饰上跟踪ID。当您从示例跳转到跟踪时,您现在可以直接访问正在挣扎的服务的日志!

结论

哇,真是太多了!

但是希望您已经看到了为日志、度量和跟踪设置Spring Boot应用程序是多么容易,以及Grafana基于Prometheus、Grafana Loki和Grafana Tempo的可观察性堆栈是如何帮助您在Grafana Cloud中连接和关联遥测数据的。测试您的应用程序,并拥有有趣的仪表盘!

Grafana Cloud是开始使用度量、日志、跟踪和仪表板的最简单方法。我们有一个慷慨的免费永远层和计划为每个bob体育手机二维码用例。现在免费注册