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博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「mysql」Mac mysql一路畅通式安装

折腾了一上午,遇到的各种错误: 错误一:安装后,终端执行 mysql 或者执行 mysql -u root -p 时报错: ERROR 1045 (28000): Access denied for user rootlocalhost (using password: YES)错误二:为解决错误一&…

Linux原生异步IO原理与实现(Native AIO)

异步 IO:当应用程序发起一个 IO 操作后,调用者不能立刻得到结果,而是在内核完成 IO 操作后,通过信号或回调来通知调用者。 异步 IO 与同步 IO 的区别如图所示: 从上图可知,同步 IO 必须等待内核把 IO 操作处…

AI编程方法第三弹:让它改错

很多情况下,我们自己还是可以完成代码的,不过会遇到很多错误。在发生错误时,可以充分利用AI编程工具帮助我们调试错误,加快处理速度。当然,对于初学者并不建议,还是等自己掌握了基础知识,再去考…

【论文解读】MODEST 透明物体 单目深度估计和分割 ICRA 2025

MODEST是一种用于透明物体的单目深度估计和分割的方法,来自ICRA 2025。 它通过单张RGB图像作为输入,能够同时预测透明物体的深度图和分割掩码。 由深度图生成点云数据,然后采用GraspNet生成抓取位姿,开展透明物体抓取实验。 论文…

基于SpringBoot的美食信息推荐系统设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

Unity--Cubism Live2D模型使用

了解LIVE2D在unity的使用--前提记录 了解各个组件的作用 Live2D Manuals & Tutorials 这些文件都是重要的控制动画参数的 Cubism Editor是编辑Live2D的工具,而导出的数据的类型,需要满足以上的条件 SDK中包含的Cubism的Importer会自动生成一个Pref…

2025人工智能AI新突破:PINN内嵌物理神经网络火了

最近在淘金的时候发现基于物理信息的神经网络(简称PINN)也是个研究热点,遂研读了几篇经典论文,深觉这也是个好发论文的方向,所以火速整理了一些个人认为很值得一读的PINN论文和同学们分享。 为了方面同学们更好地理解…

大模型是如何工作的

近几十年来,人工智能经历了从基础算法到生成式AI的深刻演变。生成式AI通过学习大量数据可以创造出全新的内容,如文本、图像、音频和视频,这极大地推动了AI技术的广泛应用。常见的应用场景包括智能问答(如通义千问、GPT&#xff09…

Qt常用控件之 纵向列表QListWidget

纵向列表QListWidget QListWidget 是一个纵向列表控件。 QListWidget属性 属性说明currentRow当前被选中的是第几行。count一共有多少行。sortingEnabled是否允许排序。isWrapping是否允许换行。itemAlignment元素的对齐方式。selectRectVisible被选中的元素矩形是否可见。s…

利用pdf.js+百度翻译实现PDF翻译,创建中文PDF

基于JavaScript的PDF文档解析与智能翻译系统开发实践 一、功能预览 1.1 PDF加载 1.2 PDF翻译 二、系统架构设计 2.1 PDF智能翻译系统架构设计 层级模块名称功能描述技术实现呈现层Canvas渲染器PDF文档可视化渲染PDF.js + 动态视口计算 + 矩阵变换

Java数据结构第十九期:解构排序算法的艺术与科学(一)

专栏:Java数据结构秘籍 个人主页:手握风云 目录 一、排序的概念及引用 1.1. 排序的概念 1.2. 排序的应用 1.3. 常见的排序算法 二、常见排序算法的实现 2.1. 直接插入排序 2.2. 希尔排序 一、排序的概念及引用 1.1. 排序的概念 所谓排序&#xf…

1.2TypeScript 类型系统在前端的革命性意义

文章目录 **一、前端开发的类型觉醒(历史背景)****二、类型系统的核心价值****三、类型系统与现代框架的化学反应****四、高级类型编程实战****五、工程化影响深度解析****六、生态系统的蝴蝶效应****七、企业级应用实践数据****八、类型系统的局限性***…

K8S学习之基础十九:k8s的四层代理Service

K8S四层代理Service 四层负载均衡Service 在k8s中,访问pod可以通过ip端口的方式,但是pod是由生命 周期的,pod在重启的时候ip地址往往会发生变化,访问pod就需要新的ip地址,这样就会很麻烦,每次pod地址改变就…

Varlens(手机上的单反)Ver.1.9.3 高级版.apk

Varlens 是一款专业级手机摄影软件,旨在通过丰富的功能和高自由度参数调节,让手机拍摄效果媲美微单相机。以下是核心功能总结: 一、核心功能 专业拍摄模式 支持手动/自动/程序模式,可调节ISO、快门速度、EV、白平衡等参数27 提供…

用Deepseek写一个 HTML 和 JavaScript 实现一个简单的飞机游戏

大家好!今天我将分享如何使用 HTML 和 JavaScript 编写一个简单的飞机游戏。这个游戏的核心功能包括:控制飞机移动、发射子弹、敌机生成、碰撞检测和得分统计。代码简洁易懂,适合初学者学习和实践。 游戏功能概述 玩家控制:使用键…

物联网IoT系列之MQTT协议基础知识

文章目录 物联网IoT系列之MQTT协议基础知识物联网IoT是什么?什么是MQTT?为什么说MQTT是适用于物联网的协议?MQTT工作原理核心组件核心机制 MQTT工作流程1. 建立连接2. 发布和订阅3. 消息确认4. 断开连接 MQTT工作流程图MQTT在物联网中的应用 …

在Rocky Linux上安装Redis(DNF和源码安装)

一.前言 Redis 是一款高性能的 NoSQL 数据库,被广泛用于缓存、消息队列等场景。本教程将手把手教你如何在 Rocky Linux 上安装 Redis,包括使用 DNF 进行安装和源码编译安装的两种方式。 二. 使用 DNF 安装 Redis 1.安装redis sudo dnf -y install red…

江科大51单片机笔记【10】蜂鸣器(上)

一、蜂鸣器 1.原理 蜂鸣器是一种将电信号转换为声音信号的器件,常同来产生设备的按键音、报警音等提示信号蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器(外观基本一样)有源蜂鸣器:内部自带振荡源,将正负极接上直流…

Android设备是如何进入休眠的呢?

首先我们手机灭屏后,一般需要等一段时间CPU才真正进入休眠。即Android设备屏幕暗下来的时候,并不是立即就进入了休眠模式;当所有唤醒源都处于de-avtive状态后,系统才会进入休眠。在手机功耗中从灭屏开始到CPU进入休眠时间越短&…

011---UART协议的基本知识(一)

1. 摘要 文章为学习记录。主要介绍 UART 协议的概述、物理层、协议层、关键参数。 2. UART概述 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART(串口),是一种异步****串…