基于 k8s
管理工具 Rancher UI
部署 OTEL
以及 Jaeger
,有状态的 ELK
采用单独的服务器部署,不放在 k8s
。
转载请注明来源:https://janrs.com/1wqi
部署 ELK
以及安装 APM
部署 Jaeger
部署 Jaeger
使用 Operator
部署,采用 Helm
方式部署 Operator
,Rancher UI
自带 Jaeger
的 Helm Repo
,直接安装即可:
helm install jaegertracing/jaeger-operator
部署 Jaeger
实例,部署在 jaeger
的命名空间:
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
name: jaeger
namespace: jaeger
spec:
strategy: production
部署后查看 pod
状态,显示 Running
即表示正常:
NAME READY STATUS RESTARTS AGE
jaeger-5c46cb5c8d-q2429 1/1 Running 3 (23h ago) 6d12h
jaeger-operator-569475574d-dsgmq 2/2 Running 5 (7d22h ago) 23d
部署 OTEL
部署前创建命名空间:otel
。 Operator
以及 Collector
都部署在 otel
命名空间。
部署 Operator
部署 OTEL
同样使用 Operator
部署,同样使用 Helm
安装 Operator
。
Rancher UI
自带没有 OTEL
的 helm
仓库,手动添加添加 helm 仓库:
仓库地址为:https://open-telemetry.github.io/opentelemetry-helm-charts
步骤:左侧菜单[应用] –> Chart
仓库 –> 创建 –> 添加仓库地址以及名称 –> 点击右下角创建
创建后直接在应用中搜索 opentelemetry
就会出现应用,安装 opentelemetry-operator
即可。
部署 Collector
部署 Collector
可以采用 deployment
以及 daemonset
方式部署,这里采用 deployment
方式。
修改 Rancher
中 Helm
选项中的参数:mode
为 deployment
,然后点击安装即可。
对接 ELK
以及 Jaeger
对接 ELK
OTEL
上报链路数据到 ES
是通过 ELK
安装的 APM
代理服务器上报的,所以需要设置 OTEL
对接 ELK
的 APM
服务地址就行了,相关配置如下。
修改 Collector
的 Configmap
配置对接 ELK
,主要配置如下:
otlphttp/elastic:
endpoint: "http://elasticsearch.com:8200"
headers:
Authorization: "Bearer AAEAAWVsYXN0aWMvZmxlZXQtc2VydmVyL3Rva2VuLTE2ODI3NTY1MDEzOTQ6TTNkcE9sWjBSQi14em80eVRQdHJzQQ"
对接 Jaeger
同样修改 Collector
的 Configmap
配置对接 Jaeger
, 主要配置如下:
jaeger:
endpoint: jaeger-collector.jaeger.svc.cluster.local:14250
tls:
insecure: true
以下是完整的 OTEL
的 Collector
对接 ELK
的 APM
以及 Jaeger
的 Configmap
:
apiVersion: v1
data:
relay: |
exporters:
logging:
loglevel: warn
otlphttp/elastic:
endpoint: "http://elasticsearch.com:8200"
headers:
Authorization: "Bearer AAEAAWVsYXN0aWMvZmxlZXQtc2VydmVyL3Rva2VuLTE2ODI3NTY1MDEzOTQ6TTNkcE9sWjBSQi14em80eVRQdHJzQQ"
jaeger:
endpoint: jaeger-collector.jaeger.svc.cluster.local:14250
tls:
insecure: true
extensions:
health_check: {}
memory_ballast:
size_in_percentage: 40
processors:
batch: {}
memory_limiter:
check_interval: 5s
limit_percentage: 80
spike_limit_percentage: 25
receivers:
jaeger:
protocols:
grpc:
endpoint: ${MY_POD_IP}:14250
thrift_compact:
endpoint: ${MY_POD_IP}:6831
thrift_http:
endpoint: ${MY_POD_IP}:14268
otlp:
protocols:
grpc:
endpoint: ${MY_POD_IP}:4317
http:
endpoint: ${MY_POD_IP}:4318
prometheus:
config:
scrape_configs:
- job_name: opentelemetry-collector
scrape_interval: 10s
static_configs:
- targets:
- ${MY_POD_IP}:8888
zipkin:
endpoint: ${MY_POD_IP}:9411
service:
extensions:
- health_check
- memory_ballast
pipelines:
logs:
exporters:
- logging
- otlphttp/elastic
processors:
- memory_limiter
- batch
receivers:
- otlp
metrics:
exporters:
- logging
- otlphttp/elastic
processors:
- memory_limiter
- batch
receivers:
- otlp
- prometheus
traces:
exporters:
- logging
- otlphttp/elastic
- jaeger
processors:
- memory_limiter
- batch
receivers:
- otlp
- jaeger
- zipkin
telemetry:
metrics:
address: ${MY_POD_IP}:8888
kind: ConfigMap
metadata:
annotations:
meta.helm.sh/release-name: opentelemetry-collector-0-1682785137
meta.helm.sh/release-namespace: otel
creationTimestamp: '2023-04-29T16:18:58Z'
labels:
app.kubernetes.io/instance: opentelemetry-collector-0-1682785137
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: opentelemetry-collector
app.kubernetes.io/version: 0.76.1
helm.sh/chart: opentelemetry-collector-0.55.0
name: opentelemetry-collector-0-1682785137
namespace: otel
golang
对接 OTEL
获取 service
地址
创建一个 Trace Provider
, Trace Provider
的 EndPoint
设置为 otel-collector
部署在 k8s
的 service
的地址。
查看 otel-collector
的 service
地址:
kubectl get svc -n otel
显示如下:
opentelemetry-collector-0-1682785137 ClusterIP 10.96.215.170 <none> 6831/UDP,14250/TCP,14268/TCP,4317/TCP,4318/TCP,9411/TCP 23d
opentelemetry-operator-0-1682784940 ClusterIP 10.96.110.41 <none> 8443/TCP,8080/TCP 23d
opentelemetry-operator-0-1682784940-webhook ClusterIP 10.96.81.101 <none> 443/TCP 23d
创建 go
的 Trace Provider
// NewTrace 实例化 Trace
func NewTrace() (*sdktrace.TracerProvider, error) {
ctx := context.Background()
traceClient := otlptracegrpc.NewClient(
otlptracegrpc.WithInsecure(),
otlptracegrpc.WithEndpoint("opentelemetry-collector-0-1682785137.otel:4317"),
otlptracegrpc.WithDialOption(grpc.WithBlock()),
)
traceExp, err := otlptrace.New(ctx, traceClient)
if err != nil {
return nil, err
}
res, err := resource.New(ctx,
resource.WithFromEnv(),
resource.WithProcess(),
resource.WithTelemetrySDK(),
resource.WithHost(),
resource.WithAttributes(semconv.ServiceNameKey.String("test-service")))
if err != nil {
return nil, err
}
bsp := sdktrace.NewBatchSpanProcessor(traceExp)
tracerProvider := sdktrace.NewTracerProvider(
sdktrace.WithSampler(sdktrace.AlwaysSample()),
sdktrace.WithResource(res),
sdktrace.WithSpanProcessor(bsp),
)
otel.SetTextMapPropagator(
propagation.NewCompositeTextMapPropagator(propagation.TraceContext{},
propagation.Baggage{}),
)
otel.SetTracerProvider(tracerProvider)
return tracerProvider, nil
}
grpc-server
添加链路追踪
grpcServer := grpc.NewServer(
grpc.ChainStreamInterceptor(
// otel 链路追踪
otelgrpc.StreamServerInterceptor(),
),
grpc.ChainUnaryInterceptor(
// otel 链路追踪
otelgrpc.UnaryServerInterceptor(),
),
)
grpc-client
添加链路追踪
// some code ...
conn, err := grpc.DialContext(
ctx, serverAddress,
grpc.WithTransportCredentials(insecure.NewCredentials()),
grpc.WithUnaryInterceptor(otelgrpc.UnaryClientInterceptor()),
grpc.WithStreamInterceptor(otelgrpc.StreamClientInterceptor()),
)
// some code ...
在 main.go
添加 Trace Provider
以及上报链路
tp , err := NewTrace()
if err != nil {
panic("new trace provider failed.")
}
// 汇总链路数据以及上报数据到 ES 以及 Jaeger
defer func() {
if err = tp.Shutdown(context.Background()); err != nil {
fmt.Println("shutdown trace provider failed.")
}
}()
// 在需要上报 span 链路的地方添加以下代码即可上报链路数据
tracer := tp.Tracer("test-service-rpc")
ctx, span := tracer.Start(ctx, "test-service.rpc.UserInfo")
defer span.End()
Jaeger
以及 ELK
的链路展示截图如下:
Jaeger 截图

ELK 截图

转载请注明来源:https://janrs.com/1wqi
发表回复