Skip to main content

opentelemetry-resourcedetector-kubernetes

An OpenTelemetry package to populates Resource attributes for Kubernetes pods.

Usage

from opentelemetry.sdk.resources import get_aggregated_resources
from opentelemetry_resourcedetector_kubernetes import KubernetesResourceDetector

...

resource = get_aggregated_resources([
    KubernetesResourceDetector(),
    SomeOtherResourceDetector()
])

... pass the returned `resource` to a TracerProvder, for example ...

The KubernetesResourceDetector is able to detect the basic identifying information for a Pod, returning as Resource with these attributes populated:

  • container.runtime - always the string "kubernetes"
  • container.id - the unique ID of the container (a string of hexadecimal characters)
  • k8s.pod.uid - the UUID of the pod where your container and code is running

This resource detector is the base class for the others in this package, and so you will always get these three attributes in your traces, using any of the more detailed detectors below.

Detecting more attributes with The "Downward API"

The Kubernetes "Downward API" is a safe way to to pass Kubernetes metadata about your pod to itself, as either:

For either of these methods to work, you will need to add the appropriate configuration to your Kubernetes manifests, and you'll configure the detector accordingly.

The opentelemetry_resourcedetector_kubernetes classes using the Downward API will only detect and populate attributes from the standard OpenTelemetry Kubernetes Resource Attribute that you choose to provide by configuring them in your manifests. These detectors will only report k8s.* and container.* OpenTelemetry attributes, and are not intended to be a general-purpose collection mechanism for other types of attributes.

The Downward API only supports a subset of all the possible attributes you could provide. Depending on your needs, you can also provide hard-coded environment variables following the same naming conventino in your Kubernetes manifest, or mix the environment and volume approaches to paint a more complete picture.

KubernetesDownwardAPIEnvironmentResourceDetector

For an example of using environment variables, you can pass a Pod's namespace and name:

apiVersion: v1
kind: Pod
metadata:
  namespace: cool-app
  name: example-pod
spec:
  containers:
  - name: a-container
    image: my-image:1.0.0
    command: ["run-my-cool-app"]
    env:
    - name: OTEL_RD_K8S_NAMESPACE_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
    - name: OTEL_RD_K8S_POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name

Then, your running pod will see these environment variables populated:

OTEL_RD_K8S_NAMESPACE_NAME=cool-app
OTEL_RD_K8S_POD_NAME=example-pod

When configuring your telemetry, you'll establish a "contract" for the names of the environment variables, indicating that they will be prefixed with OTEL_RD. The prefix is up to you, but the default is OTEL_RD. From there, the resource detector will look for each environment variables prefixed with OTEL_RD_, and if the rest of its name matches a standard OpenTelemetry Kubernetes Resource Attribute, it will be used during resource detection.

from opentelemetry.sdk.resources import get_aggregated_resources
from opentelemetry_resourcedetector_kubernetes import KubernetesDownwardAPIEnvironmentResourceDetector

...

resource = get_aggregated_resources([
    KubernetesDownwardAPIEnvironmentResourceDetector(prefix='OTEL_RD'),
    SomeOtherResourceDetector()
])

... pass the returned `resource` to a TracerProvder, for example ...

In this example, the Resource for all traces would include the attributes:

container.runtime = "kubernetes"
k8s.pod.uid = "...the UUID of the pod..."
container.id = "...the id of the container..."

k8s.namespace.name = "cool-app"
k8s.pod.name = "example-pod"

KubernetesDownwardAPIVolumeResourceDetector

For an example of using a Downward API volume, you can pass a Pod's namespace and name:

apiVersion: v1
kind: Pod
metadata:
  namespace: cool-app
  name: example-pod
spec:
  containers:
  - name: a-container
    image: my-image:1.0.0
    command: ["run-my-cool-app"]
    volumeMounts:  # this is at the *Container* level
    - name: otelrd
      mountPath: /etc/otelrd
  volumes:  # this is at the *Pod* level
    - name: otelrd
      downwardAPI:
        items:
        - path: k8s.namespace.name
          fieldRef:
            fieldPath: metadata.namespace
        - path: k8s.pod.name
          fieldRef:
            fieldPath: metadata.name

Then, your running pod will see these environment variables populated:

$ cat /etc/otelrd/k8s.namespace.name
cool-app
$ cat /etc/otelrd/k8s.pod.name
example-pod

When configuring your telemetry, you'll establish a "contract" by indicating the directory into which you are mounting the Downward API metadata files (/etc/otelrd by default). From there, the resource detector will look for files matching the names of standard OpenTelemetry Kubernetes Resource Attributes.

from opentelemetry.sdk.resources import get_aggregated_resources
from opentelemetry_resourcedetector_kubernetes import KubernetesDownwardAPIEnvironmentResourceDetector

...

resource = get_aggregated_resources([
    KubernetesDownwardAPIVolumeResourceDetector(directory='/etc/otelrd'),
    SomeOtherResourceDetector()
])

... pass the returned `resource` to a TracerProvder, for example ...

In this example, the Resource for all traces would include the attributes:

container.runtime = "kubernetes"
k8s.pod.uid = "...the UUID of the pod..."
container.id = "...the id of the container..."

k8s.namespace.name = "cool-app"
k8s.pod.name = "example-pod"

Metadata

Release files for opentelemetry-resourcedetector-kubernetes 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for opentelemetry-resourcedetector-kubernetes 0.3.0
File Size Uploaded
opentelemetry-resourcedetector-kubernetes-0.3.0.tar.gz 9.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for opentelemetry-resourcedetector-kubernetes 0.3.0
File Interpreter ABI Platform
opentelemetry_resourcedetector_kubernetes-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 15.2 kB

Release files / opentelemetry-resourcedetector-kubernetes-0.3.0.tar.gz

Download URL opentelemetry-resourcedetector-kubernetes-0.3.0.tar.gz
Size 9.1 kB
Tags Source
SHA-256 checksum
How to use checksums
854472ff856c305dc29f033a8f784f9a7f513cb60eb690d2af4a4a572b165019
BLAKE2b-256 checksum
How to use checksums
79e70e3d3905971fdf543cc72e77f2997b00df541b1cc6188a9df47ad8174205
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.9.14

Release files / opentelemetry_resourcedetector_kubernetes-0.3.0-py3-none-any.whl

Download URL opentelemetry_resourcedetector_kubernetes-0.3.0-py3-none-any.whl
Size 6.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0abb30217cd71112a48076f86e648de2438003276548e78bf48e4f7a6f4ea219
BLAKE2b-256 checksum
How to use checksums
99c8cee782a9fb57ab6bfc8fa8c0c43b1d293fab7d932b6f947f563f4ec0d887
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.9.14

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

0.2.1

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page