新聞中心
背景
OpenTelemetry 簡介
OpenTelemetry[1] (以下簡稱 Otel)是一個開源項目,旨在為分布式追蹤、度量和日志提供統(tǒng)一的標準,簡化應用程序的觀測性(Observability)。它提供了一系列工具和 API,用于收集和傳輸應用程序的性能數(shù)據(jù)和日志,幫助開發(fā)者和運維團隊更好地理解系統(tǒng)的行為。功能包括自動和手動檢測應用程序的追蹤數(shù)據(jù),收集關鍵度量指標,以及捕獲和傳輸日志。Otel 支持多種編程語言和框架,可以與多個后端系統(tǒng)集成,如 Prometheus、Jaeger、Elasticsearch 等。

創(chuàng)新互聯(lián)是一家專業(yè)提供惠東企業(yè)網(wǎng)站建設,專注與網(wǎng)站設計制作、成都網(wǎng)站設計、html5、小程序制作等業(yè)務。10年已為惠東眾多企業(yè)、政府機構(gòu)等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進行中。
Log 是 OpenTelemetry 項目的一部分,旨在提供一種標準化的方式來收集、傳輸和存儲日志數(shù)據(jù)。
Loki 簡介
Loki[2] 是 Grafana Labs[3] 開發(fā)的一個水平可擴展、高可用性、多租戶的日志聚合系統(tǒng),專為效率和易用性而設計。與傳統(tǒng)的日志聚合系統(tǒng)不同,Loki 主要索引日志內(nèi)容的元數(shù)據(jù)而不是內(nèi)容本身,這使得它既輕量又高效。Loki 采用了與 Prometheus[4] 類似的標簽系統(tǒng),使得日志查詢更加靈活和強大。常用于存儲和查詢大量日志數(shù)據(jù),特別是與 Grafana 結(jié)合使用時,提供了強大的日志可視化和分析能力。
演示
在本演示中將使用 Java 應用進行日志閉環(huán)操作的演示,在 Otel Log 支持的語言[5] 中,Java 是的最全面的語言之一。
架構(gòu)
圖片
- Otel Operator 通過自動插樁的配置,為 Java 工作負載安裝探針并加載配置
- 應用通過 otlp 端點上報日志到 Otel collector
- Otel collector 將日志輸出到 Loki
- grafana 將 Loki 作為數(shù)據(jù)源進行日志的可視化展示
前置條件
- 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: false
commonConfig:
replication_factor: 1
storage:
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 jsnotallow='{.items[0].metadata.name}')"
kubectl --namespace default port-forward $POD_NAME 3000在 Grafana 中配置 Loki 數(shù)據(jù)源,指向上面部署 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執(zhí)行下面命令安裝 Otel Operator
kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml配置 Instrumentation
成功安裝 Otel Operator 之后,接下來就是配置探針的安裝和配置了,詳細的配置說明,可以參考 Instrumentation API 文檔[6]。
Instrumentation 是 Otel Operator 的另一個 CRD,用于自動安裝 Otel 探針和配置。本演示雖然主要聚焦在日志,但我們依然保留了之前使用的分布式跟蹤的配置,保證鏈路信息的傳遞。
- propagators 用于配置跟蹤信息在上下文的傳遞方式。
- sampler 采樣器
- env 和 [language].env 添加到容器的環(huán)境變量
針對 Java 應用,通過環(huán)境變量 OTEL_EXPORTER_OTLP_ENDPOINT 設置 oltp 的端點,以及 OTEL_LOGS_EXPORTER 設置應用 日志的輸出方式[7] oltp。也可以設置為 logging、oltp,將日志輸出到控制臺以及 oltp 端點。
kubectl apply -f - <配置 OpenTelemetry Collector
在我們的設計用,Otel Collector 會將日志輸出到 Loki,實際上是通過 Loki 的 HTTP API[8] 來發(fā)送日志,因此需要使用適配 Loki API 的 exporter[9]:lokiexporter[10]。
lokiexporter 來自 Otel Collector 的 Contrib 庫[11],并不在官方的 release 中。要想在 collector 中使用 lokiexporter 有兩種方式:
- 使用官方提供的工具 OpenTelemetry Collector Builder (ocb)[12] 在構(gòu)建 collector 的二進制時將 lokiexporter 加入其中。
- 使用 官方提供的發(fā)行包 otelcol-contrib[13],這個包中包含了 Contrib 庫所有的第三方組件。但不推薦在生產(chǎn)環(huán)境中使用,僅供測試。我們的演示中將會使用該發(fā)行包。
Otel 收集器的詳細配置可以參考 官方文檔[14]。
- 接收器(receiver),我們配置 otlp 來接收來自應用程序的跟蹤信息。
- 處理器(processor),將日志中的部分資源屬性作為 loki 的標簽,比如服務名、容器名、命名空間、pod 名。
- 輸出器(exporter),配置 Loki 的 HTTP API 端點 http://loki.default:3100/loki/api/v1/push。
- 管道服務(pipeline service),使用 otlp 作為輸入源,將 loki 作為輸出目的地。
kubectl apply -f - <部署示例應用
這是一個非常簡單的 Java 應用,監(jiān)聽 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-web 和 lombok。
org.springframework.boot
spring-boot-starter-web
org.projectlombok
lombok
1.18.28
部署應用。
kubectl apply -f - <應用部署完成后,通過端口轉(zhuǎn)發(fā)可以成功訪問應用。
curl localhost:8080
Hello World測試
Grafana 配置完 Loki 的數(shù)據(jù)源之后,在 Explore 中選擇配置的 Loki 數(shù)據(jù)源,然后在下方的 Label Filters 中選擇過濾器名 service_name 和值 java-sample。
圖片
點擊 Run query
總結(jié)
在本文中,我們探討了如何利用 OpenTelemetry 的自動檢測功能來高效采集應用日志,通過 OpenTelemetry Collector 進行處理,并利用 Loki Exporter 將日志數(shù)據(jù)發(fā)送到 Loki。最后,我們展示了如何使用 Grafana 對這些日志進行深入的查詢和分析。這一過程不僅優(yōu)化了日志管理流程,還提升了數(shù)據(jù)的可視化和可用性。這種集成為開發(fā)者和運維團隊提供了一個全面的視角,幫助他們更有效地理解和優(yōu)化他們的應用和基礎設施。特別是,如果將分布式跟蹤的 traceid、spanid 等信息作為 Loki 日志的標簽,將極大地增強了日志數(shù)據(jù)的可追蹤性和可分析性。
參考資料
[1] OpenTelemetry: https://opentelemetry.io
[2] Loki: https://grafana.com/oss/loki/
[3] Grafana Labs: https://grafana.com
[4] Prometheus: https://prometheus.io
[5] Otel Log 支持的語言: https://opentelemetry.io/docs/concepts/signals/logs/#language-support
[6] Instrumentation API 文檔: https://github.com/open-telemetry/opentelemetry-operator/blob/main/docs/api.md#instrumentation
[7] 日志的輸出方式: https://github.com/open-telemetry/opentelemetry-java/tree/main/sdk-extensions/autoconfigure#exporters
[8] Loki 的 HTTP API: https://grafana.com/docs/loki/latest/reference/api/#push-log-entries-to-loki
[9] exporter: https://opentelemetry.io/docs/collector/configuration/#exporters
[10] lokiexporter: https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/lokiexporter
[11] Otel Collector 的 Contrib 庫: https://github.com/open-telemetry/opentelemetry-collector-contrib
[12] OpenTelemetry Collector Builder (ocb): https://github.com/open-telemetry/opentelemetry-collector/tree/main/cmd/builder
[13] 官方提供的發(fā)行包 otelcol-contrib: https://github.com/open-telemetry/opentelemetry-collector-releases
[14] 官方文檔: https://opentelemetry.io/docs/collector/configuration/
當前標題:使用OpenTelemetry和Loki實現(xiàn)高效的應用日志采集和分析
鏈接URL:http://m.fisionsoft.com.cn/article/coicoij.html


咨詢
建站咨詢
