面试官:如何搭建Prometheus和Grafana对业务指标进行监控?

news/2024/5/19 0:57:32 标签: prometheus, grafana, java

Prometheus和Grafana都是非常流行的开源监控工具,可以协同使用来实现对各种应用程序、系统、网络和服务器等的监视和分析。

下面对Prometheus和Grafana进行简要介绍:

  1. Prometheus

Prometheus是一款开源、云原生的系统和服务监控工具,它采用pull模式的监控方式,可以通过HTTP协议从各种Target中抓取metrics数据,并存储到本地的时间序列数据库中。Prometheus提供了强大的查询语言(PromQL)来支持数据查询、聚合和图表绘制等操作。同时,它还提供了Alertmanager组件来支持告警和通知功能,可以通过配置规则实现各种复杂的告警条件和触发方式。

  1. Grafana

Grafana是一款开源的监控可视化和数据分析软件,它支持将来自多个数据源的时间序列数据转换为丰富的图表和仪表板,以实时监控和分析各种指标和性能指标。Grafana 的用户可以轻松创建和编辑仪表板、将不同数据源的指标数据组合到一起显示、应用多种过滤器和渲染选项来定制化仪表板的显示方式以及定义警报功能等,从而实现根据需要快速了解应用程序的状态和性能指标以及进行数据分析。

通过将Prometheus和Grafana结合使用,您可以有效地监控和管理各种应用程序和系统的状态和性能指标,从而更好地掌握系统的运行状况并快速发现故障。

本人使用mac电脑安装Prometheus和Grafana,下载可自行根据自己的环境进行,思路才是最重要的。

安装Prometheus:

// 安装
brew install prometheus

// 启动
brew services start prometheus
复制代码

默认端口为9090:

重点:

有了Prometheus后,我们要思考一个问题就是,数据从哪里来?

要了解数据是程序push过来的,还是Prometheus去拉取的,很关键。

package com.example.demo.monitor;

/**
 * @author caozhixin
 * @date 2023/4/8 13:10
 */
import io.prometheus.client.Counter;
import io.prometheus.client.Gauge;
import io.prometheus.client.exporter.HTTPServer;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class BankAccountSystem {

    // 存储每个银行账户的当前余额
    private static final Map<String, Double> accountBalances = new HashMap<>();

    // 创建一个Counter指标来表示已经从每个账户取款的次数
    private static final Counter withdrawals = Counter.build()
            .name("bank_account_withdrawals_total")
            .help("Total number of account withdrawals.")
            .labelNames("account_number") // 为了方便查询,使用名为"account_number"的标签分别标识每个账户的指标
            .register();

    // 创建一个Gauge指标来表示每个账户的当前余额
    private static final Gauge accountBalance = Gauge.build()
            .name("bank_account_balance")
            .help("Current balance for each account.")
            .labelNames("account_number") // 同样使用名为"account_number"的标签来标识每个账户的指标
            .register();

    public static void main(String[] args) throws IOException {
        // Start the HTTP server and expose metrics endpoint.
        // 启动一个HTTP服务器,并暴露/metrics端点以便Prometheus从中获取指标数据
        HTTPServer server = new HTTPServer(8080);

        Random random = new Random();
        // 初始化10个不同的银行账户,并对每个账户进行一次初始余额的设置
        for (int i = 1; i <= 10; i++) {
            String accountNumber = "ACCT" + i;
            double initialBalance = random.nextDouble() * 100000;
            accountBalances.put(accountNumber, initialBalance);
            // 使用set方法将每个账户的初始余额设置为Gauge指标的值,同时使用"labelValues"参数传递与之对应的"account_number"标签值
            accountBalance.labels(accountNumber).set(initialBalance);
        }

        // 模拟一些账户活动
        while (true) {
            try {
                Thread.sleep(5000); // 等待5秒钟
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            // 对于每个银行账户,随机从中扣除一些资金,并更新相应的指标数据
            for (Map.Entry<String, Double> entry : accountBalances.entrySet()) {
                String accountNumber = entry.getKey();
                double currentBalance = entry.getValue();
                double withdrawAmount = random.nextDouble() * 100;
                if (withdrawAmount > currentBalance) {
                    withdrawAmount = currentBalance; // 不能透支,如果取款金额超过了当前余额,那么就只能全部取出
                }
                currentBalance -= withdrawAmount;
                accountBalances.put(accountNumber, currentBalance);
                withdrawals.labels(accountNumber).inc(); // 增加该账户的Counter指标值(表示已经从这个账户中取过款)
                accountBalance.labels(accountNumber).set(currentBalance); // 更新该账户的Gauge指标值(表示当前余额)
            }
        }
    }
}
复制代码

在此示例中,我们模拟了一个银行账户管理系统,有10个不同的账户,并使用Map<String, Double>来存储每个账户的当前余额。我们还创建了两个指标:一个Counter bank_account_withdrawals_total表示已经从每个账户取款的次数,带有一个名为account_number的标签;一个Gauge bank_account_balance 表示每个账户的当前余额,也带有一个account_number标签。

在无限循环中,我们模拟了一些账户活动,随机从每个账户中扣除一些资金,并更新相应的指标数据。这样,我们就可以通过Prometheus监视银行账户活动并生成警报。

我们可以从Java程序启动的8080看到对应的Prometheus格式数据:

下一步就是我们怎样让Prometheus进程把这些数据抓取过去,这一步很简单,就是在prometheus.yml配置的(安装后的文件路径自己找)。

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "prometheus"
    static_configs:
    - targets: ["localhost:9090"]

  - job_name: 'java_app'
    metrics_path: '/my_metrics'
    static_configs:
    - targets: ['localhost:8080']

复制代码

把这个java程序的Prometheus客户端端口配置上去即可。

这时候我们就可以到Prometheus的面板去看下是否有数据。

到目前为止,我们已经完成了Prometheus把Java产生的业务数据导入啦。

接下来就是处理Grafana获取Prometheus数据。

// 安装
brew install grafana

// 启动
brew services start grafana
复制代码

Grafana默认端口为3000

这个时候,我们的思路就是怎样去获取Prometheus数据。

Grafana在页面上提供了配置数据源的交互。

支持的数据源很多,按需配置。

这里我们直接把url配置上即可,生产环境的话,需要考虑的更多,比如安全性之类的,配置密钥证书。

数据源配置完了,就剩下面板啦。

选择你想处理的指标和统计口径

也可以直接使用PromQL语句:

round(sum by(account_number) (increase(bank_account_balance{job="java_app"}[$__rate_interval])))
复制代码

到目前为止,一个业务数据的监控就完成啦。大家可以照猫画虎走一个流程!!


http://www.niftyadmin.cn/n/205078.html

相关文章

PM和PMO必备即兴发言和汇报9大万能公式,不同场景轻松应对

很多项目经理和PMO&#xff0c;办事认真&#xff0c;做事踏实&#xff0c;从来不去争名夺利&#xff0c;反而是不少背锅&#xff0c;经常被大家成为“背锅侠”。但是&#xff0c;往往很多最苦最累的活是自己干的&#xff0c;最大的压力是自己扛的&#xff0c;但是大家不知道&am…

4年经验来面试20K的测试岗,连基础都不会,还不如招应届生

公司前段缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在10-20k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。看简历很多都是4年工作经验&#xff0c;但面试…

13 Link(链接)

静态链接的过程 静态链接&#xff08;Static Linking&#xff09;是编译程序时链接库的一种方法。在静态链接过程中&#xff0c;程序所需的库文件会被嵌入到最终的可执行文件中。这样&#xff0c;程序在运行时不需要动态加载外部库文件。静态链接的过程主要包括以下步骤&#…

Oracle id或者序列重置从一开始

因为之前创建的触发器已经从一开始&#xff0c;但是有部分删除掉了&#xff0c;现在想重置重新从一开始 ORACLE 自动生成 ID 和 SQL SERVER 不一样&#xff0c;是通过 SEQUENCE 来处理&#xff0c;这个时候你重新生成 SEQUENCE&#xff0c;也就 ID 重新生成了。 如果你只是需要…

用js实现html页面水印

要在 HTML 页面中添加水印并防止截图&#xff0c;可以使用 JavaScript。以下是实现的基本步骤&#xff1a; 1、在 HTML 中添加一个 div 元素作为水印容器&#xff0c;并设置其样式。 2、使用 JavaScript 动态生成水印内容&#xff0c;并将其添加到水印容器中。 3、通过 CSS …

Java高频面试:Spring Bean的生命周期分为几个阶段

Spring Bean的生命周期是从Bean 实例化之后&#xff0c;即通过反射创建出对象之后&#xff0c;到Bean成为一个完整对象&#xff0c;最终存储到单例池中&#xff0c;这个过程被称为Spring Bean的生命周期。Spring Bean的生命周期大体上分为三个阶段&#xff1a; Bean的实例化阶…

【bzoj 4202】石子游戏(博弈论+LCT)

题目 石子游戏是大家都很喜欢玩的一类游戏&#xff0c;这类游戏通常与石子的移动和取舍有关&#xff0c;往往可以让人在游戏中获得不少的乐趣。 有一类树上石子游戏的规则是这样的&#xff1a;在一棵有根树上&#xff0c;每个节点都有着一定数目的石子&#xff0c;两个玩家轮…

File 类的用法和 InputStream, OutputStream,System 类的用法

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…