• Grafana,Loki,Tempo,Prometheus,Agent搭建日志链路监控平台


    可观测性

    可观测性是指通过从各种IT服务或组件中收集并积累监控数据、系统日志、运行指标等数据,来了解当前系统或应用程序整个架构服务的当前状态,通过可指标化或图形化监视、查看整个系统服务的任意节点、任意时间期间的运行结果,从而对系统服务的运行健康状况有全面的了解与把控;

    通过跟踪ID或在分布式系统(尤其是容器化应用程序或微服务架构)的所有节点中,追踪请求到响应的整个过程,并通过技术手段收集整个过程中的日志、指标、Trace等数据,形成一个完整的数据链路,从而为可观测性分析与展示提供基础数据。

    通过可观测性指标的跟踪,可以快速分析和观察系统,从而轻松发现系统故障、性能瓶颈、节点互连等问题,确保服务的可靠、性能和安全等。也是现在IT业务建设过程中,必不可少的运维与监控技术方案之一;

    推荐一篇好文章,快速了解可观测性:初学指南:什么是可观测性? - 知乎

    运行环境

    虚拟主机linux * 1 ,ip: 192.168.1.xxx(内网) ,配置:8核 * 16G * 200G硬盘

    Grafana、Loki、Tempo、Prometheus等非集群模式,全部单实例部署

    注意:本文除了IDEA开发环境外,所有服务均安装在此虚拟主机上;

    平台流程

    • 向应用、服务、网关发起请求
    • 服务所在的环境下,启用agent代理,负责采集metrics、logs、traces等数据
    • Agent代理将采集的metrics数据推送到Prometheus服务,logs日志推送到loki服务,traces数据推送到Tempo服务
    • Grafana集成Prometheus、Loki、Tempo数据源,通过数据查询和内置功能搜索与展示日志链路;

    Loki

    简介

    Grafana Loki 是一个日志组件服务,与其他日志系统不同,Loki 不会对日志内容进行索引,而只会对有关日志的元数据(日志流的一组标签)进行索引:标签(就像 Prometheus 标签)。

    Loki 是一个受Prometheus启发的水平可扩展、高可用、多租户日志聚合系统。Loki 与 Prometheus 的不同之处在于,它关注日志而不是指标,并通过推送而不是拉取来收集日志。

    然后,日志数据本身会被压缩并以块的形式存储在对象存储中,例如 Amazon Simple Storage Service (S3) 或 Google Cloud Storage (GCS),甚至存储在本地文件系统中。

    Loki 的设计非常经济高效且具有高度可扩展性。小索引和高度压缩的块简化了操作并显着降低了 Loki 的成本。Loki 提供灵活的查询语言:LogQL;

    并且通常通过Grafana对 Loki 中存储的日志进行查询并对可视化查询结果展示。配置Grafana中的告警模块,可以设置日志指标并监控日志异常行为;

    Loki 与 Grafana、Mimir 和 Tempo 集成,提供完整的可观察性堆栈以及日志、指标和跟踪之间的无缝关联。

    下载安装

    https://github.com/grafana/loki/releases/download/v2.9.0/loki-linux-amd64.zip

    直接解压即可

    unzip loki-linux-amd64.zip

    配置

    在安装的目录下,创建:loki-config.yml

    vim loki-config.yml

    并配置文件内容如下:

    1. # 不开启鉴权
    2. auth_enabled: false
    3. # http和grpc端口
    4. server:
    5. http_listen_port: 3100
    6. grpc_listen_port: 9096
    7. # 数据索引和块存储配置
    8. common:
    9. path_prefix: /tmp/loki
    10. storage:
    11. filesystem:
    12. chunks_directory: /tmp/loki/chunks
    13. rules_directory: /tmp/loki/rules
    14. replication_factor: 1
    15. ring:
    16. instance_addr: 127.0.0.1
    17. kvstore:
    18. store: inmemory
    19. # 缓存管理
    20. query_range:
    21. results_cache:
    22. cache:
    23. embedded_cache:
    24. enabled: false
    25. # 数据存储管理
    26. schema_config:
    27. configs:
    28. - from: 2023-09-01
    29. store: boltdb-shipper
    30. object_store: filesystem
    31. schema: v11
    32. index:
    33. prefix: index_
    34. period: 24h
    35. # 告警推送接口
    36. #ruler:
    37. # alertmanager_url: http://localhost:9093
    38. # 数据块的存储策略
    39. chunk_store_config:
    40. max_look_back_period: 240h
    41. # 保存创建数据索引和块等信息的表存储策略
    42. table_manager:
    43. retention_deletes_enabled: true
    44. retention_period: 240h
    45. # 数据块压缩配置
    46. compactor:
    47. working_directory: /tmp/loki/retention
    48. shared_store: filesystem
    49. compaction_interval: 10m
    50. retention_enabled: true
    51. retention_delete_delay: 2h
    52. retention_delete_worker_count: 150

    启动

    1. # run loki
    2. nohup ./loki-linux-amd64 --config.file=loki-config.yml > /tmp/null 2>&1 &

    Tempo

    简介

    Grafana Tempo 是一个开源、易于使用且大容量的分布式链路跟踪后端(Trace)。Tempo可将数据存储在对象存储或本地文件中。

    Tempo 与 Grafana、Mimir、Prometheus 和 Loki 深度集成。可以将 Tempo 与开源跟踪协议结合使用: Jaeger、Zipkin 或 OpenTelemetry。

    Tempo 与许多现有的开源工具集成良好:

    • Grafana使用内置Tempo 数据源提供对 Tempo 的本机支持。
    • Grafana Loki具有强大的查询语言LogQL v2,允许您过滤您关心的请求,并使用Grafana 中的派生字段支持跳转到跟踪。
    • Prometheus 示例可让您通过单击记录的示例从 Prometheus 指标跳转到 Tempo 跟踪。

    Tempo完全支持OpenTelemetry数据采集和标准规范,因此可以将Tempo做为OpenTelemetry协议数据的收集(collector)与存储(存储依赖其它服务或本地文件)中心,无需额外在部署OpenTelemetry相关服务;

    安装

    https://github.com/grafana/tempo/releases/download/v2.2.3/tempo_2.2.3_linux_amd64.tar.gz

    直接解压即可

    tar -zxvf tempo_2.2.3_linux_amd64.tar.gz

    配置

    在安装的目录下,创建:tempo-config.yml

    vim tempo-config.yml

    并配置文件内容如下:

    1. # http监听端口
    2. server:
    3. http_listen_port: 3200
    4. # 支持otlp协议数据的本地接收器http和grpc端口,分别默认为43184317
    5. distributor:
    6. receivers: # This configuration will listen on all ports and protocols that tempo is capable of.
    7. otlp:
    8. protocols:
    9. http: # default = 0.0.0.0:4318 http protocol
    10. endpoint: localhost:4318
    11. grpc: # default = 0.0.0.0:4317 http protocol
    12. endpoint: localhost:4317
    13. # 数据压缩存储有效期48小时
    14. compactor:
    15. compaction:
    16. block_retention: 48h # configure total trace retention here (Default is 14 days (336h))
    17. # 可观测性数据的指标存储配置
    18. metrics_generator:
    19. registry:
    20. external_labels:
    21. source: tempo
    22. cluster: linux-microservices
    23. storage:
    24. path: /tmp/tempo/generator/wal
    25. remote_write:
    26. - url: http://localhost:9090/api/v1/write
    27. send_exemplars: true
    28. # 支持多种存储方式,如:s3、local等
    29. storage:
    30. trace:
    31. backend: local # 本地存储
    32. #s3:
    33. # endpoint: s3.us-east-1.amazonaws.com
    34. # bucket: grafana-traces-data
    35. # forcepathstyle: true
    36. # #set to true if endpoint is https
    37. # insecure: true
    38. # access_key: # TODO - Add S3 access key
    39. # secret_key: # TODO - Add S3 secret key
    40. wal:
    41. path: /tmp/tempo/wal # where to store the the wal locally
    42. local:
    43. path: /tmp/tempo/blocks # 数据存储目录
    44. # 指标类型配置
    45. overrides:
    46. metrics_generator_processors: [service-graphs, span-metrics]

    启动

    1. # run tempo
    2. nohup ./tempo --config.file=./tempo-config.yml > log.out 2>&1 &

    Prometheus

    简介

    Prometheus 是云原生计算基金会项目,是一个系统和服务监控系统。它以给定的时间间隔从配置的目标收集指标,评估规则表达式,显示结果,并可以在观察到指定条件时触发警报。

    Prometheus监控系统包括丰富的多维数据模型、简洁而强大的PromQL查询语言、高效的嵌入式时间序列数据库以及与第三方系统的150多个集成

    Prometheus 与其他指标和监控系统的区别在于:

    • 多维数据模型(由指标名称和键/值维度集定义的时间序列)
    • PromQL,一种强大而灵活的查询语言,可以利用这种维度
    • 不依赖分布式存储;单个服务器节点是自治的
    • 用于时间序列收集的HTTP拉模型
    • 通过批处理作业的中间网关支持推送时间序列
    • 通过服务发现或静态配置发现目标
    • 多种图形和仪表板支持模式
    • 支持分层和水平联合

    安装

    https://github.com/prometheus/prometheus/releases/download/v2.47.0/prometheus-2.47.0.linux-amd64.tar.gz

    直接解压即可

    ​tar -zxvf prometheus-2.47.0.linux-amd64.tar.gz

    配置

    在安装的目录下,已存在:prometheus.yml,默认安装下无需变更

    1. # my global config
    2. global:
    3. scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
    4. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
    5. # scrape_timeout is set to the global default (10s).
    6. # Alertmanager configuration
    7. alerting:
    8. alertmanagers:
    9. - static_configs:
    10. - targets:
    11. # - alertmanager:9093
    12. # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
    13. rule_files:
    14. # - "first_rules.yml"
    15. # - "second_rules.yml"
    16. # A scrape configuration containing exactly one endpoint to scrape:
    17. # Here it's Prometheus itself.
    18. scrape_configs:
    19. # The job name is added as a label `job=` to any timeseries scraped from this config.
    20. - job_name: "prometheus"
    21. # metrics_path defaults to '/metrics'
    22. # scheme defaults to 'http'.
    23. static_configs:
    24. - targets: ["localhost:9090"]

    启动

    1. # run prometheus & tsdb data timeout 2 day
    2. nohup ./prometheus --config.file=./prometheus.yml --storage.tsdb.retention.time=2d --web.enable-remote-write-receiver > log.out 2>&1 &

    启动参数说明

    • --storage.tsdb.retention.time=2d 默认tsdb存储数据是15天,按需更改即可
    • --web.enable-remote-write-receiver 表示启用远程写入服务,支持第三方组件推送并写入远程数据

    其它命令参数可通过./prometheus -h 查看帮助信息

    Grafana

    简介

    Grafana 开源是开源可视化和分析软件。它允许您查询、可视化、警报和探索您的指标、日志和跟踪,无论它们存储在何处。它为您提供了将时间序列数据库 (TSDB) 数据转换为富有洞察力的图表和可视化的工具。

    Grafana支持非常多的数据源,同时又有强大的可视化、告警等非常强大的功能,因此在数据分析、指标追踪和数据查询等方面,需多的公司在运维指标、日志分析、大屏展示等有实际应用;在项目监控、运维、服务器指标等业务上,是一个强大可靠的分析平台;

    安装

    wget https://dl.grafana.com/enterprise/release/grafana-enterprise-10.1.2.linux-amd64.tar.gz

    直接解压即可

    tar -zxvf grafana-enterprise-10.1.2.linux-amd64.tar.gz

    启动

    1. #start grafana server
    2. nohup ./grafana-server > /tmp/null 2>&1 &

    配置Prometheus

    配置Loki

    在数据源中对派生字段进行配置

    Derive fields

    • name:TraceID //字段名称
    • Regex:((?:traceID|trace_id)=(\w+)) // 正则提取规则
    • Query:${__value.raw} //Grafana内置字段,表示Loki日志中查询的数据行对象
    • Internal link: Tempo //内置链接,当数据带有TraceID日志链路跟踪ID时,会出现一个"Tempo“按钮,可直接跳转到Tempo跟踪链接数据展示模块;

    配置Tempo

    核心配置

    HTTP

    Trace to logs

    • Data source: Loki
    • Span start time shift: -5m //用于Tempo中通过TraceID查询loki日志用,开始时间前移5分钟
    • Span end time shift: 1h /用于Tempo中通过TraceID查询loki日志用,结束时间前移1小时
    • Use custom query: 开启
    • Query: {job="${__span.tags["service.name"]}"} |= "${__trace.traceId}" //job名称是loki中日志里的标签,通过agent采集器配置上传

    注:Query自定义变量,__trace.traceId为跟踪ID,service.name为通过opentelemetry配置采集的otel.service.name值,如:-javaagent:./opentelemetry-javaagent.jar -Dotel.service.name=test_demo

    自定义变量,参见文档:Traces | Grafana Cloud documentation

    TraceID查询Loki日志时间配置用法,如:假设日志打印时间为2023-01-01 10:05:00,应用-5m和1h配置后,点击TraceId跳转到Loki中查询时,将时间范围变更为:2023-01-01 10:00:00到2023-01-01 11:05:00;其中的开始时前移5分钟,此处根据业务需要配置,通常查一个埋点位置前后30分钟内的就足够了(前分分别设置-30m和30m);

    Service graph

    • Data source: Prometheus

    Loki search

    • Data source: Loki

    TraceID query

    • Use time range in query: 开启
    • Time shift for start of search: 30m
    • Tiime shift for end of search: 30m

    注意事项

    在配置数据源过程中,有些Data source选项依赖另一个来源,如果此时Data source无此数据源,可以先默认不选择,待所有Data source安装完毕后,再重新修改数据配置;如:Tempo中的Trece To Logs依赖Loki,如果先安装Tempo,后安装Loki,那么在Tempo此配置中无法找到Loki选项,待Loki安装后,再返回修改Tempo配置即可;

    Agent

    简介

    Grafana Agent 是一个独立、支持多节点的数据收集器。它的设计灵活、高性能,并且与 Prometheus 和 OpenTelemetry 等多个生态系统兼容。

    Grafana Agent由以下几个子系统模块组成:

    • 指标 子系统围绕 Prometheus 收集 Prometheus 指标并通过 Prometheusremote_write协议转发它们。
    • 日志子系统围绕 Grafana Promtail 收集日志并将其转发给 Grafana Loki。
    • 跟踪子系统围绕OpenTelemetry Collector,用于收集跟踪并将其转发到 Grafana Tempo 或任何与 OpenTelemetry 兼容的端点。

    安装

    https://github.com/grafana/agent/releases/download/v0.36.1/grafana-agent-linux-amd64.zip

    直接解压即可

    1. unzip grafana-agent-linux-amd64.zip

    配置

    在安装的目录下,创建:agent-config.yml

    vim agent-config.yml

    并配置文件内容如下:

    1. # 本地agent的日志打印级别
    2. server:
    3. log_level: info
    4. # 抓取指标,完全兼容prometeus
    5. metrics:
    6. global:
    7. scrape_interval: 1m
    8. remote_write:
    9. # 推送到prometeus服务的地址,注:prometeus需启用--web.enable-remote-write-receiver
    10. - url: http://192.168.1.3:9090/api/v1/write
    11. configs:
    12. - name: default
    13. scrape_configs:
    14. - job_name: agent
    15. static_configs:
    16. - targets: ['127.0.0.1:12345']
    17. # loki日志代理采集配置,完全兼容Promtail配置
    18. logs:
    19. configs:
    20. - name: default
    21. positions:
    22. filename: /tmp/agent/positions.yaml
    23. scrape_configs:
    24. - job_name: varlogs
    25. static_configs:
    26. - targets: [localhost]
    27. labels:
    28. job: varlogs
    29. __path__: /data/log/catalina.log
    30. clients:
    31. - url: http://192.168.1.3:3100/loki/api/v1/push
    32. # trace 链路追踪配置(可观察性)
    33. traces:
    34. configs:
    35. - name: default
    36. # 代理接收其它应用的traces数据,替代opentelemetry-collector接收器
    37. receivers:
    38. jaeger:
    39. protocols:
    40. grpc: # listens on the default jaeger grpc port: 14250
    41. otlp:
    42. protocols:
    43. http: # default = 0.0.0.0:4318 http protocol
    44. endpoint: 0.0.0.0:14318
    45. grpc: # default = 0.0.0.0:4317 grpc protocol
    46. endpoint: 0.0.0.0:14317
    47. # 将otlp数据发送到远程服务
    48. remote_write:
    49. - endpoint: 192.168.1.3:4317
    50. insecure: true # only add this if TLS is not required
    51. batch:
    52. timeout: 5s
    53. send_batch_size: 100
    54. automatic_logging:
    55. backend: stdout
    56. #backend: logs_instance
    57. #logs_instance_name: default
    58. roots: true
    59. service_graphs:
    60. enabled: true
    61. # 节点指标配置,用于采集中间件的模块配置
    62. integrations:
    63. agent:
    64. enabled: true
    65. # linux采集指标
    66. node_exporter:
    67. enabled: true
    68. disable_collectors: # 禁用一些高基数的指标
    69. - ipvs
    70. - btrfs
    71. - infiniband
    72. - xfs
    73. - zfs
    74. # windows采集指标
    75. # windows_exporter:
    76. # enabled: true
    77. # # 采集部份指标
    78. # enabled_collectors: "cpu,cs,logical_disk,net,os,service,system,tcp,process"

    启动

    1. # run agent
    2. nohup ./grafana-agent-linux-amd64 --config.file=agent-config.yml > /tmp/null 2>&1 &

    注意:本文后续演示示例部份,将在windows环境下安装Agent代理,实际和linux环境上的使用与配置一样

    注意事项

    Agent支持非常多服务指标采集,如:mysql,kafka,mogodb,linux,wdinwos等节点或服务指标采集,在windows下的默认采集指标非常多,可以通过部署日志查看,也可以通过官方文档查找对应的配置说明

    ts=2023-09-19T11:52:28.1277995Z caller=windows_exporter_windows.go:43 level=info integration=windows_exporter msg="enabled windows_exporter collectors" collectors=ad,adcs,adfs,cache,container,cpu,cpu_info,cs,dfsr,dhcp,diskdrive,dns,exchange,fsrmquota,hyperv,iis,logical_disk,logon,memory,mscluster_cluster,mscluster_network,mscluster_node,mscluster_resource,mscluster_resourcegroup,msmq,mssql,net,netframework_clrexceptions,netframework_clrinterop,netframework_clrjit,netframework_clrloading,netframework_clrlocksandthreads,netframework_clrmemory,netframework_clrremoting,netframework_clrsecurity,os,process,remote_fx,scheduled_task,service,smtp,system,tcp,teradici_pcoip,terminal_services,textfile,thermalzone,time,vmware,vmware_blast

    其中很多高基数指标,可以根据业务需要,采集部份指标即可

    enabled_collectors: "cpu,cs,logical_disk,net,os,service,system,tcp,process"

    示例

    SpringBoot工程

    创建一个Java演示工具,用于采集应用的日志、监控数据等;以springCloud项目为例;

    • 项目:TraceCloud
    • 子模块:customer,gateway,producer
    • Spring框架:springBoot 3.1.3 和 springCloud 2022.0.4
    • JDK:17+
    • Mysql: 8.0+

    工程是通过spring官方的 spring initializr页面建的;

    工程代码就不单独贴了,我上传到GitCode里,自行下载下来看吧

    GitCode下载地址:不会飞的小龙人 / TraceCloud · GitCode

    Agnet配置

    此段内容前面的Agent下载安装,是以linux环境为例,为了配合本地电脑的IDEA开发与调试,本章节以windows下的Grafana Agent为例,文章前面描述的agent-config.yml配置则可以通用,和操作平台无关;

    在Github的grafana agent项目的相同打包界面,下载windows版本解压即可使用;

    我们对前面的Agent配置进行更改,修改为抓取当前演示工程的日志。无需更改metrics和traces(注意IP和端口,根据实际服务部署修改),主要更改 logs 配置项,并去掉integrations.node_exporter配置,保留只采集windows节点指标,改动如下:

    1. #...略
    2. # loki日志代理采集配置,完全兼容Promtail配置
    3. logs:
    4. configs:
    5. - name: default
    6. positions:
    7. filename: /tmp/agent/positions.yaml
    8. scrape_configs:
    9. - job_name: customer
    10. static_configs:
    11. - targets: [localhost]
    12. labels:
    13. group: traceCloud
    14. job: customer
    15. __path__: D:\Workspaces\TraceCloud\logs\customer-info.log
    16. - job_name: gateway
    17. static_configs:
    18. - targets: [localhost]
    19. labels:
    20. group: traceCloud
    21. job: gateway
    22. __path__: D:\Workspaces\TraceCloud\logs\gateway-info.log
    23. - job_name: producer
    24. static_configs:
    25. - targets: [localhost]
    26. labels:
    27. group: traceCloud
    28. job: producer
    29. __path__: D:\Workspaces\TraceCloud\logs\producer-info.log
    30. clients:
    31. - url: http://192.168.1.3:3100/loki/api/v1/push
    32. # 节点指标配置,用于采集中间件的模块配置
    33. integrations:
    34. agent:
    35. enabled: true
    36. # windows采集指标
    37. windows_exporter:
    38. enabled: true
    39. # 采集部份指标
    40. enabled_collectors: "cpu,cs,logical_disk,net,os,service,system,tcp,process"
    41. # ...略

    cmd命令行启动

    grafana-agent-windows-amd64.exe --config.file=agent-config.yml

    opentelemetry探针

    介绍

    OpenTelemetry是CNCF的一个可观测性项目,旨在提供可观测性领域的标准化方案,解决观测数据的数据模型、采集、处理、导出等的标准化问题。

    OpenTelemetry是工具、API 和 SDK 的集合。使用它来检测、生成、收集和导出遥测数据(指标、日志和跟踪),以帮助您分析软件的性能和行为。

    OpenTelemetry在Java语言领域采用javaagent探针注入并收集应用程序的数据;javaagent是基于Java字节码进行操作的一种探针技术,使得javaagent可以在JVM执行编译的字节码程序之前进行动态修改;

    而OpenTelemetry-javaagent.jar就是基于探针技术而实际,因此可以非常方便的在Java应用程序的打印日志中配置TraceID和SpanID数据注入。

    下载

    https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v1.29.0/opentelemetry-javaagent.jar

    启动配置

    本地以IDEA环境运行,使用opentelemetry-javaagent.jar需要配置到本地IDEA的Run/Debug Configurations里,在VM options参数里加入;

    producer配置

    -javaagent:D:\\test\\opentelemetry-javaagent.jar -Dotel.service.name=producer -Dotel.traces.exporter=otlp -Dotel.exporter.otlp.endpoint=http://localhost:14317 -Dotel.metrics.exporter=none -Dotel.exporter.otlp.insecure=true

    gateway配置

    -javaagent:D:\\test\\opentelemetry-javaagent.jar -Dotel.service.name=gateway -Dotel.traces.exporter=otlp -Dotel.exporter.otlp.endpoint=http://localhost:14317 -Dotel.metrics.exporter=none -Dotel.exporter.otlp.insecure=true

    customer配置

    -javaagent:D:\\test\\opentelemetry-javaagent.jar -Dotel.service.name=customer -Dotel.traces.exporter=otlp -Dotel.exporter.otlp.endpoint=http://localhost:14317 -Dotel.metrics.exporter=none -Dotel.exporter.otlp.insecure=true

    配置日志跟踪ID

    TraceId为日志打印过程中的重要跟踪ID,有的人称为日志埋点ID,表示一次请求事件中,此TraceId会在当前线程执行过程中,出现在日志打印里,如果当前服务有调用下一个http请求,则opentelemetry-javaagent.jar已经适配了多种http请求组件,如:okHttp、apache-httpclient等,会将该TraceId写入请求头部,带到下一个服务中,下一个服务如使用了opentelemetry-javaagent.jar代理的探针模式,会捕获此TraceId继续在此服务日志中打印,从而通过此跟踪ID形成一个完整的请求事件到下游服务之间的链路唯一标识ID;后续通过loki和tempo可以很方便的查询到所有和该TraceId相关的日志与监控数据;

    因此在log4j2或springboot默认logging配置里添加 traceID=%X{trace_id} 到日志格式中就行,traceID也是我们在Grafana上集成loki时的伪链接重要查询参数,详情可以看上面的"配置Loki"集成;

    log4j2配置

    "LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %level traceID=%X{trace_id} [%thread] [%class{36}:%L] - %msg%xEx%n

    SpringBoot默认日志配置

    注:customer、gateway、producer三个模块的application.yml中分别都需添加

    1. # 配置日志
    2. logging:
    3. level:
    4. reactor.util: info
    5. org.springframework.boot: info
    6. pattern:
    7. file: "%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } traceID=%X{trace_id} --- [%t] %-40.40logger{39} : %m%n%wEx"
    8. console: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(traceID=%X{trace_id}){cyan} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx"
    9. file:
    10. # 注意name名,根据不同的模块更改日志文件名称
    11. name: ./logs/producer-info.log

    完成上述所有操作和配置后,分别启动customer、gateway、producer三个模块入口程序 XXXXCloudApplication.java,让演示服务保持在线;

    HTTP请求

    从浏览器中向customer服务发起Http请求,请求ULR:http://127.0.0.1:8083/api/customer

    经过上述从浏览器》消费者》网关》生产者一个请求链路,最终获得生产者提供的数据,如下:

    控制台日志打印

    完成上面一环节点消费者的http请求后,IDEA中三个服务的控制台分别打印了此次请求的日志信息;

    消费者(customer)

    2023-09-20 11:36:58.593 - INFO 32276 traceID=6fbb0d7230d12c30ed0757ceae560c59 --- [ctor-http-nio-3] c.t.customer.CustomerCloudApplication : http request customer ...

    网关(gateway)

    2023-09-20 11:36:58.942 - INFO 35184 traceID=6fbb0d7230d12c30ed0757ceae560c59 --- [ctor-http-nio-2] c.t.gateway.filter.RouteLogFilter : route customer to producer,route id: producer, http request url http://127.0.0.1:8081/api/producer

    生产者(producer)

    2023-09-20 11:36:59.294 - INFO 16496 traceID=6fbb0d7230d12c30ed0757ceae560c59 --- [ctor-http-nio-2] c.t.producer.ProducerCloudApplication : http request producer ...

    发现三个服务的TraceID一致,traceID=6fbb0d7230d12c30ed0757ceae560c59 ; 表示此traceID为本次请求的追踪过程的唯一标识ID;

    日志搜索

    在“Grafana》Explore》Loki”中搜索日志,其中的自定义标签已正常加载,默认搜索:group=traceCloud,job=customer

    链路跟踪

    点击Loki中搜索的日志行(注意:需要带traceID=xxxx的行),展开区域中有一个Tempo按钮,点击Tempo按钮,打开Tempo链路跟踪分屏页,完整的显示了当前“消费者》网关》生产者” 全流程的请求链路和耗时信息;

    可能点击Tempo分屏页中的Service&Operation列表中的任务节点,点击展示区域的"Logs for this span"可以继续通过此点节信息返回到Loki中查询日志信息;点击后展示如下:

    可以通过“Grafana》Explore》Tempo”中的Search功能,查询Agent上报给Tempo跟踪ID(TraceID)来查询详细链路请求和耗时信息;

    可以通过“Grafana》Explore》Tempo”中的Service Graph功能,查询节点之前的请求拓扑关系结构,显示一个请求在多个服务之间的调用路线;

    服务指标

    查询监控节点的CPU使用率;

    100 / sum(rate(windows_cpu_time_total{agent_hostname="xxx-windows"}[2m])) * sum(rate(windows_cpu_time_total{agent_hostname="xxx-windows", mode="privileged"}[2m]))

    在“Grafana》Explore》Prometheus”中,切换到Code模块下查询;

    总结

    本文描述的快速搭建日志链路监控平台的整个过程就结束了,通过本文能够快速了解到日志链路监控平台的作用和配置使用过程;增加程序开发人员和系统运维人员,对应用服务的请求过程和日志查询、性能监控等分析能力,也提升了线上故障快速排错与性能瓶颈定位能力;同时保障服务的可靠性、安全性,以及工具化管理服务,减少生产服务器环境上排查问题的操作风险;

    参考或后续方案

    SpringBoot+Prometheus采集Metrics指标数据

    SpringBoot+Prometheus采集Metrics指标数据_prometheus采集数据_不会飞的小龙人的博客-CSDN博客

    Loki 日志块使用 MinIO 对象存储

    Loki 日志块使用 MinIO 对象存储_minio 日志_不会飞的小龙人的博客-CSDN博客

    共享仪表盘

    Dashboards | Grafana Labs

    grafana官方文档

    What's new in Grafana | Grafana documentation

    Tempo官方文档

    Tempo data source | Grafana documentation

    tempo官方完整配置

    https://github.com/grafana/intro-to-mltp/blob/main/tempo/tempo.yaml

  • 相关阅读:
    出海有“云”!华为云全球加速助力跨国企业提升网络体验
    【LeetCode第115场双周赛】100029. 和带限制的子多重集合的数目 | 前缀和背包 | 中等
    Java—File
    Python selenium爬取影评生成词云图
    MLX90640 红外热成像传感器测温模块开发笔记(三)
    mybatis—plus
    【sw网络监控】通过snmp协议相关的snmp-exporter(收集交换机网络监控数据)+ promethus + grafana
    docker命令
    go语言学习
    JavaWeb面试
  • 原文地址:https://blog.csdn.net/jilo88/article/details/133099856