观测手薄自动生成软件_重新思考编程:自动观测

观测手薄自动生成软件

介绍

可观察性是通过查看外部发生的事情来了解系统内部状态的能力。 在软件系统中,为了获得可观察性,我们主要实现以下方面:日志记录,指标和跟踪。 尤其是当我们从单片软件系统转变为基于微服务的体系结构时,可观察性成为系统设计的关键方面。

与单片相比,在微服务部署中进行问题排查和性能调整要困难得多。 这主要是由于使用分布式系统增加了复杂性。 因此,您的软件系统应该理解这些挑战,并准备处理可能出现的任何问题。 可观察性工具使我们能够做到这一点。

在本文中,我们将重点介绍三种可观察性工具:

  • 指标:向我们提供汇总信息。 这些是在一段时间内计算出的数值,例如请求错误率和等待时间值。
  • 日志:记录各个系统事件,例如资源访问日志和审核日志。
  • 跟踪:使我们能够了解系统中的请求流。 这是通过将系统中发生的单个事件与用于标识唯一流的组相关联来完成的。 在诸如微服务体系结构的分布式环境中,这成为分布式跟踪练习。

为了实现这些功能,开发人员需要显式地编写代码以在外部发出此信息。 但是,如果我们可以使大多数常用的可观察性场景自动化,该怎么办? 一种方法是让编程库本身无需太多用户干预即可发出此信息。

芭蕾舞演员编程语言 通过结合自动可观测特征到所述语言本身进一步借此的步骤。 这对于语言的网络意识等方面是可能的,因为它具有对网络操作的明确了解,因此可以执行自动检测。

让我们在Ballerina中创建一个示例微服务部署方案,并展示如何实现指标和分布式跟踪中的自动可观察性功能。

微服务用例:电子商务后端

我们将实现一个电子商务后端,该后端模拟实现商品搜索,将商品添加到购物车,付款和运输所需的服务。 该解决方案并没有实现实际实现的所有功能,而是遵循您将面临的简单模式和功能。 实施所有服务后,我们将研究Ballerina语言和平台如何为用户提供自动可观察性功能,而无需任何其他编码。

服务通过HTTP公开。 我们还将使用MySQL作为持久性机制。 图1显示了服务之间如何交互的总体体系结构。

图1- 电子商务后端服务架构

对于每个主要领域,我们都有一个微服务来处理工作,例如搜索当前库存中的商品,将商品存储在购物车中以及使用购物车中的当前商品创建订单。 单个“管理员”服务位于这些服务的前面,以创建网站与后端交互的统一界面。 因此,“管理员”服务将成为连接后端服务的主要协调器。

一些服务将拥有自己的数据库以保持持久性。 在我们的实现中,我们并不总是将数据持久保存在应有的数据库中,而是为此任务创建了内存中的数据存储。 通常最好不要在服务之间共享数据库,以保持功能的松散耦合。

因此,无论何时需要一些信息,我们都会始终通过相关服务来访问它们。 这在运输和开票的场景中可以看到,其中管理员传递对订单的引用,并且各个服务将访问订单管理服务以查找订单详细信息以执行其任务。

让我们浏览一下服务实现,以了解如何使用Ballerina来实现它们以及如何完成彼此之间的交互。

大车

此服务代表购物车功能。 我们实现的基本功能是将商品添加到购物车,获取所有商品,然后清空购物车。

它们与各自的HTTP动词映射到HTTP资源,以类似于我们正在执行的操作。 持久性是使用RDBMS数据库完成的,并且我们使用Ballerina JDBC连接器来执行SQL语句。

清单1 -cart.bal

Ballerina服务共享一些将在多种服务中使用的通用数据类型。 这些是在根据需要导入的通用模块中定义的。 清单2显示了通用结构的代码。

清单2 -types.bal

库存

库存服务仅对用户实施搜索操作,以使用给定的关键字搜索商品。 在我们的示例场景中,数据库将已经填充了条目。

搜索资源使用数据绑定来接受参数“ query”,该参数用于使用SQL查询在数据库中执行搜索操作。 查询的结果集将转换为JSON值,并返回给调用方。 清单3显示了用于实现服务的代码。

清单3 -stock.bal

订单管理

订单管理服务接收订单明细,这些明细主要是订单中包括的项目及其数量,并将其保留下来以供以后查询以进行信息查找。 在这里,为了简单起见,我们使用内存中的数据存储机制来存储信息。 清单4中提供了服务代码。

清单4 -ordermgt.bal

开票

计费服务通过使用订单管理服务查找订单详细信息,为用户创建付款收据并将其退还,从而简单地响应管理员的呼叫。

这里模拟了实际的操作,其中实现与所需的服务进行交互。 清单5中提供了相关代码。

清单5 -billing.bal

运输

与开票服务类似,运送处理服务从admin服务中获取指令,与订单管理服务联系以检索详细信息,然后执行运送操作。 来自服务的响应是要提供给用户的生成的交付跟踪号。 清单6显示了此服务的代码。

清单6 -shipping.bal

管理员

管理服务充当网站前端到后端服务功能的网关。 它还负责系统中服务的主要业务流程。 在我们的示例实现中,它包含一些针对购物车和库存服务的简单代理操作。

此外,它实现了结帐操作,该操作将多个后端服务的使用结合在一起以完成请求。 清单7包含管理服务的代码。

清单7 -admin.bal

图2中的图显示了从Ballerina VS Code环境自动生成的序列图视图。

图2- 管理员服务序列图视图

由于语言设计的原因,在Ballerina中可以使用此视图,在该视图中创建其构造以与序列图概念兼容。 要了解更多信息,请阅读Ballerina如何使用序列图进行编程

系统部署和可观察性

现在,我们已经研究了如何在代码中实现服务,让我们看看如何构建项目并部署它。 我们还将看到如何在Ballerina中设置可观察性功能所需的工具,以及如何在应用程序中启用自动可观察性功能。

可以从https://github.com/lafernando/samples/tree/master/ballerina/ecommerce访问该方案的完整项目。

克隆存储库并访问“电子商务”目录后,您将可以按照README.md中的说明进行操作,以设置MySQL数据库,构建和运行Ballerina服务,运行可观察性工具,并为我们的服务执行交通模拟器。

首先,您将需要编辑购物车和库存服务源代码以更新MySQL服务的用户名和密码详细信息。 在更实际的情况下,我们将使用Ballerina config API来外部化这些属性。 然后,我们将创建数据库并使用以下命令填充一些示例数据。

$ mysql -u user  -p < db.sql

之后,我们将使用以下命令在Ballerina项目中构建所有模块。

$ballerina  build  -a

这将编译源代码并构建以下可执行工件。

  • target / bin / billing.jar
  • target / bin / simulator.jar
  • target / bin / cart.jar
  • target / bin / shipping.jar
  • target / bin / ordermgt.jar
  • target / bin / admin.jar
  • target / bin / inventory.jar

现在,我们可以运行上述可执行文件。 通常在Ballerina中,我们使用以下命令运行应用程序。

$ ballerinarun  target/bin/cart.jar

但是在我们的实例中,为了启用可观察性功能,我们必须传递一个运行时标志。 因此,以上命令更改为以下命令。

$ ballerina run target/bin/cart.jar --
b7a.observability.enabled=true --
b7a.observability.metrics.prometheus.port= 9797

我们只需要将属性“ --b7a.observability.enabled”设置为true,Ballerina应用程序将发出跟踪信息并生成度量标准数据。 在我们的案例中,我们还提供了将打开的端口,用于将指标数据呈现给Prometheus服务器。

默认端口是9797,但是我们将使用其他端口值来显式设置此端口,因为我们将在同一主机中运行多个服务。 以上述方式,我们将运行我们的所有服务。

$ ballerina run target/bin/ordermgt.jar --
b7a .observability .enabled =true --
b7a .observability .metrics .prometheus .port = 9798
$ ballerina run target/bin/billing.jar --
b7a .observability .enabled =true --
b7a .observability .metrics .prometheus .port = 9799
$ ballerina run target/bin/shipping.jar --
b7a .observability .enabled =true --
b7a .observability .metrics .prometheus .port = 9800
$ ballerina run target/bin/inventory.jar --
b7a .observability .enabled =true --
b7a .observability .metrics .prometheus .port = 9801
$ ballerina run target/bin/admin.jar --
b7a .observability .enabled =true --
b7a .observability .metrics .prometheus .port = 9802

现在,我们所有的服务都已启动并正在运行,它们已经准备好发出和生成可观察性数据。

在Ballerina中,使用OpenTracing API实现了分布式跟踪功能,默认情况下, Jaeger提供程序附带了OpenTracing API,用于发布跟踪信息。

因此,在这里,我们将使用Jaeger以便从Ballerina服务接收跟踪数据。 为了简化设置所需软件的过程,我们将使用Docker来运行Jaeger服务器。

$ docker run -p5775 : 5775 /udp -p6831: 6831 /udp -p6832: 6832 /udp -p5778: 5778 -p16686: 16686 -p14268: 14268 jaegertracing/all- in -one:latest

对于指标,Ballerina使用Prometheus来处理和存储数据。 首先,我们需要配置一个“ prometheus.yml”以提供我们的服务端点来提取指标数据。 在项目目录中,打开提供的prometheus.yml文件并更新主机/ IP值,以表示非环回地址,最好是网络接口的外部IP地址,可以从Docker环境访问该地址。

现在,我们可以通过以下方式使用Docker运行Prometheus服务器。

$ docker run -p 9090 : 9090 -v
 /home/laf/dev/samples/ballerina/ecommerce/prometheus .yml :/etc/prometheus/prometheus .yml prom/prometheus

为了可视化Prometheus的指标,我们使用Grafana部署为Ballerina应用程序预定义的仪表板。

$ docker run -p3000 : 3000 grafana/grafana

现在,我们已经部署了所有服务,并且正在运行所有可观察性工具。 现在,让我们调用服务来模拟一些用户会话。 为此,可以在“模拟器”模块中使用Ballerina应用程序。 可以通过以下方式调用它。

$ ballerina run target/bin/simulator.jar100 1000

该应用程序通过搜索商品,向购物车中添加一些商品并最终检出商品来模拟用户会话。 模拟器应用程序执行采用两个运行时参数,其中第一个参数表示会话执行之间的延迟(以毫秒为单位),第二个参数表示要执行的事务总数。 上面的执行将生成类似于以下内容的日志条目。

{"accountId" : 2 , "orderId" : "8b8d2e1a-f9f9-4c44-945d-62cac1306303" , 
 "receiptNumber" : "87bf6bb2-1861-417b-90e6-d6083715bc7c" , 
 "trackingNumber" : "2a9faeea-ac68-4848-a679-a8ef717d577b" }

执行示例请求后,让我们看一下自动可观察性功能为我们提供的功能。

分布式跟踪

让我们导航到http:// localhost:16686 /上的Jaeger Web控制台。 在这里,我们提供了许多搜索轨迹的选项。 如果我们扩展“服务”下拉列表,我们已经可以看到我们已部署的所有Ballerina服务。

让我们选择“ Admin”服务,并使用默认选项对其进行搜索。

图3 -Jaeger跟踪搜索

跟踪是一个实体,其中包含有关单个请求的信息。 这由多个跨度组成。 跨度包含有关在分布式系统中完成的单个工作单元的信息。 让我们看一下“签出”跟踪,它表示我们已执行的签出请求。

图4- 签出执行跟踪

这里,水平条表示操作的跨度,并且跨度可以具有与其相关联的其他相关跨度。 在这种情况下,有一个“签出”范围贯穿请求的整个持续时间,在此范围下,有多个子范围代表了在签出操作中完成的其他各个操作。 使用此视图,我们可以快速了解每个操作的持续时间以及操作之间的关系。

每个范围都包含标签和日志形式的元数据。 标签包含适用于整个范围的信息。 日志事件是跨度内某个时间段内发生的某些事件。 让我们看一下在签出过程中发生错误的场景,以及如何在跟踪中显示该错误。

图5 -Checkout错误执行跟踪检查

在此跟踪中,我们看到在“ ShoppingCart”服务中的“ addItem”操作上发生了错误。 相应的跨度被标记为错误,我们可以深入到标签和日志中以找到有关上下文的更多信息。

在这里,我们看到了此时已执行SQL查询,并且日志条目显示我们试图插入重复的条目,因此数据库操作失败。

图6显示了跟踪中的日志变得有用的类似情况,其中我们可以通过查看跨度日志来跟踪装运跟踪号。

图6- 运输操作范围日志

使用上述功能进行跟踪,我们可以轻松地跟踪请求信息。 它尤其有助于发现性能瓶颈并优化服务中的流程。

指标

让我们看一下如何可视化部署的指标信息。 为此,我们必须首先在Grafana中部署Ballerina指标仪表板。 让我们导航到http:// localhost:3000 /并使用默认的用户名/密码“ admin” /“ admin”登录。

第一步,我们需要添加一个数据源以指向我们之前部署的Prometheus服务器。

在这里,选择“ Prometheus”作为数据库,并为HTTP URL提供“ http:// <external-ip>:9090”,其中external-ip是
“ prometheus.yml”文件。

保持其他字段不变,然后单击“保存并测试”。 在这里,如果一切正常,您会收到一条成功消息,现在我们可以继续导入仪表板了。

在Grafana中,单击“ +”号,然后选择“导入”。 在这里,提供仪表板ID“ 5841”。 导入后,下一页将要求您选择Prometheus数据源,我们可以从下拉菜单中选择较早创建的数据源。

按“导入”,这将带我们进入Ballerina仪表板。 在这里,以下三个部分在仪表板中可视化。

HTTP服务指标

该仪表板行包含用于提供有关系统中部署的服务的度量标准信息的面板。 如图7所示。

图7 -HTTP服务指标仪表板

它包含诸如请求/错误计数,吞吐量信息,响应时间百分位数以及与流量相关的顶级服务之类的信息。

HTTP客户端指标

其中包含有关我们服务中使用的HTTP客户端的信息。 这些是,例如,管理服务和其他服务之间的通信,以及帐单和运输服务与订单管理服务之间的通信。 该仪表板部分如图8所示。

图8 -HTTP客户端指标仪表板

与服务指标类似,它包含相应的HTTP客户端信息。

SQL客户端指标

此仪表板部分可视化与SQL数据库操作相关的指标。 在我们的部署中,我们有购物车和库存服务执行用于持久性操作SQL语句。 这些操作的统计信息将在此处显示,如图9所示。

图9 -SQL客户端指标仪表板

在这里,我们可以看到当前正在执行SQL执行计数,错误率,响应时间百分位数以及已执行的顶级SQL语句。

Ballerina指标仪表板显示了可视化的最常用信息,但是如果需要,我们当然可以更新现有仪表板,以在该仪表板中也包含更多信息。 另外,如果需要用更多信息丰富可观察性数据,则可以使用Ballerina观察API来做到这一点。

摘要

在本文中,我们看到了Ballerina的自动可观察性功能如何使我们的应用程序代码保持清洁,同时主要集中于我们的业务逻辑。 通常,当我们想进行有意义的可观察性操作时,我们可能最终会在代码库中堆满许多库调用以发出度量和跟踪信息。 在像Ballerina这样的环境中,尤其是在该语言具有对联网系统的明确了解的情况下,它可以智能地发出最常需要的可观察性信息,而无需开发人员干预。

有关Ballerina及其可观察性特征的更多信息,请参见以下资源:

Ballerina的例子

如何遵守Ballerina守则

翻译自: https://hackernoon.com/rethinking-programming-automated-observability-dn14p3yxb

观测手薄自动生成软件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值