使用 OpenTelemetry 和 Loki 实现高效的应用日志采集和分析

在之前的文章陆续介绍了 如何在 Kubernetes 中使用 Otel 的自动插桩 以及 Otel 与 服务网格协同实现分布式跟踪,这两篇的文章都将目标聚焦在分布式跟踪中,而作为可观测性三大支柱之一的日志也是我们经常使用的系统观测手段,今天这篇文章就来体验下应用日志的操作闭环。

背景

OpenTelemetry 简介

OpenTelemetry (以下简称 Otel)是一个开源项目,旨在为分布式追踪、度量和日志提供统一的标准,简化应用程序的观测性(Observability)。它提供了一系列工具和 API,用于收集和传输应用程序的性能数据和日志,帮助开发者和运维团队更好地理解系统的行为。功能包括自动和手动检测应用程序的追踪数据,收集关键度量指标,以及捕获和传输日志。Otel 支持多种编程语言和框架,可以与多个后端系统集成,如 Prometheus、Jaeger、Elasticsearch 等。

Log 是 OpenTelemetry 项目的一部分,旨在提供一种标准化的方式来收集、传输和存储日志数据。

Loki 简介

Loki 是 Grafana Labs 开发的一个水平可扩展、高可用性、多租户的日志聚合系统,专为效率和易用性而设计。与传统的日志聚合系统不同,Loki 主要索引日志内容的元数据而不是内容本身,这使得它既轻量又高效。Loki 采用了与 Prometheus 类似的标签系统,使得日志查询更加灵活和强大。常用于存储和查询大量日志数据,特别是与 Grafana 结合使用时,提供了强大的日志可视化和分析能力。

演示

在本演示中将使用 Java 应用进行日志闭环操作的演示,在 Otel Log 支持的语言 中,Java 是的最全面的语言之一。

架构

  1. Otel Operator 通过自动插桩的配置,为 Java 工作负载安装探针并加载配置
  2. 应用通过 otlp 端点上报日志到 Otel collector
  3. Otel collector 将日志输出到 Loki
  4. grafana 将 Loki 作为数据源进行日志的可视化展示

前置条件

  • Kubernetes 集群
  • kubectl cli
  • helm cli

安装 Loki 和 Grafana

安装 Grafana helm 库。

helm repo add grafana https://grafana.github.io/helm-charts
helm repo update

准备 Loki 的配置文件 values.yaml

loki:auth_enabled: falsecommonConfig:replication_factor: 1storage:type: 'filesystem'
singleBinary:replicas: 1

安装 Loki。

helm install --values values.yaml loki grafana/loki

安装 Grafana。

helm install grafana grafana/grafana

通过 port forward 可以访问 Grafana http://localhost:3000 。

POD_NAME="$(kubectl get pod -l app.kubernetes.io/name=grafana -o jsonpath='{.items[0].metadata.name}')"
kubectl --namespace default port-forward $POD_NAME 3000

在 Grafana 中配置 Loki 数据源,指向上面部署 Loki。

安装 Otel Operator

Otel Operator 依赖 cert-manager 进行证书的管理,安装 operator 之前需要安装 cert-manager。

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.2/cert-manager.yaml

执行下面命令安装 Otel Operator

kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml

配置 Instrumentation

成功安装 Otel Operator 之后,接下来就是配置探针的安装和配置了,详细的配置说明,可以参考 Instrumentation API 文档。

Instrumentation 是 Otel Operator 的另一个 CRD,用于自动安装 Otel 探针和配置。本演示虽然主要聚焦在日志,但我们依然保留了之前使用的分布式跟踪的配置,保证链路信息的传递。

  • propagators 用于配置跟踪信息在上下文的传递方式。
  • sampler 采样器
  • env[language].env 添加到容器的环境变量

针对 Java 应用,通过环境变量 OTEL_EXPORTER_OTLP_ENDPOINT 设置 oltp 的端点,以及 OTEL_LOGS_EXPORTER 设置应用 日志的输出方式 oltp。也可以设置为 logging、oltp,将日志输出到控制台以及 oltp 端点。

kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:name: instrumentation-sample
spec:propagators:- tracecontext- baggage- b3sampler:type: parentbased_traceidratioargument: "1"env:- name: OTEL_EXPORTER_OTLP_ENDPOINTvalue: otel-collector.default:4318java:    env:- name: OTEL_EXPORTER_OTLP_ENDPOINTvalue: http://otel-collector.default:4317   - name: OTEL_LOGS_EXPORTERvalue: otlp
EOF

配置 OpenTelemetry Collector

在我们的设计用,Otel Collector 会将日志输出到 Loki,实际上是通过 Loki 的 HTTP API 来发送日志,因此需要使用适配 Loki API 的 exporter:lokiexporter。

lokiexporter 来自 Otel Collector 的 Contrib 库,并不在官方的 release 中。要想在 collector 中使用 lokiexporter 有两种方式:

  • 使用官方提供的工具 OpenTelemetry Collector Builder (ocb) 在构建 collector 的二进制时将 lokiexporter 加入其中。
  • 使用 官方提供的发行包 otelcol-contrib,这个包中包含了 Contrib 库所有的第三方组件。但不推荐在生产环境中使用,仅供测试。我们的演示中将会使用该发行包。

Otel 收集器的详细配置可以参考 官方文档。

  • 接收器(receiver),我们配置 otlp 来接收来自应用程序的跟踪信息。
  • 处理器(processor),将日志中的部分资源属性作为 loki 的标签,比如服务名、容器名、命名空间、pod 名。
  • 输出器(exporter),配置 Loki 的 HTTP API 端点 http://loki.default:3100/loki/api/v1/push
  • 管道服务(pipeline service),使用 otlp 作为输入源,将 loki 作为输出目的地。
kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:name: otel
spec:image: ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-contrib:0.90.1config: |receivers:otlp:protocols:grpc:http:processors:resource:attributes:- action: insertkey: loki.resource.labelsvalue: service.name, k8s.container.name, k8s.namespace.name, k8s.pod.nameexporters:debug:verbosity: detailedloki:endpoint: "http://loki.default:3100/loki/api/v1/push"tls:insecure: truedefault_labels_enabled:exporter: truejob: true   service:pipelines:logs:receivers: [otlp]processors: [resource]exporters: [loki]          
EOF

部署示例应用

这是一个非常简单的 Java 应用,监听 8080 端口,在响应请求时打印日志。

@SpringBootApplication
@Slf4j
@RestController
public class SpringBootRestApplication {public static void main(String[] args) {SpringApplication.run(SpringBootRestApplication.class, args);}@GetMapping("/")public String hello() {log.info("Hello World");return "Hello World";}
}

在 Maven 的 pom 中只引入了两个依赖 :spring-boot-starter-weblombok

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version></dependency></dependencies>

部署应用。

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:name: java-sample
spec:replicas: 1selector:matchLabels:app: java-sampletemplate:metadata:labels:app: java-sampleannotations:instrumentation.opentelemetry.io/inject-java: "true"spec:containers:- name: java-sampleimage: addozhang/spring-boot-restimagePullPolicy: Alwaysports:- containerPort: 8080
EOF

应用部署完成后,通过端口转发可以成功访问应用。

curl localhost:8080
Hello World

测试

Grafana 配置完 Loki 的数据源之后,在 Explore 中选择配置的 Loki 数据源,然后在下方的 Label Filters 中选择过滤器名 service_name 和值 java-sample

点击 Run query 后可以看到搜索结果。

总结

在本文中,我们探讨了如何利用 OpenTelemetry 的自动检测功能来高效采集应用日志,通过 OpenTelemetry Collector 进行处理,并利用 Loki Exporter 将日志数据发送到 Loki。最后,我们展示了如何使用 Grafana 对这些日志进行深入的查询和分析。这一过程不仅优化了日志管理流程,还提升了数据的可视化和可用性。这种集成为开发者和运维团队提供了一个全面的视角,帮助他们更有效地理解和优化他们的应用和基础设施。特别是,如果将分布式跟踪的 traceid、spanid 等信息作为 Loki 日志的标签,将极大地增强了日志数据的可追踪性和可分析性。

关注"云原生指北"微信公众号 (转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)

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

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

相关文章

【AI】使用阿里云免费服务器搭建Langchain-Chatchat本地知识库

书接上文&#xff0c;由于家境贫寒的原因&#xff0c;导致我本地的GPU资源无法满足搭建Langchain-Chatchat本地知识库的需求&#xff0c;具体可以看一下这篇文章&#xff0c;于是我只能另辟蹊径&#xff0c;考虑一下能不能白嫖一下云服务器资源&#xff0c;于是去找网上找&…

Java BigDecimal 的舍入模式(RoundingMode)

BigDecimal 有 8 种 RoundingMode&#xff08;舍入模式&#xff09; ROUND_UP 进位制&#xff1a;不管保留数字后面是大是小 (0 除外) 都会进 1。结果会向原点的反方向对齐&#xff0c;正数向正无穷方向对齐&#xff0c;负数向负无穷方向对齐。 BigDecimal a new BigDecimal…

docker笔记2-docker 容器

docker 容器的运行 docker run 镜像名&#xff1a;版本标签&#xff1a; 创建 启动容器 docker run 镜像名 &#xff0c;如果镜像不存在&#xff0c;则会在线下载镜像。 注意事项&#xff1a; 容器内的进程必须处于前台运行状态&#xff0c;不能后台&#xff08;守护进程运行…

财务数据智能化:用AI工具高效制作财务分析PPT报告

Step1: 文章内容提取 WPS AI 直接打开文件&#xff0c;在AI对话框里输入下面指令&#xff1a; 假设你是财务总监&#xff0c;公司考虑与茅台进行业务合作、投资或收购&#xff0c;请整合下面茅台2021年和2022年的财务报告信息。整理有关茅台财务状况和潜在投资回报的信息&…

springboot 快速上手

Spring Boot是一个用于快速构建基于Spring的应用程序的开发框架。它简化了Spring应用程序的初始化和配置过程&#xff0c;提供了一种约定优于配置的方式来构建应用程序。 内嵌tomat、jetty可以生成可以独立运行的jar包&#xff0c;不需要打成war包。 简化配置&#xff0c;大部…

【PostGIS】在Java中操作postgis——使用springboot+Maven+mybatis框架

前言&#xff1a; PostgreSQL15对应PostGIS安装教程及空间数据可视化 空间数据库-常用空间函数 完成PostGIS的安装与配置后&#xff0c;让我们来写一个Java操作postgis数据库的demo吧~ 使用工具&#xff1a; NavicatIDEA 一、PostGIS数据库准备 在Navicat中新建一个postgr…

docker 镜像仓库harbor安装

1、windows安装&#xff1a; docker pull bitnami/harbor-registry 2、linux安装&#xff1a; K8s集群使用容器镜像仓库Harbor_k8s使用harbor-CSDN博客

Ubuntu系统如何安装SVN服务端并通过客户端无公网ip实现远程访问?

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

【Dart】P1 入口方法、注释方法、变量与常量、命名规则

Dart 入口方法、注释方法、变量与常量、命名规则 入口方法注释方法变量与常量变量变量名称命名规则常量 入口方法 入口方法一&#xff1a;main() 方法&#xff1b; 使用条件&#xff1a;有返回值&#xff1b; 代码示例&#xff1a; main() {print(nihao dart); }入口方法二&a…

LeetCode 22 括号生成

题目描述 括号生成 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())()","()((…

测绘资质人员培训与岗位管理制度

人员培训与岗位管理制度 建立健全人员培训与岗位管理制度&#xff0c;明确岗位职责、岗前培训考核、继续教育等要求

设 备 管 理

(1) 简单叙述设备管理的任务和功能。 解&#xff1a; 设备管理的主要任务包括&#xff1a; 响应用户进程提出的I/O请求&#xff0c;选择和分配I/O设备进行数据传输操作。控制I/O设备和CPU(或内存)之间进行数据交换&#xff0c;提高设备和设备之间、CPU和设备之间以及进程和进程…

实验三:路由器的管理与配置

实验目的&#xff1a; 了解路由器的作用熟悉路由器的基本配置方法熟悉Packet Tracer 路由模拟软件的使用 实验环境&#xff1a; Windows 10 下的 Cisco Packet Tracer 实验内容&#xff1a; 熟悉Packet Tracer组件搭建实验拓扑 实验步骤&#xff1a; 1.连接设备 2.配置IP地…

开发常需要的好用API汇总

手机号码归属地&#xff1a;可根据手机号码查询其省市区、运营商区号行政区划代码等信息。 上亿条数据囊括最新的170、166、147等号段&#xff0c;更新及时、准确度高。二维码识别OCR&#xff1a;对图片中的二维码、条形码进行检测和识别&#xff0c;返回存储的文字内容。短信验…

【Linux】解释为什么“I/O 等待”的指标可能是误导的。

解释为什么“I/O 等待”的指标可能是误导的。 I/O等待指标是用来衡量I/O子系统性能的重要指标之一&#xff0c;它表示等待I/O操作完成的时间。然而&#xff0c;I/O等待指标有时可能会误导&#xff0c;原因如下&#xff1a; I/O操作类型&#xff1a;I/O等待指标不能告诉我们实…

python定义代码块的符号,python中代码块所属关系

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python中代码块所属关系的语法&#xff0c;python定义代码块的符号&#xff0c;今天让我们一起来看看吧&#xff01; 本文章主要用于平时Python3学习和使用中积累的比较常用的代码块。代码都是经过验证可行的python简单…

深度学习计算数据集里所有图像像素点的均值方差

代码怕忘记&#xff0c;现在贴上来&#xff0c;以防丢失 from torch.utils.data import DataLoader from torchvision.datasets import ImageFolder import torch from torchvision import transformsdef get_mean_and_std(data_path, in_chans3):dataset ImageFolder(rootda…

RocketMQ常见问题分析

目录 1. RocketMQ如何保证消息不丢失 1.1 分析消息丢失场景 1.2 解决方案 1.2.1 保证消息生产不丢失 1.2.1.1 生产消息时不使用单向发送消息发送模式 1.2.1.2 生产者使用事务消息机制 1.2.2 保证消息存储不丢失 1.2.3 保证消息消费不丢失 1.2.4 RocketMQ特有的问题&…

4.8 【共享源】流的消费者

一,什么是流的消费者? 消费者从生产者那里获取内容,以进行下一步的处理。 消费者从生产者那里获取内容,并对其进行某种形式的处理(例如图像处理、合成)。它最终也可以显示来自生产者的内容。 通常,我们需要在消费者应用程序中执行接下来的步骤,以从生产者那里获取内…

Echarts legend属性使用

Echarts的legend属性是对图例组件的相关配置 而legend就是Echarts图表中对图形的解释部分&#xff1a; 其中legend自身常用的配置属性如下&#xff1a; orient 设置图例的朝向 属性值&#xff1a; vertical // 垂直显示 或者 horizontal // 水平显示 legend: {orient: ver…