gRPC(谷歌远程过程调用)是一种高性能、开源的通用RPC
谷歌为实现微服务之间的高速通信而开发的框架。 gRPC 默认具有 Protobuf(协议缓冲区),它将消息格式化或序列化为特定格式,该格式将是高度打包、高效的数据。由于是轻量级 RPC,gRPC 适用于许多用例。
gRPC 可以认为是重量轻的 RPC 的继承者。谷歌开发它是为了在微服务和其他需要交互的系统之间进行通信。使用 gRPC 有几个好处。
-
使用协议缓冲区(Protobuf)而不是 JSON
-
基于 HTTP 2 而不是 HTTP 1.1
-
内置代码生成
-
高性能
-
SSL 安全性
除了上述主要好处之外,gRPC 还可以促进应用程序中更好的设计。 gRPC 是面向 API 的,而不是像 REST 那样面向资源的。默认情况下它也是异步的,这意味着它不会在请求时阻塞线程,它可以并行处理数百万个请求,确保高可扩展性。
gRPC 相对于 REST 的优势
gRPC 在接收数据时大约比 REST 快 7 倍,在为特定负载发送数据时大约比 REST 快 10 倍。这主要是由于 Protocol Buffers 的紧密包装和 gRPC 对 HTTP/2 的使用。
什么是 OpenTelemetry?
OpenTelemetry是一组与供应商无关的工具、API 和 SDK,用于创建和管理遥测数据(日志、指标和跟踪)。它旨在使遥测数据(日志、指标和跟踪)成为云原生软件应用程序的内置功能。生成的遥测数据有助于监控应用程序性能。
什么是 OpenTelemetry 仪器?
检测是您启用应用程序代码以生成遥测数据的过程。 OpenTelemetry 为不同语言的各种库和框架提供工具。例如,在本文中,我们将使用 Golang 中的 OpenTelemetry gRPC 库从 gRPC 调用中生成遥测数据。
我们将使用 OpenTelemetry 库来监控示例 Golang 应用程序中的 gRPC 调用。
OpenTelemetry 只能帮助生成遥测数据。为了存储和分析这些数据,您需要选择一个后端分析工具。在本文中,我们将使用SigNoz监控从 gRPC 调用收集的数据。
SigNoz 是一个全栈开源 APM 工具,提供指标监控和分布式跟踪。它是为原生支持 OpenTelemetry 数据格式而构建的。因此,将后端分析工具与 OpenTelemetry 结合起来是一个不错的选择。另一方面,OpenTelemetry 让您可以自由选择后端分析工具。
安装 SigNoz
只需三个步骤,使用简单的安装脚本即可将 SigNoz 安装在 macOS 或 Linux 计算机上。
安装脚本会自动在 Linux 上安装 Docker Engine。但是,在 macOS 上,您必须在运行安装脚本之前手动安装Docker Engine。
git clone -b main https://github.com/SigNoz/signoz.git
cd signoz/deploy/
./install.sh
进入全屏模式 退出全屏模式
您可以访问我们的文档以获取有关如何使用 Docker Swarm 和 Helm Charts 安装 SigNoz 的说明。
完成 SigNoz 安装后,您可以通过http://localhost:3301访问 UI
[](https://res.cloudinary.com/practicaldev/image/fetch/s--oUl5joWU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:/signoz.io/img /blog/2022/02/signoz_dashboard.webp)
SigNoz 仪表板 - 它显示来自与应用程序捆绑的示例应用程序的服务
使用 OpenTelemetry 运行示例 Golang gRPC 应用程序
我们将使用一个示例 Golang gRPC 应用程序,该应用程序由 Go gRPC 服务器、go gRPC 客户端和 MongoDB 等组件组成。
示例 Golang gRPC GitHub 存储库
我们的应用程序是一个简单的员工服务。这是应用程序的架构以及 OpenTelemetry 和 Signoz。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--G2qLqFA---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:/signoz.io/ img/blog/2022/04/grpc_application_architecture.webp)
应用程序架构以及 SigNoz 和 OpenTelemetry(OTel 收集器)
先决条件
- Golang,Go](https://golang.org/doc/devel/release.html)的三个最新主要[版本中的任何一个。
有关安装说明,请参阅 Go 的入门指南。
protoc
有关安装说明,请参阅协议缓冲区编译器安装。
协议编译器的 Go 插件:
使用以下命令为 Go 安装协议编译器插件:
$ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2
进入全屏模式 退出全屏模式
PATHprotoc
$ export PATH="$PATH:$(go env GOPATH)/bin"
进入全屏模式 退出全屏模式
- MongoDB 按照此链接中的步骤来了解如何安装 MongoDB。
使用 OpenTelemetry 运行示例应用程序
以下是使用 OpenTelemetry 运行示例 Golang gRPC 应用程序的步骤:
**步骤1:
克隆示例 Golang 应用程序存储库并转到根文件夹**
我们将在这个GitHub repo中使用示例 go-grpc 应用程序。
git clone https://github.com/SigNoz/distributed-tracing-go-grpc-sample.git
cd distributed-tracing-go-grpc-sample
进入全屏模式 退出全屏模式
第2步:
安装所需的依赖项
您可以从go.mod文件中查看所需的依赖项。使用安装示例应用程序所需的所有依赖项
go mod tidy
go mod vendor
进入全屏模式 退出全屏模式
OpenTelemetry 需要以下库来检测 golang-grpc 应用程序。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--W7iSbha---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:/signoz.io/ img/blog/2022/04/opentelemetry_grpc_libraries.webp)
监控 gRPC 所需的 OpenTelemetry 库
**第 3 步:
创建 .proto 文件**
在 .proto 文件中,我们有服务定义和各自的函数/消息,通过 protoc 编译器,我们将生成必要的 protobuf 文件。
以下两个命令将安装 golang 的 grpc 和 protoc-gen-go, 的依赖项,这将需要 .proto 文件*.* 现在让我们看看 protoc 如何编译器为 Golang 生成相应的代码。为此,我们从项目的根目录执行了以下命令。
protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
employee/employee.proto
进入全屏模式 退出全屏模式
请注意,我们使用相对路径并将我们的 employee.proto 文件的路径设置为编译。上面的命令生成了两个文件:
-
employee.pb.go 用于使用 protobuf 和其他文件序列化消息
-
employee_grpc.pb.go 由 gRPC 客户端代码和服务器代码组成,我们稍后会介绍。
如果您查看文件 employee_grpc.pb.go,,您会注意到为客户端和服务器实现生成了 structs 和 interfaces。
您可以在此处检查 .proto 文件。
第 4 步:gRPC 服务器、gRPC 客户端和 MongoDB 的 Tracer 配置
为了检测我们的服务,我们将创建一个 config.go 文件并使用它来检测 gRPC 服务器、gRPC 客户端和 MongoDB。
我们需要将 OpenTelemetry 初始化为 gRPC 服务器和客户端主函数中的第一个调用。如果您的应用程序在 OpenTelemetry 设置之前启动,则可能会产生问题。您可以使用如下所示的代码初始化 OpenTelemetry:
func main() {
tp := config.Init()
defer func() {
if err := tp.Shutdown(context.Background()); err != nil {
log.Printf("Error shutting down tracer provider: %v", err)
}
}()
进入全屏模式 退出全屏模式
您可以在此处查看代码示例中的配置。
**第 5 步:
检测 MongoDB**
但是当涉及到 MongoDB 的检测数据时,我们需要使用这个 OpenTelemetry Go 库。
它已经包含在示例 repo 的go.mod文件中。
初始化 MongoDB 客户端时,我们需要通过 otelmongo.NewMonitor() 方法设置监视器,如下所示,该方法将从 MongoDB 获取检测数据。
client, err := mongo.NewClient(options.Client().ApplyURI(mongo_url).SetMonitor(otelmongo.NewMonitor()))
if err != nil {
log.Fatal(err)
}
进入全屏模式 退出全屏模式
第 6 步:设置 .env 文件
我们在客户端和服务器目录中有 .env 文件,以便设置 grpc-server 和 grpc-client 组件所需的环境变量。
这就是 server/.env 的样子
MONGO_URL=mongodb://localhost:27017/employeedb
OTEL_EXPORTER_OTLP_ENDPOINT="localhost:4317"
OTEL_SERVICE_NAME="go-grpc-otel-server"
INSECURE_MODE=true
进入全屏模式 退出全屏模式
这就是 client/.env 的样子
OTEL_EXPORTER_OTLP_ENDPOINT="localhost:4317"
OTEL_SERVICE_NAME="go-grpc-otel-client"
INSECURE_MODE=true
进入全屏模式 退出全屏模式
您可以在示例 GitHub 存储库中检查客户端环境文件和服务器环境文件。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--E3s0-5Ni--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:/signoz.io /img/blog/2022/04/grpc_env_files.webp)
.env 文件在 server/server.go 和 client/client.go 中加载
第 7 步:
在 Mongo Compass 中创建 MongoDB 表和集合
1.点击连接→新建连接
[](https://res.cloudinary.com/practicaldev/image/fetch/s--lLze2pV2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:/signoz.io/ img/blog/2022/04/grpc_mongodb_connection.webp)
1.点击数据库选项卡→创建数据库并填写如下截图所示的字段
[](https://res.cloudinary.com/practicaldev/image/fetch/s--jsddL3X3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:/signoz.io/img /blog/2022/04/grpc_create_database.webp)
现在示例 Golang gRPC 应用程序已使用 OpenTelemetry 设置,让我们看看如何使用 SigNoz 仪表板监控收集的数据。
使用 SigNoz 仪表板监控 Golang gRPC 和 MongoDB
您需要生成一些数据以查看如何在 SigNoz 仪表板中捕获跟踪。从我们项目的根,
步骤1:
cd
go run server.go
进入全屏模式 退出全屏模式
第2步:
cd
go run client.go
进入全屏模式 退出全屏模式
运行客户端会在 MongoDB 中进行一组 CRUD 操作,例如创建员工、读取员工、更新员工和删除员工。我们为所有这些操作添加了跟踪,以便它生成一些监控数据,以便在 SigNoz 仪表板上进行探索。
现在,在浏览器中打开 SigNoz 仪表板,地址为http://localhost:3301/dashboard。您现在应该能够在仪表板上的受监控服务列表中注意到 Go-Grpc-Otel-Server。
[中监控的 Golang gRPC 应用程序](https://res.cloudinary.com/practicaldev/image/fetch/s--3rf4bUiw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:/signoz .io/img/blog/2022/04/grpc_monitored_on_signoz.webp)
我们的服务 Go-gRPC-Otel-Server 被 SigNoz 监控
监控顶级端点列表
我们的遥测配置示例假设我们的应用程序在本地运行,并且我们希望在每个跨度发出时单独处理它。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--3zi58BLv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:/signoz.io /img/blog/2022/04/grpc_top_endpoints.webp)
SigNoz 显示的 Go-gRPC-Otel-Server 服务的顶级端点列表
探索您服务中的所有事件(跨度)
Traces
[](https://res.cloudinary.com/practicaldev/image/fetch/s--3L5d3GPc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:/signoz.io/img /blog/2022/04/grpc_span_table.webp)
SigNoz 捕获与我们的应用程序相关的所有事件。您可以使用强大的过滤器来快速分析和调试性能问题。
应用程序中每个跨度的详细跟踪
单击跨度表中的任何跨度将带您进入详细的跟踪页面,其中显示了服务器、客户端和 MongoDB 的整个跟踪过程。跟踪详细信息页面包含请求每个部分所用时间的信息,可以帮助快速识别延迟问题。
您将看到所选事件的火焰图,它显示了请求如何在 gRPC 服务器和 gRPC 客户端之间传播。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--QN5GA4D4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https: /signoz.io/img/blog/2022/04/grpc_flamegraph.webp)
SignNoz 仪表板中的火焰图
SigNoz 还提供了常见的语义约定的详细视图,例如 rpc 服务、方法、网络、状态_code 等。用户请求的端到端跟踪可以帮助您快速识别延迟问题。
MongoDB Traces 及其语义约定
建立查询的顺序流和请求每个部分所用时间的信息可以帮助快速识别延迟问题。例如,您可以查看查找查询所用时间等详细信息。您还可以查看相关的 MongoDB 查询。
它还在下面的窗口中提供了 MongoDB 的语义_conventions。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--VYFFr0Jc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:/signoz.io/ img/blog/2022/04/grpc_mongodb_traces.webp)
SigNoz 还提供有关 MongoDB 请求的更多上下文数据
解决错误
您还可以使用 SigNoz 仪表板来捕获 MongoDB 查询中的错误。如果您请求后端不可用的数据字段,则应用程序将返回错误。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--iof6pVeq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:/signoz.io/ img/blog/2022/04/grpc_error_troubleshooting.webp)
对错误进行故障排除
结论
OpenTelemetry 使得检测 gRPC 调用以进行性能监控变得非常方便。 OpenTelemetry 将成为云原生应用程序监控和可观察性的未来,因为它得到了庞大社区的支持。
使用 OpenTelemetry 的最大优势是您不会被供应商锁定。如果明天,您想使用不同的供应商,您可以轻松完成。
SigNoz 原生与 OpenTelemetry 一起工作。遥测数据之上的查询服务和可视化层是快速生成可行见解的关键。 SigNoz 提供开箱即用的图表和强大的过滤器来快速分析遥测数据。
OpenTelemetry 和 SigNoz 提供了一个很好的开源解决方案来监控 gRPC 调用。您可以通过访问其 GitHub 存储库来试用 SigNoz 👇
#support
从 SigNoz 博客阅读有关 OpenTelemetry 的更多信息
使用 OpenTelemetry 监控 GraphQL API
使用 OpenTelemetry 监控 Go 应用程序