想和你在玫瑰花瓣上安家 过着风的生活 最后一起老去在四季里
应用假设使用 springboot + k8s技术栈
EFK + Prometheus + SkyWalking 监控三套件管上,这三个分别是日志、metrics和调用链监控的利器
日志主要用来排查程序行级问题
Metrics的主要作用是帮助开发人员了解系统或应用程序的性能和运行情况,以便快速定位和解决问题
调用链主要用来排查程序性能问题, 比如在哪个环节比较慢, 我们可以直观看出在哪个流程出现了问题
EFK主要用于分布式应用程序的日志管理和分析,Prometheus主要用于采集和存储系统或应用程序的指标数据,SkyWalking主要用于监测和追踪分布式应用程序的请求链路。因此,在实际应用中,可以根据具体的应用场景和需求来选择合适的监测系统或组合使用多种监测系统,以便全面监测和优化系统或应用程序的性能
EFK是Elasticsearch、Fluentd和Kibana的缩写,它们分别是日志存储、日志采集和日志可视化工具。EFK可以帮助开发人员集中管理和分析分布式应用程序的日志数据,快速发现和解决问题
在Linux服务器上,可以使用如下命令安装Fluentd:
$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent4.sh | sh
在Fluentd的配置文件中,需要定义输入(input)和输出(output)插件。
在输入插件中,需要指定Spring Boot应用程序的日志文件路径。在输出插件中,需要指定数据的传输方式和目的地,例如传输到Elasticsearch或Kafka等。
以下是一个基本的Fluentd配置文件示例:
<source>
@type tail
path /var/log/springboot-app.log
pos_file /var/log/springboot-app.log.pos
tag springboot.app
<parse>
@type none
</parse>
</source>
<match springboot.app>
@type elasticsearch
host localhost
port 9200
index_name fluentd
type_name springboot
logstash_format true
flush_interval 1s
</match>
在上述配置文件中,我们定义了一个tail输入插件,指定了Spring Boot应用程序的日志文件路径和输出的tag。在match输出插件中,我们指定了数据输出的目的地,即Elasticsearch,并指定了索引名称和类型名称等参数。
在Spring Boot应用程序中,可以使用logback作为日志框架,并使用logstash-logback-encoder插件将日志格式转换为logstash格式,以便更好地与Fluentd集成。
以下是一个基本的logback配置文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n</pattern>
</encoder>
</appender>
<appender name="STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>localhost:24224</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="STASH" />
</root>
</configuration>
在上述配置文件中,我们定义了一个名为STASH的LogstashTcpSocketAppender,指定了Fluentd的主机和端口号,并指定了LogstashEncoder格式化器。
通过以上配置,Spring Boot应用程序的日志就可以被Fluentd收集并输出到Elasticsearch或其他指定的目的地中。
需要注意的是,在使用Fluentd收集日志时,需要注意日志的格式和内容,以便更好地进行处理和分析。
Prometheus是一种开源的时间序列数据库和监测系统,主要用于采集和存储系统或应用程序的指标数据,如请求响应时间、QPS、内存使用率等。Prometheus提供了灵活的查询和可视化功能,帮助开发人员快速定位和解决系统或应用程序的性能问题
Metrics是系统或应用程序中用于描述性能、运行状态或其他关键指标的数据,是监测和分析系统或应用程序性能的核心数据类型。Metrics通常由多个维度(Dimensions)和指标(Measurements)组成。
维度表示Metrics数据的分类属性,例如系统或应用程序的实例、环境、版本等。指标表示Metrics数据的数值属性,例如请求响应时间、QPS、内存使用率等。
Metrics的主要作用是帮助开发人员了解系统或应用程序的性能和运行情况,以便快速定位和解决问题。通过采集和分析Metrics,可以实现以下几个方面的功能:
性能监测:监测系统或应用程序的性能指标,如响应时间、QPS、错误率等,以便快速发现性能瓶颈和优化点。
故障诊断:监测系统或应用程序的运行状态,如系统负载、服务可用性等,以便快速发现故障和解决问题。
容量规划:通过分析系统或应用程序的Metrics趋势,预测未来的容量需求,以便为系统或应用程序的扩容做好准备。
服务级别协议(SLA)监测:通过监测服务的Metrics指标,判断服务是否符合SLA要求,以便提高服务质量和用户体验。
Metrics可以通过多种工具进行采集、存储、查询和可视化,如Prometheus、Grafana、InfluxDB等,这些工具都提供了灵活的配置和可视化功能,可以满足各种应用场景的需求。
Metrics是通过在系统或应用程序中埋点(Instrumentation)来产生的。埋点是指在系统或应用程序中插入代码,用于收集和传递Metrics数据。
在Java应用程序中,可以使用各种Metrics库或框架来实现Metrics的埋点。这些库或框架通常会提供各种类型的Metrics,如计数器、直方图、分布式跟踪等,可以通过注解、API调用等方式来采集和传递Metrics数据。
例如,在Spring Boot应用程序中,可以使用Spring Boot Actuator库来采集和暴露应用程序的Metrics。Actuator库提供了多种Metrics指标,如内存使用量、CPU使用率、HTTP请求量、响应时间等,可以通过HTTP请求的方式来获取这些指标数据。
在分布式系统中,Metrics通常是通过代理或侧车(sidecar)来收集和传递。例如,Istio中的Envoy代理可以收集应用程序的Metrics,通过Prometheus等监测系统进行存储和分析。
总之,Metrics是通过在系统或应用程序中埋点来产生的,开发人员可以使用各种Metrics库或框架来实现Metrics的采集和传递,以便对系统或应用程序的性能和运行情况进行监测和分析。
Metrics不仅可以用于统计系统资源使用情况,还可以用于统计应用程序的性能、业务数据或其他关键指标。Metrics的数据来源可以包括系统资源、应用程序的函数、方法或接口调用等。
例如,Metrics可以用于统计以下指标:
系统资源使用情况,如CPU使用率、内存使用率、磁盘使用率等。
应用程序的性能指标,如请求响应时间、吞吐量、错误率等。
业务数据,如订单量、支付成功率、用户注册量等。
其他关键指标,如服务器的负载、网络延迟、服务可用性等。
Metrics的主要作用是帮助开发人员了解系统或应用程序的性能和运行情况,以便快速定位和解决问题。通过对Metrics的分析,可以优化系统或应用程序的性能,提高系统的可用性和用户体验。
因此,Metrics不仅仅用于统计系统资源使用情况,它可以用于统计多种指标,帮助开发人员了解系统或应用程序的性能和运行情况。
SkyWalking是一种开源的分布式应用程序跟踪和性能监测系统,主要用于监测和追踪分布式应用程序的请求链路,提供更全面的性能指标和分析。SkyWalking提供多种分析功能,如错误分析、性能瓶颈分析等,可以帮助开发人员深入了解应用程序的性能问题
请先阅读 芋道 SkyWalking 9.X 极简入门(新版本) | 芋道源码 —— 纯源码解析博客
再读 芋道 Spring Boot 链路追踪 SkyWalking 入门 | 芋道源码 —— 纯源码解析博客 (iocoder.cn)
这个博主写的可太好, 有好多示例
搭建一个 mysql 工程
@RestController
@RequestMapping("/demo")
public class DemoController {
@Autowired
private JdbcTemplate template;
@GetMapping("/mysql")
public String mysql() {
this.selectById(1);
return "mysql";
}
public Object selectById(Integer id) {
return template.queryForObject("SELECT id, username, password FROM t_user WHERE id = ?",
new BeanPropertyRowMapper<>(Object.class), // 结果转换成对应的对象。Object 理论来说是 UserDO.class ,这里偷懒了。
id);
}
}
1、首先,使用浏览器,访问下 http://127.0.0.1:8079/demo/mysql 地址,请求下 Spring Boot 应用提供的 API。因为,我们要追踪下该链路。
2、然后,继续使用浏览器,打开 http://127.0.0.1:8080/ 地址,进入 SkyWalking UI 界面。如下图所示:
接着,点击「Database Dashboard」选项,再点击「Database」选项,可以以数据库为维度的监控数据。如下图所示:
之后,点击「拓扑图」菜单,进入查看拓扑图的界面,可以看到 MySQL 小方块。如下图所示:
再之后,点击「追踪」菜单,进入查看链路数据的界面。如下图所示:
点击红圈的 MySQL 操作的链路数据,可以看到数据的 SQL 语句。如下图所示:
这里,我们暂时无法看到 SQL 的数据参数,可以通过修改 config/agent.config
配置文件,将 plugin.mysql.trace_sql_parameters
配置项,设置为 true
。例如:
# mysql plugin configuration
plugin.mysql.trace_sql_parameters=${SW_MYSQL_TRACE_SQL_PARAMETERS:true}
当然,也可以通过 SW_MYSQL_TRACE_SQL_PARAMETERS
环境变量。
ELK、EFK、Prometheus、SkyWalking、K8s的排列组合-伙伴云 (huoban.com)
prometheus与skywalking在私有化交付项目中的应用_skywalking和prometheus的区别_二次元云南山歌爱好者的博客-CSDN博客
芋道 Spring Boot 链路追踪 SkyWalking 入门 | 芋道源码 —— 纯源码解析博客 (iocoder.cn)
芋道 SkyWalking 9.X 极简入门(新版本) | 芋道源码 —— 纯源码解析博客