# opentelemetry-loki-tempo-grafana-demo **Repository Path**: sdvdxl/opentelemetry-loki-tempo-grafana-demo ## Basic Information - **Project Name**: opentelemetry-loki-tempo-grafana-demo - **Description**: 集成 opentelemetry分布式日志追踪; loki 日志收集;tempo 日志追踪后端; grafana 图表大盘UI ;grpc 测试demo - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 13 - **Forks**: 5 - **Created**: 2022-05-04 - **Last Updated**: 2025-03-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: opentelemetry, Grpc, prometheus, loki, tempo ## README # opentelemetry-loki-tempo-grafana-demo ## 介绍 集成 opentelemetry分布式日志追踪; loki 日志收集;tempo 日志追踪后端; grafana 图表大盘UI ;grpc 测试demo ## 效果 ### 登录页面 ![登录](https://public-links.todu.top/picgo/20220504230818.png?imageMogr2/auto-orient/blur/1x0/quality/75|imageslim) ### 数据源页面 ![数据源](https://public-links.todu.top/picgo/20220504230920.png?imageMogr2/auto-orient/blur/1x0/quality/75|imageslim) ### Loki 日志查询页面 ![日志查询](https://public-links.todu.top/picgo/20220504231200.png?imageMogr2/auto-orient/blur/1x0/quality/75|imageslim) ### Tempo 日志追踪查询页面 ![日志追踪](https://public-links.todu.top/picgo/20220504231503.png?imageMogr2/auto-orient/blur/1x0/quality/75|imageslim) ### Tempo 节点拓扑关系图 ![节点拓扑关系图](https://public-links.todu.top/picgo/20220504231714.png?imageMogr2/auto-orient/blur/1x0/quality/75|imageslim) ### Loki Tempo 双向关联界面 ![双相关联](https://public-links.todu.top/picgo/20220504231558.png?imageMogr2/auto-orient/blur/1x0/quality/75|imageslim) ## 组件说明 - [Grafana](https://grafana.com/) 是一款采用 go 语言编写的开源应用,是一个跨平台的开源的度量分析和可视化工具。 - [Tempo](https://grafana.com/oss/tempo/) 一个开源的、易于使用的、大规模的分布式跟踪服务端,支持常见的开源跟踪协议,包括 Jaeger、Zipkin 和 Open Telemetry。 - [Loki](https://grafana.com/oss/loki/) Loki 是一个受 Prometheus 启发的水平可扩展、高可用、多租户日志聚合系统(比Elastic简单,不索引日志内容)。 - [Prometheus](https://prometheus.io/) 一个监控系统,包括一个丰富的多维数据模型、一个名为Prom QL的简洁而强大的查询语言、一个高效的嵌入式时间序列数据库,丰富的插件支持。 - [OpenTelemetry](https://opentelemetry.io/) 一个简单的、高度可扩展的、高性能的日志追踪框架(准确来说是标准协议,本身不提供存储,需要其他组件支持比如 Loki、Jaeger、 Prometheus、SkyWalking等)。 - [opentelemetry-java-instrumentation](https://github.com/open-telemetry/opentelemetry-java-instrumentation) Java 版本的 OpenTelemetry Agent,低侵入,可以自动采集调用数据。 - [loki4j](https://github.com/loki4j/loki-logback-appender) 支持Java日志系统Logback配置,直接将日志推送到 Loki ## 软件架构 ![软件架构](https://public-links.todu.top/picgo/20220504214717.png?imageMogr2/auto-orient/blur/1x0/quality/75|imageslim) ## 使用说明 ### 启动组件服务 为了方便演示,组件使用了 [docker-compose](https://docs.docker.com/compose/) 方式启动。 克隆本项目 `git clone git@gitee.com:sdvdxl/opentelemetry-loki-tempo-grafana-demo.git` ```shell cd opentelemetry-loki-tempo-grafana-demo docker-compose up -d ``` ### 启动java程序 ```shell cd java-demo ./mvnw clean package -Dmaven.test.skip=true java -javaagent:../opentelemetry/opentelemetry-javaagent.jar -Dotel.service.name=loki-demo -jar target/leaning-opentelemetry-0.0.1-SNAPSHOT.jar ``` 启动后,在命令行中访问: ```shell curl -v localhost:12315/hello ``` **为了测试异常信息,偶数次访问会抛出异常** 如图所示,可以看到返回了traceID(注意该头部信息返回需要在程序里配置,参见 `java-demo/src/main/java/top/todu/leaning/opentelemetry_loki/config/TraceFilter.java`) ![访问效果](https://public-links.todu.top/picgo/20220504223929.png?imageMogr2/auto-orient/blur/1x0/quality/75|imageslim) 打开浏览器,直接打开 [loki 日志查询页面](http://localhost:3000/explore?orgId=1&left=%7B%22datasource%22:%22Loki%22,%22queries%22:%5B%7B%22refId%22:%22A%22,%22expr%22:%22%7Bservice%3D%5C%22loki-demo%5C%22%7D%22%7D%5D,%22range%22:%7B%22from%22:%22now-1h%22,%22to%22:%22now%22%7D%7D),输入用户名: `admin` 密码:`foobar` 应该是这么个界面 ![loki日志查询界面](https://public-links.todu.top/picgo/20220504224825.png?imageMogr2/auto-orient/blur/1x0/quality/75|imageslim) 分为3部分 1. 查询条件 2. 日志量统计 3. 日志列表,点击每个日志可以展开 点击 trace 按钮,会打开右侧,展示追踪详情。 ![trace](https://public-links.todu.top/picgo/20220504225742.png?imageMogr2/auto-orient/blur/1x0/quality/75|imageslim) 同时,右侧追踪详情里面也可以点击进行查询相关日志。注意,因为日志采集时间和查询时间略有误差,会导致点击查看日志后没有数据,手动更改时间范围即可。 ![更改时间范围](https://public-links.todu.top/picgo/20220504230134.png?imageMogr2/auto-orient/blur/1x0/quality/75|imageslim) ## 配置 默认日志和追踪信息都发送到了本地,如果要发送到其他地址,参考如下配置 ```shell -Dotel.exporter.otlp.endpoint=http://10.1.1.100:4317 -Dotel.exporter.otlp.traces.endpoint=http://10.1.1.100:4317 -Dotel.exporter.otlp.metrics.endpoint=http://10.1.1.100:4317 -Dotel.exporter.otlp.logs.endpoint=http://10.1.1.100:4317 -javaagent:../opentelemetry/opentelemetry-javaagent.jar -Dotel.service.name=loki-demo -jar target/leaning-opentelemetry-0.0.1-SNAPSHOT.jar --log.push.url=http://10.1.1.100:3100/loki/api/v1/push ``` ### loki 地址 `--log.push.url=http://10.1.1.100:3100/loki/api/v1/push` ### tempo 地址 ```shell -Dotel.exporter.otlp.endpoint=http://10.1.1.100:4317 -Dotel.exporter.otlp.traces.endpoint=http://10.1.1.100:4317 -Dotel.exporter.otlp.metrics.endpoint=http://10.1.1.100:4317 -Dotel.exporter.otlp.logs.endpoint=http://10.1.1.100:4317 ``` ## 最后 本项目只是作为快速了解这套框架的使用和了解,暂不进行深入介绍。 ## 已知问题 1. grpc server 端直接抛出异常,不会有traceID,但是使用 `responseObserver.onError` 方式是正常的(服务端不会打印异常信息,需要自行日志记录) 2. JAVA 日志推送时间和trace时间有误差