一、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 | 否 | – |
二、手动设置实例属性
注意:说明:
在应用接入的时候,实例属性需要连同 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_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 应用为例:
package telemetryimport ( "context" "errors" "os" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/sdk/resource")func NewResource(ctx context.Context) (*resource.Resource, error) { token := os.Getenv("APM_TOKEN") if token == "" { return nil, errors.New("No Token") } return resource.New(ctx, resource.WithAttributes( attribute.String("token", token), attribute.String("service.name", "my-service"), attribute.String("host.name", "10.10.0.1"), attribute.String("k8s.region", "ap-guangzhou"), attribute.String("k8s.cluster.id", "cls-7i2n4ace"), ), )}
五、如何动态获取 Pod 名称和 Pod IP?
由于 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 环境变量进行覆盖。