Quickwit+Jaeger+Prometheus+Grafana搭建Java日志管理平台

介绍

生产服务应用可观测性在当下比较流行的方案,其中出现了大量高性能、开箱即用、易上手的的开源产品,大大丰富了在可观测性领域产品的多样性,本文讲述基于OTLP协议推送Java项目遥测数据(日志、指标、链路)到后端存储服务,整体架构如下:
Opentelemetry:基于Javaagent代理使用探针技术抓取日志、指标、链路等遥测数据,通过OTLP协议推送到后端存储;
Quickwit:日志与链路数据存储后端,提供数据索引器和搜索器核心功能;
Jaeger:基于Quickwit链路索引数据,提供查询Trace服务数据跟踪层级视图;
Prometheus:服务运行指标与系统指标数据采集存储服务;
Grafana:提供强大的可视化图表,并支持众多服务插件与数据源访问,可集成日志查询、Trace跟踪层级、指标数据展示等;

OpenTelemetry

OpenTelemetry就是一种为应用程序代码进行插桩的机制,是一个可观测性框架和工具包, 旨在创建和管理遥测数据,它的目的是帮助使系统变得可观测,如链路、 指标和日志。 重要的是,OpenTelemetry 是供应商和工具无关的,这意味着它可以与各种可观测性后端一起使用, 括 Jaeger 和 Prometheus 这类开源工具以及商业化产品。
OpenTelemetry 不是像 Jaeger、Prometheus 或其他商业供应商那样的可观测性后端。 OpenTelemetry 专注于遥测数据的生成、采集、管理和导出。 OpenTelemetry 的一个主要目标是, 无论应用程序或系统采用何种编程语言、基础设施或运行时环境,你都可以轻松地将其仪表化。 重要的是,遥测数据的存储和可视化是有意留给其他工具处理的。
OpenTelemetry支持多种编程语言零代码插桩模式,在应用或服务的“边缘”捕获遥测数据;本文演示通过零代码插桩模式,通过opentelemetry-javaagent动态注入字节码以从Java库和Java框架中捕获遥测数据,并推送到日志、链路、指标数据存储平台;
opentelemetry使用详情参见官文文档: Java zero-code instrumentation | OpenTelemetry
opentelemetry-javaagent.jar包开源版本下载: https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases

采集Java日志、链路、指标

在Java项目的jvm启动参数中,添加otel代理配置和集成Javaagent代理程序包:-javaagent:D:\\test\\opentelemetry-javaagent.jar,通过探针技术抓取日志内容(logs)和跟踪链路跨度数据(traces + span),向指定endpoint端点发送采集数据包;(本示例中使用opentelemetry-javaagent - version: 2.13.3版本,如遇javaagent配置不生效或异常,可以使用该版本调试)
-javaagent:D:\\test\\opentelemetry-javaagent.jar
-Dotel.service.name=customer
-Dotel.logs.exporter=otlp
-Dotel.exporter.otlp.endpoint=http://192.168.1.3:7281
-Dotel.exporter.otlp.protocol="grpc"
-Dotel.traces.exporter=otlp
-Dotel.metrics.exporter=otlp
-Dotel.exporter.otlp.metrics.protocol="http/protobuf"
-Dotel.exporter.otlp.metrics.endpoint=http://192.168.1.3:9090/api/v1/otlp/v1/metrics
-Dotel.metric.export.interval=30000
-Dotel.exporter.otlp.insecure=true

otel.exporter.otlp.endpoint指向的endpoint数据摄取接收器Quickwit日志存储,Quickwit只支持otlp协议gRPC数据传输模式,将logs和traces采集数据通过导出器导出到Quickwit中存储;

otel.exporter.otlp.metrics.endpoint指向的endpoint遥测指标数据接收器Pormetheus存储,将metrics遥测指标样本数据通过导出器导出到Prometheus远程写入器中;
注意,如果将-Dotel.metrics.exporter=none,none则表示不启用Metrics指标数据导出器(通常是导出到Prometheus平台),一般项目中会启用Prometheus主动通过pull拉取模式,获取Java项目(如: SpringBoot)中开启的遥测数据端点,将采集样本数据写入到Prometheus中存储;但如果需要启用opentelemetry的代理模式,并通过otlp协议的metrics导出器导出遥测数据,并由Prometheus平台接收远程otlp数据,则将otel.metrics.exporter设置成otlp或pormetheus;
目前Pormetheus不支持otlp协议下grpc传输数据远程写入,只支持protobuf数据接收与解析,需要单独设置otlp下metrics的protocol传输协议为:"http/protobuf";
同时还需要在Prometheus平台开启远程写入otlp接收器,在prometheus启动参数中填加“ --web.enable-remote-write-receiver --web.enable-otlp-receiver”,启用后otlp接收器endpoint为: /api/v1/otlp/v1/metrics
完整Prometheus的启动命令,如下:
./prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/prometheus \ 
--web.enable-remote-write-receiver \
--web.enable-otlp-receiver

关于Prometheus平台远程写入OTLP接收器说明,参见官文文档:HTTP API | Prometheus

Idea配置Javaagent代理

在处以已存在的springboot项目为例,该示例演示了一个完整跨服务请求链路:客户端》网关》生产者,详情请参见《 GitCode下载示例项目》;
在Idea》Run/Debug Configurations》Build and run》VM options,对CustomerCloudApplication、GatewayCloudApplication、ProducerCloudApplication三个SrpingBoot项目启动入口JVM参数上,填入前一章节:-javaagent + otel参数配置;
并在Idea中分别先后启动Springboot测试应用程序:CustomerCloudApplication、GatewayCloudApplication、ProducerCloudApplication;
启动过程中,注意观察控制台是否有异常日志信息或endpoint端点网络不通等信息,如有(注意:容易在otel.exporter.otlp.protocol配置上出错,目前quickwit只支持基于otlp协议下的grpc端点服务,其它端点模式目前暂不支持),请先解决网络通畅问题;
在浏览器中多次请求测试URL:http://localhost:8083/api/customer,在对应接口中输出日志和traceID数据,提取控制台中,最后条记录的traceId=e16613fb04ebd7cb139de1039dc575ee,在Quickwit中进行日志和跟踪链路查询(后续章节讲解安装与使用);

安装Quickwit

Quickwit原生支持opentelemetry协议(OTLP),默认Quickwit已开启gRPC端点服务,用来接收来自Opentelemetry收集转发的跨度数据信息;
Quickwit通过单独的端口“ 7281”来接收客户端的gRPC数据,Quickwit默认支持以下端口开放,参见官方文档: Ports configuration | Quickwit
需要注意的是,根据官方文档描述,目前无法独立更改配置这些端口,如遇端口冲突,请注意排查;
如果采用Docker安装的Quickwit服务,则记得添加7281端口配置来支持gRPC模式,或可参考已发布文章《 Docker安装Quickwit日志搜索引擎》;:
# 创建卷绑定目录
mkdir -p ~quickwit_data# 安装容器
docker run \-p 7280:7280 \-p 7281:7281 \--name quickwit \--rm  \-v ~/quickwit/data:/quickwit/qwdata \quickwit/quickwit:latest run

安装Quickwit后,默认已开启gRPC功能,会在Quickwit启动过程中,检查是否存在otel-logs-v0_7索引库(用于收集otlp协议推送的索引数据)和otel-traces-v0_7索引库(用于收集跟踪链路的跨度数据),如果不存在,则会自动创建此索引库。

如果不想启用默认创建内置otel-logs-v0_7索引库和otel-traces-v0_7索引库,则可通过以下任意一种方式关闭该功能;
  • 在启动Quickwit时将环境变量QW_ENABLE_OTLP_ENDPOINT设置成false
  • 在Quickwit服务的config.yaml配置文件中将enable_otlp_endpoint设置成false,如下:
# ... Indexer configuration ...
indexer:enable_otlp_endpoint: false

注意:不使用默认创建的otel-logs-v0_7索引库和otel-traces-v0_7索引库,自建日志和链路数据索引库,索引结构需要按照otlp协议输出标准的字段结构创建,并在otlp协议传输中指定数据推送索引;

浏览器访问Quickwit控制台:http://docker_ip:7080,在Quickwit》Query editor中,选择IndexId:otle-logs-v0_7索引日志库,查询框中输入:trace_id:e16613fb04ebd7cb139de1039dc575ee(java日志中打印的traceID),点击RUN查询此日志跟踪ID所检索匹配的日志记录;
查询出匹配此trace_id的三条日志,通过body字段中存储的采集日志内容,能识别分别来源于:CustomerCloudApplication、GatewayCloudApplication、ProducerCloudApplication程序;
整个请求流程为: 浏览器》客户端》网关代理》生产端,如下:
  • 在浏览器中向客户端程序发起http请求:http://localhost:8083/api/customer
  • 客户端程序CustomerCloudApplication控制器API接收到浏览器请求后,在此API方法中又请求到gateway网关程序(输出日志:http request customer ...)
  • gateway网关程序ProducerCloudApplication将收到的客户端请求,代理转发到生产端程序(输出日志:route customer to producer,route id: producer, http request url http://127.0.0.1:8081/api/producer)
  • 生产端程序ProducerCloudApplication控制器API接收到客户端请求后,并返回响应结果(输出日志:http request producer ...)
  • 生产端响应通过gateway网关返回到客户端中,客户端将响应结果再返回给浏览器,整个请求链路结束
选择IndexId:otle-traces-v0_7索引日志库,查询框中输入:trace_id:e16613fb04ebd7cb139de1039dc575ee(java日志中打印的traceID),点击RUM查询此日志跟踪ID所匹配的跟踪链路跨度数据,由于数据结构比较复杂并且上报跨度记录较多,Quickwit中没有可直观查看的可视化层级视图,只能查看原始跟踪链路跨度数据;
因此还需要借助第三方工具来展示完整的跟踪链路层级视图,目前Quickwit官方推荐搭配Jaeger,做为traces数据可视化平台;
以Quickwit做为后端存储工具,Jaeger做为搜索和跟踪链路数据的前端UI,集成方式请参见官方文档: Plug Quickwit to Jaeger | Quickwit;

安装Jaeger

通过docker命令快速安装Jaeger-query服务容器,或可参考已发布文章《 Docker安装Jaeger链路追踪》;
docker run --rm --name jaeger-qw \-e SPAN_STORAGE_TYPE=grpc \-e GRPC_STORAGE_SERVER=host.docker.internal:7281 \-p 16686:16686 \-p 4317:4317 \-p 4318:4318 \jaegertracing/jaeger-query:latest

注意:host.docker.internal指docker服务引擎本身的网络绑定地址,如果Jaeger和Quickwit安装在不同的服务或docker环境下,请更改为Quickwit服务IP地址;

其中16686为UI访问与服务http restapi请求端口,4317为otlp协议gRPC数据传输端口,4318为otlp协议http数据传输端口;
待Jaeger-query容器服务安装启动后,在浏览器中访问:http://jaeger_ip:16686,在Jaeger UI中查看traces跟踪链路数据层级视图效果,如下:

Grafana集成Jaeger

也可以通过在Grafana上安装Jaeger数据源插件,将跟踪链路查询功能集成到Grafana中,再同Grafana集成的Quickwit日志搜索功能,一起来搭配使用,共建一个日志和链路管理平台;
Grafana集成Jaeger方式比较简单,在Connections》Add new connection中搜索jaeger,点击数据源,进入安装页安装,安装后直接配置jaeger》Connection》url:http://jaeger_ip:16686,保存无错误提示即可;
安装Jaeger数据插件后,在Explore页面中,选择jaeger数据源,直接输入TraceID即可查询匹配该跟踪ID的所有链路数据,并以调用链路层级结构视图进行详细展示;

Grafana集成Quickwit

通过Grafana集成Quickwit日志搜索引擎服务,来管理日志存储与日志检索,在Grafana中安装Quickwit数据插件也是非常的简单,在Connections》Add new connection》搜索quickwit,点击quickwit数据源,进入安装页面安装,安装后进行集成配置,在quickwit-quickwit-datasource》HTTP》URL中输入:http://quickwit_ip:7280/api/v1,此quickwit_ip为目标quickwit服务所在的IP地址;
在Index settings中指定需要配置查询的IndexID:otel-logs-v0_7 索引库,otel-logs-v0_7是quickwit日志引擎服务默认开启的gRPC服务日志数据上传索引库,也可自行根据otel-logs-v0_7索引结构创建自定义的项目日志索引库,此处IndexID按需要修改即行;
在Editor settings》Default logs limit中将默认返回100条日志数量,修改为200条;
点击Data links》+Add 的按钮,添加日志数据结构中指定字段的超链接,设置该字段链接到Grafana已集成的jaeger数据源中,设置如下:
Field:trace_id
Query:${__value.raw}
Internal link:jaeger (数据源)
配置完毕,点击Save & test按钮,保存无错误提示即完成;
在Grafana》Explore界面中,选择quickwit数据源,搜索任意时间段有效上传索引库日志,在返回列表中,点击指定日志行,展开显示详细字段与数据,在最后的trace_id字段值(此trace_id即为日志中打印的跟踪埋点ID)后边,有一个"jaeger"按钮,点击后跳转到jaeger页面,并根据此TraceID值查询所匹配的跟踪链路日志,通过链路调用层级视图,清晰的展示该跟踪ID所执行的跨度指标数据;

安装Prometheus

以Prometheus做为项目的遥测指标数据摄取和存储服务,通过OTLP传输协议远程写入,因此还需要安装Prometheus服务,使用Docker命令安装,或参考已发布文章《 Docker安装Prometheus监控平台》;
# 创建卷绑定目录
mkdir -p ~/prometheus_data# 目录授权
chomd 777 prometheus_data# 创建容器
docker run --name prometheus \-c 2 -m 1g --memory-swap=1536m \-p 9090:9090 \-v ~/prometheus_data:/prometheus \prom/prometheus:latest \--web.enable-remote-write-receiver \--web.enable-otlp-receiver

安装成功后,通过浏览器访问:http://docker_id:9090,进入主页面后即可查询摄取的指标数据;

Grafana集成Prometheus

在Connections>Add new Connection 页面搜索prometheus插件,点击右上角Add new data source安装数据源,
prometheus数据源安装如无其它鉴权要求,则配置非常简单,只需根据实际安装服务地址填入到Prometheus server URL配置,如下:
确认无误后,点击Save & test按钮,如无错误提示,则prometheus数据源安装成功;

Jaeger集成Prometheus

此jaeger集成Prometheus,是指在Grafana可视化平台 Home》Connections》Data source》jaeger 配置页面下,增加jaeger额外Trace to metrics链接查询,通过该配置支持在jaeger跨度层级视图中,跳转到prometheus数据源中通过promql语句查询指定条件metrics数据展示;
Data source: prometheus # 数据源名
Span start time shift: -2m #跨度起始时间,往前推2分钟
Span end time shift: 2m #跨度结速时间,往后推2分钟
Tags: service.instance.id=instance # 跨度数据标签名,格式:跨度字段名(来源Span Attributes)=指标查询名
Link Label:
cpu time:rate(jvm_cpu_time_seconds_total{$__tags}[1m]) * 60   #查询每分钟CPU使用率
memory bytes:sum by(id) (increase(jvm_memory_used_bytes{$__tags}[1m]))    #查询每分钟内存使用
thread count:increase(jvm_thread_count{$__tags}[1m])    #查询每分钟线程数
http request:sum by(http_route) (rate(http_server_request_duration_seconds_count{$__tags}[1m]) * 60)   #查询每分钟请求数
jaeger跟踪链路视图中跨度属性Span Attributes,每个跨度级别均包含该 Attributes相关字段属性;
在Jaeger跟踪链路视图中跨度中,点击每层的超链接图标,即可展示已配置的几个指标查询选项,选择任意项则可以通过预配的promql查询语句,获取该跨度时间范围段遥测指标数据;
如:选择 memory btyes 查询显示该跨度时间范围段Jvm使用内存的数据图表(promql查询采集到Java项目的jvm_memory_used_bytes指标)
参考:
Grafana,Loki,Tempo,Prometheus,Agent搭建日志链路监控平台_grafana tempo-CSDN博客
Docker安装Prometheus监控平台_docker上安装prometheus-CSDN博客
Grafana集成Quickwit插件-CSDN博客
Docker安装Jaeger链路追踪平台-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/33360.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity Timeline 扩展

这里认为大家已经会timeline的基本使用了,只介绍怎么自定义扩展。 第一步.自定义Track 首先要自定义一条轨道。剪辑是要在轨道里跑的,系统自带的轨道我们加不了自定义剪辑,得新建自己用的。这个很简单。 [TrackClipType(typeof(TransformTw…

文生图技术的演进、挑战与未来:一场重构人类创造力的革命

摘要 文生图(Text-to-Image Generation)技术作为生成式人工智能(Generative AI)的核心分支,正在以颠覆性力量重塑内容生产范式。本文系统梳理文生图技术从早期实验到多模态大模型的演进路径,分析其在设计、…

如何手动使用下载并且运行 QwQ-32B-GGUF

首先使用安装 pip install ModelScope 使用 ModelScope 下载对应的模型 modelScope download --model Qwen/QwQ-32B-GGUF qwq-32b-q4_k_m.gguf 第二步开始下载 ollama git clone https://githubfast.com/ggerganov/llama.cpp # githubfast.com 可以加速下载 切换到目录&am…

SPring 学习积累1 关于下载相关jdk maven 版本

3.15.1 注意下载的版本 有些是不适配的,官网有提示; 3.15.2 注意配置环境变量时需要注意admistartor 中的java路径和系统变量是否一致,一行要一致,不然后续安装maven之后,使用命令 mvn -version时会显示以下错误&…

Excel(函数篇):Vlookup函数 详细用法

目录 Vlookup函数基础用法精确查找易错问题员工信息查询表 进阶用法近似匹配(模糊查找)结合通配符查找反向查找 高级技巧多条件查找动态列查询 错误处理屏蔽错误值处理数字/文本格式问题注意事项常见错误解决方案 拓展用法跨表与跨工作簿查找查找返回多列…

对最近的刷题做一个小总结(关于动态规划和贪心)

文章目录 1. 小总结2. 两道算法题2.1 数组中两个字符串的最小距离2.2 孩子们的游戏 1. 小总结 最近刷了很多算法题,真正了解到的算法应是dfs,多元dfs,以及动态规划和贪心。 dfs和多元dfs目前并没有真正深入研究过,不过熟悉套路之…

jmeter分布式原理及实例

一、执行原理 二、相关注意事项 关闭防火墙所有上网控制机、代理机、服务器都在同一个网络上所有机器的jmeter和java版本必须一致关闭RMI.SSL开关 三、配置和执行 配置: 修改bin/jmeter.properties文件: 代理机: 修改服务端口&#xff1…

C++ STL 详解 ——vector 的深度解析与实践指南

一、vector 的核心概念与底层机制 1.1 动态数组的本质 连续内存存储:与普通数组相同,vector 使用连续的内存空间,支持 O (1) 时间复杂度的随机访问。动态扩容特性:通过push_back等操作自动调整容量,无需手动管理内存…

【SpringBoot】——在做一些项目中所学到的新的技术栈和一些小技巧(主要为MQ,详细请看目录和文章)

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大三学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…

0经验cursor开发一款跨端app

设备:mac电脑cursor 1.输入诉求 我要实现一个跨端的地址应用,使其可以在ios、安卓、小程序和网页端都可以使用。这是一个demo的项目,功能不必要太过复杂,下面需要你和我多次沟通完成这个任务。你先根据我的内容输入&#xff0c…

Element Ui - 编辑时表单校验信息未清空问题处理

Element Ui 关闭对话框清空验证消息&#xff0c;清除form表单的操作 首先在对话框 取消按钮 添加 click事件&#xff0c;例如&#xff1a;&#xff08;ps&#xff1a;callOf 里面的addGroupData和ref - - &#xff09; <div slot"footer" class"dialog-foo…

OpenCV图像加权函数:addWeighted

1 addWeighted函数 在OpenCV 里&#xff0c;addWeighted 函数的作用是对两个图像进行加权求和&#xff0c;常用于图像融合、图像过渡等场景。函数如下&#xff1a; cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])2 参数解释 src1&#xff1a;第一个输入图…

Science Robotics 利用机器学习进行鳐鱼的仿生设计

对于海洋生物而言&#xff0c;生物力学和流体动力学力都会对游泳速度施加物理限制&#xff0c;促使游泳策略和鳍形状的趋同进化。鉴于这些限制是与尺度相关的&#xff0c;如雷诺数&#xff08;Re&#xff09;&#xff0c;这就产生了自然运动缩放定律&#xff0c;该定律根据生物…

基于ssm的一家运动鞋店的产品推广网站的设计

项目简介 一家运动鞋店实现了以下功能&#xff1a; 实现了用户在线选择试题并完成答题&#xff0c;在线查看考核分数。管理员管理收货地址管理、购物车管理、字典管理、留言版管理、新闻信息管理、产品管理、产品收藏管理、产品评价管理、产品订单管理、单页数据管理、用户管…

什么是后训练?大语言模型训练后优化方法综述,87页pdf

大语言模型&#xff08;LLMs&#xff09;的出现彻底改变了自然语言处理领域&#xff0c;使其在从对话系统到科学探索的各个领域中变得不可或缺。然而&#xff0c;其预训练架构在特定场景中往往表现出局限性&#xff0c;包括推理能力受限、伦理不确定性以及领域特定性能欠佳等问…

python开发订单查询功能(flask+orm bee)

1. 搭建python环境。 可以参考其它文档。 此处python使用 3.12 IDE随意&#xff0c;PyCharm 或 Eclipse PyDev也可以。 2. Flask 2.1 安装Flask pip install Flask 2.2 一个最简单的flask实例 创建一个工程&#xff0c; 新建一个 main.py文件&#xff0c; 输入以下内容…

工作记录 2017-01-11

工作记录 2017-01-11 序号 工作 相关人员 1 协助BPO进行Billing的工作。 修改邮件上的问题。 更新RD服务器。 郝 更新的问题 1、修改了Patient Insurance的文件上传。 1.1 文件存储改为MedI“EHRWfs”Account“patientInfo”MRN 1.2 “Upload Files” to “Upload/Vie…

基于javaweb的SpringBoot个人健康管理系统小程序微信小程序设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

b站视频下载工具软件怎么下载

自行配置FFMPEG环境 请优先选择批量下载&#xff0c;会自处理视频和音频文件。 如果要下载更高质量请登陆。 没有配置FFMPEG下载后会有报错提示&#xff0c;视频音频文件无法合并生成mp4文件 更新批量下载标题&#xff0c;只取视频原标题&#xff0c;B站反爬机制登陆后下载多了…

简单的模拟法

1. 鸡兔同笼问题&#xff0c;鸡有2只脚 &#xff0c;兔有4只脚&#xff0c;已知脚数求最多有几只动物 #include <stdio.h>void feet(int x){if(x%2 0){if(x%4 0) printf("max%d,min%d",x/2,x/4);else printf("max%d,min%d",x/2,(x-2)/41);}else …