可观测性是指通过从各种IT服务或组件中收集并积累监控数据、系统日志、运行指标等数据,来了解当前系统或应用程序整个架构服务的当前状态,通过可指标化或图形化监视、查看整个系统服务的任意节点、任意时间期间的运行结果,从而对系统服务的运行健康状况有全面的了解与把控;
通过跟踪ID或在分布式系统(尤其是容器化应用程序或微服务架构)的所有节点中,追踪请求到响应的整个过程,并通过技术手段收集整个过程中的日志、指标、Trace等数据,形成一个完整的数据链路,从而为可观测性分析与展示提供基础数据。
通过可观测性指标的跟踪,可以快速分析和观察系统,从而轻松发现系统故障、性能瓶颈、节点互连等问题,确保服务的可靠、性能和安全等。也是现在IT业务建设过程中,必不可少的运维与监控技术方案之一;
推荐一篇好文章,快速了解可观测性:初学指南:什么是可观测性? - 知乎
虚拟主机linux * 1 ,ip: 192.168.1.xxx(内网) ,配置:8核 * 16G * 200G硬盘
Grafana、Loki、Tempo、Prometheus等非集群模式,全部单实例部署
注意:本文除了IDEA开发环境外,所有服务均安装在此虚拟主机上;
简介
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
并配置文件内容如下:
- # 不开启鉴权
- auth_enabled: false
-
- # http和grpc端口
- server:
- http_listen_port: 3100
- grpc_listen_port: 9096
-
- # 数据索引和块存储配置
- common:
- path_prefix: /tmp/loki
- storage:
- filesystem:
- chunks_directory: /tmp/loki/chunks
- rules_directory: /tmp/loki/rules
- replication_factor: 1
- ring:
- instance_addr: 127.0.0.1
- kvstore:
- store: inmemory
-
- # 缓存管理
- query_range:
- results_cache:
- cache:
- embedded_cache:
- enabled: false
-
- # 数据存储管理
- schema_config:
- configs:
- - from: 2023-09-01
- store: boltdb-shipper
- object_store: filesystem
- schema: v11
- index:
- prefix: index_
- period: 24h
-
- # 告警推送接口
- #ruler:
- # alertmanager_url: http://localhost:9093
-
- # 数据块的存储策略
- chunk_store_config:
- max_look_back_period: 240h
-
- # 保存创建数据索引和块等信息的表存储策略
- table_manager:
- retention_deletes_enabled: true
- retention_period: 240h
-
- # 数据块压缩配置
- compactor:
- working_directory: /tmp/loki/retention
- shared_store: filesystem
- compaction_interval: 10m
- retention_enabled: true
- retention_delete_delay: 2h
- retention_delete_worker_count: 150
启动
- # run loki
- nohup ./loki-linux-amd64 --config.file=loki-config.yml > /tmp/null 2>&1 &
简介
Grafana Tempo 是一个开源、易于使用且大容量的分布式链路跟踪后端(Trace)。Tempo可将数据存储在对象存储或本地文件中。
Tempo 与 Grafana、Mimir、Prometheus 和 Loki 深度集成。可以将 Tempo 与开源跟踪协议结合使用: Jaeger、Zipkin 或 OpenTelemetry。
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
并配置文件内容如下:
- # http监听端口
- server:
- http_listen_port: 3200
-
- # 支持otlp协议数据的本地接收器http和grpc端口,分别默认为4318和4317
- distributor:
- receivers: # This configuration will listen on all ports and protocols that tempo is capable of.
- otlp:
- protocols:
- http: # default = 0.0.0.0:4318 http protocol
- endpoint: localhost:4318
- grpc: # default = 0.0.0.0:4317 http protocol
- endpoint: localhost:4317
-
- # 数据压缩存储有效期48小时
- compactor:
- compaction:
- block_retention: 48h # configure total trace retention here (Default is 14 days (336h))
-
- # 可观测性数据的指标存储配置
- metrics_generator:
- registry:
- external_labels:
- source: tempo
- cluster: linux-microservices
- storage:
- path: /tmp/tempo/generator/wal
- remote_write:
- - url: http://localhost:9090/api/v1/write
- send_exemplars: true
-
- # 支持多种存储方式,如:s3、local等
- storage:
- trace:
- backend: local # 本地存储
- #s3:
- # endpoint: s3.us-east-1.amazonaws.com
- # bucket: grafana-traces-data
- # forcepathstyle: true
- # #set to true if endpoint is https
- # insecure: true
- # access_key: # TODO - Add S3 access key
- # secret_key: # TODO - Add S3 secret key
- wal:
- path: /tmp/tempo/wal # where to store the the wal locally
- local:
- path: /tmp/tempo/blocks # 数据存储目录
-
- # 指标类型配置
- overrides:
- metrics_generator_processors: [service-graphs, span-metrics]
启动
- # run tempo
- nohup ./tempo --config.file=./tempo-config.yml > log.out 2>&1 &
简介
Prometheus 是云原生计算基金会项目,是一个系统和服务监控系统。它以给定的时间间隔从配置的目标收集指标,评估规则表达式,显示结果,并可以在观察到指定条件时触发警报。
Prometheus监控系统包括丰富的多维数据模型、简洁而强大的PromQL查询语言、高效的嵌入式时间序列数据库以及与第三方系统的150多个集成
Prometheus 与其他指标和监控系统的区别在于:
安装
直接解压即可
tar -zxvf prometheus-2.47.0.linux-amd64.tar.gz
配置
在安装的目录下,已存在:prometheus.yml,默认安装下无需变更
- # my global config
- global:
- scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
- evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
- # scrape_timeout is set to the global default (10s).
-
- # Alertmanager configuration
- alerting:
- alertmanagers:
- - static_configs:
- - targets:
- # - alertmanager:9093
-
- # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
- rule_files:
- # - "first_rules.yml"
- # - "second_rules.yml"
-
- # A scrape configuration containing exactly one endpoint to scrape:
- # Here it's Prometheus itself.
- scrape_configs:
- # The job name is added as a label `job=
` to any timeseries scraped from this config. - - job_name: "prometheus"
-
- # metrics_path defaults to '/metrics'
- # scheme defaults to 'http'.
-
- static_configs:
- - targets: ["localhost:9090"]
启动
- # run prometheus & tsdb data timeout 2 day
- nohup ./prometheus --config.file=./prometheus.yml --storage.tsdb.retention.time=2d --web.enable-remote-write-receiver > log.out 2>&1 &
启动参数说明
其它命令参数可通过./prometheus -h 查看帮助信息
简介
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
启动
- #start grafana server
- nohup ./grafana-server > /tmp/null 2>&1 &
在数据源中对派生字段进行配置
Derive fields
核心配置
HTTP
Trace to logs
注: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
Loki search
TraceID query
在配置数据源过程中,有些Data source选项依赖另一个来源,如果此时Data source无此数据源,可以先默认不选择,待所有Data source安装完毕后,再重新修改数据配置;如:Tempo中的Trece To Logs依赖Loki,如果先安装Tempo,后安装Loki,那么在Tempo此配置中无法找到Loki选项,待Loki安装后,再返回修改Tempo配置即可;
简介
Grafana Agent 是一个独立、支持多节点的数据收集器。它的设计灵活、高性能,并且与 Prometheus 和 OpenTelemetry 等多个生态系统兼容。
Grafana Agent由以下几个子系统模块组成:
安装
https://github.com/grafana/agent/releases/download/v0.36.1/grafana-agent-linux-amd64.zip
直接解压即可
-
- unzip grafana-agent-linux-amd64.zip
配置
在安装的目录下,创建:agent-config.yml
vim agent-config.yml
并配置文件内容如下:
- # 本地agent的日志打印级别
- server:
- log_level: info
-
- # 抓取指标,完全兼容prometeus
- metrics:
- global:
- scrape_interval: 1m
- remote_write:
- # 推送到prometeus服务的地址,注:prometeus需启用--web.enable-remote-write-receiver
- - url: http://192.168.1.3:9090/api/v1/write
- configs:
- - name: default
- scrape_configs:
- - job_name: agent
- static_configs:
- - targets: ['127.0.0.1:12345']
-
- # loki日志代理采集配置,完全兼容Promtail配置
- logs:
- configs:
- - name: default
- positions:
- filename: /tmp/agent/positions.yaml
- scrape_configs:
- - job_name: varlogs
- static_configs:
- - targets: [localhost]
- labels:
- job: varlogs
- __path__: /data/log/catalina.log
- clients:
- - url: http://192.168.1.3:3100/loki/api/v1/push
-
- # trace 链路追踪配置(可观察性)
- traces:
- configs:
- - name: default
- # 代理接收其它应用的traces数据,替代opentelemetry-collector接收器
- receivers:
- jaeger:
- protocols:
- grpc: # listens on the default jaeger grpc port: 14250
- otlp:
- protocols:
- http: # default = 0.0.0.0:4318 http protocol
- endpoint: 0.0.0.0:14318
- grpc: # default = 0.0.0.0:4317 grpc protocol
- endpoint: 0.0.0.0:14317
- # 将otlp数据发送到远程服务
- remote_write:
- - endpoint: 192.168.1.3:4317
- insecure: true # only add this if TLS is not required
- batch:
- timeout: 5s
- send_batch_size: 100
- automatic_logging:
- backend: stdout
- #backend: logs_instance
- #logs_instance_name: default
- roots: true
- service_graphs:
- enabled: true
-
- # 节点指标配置,用于采集中间件的模块配置
- integrations:
- agent:
- enabled: true
- # linux采集指标
- node_exporter:
- enabled: true
- disable_collectors: # 禁用一些高基数的指标
- - ipvs
- - btrfs
- - infiniband
- - xfs
- - zfs
- # windows采集指标
- # windows_exporter:
- # enabled: true
- # # 采集部份指标
- # enabled_collectors: "cpu,cs,logical_disk,net,os,service,system,tcp,process"
启动
- # run agent
- 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"
创建一个Java演示工具,用于采集应用的日志、监控数据等;以springCloud项目为例;
工程是通过spring官方的 spring initializr页面建的;
工程代码就不单独贴了,我上传到GitCode里,自行下载下来看吧
GitCode下载地址:不会飞的小龙人 / TraceCloud · GitCode
此段内容前面的Agent下载安装,是以linux环境为例,为了配合本地电脑的IDEA开发与调试,本章节以windows下的Grafana Agent为例,文章前面描述的agent-config.yml配置则可以通用,和操作平台无关;
在Github的grafana agent项目的相同打包界面,下载windows版本解压即可使用;
我们对前面的Agent配置进行更改,修改为抓取当前演示工程的日志。无需更改metrics和traces(注意IP和端口,根据实际服务部署修改),主要更改 logs 配置项,并去掉integrations.node_exporter配置,保留只采集windows节点指标,改动如下:
- #...略
- # loki日志代理采集配置,完全兼容Promtail配置
- logs:
- configs:
- - name: default
- positions:
- filename: /tmp/agent/positions.yaml
- scrape_configs:
- - job_name: customer
- static_configs:
- - targets: [localhost]
- labels:
- group: traceCloud
- job: customer
- __path__: D:\Workspaces\TraceCloud\logs\customer-info.log
- - job_name: gateway
- static_configs:
- - targets: [localhost]
- labels:
- group: traceCloud
- job: gateway
- __path__: D:\Workspaces\TraceCloud\logs\gateway-info.log
- - job_name: producer
- static_configs:
- - targets: [localhost]
- labels:
- group: traceCloud
- job: producer
- __path__: D:\Workspaces\TraceCloud\logs\producer-info.log
- clients:
- - url: http://192.168.1.3:3100/loki/api/v1/push
-
- # 节点指标配置,用于采集中间件的模块配置
- integrations:
- agent:
- enabled: true
- # windows采集指标
- windows_exporter:
- enabled: true
- # 采集部份指标
- enabled_collectors: "cpu,cs,logical_disk,net,os,service,system,tcp,process"
- # ...略
cmd命令行启动
grafana-agent-windows-amd64.exe --config.file=agent-config.yml
介绍
OpenTelemetry是CNCF的一个可观测性项目,旨在提供可观测性领域的标准化方案,解决观测数据的数据模型、采集、处理、导出等的标准化问题。
OpenTelemetry是工具、API 和 SDK 的集合。使用它来检测、生成、收集和导出遥测数据(指标、日志和跟踪),以帮助您分析软件的性能和行为。
OpenTelemetry在Java语言领域采用javaagent探针注入并收集应用程序的数据;javaagent是基于Java字节码进行操作的一种探针技术,使得javaagent可以在JVM执行编译的字节码程序之前进行动态修改;
而OpenTelemetry-javaagent.jar就是基于探针技术而实际,因此可以非常方便的在Java应用程序的打印日志中配置TraceID和SpanID数据注入。
下载
启动配置
本地以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中分别都需添加
- # 配置日志
- logging:
- level:
- reactor.util: info
- org.springframework.boot: info
- pattern:
- 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"
- 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"
- file:
- # 注意name名,根据不同的模块更改日志文件名称
- name: ./logs/producer-info.log
完成上述所有操作和配置后,分别启动customer、gateway、producer三个模块入口程序 XXXXCloudApplication.java,让演示服务保持在线;
从浏览器中向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博客
共享仪表盘
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