博客/工程

设置,观察弹簧启动应用程序与Grafana云,普罗米修斯,OpenTelemetry

2022年4月26日 16分钟

弹簧引导是一个非常受欢迎的microservice框架,大大简化了web应用程序开发为Java开发人员提供一个平台开始auto-configurable,工业生产Spring应用程序。

在这个博客中,我们将介绍如何观察的详细步骤春天的引导应用程序,通过插装普罗米修斯OpenTelementry指标,通过收集和相关日志和跟踪应用程序Grafana云

更具体地说,我们将:

  1. 使用OpenTelemetry仪器一个简单的弹簧启动应用程序,你好可观测性,船Grafana云使用的痕迹Grafana代理
  2. 自动记录每个请求应用程序,并使用Grafana船这些日志Grafana云代理。然后从应用程序日志和跟踪和相关指标。
  3. 使用普罗米修斯仪器应用程序以便我们可以收集度量标准,和相关指标利用Grafana的痕迹范本

非常激动人心!让我先介绍非常简单的弹簧启动应用程序,你好可观测性。

介绍弹簧启动应用程序

你好可观测性应用程序非常简单。它主要包含一个Java类HelloObservabilityBootApp,其中包含两个方法可以处理HTTP请求。

Grafana云:图中弹簧启动应用程序的HTTP请求
Grafana云:图中弹簧启动应用程序的HTTP请求

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

git克隆https://github.com/adamquan/hello-observability.git cd hello-observability / hello-observability。/ mvnw包构建- t hello-observability码头工人。

你可以直接运行该应用程序并访问它:http://localhost: 8080 /你好。非常简单的应用程序,确实!

目标/ * . jar的java jar

弹簧启动应用程序在云Grafana:你好可观测性的UI
弹簧启动应用程序在云Grafana:你好可观测性的UI

您也可以用以下命令运行它在一个码头工人容器,并访问该应用程序:http://localhost: 8080 /你好

码头工人运行- d - p 8080:8080——名字hello-observability hello-observability

使用以下命令停止集装箱码头工人:

码头工人停止hello-observability

我们没有做任何仪器收集日志,指标,跟踪到目前为止。这样做,你将不得不使用docker-compose启动所有服务。生成和收集日志,所需的所有配置指标,跟踪已经配置。

现在让我们在本地运行整个堆栈内码头工人在行动。整个堆栈包含:

cd hello-observability /当地docker-compose

所有的容器之后,可以访问该应用程序:http://localhost: 8080 /你好在这里,Grafana:http://localhost: 3000。一个仪表板叫你好可观测性也是预装。

弹簧启动应用程序在云Grafana: Grafana仪表板春天的启动应用程序
弹簧启动应用程序在云Grafana: Grafana仪表板春天的启动应用程序

希望这能让你兴奋!我们将做一个简单介绍云计算和Grafana Grafana代理接下来,之前看仪器的细节。

如何配置Grafana云

Grafana云是一个完整的可组合的可观测性平台,集成了指标,与Grafana痕迹,日志。与Grafana云,您可以利用最好的开源软件可观测性,包括普罗米修斯,Grafana洛基,Grafana节奏,没有安装的开销,维护和扩展你的可观测性堆栈。这可以让你专注于你的数据和业务洞察他们的表面,而不是基础设施堆栈存储和服务数据。

的弹簧启动应用程序在云Grafana:图Grafana云栈
的弹簧启动应用程序在云Grafana:图Grafana云栈

Grafana云的免费的计划使这对每个人来说都可以访问。在自由之上,该计划还允许您访问等高级功能Grafana OnCall,综合监测,报警创建您的免费帐户跟随!

发送日志,指标,跟踪Grafana云,我们需要收集Grafana洛基云连接信息,普罗米修斯,和节奏,这样我们可以配置相应的我们的代理。下一步我们将做什么。

连接Grafana云的痕迹

Grafana云痕迹是全面管理、高度可伸缩和具有成本效益的分布式跟踪系统Grafana节奏。这就是我们的痕迹。

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

弹簧启动应用程序在云Grafana: Grafana云用户界面配置与Grafana节奏痕迹
弹簧启动应用程序在云Grafana: Grafana云用户界面配置与Grafana节奏痕迹

您应当会看到类似下面的截图,端点信息和用户凭证。您可以生成一个新的API键点击现在生成链接或导航安全→API密钥部分。

弹簧启动应用程序在云Grafana:配置Grafana节奏
弹簧启动应用程序在云Grafana:配置Grafana节奏

无论哪种方式,API键创建屏幕下面的样子。(没有担心我暴露API密匙。它已经删除。)

弹簧启动应用程序在云Grafana:创建API密钥
弹簧启动应用程序在云Grafana:创建API密钥
弹簧启动应用程序在云Grafana: API令牌创建UI
弹簧启动应用程序在云Grafana: API令牌创建UI

在这种情况下,这是节奏Grafana云账户信息:

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

连接Grafana云日志

Grafana云Grafana的全面管理日志解决方案是基于日志Grafana洛基。洛基horizontally-scalable,可用性、多租户日志聚合方案灵感来源于普罗米修斯。它被设计成具有成本效益,操作方便。它没有指数日志的内容,而是一组标签为每个日志流。

类似你为节奏所做的连接信息,我们可以收集洛基的连接信息洛基在我的帐户页面:

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

连接Grafana云指标

最后,对于Grafana云指标,我们可以得到所有的连接信息普罗米修斯在我的帐户页面:

  • 端点:https://prometheus刺激- 10 -刺激中央- 0. grafana.net/api/prom/push
  • 用户:330312年
  • API密匙:eyJrIjoiOWYzMmViNDMwNGMzZjM5ZDZjY2JiZTUwZDI4YTlmMDY3MTlkZGM3YSIsIm4iOiJhcXVhbi1lYXN5c3RhcnQtcHJvbS1wdWJsaXNoZXIiLCJpZCI6NjAxMzgwfQ = =

所有的连接信息收集,我们准备配置Grafana代理,代理可以发送我们的日志,指标,跟踪Grafana云。

如何配置Grafana代理商吗

Grafana代理是一个一体化的代理收集度量标准,日志和跟踪。它消除了需要安装多个软件,包括常见的集成监控的。Grafana代理很容易发送遥测数据发送标准的首选遥测收集器,日志,并跟踪数据固执己见Grafana可观测性堆栈,on-prem和Grafana云。

弹簧启动应用程序在云Grafana:堆栈Grafana代理的工作原理图
弹簧启动应用程序在云Grafana:堆栈Grafana代理的工作原理图

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

配置的痕迹

在跟踪,Grafana代理通常被用作跟踪管道,从应用程序卸载的痕迹,并转发存储后端。Grafana代理支持多种格式接收痕迹:OpenTelemetry (OTLP), Jaeger Zipkin, OpenCensus。

弹簧启动应用程序在云Grafana:图Grafana代理是如何接受痕迹
弹簧启动应用程序在云Grafana:图Grafana代理是如何接受痕迹

这是痕迹部分从Grafana代理配置文件。除了Grafana云节奏URL和身份验证信息,我们基本上是说代理预计在HTTP协议OTLP格式的痕迹。您也可以将其配置为使用Jaeger格式如果你喜欢,但我们建议OTLP格式。

痕迹:配置:名称:默认remote_write: -端点:tempo-us-central1.grafana.net: 443 basic_auth:用户名:160639密码:< API_KEY >接收器:otlp:协议:http:

配置日志

以下是客户的部分agent.yaml文件,该文件包含了所有我们之前收集的连接信息。

客户:url: https://logs-prod3.grafana.net/loki/api/v1/push basic_auth:用户名:164126密码:API_KEY > <

配置指标

在指标部分,remote_write包含所有的连接信息。的scrape_configs部分定义了刮工作,稍后我们将讨论。

remote_write: basic_auth:用户名:330312密码:< API_KEY > url: https://prometheus刺激- 10 -刺激中央- 0. grafana.net/api/prom/push

让我们继续看看仪器以及日志,完成指标,收集和跟踪。我们将开始与OpenTelemetry痕迹。

如何与OpenTelemetry仪器弹簧引导

开源的可观测性框架,OpenTelemetry很快流行。OpenTelemetry OpenTracing和OpenCensus合并的结果。今天的写作,OpenTelemetry痕迹是最成熟的组件,日志仍然是实验性的。我们将专注于追踪方面的OpenTelemetry博客。

OpenTelemetry是api的集合,sdk和工具,您可以使用工具,生成、收集、并出口遥测数据,可以帮助您分析您的软件的性能和行为。OpenTelemetry既是供应商和与平台无关,很快它越来越受欢迎的原因之一。

弹簧启动应用程序在云Grafana: OpenTelemetry架构的图表
弹簧启动应用程序在云Grafana: OpenTelemetry架构的图表

一般来说,仪器可以在三个不同的地方:完成您的应用程序代码;库和框架应用程序依赖于;和底层平台,如Kubernetes特使,或者Istio。OpenTelemetry的优点是设备已经在许多流行的库和框架,如弹簧、表达等。

值得注意的是auto-instrumentationOpenTelementry的能力。Auto-instrumentation允许开发者收集遥测数据,而无需更改任何代码。我们将利用auto-instrumentation功能的Java代理仪器你好可观测性应用程序,没有必要代码更改。

Auto-instrumentation与Java代理

的OpenTelemetryJava代理可以被附加到任何Java 8 + auto-instrumentation申请。它从许多流行动态注入字节码捕获遥测库和框架。一旦连接,它会自动捕捉遥测数据应用程序和服务的边缘,如入站请求,出站HTTP请求,数据库调用等。如果你想仪器应用程序代码在您的应用程序或服务在其他自定义方式,你将不得不使用手动工具。

精彩auto-instrumentation功能的Java代理,插装弹簧启动应用程序非常简单。我们只需要包括-javagent:。/ opentelemetry-javaagent.jar应用程序运行时选项。里面的hello-observability应用服务云/ docker-compose.yaml文件看起来像:

hello-observability:形象:hello-observability卷:- /日志/ hello-observability.log: / tmp / hello-observability。日志——。/日志/ access_log.log: / tmp / access_log。日志环境:JAVA_TOOL_OPTIONS: - javaagent: / opentelemetry-javaagent。jar OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: http://agent: 4317 OTEL_SERVICE_NAME: hello-observability OTEL_TRACES_EXPORTER: otlp港口:——“8080:8080”

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

其他三个环境变量是用来告诉在哪里以及如何发送痕迹。看到OpenTelemetry Java代理配置对系统属性和环境变量的详细信息,您可以使用配置代理。

  • OTEL_TRACES_EXPORTER:跟踪的出口国。我们使用OpenTelemetry出口国通过设置otlp
  • OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:OTLP痕迹端点连接。因为我们发送跟踪通过Grafana Grafana云代理,我们需要设置代理的URL。注意端口号4317年
  • OTEL_SERVICE_NAME:一个服务名称来识别我们的应用程序。我们只是设置应用程序名称hello-observability

在应用程序运行时,登录到你的Grafana云账户。选择您的节奏的数据源探索。在我的例子中,它被称为grafanacloud-aquan-traces。看到你点击痕迹搜索按钮,选择hello-observability服务名称。记得我们组OTEL_SERVICE_NAMEhello-observability吗?

弹簧启动应用程序在云Grafana: UI与OpenTelemetry插装Java代理的
弹簧启动应用程序在云Grafana: UI与OpenTelemetry插装Java代理的

点击其中一个看到瀑布的可视化跟踪。之后,一旦我们有日志和度量运往Grafana云,你将能够与日志,度量,和跟踪!一个统一的可观测性平台的力量!

弹簧启动应用程序在云Grafana:跟踪可视化过程的截图
弹簧启动应用程序在云Grafana:跟踪可视化过程的截图

如果您正在运行在本地的一切,你也可以看到奖金节点图仍处于测试阶段,作为写作的。

弹簧启动应用程序在云Grafana: UI Grafana云节点图
弹簧启动应用程序在云Grafana: UI Grafana云节点图

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

弹簧引导申请Grafana云:Grafana跟踪的云节点图
弹簧引导申请Grafana云:Grafana跟踪的云节点图

收集日志和相关跟踪

的痕迹,让我们也从应用程序收集日志,看看我们如何关联日志和跟踪。

弹簧启动内置的支持自动请求日志。的CommonsRequestLoggingFilter类可以用来记录传入的请求。你只需要配置它通过添加bean定义。我们有以下Java类定义源代码目录,在一个文件中RequestLoggingFilterConfig.java

@ configuration公开课RequestLoggingFilterConfig {@ bean公开CommonsRequestLoggingFilter logFilter () {CommonsRequestLoggingFilter过滤器= 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 =调试logging.pattern。文件= % d {yyyy-MM-dd HH: mm: ss} - X %味精traceID = % {trace_id} % n

我们告诉Spring将日志写入引导/ tmp / hello-observability.log日志文件,关于日期/时间的信息,日志消息,追踪ID。特别感兴趣的是trace_id。它允许我们自动关联我们之前收集的日志和跟踪,正如您将看到的。

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

2022-03-11 18:15:56——在请求(GET /你好,客户= 192.168.80.2头=(主持人:“hello-observability: 8080”,用户代理:“旋度/ 7.81.0-DEV”,接受:“* / *”]]traceID = f179e69bd5f342233b9bc66728901f7f

将日志发送到Grafana云使用Grafana代理是超级简单。请参考文档收集日志Grafana代理获取详细信息。这是scrape_configs部分内agent.yaml日志文件:

scrape_configs: job_name: hello-observability static_configs:目标:(localhost)标签:工作:hello-observability __path__: / tmp / hello-observability。日志——job_name: tomcat-access static_configs:目标:(localhost)标签:工作:tomcat-access __path__: / tmp / access_log.log

正如您可以看到的,从代理是阅读日志hello-observability.log文件。我们也使Tomcat和收集从应用程序访问日志,这样我们就可以创建一些有趣的可视化。这是里面的部分application.properties配置Tomcat访问日志。我们基本上是写日志的访问/ tmp / access_log.log文件。这也是在Grafana代理接了起来。代理应用程序容器和容器可以看到相同的文件通过码头工人卷挂载。

server.tomcat.accesslog。= true server.tomcat.accesslog启用。旋转= false server.tomcat.accesslog.suffix =。日志server.tomcat.accesslog。前缀= access_log server.tomcat.accesslog。目录= / tmp server.tomcat.accesslog.pattern =常见

那么,去Grafana云探索,并选择洛基数据源。在我的例子中,它被称为grafanacloud-aquan-logs。使用日志浏览器选择hello-observability的工作。然后点击显示日志

Grafana云:UI中弹簧启动应用程序插装在春天日志的引导程序
Grafana云:UI中弹簧启动应用程序插装在春天日志的引导程序

您应该看到一些日志。扩大的一个日志行和点击grafanacloud-quan-traces下面,您应该看到这样的东西。神奇的相关性的日志和跟踪所有自动完成因为追踪ID !

弹簧启动应用程序在云Grafana: UI相关日志和跟踪
弹簧启动应用程序在云Grafana: UI相关日志和跟踪

现在让我们完成我们的可观测性故事收集度量标准。

插装弹簧引导与普罗米修斯

Grafana云有一个弹簧引导集成春天可以发送启动应用程序度量Grafana云以及可视化的开箱即用的仪表板。

弹簧引导还通过内置支持指标集合测微计。然而,截至今天,千分尺不支持范本然而。因为我们想展示范例Grafana能力,我们将使用普罗米修斯仪器应用程序直接收集性能指标,而不是使用Spring集成引导。(bob电竞频道Grafana实验室产品经理珍别墅有一个很好的博客对范本。)

看一看HelloObservabilityBootAppJava类。我们基本上是插装与一个简单的应用程序计数器,一个,一个柱状图和一个总结,仅仅出于演示目的。

确保应用程序运行。去Grafana云,你好可观测性仪表板。的要求每分钟可视化显示与原型普罗米修斯指标,绿点。

弹簧启动应用程序在云Grafana: Grafana仪表板普罗米修斯指标
弹簧启动应用程序在云Grafana: Grafana仪表板普罗米修斯指标

在其中一个鼠标,你会看到一个弹出面板了trace_id标签,直接带你去跟踪链接。原型的力量!

弹簧启动应用程序在云Grafana:原型在Grafana云
弹簧启动应用程序在云Grafana:原型在Grafana云

如果你是好奇收集的度量与原型普罗米修斯,发送一个请求http://localhost: 9090 / api / v1 / query_exemplars ?查询={工作= " hello-observability "}并检查它。它会看起来像下面的。原型是集元数据标签,如span_idtrace_id

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

范例弹出对话框显示的链接速度,你必须配置标签名称trace_id普罗米修斯数据源配置。默认值是traceID。否则,你不会看到这个链接。你不能编辑预先配置的普罗米修斯数据源云在你的帐户。你需要创建另一个普罗米修斯数据源相同的连接信息,然后添加范例配置。

弹簧启动应用程序在云Grafana:配置范本
弹簧启动应用程序在云Grafana:配置范本

也,因为原型仍然是新的,你必须请求支持Grafana云账号。如果你在本地运行Grafana, Grafana的最新版本已经支持原型。

相关日志、度量和在Grafana痕迹

可观测性不仅是收集所有遥测数据日志的形式,指标和痕迹。更重要的是,它是关于相关遥测数据的能力,得出可行的见解。

弹簧启动应用程序在云Grafana:图的可观测性支柱
弹簧启动应用程序在云Grafana:图的可观测性支柱

显然你可以连接和关联任何遥测数据可视化图形到相同的仪表板。从导出导入你好可观测性仪表板云/仪表板/ hello-observability.json文件,并选择相应的洛基和普罗米修斯数据源。你会看到相同的你好可观测性仪表板显示和连接日志、度量和痕迹。

仪表板,Grafana使您连接和相关日志,度量,和跟踪在许多不同的方式:

  1. 从你的指标使用分屏找到相关日志。洛基的日志系统标记以同样的方式作为普罗米修斯指标,使用相同的服务发现机制。这使您能够找到更快的日志对于任何给定的指标可视化故障诊断从一个界面只需要点击几下。例如,从要求每分钟面板中,点击探索然后分裂,并选择洛基数据源。您将会看到有关日志的指标在同一时间范围。日志提供的上下文的指标我们观察和调查。
弹簧启动应用程序在云Grafana: Grafana仪表板关联指标和日志
弹簧启动应用程序在云Grafana: Grafana仪表板关联指标和日志
  1. 从日志中提取指标使用洛基。洛基使用LogQL Prometheus-inspired查询语言从日志中提取指标。从日志中提取指标在时间序列可视化和可视化日志消息使它轻松致富和快速了解应用程序的行为。作为一个例子,HTTP状态代码随着时间的推移,面板是一个指标的可视化创建基于Tomcat访问日志,使用以下查询:

总和(地位)(count_over_time({工作=“tomcat-access”} |模式<>——<>” < _ >” ! = " /指标”(1米)))

弹簧启动应用程序在云Grafana: http状态代码
弹簧启动应用程序在云Grafana: http状态代码
  1. 使用日志和跟踪ID找到痕迹。如您所见,您可以从日志来跟踪主容易追踪ID链接后。使用日志,您可以搜索路径,状态代码,延迟、用户、IP、或其他可以添加到日志行作为一个跟踪ID相同。例如,你可以很容易地过滤日志只看到失败的痕迹,超过延迟sla等。这使它更容易解决问题当他们发生。
  2. 对于一个给定的跨度找到所有的日志。跨越包含链接到相关的日志。你可以探索相关日志与跨越只有一个点击。
  3. 从指标使用范本找到痕迹。当痕迹、日志和度量装饰着一致的元数据,您可以创建相关性,之前没有可能的。如您所见的延迟面板中,普罗米修斯指标装饰着跟踪ID OpenTelemetry时也可以用于跟踪。当你从一个范例跟踪,你现在可以直接进入挣扎的日志服务!

结论

哇,这是很多!

但希望你看到是多么容易仪器弹簧启动日志,申请指标,和痕迹,以及如何基于普罗米修斯Grafana固执己见的可观测性堆栈,Grafana洛基,Grafana节奏可以帮助你连接和相关遥测数据集中地在Grafana云。仪器应用程序和仪表盘玩的开心!

Grafana云是最简单的方法开始使用指标、日志、痕迹和仪表板。我们有一个慷慨的自由永远层和每个用例的bob体育手机二维码计划。现在免费注册!