应用接入
概述
目前支持java,go,python语言应用接入,支持Opentelemetry协议接入,后期支持更多语言和协议接入 入口:应用性能监控->应用列表->新建应用进入到应用接入页面
接入流程
点击进入到接入应用页面,可切换语言查看接入流程,按照流程接入后即可在应用性能监控->应用列表显示接入的应用
Java应用接入
步骤 1:获取接入点和鉴权(接入点和鉴权信息根据地域和具体用户返回,准确内容请查看控制台)
- 接入点:http://10.169.25.203:8810
- Authentication:UFSpMM***lnFrVBqtPDK
步骤 2:下载探针
下载探针,推荐下载最新版本,探针名为 opentelemetry-javaagent.jar。下载链接: https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases?spm=5176.28197633.0.0.24797770OL3M3n
步骤 3:修改上报参数
接入 Java 应用需要用到如下 3 个 JVM 启动参数
1-Dotel.resource.attributes=service.name=<serviceName>
2-Dotel.exporter.otlp.headers=Authentication=<Authentication>
3-Dotel.exporter.otlp.endpoint=<endpoint>
4-javaagent:<javaagent>
在执行 Java 命令的时候,请确保这 3 个 JVM 启动参数放在 javaagent 之前。 对应的字段说明如下:
参数 | 描述 | 示例 |
---|---|---|
<javaagent> | 步骤2中探针对应的本地文件路径 | /home/work/OpenTelemetryAgent270/opentelemetry-javaagent.jar |
<serviceName> | 应用名,多个使用相同应用名接入的进程,在 APM 中会表现为相同应用下的多个实例。对于 Spring Cloud 或 Dubbo 应用,应用名通常和服务名保持一致 | csm |
<Authentication> | 步骤 1 中拿到业务系统 Authentication | UFSpMM***lnFrVBqtPDK |
<endpoint> | 步骤 1 中拿到的接入点 | http://10.169.25.203:8810 |
步骤4:接入验证
完成 3 个接入步骤后,启动 Java 应用,应用程序将挂载探针,并连接到百度云 APM 服务端上报监控数据。在有正常流量的情况下,应用性能监控 -> 应用列表 中将展示接入的应用,由于数据的处理存在一定延时,如果接入后在控制台没有查询到应用,请等待 30 秒左右。
GO语言应用接入
步骤 1:获取接入点和鉴权(接入点和鉴权信息根据地域和具体用户返回,准确内容请查看控制台)
- 接入点:http://10.169.25.203:8810
- Authentication:UFSpMM***lnFrVBqtPDK
步骤 2:引入 OpenTelemetry 相关依赖,实现 SDK 初始化逻辑
1import (
2 "context"
3 "errors"
4 "io"
5 "log"
6 "net"
7 "os"
8 "time"
9
10 "net/http"
11 "os/signal"
12
13 "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
14 "go.opentelemetry.io/otel"
15 "go.opentelemetry.io/otel/attribute"
16 "go.opentelemetry.io/otel/exporters/otlp/otlptrace"
17 "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
18 "go.opentelemetry.io/otel/propagation"
19 "go.opentelemetry.io/otel/sdk/resource"
20 sdktrace "go.opentelemetry.io/otel/sdk/trace"
21)
22
23func setupOTelSDK(ctx context.Context) (shutdown func(context.Context) error, err error) {
24 var shutdownFuncs []func(context.Context) error
25
26 shutdown = func(ctx context.Context) error {
27 var err error
28 for _, fn := range shutdownFuncs {
29 err = errors.Join(err, fn(ctx))
30 }
31 shutdownFuncs = nil
32 return err
33 }
34
35 headers := map[string]string{"Authentication": "<Authentication>"} // <Authentication>替换为业务系统Authentication
36 opts := []otlptracehttp.Option{
37 otlptracehttp.WithHeaders(headers),
38 otlptracehttp.WithEndpoint("<endpoint>"), // <endpoint> 填写上报地址,注意需要省略 http:// 前缀
39 otlptracehttp.WithInsecure(),
40 }
41 client := otlptracehttp.NewClient(opts...)
42 if err != nil {
43 log.Fatal(err)
44 }
45 r, err := resource.New(ctx, []resource.Option{
46 resource.WithAttributes(
47 attribute.KeyValue{Key: "service.name", Value: attribute.StringValue("<serviceName>")}, // <serviceName>替换为应用名
48 attribute.KeyValue{Key: "host.name", Value: attribute.StringValue("<hostName>")}, // <hostName>替换为IP地址
49 ),
50 }...)
51 if err != nil {
52 log.Fatal(err)
53 }
54 traceExp, err := otlptrace.New(ctx, client)
55 if err != nil {
56 log.Fatal(err)
57 }
58 bsp := sdktrace.NewBatchSpanProcessor(traceExp)
59 tp := sdktrace.NewTracerProvider(
60 sdktrace.WithSampler(sdktrace.AlwaysSample()),
61 sdktrace.WithSpanProcessor(bsp),
62 sdktrace.WithResource(r),
63 )
64 otel.SetTracerProvider(tp)
65 otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
66 return
67}
步骤 3:SDK 初始化,启动 HTTP 服务
1func main() {
2 if err := run(); err != nil {
3 log.Fatalln(err)
4 }
5}
6
7func run() (err error) {
8 ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
9 defer stop()
10
11 // 初始化 SDK
12 otelShutdown, err := setupOTelSDK(ctx)
13 if err != nil {
14 return
15 }
16 // 优雅关闭
17 defer func() {
18 err = errors.Join(err, otelShutdown(context.Background()))
19 }()
20
21 // 启动HTTP服务
22 srv := &http.Server{
23 Addr: ":8080",
24 BaseContext: func(_ net.Listener) context.Context { return ctx },
25 ReadTimeout: time.Second,
26 WriteTimeout: 10 * time.Second,
27 Handler: newHTTPHandler(),
28 }
29 srvErr := make(chan error, 1)
30 go func() {
31 srvErr <- srv.ListenAndServe()
32 }()
33
34 select {
35 case err = <-srvErr:
36 return
37 case <-ctx.Done():
38 stop()
39 }
40
41 err = srv.Shutdown(context.Background())
42 return
43}
步骤 4: 对 HTTP 接口进行埋点增强
1func newHTTPHandler() http.Handler {
2 mux := http.NewServeMux()
3
4 handleFunc := func(pattern string, handlerFunc func(http.ResponseWriter, *http.Request)) {
5 // 对HTTP路由进行埋点
6 handler := otelhttp.WithRouteTag(pattern, http.HandlerFunc(handlerFunc))
7 mux.Handle(pattern, handler)
8 }
9
10 // 注册接口
11 handleFunc("/simple", simpleIOHandler)
12
13 // 对所有接口进行埋点增强
14 handler := otelhttp.NewHandler(mux, "/")
15 return handler
16}
17
18func simpleIOHandler(w http.ResponseWriter, r *http.Request) {
19 io.WriteString(w, "ok")
20}
步骤5:接入验证
启动 Go 应用后,通过 8080 端口访问对应的接口,例如 curl -X POST http://localhost:8080/simple -H "Content-Type: application/json",应用就会向 APM 上报处理 HTTP 请求相关的链路数据。在有正常流量的情况下,应用性能监控 -> 应用列表 中将展示接入的应用。由于数据的处理存在一定延时,如果接入后在控制台没有查询到应用,请等待 30 秒左右。
Python语言应用接入
步骤 1:获取接入点和鉴权(接入点和鉴权信息根据地域和具体用户,具体查看页面)
- 接入点:http://10.169.25.203:8810
- Authentication:UFSpMM***lnFrVBqtPDK
步骤 2:安装所需的依赖包
1pip install opentelemetry-instrumentation-redis
2pip install opentelemetry-instrumentation-mysql
3pip install opentelemetry-distro opentelemetry-exporter-otlp
4opentelemetry-bootstrap -a install
步骤 3:修改上报参数
创建app.py文件并填写以下示例代码
1from flask import Flask
2import requests
3import time
4
5backend_addr = 'https://example.com/'
6
7app = Flask(__name__)
8
9# 访问外部站点
10@app.route('/')
11def index():
12 start = time.time()
13 r = requests.get(backend_addr)
14 return r.text
15
16# 访问数据库
17@app.route('/mysql')
18def func_rdb():
19 return "rdb res"
20
21# 访问Redis
22@app.route("/redis")
23def func_kvop():
24 return "kv res"
25
26app.run(host='0.0.0.0', port=8080)
按照如下方式启动 python 应用:
1opentelemetry-instrument \
2--traces_exporter otlp \
3--service_name <serviceName> \
4--exporter_otlp_endpoint <endpoint> \
5--exporter_otlp_protocol http/protobuf \
6--exporter_otlp_headers Authentication=<Authentication> \
7--resource_attributes host.name=<hostName> \
8python3 app.py
对应的字段说明如下:
参数 | 描述 | 示例 |
---|---|---|
<serviceName> | 应用名,多个使用相同应用名接入的进程,在 APM 中会表现为相同应用下的多个实例。对于 Spring Cloud 或 Dubbo 应用,应用名通常和服务名保持一致 | csm |
<Authentication> | 步骤 1 中拿到业务系统 Authentication | UFSpMM***lnFrVBqtPDK |
<endpoint> | 步骤 1 中拿到的接入点 | http://10.169.25.203:8810 |
该实例的主机名,是应用实例的唯一标识,通常情况下可以设置为应用实例的 IP 地址。 | my-instance-host |
步骤4:接入验证
启动 Python 应用后,通过 8080 端口访问对应的接口,例如 curl http://localhost:8081/mysql -H "Content-Type: application/json" 。在有