应用接入
概述
目前支持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 启动参数
-Dotel.resource.attributes=service.name=<serviceName>
-Dotel.exporter.otlp.headers=Authentication=<Authentication>
-Dotel.exporter.otlp.endpoint=<endpoint>
-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 初始化逻辑
import (
"context"
"errors"
"io"
"log"
"net"
"os"
"time"
"net/http"
"os/signal"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
)
func setupOTelSDK(ctx context.Context) (shutdown func(context.Context) error, err error) {
var shutdownFuncs []func(context.Context) error
shutdown = func(ctx context.Context) error {
var err error
for _, fn := range shutdownFuncs {
err = errors.Join(err, fn(ctx))
}
shutdownFuncs = nil
return err
}
headers := map[string]string{"Authentication": "<Authentication>"} // <Authentication>替换为业务系统Authentication
opts := []otlptracehttp.Option{
otlptracehttp.WithHeaders(headers),
otlptracehttp.WithEndpoint("<endpoint>"), // <endpoint> 填写上报地址,注意需要省略 http:// 前缀
otlptracehttp.WithInsecure(),
}
client := otlptracehttp.NewClient(opts...)
if err != nil {
log.Fatal(err)
}
r, err := resource.New(ctx, []resource.Option{
resource.WithAttributes(
attribute.KeyValue{Key: "service.name", Value: attribute.StringValue("<serviceName>")}, // <serviceName>替换为应用名
attribute.KeyValue{Key: "host.name", Value: attribute.StringValue("<hostName>")}, // <hostName>替换为IP地址
),
}...)
if err != nil {
log.Fatal(err)
}
traceExp, err := otlptrace.New(ctx, client)
if err != nil {
log.Fatal(err)
}
bsp := sdktrace.NewBatchSpanProcessor(traceExp)
tp := sdktrace.NewTracerProvider(
sdktrace.WithSampler(sdktrace.AlwaysSample()),
sdktrace.WithSpanProcessor(bsp),
sdktrace.WithResource(r),
)
otel.SetTracerProvider(tp)
otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
return
}
步骤 3:SDK 初始化,启动 HTTP 服务
func main() {
if err := run(); err != nil {
log.Fatalln(err)
}
}
func run() (err error) {
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
defer stop()
// 初始化 SDK
otelShutdown, err := setupOTelSDK(ctx)
if err != nil {
return
}
// 优雅关闭
defer func() {
err = errors.Join(err, otelShutdown(context.Background()))
}()
// 启动HTTP服务
srv := &http.Server{
Addr: ":8080",
BaseContext: func(_ net.Listener) context.Context { return ctx },
ReadTimeout: time.Second,
WriteTimeout: 10 * time.Second,
Handler: newHTTPHandler(),
}
srvErr := make(chan error, 1)
go func() {
srvErr <- srv.ListenAndServe()
}()
select {
case err = <-srvErr:
return
case <-ctx.Done():
stop()
}
err = srv.Shutdown(context.Background())
return
}
步骤 4: 对 HTTP 接口进行埋点增强
func newHTTPHandler() http.Handler {
mux := http.NewServeMux()
handleFunc := func(pattern string, handlerFunc func(http.ResponseWriter, *http.Request)) {
// 对HTTP路由进行埋点
handler := otelhttp.WithRouteTag(pattern, http.HandlerFunc(handlerFunc))
mux.Handle(pattern, handler)
}
// 注册接口
handleFunc("/simple", simpleIOHandler)
// 对所有接口进行埋点增强
handler := otelhttp.NewHandler(mux, "/")
return handler
}
func simpleIOHandler(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "ok")
}
步骤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:安装所需的依赖包
pip install opentelemetry-instrumentation-redis
pip install opentelemetry-instrumentation-mysql
pip install opentelemetry-distro opentelemetry-exporter-otlp
opentelemetry-bootstrap -a install
步骤 3:修改上报参数
创建app.py文件并填写以下示例代码
from flask import Flask
import requests
import time
backend_addr = 'https://example.com/'
app = Flask(__name__)
# 访问外部站点
@app.route('/')
def index():
start = time.time()
r = requests.get(backend_addr)
return r.text
# 访问数据库
@app.route('/mysql')
def func_rdb():
return "rdb res"
# 访问Redis
@app.route("/redis")
def func_kvop():
return "kv res"
app.run(host='0.0.0.0', port=8080)
按照如下方式启动 python 应用:
opentelemetry-instrument \
--traces_exporter otlp \
--service_name <serviceName> \
--exporter_otlp_endpoint <endpoint> \
--exporter_otlp_protocol http/protobuf \
--exporter_otlp_headers Authentication=<Authentication> \
--resource_attributes host.name=<hostName> \
python3 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" 。在有