You need to enable JavaScript to run this app.
导航

Go应用接入

最近更新时间2023.08.16 17:57:09

首次发布时间2022.01.19 11:51:16

Go应用在不同场景下有不同的接入方式,本文介绍不同场景下Go应用的详细接入操作,接入后可以实现自动收集Trace信息、自动生成Metric指标、以及调用链检索、日志检索等功能。

通过APMPlus自研监控组件接入

通过APMPlus自主研发的数据采集Agent与SDK,采集应用与基础设施的监控数据,相关数据会上报到APMPlus服务端用于可视化查询分析。

容器部署

如果您的应用是基于Kubernetes集群部署,请参见以下步骤接入APMPlus服务端。

步骤一:k8s集群接入Server Agent

方式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。操作前,请确保您已创建集群。具体请参见创建集群

  1. 浏览器打开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}
    
  2. 登录容器服务管理控制台

  3. 单击左侧导航栏中的集群

  4. 选择工作负载 > 守护进程,单击使用Yaml创建
    图片

  5. 使用Yaml创建页面,类型选择自定义,复制步骤1打开的yaml文件的所有内容粘贴到Yaml中,然后单击确定
    图片

步骤二:应用代码接入SDK

SDK用于采集应用的Trace、日志检索等数据,将数据上报到Server Agent。更多SDK采集的数据,请参见Go应用功能

  1. 获取最新的Go SDK。

    go get github.com/volcengine/apminsight-server-sdk-go@latest
    
  2. 接入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,可在链路分析查看相关链路。

  3. 接入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后端,可在日志监控查看。

  4. 接入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)        //值
    }
    

    接入后可在自定义指标中查看相关数据。

  5. 接入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. 登录应用性能监控全链路版控制台
  2. 在左侧导航栏,单击服务端监控
  3. 选择开服region。
  4. 单击服务端监控右侧的点击进入服务端列表
  5. 在服务列表中,单击目标服务名称。
    • 服务总览中有数据上报,则tracer接入成功。
    • 日志分析中有数据上报,则log接入成功。
    • 性能分析中有数据上报,则profile接入成功。
  6. 在左上角单击全部功能 > 自定义指标,查看metrics是否接入成功。

其他:卸载Server Agent

方式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

  1. 安装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,用于监控网络和进程退出。
  2. 启动Server Agent。

    sudo systemctl start apminsight-agent
    sudo systemctl start apminsight-system-probe
    

步骤二:应用代码接入SDK

SDK用于采集应用的Trace、日志检索等数据,将数据上报到Server Agent。更多SDK采集的数据,请参见Go应用功能

  1. 获取最新的Go SDK。

    go get github.com/volcengine/apminsight-server-sdk-go@latest
    
  2. 接入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,可在链路分析查看相关链路。

  3. 接入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后端,可在日志监控查看。

  4. 接入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)        //值
    }
    

    接入后可在自定义指标中查看相关数据。

  5. 接入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

挂载完成后,重新启动应用。

步骤四:验证数据上报

  1. 登录应用性能监控全链路版控制台
  2. 在左侧导航栏,单击服务端监控
  3. 选择开服region。
  4. 单击服务端监控旁边的点击进入服务端列表
  5. 在服务列表中,单击目标服务名称。
    • 服务总览中有数据上报,则tracer接入成功。
    • 日志分析中有数据上报,则log接入成功。
    • 性能分析中有数据上报,则profile接入成功。
  6. 在左上角单击全部功能 > 自定义指标,查看metrics是否接入成功。

其他:卸载Server Agent

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接入

OpenTelemetry是CNCF的一个可观测性项目,旨在提供可观测性领域的标准化方案,解决观测数据的数据模型、采集、处理、导出等的标准化问题,提供与三方vendor无关的服务。
如果您的应用已经接入了OpenTelemetry的SDK,APMPlus服务端可以接收OpenTelemetry上报的数据。接入APMPlus后,您将获得RED指标生成能力、Trace多维检索、单链路检索、拓扑生成等多项能力。

说明

如果您需要隔离生产和测试数据,请参见将生产和测试数据隔离

使用限制

  • 目前APMPlus仅支持OpenTelemetry中Trace部分数据的处理和Metrics的适配,Logs暂不支持。
  • 其中,APMPlus采用Prometheus作为OpenTelemetry Metrics的存储,支持promql对metrics进行查询,具体应用请参见自定义看板报警管理
  • OpenTelemetry Metrics转换为Prometheus Metrics时,存在一定限制:
    • 开源相同,不支持ExponentialHistogram
    • 不支持聚合方式为delta的数据。请不要修改SDK侧的默认聚合配置,保证SDK侧数据的聚合方式为cumulative。

Collector采集数据

SDK将数据上报到Collector,Collector采集数据上报到APMPlus服务端。

  1. 配置应用,开启数据上报。

    1. 集成OpenTelemetry。具体请参见opentelemetry Go开源文档
    2. 根据实际配置,将Trace数据转发到OpenTelemetry Collector。具体请参见opentelemetry-go示例代码
  2. 配置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
    

    说明

    完整配置命令请到接入中心查看,详情请参见如何使用接入中心?

  3. 重新启动应用。

SDK采集数据

SDK采集数据,直接上报到APMPlus服务端。

  1. 配置应用,开启数据上报。
    1. 集成OpenTelemetry。具体请参见opentelemetry Go开源文档

    2. 通过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(), 
      )
      

      说明

      完整配置命令请到接入中心查看,详情请参见如何使用接入中心?

  2. 重新启动应用。

通过Prometheus接入

Prometheus是一个最初由SoundCloud建设的开源监控和报警系统,目前已经是一个独立的开源项目,并且于2016年加入CNCF,成为CNCF的第二个项目。
APMPlus OpenTelemetry Collector是APMPlus基于OpenTelemetry Collector二次开发的数据采集器,遵守Apache2.0协议,支持采集OpenTelemetry监控数据,同时支持采集Prometheus指标,和K8s资源指标。
您可以使用Prometheus满足对于自定义打点的需求。对于已经集成了Prometheus的已有系统,可以将应用的自定义打点数据上报到APMPlus,进行指标存储、查询与展示,同时支持看板和报警等功能。

容器部署

如果您的应用是基于Kubernetes集群部署,请参见以下步骤安装APMPlus数据采集器,接入APMPlus服务端。

  1. 安装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.17.yaml?appkey={appkey}&network={network}&promReplicas=1"
    

    说明

    完整安装命令请到接入中心查看,详情请参见如何使用接入中心?

  2. 配置应用,开启数据打点。
    更多信息,请参见INSTRUMENTING A GO APPLICATION FOR PROMETHEUS

    1. 安装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
      
    2. 启动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) // 端口可以自己设置
      }
      
    3. 添加自定义打点。

      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)
      }
      
  3. 在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"
    
  4. 重新启动应用。

主机部署

如果您的应用是基于虚拟机或者物理机部署,请参见以下步骤安装APMPlus数据采集器,接入APMPlus服务端。

  1. 安装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}')"
    

    说明

    完整安装命令请到接入中心查看,详情请参见如何使用接入中心?

  2. 配置应用,开启数据打点。
    更多信息,请参见INSTRUMENTING A GO APPLICATION FOR PROMETHEUS

    1. 安装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
      
    2. 启动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) // 端口可以自己设置
      }
      
    3. 添加自定义打点。

      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)
      }
      
  3. 在ECS场景下,支持通过文件进行服务发现,配置文件地址为/usr/local/apmplus-opentelemetry-collector/targets.json

    [
      {
        "targets": [
          "localhost:8888"
        ]
      }
    ]
    
  4. 重新启动应用。

通过Jaeger接入

Jaeger是一款由Uber研发的开源分布式链路追踪系统。
对于已经集成Jaeger的已有系统,可以将jaeger的Trace数据上报到APMPlus,完成整体的全链路监控能力。
接入APMPlus后,您将获得RED指标生成能力、Trace多维检索、单链路检索、拓扑生成等多项能力。

Jaeger Agent接入

SDK将数据上报到Agent,Agent将数据上报到APMPlus服务端。

  1. 配置应用,开启数据采集。
    参考jaeger文档,通过UDP将Trace数据发送到Agent。
  2. 配置Agent,修改上报端点。
    1. 修改jaeger-agent启动参数,配置示例如下:

      ./jaeger-agent --reporter.grpc.host-port=apmplus-{region}.ivolces.com:4317 \ 
      --reporter.grpc.tls.enabled=false \ 
      --agent.tags=app_key={appkey}
      

      说明

      完整配置命令请到接入中心查看,详情请参见如何使用接入中心?

  3. 重新启动应用。

SDK直接上报

SDK采集数据,直接上报到APMPlus服务端。

  1. 配置应用,开启数据采集与上报。
    1. 配置reporter。示例代码如下所示:

      sender := jaeger_transport.NewHTTPTransport("http://apmplus-{region}.ivolces.com/server_collect/third_party/jaeger/v2/{appkey}/api/trace") 
      reporter := jaeger.NewRemoteReporter(sender)
      

      说明

      完整配置命令请到接入中心查看,详情请参见如何使用接入中心?

  2. 重新启动应用。

通过Zipkin接入

Zipkin是一款由Twitter开源的分布式链路追踪系统,通过zipkin可以帮助您收集Trace数据。
对于已经集成Zipkin的系统,可以将已有的Trace数据上报到APMPlus,完成整体的全链路监控能力。
接入APMPlus后,您将获得RED指标生成能力、Trace多维检索、单链路检索、拓扑生成等多项APMPlus能力。

SDK直接上报

SDK采集数据,直接上报到APMPlus服务端。

  1. 配置应用,开启数据上报。
    1. 获取zipkin上报点。

      http://apmplus-{region}.ivolces.com/server_collect/third_party/zipkin/v2/{appkey}/api/v2/spans
      

      说明

      完整配置命令请到接入中心查看,详情请参见如何使用接入中心?

    2. 接入服务并配置上报点。具体请参见zipkin-go示例代码

  2. 重新启动应用。

通过SkyWalking接入

SkyWalking Agent采集数据,直接上报到APMPlus服务端。当前支持SkyWalking Trace、Meter、Log、JVM、CLR数据接入。

SDK直接上报

  1. 获取SkyWalking grpc上报端点。

    skywalking.collector.backend_service=apmplus-{region}.ivolces.com:4317
    
  2. 获取authentication用户标识。

    skywalking.agent.authentication={appkey}
    
  3. 配置应用,开启数据上报。具体请参见SkyWalking文档

  4. 重新启动应用。

  5. 验证数据上报。

    • Trace接入后,可以查看拓扑图、Trace分析、服务详情等数据。
    • Meter接入后,可在自定义指标中查看打点。
    • Log接入后,可以查看日志。
    • JVM、CLR接入后,可以在自定义指标中查看形如"skywalking_jvm_*"和"skywalking_clr_*"的指标。