在应用接入 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 方案接入的应用。
在可以自动注入实例属性的场景,请勿通过手动设置覆盖。
在应用接入的时候,实例属性需要连同
token
和 service.name
,一起填入到 Resource Attributes 中。在 OpenTelemetry 标准中,Resource Attributes 以键值对的方式体现应用实例的基本信息。用户可以通过环境变量设置实例属性,也可以在接入代码中设置实例属性,具体的设置方式和接入应用时设置 token
和 service.name
的方式一致。方式一:通过环境变量设置实例属性
将实例属性添加到环境变量
OTEL_RESOURCE_ATTRIBUTES
中,最终 OTEL_RESOURCE_ATTRIBUTES
会表现为类似 key1=value1,key2=value2,key3=value3
的形式。参考如下代码设置
k8s.region
和k8s.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_ATTRIBUTESvalue: "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_ATTRIBUTESvalue: "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_NAMEvalueFrom:fieldRef:apiVersion: v1fieldPath: metadata.name- name: POD_IPvalueFrom:fieldRef:apiVersion: v1fieldPath: status.podIP- name: NODE_IPvalueFrom:fieldRef:apiVersion: v1fieldPath: status.hostIP
保存到环境变量后,可以直接引用,例如:
spec:containers:- env:- name: OTEL_RESOURCE_ATTRIBUTESvalue: "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 环境变量进行覆盖。