本文介绍如何将应用数据接入ARMS OpenTelemetry Collector,并在ARMS控制台查看监控数据的上报流量、相关Trace和指标大盘。

前提条件

背景信息

ARMS OpenTelemetry Collector是一套基于开源OpenTelemetry Collector开发的可观测数据(Traces、Metrics、Logs)边缘侧统一采集与处理平台,具备安全、可靠、易用等特性,适合生产环境接入。

ARMS OpenTelemetry Collector服务端全托管(自动开通),客户端部署在用户集群内,支持边缘侧数据采集、处理、缓存、查询与路由,可以大幅降低公网传输成本,统一多源异构数据格式,轻松实现多云或混合云网络的数据融合与展示。

ARMS Collector优势

  • 开箱即用:一键接入ARMS OpenTelemetry Collector后,即可自动获取Kubernetes容器资源层和网络性能数据,无需任何代码改造。
  • 拥抱开源:兼容开源OpenTelemetry Collector。支持原生的OTLP、Jaeger、Zipkin等Receivers端口;可以自定义Pipeline,实现多重数据路由;支持开源Grafana大盘展示与探索。
  • 异构端到端关联:无论是多云或混合云网络,还是不同的OpenTelemetry Agent/SDK、Jaeger、Zipkin等异构链路框架,都可以通过ARMS OpenTelemetry Collector完成数据格式标准化,并自动上报至全托管的服务端,实现异构数据的关联查询与统一展示。
  • 无损统计:将Trace数据全量上报至ARMS OpenTelemetry Collector后,通过边缘计算自动生成Trace预聚合指标,再对Trace进行采样上报,在降低数据传输和持久化存储成本的同时,还可以保证指标数据精准统计,监控和告警效果不受采样率影响。
  • 增强分析:通过ARMS OpenTelemetry Collector上报的Trace数据,支持Trace Explorer后聚合增强分析,实时定位流量不均、单机故障、慢SQL分布、灰度发布异常等经典线上故障,帮您开启链路追踪的“第三种玩法”。
  • 高性能:通过时间窗口轮转的内存统计,数据压缩,连接优化等技术大幅降低了海量数据场景下的性能开销。
  • 高可靠:支持资源限额与自动限流保护,保证高压场景下的集群稳定性。
  • 灵活性:支持动态配置下推,可以实时调整流量开关,调用链采样率,接口过滤与收敛规则等参数。

适用场景

ARMS OpenTelemetry Collector通过边缘侧的数据采集、处理、缓存与路由,可以实现多源异构数据的标准化;增强Traces、Metrics、Logs可观测数据间的关联性;支持无损统计,降低数据上报和持久化存储成本等。

场景一:全景监控数据一键采集与分析(容器环境)

ARMS OpenTelemetry Collector在容器服务ACK环境下,深度集成了阿里云Kubernetes监控组件与Prometheus监控组件,一键安装完成后,会自动采集Kubernetes容器资源层和网络性能数据。结合用户上报的应用层数据(只需修改Endpoint,无代码改造)与自动预聚合指标,全部上报至全托管的服务端数据中心,再通过Grafana进行统一展示。最终实现覆盖应用、容器、网络、云组件的全景监控数据采集与分析。全景监控数据一键采集与分析

场景二:多云/混合云网络,异构Tracing框架数据关联与统一展示

在多云/混合云架构下,不同集群或应用间的链路追踪技术选型可能存在差异,例如A采用了Jaeger,B采用了Zipkin,C采用了Skywalking,不同链路追踪协议上报的数据格式互不兼容,无法串联,大幅降低了全链路诊断效率。

通过ARMS OpenTelemetry Collector可以将不同来源的链路统一转化为OpenTelemetry Trace格式,并上报至统一的服务端进行处理和存储,用户可以轻松实现跨网络或异构链路框架的联合数据查询与分析。多云/混合云网络

场景三:链路采样+无损统计,低成本实现应用监控告警精准统计

生产系统的日均调用量可以达到亿级别,调用链全量上报和存储的成本是个不小的开销,而且除了少数错慢链路外,大部分调用链的查询价值并不高,对调用链执行采样存储是个不错的选择。

然而,传统的链路采样会导致链路统计指标的准确性大幅下降,例如一百万次真实调用经过10%采样后保留的十万次调用,对其统计得到的结果会产生明显的“样本倾斜”,最终导致监控告警误报率过高,基本处于不可用状态。

ARMS OpenTelemetry Collector支持Trace数据无损统计,对接收到的Trace数据自动进行本地预聚合,得到精准的统计结果后再执行链路采样上报,这样在降低网络开销和持久化存储成本的同时,保证了应用监控与告警指标的准确性。

此外,ARMS OpenTelemetry Collector还支持对Trace预聚合指标进行筛选、收敛与自定义打标,比如将同一类Trace调用收敛为一个接口,或者根据用户类型区分流量,如下图所示。链路采样+无损统计

接入说明

ARMS OpenTelemetry Collector组件安装前,需先检查目标集群是否存在ARMS Addon Token,否则会出现权限不足的报错。若存在ARMS Addon Token,ARMS会进行免密授权,组件安装完成后,即可使用ARMS OpenTelemetry Collector;若不存在ARMS Addon Token,则需要手动添加ARMS和链路追踪权限策略。

查看ARMS Addon Token和手动添加权限策略方法如下:

  1. 登录容器服务管理控制台
  2. 集群列表页面,单击目标集群名称进入集群详情页。
  3. 在左侧导航栏选择配置管理 > 保密字典
  4. 在顶部选择命名空间kube-system,查看addon.arms.token是否存在。
  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称。
  4. 在左侧导航栏单击集群信息,并在右侧页面单击集群资源页签。
  5. 集群资源页签下单击Worker RAM角色右侧链接。
  6. 权限管理页签下单击添加权限
  7. 添加权限面板的选择权限区域,通过关键字搜索以下两个权限策略 ,并单击权限策略将其添加至右侧的已选择列表中,然后单击确定
    • AliyunTracingAnalysisFullAccess:链路追踪的完整权限。
    • AliyunARMSFullAccess:ARMS的完整权限。

说明
  • Kubernetes托管版集群:对于部分Kubernetes托管版集群,可能存在没有ARMS Addon Token的情况,因此,对于Kubernetes托管版集群,建议首先检查ARMS Addon Token是否存在。若不存在,仍需进行手动授权。
  • Kubernetes专有版集群:默认不支持ARMS Addon Token,需进行手动授权。
  • 注册集群:默认不支持ARMS Addon Token,需进行手动授权。由于注册集群没有Worker RAM角色,无法通过Worker RAM角色手动添加ARMS和链接追踪的权限策略,因此,注册集群安装Kubernetes监控组件ack-arms-cmonitor的操作,请参见注册集群安装组件

安装方式

Kubernetes监控组件ack-arms-cmonitor中包含ARMS OpenTelemetry Collector容器,因此安装ack-arms-cmonitor即可接入ARMS OpenTelemetry Collector。

  1. 安装Kubernetes监控组件ack-arms-cmonitor。
    1. 登录容器服务管理控制台
    2. 在左侧导航栏中,单击集群
    3. 集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在左侧导航栏,选择运维管理 > 组件管理
    5. 组件管理页面单击ack-arms-cmonitor区域的安装
    6. 在弹出的对话框中单击确定
      说明 ack-arms-cmonitor默认安装在arms-prom命名空间下。
  2. 检查ack-arms-cmonitor安装状态。
    1. 在左侧导航栏选择工作负载 > 守护进程集
    2. 守护进程集页面切换命名空间为arms-prom
      如果cmonitor-agent(daemonset)中所有Pod都处于Running状态,则代表安装成功。satellite

上报应用数据

默认Receivers配置说明

组件安装后默认配置的Receivers包括OTLP、Jaeger和Zipkin,端口与开源保持一致。

Receivers protocols port
OTLP gRPC 4317
http 4318
Jaeger gRPC 14250
thrift_http 14268
Zipkin 9411

将应用数据上报到ARMS OpenTelemetry Collector

组件安装后会在arms-prom命名空间下默认创建名称为otel-collector-service的Service资源,用于将Receivers中不同组件的相应端口进行暴露。Trace上报的Endpoint格式为otel-collector-service.arms-prom:<port>,其中otel-collector-service是ARMS OpenTelemetry Collector的Service名称,arms-prom是其所在的命名空间。

示例:将生成的Traces通过OTLP的gRPC协议上报到ARMS OpenTelemetry Collector中。
func initProvider() func() {
    ctx := context.Background()

    endpoint := "otel-collector-service.arms-prom:4317"

    if !ok {
        log.Fatalf("Cannot init OpenTelemetry, exit")
        os.Exit(-1)
    }

    metricClient := otlpmetricgrpc.NewClient(
        otlpmetricgrpc.WithInsecure(),
        otlpmetricgrpc.WithEndpoint(endpoint))
    metricExp, err := otlpmetric.New(ctx, metricClient)
    handleErr(err, "Failed to create the collector metric exporter")

    pusher := controller.New(
        processor.NewFactory(
            simple.NewWithExactDistribution(),
            metricExp,
        ),
        controller.WithExporter(metricExp),
        controller.WithCollectPeriod(2*time.Second),
    )
    global.SetMeterProvider(pusher)

    err = pusher.Start(ctx)
    handleErr(err, "Failed to start metric pusher")

    serviceName, ok := common.GetClientServiceName()
    if !ok {
        serviceName = common.ClientServiceName
    }

    headers := map[string]string{"Authentication": ""}
    traceClient := otlptracegrpc.NewClient(
        otlptracegrpc.WithInsecure(),
        otlptracegrpc.WithEndpoint(otelAgentAddr),
        otlptracegrpc.WithHeaders(headers), // 鉴权信息
        otlptracegrpc.WithDialOption(grpc.WithBlock()))
    log.Println("start to connect to server")
    traceExp, err := otlptrace.New(ctx, traceClient)
    handleErr(err, "Failed to create the collector trace exporter")

    res, err := resource.New(ctx,
        resource.WithFromEnv(),
        resource.WithProcess(),
        resource.WithTelemetrySDK(),
        resource.WithHost(),
        resource.WithAttributes(
            // the service name used to display traces in backends
            semconv.ServiceNameKey.String(serviceName),
        ),
    )
    handleErr(err, "failed to create resource")

    bsp := sdktrace.NewBatchSpanProcessor(traceExp)
    tracerProvider := sdktrace.NewTracerProvider(
        sdktrace.WithSampler(sdktrace.AlwaysSample()),
        sdktrace.WithResource(res),
        sdktrace.WithSpanProcessor(bsp),
    )

    // set global propagator to tracecontext (the default is no-op).
    otel.SetTextMapPropagator(propagation.TraceContext{})
    otel.SetTracerProvider(tracerProvider)

    log.Println("OTEL init success")

    return func() {
        cxt, cancel := context.WithTimeout(ctx, time.Second)
        defer cancel()
        if err := traceExp.Shutdown(cxt); err != nil {
            otel.Handle(err)
        }
        // pushes any last exports to the receiver
        if err := pusher.Stop(cxt); err != nil {
            otel.Handle(err)
        }
    }
}

检查应用数据

查看ARMS OpenTelemetry Collector运行日志,确定应用数据已经上报到ARMS OpenTelemetry Collector。

  1. 登录容器服务管理控制台
  2. 在左侧导航栏中,单击集群
  3. 集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在左侧导航栏,选择工作负载 > 守护进程集
  5. 守护进程集页面单击cmonitor-agent。
  6. cmonitor-agent页面单击日志页签。
  7. 选择容器ot-collector
    查看ot-collector运行日志,如果发送的Metrics数量不为0,则代表已经有Trace成功上报,并自动转换为Metrics数据。ot-collector日志

查看监控数据

查看数据上报流量

  1. 登录ARMS控制台
  2. 在左侧导航栏选择应用监控 > 全局配置
  3. 全局配置页面单击OT Collector集群状态,然后在顶部菜单栏选择目标地域。
    OT Collector集群状态页签查看各集群的数据上报流量。Satellite数据流量

查看上报的Trace数据

ARMS控制台左侧导航栏选择应用监控 > Trace Explorer,然后在顶部菜单栏选择目标地域。
Trace Explorer页面查看上报的Trace数据详情。更多信息,请参见Trace Explorersatellite trace数据

查看监控指标大盘

  1. ARMS控制台左侧导航栏选择Grafana服务 > 工作区管理
  2. 工作区管理页面,单击Grafana服务共享版右侧的访问地址URL链接。
  3. 在Grafana页面左侧导航栏选择Dashboard > Manage
  4. Manage页签通过关键字搜索名称为OpenTelemetry APM Dashboard的大盘,然后单击对应地域的大盘名称。
    在OpenTelemetry APM Dashboard中查看监控指标。Satellite大盘