在多技术栈开发环境中,不同系统可能使用不同的监控和日志工具,导致数据分散、分析困难。本文以 Prometheus 和 ELK Stack 为例,展示如何构建一个统一的监控与日志平台,实现混合技术栈下的系统可观测性。文章包含一个可运行的示例 Demo,并通过图解说明系统架构,帮助开发者快速上手。
在现代分布式系统中,应用往往由多种技术栈构建(如 Java、Node.js、Python),并部署在不同的环境中。这种多样性虽然带来了灵活性,但也引发了监控和日志的管理难题。分散的数据和工具阻碍了故障排查和性能优化的效率。构建一个统一的监控与日志平台,是解决这一问题的有效途径。
在 Java 项目中添加 Prometheus Client,以下是关于文章中代码模块的详细展开和讲解:
Java 示例代码详解:
import io.prometheus.client.Counter;
import io.prometheus.client.exporter.HTTPServer;
public class MonitoringExample {
// 定义 Counter 指标
static final Counter requestCounter = Counter.build()
.name("requests_total") // 指标名称
.help("Total number of requests") // 指标描述
.register();
public static void main(String[] args) throws Exception {
// 启动 HTTPServer 用于暴露指标
HTTPServer server = new HTTPServer(1234);
while (true) {
requestCounter.inc(); // 模拟请求计数器增加
Thread.sleep(1000); // 模拟 1 秒的请求间隔
}
}
}
详解:
build()
: 定义指标对象。name()
和 help()
: 定义指标名称和描述。register()
: 注册指标到全局注册表,供 Prometheus 采集。http://localhost:1234/metrics
。requestCounter.inc()
模拟请求到来时计数器递增。运行效果:
访问 http://localhost:1234/metrics
,可以看到类似以下输出:
# HELP requests_total Total number of requests
# TYPE requests_total counter
requests_total 15.0
这表示目前系统的总请求数为 15。
Node.js 示例代码详解:
const winston = require('winston');
require('winston-logstash');
// 配置日志传输到 Logstash
const logger = winston.createLogger({
transports: [
new winston.transports.Logstash({
port: 5000, // Logstash 监听的端口
host: 'localhost', // Logstash 主机地址
node_name: 'node-app', // 节点名称,用于区分日志来源
})
]
});
// 发送日志信息
logger.info('Application started');
logger.warn('This is a warning');
logger.error('This is an error');
详解:
createLogger()
用于创建日志记录器实例。transports
: 定义日志的传输目标。在此处配置了 Logstash
传输方式。winston-logstash
用于将日志发送到 Logstash。port
和 host
用于连接到 Logstash。info
, warn
, error
表示不同的重要性级别。运行效果:
启动服务后,Logstash 会接收到如下日志:
{"@timestamp":"2024-01-01T12:00:00.000Z","message":"Application started","level":"info"}
{"@timestamp":"2024-01-01T12:01:00.000Z","message":"This is a warning","level":"warn"}
{"@timestamp":"2024-01-01T12:02:00.000Z","message":"This is an error","level":"error"}
为了支持以上服务的日志收集,需要配置 Logstash 管道。
Logstash 配置文件:
input {
tcp {
port => 5000
codec => json
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "logs-%{+YYYY.MM.dd}"
}
}
详解:
tcp
: 监听来自 Node.js 的日志,端口与 winston-logstash
配置一致。codec => json
: 指定日志格式为 JSON。elasticsearch
: 将日志写入 Elasticsearch。index
: 日志存储的索引名称,按日期区分。http://localhost:9090
)。requests_total
指标的趋势。通过 Java 和 Node.js 的示例代码,我们实现了 Prometheus 指标采集和 Logstash 日志收集,并集成到了 ELK Stack 和 Grafana 平台。这种统一的监控与日志平台,为多技术栈环境提供了高效的可观测性解决方案。
Q:如何将 Prometheus 和 Grafana 集成?
A:在 Grafana 中添加数据源为 Prometheus,配置对应的 Prometheus 端点。
Q:如何处理日志格式不一致的问题?
A:通过 Logstash 使用过滤插件(如 Grok)对日志进行格式化。
通过构建统一的监控与日志平台,可以显著提升系统的可观测性和问题定位效率。本文展示了基于 Prometheus 和 ELK Stack 的实现方法,为开发者在混合技术栈环境中的监控与日志管理提供了实践指导。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。