本文介绍如何将应用数据接入ARMS OpenTelemetry Collector,并在ARMS控制台查看监控数据的上报流量、相关Trace和指标大盘。
前提条件
- 已开通ARMS,具体操作,请参见开通ARMS。
- 创建Kubernetes集群。各集群创建方法如下:
背景信息
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可观测数据间的关联性;支持无损统计,降低数据上报和持久化存储成本等。
场景一:全景监控数据一键采集与分析(容器环境)
场景二:多云/混合云网络,异构Tracing框架数据关联与统一展示
在多云/混合云架构下,不同集群或应用间的链路追踪技术选型可能存在差异,例如A采用了Jaeger,B采用了Zipkin,C采用了Skywalking,不同链路追踪协议上报的数据格式互不兼容,无法串联,大幅降低了全链路诊断效率。
场景三:链路采样+无损统计,低成本实现应用监控告警精准统计
生产系统的日均调用量可以达到亿级别,调用链全量上报和存储的成本是个不小的开销,而且除了少数错慢链路外,大部分调用链的查询价值并不高,对调用链执行采样存储是个不错的选择。
然而,传统的链路采样会导致链路统计指标的准确性大幅下降,例如一百万次真实调用经过10%采样后保留的十万次调用,对其统计得到的结果会产生明显的“样本倾斜”,最终导致监控告警误报率过高,基本处于不可用状态。
ARMS OpenTelemetry Collector支持Trace数据无损统计,对接收到的Trace数据自动进行本地预聚合,得到精准的统计结果后再执行链路采样上报,这样在降低网络开销和持久化存储成本的同时,保证了应用监控与告警指标的准确性。
接入说明
ARMS OpenTelemetry Collector组件安装前,需先检查目标集群是否存在ARMS Addon Token,否则会出现权限不足的报错。若存在ARMS Addon Token,ARMS会进行免密授权,组件安装完成后,即可使用ARMS OpenTelemetry Collector;若不存在ARMS Addon Token,则需要手动添加ARMS和可观测链路 OpenTelemetry 版权限策略。
查看ARMS Addon Token和手动添加权限策略方法如下:
- 登录容器服务管理控制台,在集群列表页面,单击目标集群名称进入集群详情页。
- 在左侧导航栏选择命名空间为kube-system,查看addon.arms.token是否存在。 ,然后在顶部选择
- 登录容器服务管理控制台,在集群列表页面单击目标集群名称。
- 在目标集群的集群信息页面单击集群资源页签,然后单击Worker RAM角色右侧的链接。
- 在权限管理页签下单击新增授权。
- 在新增授权面板的选择权限区域,通过关键字搜索以下两个权限策略 ,并单击权限策略将其添加至右侧的已选择列表中,然后单击确定。
- AliyunTracingAnalysisFullAccess:可观测链路 OpenTelemetry 版的完整权限。
- 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监控组件。
安装方式
Kubernetes监控组件ack-arms-cmonitor中包含ARMS OpenTelemetry Collector容器,因此安装ack-arms-cmonitor即可接入ARMS OpenTelemetry Collector。
- 安装Kubernetes监控组件ack-arms-cmonitor。
- 检查ack-arms-cmonitor安装状态。
上报应用数据
默认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
是其所在的命名空间。
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。
- 登录容器服务管理控制台,在集群列表页面单击目标集群名称。
- 在左侧导航栏,选择 。
- 在守护进程集页面单击cmonitor-agent。
- 在cmonitor-agent页面单击日志页签。
- 选择容器为ot-collector。查看ot-collector运行日志,如果发送的Metrics数量不为0,则代表已经有Trace成功上报,并自动转换为Metrics数据。
查看监控数据
查看数据上报流量
- 登录ARMS控制台。
- 在左侧导航栏选择 。
- 在全局配置页面单击OT Collector集群状态,然后在顶部菜单栏选择目标地域。在OT Collector集群状态页签查看各集群的数据上报流量。
查看上报的Trace数据
查看监控指标大盘
- 在ARMS控制台左侧导航栏选择 。
- 在工作区管理页面,单击Grafana 共享版右侧的对应地域的访问地址URL链接。
- 在Grafana页面左侧导航栏单击。
- 在Browse页签通过关键字搜索名称为OpenTelemetry APM Dashboard的大盘,然后单击对应地域的大盘名称。在OpenTelemetry APM Dashboard中查看监控指标。