Resource attributes and the VerOps entity model

The attribute contract: which OpenTelemetry resource attributes turn telemetry into Services, Servers and Containers.

opentelemetryresource-attributessemantic-conventionsserverscontainersservices

The contract

VerOps discovers entities from OpenTelemetry semantic-convention resource attributes — nothing proprietary. Set the standard attribute and the entity appears; that's the whole rule. Dots in attribute names become underscores internally (host.name → the host_name label), but you always set the dotted semantic-convention name on your resource.

Resource attributeEntityWhere it appearsRequired?
service.nameServiceService map, APM, trace searchAlways set it
host.nameServerInfrastructure → ServersFor hosts
container.nameContainerInfrastructure → ContainersFor containers
k8s.namespace.name, k8s.pod.name, k8s.deployment.name, k8s.container.name, k8s.node.nameKubernetes contextEnriches containers/serversIn Kubernetes

Services — service.name

Every span and every metric should carry service.name. It's how traces form a service map and how metrics are attributed. Without it, data is labelled unknown-service. Set it once, at the resource level:

export OTEL_SERVICE_NAME=payments-api
# or in a Collector:
processors:
  resource:
    attributes:
      - { key: service.name, value: payments-api, action: upsert }

Servers — host.name

A host appears under Infrastructure → Servers when its system.* metrics carry host.name. The Servers tab discovers hosts by grouping on that attribute; metrics with an empty host.name are stored but never listed as a server.

Don't hard-code it — let the Collector detect it with the resourcedetection processor:

processors:
  resourcedetection:
    detectors: [env, system]
    system:
      hostname_sources: [os]

Put resourcedetection in front of batch in your metrics pipeline and every host reports under its real name.

Containers — container.name

A container appears under Infrastructure → Containers when its container-level metrics carry container.name. That attribute is the entire requirement — set it and the container is listed, whether the metrics come from Kubernetes/cAdvisor or from the OpenTelemetry docker_stats receiver for a standalone Docker host.

Standard container-metrics receivers set container.name for you automatically:

  • Standalone Docker → the docker_stats receiver.
  • Kubernetes → the kubeletstats receiver (per-container cAdvisor metrics).

Useful companion attributes that enrich a container when present: container.id, container.image.name, container.image.tag, plus the k8s.* set in Kubernetes.

Kubernetes — k8s.*

In Kubernetes, add the k8sattributes processor so pods, deployments, namespaces and nodes are attached to your telemetry. Combined with container.name, containers show their namespace/pod/deployment in the Containers tab and can be filtered by them.

Rule of thumb

Name the thing you want to see. service.name for a service, host.name for a server, container.name for a container. Use the standard receivers/processors (resourcedetection, docker_stats, kubeletstats, k8sattributes) and these attributes are set for you — no VerOps-specific configuration.