用 Prometheus 和 Grafana 实现容器化应用程序的可视化监控

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 当您学会了本教学的所有内容,您最终将会得到属于自己的 Prometheus 和 Grafana 的 Dockerfiles 文件,它们会让您的监控部署实现自动化,就像你对应用程序镜像和容器所做的一样。

screenshot

出品丨Docker公司(ID:docker-cn)
编译丨小东
每周一、三、五晚6点10分 与您不见不散!


近日,我在 Pluralsight 网络课程中更新了一节《如何使用 Docker 监控容器化应用程序运行状况》的教学视频!本视频涵盖了在 Linux 和 Windows 上运行 Docker 容器时监控应用程序所需的全部内容,它将教会您监控容器的整个理论和实践以及使用行业标准工具 Prometheus 和 Grafana。

在 Docker 中监控应用程序的最主要好处是,开发人员可以在本地运行监控应用栈,并获得运营团队在生产中使用的完全相同的指标。

演示应用程序是在 Linux 容器上运行 Java,在 Windows 容器上运行 .NET Framework。我使用独立的 Docker 引擎(适用于 Mac 和 Windows 的 Docker Desktop,以及 Ubuntu 和Windows Server 上的 Docker Engine)以及运行 Linux 和 Windows 节点的混合 Docker swarm。所以,每个人都可以各取所需。


为容器化应用程序构建监控

应用程序在数百个 Docker 容器中运行时,与其在几十台服务器中运行相比,其监控是不同的。您不希望使用 Nagios 或 SCOM 等“经典”监视工具,因为它们不适用于现阶段高周转率以及动态管理的环境。

因此,与在服务器上运行时将数据推送到中央监控服务器的代理不同,您可以从容器和 Docker 服务器公开指标,并运行一个监控组件来轮询这些指标并存储结果:

screenshot

指标服务器是 Prometheus,它将数据存储在自己的时间序列数据库中。然后,为了可视化您的应用程序运行状况,您可以在 Grafana 中构建一个仪表板,该仪表板可以实时显示 Prometheus 的关键指标,并且可以根据需要显示。

Prometheus 和 Grafana 是成熟的开源项目,拥有庞大的用户群,并且为在 Docker 中运行提供了良好的支持。它们都是 CNCF Landscape 的特色,Prometheus 是 CNCF 的授权项目。

它们都是您需要学习的新技术,但是它们的入门都非常简单。接下来,我将带您了解这些内容 —— 包括在 Linux 和 Windows 上的 Docker 容器中运行 Prometheus 和 Grafana。

在轻量级的 Docker 容器中运行监控组件意味着您可以在每个环境中运行相同的指标仪表板,从容器中提取指标的体系结构意味着您可以在不同级别的解决方案上获得一致的视图。接下来,我将介绍:

  • 应用程序指标 —— 您记录的自定义指标,这些指标在仪表板中很有用,例如登录用户数等。
  • 运行时指标 —— 操作系统或运行时主机已收集的数据,如 We b服务器处理的每秒请求数或内存使用量等。
  • Docker 指标 —— 来自容器平台的指标,包括在每个状态下运行的容器、节点可用性和运行状况检查。

用 Prometheus 收集指标

Prometheus 是一个轮询服务器,它向提供服务指标的 REST API 发出 HTTP 请求(您也可以将数据推送到 Prometheus,但这是一种不太常见的模式)。

您可以直接在服务器上运行 Prometheus,但最好是在 Docker 中运行它 —— 这将使 Prometheus 的设置更加便携,并且 Prometheus 可以使用 Docker内置的 DNS 服务器来更容易的发现轮询目标。

Prometheus 是指标服务器的绝佳选择,因为它具有大多数语言的客户端库,Docker 引擎本身可以公开 Prometheus 格式的指标。

我将向您展示如何在 Prometheus 中为容器和 Docker 引擎配置服务发现,无论是在独立模式还是在集群模式下。

在群集模式下,Docker 支持使用 DNS 查询进行容器发现,这些查询为您提供了服务中所有容器的 IP 地址。


向 Prometheus 公开运行时指标

托管应用程序的运行时可能已经在收集指标了,您可以在不更改代码的情况下从容器中公开它们。

我将向您展示如何在 Docke r镜像中将指标导出器与应用程序一起打包,这是一个为 Prometheus 提供 “/metrics”API 的实用程序:

screenshot

这是在 Docker 中向现有应用程序添加监控的一种简单且低风险的方法,无需更改应用程序(只需在 Dockerfile 中打包一个第三方的导出器)。举个例子:

  • Tomcat 在 Linux 容器中运行 JSP 网站,其导出器为您提供来自 JVM 和 Tomcat Web 服务器的详细指标。
  • IIS 在Windows容器中运行 ASP .NET 网站,其导出器为您提供 Windows 性能计数器的指标,包括 .NET 和 IIS 的指标。

这个级别的监控可以告诉您容器的工作情况,这是查看某个地方是否存在瓶颈或某个容器是否有问题的好地方。


向 Prometheus 公开应用程序指标

如果要从容器中提取自定义指标,则需要编写一些代码。但是,它很简单。

我使用适用于 Java 的官方 Prometheus 客户端库,以及用于 .NET 的社区 Prometheus 客户端库,将自定义指标添加到我的 Web 应用程序中。我记录了基本内容,例如登录会话数、添加到购物篮中的商品数量以及下订单数量。

客户端库为 Prometheus 提供 REST API。我将介绍一些托管端点的选项 —— 我更喜欢为应用程序和运行时指标设置单独的端点,这样您就可以在不同的计划上轮询它们。

应用程序指标可以告诉您容器内部发生了什么,因此您可以使用它们为业务用户提供实时的 KPI 数据,或为 IT 用户提供技术统计信息。


向 Prometheus 公开 Docker 指标

Docker 还可以用 Prometheus 的格式导出指标(这是一个实验性质的功能,但我将告诉你如何启用它,以及运行“实验性质”意味着什么)。

您可以从 Docker 引擎中获得一组统计信息,其中包括容器和运行状况检查信息,以及服务器详细信息和使用情况。所有版本的 Docker 都是如此,因此您可以在仪表板中显示 Docker 平台的统计信息。开发人员在 Docker Desktop 中看到的详细信息与运营团队在 Docker Enterprise 上的生产环境中所看到的详细信息保持一致。

在群集模式下运行时,管理器节点会产生第二组统计信息,它将告诉您有关群集中节点的详细信息,以及有关群集性能的底层信息(包括 etcd 和 Raft)。

这是您希望在应用程序仪表板中看到的最终详细信息。在概述中看到这些细节非常好,因为它可以很容易地在不同的数据集之间进行关联,并发现问题的根本原因。

如果应用程序指标中登录用户的数量突然下降,并且运行时指标中提供的 HTTP 请求数量也下降了,那么您可以检查 Docke 指标 —— 可能您的运行状况检查都失败了,这意味着发布失败了,或者可能有一半的节点已经脱机。在一个地方查看所有这些数据可以为您提供全面的见解。


使用 Grafana 构建仪表板

最后,我要向您展示的是如何在 Grafana 中构建仪表板,使用 PromQL 查询将所有关键应用程序、运行时和 Docker 指标集中到同一个仪表板中:

screenshot

Grafana 本身非常简单易用,我在视频中介绍了数据源、仪表板和面板。我还向您展示了如何使用您自己的配置打包 Grafana,这样您就可以构建一个自定义的 Docker镜像了,该镜像具有:

  • 配置了您 Prometheus 的数据源;
  • 部署了您应用程序的仪表板;
  • 创建的只读用户;
  • 为该只读用户设置您应用程序仪表板的主页;

当您学会了本教学的所有内容,您最终将会得到属于自己的 Prometheus 和 Grafana 的 Dockerfiles 文件,它们会让您的监控部署实现自动化,就像你对应用程序镜像和容器所做的一样。

如果您对本教学视频有兴趣,可以浏览 https://www.pluralsight.com/courses/monitoring-containerized-app-health-docker?clickid=VLcUt13wQTwjyIp2Xo3wuRwPUkg1QZ2jGS2Rwg0&irgwc=1&mpid=1197078&utm_source=impactradius&utm_medium=digital_affiliate&utm_campaign=1197078&aid=7010a000001xAKZAA2 了解更多详情。

相关文章
|
15天前
|
运维 Java Go
Go语言基础及其在容器化应用中的优势
【2月更文挑战第23天】本文首先介绍了Go语言的基本特性和优势,然后详细阐述了Go语言在容器化应用中的重要作用和独特优势。通过深入分析Go语言的语法简洁性、并发处理能力和内存管理特性,以及Docker容器技术的轻量级、可移植性和版本控制特点,本文旨在说明Go语言与Docker容器技术的结合能够显著提升应用的开发效率和部署灵活性,为现代软件开发和运维带来革命性的变革。
|
1月前
|
消息中间件 监控 NoSQL
容器化应用系统上生产的最佳实践
容器化应用系统上生产的最佳实践
|
4天前
|
存储 安全 算法
【C++ 17 包裹类 泛型容器 std::any】深入理解与应用C++ std::any:从泛型编程到多态设计
【C++ 17 包裹类 泛型容器 std::any】深入理解与应用C++ std::any:从泛型编程到多态设计
38 1
|
8天前
|
边缘计算 Kubernetes 负载均衡
容器编排技术在云计算中的应用
随着云计算技术的飞速发展,容器编排技术作为一种重要的部署和管理工具,正在逐渐成为云计算领域的热门话题。本文将介绍容器编排技术在云计算中的应用,探讨其在提高应用程序部署效率、资源利用率以及系统可靠性方面的优势,并分析其未来发展趋势。
|
15天前
|
Kubernetes Go 开发者
Go语言与Docker容器结合的实践应用与案例分析
【2月更文挑战第23天】本文通过分析实际案例,探讨了Go语言与Docker容器技术结合的实践应用。通过详细阐述Go语言在容器化环境中的开发优势,以及Docker容器技术在Go应用部署中的重要作用,本文旨在为读者提供Go语言与Docker容器结合的具体实现方法和实际应用场景。
|
17天前
|
存储 Kubernetes 云计算
云计算基础与实战:从虚拟机到容器化应用
云计算基础与实战:从虚拟机到容器化应用
19 0
|
1月前
|
NoSQL Redis Docker
深入浅出:使用Docker容器化改进Python应用部署
在快速演进的软件开发领域,持续集成和持续部署(CI/CD)已成为加速产品上市的关键。本文将探索如何利用Docker,一种流行的容器化技术,来容器化Python应用,实现高效、可靠的部署流程。我们将从Docker的基本概念入手,详细讨论如何创建轻量级、可移植的Python应用容器,并展示如何通过Docker Compose管理多容器应用。此外,文章还将介绍使用Docker的最佳实践,帮助开发者避免常见陷阱,优化部署策略。无论是初学者还是有经验的开发人员,本文都将提供有价值的见解,助力读者在自己的项目中实现容器化部署的转型。
|
1月前
|
运维 Java 开发者
深入浅出:使用Docker容器化改善Java应用的部署与运维
在当今快速迭代的软件开发周期中,确保应用的一致性、可移植性与易于管理成为了开发与运维团队面临的重大挑战。本文旨在介绍如何通过Docker容器技术,有效地解决这些问题,特别是针对Java应用。我们将从Docker的基本概念出发,逐步深入到实际操作,展示如何将传统的Java应用容器化,以及这一过程如何帮助简化部署流程、提高应用的可靠性和可伸缩性。不同于常规的技术文章,本文试图以一种更加易于理解和实践的方式,让读者能够快速掌握容器化技术,并将其应用于日常的开发与运维工作中。
88 0
|
1月前
|
JavaScript NoSQL Redis
深入浅出:使用 Docker 容器化部署 Node.js 应用
在当今快速发展的软件开发领域,Docker 作为一种开源的容器化技术,已经成为了提高应用部署效率、实现环境一致性和便于维护的关键工具。本文将通过一个简单的 Node.js 应用示例,引导读者从零开始学习如何使用 Docker 容器化技术来部署应用。我们不仅会介绍 Docker 的基本概念和操作,还会探讨如何构建高效的 Docker 镜像,并通过 Docker Compose 管理多容器应用。此外,文章还将涉及到一些最佳实践,帮助读者更好地理解和应用 Docker 在日常开发和部署中的强大功能。
30 0
|
1月前
|
运维 Java Linux
深入解析:使用Docker容器化技术提升Java应用的部署效率
在快速迭代的软件开发周期中,如何保证应用的快速、一致和可靠部署成为了开发团队需要面对的重大挑战。本文将探讨如何利用Docker容器化技术,结合Java应用,实现高效、一致的部署流程。我们将从Docker的基本概念出发,详细介绍将Java应用容器化的步骤,包括创建Dockerfile、构建镜像以及运行容器等关键环节,并通过示例代码加以说明。此外,本文还将讨论在使用Docker部署Java应用时可能遇到的常见问题及其解决策略,旨在为读者提供一种提升部署效率、优化开发流程的有效方法。
295 2

相关产品

  • 容器镜像服务
  • 容器服务Kubernetes版