VictoriaMetrics与VictoriaLogs的OpenTelemetry入门指南
前言
在现代可观测性体系中,OpenTelemetry已成为事实上的标准协议。作为高性能时序数据库的VictoriaMetrics和日志管理系统的VictoriaLogs都原生支持OpenTelemetry协议的数据摄入。本文将详细介绍如何在这两个系统中配置和使用OpenTelemetry。
环境准备
在开始之前,需要确保已具备以下环境:
- Kubernetes集群(推荐使用最新稳定版本)
- kubectl命令行工具(版本需与集群匹配)
- Helm包管理工具(v3.x版本)
VictoriaMetrics安装配置
基础安装
VictoriaMetrics提供了Helm chart简化部署过程。首先添加官方chart仓库:
helm repo add vm <官方chart仓库地址>
helm repo update
关键配置
为了确保OpenTelemetry指标名称与Prometheus命名规范兼容,需要添加以下配置:
# vm-values.yaml
server:
extraArgs:
opentelemetry.usePrometheusNaming: true
部署执行
使用以下命令部署单节点版VictoriaMetrics:
helm install victoria-metrics vm/victoria-metrics-single -f vm-values.yaml
验证部署状态:
kubectl get pods
写入端点
部署完成后,VictoriaMetrics会提供以下OpenTelemetry协议的数据写入端点:
http://<service-name>.<namespace>.svc.cluster.local:8428/opentelemetry/v1/metrics
VictoriaLogs安装配置
基础安装
VictoriaLogs同样通过Helm chart部署:
helm install victoria-logs vm/victoria-logs-single
验证部署
kubectl get pods
写入端点
VictoriaLogs的OpenTelemetry日志写入端点为:
http://<service-name>.<namespace>.svc.cluster.local:9428/insert/opentelemetry/v1/logs
OpenTelemetry Collector集成
架构概述
OpenTelemetry Collector作为数据管道,负责接收、处理和转发遥测数据。典型架构如下:
应用 → OTel Collector → VictoriaMetrics/VictoriaLogs
Collector配置
关键配置要点:
- delta转cumulative处理器:VictoriaMetrics不支持delta类型的直方图和摘要指标,需要转换
- 双协议支持:同时启用gRPC和HTTP接收器
- 压缩传输:启用gzip压缩提高传输效率
完整配置示例:
# otel-values.yaml
mode: deployment
config:
processors:
deltatocumulative:
max_stale: 5m
receivers:
otlp:
protocols:
grpc: {}
http: {}
exporters:
otlphttp/victoriametrics:
compression: gzip
metrics_endpoint: "http://victoria-metrics:8428/opentelemetry/v1/metrics"
logs_endpoint: "http://victoria-logs:9428/insert/opentelemetry/v1/logs"
service:
pipelines:
metrics:
processors: [deltatocumulative]
exporters: [otlphttp/victoriametrics]
logs:
exporters: [otlphttp/victoriametrics]
部署Collector
helm upgrade -i otel open-telemetry/opentelemetry-collector -f otel-values.yaml
应用端集成示例
Go应用示例
下面展示一个完整的Go应用集成OpenTelemetry SDK的示例:
package main
import (
"context"
"log"
"net/http"
"time"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.21.0"
)
func initTracer() (*sdktrace.TracerProvider, error) {
exporter, err := otlptracehttp.New(context.Background(),
otlptracehttp.WithEndpoint("otel-collector:4318"),
otlptracehttp.WithInsecure(),
)
if err != nil {
return nil, err
}
tp := sdktrace.NewTracerProvider(
sdktrace.WithBatcher(exporter),
sdktrace.WithResource(resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceName("dice-service"),
)),
)
otel.SetTracerProvider(tp)
return tp, nil
}
func main() {
tp, err := initTracer()
if err != nil {
log.Fatal(err)
}
defer func() { _ = tp.Shutdown(context.Background()) }()
http.HandleFunc("/rolldice", func(w http.ResponseWriter, r *http.Request) {
// 示例跟踪逻辑
ctx, span := otel.Tracer("rolldice").Start(r.Context(), "roll")
defer span.End()
// 业务逻辑...
})
log.Println("Starting server...")
log.Fatal(http.ListenAndServe(":8080", nil))
}
指标和日志验证
部署完成后,可以通过以下方式验证数据:
-
指标验证:
- 端口转发:
kubectl port-forward svc/victoria-metrics 8428
- 访问VMUI界面查看指标
- 端口转发:
-
日志验证:
- 端口转发:
kubectl port-forward svc/victoria-logs 9428
- 使用查询语句过滤日志
- 端口转发:
直接写入方案
对于不需要Collector的场景,应用可以直接将数据写入VictoriaMetrics/VictoriaLogs:
// 指标导出器配置示例
metricExporter, err := otlpmetrichttp.New(
context.Background(),
otlpmetrichttp.WithEndpoint("victoria-metrics:8428"),
otlpmetrichttp.WithURLPath("/opentelemetry/v1/metrics"),
)
// 日志导出器配置示例
logExporter, err := otlploghttp.New(
context.Background(),
otlploghttp.WithEndpoint("victoria-logs:9428"),
otlploghttp.WithURLPath("/insert/opentelemetry/v1/logs"),
)
注意事项与限制
-
协议支持:
- 不支持实验性的JSON编码格式
- 仅支持AggregationTemporalityCumulative类型的直方图和摘要指标
-
性能考量:
- 高频指标建议使用批处理导出
- 生产环境建议启用压缩传输
-
命名规范:
- 建议启用Prometheus命名转换确保兼容性
通过本文介绍的方法,您可以轻松地将OpenTelemetry生态与VictoriaMetrics/VictoriaLogs集成,构建完整的可观测性解决方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考