自定义应用实例属性

最近更新时间:2024-08-28 11:32:11

我的收藏
在应用接入 APM 的时候,针对每个应用实例,用户可以自定义一系列实例属性,以实现基于实例属性的查询过滤以及数据聚合。在应用实例生成的可观测数据中,都会将附加上对应的实例属性信息。例如,在 APM 提供的应用详情功能中,用户可以基于实例属性对目标实例进行筛选,分析特定 K8s 集群、K8s 工作负载、应用镜像版本下的性能表现。在 APM 提供的容器监控、CVM监控等功能中,需要通过实例属性关联其他云产品,实现一体化可观测。

APM 支持的实例属性

属性名
Key
是否必填
可以自动注入的场景
实例名
host.name
通过腾讯云增强版 Java 探针接入
通过 Skywalking 方案接入
TKE环境通过 tencent-opentelemetry-operator 一键接入
CVM 所在地域
cvm.region
通过腾讯云增强版 Java 探针接入
CVM 实例 ID
cvm.instance.id
通过腾讯云增强版 Java 探针接入
TKE 所在地域
k8s.region
TKE 环境通过 tencent-opentelemetry-operator 一键接入
TKE 集群 ID
k8s.cluster.id
TKE 环境通过 tencent-opentelemetry-operator 一键接入
K8s 节点 IP
k8s.node.ip
TKE 环境通过 tencent-opentelemetry-operator 一键接入
K8s 命名空间
k8s.namespace.name
TKE 环境通过 tencent-opentelemetry-operator 一键接入
K8s Deployment 名
k8s.deployment.name
TKE 环境通过 tencent-opentelemetry-operator 一键接入
K8s Pod 名
k8s.pod.name
TKE 环境通过 tencent-opentelemetry-operator 一键接入
K8s Pod IP
k8s.pod.ip
TKE 环境通过 tencent-opentelemetry-operator 一键接入
应用版本
service.version
TKE 环境通过 tencent-opentelemetry-operator 一键接入
自定义字段1
custom_key_1
-
自定义字段2
custom_key_2
-
自定义字段3
custom_key_3
-

手动设置实例属性

说明:
仅支持通过 OpenTelemetry 方案接入的应用。
在可以自动注入实例属性的场景,请勿通过手动设置覆盖。
在应用接入的时候,实例属性需要连同 tokenservice.name,一起填入到 Resource Attributes 中。在 OpenTelemetry 标准中,Resource Attributes 以键值对的方式体现应用实例的基本信息。用户可以通过环境变量设置实例属性,也可以在接入代码中设置实例属性,具体的设置方式和接入应用时设置 tokenservice.name的方式一致。

方式一:通过环境变量设置实例属性

将实例属性添加到环境变量 OTEL_RESOURCE_ATTRIBUTES 中,最终 OTEL_RESOURCE_ATTRIBUTES 会表现为类似 key1=value1,key2=value2,key3=value3 的形式。
参考如下代码设置k8s.regionk8s.cluster.id两个实例属性:
export OTEL_RESOURCE_ATTRIBUTES="service.name=myService,token=myToken"
export OTEL_RESOURCE_ATTRIBUTES="$OTEL_RESOURCE_ATTRIBUTES,k8s.region=ap-guangzhou,k8s.cluster.id=cls-7i2n4axx"
对于部署在 Kubernetes 的应用(没有使用 tencent-opentelemetry-operator 一键接入),也可以在工作负载 Yaml 文件通过 OTEL_RESOURCE_ATTRIBUTES环境变量设置实例属性,参考如下代码片段:
spec:
containers:
- env:
- name: OTEL_RESOURCE_ATTRIBUTES
value: "service.name=myService,token=myToken,k8s.region=ap-guangzhou,k8s.cluster.id=cls-7i2n4axx"
对于 TKE 环境通过 tencent-opentelemetry-operator 一键接入的应用,可以在工作负载 Yaml 文件设置没有被自动注入的实例属性,参考如下代码片段:
spec:
containers:
- env:
- name: OTEL_RESOURCE_ATTRIBUTES
value: "custom_key_1=value1,custom_key_2=value_2,cvm.region=ap-guangzhou,cvm.instance.id=ins-3flvdptq"
说明:
对于 TKE 环境通过 tencent-opentelemetry-operator 一键接入的应用,除了可以自动注入的实例属性外,token 和 service.name 也已经自动注入,请勿在 Yaml 文件中通过 OTEL_RESOURCE_ATTRIBUTES 环境变量进行覆盖。

方式二:在接入代码中设置实例属性

如果通过代码接入应用,可以直接在接入代码中设置实例属性,以 Go 应用为例:
import (
"context"
"errors"
"os"
"go.opentelemetry.io/otel/sdk/resource"
)
r, err := resource.New(ctx, []resource.Option{
resource.WithAttributes(
attribute.KeyValue{Key: "token", Value: attribute.StringValue("my-token")},
attribute.KeyValue{Key: "service.name", Value: attribute.StringValue("my-service")},
attribute.KeyValue{Key: "host.name", Value: attribute.StringValue("10.10.0.1")},
attribute.KeyValue{Key: "k8s.region", Value: attribute.StringValue("ap-guangzhou")},
attribute.KeyValue{Key: "k8s.cluster.id", Value: attribute.StringValue("cls-7i2n4ace")},
),
}...)

如何动态获取 Pod 名称?

由于 Pod 名称、Pod IP、节点 IP 等信息需要在 Pod 创建后才能确定,在部署工作负载的时候,您可以通过 Kubernetes Downward API 进行动态获取,将这些信息写到环境变量中备用,方便在手动设置实例属性的时候进行引用。
spec:
containers:
- env:
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: POD_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.podIP
- name: NODE_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.hostIP
保存到环境变量后,可以直接引用,例如:
spec:
containers:
- env:
- name: OTEL_RESOURCE_ATTRIBUTES
value: "service.name=myService,token=myToken,k8s.pod.ip=$(POD_IP),k8s.pod.name=$(POD_NAME)"
说明:
对于 TKE 环境通过 tencent-opentelemetry-operator 一键接入的应用,Pod 名称、Pod IP、节点 IP 等实例属性都已经自动注入,请勿在 Yaml 文件中通过 OTEL_RESOURCE_ATTRIBUTES 环境变量进行覆盖。