更新时间:2023.03.21 14:33:52
Go应用在不同场景下有不同的接入方式,本文介绍不同场景下Go应用的详细接入操作,接入后可以实现自动收集Trace信息、自动生成Metric指标、以及调用链检索、日志检索等功能。
通过APMPlus自主研发的数据采集Agent与SDK,采集应用与基础设施的监控数据,相关数据会上报到APMPlus服务端用于可视化查询分析。
如果您的应用是基于Kubernetes集群部署,请参见以下步骤接入APMPlus服务端。
方式1:通过kubectl命令行接入(推荐)
进入接入中心,选择Go语言 > APMPlus > 容器部署,获取如下安装命令,需要区分您的开服区域(region)与网络接入方式(network),appkey是用户的唯一标识。
kubectl apply -f "http://apmplus-dl-{region}.ivolces.com/server_warehouse/generate_assets/download/apmplus-agent-k8s/apmplus-operator.yaml?appkey={appkey}&network={network}"
说明
完整安装命令请到接入中心查看,详情请参见如何使用接入中心?。
方式2:通过容器服务控制台接入
下面以火山引擎VKE为例,介绍如何在控制台上通过配置Yaml接入Server Agent。操作前,请确保您已创建集群。具体请参见创建集群。
浏览器打开apmplus-operator.yaml
文件。
文件链接如下,与方式1中kubectl使用的链接相同。
http://apmplus-dl-{region}.ivolces.com/server_warehouse/generate_assets/download/apmplus-agent-k8s/apmplus-operator.yaml?appkey={appkey}&network={network}
登录容器服务管理控制台。
单击左侧导航栏中的集群。
选择工作负载 > 守护进程,单击使用Yaml创建。
在使用Yaml创建页面,类型选择自定义,复制步骤1打开的yaml文件的所有内容粘贴到Yaml中,然后单击确定。
SDK用于采集应用的Trace、日志检索等数据,将数据上报到Server Agent。更多SDK采集的数据,请参见Go应用功能。
获取最新的Go SDK。
go get github.com/volcengine/apminsight-server-sdk-go@latest
接入trace。
接入trace后,您可以通过链路追踪来排查问题环节,获取服务拓扑等信息,tracer初始化示例代码:
package main import ( "github.com/volcengine/apminsight-server-sdk-go/trace/aitracer" ) func main() { InitTracer("your_service_type","your_service_name") ... } func InitTracer(serviceType, serviceName string) { opts := make([]aitracer.TracerOption, 0) opts = append(opts, aitracer.WithLogSender(true)) //采集日志上报。需要配合日志库使用,参考下方的【log接入】 opts = append(opts, aitracer.WithMetrics(true)) //开启RED metrics【建议开启】 opts = append(opts, aitracer.WithRuntimeMetric(true)) //开启Runtime监控。【建议开启】 opts = append(opts, aitracer.WithLogger(&logsLogger{})) //用于打印trace内部的日志 tracer := aitracer.NewTracer(serviceType, serviceName, opts...) aitracer.SetGlobalTracer(tracer) tracer.Start() }
由于对Go业务代码进行trace需要侵入式修改代码,为了降低用户使用成本,SDK中的 contrib包 对常见框架和组件进行了trace插桩,通常对业务代码进行少量修改即可实现链路追踪,可以参照 contrib包 中的示例代码接入。
以gin框架接入为例:
package main import ( "fmt" "github.com/gin-gonic/gin" "github.com/volcengine/apminsight-server-sdk-go/trace/aitracer" tracegin "github.com/volcengine/apminsight-server-sdk-go/trace/contrib/gin-gonic/gin" ) func main() { // 初始化tracer InitTracer("http","example_gin_service") // 初始化gin r := gin.Default() // use trace middlware. // 用户添加这行代码即可 r.Use(tracegin.NewMiddleware(tracer)) r.GET("/ping", func(context *gin.Context) { context.JSON(http.StatusOK, "success") }) _ = r.Run("0.0.0.0:8080") }
接入后产生trace,可在 链路分析 查看相关链路。
接入log。
接入log后,您可以在应用性能监控平台查看业务日志,请根据业务需求判断是否需要接入。接入示例代码:
package main import ( "github.com/sirupsen/logrus" "github.com/volcengine/apminsight-server-sdk-go/trace/aitracer" ailogrus "github.com/volcengine/apminsight-server-sdk-go/trace/contrib/sirupsen/logrus" //需要使用该日志库插件,当前支持logrus日志插件 ) func main() { InitTracer("your_service_type","your_service_name") //log上报依赖tracer,必须先初始化tracer logrus.AddHook(ailogrus.NewHook(tracer, []logrus.Level{ logrus.TraceLevel, logrus.DebugLevel, logrus.InfoLevel, logrus.WarnLevel, logrus.ErrorLevel, logrus.FatalLevel, })) // ctx来源不一,这里用getContextFromMeta伪代码指代获取ctx的逻辑 // 如果使用gin框架,则ctx来自ginCtx.Request.Context() ctx := getContextFromMeta() // 传递ctx以获取traceID logrus.WithContext(ctx).Info("log msg") ... }
接入后日志将发送至APMPlus后端,可在 日志监控 查看。
接入metrics。
接入metrics后,您可以通过自定义打点监测业务指标,请根据业务需求判断是否需要接入。接入示例代码:
package main import ( "github.com/volcengine/apminsight-server-sdk-go/metrics" ) func main() { metrics.Init() ... } func yourCode(){ metrics.EmitCounter("request.throughput",1) //计数 metrics.EmitTimer("request.duration",1) //延时 metrics.EmitGauge("goroutine.num", 1) //值 }
接入后可在 自定义指标 中查看相关数据。
接入profile。
接入profile后,您可以对应用程序进行性能分析,定位性能瓶颈,请根据业务需求判断是否需要接入。接入示例代码:
import ( "github.com/volcengine/apminsight-server-sdk-go/trace/aiprofiler" ) func main() { InitTracer("your_service_type", "your_service_name") //profile元信息依赖tracer,必须先初始化tracer(后续解耦) InitProfiler("your_service_type", "your_service_name") //需要保证Profiler初始化时的服务名 与 Tracer初始化时的服务名一致 ... } func InitProfiler(serviceType, serviceName string) { opts := make([]aiprofiler.Option, 0) opts = append(opts, aiprofiler.WithLogger(&logsLogger{})) opts = append(opts, aiprofiler.WithBlockProfileDefault()) // 开启blockProfile。可能会影响性能,请按需开启 opts = append(opts, aiprofiler.WithMutexProfileDefault()) // 开启mutexProfile。可能会影响性能,请按需开启 p := aiprofiler.NewProfiler(serviceType, serviceName, opts...) p.Start() }
接入后可在 性能分析 配置profile采集任务。
方式1:在pod添加label(推荐)
在pod添加label,开启Agent自动注入。
apmplus.volcengine.com/enable: 'true'
添加完成后,yaml配置:
--- apiVersion: apps/v1 kind: Deployment metadata: ... spec: template: metadata: labels: apmplus.volcengine.com/enable: 'true' spec: containers: - name: xxx image: dockerhub.com:5000/xxx:latest imagePullPolicy: Always --- apiVersion: v1 kind: Service ...
方式2:在应用程序的k8s.yaml文件中配置挂载目录
--- apiVersion: apps/v1 kind: Deployment metadata: ... spec: template: spec: containers: - name: xxx image: dockerhub.com:5000/xxx:latest imagePullPolicy: Always volumeMounts: - name: agent-sock mountPath: /var/run/apminsight volumes: - name: agent-sock hostPath: path: /var/run/apminsight --- apiVersion: v1 kind: Service ...
方式3:在控制台上配置挂载目录
具体操作,请参见创建无状态负载。添加agent-sock配置:
方式4:Docker挂载
Docker挂载适用于Docker直接启动的应用。在docker启动时添加挂载目录:
docker run -d -v /var/run/apminsight:/var/run/apminsight image_name
挂载完成后重新启动应用。
方式1:通过kubectl命令行
将安装命令中的"apply"替换为"delete",即可获得删除命令:
kubectl delete -f "http://apmplus-dl-{region}.ivolces.com/server_warehouse/generate_assets/download/apmplus-agent-k8s/apmplus-operator.yaml?appkey={appkey}&network={network}"
方式2:通过控制台
依次删除通过容器服务控制台接入创建的资源。
如果您的应用是基于虚拟机或者物理机部署,请参见以下步骤接入APMPlus服务端。
安装Server Agent。
Server Agent运行于主机上,采集主机信息,接收并转发该主机上应用的上报数据。
进入接入中心,选择 Go语言 > APMPlus > 主机部署 ,获取如下安装命令,需要区分您的开服区域(region)与网络接入方式(network),appkey是用户的唯一标识。
bash -c "$(curl -L 'http://apmplus-dl-{region}.volces.com/server_warehouse/generate_assets/download/apmplus-agent-ecs/install.sh?appkey={appkey}&network={network}')"
说明
完整安装命令请到接入中心查看,详情请参见如何使用接入中心?。
安装后会创建如下目录和文件:
/var/log/apminsight
:运行时日志。/etc/apminsight.v1
:配置文件。/opt/apminsight
:二进制文件。/lib/systemd/system/apminsight-agent.service
:探针核心进程。/lib/systemd/system/apminsight-system-probe.service
:system-probe,用于监控网络和进程退出。启动Server Agent。
sudo systemctl start apminsight-agent sudo systemctl start apminsight-system-probe
SDK用于采集应用的Trace、日志检索等数据,将数据上报到Server Agent。更多SDK采集的数据,请参见Go应用功能。
获取最新的Go SDK。
go get github.com/volcengine/apminsight-server-sdk-go@latest
接入trace。
接入trace后,您可以通过链路追踪来排查问题环节,获取服务拓扑等信息,tracer初始化示例代码:
package main import ( "github.com/volcengine/apminsight-server-sdk-go/trace/aitracer" ) func main() { InitTracer("your_service_type","your_service_name") ... } func InitTracer(serviceType, serviceName string) { opts := make([]aitracer.TracerOption, 0) opts = append(opts, aitracer.WithLogSender(true)) //采集日志上报。需要配合日志库使用,参考下方的【log接入】 opts = append(opts, aitracer.WithMetrics(true)) //开启RED metrics【建议开启】 opts = append(opts, aitracer.WithRuntimeMetric(true)) //开启Runtime监控。【建议开启】 opts = append(opts, aitracer.WithLogger(&logsLogger{})) //用于打印trace内部的日志 tracer := aitracer.NewTracer(serviceType, serviceName, opts...) aitracer.SetGlobalTracer(tracer) tracer.Start() }
由于对Go业务代码进行trace需要侵入式修改代码,为了降低用户使用成本,SDK中的 contrib包 对常见框架和组件进行了trace插桩,通常对业务代码进行少量修改即可实现链路追踪,可以参照 contrib包 中的示例代码接入。
以gin框架接入为例:
package main import ( "fmt" "github.com/gin-gonic/gin" "github.com/volcengine/apminsight-server-sdk-go/trace/aitracer" tracegin "github.com/volcengine/apminsight-server-sdk-go/trace/contrib/gin-gonic/gin" ) func main() { // 初始化tracer InitTracer("http","example_gin_service") // 初始化gin r := gin.Default() // use trace middlware. // 用户添加这行代码即可 r.Use(tracegin.NewMiddleware(tracer)) r.GET("/ping", func(context *gin.Context) { context.JSON(http.StatusOK, "success") }) _ = r.Run("0.0.0.0:8080") }
接入后产生trace,可在 链路分析 查看相关链路。
接入log。
接入log后,您可以在应用性能监控平台查看业务日志,请根据业务需求判断是否需要接入。接入示例代码:
package main import ( "github.com/sirupsen/logrus" "github.com/volcengine/apminsight-server-sdk-go/trace/aitracer" ailogrus "github.com/volcengine/apminsight-server-sdk-go/trace/contrib/sirupsen/logrus" //需要使用该日志库插件,当前支持logrus日志插件 ) func main() { InitTracer("your_service_type","your_service_name") //log上报依赖tracer,必须先初始化tracer logrus.AddHook(ailogrus.NewHook(tracer, []logrus.Level{ logrus.TraceLevel, logrus.DebugLevel, logrus.InfoLevel, logrus.WarnLevel, logrus.ErrorLevel, logrus.FatalLevel, })) // ctx来源不一,这里用getContextFromMeta伪代码指代获取ctx的逻辑 // 如果使用gin框架,则ctx来自ginCtx.Request.Context() ctx := getContextFromMeta() // 传递ctx以获取traceID logrus.WithContext(ctx).Info("log msg") ... }
接入后日志将发送至APMPlus后端,可在 日志监控 查看。
接入metrics。
接入metrics后,您可以通过自定义打点监测业务指标,请根据业务需求判断是否需要接入。接入示例代码:
package main import ( "github.com/volcengine/apminsight-server-sdk-go/metrics" ) func main() { metrics.Init() ... } func yourCode(){ metrics.EmitCounter("request.throughput",1) //计数 metrics.EmitTimer("request.duration",1) //延时 metrics.EmitGauge("goroutine.num", 1) //值 }
接入后可在 自定义指标 中查看相关数据。
接入profile。
接入profile后,您可以对应用程序进行性能分析,定位性能瓶颈,请根据业务需求判断是否需要接入。接入示例代码:
import ( "github.com/volcengine/apminsight-server-sdk-go/trace/aiprofiler" ) func main() { InitTracer("your_service_type", "your_service_name") //profile元信息依赖tracer,必须先初始化tracer(后续解耦) InitProfiler("your_service_type", "your_service_name") //需要保证Profiler初始化时的服务名 与 Tracer初始化时的服务名一致 ... } func InitProfiler(serviceType, serviceName string) { opts := make([]aiprofiler.Option, 0) opts = append(opts, aiprofiler.WithLogger(&logsLogger{})) opts = append(opts, aiprofiler.WithBlockProfileDefault()) // 开启blockProfile。可能会影响性能,请按需开启 opts = append(opts, aiprofiler.WithMutexProfileDefault()) // 开启mutexProfile。可能会影响性能,请按需开启 p := aiprofiler.NewProfiler(serviceType, serviceName, opts...) p.Start() }
接入后可在 性能分析 配置profile采集任务。
如果您使用systemctl或其他方式裸起进程,则无需挂载目录。
如果您基于主机+Docker启动服务,需要在Docker中挂载/var/run/apminsight
目录。
启动命令如下所示:
docker run -d -v /var/run/apminsight:/var/run/apminsight image_name
挂载完成后,重新启动应用。
bash -c "$(curl -L 'http://apmplus-dl-{region}.volces.com/server_warehouse/generate_assets/download/apmplus-agent-ecs/install.sh?appkey={appkey}&network={network}')" -- uninstall
OpenTelemetry是CNCF的一个可观测性项目,旨在提供可观测性领域的标准化方案,解决观测数据的数据模型、采集、处理、导出等的标准化问题,提供与三方vendor无关的服务。
如果您的应用已经接入了OpenTelemetry的SDK,APMPlus服务端可以接收OpenTelemetry上报的数据。接入APMPlus后,您将获得RED指标生成能力、Trace多维检索、单链路检索、拓扑生成等多项能力。
SDK将数据上报到Collector,Collector采集数据上报到APMPlus服务端。
配置应用,开启数据上报。
配置collector,修改上报端点。
进入接入中心,选择 Go语言 > OpenTelemetry > Collector ,获取如下配置。需要区分您的开服区域(region)与网络接入方式(network),appkey是用户的唯一标识。
exporters: otlp: endpoint: apmplus-{region}.volces.com:4317 compression: gzip headers: X-ByteAPM-AppKey: {appkey} tls: insecure: true
说明
完整配置命令请到接入中心查看,详情请参见如何使用接入中心?。
重新启动应用。
SDK采集数据,直接上报到APMPlus服务端。
集成OpenTelemetry。具体请参见opentelemetry Go开源文档。
通过gRPC的方式发送数据到APMPlus。
进入接入中心,选择 Go语言 > OpenTelemetry > SDK ,获取如下配置。需要区分您的开服区域(region)与网络接入方式(network),appkey是用户的唯一标识。
exporter, err := otlptracegrpc.New(context.Background(), otlptracegrpc.WithHeaders(map[string]string{ "X-ByteAPM-AppKey": "{appkey}", }), otlptracegrpc.WithEndpoint("apmplus-{region}.volces.com:4317"), otlptracegrpc.WithInsecure(), ) metricsExporter, err := otlpmetricgrpc.New(context.Background(), otlpmetricgrpc.WithHeaders(map[string]string{ "X-ByteAPM-AppKey": "{appkey}", }), otlpmetricgrpc.WithEndpoint("apmplus-{region}.volces.com:4317"), otlpmetricgrpc.WithInsecure(), )
说明
完整配置命令请到接入中心查看,详情请参见如何使用接入中心?。
Prometheus是一个最初由SoundCloud建设的开源监控和报警系统,目前已经是一个独立的开源项目,并且于2016年加入CNCF,成为CNCF的第二个项目。
APMPlus OpenTelemetry Collector是APMPlus基于OpenTelemetry Collector二次开发的数据采集器,遵守Apache2.0协议,支持采集OpenTelemetry监控数据,同时支持采集Prometheus指标,和K8s资源指标。
您可以使用Prometheus满足对于自定义打点的需求。对于已经集成了Prometheus的已有系统,可以将应用的自定义打点数据上报到APMPlus,进行指标存储、查询与展示,同时支持看板和报警等功能。
如果您的应用是基于Kubernetes集群部署,请参见以下步骤安装APMPlus数据采集器,接入APMPlus服务端。
安装APMPlus OpenTelemetry Collector。
进入接入中心,选择 Go语言 > Prometheus > 容器部署 ,获取如下配置。需要区分您的开服区域(region)与网络接入方式(network),appkey是用户的唯一标识。
kubectl apply -f "https://apmplus-dl-{region}.volces.com/server_warehouse/generate_assets/download/apmplus-opentelemetry-k8s/apmplus-opentelemetry-operator-v0.0.13.yaml?appkey={appkey}&network={network}&promReplicas=1"
说明
完整安装命令请到接入中心查看,详情请参见如何使用接入中心?。
配置应用,开启数据打点。
更多信息,请参见 INSTRUMENTING A GO APPLICATION FOR PROMETHEUS 。
安装Go prometheus依赖。
go get github.com/prometheus/client_golang/prometheus go get github.com/prometheus/client_golang/prometheus/promauto go get github.com/prometheus/client_golang/prometheus/promhttp
启动promehttp,服务启动后即可通过http://localhost:2112/metrics
获取prometheus指标。
package main import ( "net/http" "github.com/prometheus/client_golang/prometheus/promhttp" ) func main() { http.Handle("/metrics", promhttp.Handler()) http.ListenAndServe(":2112", nil) // 端口可以自己设置 }
添加自定义打点。
package main import ( "net/http" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promhttp" ) func recordMetrics() { go func() { for { opsProcessed.Inc() time.Sleep(2 * time.Second) } }() } var ( opsProcessed = promauto.NewCounter(prometheus.CounterOpts{ Name: "myapp_processed_ops_total", Help: "The total number of processed events", }) ) func main() { recordMetrics() http.Handle("/metrics", promhttp.Handler()) http.ListenAndServe(":2112", nil) }
在K8S场景下,通过配置pod annotation实现服务发现。
apiVersion: apps/v1 kind: Deployment ... spec: ... template: metadata: annotations: prometheus.io/path: /metrics # your path prometheus.io/port: "30002" # your port prometheus.io/scrape: "true"
重新启动应用。
如果您的应用是基于虚拟机或者物理机部署,请参见以下步骤安装APMPlus数据采集器,接入APMPlus服务端。
安装APMPlus OpenTelemetry Collector。
进入接入中心,选择 Go语言 > Prometheus > 主机部署 ,获取如下配置。需要区分您的开服区域(region)与网络接入方式(network),appkey是用户的唯一标识。
bash -c "$(curl -L'http://apmplus-dl-{region}.ivolces.com/server_warehouse/generate_assets/download/apmplus-opentelemetry-ecs/install-otel_0.0.9.sh?appkey={appkey}&network={network}')"
说明
完整安装命令请到接入中心查看,详情请参见如何使用接入中心?。
配置应用,开启数据打点。
更多信息,请参见 INSTRUMENTING A GO APPLICATION FOR PROMETHEUS 。
安装Go prometheus依赖。
go get github.com/prometheus/client_golang/prometheus go get github.com/prometheus/client_golang/prometheus/promauto go get github.com/prometheus/client_golang/prometheus/promhttp
启动promehttp,服务启动后可通过http://localhost:2112/metrics
获取prometheus指标。
package main import ( "net/http" "github.com/prometheus/client_golang/prometheus/promhttp" ) func main() { http.Handle("/metrics", promhttp.Handler()) http.ListenAndServe(":2112", nil) // 端口可以自己设置 }
添加自定义打点。
package main import ( "net/http" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promhttp" ) func recordMetrics() { go func() { for { opsProcessed.Inc() time.Sleep(2 * time.Second) } }() } var ( opsProcessed = promauto.NewCounter(prometheus.CounterOpts{ Name: "myapp_processed_ops_total", Help: "The total number of processed events", }) ) func main() { recordMetrics() http.Handle("/metrics", promhttp.Handler()) http.ListenAndServe(":2112", nil) }
在ECS场景下,支持通过文件进行服务发现,配置文件地址为/usr/local/apmplus-opentelemetry-collector/targets.json
。
[ { "targets": [ "localhost:8888" ] } ]
重新启动应用。
Jaeger是一款由Uber研发的开源分布式链路追踪系统。
对于已经集成Jaeger的已有系统,可以将jaeger的Trace数据上报到APMPlus,完成整体的全链路监控能力。
接入APMPlus后,您将获得RED指标生成能力、Trace多维检索、单链路检索、拓扑生成等多项能力。
SDK将数据上报到Agent,Agent将数据上报到APMPlus服务端。
修改jaeger-agent启动参数,配置示例如下:
./jaeger-agent --reporter.grpc.host-port=apmplus-{region}.ivolces.com:4317 \ --reporter.grpc.tls.enabled=false \ --agent.tags=app_key={appkey}
说明
完整配置命令请到接入中心查看,详情请参见如何使用接入中心?。
SDK采集数据,直接上报到APMPlus服务端。
配置reporter。示例代码如下所示:
sender := jaeger_transport.NewHTTPTransport("http://apmplus-{region}.ivolces.com/server_collect/third_party/jaeger/v2/{appkey}/api/trace") reporter := jaeger.NewRemoteReporter(sender)
说明
完整配置命令请到接入中心查看,详情请参见如何使用接入中心?。
Zipkin是一款由Twitter开源的分布式链路追踪系统,通过zipkin可以帮助您收集Trace数据。
对于已经集成Zipkin的系统,可以将已有的Trace数据上报到APMPlus,完成整体的全链路监控能力。
接入APMPlus后,您将获得RED指标生成能力、Trace多维检索、单链路检索、拓扑生成等多项APMPlus能力。
SDK采集数据,直接上报到APMPlus服务端。
获取zipkin上报点。
http://apmplus-{region}.ivolces.com/server_collect/third_party/zipkin/v2/{appkey}/api/v2/spans
说明
完整配置命令请到接入中心查看,详情请参见如何使用接入中心?。
接入服务并配置上报点。具体请参见zipkin-go示例代码。
SkyWalking Agent采集数据,直接上报到APMPlus服务端。当前支持SkyWalking Trace、Meter、Log、JVM、CLR数据接入。
获取SkyWalking grpc上报端点。
skywalking.collector.backend_service=apmplus-{region}.ivolces.com:4317
获取authentication用户标识。
skywalking.agent.authentication={appkey}
配置应用,开启数据上报。具体请参见SkyWalking文档。
重新启动应用。
验证数据上报。