kratos 链路追踪jaeger存储es
先来个容器环境文件
version: "3"
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.6.1
networks:
- elastic-jaeger
ports:
- "127.0.0.1:9200:9200"
- "127.0.0.1:9300:9300"
restart: on-failure
environment:
- cluster.name=jaeger-cluster
- discovery.type=single-node
- http.host=0.0.0.0
- transport.host=127.0.0.1
- ES_JAVA_OPTS=-Xms512m -Xmx512m
- xpack.security.enabled=false
volumes:
- ./esdata:/usr/share/elasticsearch/data
jaeger-collector:
image: jaegertracing/jaeger-collector
ports:
- "14269:14269"
- "14268:14268"
- "14267:14267"
- "9411:9411"
networks:
- elastic-jaeger
restart: on-failure
environment:
- SPAN_STORAGE_TYPE=elasticsearch
command: [
"--es.server-urls=http://elasticsearch:9200",
"--es.num-shards=1",
"--es.num-replicas=0",
"--log-level=error"
]
depends_on:
- elasticsearch
jaeger-agent:
image: jaegertracing/jaeger-agent
hostname: jaeger-agent
command: ["--reporter.grpc.host-port=jaeger-collector:14267"]
ports:
- "5775:5775/udp"
- "6831:6831/udp"
- "6832:6832/udp"
- "5778:5778"
networks:
- elastic-jaeger
restart: on-failure
environment:
- SPAN_STORAGE_TYPE=elasticsearch
depends_on:
- jaeger-collector
jaeger-query:
image: jaegertracing/jaeger-query
environment:
- SPAN_STORAGE_TYPE=elasticsearch
- no_proxy=localhost
ports:
- "16686:16686"
- "16687:16687"
networks:
- elastic-jaeger
restart: on-failure
command: [
"--es.server-urls=http://elasticsearch:9200",
"--span-storage.type=elasticsearch",
"--log-level=debug"
]
depends_on:
- jaeger-agent
volumes:
esdata:
driver: local
networks:
elastic-jaeger:
driver: bridge
在kratos中植入链路追踪
在main.go中构建链路追踪
import ( ... "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/exporters/jaeger" "go.opentelemetry.io/otel/sdk/resource" "go.opentelemetry.io/otel/sdk/trace" ... ) // tracerProvider returns an OpenTelemetry TracerProvider configured to use // the Jaeger exporter that will send spans to the provided url. The returned // TracerProvider will also use a Resource configured with all the information // about the application. func tracerProvider(url string) (*trace.TracerProvider, error) { // Create the Jaeger exporter exp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url))) if err != nil { return nil, err } tp := trace.NewTracerProvider( // Always be sure to batch in production. trace.WithBatcher(exp), // Record information about this application in an Resource. trace.WithResource(resource.NewWithAttributes( semconv.SchemaURL, semconv.ServiceNameKey.String(Name), //实例名称 attribute.String("environment", Name), // 相关环境 attribute.String("ID", Version), //版本 )), ) return tp, nil }
在main中调用
import ( ... "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/exporters/jaeger" "go.opentelemetry.io/otel/sdk/resource" "go.opentelemetry.io/otel/sdk/trace" ... ) //启动链路追踪,此处需要填写链路追踪采集地址 //http://127.0.0.1:14268/api/traces tp, err := tracerProvider("http://jaeger_es_jaeger-collector_1:14268/api/traces") if err != nil { panic(err) } //将tp作为全局链路追踪的提供程序 otel.SetTracerProvider(tp)
注意此处采集地址根据自己环境配置
我的此处是容器中环境 ,让此容器加入上边的network:elastic-jaeger,注意此处环境network名跟所在文件夹有关,可自行查看(docker network ls)dirname_elastic-jaeger
中间件加入
//grpc var opts = []grpc.ServerOption{ grpc.Middleware( recovery.Recovery(), logging.Server(logger), //日志中间件 tracing.Server(), //链路追踪中间件 ), } //http var opts = []http.ServerOption{ http.Middleware( recovery.Recovery(), logging.Server(logger), //日志中间件 tracing.Server(), //链路追踪中间件 ), }
浏览器打开 http://localhost:16686
还可直接使用 jaegertracing/all-in-one:latest 构建镜像 存储为文件 测试时可直接使用
docker run -d -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 16686:16686 -p 14268:14268 -p 14269:14269 -p 9411:9411 jaegertracing/all-in-one:latest
参考连接
blog.csdn.net/l688899886/article/d...
ask.sov5.cn/q/XksQeOUuA9
本作品采用《CC 协议》,转载必须注明作者和本文链接