在微服务或者集群架构中,一次请求的调用会跨多个服务(web,mysql,feign等)、多个模块(用户模块,商品模块等)、多个容器(用户模块可能有多个实例),这个时候去定位问题,通过传统的登陆服务节点逐一查看日志的方式,就会效率很低。分布式调用链就是为了解决以上几个问题而生,和jdbc接口规范一样,OpenTracing 是分布式调用链的一个轻量级的标准化层,提供统一规范。
1. prometheus
1.1什么是prometheus
Prometheus是一个开源的系统监控和报警系统,基于谷歌的borgemon使用go语言开发,使用TSDB数据库,所以支持云原生,现在已经加入到CNCF基金会,成为继k8s之后第二个在CNCF托管的项目,在kubernetes容器管理系统中,通常会搭配prometheus进行监控,同时也支持多种exporter采集数据,还支持pushgateway进行数据上报,Prometheus性能足够支撑上万台规模的集群。
1.2prometheus特点
- 灵活的查询语言(PromQL):可以对采集的metrics指标进行加法,乘法,连接等操作;
- 内置时间序列(pime series)数据库:Prometheus;外置的远端存储通常会用:InfluxDB、openTsDB等
- 基于HTTP的pull(拉取)方式采集时间序列数据
- 支持作为数据源接入Grafana
- 做高可用,可以对数据做异地备份,联邦集群,部署多套prometheus,pushgateway上报数据
1.3prometheus适用场景
1.Prometheus是一款指际监控系统,不适合存储事件及日志等;它更多地展示的是趋势性的监控,而非精准数据;
2. Prometheus认为只有最近的监控数据才有查询的需要,其本地存储的设计初衷只是保存短期(例如一个月)数据,因而不支持针对大量的历史数据进行存储;若需要存储长期的历史数据,建议基于远端存储机制将数据保存于InfluxDB或openTsDB等系统中;
3. Prometheus的集群机制成熟度不高,可基于Thanos(和灭霸是一个单词)实现Prometheus集群的高可用及联邦集群
2. ELK
2.1什么是elk
ELK是Elasticsearch(ES) , Logstash, Kibana的结合,是一个主流的开源日志收集的解决方案,其中:
Elasticsearch(ES):开源分布式搜索引擎,提供搜集、分析、存储数据功能。用户将数据提交到 Elasticsearch 数据库中。通过分词控制器对对应的语句进行分词。将分词结果和权重(原始数据和分词内容的匹配度)一起存储,当用户搜索数据时,根据权重对搜索结果进行排名和打分(分数越高,匹配度就越高),最终将结果呈现给用户
Logstash:日志搜集、分析、过滤,支持大量数据获取。其自带输入(input)、过滤语法(grok)、输出(output)三部分。其输入有两种方式:①由各beat采集器输入,经过滤后输出到ES ②本机数据输入,经过滤后输出到ES。
Kibana:提供日志分析友好的 Web 界面。数据存储到ES中后,可以在Kibana页面上增删改查,交互数据,并生成各种维度表格、图形。
ES详细介绍
Kibana详细介绍
Logstash介绍
2.2elk适用场景
适合按照索引数据进行数据分析和聚合,查看明细数据,定位具体的错误日志和信息
3. skywalking
3.1如何自动采集日志
SkyWalking 采用了插件化(skywalking-plugin.def 文件,针对不同调用开发不同的plugin去做增强)+javaagent(Skywalking Agent) 的形式来实现了 Span 数据的自动采集。
这样可以做到对代码的无侵入性,插件化意味着可插拔,扩展性好(后文会介绍如何定义自己的插件)。
3.2分布式唯一id如何传递的
如果只是在网关中传递,我们知道使用ThreadLocale就可以实现,但是存在tomcat基于netty导致nio线程复用的问题,所以skywalking在跨进程调用之前,当前进程会通过 inject()方法将当前 Context 的全部内容注入到指定的 ContextCarrier,然后才能将当前 Context 的信息发送出去。当跨进程调用的接收方接收请求后,会通过 extract()方法将收到的 Context 从 ContextCarrier 中提取出来
参考DUBBO的plugin实现:
指定切面,切点,要对哪个类的哪个方法进行增强
intercepter具体处理逻辑
3.3TraceId 如何保证全局唯一
SkyWalking 采用的是Snowflow 算法,为了防止时间回拨的问题,判断当前时间小于上次记录的最小时间,就进行随机数处理。具体分布式唯一id算法可以参考本篇文章
3.4skywalking集成和使用
集成springboot和使用经验
按需使用,一般是使用skywalking agent进行log日志上报和追加traceId,日志分析查看还是Kibana,监控也单独搭建和配置,不用默认ui,支持性较少,指标不完善